diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index feb144d0dd9..b10b72f3fbd 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -159,6 +159,7 @@ class PurchaseOrder(BuyingController): def on_cancel(self): if self.has_drop_ship_item(): self.update_status_updater() + self.update_delivered_qty_in_sales_order() pc_obj = frappe.get_doc('Purchase Common') self.check_for_stopped_or_closed_status(pc_obj) @@ -216,7 +217,7 @@ class PurchaseOrder(BuyingController): for so_name in sales_orders_to_update: so = frappe.get_doc("Sales Order", so_name) - so.update_delivery_status(self.name) + so.update_delivery_status() so.set_status(update=True) so.notify_update() diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index eb8d5e9574a..73e9d7f0ee8 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -76,10 +76,10 @@ class StatusUpdater(Document): self.update_qty() self.validate_qty() - def set_status(self, update=False, status=None): + def set_status(self, update=False, status=None, update_modified=True): if self.is_new(): return - + if self.doctype in status_map: _status = self.status @@ -102,9 +102,10 @@ class StatusUpdater(Document): if self.status != _status and self.status not in ("Submitted", "Cancelled"): self.add_comment("Label", _(self.status)) - + if update: - frappe.db.set_value(self.doctype, self.name, "status", self.status) + frappe.db.set_value(self.doctype, self.name, "status", self.status, + update_modified=update_modified) def validate_qty(self): """Validates qty at row level""" diff --git a/erpnext/patches.txt b/erpnext/patches.txt index cd38e67e2c6..302a33866ce 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -237,4 +237,5 @@ erpnext.patches.v6_8.move_drop_ship_to_po_items erpnext.patches.v6_10.fix_ordered_received_billed erpnext.patches.v6_10.fix_jv_total_amount #2015-11-30 erpnext.patches.v6_10.email_digest_default_quote -erpnext.patches.v6_10.fix_billed_amount_in_drop_ship_po \ No newline at end of file +erpnext.patches.v6_10.fix_billed_amount_in_drop_ship_po +erpnext.patches.v6_10.fix_delivery_status_of_drop_ship_item \ No newline at end of file diff --git a/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py b/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py new file mode 100644 index 00000000000..a54d0ab389f --- /dev/null +++ b/erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py @@ -0,0 +1,17 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + sales_orders_to_update = [] + + for item in frappe.get_all("Purchase Order Item", filters={"delivered_by_supplier": 1}, + fields=["prevdoc_doctype", "prevdoc_docname"]): + + if item.prevdoc_doctype == "Sales Order": + if item.prevdoc_docname not in sales_orders_to_update: + sales_orders_to_update.append(item.prevdoc_docname) + + for so_name in sales_orders_to_update: + so = frappe.get_doc("Sales Order", so_name) + so.update_delivery_status() + so.set_status(update=True, update_modified=False) \ No newline at end of file diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 05cb50c5218..7712f5ebe69 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -265,27 +265,29 @@ class SalesOrder(SellingController): if exc_list: frappe.throw('\n'.join(exc_list)) - def update_delivery_status(self, po_name): + def update_delivery_status(self): """Update delivery status from Purchase Order for drop shipping""" tot_qty, delivered_qty = 0.0, 0.0 for item in self.items: if item.delivered_by_supplier: - item_delivered_qty = frappe.db.sql("""select qty + item_delivered_qty = frappe.db.sql("""select sum(qty) from `tabPurchase Order Item` poi, `tabPurchase Order` po - where poi.prevdoc_docname = %s + where poi.prevdoc_detail_docname = %s and poi.prevdoc_doctype = 'Sales Order' and poi.item_code = %s and poi.parent = po.name - and po.status = 'Delivered'""", (self.name, item.item_code)) + and po.docstatus = 1 + and po.status = 'Delivered'""", (item.name, item.item_code)) item_delivered_qty = item_delivered_qty[0][0] if item_delivered_qty else 0 - item.db_set("delivered_qty", item_delivered_qty) + item.db_set("delivered_qty", flt(item_delivered_qty), update_modified=False) 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) + + frappe.db.set_value("Sales Order", self.name, "per_delivered", flt(delivered_qty/tot_qty) * 100, + update_modified=False) def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context