diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 748c24ddea..e5e7e6d6bf 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -2072,6 +2072,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2166,6 +2197,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index be388aac85..a46c4b96c3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -15,6 +15,7 @@ from erpnext.stock import get_warehouse_account_map from erpnext.accounts.general_ledger import make_gl_entries, merge_similar_entries, delete_gl_entries from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt from erpnext.buying.utils import check_for_closed_status +from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -353,6 +354,7 @@ class PurchaseInvoice(BuyingController): self.make_payment_gl_entries(gl_entries) self.make_write_off_gl_entry(gl_entries) + self.make_gle_for_rounding_adjustment(gl_entries) return gl_entries @@ -584,6 +586,21 @@ class PurchaseInvoice(BuyingController): }) ) + def make_gle_for_rounding_adjustment(self, gl_entries): + if self.rounding_adjustment: + round_off_account, round_off_cost_center = \ + get_round_off_account_and_cost_center(self.company) + + gl_entries.append( + self.get_gl_dict({ + "account": round_off_account, + "against": self.supplier, + "debit_in_account_currency": self.rounding_adjustment, + "debit": self.base_rounding_adjustment, + "cost_center": round_off_cost_center, + } + )) + def on_cancel(self): self.check_for_closed_status() diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 2bb0044fbd..e00ba9b07b 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -1670,36 +1670,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "net_total", - "fieldtype": "Currency", - "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": "Net Total", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1731,6 +1701,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "net_total", + "fieldtype": "Currency", + "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": "Net Total", + "length": 0, + "no_copy": 0, + "options": "currency", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2337,6 +2337,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2463,6 +2494,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 065fb94ed2..7a787c4cba 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -20,6 +20,7 @@ from erpnext.accounts.doctype.asset.depreciation \ from erpnext.stock.doctype.batch.batch import set_batch_nos from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, get_delivery_note_serial_no from erpnext.setup.doctype.company.company import update_company_current_month_sales +from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center form_grid_templates = { "items": "templates/form_grid/item_grid.html" @@ -625,6 +626,7 @@ class SalesInvoice(SellingController): self.make_gle_for_change_amount(gl_entries) self.make_write_off_gl_entry(gl_entries) + self.make_gle_for_rounding_adjustment(gl_entries) return gl_entries @@ -784,6 +786,21 @@ class SalesInvoice(SellingController): }, write_off_account_currency) ) + def make_gle_for_rounding_adjustment(self, gl_entries): + if self.rounding_adjustment: + round_off_account, round_off_cost_center = \ + get_round_off_account_and_cost_center(self.company) + + gl_entries.append( + self.get_gl_dict({ + "account": round_off_account, + "against": self.customer, + "credit_in_account_currency": self.rounding_adjustment, + "credit": self.base_rounding_adjustment, + "cost_center": round_off_cost_center, + } + )) + def update_billing_status_in_dn(self, update_modified=True): updated_delivery_notes = [] for d in self.get("items"): diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index db29563631..4dae78c8c4 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -215,12 +215,12 @@ class TestSalesInvoice(unittest.TestCase): si.save() # with inclusive tax and additional discount - self.assertEquals(si.net_total, 4298.24) + self.assertEquals(si.net_total, 4298.25) self.assertEquals(si.grand_total, 4900.00) def test_sales_invoice_discount_amount(self): si = frappe.copy_doc(test_records[3]) - si.discount_amount = 104.95 + si.discount_amount = 104.94 si.append("taxes", { "charge_type": "On Previous Row Amount", "account_head": "_Test Account Service Tax - _TC", @@ -285,7 +285,7 @@ class TestSalesInvoice(unittest.TestCase): "_Test Account Customs Duty - _TC": [125, 116.35, 1585.40], "_Test Account Shipping Charges - _TC": [100, 100, 1685.40], "_Test Account Discount - _TC": [-180.33, -168.54, 1516.86], - "_Test Account Service Tax - _TC": [-18.03, -16.86, 1500] + "_Test Account Service Tax - _TC": [-18.03, -16.85, 1500.01] } for d in si.get("taxes"): @@ -294,10 +294,12 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(si.base_grand_total, 1500) self.assertEquals(si.grand_total, 1500) + self.assertEquals(si.rounding_adjustment, -0.01) def test_discount_amount_gl_entry(self): + frappe.db.set_value("Company", "_Test Company", "round_off_account", "Round Off - _TC") si = frappe.copy_doc(test_records[3]) - si.discount_amount = 104.95 + si.discount_amount = 104.94 si.append("taxes", { "doctype": "Sales Taxes and Charges", "charge_type": "On Previous Row Amount", @@ -327,7 +329,8 @@ class TestSalesInvoice(unittest.TestCase): [test_records[3]["taxes"][5]["account_head"], 0.0, 116.35], [test_records[3]["taxes"][6]["account_head"], 0.0, 100], [test_records[3]["taxes"][7]["account_head"], 168.54, 0.0], - ["_Test Account Service Tax - _TC", 16.86, 0.0] + ["_Test Account Service Tax - _TC", 16.85, 0.0], + ["Round Off - _TC", 0.01, 0.0] ]) for gle in gl_entries: @@ -423,13 +426,12 @@ class TestSalesInvoice(unittest.TestCase): expected_values = { "keys": ["price_list_rate", "discount_percentage", "rate", "amount", "base_price_list_rate", "base_rate", "base_amount", "net_rate", "net_amount"], - "_Test Item Home Desktop 100": [62.5, 0, 62.5, 625.0, 62.5, 62.5, 625.0, 50, 499.98], - "_Test Item Home Desktop 200": [190.66, 0, 190.66, 953.3, 190.66, 190.66, 953.3, 150, 750], + "_Test Item Home Desktop 100": [62.5, 0, 62.5, 625.0, 62.5, 62.5, 625.0, 50, 499.97600115194473], + "_Test Item Home Desktop 200": [190.66, 0, 190.66, 953.3, 190.66, 190.66, 953.3, 150, 749.9968530500239], } # check if children are saved - self.assertEquals(len(si.get("items")), - len(expected_values)-1) + self.assertEquals(len(si.get("items")), len(expected_values)-1) # check if item values are calculated for d in si.get("items"): @@ -437,28 +439,28 @@ class TestSalesInvoice(unittest.TestCase): self.assertEquals(d.get(k), expected_values[d.item_code][i]) # check net total - self.assertEquals(si.base_net_total, 1249.98) + self.assertEquals(si.net_total, 1249.97) self.assertEquals(si.total, 1578.3) # check tax calculation expected_values = { "keys": ["tax_amount", "total"], - "_Test Account Excise Duty - _TC": [140, 1389.98], - "_Test Account Education Cess - _TC": [2.8, 1392.78], - "_Test Account S&H Education Cess - _TC": [1.4, 1394.18], - "_Test Account CST - _TC": [27.88, 1422.06], - "_Test Account VAT - _TC": [156.25, 1578.31], - "_Test Account Customs Duty - _TC": [125, 1703.31], - "_Test Account Shipping Charges - _TC": [100, 1803.31], - "_Test Account Discount - _TC": [-180.33, 1622.98] + "_Test Account Excise Duty - _TC": [140, 1389.97], + "_Test Account Education Cess - _TC": [2.8, 1392.77], + "_Test Account S&H Education Cess - _TC": [1.4, 1394.17], + "_Test Account CST - _TC": [27.88, 1422.05], + "_Test Account VAT - _TC": [156.25, 1578.30], + "_Test Account Customs Duty - _TC": [125, 1703.30], + "_Test Account Shipping Charges - _TC": [100, 1803.30], + "_Test Account Discount - _TC": [-180.33, 1622.97] } for d in si.get("taxes"): for i, k in enumerate(expected_values["keys"]): self.assertEquals(d.get(k), expected_values[d.account_head][i]) - self.assertEquals(si.base_grand_total, 1622.98) - self.assertEquals(si.grand_total, 1622.98) + self.assertEquals(si.base_grand_total, 1622.97) + self.assertEquals(si.grand_total, 1622.97) def test_sales_invoice_calculation_export_currency_with_tax_inclusive_price(self): # prepare @@ -486,7 +488,7 @@ class TestSalesInvoice(unittest.TestCase): "base_rate": 2500, "base_amount": 25000, "net_rate": 40, - "net_amount": 399.98, + "net_amount": 399.9808009215558, "base_net_rate": 2000, "base_net_amount": 19999 }, @@ -500,7 +502,7 @@ class TestSalesInvoice(unittest.TestCase): "base_rate": 7500, "base_amount": 37500, "net_rate": 118.01, - "net_amount": 590.05, + "net_amount": 590.0531205155963, "base_net_rate": 5900.5, "base_net_amount": 29502.5 } @@ -536,8 +538,11 @@ class TestSalesInvoice(unittest.TestCase): for i, k in enumerate(expected_values["keys"]): self.assertEquals(d.get(k), expected_values[d.account_head][i]) - self.assertEquals(si.base_grand_total, 60794.5) - self.assertEquals(si.grand_total, 1215.89) + self.assertEquals(si.base_grand_total, 60795) + self.assertEquals(si.grand_total, 1215.90) + self.assertEquals(si.rounding_adjustment, 0.01) + self.assertEquals(si.base_rounding_adjustment, 0.50) + def test_outstanding(self): w = self.make() @@ -1286,6 +1291,40 @@ class TestSalesInvoice(unittest.TestCase): current_month_sales = frappe.db.get_value("Company", "_Test Company", "total_monthly_sales") self.assertEqual(current_month_sales, existing_current_month_sales) + def test_rounding_adjustment(self): + si = create_sales_invoice(rate=24900, do_not_save=True) + for tax in ["Tax 1", "Tax2"]: + si.append("taxes", { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "description": tax, + "rate": 14, + "cost_center": "_Test Cost Center - _TC", + "included_in_print_rate": 1 + }) + si.save() + + self.assertEqual(si.net_total, 19453.13) + self.assertEqual(si.grand_total, 24900) + self.assertEqual(si.total_taxes_and_charges, 5446.88) + self.assertEqual(si.rounding_adjustment, -0.01) + + expected_values = dict((d[0], d) for d in [ + [si.debit_to, 24900, 0.0], + ["_Test Account Service Tax - _TC", 0.0, 5446.88], + ["Sales - _TC", 0.0, 19453.13], + ["Round Off - _TC", 0.01, 0.0] + ]) + + gl_entries = frappe.db.sql("""select account, debit, credit + from `tabGL Entry` where voucher_type='Sales Invoice' and voucher_no=%s + order by account asc""", si.name, as_dict=1) + + for gle in gl_entries: + self.assertEquals(expected_values[gle.account][0], gle.account) + self.assertEquals(expected_values[gle.account][1], gle.debit) + self.assertEquals(expected_values[gle.account][2], gle.credit) + def create_sales_invoice(**args): si = frappe.new_doc("Sales Invoice") args = frappe._dict(args) diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index ceae61cd86..c575d59ae7 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -136,14 +136,7 @@ def round_off_debit_credit(gl_map): make_round_off_gle(gl_map, debit_credit_diff) def make_round_off_gle(gl_map, debit_credit_diff): - round_off_account, round_off_cost_center = frappe.db.get_value("Company", gl_map[0].company, - ["round_off_account", "round_off_cost_center"]) or [None, None] - if not round_off_account: - frappe.throw(_("Please mention Round Off Account in Company")) - - if not round_off_cost_center: - frappe.throw(_("Please mention Round Off Cost Center in Company")) - + round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(gl_map[0].company) round_off_gle = frappe._dict() for k in ["voucher_type", "voucher_no", "company", @@ -165,6 +158,17 @@ def make_round_off_gle(gl_map, debit_credit_diff): gl_map.append(round_off_gle) +def get_round_off_account_and_cost_center(company): + round_off_account, round_off_cost_center = frappe.db.get_value("Company", company, + ["round_off_account", "round_off_cost_center"]) or [None, None] + if not round_off_account: + frappe.throw(_("Please mention Round Off Account in Company")) + + if not round_off_cost_center: + frappe.throw(_("Please mention Round Off Cost Center in Company")) + + return round_off_account, round_off_cost_center + def delete_gl_entries(gl_entries=None, voucher_type=None, voucher_no=None, adv_adj=False, update_outstanding="Yes"): diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index c4096cc772..a5eaf26e9f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2102,6 +2102,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2227,6 +2258,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index eed0c15cad..f9ff0a6473 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -1676,6 +1676,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1801,6 +1832,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index c627664ea5..e85e56b4d6 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -121,9 +121,10 @@ class calculate_taxes_and_totals(object): cumulated_tax_fraction += tax.tax_fraction_for_current_item if cumulated_tax_fraction and not self.discount_amount_applied and item.qty: - item.net_amount = flt(item.amount / (1 + cumulated_tax_fraction), item.precision("net_amount")) + item.net_amount = flt(item.amount / (1 + cumulated_tax_fraction)) item.net_rate = flt(item.net_amount / item.qty, item.precision("net_rate")) - item.discount_percentage = flt(item.discount_percentage, item.precision("discount_percentage")) + item.discount_percentage = flt(item.discount_percentage, + item.precision("discount_percentage")) self._set_in_company_currency(item, ["net_rate", "net_amount"]) @@ -173,6 +174,7 @@ class calculate_taxes_and_totals(object): self.doc.round_floats_in(self.doc, ["total", "base_total", "net_total", "base_net_total"]) def calculate_taxes(self): + self.doc.rounding_adjustment = 0 # maintain actual tax rate based on idx actual_tax_dict = dict([[tax.idx, flt(tax.tax_amount, tax.precision("tax_amount"))] for tax in self.doc.get("taxes") if tax.charge_type == "Actual"]) @@ -222,7 +224,9 @@ class calculate_taxes_and_totals(object): # adjust Discount Amount loss in last tax iteration if i == (len(self.doc.get("taxes")) - 1) and self.discount_amount_applied \ and self.doc.discount_amount and self.doc.apply_discount_on == "Grand Total": - self.adjust_discount_amount_loss(tax) + self.doc.rounding_adjustment = flt(self.doc.grand_total + - flt(self.doc.discount_amount) - tax.total, + self.doc.precision("rounding_adjustment")) def get_tax_amount_if_for_valuation_or_deduction(self, tax_amount, tax): # if just for valuation, do not add the tax amount in total @@ -277,36 +281,26 @@ class calculate_taxes_and_totals(object): tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount, tax.precision("tax_amount")) - def adjust_discount_amount_loss(self, tax): - discount_amount_loss = self.doc.grand_total - flt(self.doc.discount_amount) - tax.total - tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount + - discount_amount_loss, tax.precision("tax_amount")) - tax.total = flt(tax.total + discount_amount_loss, tax.precision("total")) - - self._set_in_company_currency(tax, ["total", "tax_amount_after_discount_amount"]) - def manipulate_grand_total_for_inclusive_tax(self): # if fully inclusive taxes and diff - if self.doc.get("taxes") and all(cint(t.included_in_print_rate) for t in self.doc.get("taxes")): + if self.doc.get("taxes") and any([cint(t.included_in_print_rate) for t in self.doc.get("taxes")]): last_tax = self.doc.get("taxes")[-1] - diff = self.doc.total - flt(last_tax.total, self.doc.precision("grand_total")) - - if diff and abs(diff) <= (2.0 / 10**last_tax.precision("tax_amount")): - last_tax.tax_amount += diff - last_tax.tax_amount_after_discount_amount += diff - last_tax.total += diff - - self._set_in_company_currency(last_tax, - ["total", "tax_amount", "tax_amount_after_discount_amount"]) + non_inclusive_tax_amount = sum([flt(d.tax_amount_after_discount_amount) + for d in self.doc.get("taxes") if not d.included_in_print_rate]) + diff = self.doc.total + non_inclusive_tax_amount \ + - flt(last_tax.total, last_tax.precision("total")) + if diff and abs(diff) <= (5.0 / 10**last_tax.precision("tax_amount")): + self.doc.rounding_adjustment = flt(flt(self.doc.rounding_adjustment) + + flt(diff), self.doc.precision("rounding_adjustment")) def calculate_totals(self): - self.doc.grand_total = flt(self.doc.get("taxes")[-1].total - if self.doc.get("taxes") else self.doc.net_total) + self.doc.grand_total = flt(self.doc.get("taxes")[-1].total) + flt(self.doc.rounding_adjustment) \ + if self.doc.get("taxes") else flt(self.doc.net_total) - self.doc.total_taxes_and_charges = flt(self.doc.grand_total - self.doc.net_total, - self.doc.precision("total_taxes_and_charges")) + self.doc.total_taxes_and_charges = flt(self.doc.grand_total - self.doc.net_total + - flt(self.doc.rounding_adjustment), self.doc.precision("total_taxes_and_charges")) - self._set_in_company_currency(self.doc, ["total_taxes_and_charges"]) + self._set_in_company_currency(self.doc, ["total_taxes_and_charges", "rounding_adjustment"]) if self.doc.doctype in ["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"]: self.doc.base_grand_total = flt(self.doc.grand_total * self.doc.conversion_rate) \ @@ -326,13 +320,22 @@ class calculate_taxes_and_totals(object): if (self.doc.taxes_and_charges_added or self.doc.taxes_and_charges_deducted) \ else self.doc.base_net_total - self._set_in_company_currency(self.doc, ["taxes_and_charges_added", "taxes_and_charges_deducted"]) + self._set_in_company_currency(self.doc, + ["taxes_and_charges_added", "taxes_and_charges_deducted"]) self.doc.round_floats_in(self.doc, ["grand_total", "base_grand_total"]) + self.set_rounded_total() + + def set_rounded_total(self): + if frappe.db.get_single_value("Global Defaults", "disable_rounded_total"): + self.doc.rounded_total = self.doc.base_rounded_total = 0 + return + if self.doc.meta.get_field("rounded_total"): self.doc.rounded_total = round_based_on_smallest_currency_fraction(self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total")) + if self.doc.meta.get_field("base_rounded_total"): company_currency = erpnext.get_company_currency(self.doc.company) @@ -525,7 +528,7 @@ def get_itemised_tax_breakup_html(doc): for tax in doc.taxes: if getattr(tax, "category", None) and tax.category=="Valuation": continue - if tax.description not in tax_accounts: + if tax.description not in tax_accounts and tax.tax_amount_after_discount_amount: tax_accounts.append(tax.description) headers = get_itemised_tax_breakup_header(doc.doctype + " Item", tax_accounts) @@ -565,26 +568,21 @@ def get_itemised_tax(taxes): if getattr(tax, "category", None) and tax.category=="Valuation": continue - tax_amount_precision = tax.precision("tax_amount") - tax_rate_precision = tax.precision("rate") - item_tax_map = json.loads(tax.item_wise_tax_detail) if tax.item_wise_tax_detail else {} - - for item_code, tax_data in item_tax_map.items(): - itemised_tax.setdefault(item_code, frappe._dict()) + if item_tax_map: + for item_code, tax_data in item_tax_map.items(): + itemised_tax.setdefault(item_code, frappe._dict()) - if isinstance(tax_data, list): - precision = tax_amount_precision if tax.charge_type == "Actual" else tax_rate_precision - - itemised_tax[item_code][tax.description] = frappe._dict(dict( - tax_rate=flt(tax_data[0]), - tax_amount=flt(tax_data[1]) - )) - else: - itemised_tax[item_code][tax.description] = frappe._dict(dict( - tax_rate=flt(tax_data), - tax_amount=0.0 - )) + if isinstance(tax_data, list): + itemised_tax[item_code][tax.description] = frappe._dict(dict( + tax_rate=flt(tax_data[0]), + tax_amount=flt(tax_data[1]) + )) + else: + itemised_tax[item_code][tax.description] = frappe._dict(dict( + tax_rate=flt(tax_data), + tax_amount=0.0 + )) return itemised_tax diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index d042bb7220..e45c35e944 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -155,7 +155,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ }); if(cumulated_tax_fraction && !me.discount_amount_applied) { - item.net_amount = flt(item.amount / (1 + cumulated_tax_fraction), precision("net_amount", item)); + item.net_amount = flt(item.amount / (1 + cumulated_tax_fraction)); item.net_rate = flt(item.net_amount / item.qty, precision("net_rate", item)); me.set_in_company_currency(item, ["net_rate", "net_amount"]); @@ -211,6 +211,7 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ calculate_taxes: function() { var me = this; + this.frm.doc.rounding_adjustment = 0; var actual_tax_dict = {}; // maintain actual tax rate based on idx @@ -277,8 +278,10 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ // adjust Discount Amount loss in last tax iteration if ((i == me.frm.doc["taxes"].length - 1) && me.discount_amount_applied - && me.frm.doc.apply_discount_on == "Grand Total" && me.frm.doc.discount_amount) - me.adjust_discount_amount_loss(tax); + && me.frm.doc.apply_discount_on == "Grand Total" && me.frm.doc.discount_amount) { + me.frm.doc.rounding_adjustment = flt(me.frm.doc.grand_total - + flt(me.frm.doc.discount_amount) - tax.total, precision("rounding_adjustment")); + } } }); }); @@ -339,45 +342,41 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount, precision("tax_amount", tax)); }, - adjust_discount_amount_loss: function(tax) { - var discount_amount_loss = this.frm.doc.grand_total - flt(this.frm.doc.discount_amount) - tax.total; - tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount + - discount_amount_loss, precision("tax_amount", tax)); - tax.total = flt(tax.total + discount_amount_loss, precision("total", tax)); - - this.set_in_company_currency(tax, ["total", "tax_amount_after_discount_amount"]); - }, - manipulate_grand_total_for_inclusive_tax: function() { var me = this; // if fully inclusive taxes and diff if (this.frm.doc["taxes"] && this.frm.doc["taxes"].length) { - var all_inclusive = frappe.utils.all(this.frm.doc["taxes"].map(function(d) { - return cint(d.included_in_print_rate); - })); - - if (all_inclusive) { + var any_inclusive_tax = false; + $.each(this.frm.doc.taxes || [], function(i, d) { + if(cint(d.included_in_print_rate)) any_inclusive_tax = true; + }); + if (any_inclusive_tax) { var last_tax = me.frm.doc["taxes"].slice(-1)[0]; + var non_inclusive_tax_amount = frappe.utils.sum($.map(this.frm.doc.taxes || [], + function(d) { + if(!d.included_in_print_rate) { + return flt(d.tax_amount_after_discount_amount); + } + } + )); + var diff = me.frm.doc.total + non_inclusive_tax_amount + - flt(last_tax.total, precision("grand_total")); - var diff = me.frm.doc.total - flt(last_tax.total, precision("grand_total")); - - if ( diff && Math.abs(diff) <= (2.0 / Math.pow(10, precision("tax_amount", last_tax))) ) { - last_tax.tax_amount += diff; - last_tax.tax_amount_after_discount += diff; - last_tax.total += diff; - - this.set_in_company_currency(last_tax, - ["total", "tax_amount", "tax_amount_after_discount_amount"]); + if ( diff && Math.abs(diff) <= (5.0 / Math.pow(10, precision("tax_amount", last_tax))) ) { + this.frm.doc.rounding_adjustment = flt(flt(this.frm.doc.rounding_adjustment) + diff, + precision("rounding_adjustment")); } } } }, calculate_totals: function() { - // Changing sequence can cause roundiing issue and on-screen discrepency + // Changing sequence can cause rounding_adjustmentng issue and on-screen discrepency var me = this; var tax_count = this.frm.doc["taxes"] ? this.frm.doc["taxes"].length : 0; - this.frm.doc.grand_total = flt(tax_count ? this.frm.doc["taxes"][tax_count - 1].total : this.frm.doc.net_total); + this.frm.doc.grand_total = flt(tax_count + ? this.frm.doc["taxes"][tax_count - 1].total + flt(this.frm.doc.rounding_adjustment) + : this.frm.doc.net_total); if(in_list(["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"], this.frm.doc.doctype)) { this.frm.doc.base_grand_total = (this.frm.doc.total_taxes_and_charges) ? @@ -396,24 +395,30 @@ erpnext.taxes_and_totals = erpnext.payments.extend({ } }); - frappe.model.round_floats_in(this.frm.doc, ["taxes_and_charges_added", "taxes_and_charges_deducted"]); + frappe.model.round_floats_in(this.frm.doc, + ["taxes_and_charges_added", "taxes_and_charges_deducted"]); } this.frm.doc.base_grand_total = flt((this.frm.doc.taxes_and_charges_added || this.frm.doc.taxes_and_charges_deducted) ? flt(this.frm.doc.grand_total * this.frm.doc.conversion_rate) : this.frm.doc.base_net_total); - this.set_in_company_currency(this.frm.doc, ["taxes_and_charges_added", "taxes_and_charges_deducted"]); + this.set_in_company_currency(this.frm.doc, + ["taxes_and_charges_added", "taxes_and_charges_deducted"]); } - this.frm.doc.total_taxes_and_charges = flt(this.frm.doc.grand_total - this.frm.doc.net_total, - precision("total_taxes_and_charges")); + this.frm.doc.total_taxes_and_charges = flt(this.frm.doc.grand_total - this.frm.doc.net_total + - flt(this.frm.doc.rounding_adjustment), precision("total_taxes_and_charges")); - this.set_in_company_currency(this.frm.doc, ["total_taxes_and_charges"]); + this.set_in_company_currency(this.frm.doc, ["total_taxes_and_charges", "rounding_adjustment"]); // Round grand total as per precision frappe.model.round_floats_in(this.frm.doc, ["grand_total", "base_grand_total"]); // rounded totals + this.set_rounded_total() + }, + + set_rounded_total: function() { if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total", this.frm.doc.name)) { this.frm.doc.rounded_total = round_based_on_smallest_currency_fraction(this.frm.doc.grand_total, this.frm.doc.currency, precision("rounded_total")); diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index f5bcf1ce41..a5ef15e60b 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -660,30 +660,32 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ "base_discount_amount", "base_grand_total", "base_rounded_total", "base_in_words", "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "total_amount_to_pay", "base_paid_amount", "base_write_off_amount", "base_change_amount", "base_operating_cost", - "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost" - ], company_currency); + "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost", + "base_rounding_adjustment"], company_currency); this.frm.set_currency_labels(["total", "net_total", "total_taxes_and_charges", "discount_amount", "grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted", - "rounded_total", "in_words", "paid_amount", "write_off_amount", "operating_cost", "scrap_material_cost", - "raw_material_cost", "total_cost"], this.frm.doc.currency); + "rounded_total", "in_words", "paid_amount", "write_off_amount", "operating_cost", + "scrap_material_cost", "rounding_adjustment", "raw_material_cost", + "total_cost"], this.frm.doc.currency); - this.frm.set_currency_labels(["outstanding_amount", "total_advance"], this.frm.doc.party_account_currency); + this.frm.set_currency_labels(["outstanding_amount", "total_advance"], + this.frm.doc.party_account_currency); cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency - + " = [?] " + company_currency) + + " = [?] " + company_currency); if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) { - cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency - + " = [?] " + company_currency) + cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + + this.frm.doc.price_list_currency + " = [?] " + company_currency); } // toggle fields - this.frm.toggle_display(["conversion_rate", "base_total", "base_net_total", "base_total_taxes_and_charges", - "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", + this.frm.toggle_display(["conversion_rate", "base_total", "base_net_total", + "base_total_taxes_and_charges", "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "base_grand_total", "base_rounded_total", "base_in_words", "base_discount_amount", - "base_paid_amount", "base_write_off_amount", "base_operating_cost", - "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost"], + "base_paid_amount", "base_write_off_amount", "base_operating_cost", "base_raw_material_cost", + "base_total_cost", "base_scrap_material_cost", "base_rounding_adjustment"], this.frm.doc.currency != company_currency); this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"], diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index ab879a1b05..ade37b10f0 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -1895,6 +1895,37 @@ "unique": 0, "width": "200px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2024,6 +2055,37 @@ "unique": 0, "width": "200px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 3b8eb68592..ffa6c75464 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -1980,6 +1980,37 @@ "unique": 0, "width": "150px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2109,6 +2140,38 @@ "unique": 0, "width": "150px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "", + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 980f79b2a2..cb4275d3e2 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -2109,6 +2109,37 @@ "unique": 0, "width": "150px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2240,6 +2271,37 @@ "unique": 0, "width": "150px" }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 7140dbd8bd..3acdeeecc9 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -1939,6 +1939,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "base_rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment (Company Currency)", + "length": 0, + "no_copy": 1, + "options": "Company:company:default_currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -2064,6 +2095,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "rounding_adjustment", + "fieldtype": "Currency", + "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": "Rounding Adjustment", + "length": 0, + "no_copy": 1, + "options": "currency", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -3060,7 +3122,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-08-06 19:33:59.822251", + "modified": "2017-08-29 11:02:24.831340", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt",