[fixes] test case and code rewrite

This commit is contained in:
Saurabh
2015-10-29 19:43:13 +05:30
parent 2e65aadb1e
commit 6956eee790
7 changed files with 95 additions and 112 deletions

View File

@@ -22,8 +22,9 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
if(doc.status != 'Stopped' && doc.status != 'Closed') {
$.each(cur_frm.doc.items, function(i, item){
if((item.delivered_by_supplier == 1 || item.supplier) && (item.qty > item.ordered_qty)){
is_delivered_by_supplier = true;
if(item.delivered_by_supplier == 1 || item.supplier){
if(item.qty > item.ordered_qty)
is_delivered_by_supplier = true;
}
else{
if(item.qty > item.delivered_qty)
@@ -37,7 +38,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
// doc.per_billed);
// indent
if(!doc.order_type || ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && flt(doc.per_delivered, 2) < 100)
if(!doc.order_type || ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && flt(doc.per_delivered, 2) < 100 && !is_delivered_by_supplier)
cur_frm.add_custom_button(__('Material Request'), this.make_material_request);
if(flt(doc.per_billed)==0) {
@@ -45,8 +46,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
}
// stop
if((flt(doc.per_delivered, 2) < 100 && is_delivery_note) || doc.per_billed < 100
|| (flt(doc.per_ordered,2) < 100 && is_delivered_by_supplier)){
if(flt(doc.per_delivered, 2) < 100 || flt(doc.per_billed) < 100) {
cur_frm.add_custom_button(__('Stop'), this.stop_sales_order)
}
@@ -68,7 +68,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice).addClass("btn-primary");
}
if(flt(doc.per_ordered, 2) < 100 && is_delivered_by_supplier)
if(flt(doc.per_delivered, 2) < 100 && is_delivered_by_supplier)
cur_frm.add_custom_button(__('Make Purchase Order'), cur_frm.cscript.make_purchase_order).addClass("btn-primary");
} else {

View File

@@ -260,8 +260,34 @@ class SalesOrder(SellingController):
pass
def before_update_after_submit(self):
self.validate_drop_ship()
self.validate_drop_ship()
self.validate_po()
def validate_po(self):
exc_list = []
for item in self.items:
supplier = frappe.db.get_value("Sales Order Item", {"parent": self.name, "item_code": item.item_code},
"supplier")
if item.ordered_qty > 0.0 and item.supplier != supplier:
exc_list.append("Row #{0}: Not allowed to change supplier as Purchase Order already exists".format(item.idx))
if exc_list:
frappe.throw('\n'.join(exc_list))
def update_delivery_status(self, po_name):
tot_qty, delivered_qty = 0.0, 0.0
for item in self.items:
if item.delivered_by_supplier:
delivered_qty = frappe.db.get_value("Purchase Order Item", {"parent": po_name, "item_code": item.item_code}, "qty")
frappe.db.set_value("Sales Order Item", item.name, "delivered_qty", delivered_qty)
delivered_qty += item.delivered_qty
tot_qty += item.qty
frappe.db.set_value("Sales Order", self.name, "per_delivered", flt(delivered_qty/tot_qty) * 100)
def get_list_context(context=None):
from erpnext.controllers.website_list_for_contact import get_list_context
list_context = get_list_context(context)
@@ -551,15 +577,9 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier, target_doc=
],
"postprocess": update_item,
"condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == for_supplier
},
"Sales Taxes and Charges": {
"doctype": "Purchase Taxes and Charges",
"add_if_empty": True
}
}, target_doc, set_missing_values)
return doclist
@frappe.whitelist()
@@ -595,4 +615,4 @@ def get_supplier(doctype, txt, searchfield, start, page_len, filters):
def update_status(status, name):
so = frappe.get_doc("Sales Order", name)
so.stop_sales_order(status)
return

View File

@@ -317,7 +317,6 @@ class TestSalesOrder(unittest.TestCase):
"warehouse": "_Test Warehouse - _TC",
"qty": 2,
"rate": 400,
"conversion_factor": 1.0,
"delivered_by_supplier": 1,
"supplier": '_Test Supplier'
},
@@ -330,9 +329,19 @@ class TestSalesOrder(unittest.TestCase):
}
]
#setuo existing qty from bin
bin = frappe.get_all("Bin", filters={"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"},
fields=["ordered_qty", "reserved_qty"])
existing_ordered_qty = bin[0].ordered_qty if bin else 0.0
existing_reserved_qty = bin[0].reserved_qty if bin else 0.0
bin = frappe.get_all("Bin", filters={"item_code": dn_item.item_code, "warehouse": "_Test Warehouse - _TC"},
fields=["reserved_qty"])
existing_reserved_qty_for_dn_item = bin[0].reserved_qty if bin else 0.0
#create so, po and partial dn
so = make_sales_order(item_list=so_items, do_not_submit=True)
so.submit()
@@ -351,40 +360,56 @@ class TestSalesOrder(unittest.TestCase):
ordered_qty, reserved_qty = frappe.db.get_value("Bin",
{"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"}, ["ordered_qty", "reserved_qty"])
existing_ordered_qty = bin[0].ordered_qty if bin else 0.0
existing_reserved_qty = bin[0].reserved_qty if bin else 0.0
self.assertEquals(abs(ordered_qty), existing_ordered_qty + so_items[0]['qty'])
self.assertEquals(abs(reserved_qty), existing_reserved_qty + so_items[0]['qty'])
self.assertEquals(abs(reserved_qty), existing_reserved_qty + so_items[0]['qty'])
reserved_qty = frappe.db.get_value("Bin",
{"item_code": dn_item.item_code, "warehouse": "_Test Warehouse - _TC"}, "reserved_qty")
self.assertEquals(abs(reserved_qty), existing_reserved_qty_for_dn_item + 1)
#test po_item length
self.assertEquals(len(po.items), 1)
#test per_delivered status
delivered_by_supplier(po.name)
per_delivered = frappe.db.sql("""select sum(if(qty > ifnull(delivered_qty, 0), delivered_qty, qty))/sum(qty)*100 as per_delivered
from `tabSales Order Item` where parent="{0}" """.format(so.name))
self.assertEquals(frappe.db.get_value("Sales Order", so.name, "per_delivered"), per_delivered[0][0])
self.assertEquals(flt(frappe.db.get_value("Sales Order", so.name, "per_delivered"), 2), 75.00)
#test reserved qty after complete delivery
dn = create_dn_against_so(so.name, delivered_qty=1)
reserved_qty = frappe.db.get_value("Bin",
{"item_code": dn_item.item_code, "warehouse": "_Test Warehouse - _TC"}, "reserved_qty")
self.assertEquals(abs(reserved_qty), existing_reserved_qty_for_dn_item)
#test after closing so
so.db_set('status', "Closed")
so.update_reserved_qty()
ordered_qty, reserved_qty = frappe.db.get_value("Bin",
{"item_code": po_item.item_code, "warehouse": "_Test Warehouse - _TC"}, ["ordered_qty", "reserved_qty"])
self.assertEquals(abs(ordered_qty), existing_ordered_qty)
self.assertEquals(abs(reserved_qty), existing_reserved_qty)
reserved_qty = frappe.db.get_value("Bin",
{"item_code": dn_item.item_code, "warehouse": "_Test Warehouse - _TC"}, "reserved_qty")
self.assertEquals(abs(reserved_qty), existing_reserved_qty)
def test_reserved_qty_for_closing_so(self):
from erpnext.stock.doctype.item.test_item import make_item
bin = frappe.get_all("Bin", filters={"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"},
fields=["reserved_qty"])
item = make_item("_Test Close Item", {"is_stock_item": 1, "is_sales_item": 1,
"is_purchase_item": 1})
existing_reserved_qty = bin[0].reserved_qty if bin else 0.0
so = make_sales_order(item_code=item.item_code, qty=1)
so = make_sales_order(item_code="_Test Item", qty=1)
self.assertEquals(get_reserved_qty(item_code=item.item_code, warehouse="_Test Warehouse - _TC"), 1)
self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty+1)
so.stop_sales_order("Closed")
self.assertEquals(get_reserved_qty(item_code=item.item_code, warehouse="_Test Warehouse - _TC"), 0)
self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty)
def make_sales_order(**args):