From f718b0c0df1a27a9b0a178ebc90b82600ba47ec0 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Tue, 20 Feb 2018 11:26:46 +0530 Subject: [PATCH] Currency filter in Pricing Rule (#11776) * added currency filter * modified files * pull margin only if currency matches * Renamed price to rate in pricing rule * fetch rate only if currency matches * rebase with develop * rebase with develop * patch to set currency in existing docs * currency field mandatory in pricing rule * modified test cases * rebase with develop * fixed test case --- .../doctype/pricing_rule/pricing_rule.js | 6 +- .../doctype/pricing_rule/pricing_rule.json | 50 +++++++++++++--- .../doctype/pricing_rule/pricing_rule.py | 53 +++++++++++------ .../doctype/pricing_rule/test_pricing_rule.py | 30 ++++++---- .../{ => tests}/test_pricing_rule.js | 3 +- ...st_pricing_rule_with_different_currency.js | 58 +++++++++++++++++++ .../test_pricing_rule_with_same_currency.js | 56 ++++++++++++++++++ erpnext/controllers/taxes_and_totals.py | 13 ++++- .../user/manual/en/accounts/pricing-rule.md | 11 ++-- erpnext/patches.txt | 2 + .../rename_price_to_rate_in_pricing_rule.py | 14 +++++ .../v10_0/set_currency_in_pricing_rule.py | 12 ++++ erpnext/tests/ui/tests.txt | 4 +- 13 files changed, 261 insertions(+), 51 deletions(-) rename erpnext/accounts/doctype/pricing_rule/{ => tests}/test_pricing_rule.js (88%) create mode 100644 erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js create mode 100644 erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js create mode 100644 erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py create mode 100644 erpnext/patches/v10_0/set_currency_in_pricing_rule.py diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js index 120329b30fb..dcbf354c16c 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js @@ -14,7 +14,7 @@ frappe.ui.form.on("Pricing Rule", "refresh", function(frm) { ${__("Pricing Rule is made to overwrite Price List / define discount percentage, based on some criteria.")}
  • - ${__("If selected Pricing Rule is made for 'Price', it will overwrite Price List. Pricing Rule price is the final price, so no further discount should be applied. Hence, in transactions like Sales Order, Purchase Order etc, it will be fetched in 'Rate' field, rather than 'Price List Rate' field.")} + ${__("If selected Pricing Rule is made for 'Rate', it will overwrite Price List. Pricing Rule rate is the final rate, so no further discount should be applied. Hence, in transactions like Sales Order, Purchase Order etc, it will be fetched in 'Rate' field, rather than 'Price List Rate' field.")}
  • ${__('Discount Percentage can be applied either against a Price List or for all Price List.')} @@ -97,8 +97,8 @@ cur_frm.cscript.margin_type = function(doc){ cur_frm.set_df_property('margin_rate_or_amount', 'description', doc.margin_type=='Percentage'?'In Percentage %':'In Amount') } -frappe.ui.form.on('Pricing Rule', 'price_or_discount', function(frm){ - if(frm.doc.price_or_discount == 'Price') { +frappe.ui.form.on('Pricing Rule', 'rate_or_discount', function(frm){ + if(frm.doc.rate_or_discount == 'Rate') { frm.set_value('for_price_list', "") } }) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json index 6fae8f7d7a4..1c30fa43577 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -910,6 +910,38 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Currency", + "length": 0, + "no_copy": 0, + "options": "Currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1070,7 +1102,7 @@ "collapsible": 0, "columns": 0, "default": "Discount Percentage", - "fieldname": "price_or_discount", + "fieldname": "rate_or_discount", "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, @@ -1079,10 +1111,10 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Price or Discount", + "label": "Rate or Discount", "length": 0, "no_copy": 0, - "options": "\nPrice\nDiscount Percentage", + "options": "\nRate\nDiscount Percentage", "permlevel": 0, "print_hide": 0, "print_hide_if_no_value": 0, @@ -1128,8 +1160,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.price_or_discount==\"Price\"", - "fieldname": "price", + "depends_on": "eval:doc.rate_or_discount==\"Rate\"", + "fieldname": "rate", "fieldtype": "Currency", "hidden": 0, "ignore_user_permissions": 0, @@ -1138,7 +1170,7 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Price", + "label": "Rate", "length": 0, "no_copy": 0, "permlevel": 0, @@ -1158,7 +1190,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", + "depends_on": "eval:doc.rate_or_discount==\"Discount Percentage\"", "fieldname": "discount_percentage", "fieldtype": "Float", "hidden": 0, @@ -1188,7 +1220,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", + "depends_on": "eval:doc.rate_or_discount==\"Discount Percentage\"", "fieldname": "for_price_list", "fieldtype": "Link", "hidden": 0, @@ -1284,7 +1316,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-27 08:31:38.432574", + "modified": "2018-02-12 17:21:22.559996", "modified_by": "Administrator", "module": "Accounts", "name": "Pricing Rule", diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 1087878716c..0479cd8d18c 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -21,7 +21,7 @@ class PricingRule(Document): self.validate_applicable_for_selling_or_buying() self.validate_min_max_qty() self.cleanup_fields_value() - self.validate_price_or_discount() + self.validate_rate_or_discount() self.validate_max_discount() if not self.margin_type: self.margin_rate_or_amount = 0.0 @@ -50,7 +50,7 @@ class PricingRule(Document): throw(_("Min Qty can not be greater than Max Qty")) def cleanup_fields_value(self): - for logic_field in ["apply_on", "applicable_for", "price_or_discount"]: + for logic_field in ["apply_on", "applicable_for", "rate_or_discount"]: fieldname = frappe.scrub(self.get(logic_field) or "") # reset all values except for the logic field @@ -62,13 +62,13 @@ class PricingRule(Document): if f!=fieldname: self.set(f, None) - def validate_price_or_discount(self): - for field in ["Price"]: + def validate_rate_or_discount(self): + for field in ["Rate"]: if flt(self.get(frappe.scrub(field))) < 0: throw(_("{0} can not be negative").format(field)) def validate_max_discount(self): - if self.price_or_discount == "Discount Percentage" and self.item_code: + if self.rate_or_discount == "Discount Percentage" and self.item_code: max_discount = frappe.db.get_value("Item", self.item_code, "max_discount") if max_discount and flt(self.discount_percentage) > flt(max_discount): throw(_("Max discount allowed for item: {0} is {1}%").format(self.item_code, max_discount)) @@ -176,17 +176,34 @@ def get_pricing_rule_for_item(args): if pricing_rule: item_details.pricing_rule = pricing_rule.name - item_details.pricing_rule_for = pricing_rule.price_or_discount - item_details.margin_type = pricing_rule.margin_type - item_details.margin_rate_or_amount = pricing_rule.margin_rate_or_amount - if pricing_rule.price_or_discount == "Price": - item_details.update({ - "price_list_rate": (pricing_rule.price/flt(args.conversion_rate)) * args.conversion_factor or 1.0 \ - if args.conversion_rate else 0.0, - "discount_percentage": 0.0 - }) + item_details.pricing_rule_for = pricing_rule.rate_or_discount + + if pricing_rule.margin_type == 'Amount' and pricing_rule.currency == args.currency: + item_details.margin_type = pricing_rule.margin_type + item_details.margin_rate_or_amount = pricing_rule.margin_rate_or_amount + + elif pricing_rule.margin_type == 'Percentage': + item_details.margin_type = pricing_rule.margin_type + item_details.margin_rate_or_amount = pricing_rule.margin_rate_or_amount + else: + item_details.margin_type = None + item_details.margin_rate_or_amount = 0.0 + + if pricing_rule.rate_or_discount == 'Rate': + if pricing_rule.currency == args.currency: + item_details.update({ + "price_list_rate": pricing_rule.rate, + "discount_percentage": 0.0 + }) + + else: + item_details.update({ + "price_list_rate": 0.0, + "discount_percentage": 0.0 + }) else: item_details.discount_percentage = pricing_rule.discount_percentage or args.discount_percentage + elif args.get('pricing_rule'): item_details = remove_pricing_rule_for_item(args.get("pricing_rule"), item_details) @@ -194,8 +211,8 @@ def get_pricing_rule_for_item(args): def remove_pricing_rule_for_item(pricing_rule, item_details): pricing_rule = frappe.db.get_value('Pricing Rule', pricing_rule, - ['price_or_discount', 'margin_type'], as_dict=1) - if pricing_rule and pricing_rule.price_or_discount == 'Discount Percentage': + ['rate_or_discount', 'margin_type'], as_dict=1) + if pricing_rule and pricing_rule.rate_or_discount == 'Discount Percentage': item_details.discount_percentage = 0.0 if pricing_rule and pricing_rule.margin_type in ['Percentage', 'Amount']: @@ -318,8 +335,8 @@ def filter_pricing_rules(args, pricing_rules): break if len(pricing_rules) > 1: - price_or_discount = list(set([d.price_or_discount for d in pricing_rules])) - if len(price_or_discount) == 1 and price_or_discount[0] == "Discount Percentage": + rate_or_discount = list(set([d.rate_or_discount for d in pricing_rules])) + if len(rate_or_discount) == 1 and rate_or_discount[0] == "Discount Percentage": pricing_rules = filter(lambda x: x.for_price_list==args.price_list, pricing_rules) \ or pricing_rules diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 3fa34e279a3..5b4049b782a 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -22,9 +22,10 @@ class TestPricingRule(unittest.TestCase): "title": "_Test Pricing Rule", "apply_on": "Item Code", "item_code": "_Test Item", + "currency": "USD", "selling": 1, - "price_or_discount": "Discount Percentage", - "price": 0, + "rate_or_discount": "Discount Percentage", + "rate": 0, "discount_percentage": 10, "company": "_Test Company" } @@ -102,8 +103,9 @@ class TestPricingRule(unittest.TestCase): "apply_on": "Item Code", "item_code": "_Test FG Item 2", "selling": 1, - "price_or_discount": "Discount Percentage", - "price": 0, + "currency": "USD", + "rate_or_discount": "Discount Percentage", + "rate": 0, "margin_type": "Percentage", "margin_rate_or_amount": 10, "company": "_Test Company" @@ -167,10 +169,11 @@ class TestPricingRule(unittest.TestCase): "doctype": "Pricing Rule", "title": "_Test Pricing Rule 1", "apply_on": "Item Code", + "currency": "USD", "item_code": "_Test Variant Item", "selling": 1, - "price_or_discount": "Discount Percentage", - "price": 0, + "rate_or_discount": "Discount Percentage", + "rate": 0, "discount_percentage": 7.5, "company": "_Test Company" }).insert() @@ -198,9 +201,10 @@ class TestPricingRule(unittest.TestCase): "title": "_Test Pricing Rule 2", "apply_on": "Item Code", "item_code": "Test Variant PRT", + "currency": "USD", "selling": 1, - "price_or_discount": "Discount Percentage", - "price": 0, + "rate_or_discount": "Discount Percentage", + "rate": 0, "discount_percentage": 17.5, "company": "_Test Company" }).insert() @@ -215,10 +219,11 @@ class TestPricingRule(unittest.TestCase): "doctype": "Pricing Rule", "title": "_Test Pricing Rule", "apply_on": "Item Code", + "currency": "USD", "item_code": "_Test Item", "selling": 1, - "price_or_discount": "Discount Percentage", - "price": 0, + "rate_or_discount": "Discount Percentage", + "rate": 0, "min_qty": 5, "max_qty": 7, "discount_percentage": 17.5, @@ -283,12 +288,13 @@ def make_pricing_rule(**args): "item_code": args.item_code or "_Test Item", "applicable_for": args.applicable_for, "selling": args.selling or 0, + "currency": "USD", "buying": args.buying or 0, "min_qty": args.min_qty or 0.0, "max_qty": args.max_qty or 0.0, - "price_or_discount": args.price_or_discount or "Discount Percentage", + "rate_or_discount": args.rate_or_discount or "Discount Percentage", "discount_percentage": args.discount_percentage or 0.0, - "price": args.price or 0.0, + "rate": args.rate or 0.0, "margin_type": args.margin_type, "margin_rate_or_amount": args.margin_rate_or_amount or 0.0 }).insert(ignore_permissions=True) diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js similarity index 88% rename from erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js rename to erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js index 4d34033f6b0..8155e7d799a 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js +++ b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js @@ -1,4 +1,4 @@ -QUnit.module('Pricing Rule"'); +QUnit.module('Pricing Rule'); QUnit.test("test pricing rule", function(assert) { assert.expect(2); @@ -11,6 +11,7 @@ QUnit.test("test pricing rule", function(assert) { {selling:1}, {applicable_for:'Customer'}, {customer:'Test Customer 3'}, + {currency: frappe.defaults.get_default("currency")} {min_qty:1}, {max_qty:20}, {valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, diff --git a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js new file mode 100644 index 00000000000..4a299565029 --- /dev/null +++ b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js @@ -0,0 +1,58 @@ +QUnit.module('Pricing Rule'); + +QUnit.test("test pricing rule with different currency", function(assert) { + assert.expect(3); + let done = assert.async(); + frappe.run_serially([ + () => { + return frappe.tests.make("Pricing Rule", [ + {title: 'Test Pricing Rule 2'}, + {apply_on: 'Item Code'}, + {item_code:'Test Product 4'}, + {selling:1}, + {priority: 1}, + {min_qty:1}, + {max_qty:20}, + {valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, + {margin_type: 'Amount'}, + {margin_rate_or_amount: 20}, + {rate_or_discount: 'Rate'}, + {rate:200}, + {currency:'USD'} + + ]); + }, + () => cur_frm.save(), + () => frappe.timeout(0.3), + () => { + assert.ok(cur_frm.doc.item_code=='Test Product 4'); + }, + + () => { + return frappe.tests.make('Sales Order', [ + {customer: 'Test Customer 1'}, + {currency: 'INR'}, + {items: [ + [ + {'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, + {'qty': 5}, + {'item_code': "Test Product 4"} + ] + ]} + ]); + }, + () => cur_frm.save(), + () => frappe.timeout(0.3), + () => { + // get_item_details + assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 2', "Pricing rule correct"); + // margin not applied because different currency in pricing rule + assert.ok(cur_frm.doc.items[0].margin_type==null, "Margin correct"); + }, + () => frappe.timeout(0.3), + () => frappe.tests.click_button('Submit'), + () => frappe.tests.click_button('Yes'), + () => frappe.timeout(0.3), + () => done() + ]); +}); diff --git a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js new file mode 100644 index 00000000000..601ff6bd3da --- /dev/null +++ b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js @@ -0,0 +1,56 @@ +QUnit.module('Pricing Rule'); + +QUnit.test("test pricing rule with same currency", function(assert) { + assert.expect(4); + let done = assert.async(); + frappe.run_serially([ + () => { + return frappe.tests.make("Pricing Rule", [ + {title: 'Test Pricing Rule 1'}, + {apply_on: 'Item Code'}, + {item_code:'Test Product 4'}, + {selling:1}, + {min_qty:1}, + {max_qty:20}, + {valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, + {rate_or_discount: 'Rate'}, + {rate:200}, + {currency:'USD'} + + ]); + }, + () => cur_frm.save(), + () => frappe.timeout(0.3), + () => { + assert.ok(cur_frm.doc.item_code=='Test Product 4'); + }, + + () => { + return frappe.tests.make('Sales Order', [ + {customer: 'Test Customer 1'}, + {currency: 'USD'}, + {items: [ + [ + {'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)}, + {'qty': 5}, + {'item_code': "Test Product 4"} + ] + ]} + ]); + }, + () => cur_frm.save(), + () => frappe.timeout(0.3), + () => { + // get_item_details + assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 1', "Pricing rule correct"); + assert.ok(cur_frm.doc.items[0].price_list_rate==200, "Item rate correct"); + // get_total + assert.ok(cur_frm.doc.total== 1000, "Total correct"); + }, + () => frappe.timeout(0.3), + () => frappe.tests.click_button('Submit'), + () => frappe.tests.click_button('Yes'), + () => frappe.timeout(0.3), + () => done() + ]); +}); diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 699e1c608f3..008ce6e1e37 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -510,13 +510,22 @@ class calculate_taxes_and_totals(object): self.doc.precision("base_write_off_amount")) def calculate_margin(self, item): + rate_with_margin = 0.0 base_rate_with_margin = 0.0 if item.price_list_rate: if item.pricing_rule and not self.doc.ignore_pricing_rule: pricing_rule = frappe.get_doc('Pricing Rule', item.pricing_rule) - item.margin_type = pricing_rule.margin_type - item.margin_rate_or_amount = pricing_rule.margin_rate_or_amount + + if pricing_rule.margin_type == 'Amount' and pricing_rule.currency == self.doc.currency: + item.margin_type = pricing_rule.margin_type + item.margin_rate_or_amount = pricing_rule.margin_rate_or_amount + elif pricing_rule.margin_type == 'Percentage': + item.margin_type = pricing_rule.margin_type + item.margin_rate_or_amount = pricing_rule.margin_rate_or_amount + else: + item.margin_type = None + item.margin_rate_or_amount = 0.0 if item.margin_type and item.margin_rate_or_amount: margin_value = item.margin_rate_or_amount if item.margin_type == 'Amount' else flt(item.price_list_rate) * flt(item.margin_rate_or_amount) / 100 diff --git a/erpnext/docs/user/manual/en/accounts/pricing-rule.md b/erpnext/docs/user/manual/en/accounts/pricing-rule.md index 6048fea2860..ad68b0f5d67 100644 --- a/erpnext/docs/user/manual/en/accounts/pricing-rule.md +++ b/erpnext/docs/user/manual/en/accounts/pricing-rule.md @@ -21,7 +21,7 @@ Pricing Rule master has two sections: ### 1. Applicability Section: -In this section, conditions are set for the application of Pricing Rule. When transaction meets condition as specified in this section, Price or Discount as specified in the Pricing Rule will be applied. You can set condition on following values. +In this section, conditions are set for the application of Pricing Rule. When transaction meets condition as specified in this section, Rate or Discount as specified in the Pricing Rule will be applied. You can set condition on following values. ####1.1 Applicable On: @@ -43,15 +43,16 @@ Specify minimum and maximum qty of an item when this Pricing Rule should be appl ###2. Application: -Using Price List Rule, you can ultimately define price or %discount to be applied on an item. +Using Price List Rule, you can ultimately define rate or %discount to be applied on an item. Applicable -####2.1 Price +####2.1 Rate -Price or Discount specified in the Pricing Rule will be applied only if above applicability rules are matched with values in the transaction. Price mentioned in Pricing Rule will be given priority over item's Price List rate. +Rate or Discount specified in the Pricing Rule will be applied only if above applicability rules are matched with values in the transaction. Rate mentioned in Pricing Rule will be given priority over item's Price List rate. -Applicable Price +Applicable Rate +>>>>>>> Renamed price to rate in pricing rule #### 2.2 Discount Percentage diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 8f9a3928689..243158cd968 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -494,6 +494,8 @@ erpnext.patches.v10_0.set_default_payment_terms_based_on_company erpnext.patches.v10_0.update_sales_order_link_to_purchase_order erpnext.patches.v10_0.added_extra_gst_custom_field_in_gstr2 #2018-02-13 erpnext.patches.v10_0.item_barcode_childtable_migrate +erpnext.patches.v10_0.rename_price_to_rate_in_pricing_rule +erpnext.patches.v10_0.set_currency_in_pricing_rule erpnext.patches.v10_0.workflow_expense_claim erpnext.patches.v10_0.set_b2c_limit erpnext.patches.v10_0.update_translatable_fields diff --git a/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py b/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py new file mode 100644 index 00000000000..48fa22204d1 --- /dev/null +++ b/erpnext/patches/v10_0/rename_price_to_rate_in_pricing_rule.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals +import frappe +from frappe.model.utils.rename_field import rename_field + +def execute(): + frappe.reload_doc("accounts", "doctype", "pricing_rule") + + try: + rename_field("Pricing Rule", "price_or_discount", "rate_or_discount") + rename_field("Pricing Rule", "price", "rate") + + except Exception as e: + if e.args[0]!=1054: + raise \ No newline at end of file diff --git a/erpnext/patches/v10_0/set_currency_in_pricing_rule.py b/erpnext/patches/v10_0/set_currency_in_pricing_rule.py new file mode 100644 index 00000000000..c01b2af70bc --- /dev/null +++ b/erpnext/patches/v10_0/set_currency_in_pricing_rule.py @@ -0,0 +1,12 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doctype("Pricing Rule") + + currency = frappe.db.get_default("currency") + for doc in frappe.get_all('Pricing Rule', fields = ["company", "name"]): + if doc.company: + currency = frappe.db.get_value("Company", doc.company, "default_currency") + + frappe.db.sql("""update `tabPricing Rule` set currency = %s where name = %s""",(currency, doc.name)) diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt index dfec178ad22..37885f34822 100644 --- a/erpnext/tests/ui/tests.txt +++ b/erpnext/tests/ui/tests.txt @@ -2,7 +2,7 @@ erpnext/tests/ui/make_fixtures.js #long erpnext/accounts/doctype/account/tests/test_account.js erpnext/accounts/doctype/account/tests/test_make_tax_account.js erpnext/accounts/doctype/account/tests/test_account_with_number.js -erpnext/accounts/doctype/pricing_rule/test_pricing_rule.js +erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js @@ -106,3 +106,5 @@ erpnext/selling/doctype/quotation/tests/test_quotation_with_margin.js erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_margin.js erpnext/hr/doctype/payroll_entry/test_set_salary_components.js erpnext/hr/doctype/payroll_entry/test_payroll_entry.js +erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js +erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js \ No newline at end of file