From 8f24ecb173d0f1b2618278c83caab1356bd79288 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 16 Jun 2016 18:01:58 +0530 Subject: [PATCH 1/3] [fix] set previous doc links for document flow --- .../purchase_invoice/purchase_invoice.py | 12 ++++++++++++ .../doctype/sales_invoice/sales_invoice.py | 12 ++++++++++++ .../doctype/purchase_order/purchase_order.py | 9 +++++++++ .../selling/doctype/sales_order/sales_order.py | 9 +++++++++ .../doctype/delivery_note/delivery_note.py | 9 +++++++++ .../purchase_receipt/purchase_receipt.py | 9 +++++++++ erpnext/utilities/transaction_base.py | 18 ++++++++++++++++++ 7 files changed, 78 insertions(+) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 71e9c420c0..ceba01ee37 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -663,6 +663,18 @@ class PurchaseInvoice(BuyingController): def on_recurring(self, reference_doc): self.due_date = None + + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Purchase Order": { + "fieldname": "purchase_order" + }, + "Purchase Receipt": { + "fieldname": "purchase_receipt" + } + } + + return super(PurchaseInvoice, self).get_link_filters(for_doctype) @frappe.whitelist() def make_debit_note(source_name, target_doc=None): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 2584d407d5..377f9faea4 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -696,6 +696,18 @@ class SalesInvoice(SellingController): self.set(fieldname, reference_doc.get(fieldname)) self.due_date = None + + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Sales Order": { + "fieldname": "sales_order" + }, + "Delivery Note": { + "fieldname": "delivery_note" + } + } + + return super(SalesInvoice, self).get_link_filters(for_doctype) def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 61842363c3..49a44e9905 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -235,6 +235,15 @@ class PurchaseOrder(BuyingController): if item.delivered_by_supplier == 1: item.received_qty = item.qty + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Supplier Quotation": { + "fieldname": "supplier_quotation" + } + } + + return super(PurchaseOrder, self).get_link_filters(for_doctype) + @frappe.whitelist() def close_or_unclose_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 2e0a272ae5..63e307db30 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -307,6 +307,15 @@ class SalesOrder(SellingController): self.set("delivery_date", get_next_date(reference_doc.delivery_date, mcount, cint(reference_doc.repeat_on_day_of_month))) + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Quotation": { + "fieldname": "prevdoc_docname" + } + } + + return super(SalesOrder, self).get_link_filters(for_doctype) + def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context list_context = get_list_context(context) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 6c6a3b3c97..be6c7971e5 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -282,6 +282,15 @@ class DeliveryNote(SellingController): dn_doc.update_billing_percentage(update_modified=update_modified) self.load_from_db() + + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Sales Order": { + "fieldname": "against_sales_order" + } + } + + return super(DeliveryNote, self).get_link_filters(for_doctype) def update_billed_amount_based_on_so(so_detail, update_modified=True): # Billed against Sales Order directly diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 70cef3603a..bfcecbde36 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -333,6 +333,15 @@ class PurchaseReceipt(BuyingController): self.load_from_db() + def get_link_filters(self, for_doctype): + self.prev_link_mapper = { + "Purchase Order": { + "fieldname": "prevdoc_docname" + } + } + + return super(PurchaseReceipt, self).get_link_filters(for_doctype) + def update_billed_amount_based_on_po(po_detail, update_modified=True): # Billed against Sales Order directly billed_against_po = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item` diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py index d088f599ad..91055537b4 100644 --- a/erpnext/utilities/transaction_base.py +++ b/erpnext/utilities/transaction_base.py @@ -107,6 +107,24 @@ class TransactionBase(StatusUpdater): frappe.throw(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4}) ") .format(d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate)) + def get_link_filters(self, for_doctype): + if self.prev_link_mapper.get(for_doctype): + fieldname = self.prev_link_mapper[for_doctype]["fieldname"] + + values = filter(None, tuple([item.as_dict()[fieldname] for item in self.items])) + + if values: + ret = { + for_doctype : { + "filters": [[for_doctype, "name", "in", values]] + } + } + else: + ret = None + else: + ret = None + + return ret def delete_events(ref_type, ref_name): frappe.delete_doc("Event", frappe.db.sql_list("""select name from `tabEvent` From 2a0b111726bf47b15daffb2feadcf203bee9f536 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 17 Jun 2016 15:43:42 +0530 Subject: [PATCH 2/3] [fix] mark completed docuemts on document flow --- .../purchase_invoice/purchase_invoice.py | 18 +++++++++--------- .../doctype/sales_invoice/sales_invoice.py | 18 +++++++++--------- .../doctype/purchase_order/purchase_order.py | 12 ++++++------ .../selling/doctype/sales_order/sales_order.py | 15 +++++++++------ .../doctype/delivery_note/delivery_note.py | 13 +++++++------ .../purchase_receipt/purchase_receipt.py | 12 ++++++------ 6 files changed, 46 insertions(+), 42 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index ceba01ee37..8d7f6534d9 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -35,6 +35,15 @@ class PurchaseInvoice(BuyingController): 'percent_join_field': 'purchase_order', 'overflow_type': 'billing' }] + + self.prev_link_mapper = { + "Purchase Order": { + "fieldname": "purchase_order" + }, + "Purchase Receipt": { + "fieldname": "purchase_receipt" + } + } def validate(self): if not self.is_opening: @@ -665,15 +674,6 @@ class PurchaseInvoice(BuyingController): self.due_date = None def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Purchase Order": { - "fieldname": "purchase_order" - }, - "Purchase Receipt": { - "fieldname": "purchase_receipt" - } - } - return super(PurchaseInvoice, self).get_link_filters(for_doctype) @frappe.whitelist() diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 377f9faea4..bbbbccf22f 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -38,6 +38,15 @@ class SalesInvoice(SellingController): 'keyword': 'Billed', 'overflow_type': 'billing' }] + + self.prev_link_mapper = { + "Sales Order": { + "fieldname": "sales_order" + }, + "Delivery Note": { + "fieldname": "delivery_note" + } + } def set_indicator(self): """Set indicator for portal""" @@ -698,15 +707,6 @@ class SalesInvoice(SellingController): self.due_date = None def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Sales Order": { - "fieldname": "sales_order" - }, - "Delivery Note": { - "fieldname": "delivery_note" - } - } - return super(SalesInvoice, self).get_link_filters(for_doctype) def get_list_context(context=None): diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 49a44e9905..9c7288c065 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -32,6 +32,12 @@ class PurchaseOrder(BuyingController): 'percent_join_field': 'prevdoc_docname', 'overflow_type': 'order' }] + + self.prev_link_mapper = { + "Supplier Quotation": { + "fieldname": "supplier_quotation" + } + } def validate(self): super(PurchaseOrder, self).validate() @@ -236,12 +242,6 @@ class PurchaseOrder(BuyingController): item.received_qty = item.qty def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Supplier Quotation": { - "fieldname": "supplier_quotation" - } - } - return super(PurchaseOrder, self).get_link_filters(for_doctype) @frappe.whitelist() diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 63e307db30..a34c12afa9 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -21,6 +21,15 @@ form_grid_templates = { class WarehouseRequired(frappe.ValidationError): pass class SalesOrder(SellingController): + def __init__(self, arg1, arg2=None): + super(SalesOrder, self).__init__(arg1, arg2) + + self.prev_link_mapper = { + "Quotation": { + "fieldname": "prevdoc_docname" + } + } + def validate(self): super(SalesOrder, self).validate() @@ -308,12 +317,6 @@ class SalesOrder(SellingController): cint(reference_doc.repeat_on_day_of_month))) def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Quotation": { - "fieldname": "prevdoc_docname" - } - } - return super(SalesOrder, self).get_link_filters(for_doctype) def get_list_context(context=None): diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index be6c7971e5..7d0cdcd1f5 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -60,7 +60,14 @@ class DeliveryNote(SellingController): 'source_field': '-1 * qty', 'extra_cond': """ and exists (select name from `tabDelivery Note` where name=`tabDelivery Note Item`.parent and is_return=1)""" }] + + self.prev_link_mapper = { + "Sales Order": { + "fieldname": "against_sales_order" + } + } + def before_print(self): def toggle_print_hide(meta, fieldname): df = meta.get_field(fieldname) @@ -284,12 +291,6 @@ class DeliveryNote(SellingController): self.load_from_db() def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Sales Order": { - "fieldname": "against_sales_order" - } - } - return super(DeliveryNote, self).get_link_filters(for_doctype) def update_billed_amount_based_on_so(so_detail, update_modified=True): diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index bfcecbde36..751d321932 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -45,6 +45,12 @@ class PurchaseReceipt(BuyingController): # 'overflow_type': 'receipt', 'extra_cond': """ and exists (select name from `tabPurchase Receipt` where name=`tabPurchase Receipt Item`.parent and is_return=1)""" }] + + self.prev_link_mapper = { + "Purchase Order": { + "fieldname": "prevdoc_docname" + } + } def validate(self): super(PurchaseReceipt, self).validate() @@ -334,12 +340,6 @@ class PurchaseReceipt(BuyingController): self.load_from_db() def get_link_filters(self, for_doctype): - self.prev_link_mapper = { - "Purchase Order": { - "fieldname": "prevdoc_docname" - } - } - return super(PurchaseReceipt, self).get_link_filters(for_doctype) def update_billed_amount_based_on_po(po_detail, update_modified=True): From b6d6b8420d1edf3a1c92f249c0a913772addd494 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 27 Jun 2016 14:48:26 +0530 Subject: [PATCH 3/3] [fix] add filters and child doc name in previous link mapper --- .../purchase_invoice/purchase_invoice.py | 17 ++++++++++++----- .../doctype/sales_invoice/sales_invoice.py | 17 ++++++++++++----- .../doctype/purchase_order/purchase_order.py | 10 ++++++---- .../selling/doctype/sales_order/sales_order.py | 10 ++++++---- .../doctype/delivery_note/delivery_note.py | 10 ++++++---- .../purchase_receipt/purchase_receipt.py | 10 ++++++---- erpnext/utilities/transaction_base.py | 2 +- 7 files changed, 49 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 8d7f6534d9..1e02415beb 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -38,10 +38,20 @@ class PurchaseInvoice(BuyingController): self.prev_link_mapper = { "Purchase Order": { - "fieldname": "purchase_order" + "fieldname": "purchase_order", + "doctype": "Purchase Invoice Item", + "filters": [ + ["Purchase Invoice Item", "parent", "=", self.name], + ["Purchase Invoice Item", "purchase_order", "!=", ""] + ] }, "Purchase Receipt": { - "fieldname": "purchase_receipt" + "fieldname": "purchase_receipt", + "doctype": "Purchase Invoice Item", + "filters": [ + ["Purchase Invoice Item", "parent", "=", self.item], + ["Purchase Invoice Item", "purchase_receipt", "!=", ""] + ] } } @@ -672,9 +682,6 @@ class PurchaseInvoice(BuyingController): def on_recurring(self, reference_doc): self.due_date = None - - def get_link_filters(self, for_doctype): - return super(PurchaseInvoice, self).get_link_filters(for_doctype) @frappe.whitelist() def make_debit_note(source_name, target_doc=None): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index bbbbccf22f..1a8eae39d7 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -41,10 +41,20 @@ class SalesInvoice(SellingController): self.prev_link_mapper = { "Sales Order": { - "fieldname": "sales_order" + "fieldname": "sales_order", + "doctype": "Sales Invoice Item", + "filters": [ + ["Sales Invoice Item", "parent", "=", self.name], + ["Sales Invoice Item", "sales_order", "!=", ""] + ] }, "Delivery Note": { - "fieldname": "delivery_note" + "fieldname": "delivery_note", + "doctype": "Sales Invoice Item", + "filters": [ + ["Sales Invoice Item", "parent", "=", self.name], + ["Sales Invoice Item", "delivery_note", "!=", ""] + ] } } @@ -705,9 +715,6 @@ class SalesInvoice(SellingController): self.set(fieldname, reference_doc.get(fieldname)) self.due_date = None - - def get_link_filters(self, for_doctype): - return super(SalesInvoice, self).get_link_filters(for_doctype) def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 9c7288c065..d4b2221095 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -35,7 +35,12 @@ class PurchaseOrder(BuyingController): self.prev_link_mapper = { "Supplier Quotation": { - "fieldname": "supplier_quotation" + "fieldname": "supplier_quotation", + "doctype": "Purchase Order Item", + "filters": [ + ["Purchase Order Item", "parent", "=", self.name], + ["Purchase Order Item", "supplier_quotation", "!=", ""] + ] } } @@ -241,9 +246,6 @@ class PurchaseOrder(BuyingController): if item.delivered_by_supplier == 1: item.received_qty = item.qty - def get_link_filters(self, for_doctype): - return super(PurchaseOrder, self).get_link_filters(for_doctype) - @frappe.whitelist() def close_or_unclose_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 a34c12afa9..8103756cfd 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -26,7 +26,12 @@ class SalesOrder(SellingController): self.prev_link_mapper = { "Quotation": { - "fieldname": "prevdoc_docname" + "fieldname": "prevdoc_docname", + "doctype": "Sales Order Item", + "filters": [ + ["Sales Order Item", "parent", "=", self.name], + ["Sales Order Item", "prevdoc_docname", "!=", ""] + ] } } @@ -315,9 +320,6 @@ class SalesOrder(SellingController): mcount = month_map[reference_doc.recurring_type] self.set("delivery_date", get_next_date(reference_doc.delivery_date, mcount, cint(reference_doc.repeat_on_day_of_month))) - - def get_link_filters(self, for_doctype): - return super(SalesOrder, self).get_link_filters(for_doctype) def get_list_context(context=None): from erpnext.controllers.website_list_for_contact import get_list_context diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 7d0cdcd1f5..d8defc0d4d 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -63,7 +63,12 @@ class DeliveryNote(SellingController): self.prev_link_mapper = { "Sales Order": { - "fieldname": "against_sales_order" + "fieldname": "against_sales_order", + "doctype": "Delivery Note Item", + "filters": [ + ["Delivery Note Item", "parent", "=", self.name], + ["Delivery Note Item", "against_sales_order", "!=", ""] + ] } } @@ -289,9 +294,6 @@ class DeliveryNote(SellingController): dn_doc.update_billing_percentage(update_modified=update_modified) self.load_from_db() - - def get_link_filters(self, for_doctype): - return super(DeliveryNote, self).get_link_filters(for_doctype) def update_billed_amount_based_on_so(so_detail, update_modified=True): # Billed against Sales Order directly diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 751d321932..6c72d6bf99 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -48,7 +48,12 @@ class PurchaseReceipt(BuyingController): self.prev_link_mapper = { "Purchase Order": { - "fieldname": "prevdoc_docname" + "fieldname": "prevdoc_docname", + "doctype": "Purchase Receipt Item", + "filters": [ + ["Purchase Receipt Item", "parent", "=", self.name], + ["Purchase Receipt Item", "prevdoc_docname", "!=", ""] + ] } } @@ -339,9 +344,6 @@ class PurchaseReceipt(BuyingController): self.load_from_db() - def get_link_filters(self, for_doctype): - return super(PurchaseReceipt, self).get_link_filters(for_doctype) - def update_billed_amount_based_on_po(po_detail, update_modified=True): # Billed against Sales Order directly billed_against_po = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item` diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py index 91055537b4..3cc79ef713 100644 --- a/erpnext/utilities/transaction_base.py +++ b/erpnext/utilities/transaction_base.py @@ -108,7 +108,7 @@ class TransactionBase(StatusUpdater): .format(d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate)) def get_link_filters(self, for_doctype): - if self.prev_link_mapper.get(for_doctype): + if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype): fieldname = self.prev_link_mapper[for_doctype]["fieldname"] values = filter(None, tuple([item.as_dict()[fieldname] for item in self.items]))