From cc008cc1093177c16f4a13b57aa0210004ad967a Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 3 Feb 2014 16:14:56 +0530 Subject: [PATCH] commonified get_party_details --- .../purchase_invoice/purchase_invoice.js | 6 +- .../doctype/sales_invoice/sales_invoice.js | 6 +- .../doctype/sales_invoice/sales_invoice.py | 2 +- erpnext/accounts/party.py | 96 +++++++++++++++++-- erpnext/buying/doctype/supplier/supplier.py | 25 +---- erpnext/controllers/buying_controller.py | 4 +- erpnext/controllers/selling_controller.py | 4 +- erpnext/public/js/utils/party.js | 17 ++-- erpnext/selling/doctype/customer/customer.py | 55 ----------- .../selling/doctype/customer/test_customer.py | 64 +++---------- .../stock/doctype/stock_entry/stock_entry.js | 8 +- 11 files changed, 126 insertions(+), 161 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index f7aeecde35..30998e44ec 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -79,13 +79,13 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ supplier: function() { if(this.frm.updating_party_details) return; - erpnext.selling.get_party_details(this.frm, + erpnext.utils.get_party_details(this.frm, "erpnext.accounts.party.get_party_details", { posting_date: this.frm.doc.posting_date, - company: this.frm.doc.company, party: this.frm.doc.supplier, party_type: "Supplier", - account: this.frm.doc.debit_to + account: this.frm.doc.debit_to, + price_list: this.frm.doc.buying_price_list, }) }, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index fdf2265b9a..2b33bf0033 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -158,13 +158,13 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte customer: function() { if(this.frm.updating_party_details) return; - erpnext.selling.get_party_details(this.frm, + erpnext.utils.get_party_details(this.frm, "erpnext.accounts.party.get_party_details", { posting_date: this.frm.doc.posting_date, - company: this.frm.doc.company, party: this.frm.doc.customer, party_type: "Customer", - account: this.frm.doc.debit_to + account: this.frm.doc.debit_to, + price_list: this.frm.doc.selling_price_list, }) }, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index bb7d1c1b8c..f57f6f05c0 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -751,7 +751,7 @@ def notify_errors(inv, customer, owner): message = webnotes.get_template("template/emails/recurring_invoice_failed.html").render({ "name": inv, "customer": customer - }) + })) assign_task_to_owner(inv, "Recurring Invoice Failed", recipients) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 0eedd9924e..c9ffd0e7a9 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -5,17 +5,98 @@ from __future__ import unicode_literals import webnotes from webnotes import _ +from webnotes.defaults import get_restrictions +from erpnext.utilities.doctype.address.address import get_address_display +from erpnext.utilities.doctype.contact.contact import get_contact_details @webnotes.whitelist() -def get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None): - if not webnotes.has_permission(party_type, "read", party): - webnotes.throw("No Permission") +def get_party_details(party=None, account=None, party_type="Customer", company=None, + posting_date=None, price_list=None, currency=None): + out = webnotes._dict(set_account_and_due_date(party, account, party_type, company, posting_date)) + party = out[party_type.lower()] + + if not webnotes.has_permission(party_type, "read", party): + webnotes.throw("Not Permitted", webnotes.PermissionError) + + party_bean = webnotes.bean(party_type, party) + party = party_bean.doc + + set_address_and_contact(out, party, party_type) + set_other_values(out, party, party_type) + set_price_list(out, party, price_list) + + if not out.get("currency"): + out["currency"] = currency + + # sales team if party_type=="Customer": - get_party_details = webnotes.get_attr("erpnext.selling.doctype.customer.customer.get_customer_details") + out["sales_team"] = [{ + "sales_person": d.sales_person, + "sales_designation": d.sales_designation + } for d in party_bean.doclist.get({"doctype":"Sales Team"})] + + return out + +def set_address_and_contact(out, party, party_type): + out.update({ + party_type.lower() + "_address": webnotes.conn.get_value("Address", + {party_type.lower(): party.name, "is_primary_address":1}, "name"), + "contact_person": webnotes.conn.get_value("Contact", + {party_type.lower(): party.name, "is_primary_contact":1}, "name") + }) + + # address display + out.address_display = get_address_display(out[party_type.lower() + "_address"]) + + # primary contact details + out.update(get_contact_details(out.contact_person)) + + +def set_other_values(out, party, party_type): + # copy + if party_type=="Customer": + to_copy = ["customer_name", "customer_group", "territory"] else: - get_party_details = webnotes.get_attr("erpnext.buying.doctype.supplier.supplier.get_supplier_details") - + to_copy = ["supplier_name", "supplier_type"] + for f in to_copy: + out[f] = party.get(f) + + # fields prepended with default in Customer doctype + for f in ['currency', 'taxes_and_charges'] \ + + (['sales_partner', 'commission_rate'] if party_type=="Customer" else []): + if party.get("default_" + f): + out[f] = party.get("default_" + f) + +def set_price_list(out, party, given_price_list): + # price list + price_list = get_restrictions().get("Price List") + if isinstance(price_list, list): + price_list = None + + if not price_list: + price_list = party.default_price_list + + if not price_list and party.party_type=="Customer": + price_list = webnotes.conn.get_value("Customer Group", + party.customer_group, "default_price_list") + + if not price_list: + price_list = given_price_list + + if price_list: + out.price_list_currency = webnotes.conn.get_value("Price List", price_list, "currency") + + out["selling_price_list" if party.doctype=="Customer" else "buying_price_list"] = price_list + + +def set_account_and_due_date(party, account, party_type, company, posting_date): + if not posting_date: + # not an invoice + return { + party_type.lower(): party + } + if party: account = get_party_account(company, party, party_type) elif account: @@ -27,8 +108,7 @@ def get_party_details(party=None, account=None, party_type="Customer", company=N party_type.lower(): party, account_fieldname : account, "due_date": get_due_date(posting_date, party, party_type, account, company) - } - out.update(get_party_details(party)) + } return out def get_party_account(company, party, party_type): diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index 94bc679baa..9fe52c8b99 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -127,27 +127,4 @@ def get_dashboard_info(supplier): out["total_unpaid"] = billing[0][1] return out - -@webnotes.whitelist() -def get_supplier_details(supplier, price_list=None, currency=None): - if not webnotes.has_permission("Supplier", "read", supplier): - webnotes.msgprint("No Permission", raise_exception=webnotes.PermissionError) - - supplier = webnotes.doc("Supplier", supplier) - - out = webnotes._dict({ - "supplier_address": webnotes.conn.get_value("Address", - {"supplier": supplier.name, "is_primary_address":1}, "name"), - "contact_person": webnotes.conn.get_value("Contact", - {"supplier":supplier.name, "is_primary_contact":1}, "name") - }) - - for f in ['currency', 'taxes_and_charges']: - if supplier.fields.get("default_" + f): - out[f] = supplier.fields.get("default_" + f) - - out.supplier_name = supplier.supplier_name - out.currency = supplier.default_currency or currency - out.buying_price_list = supplier.default_price_list or price_list - - return out \ No newline at end of file + \ No newline at end of file diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 5c45c11e33..00fb05eae2 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -7,7 +7,7 @@ from webnotes import _, msgprint from webnotes.utils import flt, _round from erpnext.buying.utils import get_item_details from erpnext.setup.utils import get_company_currency -from erpnext.buying.doctype.supplier.supplier import get_supplier_details +from erpnext.accounts.party import get_party_details from erpnext.controllers.stock_controller import StockController @@ -33,7 +33,7 @@ class BuyingController(StockController): # set contact and address details for supplier, if they are not mentioned if self.doc.supplier: - self.doc.update_if_missing(get_supplier_details(self.doc.supplier)) + self.doc.update_if_missing(get_party_details(self.doc.supplier, party_type="Supplier")) self.set_missing_item_details(get_item_details) if self.doc.fields.get("__islocal"): diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 75b27a5ddf..a075ad4c4b 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -33,9 +33,9 @@ class SellingController(StockController): self.set_taxes("other_charges", "taxes_and_charges") def set_missing_lead_customer_details(self): - from erpnext.selling.doctype.customer.customer import get_customer_details + from erpnext.accounts.party import get_party_details if self.doc.customer: - self.doc.update_if_missing(get_customer_details(self.doc.customer)) + self.doc.update_if_missing(get_party_details(self.doc.customer)) elif self.doc.lead: self.doc.update_if_missing(self.get_lead_defaults()) diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index bda44cea7e..c01dee6b1f 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -4,28 +4,25 @@ wn.provide("erpnext.utils"); erpnext.utils.get_party_details = function(frm, method, args) { if(!method) { - if(frm.doc.customer) { - method = "erpnext.selling.doctype.customer.customer.get_customer_details"; - var price_list_field = "selling_price_list"; - } else { - method = "erpnext.buying.doctype.supplier.supplier.get_supplier_details"; - var price_list_field = "buying_price_list"; - } + method = "erpnext.accounts.party.get_party_details"; } if(!args) { if(frm.doc.customer) { args = { - customer: frm.doc.customer, + party: frm.doc.customer, + party_type: "Customer", price_list: frm.doc.selling_price_list }; } else { args = { - supplier: frm.doc.supplier, + party: frm.doc.supplier, + party_type: "Supplier", price_list: frm.doc.buying_price_list }; } - args.currency = frm.doc.currency; } + args.currency = frm.doc.currency; + args.company = frm.doc.company; wn.call({ method: method, args: args, diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index c8c619aaeb..f51cd552fd 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -163,58 +163,3 @@ def get_dashboard_info(customer): out["total_unpaid"] = billing[0][1] return out - -@webnotes.whitelist() -def get_customer_details(customer, price_list=None, currency=None): - if not webnotes.has_permission("Customer", "read", customer): - webnotes.throw("Not Permitted", webnotes.PermissionError) - - out = {} - customer_bean = webnotes.bean("Customer", customer) - customer = customer_bean.doc - - out = webnotes._dict({ - "customer_address": webnotes.conn.get_value("Address", - {"customer": customer.name, "is_primary_address":1}, "name"), - "contact_person": webnotes.conn.get_value("Contact", - {"customer":customer.name, "is_primary_contact":1}, "name") - }) - - # address display - out.address_display = get_address_display(out.customer_address) - - # primary contact details - out.update(get_contact_details(out.contact_person)) - - # copy - for f in ['customer_name', 'customer_group', 'territory']: - out[f] = customer.get(f) - - # fields prepended with default in Customer doctype - for f in ['sales_partner', 'commission_rate', 'currency', 'price_list', 'taxes_and_charges']: - if customer.get("default_" + f): - out[f] = customer.get("default_" + f) - - # price list - from webnotes.defaults import get_defaults_for - out.selling_price_list = get_defaults_for(webnotes.session.user).get(price_list) - if isinstance(out.selling_price_list, list): - out.selling_price_list = None - - out.selling_price_list = out.selling_price_list or customer.price_list \ - or webnotes.conn.get_value("Customer Group", - customer.customer_group, "default_price_list") or price_list - - if out.selling_price_list: - out.price_list_currency = webnotes.conn.get_value("Price List", out.selling_price_list, "currency") - - if not out.currency: - out.currency = currency - - # sales team - out.sales_team = [{ - "sales_person": d.sales_person, - "sales_designation": d.sales_designation - } for d in customer_bean.doclist.get({"doctype":"Sales Team"})] - - return out \ No newline at end of file diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index b3e0372195..abe032973d 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -10,8 +10,8 @@ from webnotes.test_runner import make_test_records class TestCustomer(unittest.TestCase): - def test_get_customer_details(self): - from erpnext.selling.doctype.customer.customer import get_customer_details + def test_party_details(self): + from erpnext.accounts.party import get_party_details to_check = { 'address_display': '_Test Address Line 1\n_Test City\nIndia\nPhone: +91 0000000000', @@ -22,7 +22,7 @@ class TestCustomer(unittest.TestCase): 'contact_department': None, 'contact_email': 'test_contact_customer@example.com', 'contact_mobile': None, - '_sales_team': [], + 'sales_team': [], 'contact_display': '_Test Contact For _Test Customer', 'contact_person': '_Test Contact For _Test Customer-_Test Customer', 'territory': u'_Test Territory', @@ -32,9 +32,9 @@ class TestCustomer(unittest.TestCase): make_test_records("Address") make_test_records("Contact") - - details = get_customer_details("_Test Customer") - + + details = get_party_details("_Test Customer") + for key, value in to_check.iteritems(): self.assertEquals(value, details.get(key)) @@ -49,49 +49,7 @@ class TestCustomer(unittest.TestCase): self.assertEqual(webnotes.conn.exists("Customer", "_Test Customer 1"), ()) webnotes.rename_doc("Customer", "_Test Customer 1 Renamed", "_Test Customer 1") - - def test_merge(self): - make_test_records("Sales Invoice") - - # clear transactions for new name - webnotes.conn.sql("""delete from `tabSales Invoice` where customer='_Test Customer 1'""") - - # check if they exist - self.assertEqual(webnotes.conn.exists("Customer", "_Test Customer"), - (("_Test Customer",),)) - self.assertEqual(webnotes.conn.exists("Customer", "_Test Customer 1"), - (("_Test Customer 1",),)) - self.assertEqual(webnotes.conn.exists("Account", "_Test Customer - _TC"), - (("_Test Customer - _TC",),)) - self.assertEqual(webnotes.conn.exists("Account", "_Test Customer 1 - _TC"), - (("_Test Customer 1 - _TC",),)) - - # check if transactions exists - self.assertNotEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where customer='_Test Customer'""", )[0][0], 0) - self.assertNotEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where debit_to='_Test Customer - _TC'""", )[0][0], 0) - - webnotes.rename_doc("Customer", "_Test Customer", "_Test Customer 1", merge=True) - - # check that no transaction exists for old name - self.assertNotEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where customer='_Test Customer 1'""", )[0][0], 0) - self.assertNotEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where debit_to='_Test Customer 1 - _TC'""", )[0][0], 0) - - # check that transactions exist for new name - self.assertEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where customer='_Test Customer'""", )[0][0], 0) - self.assertEquals(webnotes.conn.sql("""select count(*) from `tabSales Invoice` - where debit_to='_Test Customer - _TC'""", )[0][0], 0) - - # check that old name doesn't exist - self.assertEqual(webnotes.conn.exists("Customer", "_Test Customer"), ()) - self.assertEqual(webnotes.conn.exists("Account", "_Test Customer - _TC"), ()) - - # create back _Test Customer - webnotes.bean(copy=test_records[0]).insert() + test_ignore = ["Price List"] @@ -111,5 +69,13 @@ test_records = [ "customer_group": "_Test Customer Group", "territory": "_Test Territory", "company": "_Test Company" + }], + [{ + "doctype": "Customer", + "customer_name": "_Test Customer 2", + "customer_type": "Individual", + "customer_group": "_Test Customer Group", + "territory": "_Test Territory", + "company": "_Test Company" }] ] \ No newline at end of file diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 5c7fdef32b..5df1af8a83 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -239,15 +239,15 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ customer: function() { return this.frm.call({ - method: "erpnext.selling.doctype.customer.customer.get_customer_details", - args: { customer: this.frm.doc.customer } + method: "erpnext.accounts.party.get_party_details", + args: { party: this.frm.doc.customer, party_type:"Customer" } }); }, supplier: function() { return this.frm.call({ - method: "erpnext.buying.doctype.supplier.supplier.get_supplier_details", - args: { supplier: this.frm.doc.supplier } + method: "erpnext.accounts.party.get_party_details", + args: { party: this.frm.doc.supplier, party_type:"Supplier" } }); },