From 810bd35609aade27e84a729bd82b03bd733e678f Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Fri, 21 Aug 2015 15:04:57 +0530 Subject: [PATCH] Apply Tax Rule based on Customer Selection in Sales / Purchase Transactions --- .../test_records.json | 60 +++++ erpnext/accounts/doctype/tax_rule/tax_rule.js | 39 ++- .../accounts/doctype/tax_rule/tax_rule.json | 238 ++++++++++-------- erpnext/accounts/doctype/tax_rule/tax_rule.py | 83 ++++-- .../doctype/tax_rule/test_tax_rule.py | 132 ++++++++-- erpnext/accounts/party.py | 22 +- erpnext/buying/doctype/supplier/supplier.json | 1 + erpnext/public/js/utils/party.js | 1 + 8 files changed, 431 insertions(+), 145 deletions(-) diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json index 656d29c461..5c25517f7f 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json +++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json @@ -153,5 +153,65 @@ "territory": "_Test Territory Rest Of The World" } ] + }, + { + "company": "_Test Company", + "doctype": "Sales Taxes and Charges Template", + "taxes": [ + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 12 + }, + { + "account_head": "_Test Account Service Tax - _TC", + "charge_type": "On Net Total", + "description": "Service Tax", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 4 + } + ], + "title": "_Test Sales Taxes and Charges Template 1", + "territories": [ + { + "doctype": "Applicable Territory", + "parentfield": "territories", + "territory": "_Test Territory Rest Of The World" + } + ] + }, + { + "company": "_Test Company", + "doctype": "Sales Taxes and Charges Template", + "taxes": [ + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 12 + }, + { + "account_head": "_Test Account Service Tax - _TC", + "charge_type": "On Net Total", + "description": "Service Tax", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 4 + } + ], + "title": "_Test Sales Taxes and Charges Template 2", + "territories": [ + { + "doctype": "Applicable Territory", + "parentfield": "territories", + "territory": "_Test Territory Rest Of The World" + } + ] } ] diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.js b/erpnext/accounts/doctype/tax_rule/tax_rule.js index b9221785d5..d4a10aaec3 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.js +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.js @@ -2,6 +2,41 @@ // License: GNU General Public License v3. See license.txt cur_frm.add_fetch("customer", "customer_group", "customer_group" ); +cur_frm.add_fetch("supplier", "supplier_type", "supplier_type" ); -this.frm.toggle_reqd("sales_tax_template", this.frm.doc.tax_type=="Sales"); -this.frm.toggle_reqd("purchase_tax_template", this.frm.doc.tax_type=="Purchase"); \ No newline at end of file +cur_frm.toggle_reqd("sales_tax_template", cur_frm.doc.tax_type=="Sales"); +cur_frm.toggle_reqd("purchase_tax_template", cur_frm.doc.tax_type=="Purchase"); + +frappe.ui.form.on("Tax Rule", "customer", function(frm) { + frappe.call({ + method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details", + args: { + "party": frm.doc.customer, + "party_type": "customer" + }, + callback: function(r) { + if(!r.exc) { + $.each(r.message, function(k, v) { + frm.set_value(k, v); + }); + } + } + }); +}); + +frappe.ui.form.on("Tax Rule", "supplier", function(frm) { + frappe.call({ + method:"erpnext.accounts.doctype.tax_rule.tax_rule.get_party_details", + args: { + "party": frm.doc.supplier, + "party_type": "supplier" + }, + callback: function(r) { + if(!r.exc) { + $.each(r.message, function(k, v) { + frm.set_value(k, v); + }); + } + } + }); +}); \ No newline at end of file diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.json b/erpnext/accounts/doctype/tax_rule/tax_rule.json index f2df6544c4..52ca63f62e 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.json +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.json @@ -7,8 +7,93 @@ "custom": 0, "docstatus": 0, "doctype": "DocType", - "document_type": "Master", + "document_type": "Setup", "fields": [ + { + "allow_on_submit": 0, + "default": "Sales", + "fieldname": "tax_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Tax Type", + "no_copy": 0, + "options": "Sales\nPurchase", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "fieldname": "column_break_1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Sales\"", + "fieldname": "sales_tax_template", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Sales Tax Template", + "no_copy": 0, + "options": "Sales Taxes and Charges Template", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Purchase\"", + "fieldname": "purchase_tax_template", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Purchase Tax Template", + "no_copy": 0, + "options": "Purchase Taxes and Charges Template", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "filters", @@ -31,6 +116,7 @@ }, { "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Sales\"", "fieldname": "customer", "fieldtype": "Link", "hidden": 0, @@ -50,6 +136,28 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Purchase\"", + "fieldname": "supplier", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier", + "no_copy": 0, + "options": "Supplier", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "billing_city", @@ -112,6 +220,7 @@ }, { "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Sales\"", "fieldname": "customer_group", "fieldtype": "Link", "hidden": 0, @@ -131,6 +240,28 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "depends_on": "eval:doc.tax_type==\"Purchase\"", + "fieldname": "supplier_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Type", + "no_copy": 0, + "options": "Supplier Type", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "fieldname": "shipping_city", @@ -251,109 +382,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "fieldname": "section_break_7", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "tax_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Tax Type", - "no_copy": 0, - "options": "\nSales\nPurchase", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "fieldname": "column_break_9", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "depends_on": "eval: doc.tax_type == \"Sales\"", - "fieldname": "sales_tax_template", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Sales Tax Template", - "no_copy": 0, - "options": "Sales Taxes and Charges Template", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "depends_on": "eval: doc.tax_type == \"Purchase\"", - "fieldname": "purchase_tax_template", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Purchase Tax Template", - "no_copy": 0, - "options": "Purchase Taxes and Charges Template", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "fieldname": "section_break_6", @@ -442,7 +470,7 @@ "is_submittable": 0, "issingle": 0, "istable": 0, - "modified": "2015-08-14 08:10:56.694925", + "modified": "2015-08-21 03:27:43.564183", "modified_by": "Administrator", "module": "Accounts", "name": "Tax Rule", diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py index d1b0bdc8de..635bdc1ed9 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -6,43 +6,56 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document +from frappe.utils import cstr class IncorrectCustomerGroup(frappe.ValidationError): pass +class IncorrectSupplierType(frappe.ValidationError): pass +class ConflictingTaxRule(frappe.ValidationError): pass class TaxRule(Document): def validate(self): self.validate_tax_template() self.validate_customer_group() + self.validate_supplier_type() self.validate_date() self.validate_filters() - + def validate_tax_template(self): + if self.tax_type== "Sales": + self.purchase_tax_template = self.supplier = self.supplier_type= None + else: + self.sales_tax_template= self.customer = self.customer_group= None + if not (self.sales_tax_template or self.purchase_tax_template): frappe.throw(_("Tax Template is mandatory.")) - if self.tax_type=="Sales": - self.purchase_tax_template= None - else: - self.sales_tax_template= None def validate_customer_group(self): if self.customer and self.customer_group: if not frappe.db.get_value("Customer", self.customer, "customer_group") == self.customer_group: frappe.throw(_("Customer {0} does not belong to customer group {1}"). \ format(self.customer, self.customer_group), IncorrectCustomerGroup) - + + def validate_supplier_type(self): + if self.supplier and self.supplier_type: + if not frappe.db.get_value("Supplier", self.supplier, "supplier_type") == self.supplier_type: + frappe.throw(_("Supplier {0} does not belong to Supplier Type {1}"). \ + format(self.supplier, self.supplier_type), IncorrectSupplierType) + def validate_date(self): if self.from_date and self.to_date and self.from_date > self.to_date: frappe.throw(_("From Date cannot be greater than To Date")) def validate_filters(self): filters = { + "tax_type": self.tax_type, "customer": self.customer, "customer_group": self.customer_group, + "supplier": self.supplier, + "supplier_type": self.supplier_type, "billing_city": self.billing_city, "billing_country": self.billing_country, "shipping_city": self.shipping_city, "shipping_country": self.shipping_country, - "tax_type": self.tax_type, "company": self.company } @@ -50,16 +63,58 @@ class TaxRule(Document): for d in filters: if conds: conds += " and " - conds += """{0} = '{1}'""".format(d, filters[d]) - - conds += """ and ((from_date > '{from_date}' and from_date < '{to_date}') or - (to_date > '{from_date}' and to_date < '{to_date}') or - ('{from_date}' > from_date and '{from_date}' < to_date) or - ('{from_date}' = from_date and '{to_date}' = to_date))""".format(from_date=self.from_date, to_date=self.to_date) + conds += """ifnull({0}, '') = '{1}'""".format(d, frappe.db.escape(cstr(filters[d]))) + + if self.from_date and self.to_date: + conds += """ and ((from_date > '{from_date}' and from_date < '{to_date}') or + (to_date > '{from_date}' and to_date < '{to_date}') or + ('{from_date}' > from_date and '{from_date}' < to_date) or + ('{from_date}' = from_date and '{to_date}' = to_date))""".format(from_date=self.from_date, to_date=self.to_date) + + elif self.from_date and not self.to_date: + conds += """ and to_date > '{from_date}'""".format(from_date = self.from_date) + + elif self.to_date and not self.from_date: + conds += """ and from_date < '{to_date}'""".format(to_date = self.to_date) tax_rule = frappe.db.sql("select name, priority \ from `tabTax Rule` where {0} and name != '{1}'".format(conds, self.name), as_dict=1) if tax_rule: if tax_rule[0].priority == self.priority: - frappe.throw(_("Tax Rule Conflicts with {0}".format(tax_rule[0].name))) \ No newline at end of file + frappe.throw(_("Tax Rule Conflicts with {0}".format(tax_rule[0].name)), ConflictingTaxRule) + +@frappe.whitelist() +def get_party_details(party, party_type): + out = {} + billing_address = frappe.get_list("Address", fields=["city", "country"], filters={party_type: party, "is_primary_address": 1}) + shipping_address = frappe.get_list("Address", fields=["city", "country"], filters={party_type:party, "is_shipping_address": 1}) + if billing_address: + out["billing_city"]= billing_address[0].city + out["billing_country"]= billing_address[0].country + if shipping_address: + out["shipping_city"]= shipping_address[0].city + out["shipping_country"]= shipping_address[0].country + return out + +def get_tax_template(posting_date, args): + """Get matching tax rule""" + args = frappe._dict(args) + conditions = [] + + for key, value in args.iteritems(): + conditions.append("ifnull({0}, '') in ('', '{1}')".format(key, frappe.db.escape(cstr(value)))) + + matching = frappe.db.sql("""select * from `tabTax Rule` + where {0}""".format(" and ".join(conditions)), as_dict = True) + + if not matching: + return None + + for rule in matching: + rule.no_of_keys_matched = 0 + for key in args: + if rule.get(key): rule.no_of_keys_matched += 1 + + rule = sorted(matching, lambda b, a: cmp(a.no_of_keys_matched, b.no_of_keys_matched) or cmp(a.priority, b.priority))[0] + return rule.sales_tax_template or rule.purchase_tax_template \ No newline at end of file diff --git a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py index 7a2c6ef080..873a4e38a7 100644 --- a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py @@ -5,39 +5,127 @@ from __future__ import unicode_literals import frappe import unittest -from frappe.utils import nowdate, add_days -from erpnext.accounts.doctype.tax_rule.tax_rule import IncorrectCustomerGroup +from erpnext.accounts.doctype.tax_rule.tax_rule import IncorrectCustomerGroup, IncorrectSupplierType, ConflictingTaxRule, get_tax_template # test_records = frappe.get_test_records('Tax Rule') class TestTaxRule(unittest.TestCase): + def setUp(self): + frappe.db.sql("delete from `tabTax Rule`") + def test_customer_group(self): - tax_rule = make_tax_rule_test_record(customer_group= "_Test Customer Group 1", do_not_save= True) + tax_rule = make_tax_rule(customer= "_Test Customer", customer_group= "_Test Customer Group 1", + sales_tax_template = "_Test Sales Taxes and Charges Template") self.assertRaises(IncorrectCustomerGroup, tax_rule.save) - def test_tax_template(self): - tax_rule = make_tax_rule_test_record() - self.assertEquals(tax_rule.purchase_tax_template, None) + def test_supplier_type(self): + tax_rule = make_tax_rule(supplier= "_Test Supplier", supplier_type= "_Test Supplier Type 1", + purchase_tax_template = "_Test Purchase Taxes and Charges Template") + self.assertRaises(IncorrectSupplierType, tax_rule.save) + + def test_conflict(self): + tax_rule1 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1) + tax_rule1.save() -def make_tax_rule_test_record(**args): + tax_rule2 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1) + + self.assertRaises(ConflictingTaxRule, tax_rule2.save) + + def test_conflict_with_non_overlapping_dates(self): + tax_rule1 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1, from_date = "2015-01-01") + tax_rule1.save() + + tax_rule2 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1, to_date = "2013-01-01") + + tax_rule2.save() + self.assertTrue(tax_rule2.name) + + def test_conflict_with_overlapping_dates(self): + tax_rule1 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1, from_date = "2015-01-01", to_date = "2015-01-05") + tax_rule1.save() + + tax_rule2 = make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority = 1, from_date = "2015-01-03", to_date = "2015-01-09") + + self.assertRaises(ConflictingTaxRule, tax_rule2.save) + + def test_tax_template(self): + tax_rule = make_tax_rule() + self.assertEquals(tax_rule.purchase_tax_template, None) + + + def test_select_tax_rule_based_on_customer(self): + make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template", save=1) + + make_tax_rule(customer= "_Test Customer 1", + sales_tax_template = "_Test Sales Taxes and Charges Template 1", save=1) + + make_tax_rule(customer= "_Test Customer 2", + sales_tax_template = "_Test Sales Taxes and Charges Template 2", save=1) + + self.assertEquals(get_tax_template("2015-01-01", {"customer":"_Test Customer 2"}), + "_Test Sales Taxes and Charges Template 2") + + def test_select_tax_rule_based_on_better_match(self): + make_tax_rule(customer= "_Test Customer", billing_city = "Test City", + sales_tax_template = "_Test Sales Taxes and Charges Template", save=1) + + make_tax_rule(customer= "_Test Customer", + sales_tax_template = "_Test Sales Taxes and Charges Template 1", save=1) + + self.assertEquals(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City"}), + "_Test Sales Taxes and Charges Template") + + def test_select_tax_rule_based_on_better_priority(self): + make_tax_rule(customer= "_Test Customer", billing_city = "Test City", + sales_tax_template = "_Test Sales Taxes and Charges Template", priority=1, save=1) + + make_tax_rule(customer= "_Test Customer", billing_city = "Test City", + sales_tax_template = "_Test Sales Taxes and Charges Template 1", priority=2, save=1) + + self.assertEquals(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City"}), + "_Test Sales Taxes and Charges Template 1") + + def test_select_tax_rule_based_cross_matching_keys(self): + make_tax_rule(customer= "_Test Customer", billing_city = "Test City", + sales_tax_template = "_Test Sales Taxes and Charges Template", save=1) + + make_tax_rule(customer= "_Test Customer 1", billing_city = "Test City 1", + sales_tax_template = "_Test Sales Taxes and Charges Template 1", save=1) + + self.assertEquals(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City 1"}), + None) + + def test_select_tax_rule_based_cross_partially_keys(self): + make_tax_rule(customer= "_Test Customer", billing_city = "Test City", + sales_tax_template = "_Test Sales Taxes and Charges Template", save=1) + + make_tax_rule(billing_city = "Test City 1", + sales_tax_template = "_Test Sales Taxes and Charges Template 1", save=1) + + self.assertEquals(get_tax_template("2015-01-01", {"customer":"_Test Customer", "billing_city": "Test City 1"}), + "_Test Sales Taxes and Charges Template 1") + + +def make_tax_rule(**args): args = frappe._dict(args) tax_rule = frappe.new_doc("Tax Rule") - tax_rule.customer= args.customer or "_Test Customer" - tax_rule.customer_group= args.customer_group or "_Test Customer Group" - tax_rule.billing_city= args.billing_city or "_Test City" - tax_rule.billing_country= args.billing_country or "_Test Country" - tax_rule.shipping_city= args.shipping_city or "_Test City" - tax_rule.shipping_country= args.shipping_country or "_Test Country" - tax_rule.from_date= args.from_date or nowdate() - tax_rule.to_date= args.to_date or add_days(nowdate(), 1) - tax_rule.tax_type= args.tax_type or "Sales" - tax_rule.sales_tax_template= args.sales_tax_template or "_Test Sales Taxes and Charges Template" - tax_rule.purchase_tax_template= args.purchase_tax_template or "_Test Purchase Taxes and Charges Template" - tax_rule.priority= args.priority or 1 - tax_rule.compant= args.company or "_Test Company" - if not args.do_not_save: - tax_rule.save() + for key, val in args.iteritems(): + if key != "save": + tax_rule.set(key, val) + + tax_rule.company = args.company or "_Test Company" + + if args.save: + tax_rule.insert() + return tax_rule \ No newline at end of file diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 4f49bc07fd..313544f143 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -43,6 +43,7 @@ def _get_party_details(party=None, account=None, party_type="Customer", company= set_contact_details(out, party, party_type) set_other_values(out, party, party_type) set_price_list(out, party, party_type, price_list) + out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out) if not out.get("currency"): out["currency"] = currency @@ -99,7 +100,7 @@ def set_other_values(out, party, party_type): out[f] = party.get(f) # fields prepended with default in Customer doctype - for f in ['currency', 'taxes_and_charges'] \ + for f in ['currency'] \ + (['sales_partner', 'commission_rate'] if party_type=="Customer" else []): if party.get("default_" + f): out[f] = party.get("default_" + f) @@ -274,4 +275,21 @@ def validate_due_date(posting_date, due_date, party_type, party, company): msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)") .format(date_diff(due_date, default_due_date))) else: - frappe.throw(_("Due / Reference Date cannot be after {0}").format(formatdate(default_due_date))) \ No newline at end of file + frappe.throw(_("Due / Reference Date cannot be after {0}").format(formatdate(default_due_date))) + +def set_taxes(party, party_type, posting_date, company, out): + print "posting_date", posting_date + from erpnext.accounts.doctype.tax_rule.tax_rule import get_tax_template, get_party_details + args = { + party_type: party, + "customer_group": out.customer_group, + "supplier_type": out.supplier_type, + "company": company + } + args.update(get_party_details(party, party_type)) + if party_type=="Customer": + args.update({"tax_type": "Sales"}) + else: + args.update({"tax_type": "Purchase"}) + + return get_tax_template(posting_date, args) \ No newline at end of file diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 2a0a50d45d..ce68370d13 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -1,4 +1,5 @@ { +<<<<<<< HEAD "allow_copy": 0, "allow_import": 1, "allow_rename": 1, diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 919225f9a9..59992ebc04 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -20,6 +20,7 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) { price_list: frm.doc.buying_price_list }; } + args.posting_date = frm.doc.transaction_date; } if(!args) return;