From 01ca354d52bacc659ae4aa82301f100cc4c241f5 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 8 Dec 2015 10:09:51 +0530 Subject: [PATCH 1/2] [fixes] Drop Shipping - Purchase Order Cancellation - Sales Order Status --- erpnext/buying/doctype/purchase_order/purchase_order.py | 9 ++++++++- erpnext/selling/doctype/sales_order/sales_order.py | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index feb144d0dd9..fcf463b991a 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -159,6 +159,8 @@ class PurchaseOrder(BuyingController): def on_cancel(self): if self.has_drop_ship_item(): self.update_status_updater() + self.reset_received_qty_for_drop_ship_items() + self.update_delivered_qty_in_sales_order() pc_obj = frappe.get_doc('Purchase Common') self.check_for_stopped_or_closed_status(pc_obj) @@ -233,7 +235,12 @@ class PurchaseOrder(BuyingController): for item in self.items: if item.delivered_by_supplier == 1: item.received_qty = item.qty - + + def reset_received_qty_for_drop_ship_items(self): + for item in self.items: + if item.delivered_by_supplier == 1: + frappe.db.set_value("Purchase Order Item", item.name, "received_qty", 0.0) + @frappe.whitelist() def stop_or_unstop_purchase_orders(names, status): if not frappe.has_permission("Purchase Order", "write"): diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 05cb50c5218..6d396bd438f 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -271,13 +271,13 @@ class SalesOrder(SellingController): 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 received_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.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) From 70ed6ede5c83704f041fcc617d293578b8e05fb0 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 8 Dec 2015 14:02:53 +0530 Subject: [PATCH 2/2] [fixes] patch to update delivery status for drop ship item --- .../doctype/purchase_order/purchase_order.py | 10 ++-------- erpnext/controllers/status_updater.py | 9 +++++---- erpnext/patches.txt | 3 ++- .../fix_delivery_status_of_drop_ship_item.py | 17 +++++++++++++++++ .../selling/doctype/sales_order/sales_order.py | 12 +++++++----- 5 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 erpnext/patches/v6_10/fix_delivery_status_of_drop_ship_item.py diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index fcf463b991a..b10b72f3fbd 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -159,7 +159,6 @@ class PurchaseOrder(BuyingController): def on_cancel(self): if self.has_drop_ship_item(): self.update_status_updater() - self.reset_received_qty_for_drop_ship_items() self.update_delivered_qty_in_sales_order() pc_obj = frappe.get_doc('Purchase Common') @@ -218,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() @@ -235,12 +234,7 @@ class PurchaseOrder(BuyingController): for item in self.items: if item.delivered_by_supplier == 1: item.received_qty = item.qty - - def reset_received_qty_for_drop_ship_items(self): - for item in self.items: - if item.delivered_by_supplier == 1: - frappe.db.set_value("Purchase Order Item", item.name, "received_qty", 0.0) - + @frappe.whitelist() def stop_or_unstop_purchase_orders(names, status): if not frappe.has_permission("Purchase Order", "write"): 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 6d396bd438f..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 received_qty + item_delivered_qty = frappe.db.sql("""select sum(qty) from `tabPurchase Order Item` poi, `tabPurchase Order` po where poi.prevdoc_detail_docname = %s and poi.prevdoc_doctype = 'Sales Order' and poi.item_code = %s and poi.parent = po.name + 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