Merge branch 'Item-Tax-Template' of https://github.com/SaiFi0102/erpnext.git into Item-Tax-Template-V12
# Conflicts:
# erpnext/patches.txt
# erpnext/stock/doctype/item/item.json
diff --git a/erpnext/accounts/custom/address.json b/erpnext/accounts/custom/address.json
new file mode 100644
index 0000000..08f972d
--- /dev/null
+++ b/erpnext/accounts/custom/address.json
@@ -0,0 +1,58 @@
+{
+ "custom_fields": [
+ {
+ "_assign": null,
+ "_comments": null,
+ "_liked_by": null,
+ "_user_tags": null,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "collapsible_depends_on": null,
+ "columns": 0,
+ "creation": "2018-12-28 22:29:21.828090",
+ "default": null,
+ "depends_on": null,
+ "description": null,
+ "docstatus": 0,
+ "dt": "Address",
+ "fetch_from": null,
+ "fieldname": "tax_category",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "idx": 14,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "insert_after": "fax",
+ "label": "Tax Category",
+ "modified": "2018-12-28 22:29:21.828090",
+ "modified_by": "Administrator",
+ "name": "Address-tax_category",
+ "no_copy": 0,
+ "options": "Tax Category",
+ "owner": "Administrator",
+ "parent": null,
+ "parentfield": null,
+ "parenttype": null,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "print_width": null,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "translatable": 0,
+ "unique": 0,
+ "width": null
+ }
+ ],
+ "custom_perms": [],
+ "doctype": "Address",
+ "property_setters": [],
+ "sync_on_migrate": 1
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
index 1fc2265..945d5d4 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
@@ -119,6 +119,41 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "Billing Address",
+ "description": "Address used to determine Tax Category in transactions.",
+ "fieldname": "determine_address_tax_category_from",
+ "fieldtype": "Select",
+ "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": "Determine Address Tax Category From",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Billing Address\nShipping Address",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_4",
"fieldtype": "Column Break",
"hidden": 0,
@@ -345,6 +380,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "default": "1",
+ "fieldname": "add_taxes_from_item_tax_template",
+ "fieldtype": "Check",
+ "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": "Automatically Add Taxes and Charges from Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "print_settings",
"fieldtype": "Section Break",
"hidden": 0,
@@ -642,7 +710,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2019-01-07 16:52:03.869199",
+ "modified": "2019-01-07 00:42:34.510150",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",
@@ -714,4 +782,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
index 5446749..3222aeb 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
@@ -15,6 +15,9 @@
frappe.clear_cache()
def validate(self):
+ for f in ["add_taxes_from_item_tax_template"]:
+ frappe.db.set_default(f, self.get(f, ""))
+
self.validate_stale_days()
self.enable_payment_schedule_in_print()
self.enable_fields_for_cost_center_settings()
diff --git a/erpnext/accounts/doctype/item_tax_template/__init__.py b/erpnext/accounts/doctype/item_tax_template/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/__init__.py
diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.js b/erpnext/accounts/doctype/item_tax_template/item_tax_template.js
new file mode 100644
index 0000000..42abdb8
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.js
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Item Tax Template', {
+ setup: function(frm) {
+ frm.set_query("tax_type", "taxes", function(doc) {
+ return {
+ filters: [
+ ['Account', 'is_group', '=', 0],
+ ['Account', 'account_type', 'in', ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']]
+ ]
+ }
+ });
+ }
+});
diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.json b/erpnext/accounts/doctype/item_tax_template/item_tax_template.json
new file mode 100644
index 0000000..f713cfc
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.json
@@ -0,0 +1,168 @@
+{
+ "allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 1,
+ "allow_rename": 1,
+ "autoname": "field:title",
+ "beta": 0,
+ "creation": "2018-11-22 22:45:00.370913",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "title",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 1,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Title",
+ "length": 0,
+ "no_copy": 1,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "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,
+ "translatable": 0,
+ "unique": 1
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "taxes",
+ "fieldtype": "Table",
+ "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": "Tax Rates",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template Detail",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ }
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "idx": 0,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2018-12-21 23:51:16.328340",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Item Tax Template",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 0
+ }
+ ],
+ "quick_entry": 0,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "search_fields": "",
+ "show_name_in_global_search": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py
new file mode 100644
index 0000000..e77481d
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+from frappe import _
+
+class ItemTaxTemplate(Document):
+ def validate(self):
+ self.validate_tax_accounts()
+
+ def validate_tax_accounts(self):
+ """Check whether Tax Rate is not entered twice for same Tax Type"""
+ check_list = []
+ for d in self.get('taxes'):
+ if d.tax_type:
+ account_type = frappe.db.get_value("Account", d.tax_type, "account_type")
+
+ if account_type not in ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']:
+ frappe.throw(
+ _("Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable").format(
+ d.idx))
+ else:
+ if d.tax_type in check_list:
+ frappe.throw(_("{0} entered twice in Item Tax").format(d.tax_type))
+ else:
+ check_list.append(d.tax_type)
diff --git a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.js b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.js
new file mode 100644
index 0000000..6893499
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.js
@@ -0,0 +1,23 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Item Tax Template", function (assert) {
+ let done = assert.async();
+
+ // number of asserts
+ assert.expect(1);
+
+ frappe.run_serially([
+ // insert a new Item Tax Template
+ () => frappe.tests.make('Item Tax Template', [
+ // values to be set
+ {key: 'value'}
+ ]),
+ () => {
+ assert.equal(cur_frm.doc.key, 'value');
+ },
+ () => done()
+ ]);
+
+});
diff --git a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py
new file mode 100644
index 0000000..acf1e44
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+class TestItemTaxTemplate(unittest.TestCase):
+ pass
diff --git a/erpnext/accounts/doctype/item_tax_template/test_records.json b/erpnext/accounts/doctype/item_tax_template/test_records.json
new file mode 100644
index 0000000..db540e8
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template/test_records.json
@@ -0,0 +1,74 @@
+[
+ {
+ "doctype": "Item Tax Template",
+ "title": "_Test Account Excise Duty @ 10",
+ "taxes": [
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 10,
+ "tax_type": "_Test Account Excise Duty - _TC"
+ }
+ ]
+ },
+ {
+ "doctype": "Item Tax Template",
+ "title": "_Test Account Excise Duty @ 12",
+ "taxes": [
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 12,
+ "tax_type": "_Test Account Excise Duty - _TC"
+ }
+ ]
+ },
+ {
+ "doctype": "Item Tax Template",
+ "title": "_Test Account Excise Duty @ 15",
+ "taxes": [
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 15,
+ "tax_type": "_Test Account Excise Duty - _TC"
+ }
+ ]
+ },
+ {
+ "doctype": "Item Tax Template",
+ "title": "_Test Account Excise Duty @ 20",
+ "taxes": [
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 20,
+ "tax_type": "_Test Account Excise Duty - _TC"
+ }
+ ]
+ },
+ {
+ "doctype": "Item Tax Template",
+ "title": "_Test Item Tax Template 1",
+ "taxes": [
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 5,
+ "tax_type": "_Test Account Excise Duty - _TC"
+ },
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 10,
+ "tax_type": "_Test Account Education Cess - _TC"
+ },
+ {
+ "doctype": "Item Tax Template Detail",
+ "parentfield": "taxes",
+ "tax_rate": 15,
+ "tax_type": "_Test Account S&H Education Cess - _TC"
+ }
+ ]
+ }
+]
diff --git a/erpnext/accounts/doctype/item_tax_template_detail/__init__.py b/erpnext/accounts/doctype/item_tax_template_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template_detail/__init__.py
diff --git a/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json
new file mode 100644
index 0000000..fa40222
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json
@@ -0,0 +1,108 @@
+{
+ "allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "beta": 0,
+ "creation": "2018-11-22 23:47:02.804568",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "tax_type",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Tax",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Account",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "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,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "tax_rate",
+ "fieldtype": "Float",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 1,
+ "in_standard_filter": 0,
+ "label": "Tax Rate",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ }
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "idx": 0,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 1,
+ "max_attachments": 0,
+ "modified": "2018-12-21 23:51:39.445198",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Item Tax Template Detail",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "quick_entry": 1,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py
new file mode 100644
index 0000000..d51bed0
--- /dev/null
+++ b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class ItemTaxTemplateDetail(Document):
+ pass
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
old mode 100755
new mode 100644
index 41b3c13..97c011f
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
@@ -2185,7 +2185,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -2194,13 +2194,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "purchase_other_charges",
- "oldfieldtype": "Link",
- "options": "Purchase Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -2314,6 +2313,40 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "taxes_and_charges",
+ "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": "Purchase Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "purchase_other_charges",
+ "oldfieldtype": "Link",
+ "options": "Purchase Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -4726,7 +4759,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:51:59.800081",
+ "modified": "2018-12-27 02:07:04.299399",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",
@@ -4841,4 +4874,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index bfdf451..d28dc93 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -206,6 +206,10 @@
stock_not_billed_account = self.get_company_default("stock_received_but_not_billed")
stock_items = self.get_stock_items()
+ asset_items = [d.is_fixed_asset for d in self.items if d.is_fixed_asset]
+ if len(asset_items) > 0:
+ asset_received_but_not_billed = self.get_company_default("asset_received_but_not_billed")
+
if self.update_stock:
self.validate_item_code()
self.validate_warehouse()
@@ -226,7 +230,8 @@
item.expense_account = warehouse_account[item.warehouse]["account"]
else:
item.expense_account = stock_not_billed_account
-
+ elif item.is_fixed_asset and d.pr_detail:
+ item.expense_account = asset_received_but_not_billed
elif not item.expense_account and for_validate:
throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
@@ -360,7 +365,10 @@
def get_gl_entries(self, warehouse_account=None):
self.auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company)
- self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed")
+ if self.auto_accounting_for_stock:
+ self.stock_received_but_not_billed = self.get_company_default("stock_received_but_not_billed")
+ else:
+ self.stock_received_but_not_billed = None
self.expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
self.negative_expense_to_be_booked = 0.0
gl_entries = []
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_records.json b/erpnext/accounts/doctype/purchase_invoice/test_records.json
index 7feca23..171927c 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_records.json
+++ b/erpnext/accounts/doctype/purchase_invoice/test_records.json
@@ -18,7 +18,7 @@
"expense_account": "_Test Account Cost for Goods Sold - _TC",
"item_code": "_Test Item Home Desktop 100",
"item_name": "_Test Item Home Desktop 100",
- "item_tax_rate": "{\"_Test Account Excise Duty - _TC\": 10}",
+ "item_tax_template": "_Test Account Excise Duty @ 10",
"parentfield": "items",
"qty": 10,
"rate": 50,
diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
index c2309b2..7c7a9a3 100644
--- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
+++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
@@ -1638,6 +1638,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "col_break5",
"fieldtype": "Column Break",
"hidden": 0,
@@ -2626,7 +2659,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:52:00.749414",
+ "modified": "2018-11-23 16:23:49.360332",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",
@@ -2641,4 +2674,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 13ba053..5964e95 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -2274,7 +2274,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -2283,13 +2283,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "charge",
- "oldfieldtype": "Link",
- "options": "Sales Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -2401,6 +2400,40 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "taxes_and_charges",
+ "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": "Sales Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "charge",
+ "oldfieldtype": "Link",
+ "options": "Sales Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -5644,7 +5677,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:51:53.914523",
+ "modified": "2018-12-27 02:03:14.009762",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
@@ -5740,4 +5773,4 @@
"track_changes": 1,
"track_seen": 1,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/sales_invoice/test_records.json b/erpnext/accounts/doctype/sales_invoice/test_records.json
index 0b7b76d..9c8de7d 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_records.json
+++ b/erpnext/accounts/doctype/sales_invoice/test_records.json
@@ -142,7 +142,7 @@
"expense_account": "_Test Account Cost for Goods Sold - _TC",
"item_code": "_Test Item Home Desktop 100",
"item_name": "_Test Item Home Desktop 100",
- "item_tax_rate": "{\"_Test Account Excise Duty - _TC\": 10}",
+ "item_tax_template": "_Test Account Excise Duty @ 10",
"parentfield": "items",
"price_list_rate": 50,
"qty": 10,
@@ -269,7 +269,7 @@
"expense_account": "_Test Account Cost for Goods Sold - _TC",
"item_code": "_Test Item Home Desktop 100",
"item_name": "_Test Item Home Desktop 100",
- "item_tax_rate": "{\"_Test Account Excise Duty - _TC\": 10}",
+ "item_tax_template": "_Test Account Excise Duty @ 10",
"parentfield": "items",
"price_list_rate": 62.5,
"qty": 10,
diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
index d6ce115..42e6e7a 100644
--- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
+++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
@@ -1549,6 +1549,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"default": ":Company",
"fieldname": "cost_center",
"fieldtype": "Link",
@@ -2766,7 +2799,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:55.018091",
+ "modified": "2018-11-23 17:23:38.327395",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",
@@ -2781,4 +2814,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/tax_category/__init__.py b/erpnext/accounts/doctype/tax_category/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/__init__.py
diff --git a/erpnext/accounts/doctype/tax_category/tax_category.js b/erpnext/accounts/doctype/tax_category/tax_category.js
new file mode 100644
index 0000000..4b63edb
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/tax_category.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Tax Category', {
+ refresh: function(frm) {
+
+ }
+});
diff --git a/erpnext/accounts/doctype/tax_category/tax_category.json b/erpnext/accounts/doctype/tax_category/tax_category.json
new file mode 100644
index 0000000..3556e12
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/tax_category.json
@@ -0,0 +1,134 @@
+{
+ "allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "autoname": "field:title",
+ "beta": 0,
+ "creation": "2018-11-22 23:38:39.668804",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "title",
+ "fieldtype": "Data",
+ "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": "Title",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 1
+ }
+ ],
+ "has_web_view": 0,
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "idx": 0,
+ "image_view": 0,
+ "in_create": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2018-11-22 23:38:39.668804",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Tax Category",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "System Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 1,
+ "export": 1,
+ "if_owner": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "share": 1,
+ "submit": 0,
+ "write": 0
+ }
+ ],
+ "quick_entry": 1,
+ "read_only": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1,
+ "track_seen": 0,
+ "track_views": 0
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/tax_category/tax_category.py b/erpnext/accounts/doctype/tax_category/tax_category.py
new file mode 100644
index 0000000..2870e32
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/tax_category.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class TaxCategory(Document):
+ pass
diff --git a/erpnext/accounts/doctype/tax_category/test_records.json b/erpnext/accounts/doctype/tax_category/test_records.json
new file mode 100644
index 0000000..056b2f3
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/test_records.json
@@ -0,0 +1,10 @@
+[
+ {
+ "doctype": "Tax Category",
+ "title": "_Test Tax Category 1"
+ },
+ {
+ "doctype": "Tax Category",
+ "title": "_Test Tax Category 2"
+ }
+]
diff --git a/erpnext/accounts/doctype/tax_category/test_tax_category.js b/erpnext/accounts/doctype/tax_category/test_tax_category.js
new file mode 100644
index 0000000..5142456
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/test_tax_category.js
@@ -0,0 +1,23 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Tax Category", function (assert) {
+ let done = assert.async();
+
+ // number of asserts
+ assert.expect(1);
+
+ frappe.run_serially([
+ // insert a new Tax Category
+ () => frappe.tests.make('Tax Category', [
+ // values to be set
+ {key: 'value'}
+ ]),
+ () => {
+ assert.equal(cur_frm.doc.key, 'value');
+ },
+ () => done()
+ ]);
+
+});
diff --git a/erpnext/accounts/doctype/tax_category/test_tax_category.py b/erpnext/accounts/doctype/tax_category/test_tax_category.py
new file mode 100644
index 0000000..548d008
--- /dev/null
+++ b/erpnext/accounts/doctype/tax_category/test_tax_category.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+
+class TestTaxCategory(unittest.TestCase):
+ pass
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.json b/erpnext/accounts/doctype/tax_rule/tax_rule.json
index 6de782f..ef15538 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.json
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.json
@@ -1,5 +1,6 @@
{
"allow_copy": 0,
+ "allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 0,
@@ -478,6 +479,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "tax_category",
+ "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": "Tax Category",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Tax Category",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_2",
"fieldtype": "Column Break",
"hidden": 0,
@@ -1030,7 +1064,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-08-21 16:15:51.095450",
+ "modified": "2018-12-27 01:22:17.721636",
"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 57b5ddb..77f8a0c 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py
@@ -68,6 +68,7 @@
"shipping_state": self.shipping_state,
"shipping_zipcode": self.shipping_zipcode,
"shipping_country": self.shipping_country,
+ "tax_category": self.tax_category,
"company": self.company
}
@@ -144,10 +145,14 @@
conditions = ["""(from_date is null or from_date <= '{0}')
and (to_date is null or to_date >= '{0}')""".format(posting_date)]
+ conditions.append("ifnull(tax_category, '') = '{0}'".format(frappe.db.escape(cstr(args.get("tax_category")))))
+ if 'tax_category' in args.keys():
+ del args['tax_category']
+
for key, value in iteritems(args):
if key=="use_for_shopping_cart":
conditions.append("use_for_shopping_cart = {0}".format(1 if value else 0))
- if key == 'customer_group':
+ elif key == 'customer_group':
if not value: value = get_root_of("Customer Group")
customer_group_condition = get_customer_group_condition(value)
conditions.append("ifnull({0}, '') in ('', {1})".format(key, customer_group_condition))
diff --git a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
index d6f9a47..bbbcc7f 100644
--- a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py
@@ -74,6 +74,26 @@
self.assertEqual(get_tax_template("2015-01-01", {"customer":"_Test Customer 2"}),
"_Test Sales Taxes and Charges Template 2 - _TC")
+ def test_select_tax_rule_based_on_tax_category(self):
+ make_tax_rule(customer="_Test Customer", tax_category="_Test Tax Category 1",
+ sales_tax_template="_Test Sales Taxes and Charges Template 1 - _TC", save=1)
+
+ make_tax_rule(customer="_Test Customer", tax_category="_Test Tax Category 2",
+ sales_tax_template="_Test Sales Taxes and Charges Template 2 - _TC", save=1)
+
+ self.assertFalse(get_tax_template("2015-01-01", {"customer": "_Test Customer"}))
+
+ self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 1"}),
+ "_Test Sales Taxes and Charges Template 1 - _TC")
+ self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer", "tax_category": "_Test Tax Category 2"}),
+ "_Test Sales Taxes and Charges Template 2 - _TC")
+
+ make_tax_rule(customer="_Test Customer", tax_category="",
+ sales_tax_template="_Test Sales Taxes and Charges Template - _TC", save=1)
+
+ self.assertEqual(get_tax_template("2015-01-01", {"customer": "_Test Customer"}),
+ "_Test Sales Taxes and Charges Template - _TC")
+
def test_select_tax_rule_based_on_better_match(self):
make_tax_rule(customer= "_Test Customer", billing_city = "Test City", billing_state = "Test State",
sales_tax_template = "_Test Sales Taxes and Charges Template - _TC", save=1)
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 9e030cb..b200c34 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -8,7 +8,7 @@
from frappe.core.doctype.user_permission.user_permission import get_permitted_documents
from frappe.model.utils import get_fetch_values
from frappe.utils import (add_days, getdate, formatdate, date_diff,
- add_years, get_timestamp, nowdate, flt, add_months, get_last_day)
+ add_years, get_timestamp, nowdate, flt, cstr, add_months, get_last_day)
from frappe.contacts.doctype.address.address import (get_address_display,
get_default_address, get_company_address)
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
@@ -16,7 +16,7 @@
from erpnext.accounts.utils import get_fiscal_year
from erpnext import get_default_currency, get_company_currency
-from six import iteritems
+from six import iteritems, string_types
class DuplicatePartyAccountError(frappe.ValidationError): pass
@@ -44,14 +44,16 @@
party = frappe.get_doc(party_type, party)
currency = party.default_currency if party.default_currency else get_company_currency(company)
- out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_group)
- out["payment_terms_template"] = get_pyt_term_template(party.name, party_type, company)
- set_address_details(out, party, party_type, doctype, company, party_address, shipping_address)
+ party_address, shipping_address = set_address_details(out, party, party_type, doctype, company, party_address, shipping_address)
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.customer_group, out.supplier_type)
+ out["tax_category"] = get_address_tax_category(party.get("tax_category"),
+ party_address, shipping_address if party_type != "Supplier" else party_address)
+ out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company,
+ customer_group=out.customer_group, supplier_group=out.supplier_group, tax_category=out.tax_category,
+ billing_address=party_address, shipping_address=shipping_address)
if fetch_payment_terms_template:
out["payment_terms_template"] = get_pyt_term_template(party.name, party_type, company)
@@ -101,6 +103,8 @@
out.update(get_fetch_values(doctype, 'shipping_address', out.shipping_address))
get_regional_address_details(out, doctype, company)
+ return out.get(billing_address_field), out.shipping_address_name
+
@erpnext.allow_regional
def get_regional_address_details(out, doctype, company):
pass
@@ -351,7 +355,19 @@
.format(formatdate(default_due_date)))
@frappe.whitelist()
-def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_group=None,
+def get_address_tax_category(tax_category, billing_address=None, shipping_address=None):
+ addr_tax_category_from = frappe.db.get_single_value("Accounts Settings", "determine_address_tax_category_from")
+ if addr_tax_category_from == "Shipping Address":
+ if shipping_address:
+ tax_category = frappe.db.get_value("Address", shipping_address, "tax_category") or tax_category
+ else:
+ if billing_address:
+ tax_category = frappe.db.get_value("Address", billing_address, "tax_category") or tax_category
+
+ return cstr(tax_category)
+
+@frappe.whitelist()
+def set_taxes(party, party_type, posting_date, company, customer_group=None, supplier_group=None, tax_category=None,
billing_address=None, shipping_address=None, use_for_shopping_cart=None):
from erpnext.accounts.doctype.tax_rule.tax_rule import get_tax_template, get_party_details
args = {
@@ -359,6 +375,9 @@
"company": company
}
+ if tax_category:
+ args['tax_category'] = tax_category
+
if customer_group:
args['customer_group'] = customer_group
diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
index 1ec0abc..13424db 100644
--- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
+++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
@@ -35,16 +35,22 @@
def get_entries(filters):
conditions = get_conditions(filters)
- journal_entries = frappe.db.sql("""select "Journal Entry", jv.name, jv.posting_date,
- jv.cheque_no, jv.clearance_date, jvd.against_account, (jvd.debit - jvd.credit)
- from `tabJournal Entry Account` jvd, `tabJournal Entry` jv
- where jvd.parent = jv.name and jv.docstatus=1 and jvd.account = %(account)s {0}
- order by posting_date DESC, jv.name DESC""".format(conditions), filters, as_list=1)
+ journal_entries = frappe.db.sql("""SELECT
+ "Journal Entry", jv.name, jv.posting_date, jv.cheque_no, jv.clearance_date, jvd.against_account,
+ if((jvd.debit - jvd.credit) < 0, (jvd.debit - jvd.credit) * -1, (jvd.debit - jvd.credit))
+ FROM
+ `tabJournal Entry Account` jvd, `tabJournal Entry` jv
+ WHERE
+ jvd.parent = jv.name and jv.docstatus=1 and jvd.account = %(account)s {0}
+ order by posting_date DESC, jv.name DESC""".format(conditions), filters, as_list=1)
- payment_entries = frappe.db.sql("""select "Payment Entry", name, posting_date,
- reference_no, clearance_date, party, if(paid_from=%(account)s, paid_amount, received_amount)
- from `tabPayment Entry`
- where docstatus=1 and (paid_from = %(account)s or paid_to = %(account)s) {0}
- order by posting_date DESC, name DESC""".format(conditions), filters, as_list=1)
+ payment_entries = frappe.db.sql("""SELECT
+ "Payment Entry", name, posting_date, reference_no, clearance_date, party,
+ if(paid_from=%(account)s, paid_amount, received_amount)
+ FROM
+ `tabPayment Entry`
+ WHERE
+ docstatus=1 and (paid_from = %(account)s or paid_to = %(account)s) {0}
+ order by posting_date DESC, name DESC""".format(conditions), filters, as_list=1)
return sorted(journal_entries + payment_entries, key=lambda k: k[2] or getdate(nowdate()))
\ No newline at end of file
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index d855873..65629d2 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -9,6 +9,7 @@
from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries, scrap_asset, restore_asset
from erpnext.assets.doctype.asset.asset import make_sales_invoice, make_purchase_invoice
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
+from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice as make_invoice
class TestAsset(unittest.TestCase):
def setUp(self):
@@ -494,6 +495,15 @@
self.assertEqual(gle, expected_gle)
+ def test_expense_head(self):
+ pr = make_purchase_receipt(item_code="Macbook Pro",
+ qty=2, rate=200000.0, location="Test Location")
+
+ doc = make_invoice(pr.name)
+
+ self.assertEquals('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
+
+
def create_asset_data():
if not frappe.db.exists("Asset Category", "Computers"):
create_asset_category()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index 8c586d1..5e5110d 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -1914,8 +1914,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "",
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1924,13 +1923,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "purchase_other_charges",
- "oldfieldtype": "Link",
- "options": "Purchase Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -2044,6 +2042,41 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "description": "",
+ "fieldname": "taxes_and_charges",
+ "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": "Purchase Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "purchase_other_charges",
+ "oldfieldtype": "Link",
+ "options": "Purchase Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -2881,6 +2914,7 @@
"label": "Rounded Total",
"length": 0,
"no_copy": 0,
+ "options": "currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -3831,7 +3865,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:56.739693",
+ "modified": "2018-12-27 02:04:14.410491",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
@@ -3926,4 +3960,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
old mode 100755
new mode 100644
index 3d981c5..9b26085
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
@@ -2243,6 +2243,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "column_break_68",
"fieldtype": "Column Break",
"hidden": 0,
@@ -2344,7 +2377,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:57.546323",
+ "modified": "2018-11-23 16:53:57.220731",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order Item",
@@ -2359,4 +2392,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json
index 3b1f4e0..d6c6f88 100644
--- a/erpnext/buying/doctype/supplier/supplier.json
+++ b/erpnext/buying/doctype/supplier/supplier.json
@@ -188,6 +188,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "tax_category",
+ "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": "Tax Category",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Tax Category",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "tax_withholding_category",
"fieldtype": "Link",
"hidden": 0,
@@ -1463,7 +1496,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2019-01-07 16:52:04.660271",
+ "modified": "2018-11-23 16:15:44.497406",
"modified_by": "Administrator",
"module": "Buying",
"name": "Supplier",
@@ -1614,4 +1647,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
index 5738433..049dc9f 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json
@@ -1198,8 +1198,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "",
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1208,13 +1207,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
- "no_copy": 1,
- "oldfieldname": "purchase_other_charges",
- "oldfieldtype": "Link",
- "options": "Purchase Taxes and Charges Template",
+ "no_copy": 0,
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -1328,6 +1326,41 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "description": "",
+ "fieldname": "taxes_and_charges",
+ "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": "Purchase Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 1,
+ "oldfieldname": "purchase_other_charges",
+ "oldfieldtype": "Link",
+ "options": "Purchase Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -2845,7 +2878,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:52:01.505553",
+ "modified": "2018-12-27 02:08:16.421501",
"modified_by": "Administrator",
"module": "Buying",
"name": "Supplier Quotation",
@@ -2959,4 +2992,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
index 94d93f6..7ef3e40 100644
--- a/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
+++ b/erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
@@ -1550,6 +1550,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "material_request_item",
"fieldtype": "Data",
"hidden": 1,
@@ -1786,7 +1819,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:52:02.125715",
+ "modified": "2018-11-23 17:34:54.977366",
"modified_by": "Administrator",
"module": "Buying",
"name": "Supplier Quotation Item",
@@ -1801,4 +1834,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 95ce1eb..c8b7eff 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -165,6 +165,11 @@
"items": [
{
"type": "doctype",
+ "name": "Tax Category",
+ "description": _("Tax Category for overriding tax rates.")
+ },
+ {
+ "type": "doctype",
"name": "Sales Taxes and Charges Template",
"description": _("Tax template for selling transactions.")
},
@@ -175,6 +180,11 @@
},
{
"type": "doctype",
+ "name": "Item Tax Template",
+ "description": _("Tax template for item tax rates.")
+ },
+ {
+ "type": "doctype",
"name": "Tax Rule",
"description": _("Tax Rule for transactions.")
},
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index e402a1f..3a5c7f9 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -16,7 +16,7 @@
from erpnext.exceptions import InvalidCurrency
from six import text_type
-force_item_fields = ("item_group", "brand", "stock_uom", "is_fixed_asset")
+force_item_fields = ("item_group", "brand", "stock_uom", "is_fixed_asset", "item_tax_rate")
class AccountsController(TransactionBase):
@@ -605,13 +605,14 @@
advance.account_currency)
if advance.account_currency == self.currency:
- order_total = self.grand_total
- formatted_order_total = fmt_money(order_total, precision=self.precision("grand_total"),
- currency=advance.account_currency)
+ order_total = self.get("rounded_total") or self.grand_total
+ precision = "rounded_total" if self.get("rounded_total") else "grand_total"
else:
- order_total = self.base_grand_total
- formatted_order_total = fmt_money(order_total, precision=self.precision("base_grand_total"),
- currency=advance.account_currency)
+ order_total = self.get("base_rounded_total") or self.base_grand_total
+ precision = "base_rounded_total" if self.get("base_rounded_total") else "base_grand_total"
+
+ formatted_order_total = fmt_money(order_total, precision=self.precision(precision),
+ currency=advance.account_currency)
if self.currency == self.company_currency and advance_paid > order_total:
frappe.throw(_("Total advance ({0}) against Order {1} cannot be greater than the Grand Total ({2})")
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index f35eb59..0226201 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -54,6 +54,9 @@
where parenttype='User' and role=%s''', activity.role)
users = users + user_list
+ if "Administrator" in users:
+ users.remove("Administrator")
+
# assign the task the users
if users:
self.assign_task_to_users(task, set(users))
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
old mode 100755
new mode 100644
index 1da7eba..d3d0d05
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -580,6 +580,8 @@
erpnext.patches.v10_0.repost_gle_for_purchase_receipts_with_rejected_items
erpnext.patches.v11_0.set_missing_gst_hsn_code
erpnext.patches.v11_0.rename_bom_wo_fields
+erpnext.patches.v11_0.move_item_tax_to_item_tax_template
+erpnext.patches.v11_0.rename_additional_salary_component_additional_salary
erpnext.patches.v12_0.rename_learn_to_help
erpnext.patches.v12_0.rename_accounts_desktop_icon_to_accounting
erpnext.patches.v12_0.replace_project_list_desktop_icon_with_projects_module_desktop_icon
diff --git a/erpnext/patches/v11_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v11_0/move_item_tax_to_item_tax_template.py
new file mode 100644
index 0000000..8de7009
--- /dev/null
+++ b/erpnext/patches/v11_0/move_item_tax_to_item_tax_template.py
@@ -0,0 +1,80 @@
+import frappe
+import json
+from six import iteritems
+
+old_item_taxes = {}
+item_tax_templates = {}
+rename_template_to_untitled = []
+
+def execute():
+ for d in frappe.db.sql("""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1):
+ old_item_taxes.setdefault(d.item_code, [])
+ old_item_taxes[d.item_code].append(d)
+
+ frappe.reload_doc("accounts", "doctype", "item_tax_template_detail")
+ frappe.reload_doc("accounts", "doctype", "item_tax_template")
+ frappe.reload_doc("stock", "doctype", "item")
+ frappe.reload_doc("stock", "doctype", "item_tax")
+ frappe.reload_doc("selling", "doctype", "quotation_item")
+ frappe.reload_doc("selling", "doctype", "sales_order_item")
+ frappe.reload_doc("stock", "doctype", "delivery_note_item")
+ frappe.reload_doc("accounts", "doctype", "sales_invoice_item")
+ frappe.reload_doc("buying", "doctype", "supplier_quotation_item")
+ frappe.reload_doc("buying", "doctype", "purchase_order_item")
+ frappe.reload_doc("stock", "doctype", "purchase_receipt_item")
+ frappe.reload_doc("accounts", "doctype", "purchase_invoice_item")
+ frappe.reload_doc("accounts", "doctype", "accounts_settings")
+
+ # for each item that have item tax rates
+ for item_code in old_item_taxes.keys():
+ # make current item's tax map
+ item_tax_map = {}
+ for d in old_item_taxes[item_code]:
+ item_tax_map[d.tax_type] = d.tax_rate
+
+ item_tax_template_name = get_item_tax_template(item_tax_map, item_code)
+
+ # update the item tax table
+ item = frappe.get_doc("Item", item_code)
+ item.set("taxes", [])
+ item.append("taxes", {"item_tax_template": item_tax_template_name, "tax_category": ""})
+ item.save()
+
+ doctypes = [
+ 'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice',
+ 'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice'
+ ]
+ for dt in doctypes:
+ for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item`
+ where ifnull(item_tax_rate, '') not in ('', '{{}}')""".format(dt), as_dict=1):
+ item_tax_map = json.loads(d.item_tax_rate)
+ item_tax_template = get_item_tax_template(item_tax_map, d.item_code, d.parent)
+ frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template)
+
+ idx = 1
+ for oldname in rename_template_to_untitled:
+ frappe.rename_doc("Item Tax Template", oldname, "Untitled {}".format(idx))
+ idx += 1
+
+ settings = frappe.get_single("Accounts Settings")
+ settings.add_taxes_from_item_tax_template = 0
+ settings.determine_address_tax_category_from = "Billing Address"
+ settings.save()
+
+def get_item_tax_template(item_tax_map, item_code, parent=None):
+ # search for previously created item tax template by comparing tax maps
+ for template, item_tax_template_map in iteritems(item_tax_templates):
+ if item_tax_map == item_tax_template_map:
+ if not parent:
+ rename_template_to_untitled.append(template)
+ return template
+
+ # if no item tax template found, create one
+ item_tax_template = frappe.new_doc("Item Tax Template")
+ item_tax_template.title = "{}--{}".format(parent, item_code) if parent else "Item-{}".format(item_code)
+ for tax_type, tax_rate in iteritems(item_tax_map):
+ item_tax_template.append("taxes", {"tax_type": tax_type, "tax_rate": tax_rate})
+ item_tax_templates.setdefault(item_tax_template.title, {})
+ item_tax_templates[item_tax_template.title][tax_type] = tax_rate
+ item_tax_template.save()
+ return item_tax_template.name
diff --git a/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py b/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py
new file mode 100644
index 0000000..8fa876d
--- /dev/null
+++ b/erpnext/patches/v11_0/rename_additional_salary_component_additional_salary.py
@@ -0,0 +1,10 @@
+import frappe
+
+# this patch should have been included with this PR https://github.com/frappe/erpnext/pull/14302
+
+def execute():
+ if frappe.db.table_exists("Additional Salary Component"):
+ if not frappe.db.table_exists("Additional Salary"):
+ frappe.rename_doc("DocType", "Additional Salary Component", "Additional Salary")
+
+ frappe.delete_doc('DocType', "Additional Salary Component")
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index 4ea4415..1449e4f 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -112,6 +112,7 @@
supplier_address: function() {
erpnext.utils.get_address_display(this.frm);
+ erpnext.utils.set_taxes_from_address(this.frm, "supplier_address", "supplier_address", "supplier_address");
},
buying_price_list: function() {
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 035c58d..f409f61 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -441,13 +441,19 @@
weight_uom: item.weight_uom,
uom : item.uom,
pos_profile: me.frm.doc.doctype == 'Sales Invoice' ? me.frm.doc.pos_profile : '',
- cost_center: item.cost_center
+ cost_center: item.cost_center,
+ tax_category: me.frm.doc.tax_category,
+ item_tax_template: item.item_tax_template
}
},
callback: function(r) {
if(!r.exc) {
frappe.run_serially([
+ () => {
+ var d = locals[cdt][cdn];
+ me.add_taxes_from_item_tax_template(d.item_tax_rate);
+ },
() => me.frm.script_manager.trigger("price_list_rate", cdt, cdn),
() => me.toggle_conversion_factor(item),
() => {
@@ -471,6 +477,26 @@
}
},
+ add_taxes_from_item_tax_template: function(item_tax_map) {
+ let me = this;
+
+ if(item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) {
+ if(typeof (item_tax_map) == "string") {
+ item_tax_map = JSON.parse(item_tax_map);
+ }
+
+ $.each(item_tax_map, function(tax, rate) {
+ let found = (me.frm.doc.taxes || []).find(d => d.account_head === tax);
+ if(!found) {
+ let child = frappe.model.add_child(me.frm.doc, "taxes");
+ child.charge_type = "On Net Total";
+ child.account_head = tax;
+ child.rate = 0;
+ }
+ });
+ }
+ },
+
serial_no: function(doc, cdt, cdn) {
var me = this;
var item = frappe.get_doc(cdt, cdn);
@@ -539,6 +565,7 @@
frappe.run_serially([
() => me.frm.script_manager.trigger("currency"),
+ () => me.update_item_tax_map(),
() => me.apply_default_taxes(),
() => me.apply_pricing_rule()
]);
@@ -1282,6 +1309,80 @@
}
},
+ tax_category: function() {
+ var me = this;
+ if(me.frm.updating_party_details) return;
+
+ frappe.run_serially([
+ () => this.update_item_tax_map(),
+ () => erpnext.utils.set_taxes(this.frm, "tax_category"),
+ ]);
+ },
+
+ item_tax_template: function(doc, cdt, cdn) {
+ var me = this;
+ if(me.frm.updating_party_details) return;
+
+ var item = frappe.get_doc(cdt, cdn);
+
+ if(item.item_tax_template) {
+ return this.frm.call({
+ method: "erpnext.stock.get_item_details.get_item_tax_map",
+ args: {
+ company: me.frm.doc.company,
+ item_tax_template: item.item_tax_template,
+ as_json: true
+ },
+ callback: function(r) {
+ if(!r.exc) {
+ item.item_tax_rate = r.message;
+ me.add_taxes_from_item_tax_template(item.item_tax_rate);
+ me.calculate_taxes_and_totals();
+ }
+ }
+ });
+ } else {
+ item.item_tax_rate = "{}";
+ me.calculate_taxes_and_totals();
+ }
+ },
+
+ update_item_tax_map: function() {
+ var me = this;
+ var item_codes = [];
+ $.each(this.frm.doc.items || [], function(i, item) {
+ if(item.item_code) {
+ item_codes.push(item.item_code);
+ }
+ });
+
+ if(item_codes.length) {
+ return this.frm.call({
+ method: "erpnext.stock.get_item_details.get_item_tax_info",
+ args: {
+ company: me.frm.doc.company,
+ tax_category: cstr(me.frm.doc.tax_category),
+ item_codes: item_codes
+ },
+ callback: function(r) {
+ if(!r.exc) {
+ $.each(me.frm.doc.items || [], function(i, item) {
+ if(item.item_code && r.message.hasOwnProperty(item.item_code)) {
+ item.item_tax_template = r.message[item.item_code].item_tax_template;
+ item.item_tax_rate = r.message[item.item_code].item_tax_rate;
+ me.add_taxes_from_item_tax_template(item.item_tax_rate);
+ } else {
+ item.item_tax_template = "";
+ item.item_tax_rate = "{}";
+ }
+ });
+ me.calculate_taxes_and_totals();
+ }
+ }
+ });
+ }
+ },
+
is_recurring: function() {
// set default values for recurring documents
if(this.frm.doc.is_recurring && this.frm.doc.__islocal) {
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index eab0400..44f9f24 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -92,7 +92,6 @@
if(r.message) {
frm.set_value(display_field, r.message)
}
- erpnext.utils.set_taxes(frm, address_field, display_field, is_your_company_address);
}
})
} else {
@@ -100,15 +99,51 @@
}
};
-erpnext.utils.set_taxes = function(frm, address_field, display_field, is_your_company_address) {
- if(frappe.meta.get_docfield(frm.doc.doctype, "taxes") && !is_your_company_address) {
+erpnext.utils.set_taxes_from_address = function(frm, triggered_from_field, billing_address_field, shipping_address_field) {
+ if(frm.updating_party_details) return;
+
+ if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
if(!erpnext.utils.validate_mandatory(frm, "Lead/Customer/Supplier",
- frm.doc.customer || frm.doc.supplier || frm.doc.lead, address_field)) {
+ frm.doc.customer || frm.doc.supplier || frm.doc.lead, triggered_from_field)) {
return;
}
if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
- frm.doc.posting_date || frm.doc.transaction_date, address_field)) {
+ frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
+ return;
+ }
+ } else {
+ return;
+ }
+
+ frappe.call({
+ method: "erpnext.accounts.party.get_address_tax_category",
+ args: {
+ "tax_category": frm.doc.tax_category,
+ "billing_address": frm.doc[billing_address_field],
+ "shipping_address": frm.doc[shipping_address_field]
+ },
+ callback: function(r) {
+ if(!r.exc){
+ if(frm.doc.tax_category != r.message) {
+ frm.set_value("tax_category", r.message);
+ } else {
+ erpnext.utils.set_taxes(frm, triggered_from_field);
+ }
+ }
+ }
+ });
+};
+
+erpnext.utils.set_taxes = function(frm, triggered_from_field) {
+ if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
+ if(!erpnext.utils.validate_mandatory(frm, "Lead/Customer/Supplier",
+ frm.doc.customer || frm.doc.supplier || frm.doc.lead, triggered_from_field)) {
+ return;
+ }
+
+ if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
+ frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
return;
}
} else {
@@ -134,6 +169,9 @@
"party_type": party_type,
"posting_date": frm.doc.posting_date || frm.doc.transaction_date,
"company": frm.doc.company,
+ "customer_group": frm.doc.customer_group,
+ "supplier_group": frm.doc.supplier_group,
+ "tax_category": frm.doc.tax_category,
"billing_address": ((frm.doc.customer || frm.doc.lead) ? (frm.doc.customer_address) : (frm.doc.supplier_address)),
"shipping_address": frm.doc.shipping_address_name
},
@@ -143,7 +181,7 @@
}
}
});
-}
+};
erpnext.utils.get_contact_details = function(frm) {
if(frm.updating_party_details) return;
diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json
index 608c0e9..362db61 100644
--- a/erpnext/selling/doctype/customer/customer.json
+++ b/erpnext/selling/doctype/customer/customer.json
@@ -423,6 +423,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "tax_category",
+ "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": "Tax Category",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Tax Category",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"default": "0",
"fieldname": "disabled",
"fieldtype": "Check",
@@ -1873,7 +1906,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-10-01 10:07:34.510264",
+ "modified": "2018-11-23 16:14:43.710167",
"modified_by": "Administrator",
"module": "Selling",
"name": "Customer",
diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json
index 08c9b80..0b60222 100644
--- a/erpnext/selling/doctype/quotation/quotation.json
+++ b/erpnext/selling/doctype/quotation/quotation.json
@@ -1478,7 +1478,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1487,13 +1487,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "charge",
- "oldfieldtype": "Link",
- "options": "Sales Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -1605,6 +1604,40 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "taxes_and_charges",
+ "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": "Sales Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "charge",
+ "oldfieldtype": "Link",
+ "options": "Sales Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -3198,7 +3231,7 @@
"istable": 0,
"max_attachments": 1,
"menu_index": 0,
- "modified": "2019-01-07 16:51:55.604845",
+ "modified": "2018-12-27 02:07:50.702241",
"modified_by": "Administrator",
"module": "Selling",
"name": "Quotation",
@@ -3373,4 +3406,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/selling/doctype/quotation_item/quotation_item.json b/erpnext/selling/doctype/quotation_item/quotation_item.json
index 3a8b0df..b21360f 100644
--- a/erpnext/selling/doctype/quotation_item/quotation_item.json
+++ b/erpnext/selling/doctype/quotation_item/quotation_item.json
@@ -1801,6 +1801,39 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -1914,7 +1947,7 @@
"istable": 1,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:51:56.248107",
+ "modified": "2018-11-23 17:32:30.302066",
"modified_by": "Administrator",
"module": "Selling",
"name": "Quotation Item",
@@ -1929,4 +1962,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index aa29f3a..480bd91 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -1662,7 +1662,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1671,13 +1671,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "charge",
- "oldfieldtype": "Link",
- "options": "Sales Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -1789,6 +1788,40 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "taxes_and_charges",
+ "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": "Sales Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "charge",
+ "oldfieldtype": "Link",
+ "options": "Sales Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -4015,7 +4048,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:50.857438",
+ "modified": "2018-12-27 02:01:13.780828",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
@@ -4148,4 +4181,4 @@
"track_changes": 1,
"track_seen": 1,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
index 19065df..f56ebfc 100644
--- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json
+++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
@@ -2035,39 +2035,6 @@
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
- "allow_on_submit": 1,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "page_break",
- "fieldtype": "Check",
- "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": "Page Break",
- "length": 0,
- "no_copy": 0,
- "oldfieldname": "page_break",
- "oldfieldtype": "Check",
- "permlevel": 0,
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 1,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
@@ -2333,6 +2300,103 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "col_break5",
+ "fieldtype": "Column Break",
+ "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,
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 1,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "page_break",
+ "fieldtype": "Check",
+ "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": "Page Break",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "page_break",
+ "oldfieldtype": "Check",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 1,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"description": "For Production",
"fieldname": "planned_qty",
"fieldtype": "Float",
@@ -2477,7 +2541,7 @@
"istable": 1,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:51:51.852343",
+ "modified": "2018-11-23 17:20:53.728337",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order Item",
@@ -2492,4 +2556,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index b839d81..a246822 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -103,10 +103,12 @@
customer_address: function() {
erpnext.utils.get_address_display(this.frm, "customer_address");
+ erpnext.utils.set_taxes_from_address(this.frm, "customer_address", "customer_address", "shipping_address_name");
},
shipping_address_name: function() {
erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
+ erpnext.utils.set_taxes_from_address(this.frm, "shipping_address_name", "customer_address", "shipping_address_name");
},
sales_partner: function() {
diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json
index c9cbc9d..656d460 100644
--- a/erpnext/setup/doctype/item_group/item_group.json
+++ b/erpnext/setup/doctype/item_group/item_group.json
@@ -281,6 +281,72 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "collapsible_depends_on": "",
+ "columns": 0,
+ "fieldname": "sec_break_taxes",
+ "fieldtype": "Section Break",
+ "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": "Item Tax",
+ "length": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "taxes",
+ "fieldtype": "Table",
+ "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": "Taxes",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 0,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
"columns": 0,
"fieldname": "sb9",
"fieldtype": "Section Break",
@@ -617,7 +683,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 3,
- "modified": "2019-01-07 16:52:06.106336",
+ "modified": "2018-11-23 15:17:28.003933",
"modified_by": "Administrator",
"module": "Setup",
"name": "Item Group",
@@ -748,4 +814,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/setup/doctype/item_group/test_records.json b/erpnext/setup/doctype/item_group/test_records.json
index 436535e..7115964 100644
--- a/erpnext/setup/doctype/item_group/test_records.json
+++ b/erpnext/setup/doctype/item_group/test_records.json
@@ -69,5 +69,39 @@
"is_group": 1,
"item_group_name": "_Test Item Group D",
"parent_item_group": "All Item Groups"
+ },
+ {
+ "doctype": "Item Group",
+ "is_group": 1,
+ "item_group_name": "_Test Item Group Tax Parent",
+ "parent_item_group": "All Item Groups",
+ "taxes": [
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 10",
+ "tax_category": ""
+ },
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 12",
+ "tax_category": "_Test Tax Category 1"
+ }
+ ]
+ },
+ {
+ "doctype": "Item Group",
+ "is_group": 0,
+ "item_group_name": "_Test Item Group Tax Child Override",
+ "parent_item_group": "_Test Item Group Tax Parent",
+ "taxes": [
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 15",
+ "tax_category": ""
+ }
+ ]
}
]
\ No newline at end of file
diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py
index 254d7b7..dc37007 100644
--- a/erpnext/shopping_cart/cart.py
+++ b/erpnext/shopping_cart/cart.py
@@ -303,9 +303,10 @@
customer_group = frappe.db.get_value("Customer", quotation.customer, "customer_group")
- quotation.taxes_and_charges = set_taxes(quotation.customer, "Customer", \
- quotation.transaction_date, quotation.company, customer_group, None, \
- quotation.customer_address, quotation.shipping_address_name, 1)
+ quotation.taxes_and_charges = set_taxes(quotation.customer, "Customer",
+ quotation.transaction_date, quotation.company, customer_group=customer_group, supplier_group=None,
+ tax_category=quotation.tax_category, billing_address=quotation.customer_address,
+ shipping_address=quotation.shipping_address_name, use_for_shopping_cart=1)
#
# # clear table
quotation.set("taxes", [])
diff --git a/erpnext/shopping_cart/test_shopping_cart.py b/erpnext/shopping_cart/test_shopping_cart.py
index 7d6b41e..daad799 100644
--- a/erpnext/shopping_cart/test_shopping_cart.py
+++ b/erpnext/shopping_cart/test_shopping_cart.py
@@ -107,9 +107,10 @@
from erpnext.accounts.party import set_taxes
- tax_rule_master = set_taxes(quotation.customer, "Customer", \
- quotation.transaction_date, quotation.company, None, None, \
- quotation.customer_address, quotation.shipping_address_name, 1)
+ tax_rule_master = set_taxes(quotation.customer, "Customer",
+ quotation.transaction_date, quotation.company, customer_group=None, supplier_group=None,
+ tax_category=quotation.tax_category, billing_address=quotation.customer_address,
+ shipping_address=quotation.shipping_address_name, use_for_shopping_cart=1)
self.assertEqual(quotation.taxes_and_charges, tax_rule_master)
self.assertEqual(quotation.total_taxes_and_charges, 1000.0)
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 4e08a7a..9f7de64 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -1961,8 +1961,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "If you have created a standard template in Sales Taxes and Charges Template, select one and click on the button below.",
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1971,13 +1970,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "charge",
- "oldfieldtype": "Link",
- "options": "Sales Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -2089,6 +2087,41 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "description": "If you have created a standard template in Sales Taxes and Charges Template, select one and click on the button below.",
+ "fieldname": "taxes_and_charges",
+ "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": "Sales Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "charge",
+ "oldfieldtype": "Link",
+ "options": "Sales Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -4296,7 +4329,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2019-01-07 16:51:52.357859",
+ "modified": "2018-12-27 01:53:41.645566",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",
@@ -4410,4 +4443,4 @@
"track_changes": 1,
"track_seen": 1,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
index 9fe741a..a47ec4c 100644
--- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
+++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
@@ -2008,6 +2008,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"default": ":Company",
"fieldname": "cost_center",
"fieldtype": "Link",
@@ -2310,7 +2343,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:53.322875",
+ "modified": "2018-11-23 17:20:07.347814",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note Item",
@@ -2325,4 +2358,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index 7b5e554..9e7d9a1 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -3114,6 +3114,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
+ "collapsible_depends_on": "taxes",
"columns": 0,
"fieldname": "item_tax_section_break",
"fieldtype": "Section Break",
@@ -4180,7 +4181,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 1,
- "modified": "2019-01-10 04:14:34.497557",
+ "modified": "2018-11-23 01:48:29.347662",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",
@@ -4350,4 +4351,4 @@
"track_changes": 1,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index f7cdcf0..a0d94bf 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -450,7 +450,7 @@
# add item taxes from template
for d in template.get("taxes"):
- self.append("taxes", {"tax_type": d.tax_type, "tax_rate": d.tax_rate})
+ self.append("taxes", {"item_tax_template": d.item_tax_template})
# copy re-order table if empty
if not self.get("reorder_levels"):
@@ -499,17 +499,11 @@
"""Check whether Tax Rate is not entered twice for same Tax Type"""
check_list = []
for d in self.get('taxes'):
- if d.tax_type:
- account_type = frappe.db.get_value("Account", d.tax_type, "account_type")
-
- if account_type not in ['Tax', 'Chargeable', 'Income Account', 'Expense Account']:
- frappe.throw(
- _("Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable").format(d.idx))
+ if d.item_tax_template:
+ if d.item_tax_template in check_list:
+ frappe.throw(_("{0} entered twice in Item Tax").format(d.item_tax_template))
else:
- if d.tax_type in check_list:
- frappe.throw(_("{0} entered twice in Item Tax").format(d.tax_type))
- else:
- check_list.append(d.tax_type)
+ check_list.append(d.item_tax_template)
def validate_barcode(self):
from stdnum import ean
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index 4b1bf90..2ab5bb3 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -4,6 +4,7 @@
from __future__ import unicode_literals
import unittest
import frappe
+import json
from frappe.test_runner import make_test_objects
from erpnext.controllers.item_variant import (create_variant, ItemVariantExistsError,
@@ -17,7 +18,7 @@
from six import iteritems
test_ignore = ["BOM"]
-test_dependencies = ["Warehouse", "Item Group"]
+test_dependencies = ["Warehouse", "Item Group", "Item Tax Template"]
def make_item(item_code, properties=None):
if frappe.db.exists("Item", item_code):
@@ -76,7 +77,6 @@
"amount": 0.0,
"base_amount": 0.0,
"batch_no": None,
- "item_tax_rate": '{}',
"uom": "_Test UOM",
"conversion_factor": 1.0,
}
@@ -102,6 +102,68 @@
for key, value in iteritems(to_check):
self.assertEqual(value, details.get(key))
+ def test_item_tax_template(self):
+ expected_item_tax_template = [
+ {"item_code": "_Test Item With Item Tax Template", "tax_category": "",
+ "item_tax_template": "_Test Account Excise Duty @ 10"},
+ {"item_code": "_Test Item With Item Tax Template", "tax_category": "_Test Tax Category 1",
+ "item_tax_template": "_Test Account Excise Duty @ 12"},
+ {"item_code": "_Test Item With Item Tax Template", "tax_category": "_Test Tax Category 2",
+ "item_tax_template": None},
+
+ {"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "",
+ "item_tax_template": "_Test Account Excise Duty @ 10"},
+ {"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "_Test Tax Category 1",
+ "item_tax_template": "_Test Account Excise Duty @ 12"},
+ {"item_code": "_Test Item Inherit Group Item Tax Template 1", "tax_category": "_Test Tax Category 2",
+ "item_tax_template": None},
+
+ {"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "",
+ "item_tax_template": "_Test Account Excise Duty @ 15"},
+ {"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "_Test Tax Category 1",
+ "item_tax_template": "_Test Account Excise Duty @ 12"},
+ {"item_code": "_Test Item Inherit Group Item Tax Template 2", "tax_category": "_Test Tax Category 2",
+ "item_tax_template": None},
+
+ {"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "",
+ "item_tax_template": "_Test Account Excise Duty @ 20"},
+ {"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "_Test Tax Category 1",
+ "item_tax_template": "_Test Item Tax Template 1"},
+ {"item_code": "_Test Item Override Group Item Tax Template", "tax_category": "_Test Tax Category 2",
+ "item_tax_template": None},
+ ]
+
+ expected_item_tax_map = {
+ None: {},
+ "_Test Account Excise Duty @ 10": {"_Test Account Excise Duty - _TC": 10},
+ "_Test Account Excise Duty @ 12": {"_Test Account Excise Duty - _TC": 12},
+ "_Test Account Excise Duty @ 15": {"_Test Account Excise Duty - _TC": 15},
+ "_Test Account Excise Duty @ 20": {"_Test Account Excise Duty - _TC": 20},
+ "_Test Item Tax Template 1": {"_Test Account Excise Duty - _TC": 5, "_Test Account Education Cess - _TC": 10,
+ "_Test Account S&H Education Cess - _TC": 15}
+ }
+
+ for data in expected_item_tax_template:
+ details = get_item_details({
+ "item_code": data['item_code'],
+ "tax_category": data['tax_category'],
+ "company": "_Test Company",
+ "price_list": "_Test Price List",
+ "currency": "_Test Currency",
+ "doctype": "Sales Order",
+ "conversion_rate": 1,
+ "price_list_currency": "_Test Currency",
+ "plc_conversion_rate": 1,
+ "order_type": "Sales",
+ "customer": "_Test Customer",
+ "conversion_factor": 1,
+ "price_list_uom_dependant": 1,
+ "ignore_pricing_rule": 1
+ })
+
+ self.assertEqual(details.item_tax_template, data['item_tax_template'])
+ self.assertEqual(json.loads(details.item_tax_rate), expected_item_tax_map[details.item_tax_template])
+
def test_item_attribute_change_after_variant(self):
frappe.delete_doc_if_exists("Item", "_Test Variant Item-L", force=1)
diff --git a/erpnext/stock/doctype/item/test_records.json b/erpnext/stock/doctype/item/test_records.json
index 18e2910..b09a3c0 100644
--- a/erpnext/stock/doctype/item/test_records.json
+++ b/erpnext/stock/doctype/item/test_records.json
@@ -92,8 +92,8 @@
{
"doctype": "Item Tax",
"parentfield": "taxes",
- "tax_rate": 10,
- "tax_type": "_Test Account Excise Duty - _TC"
+ "item_tax_template": "_Test Account Excise Duty @ 10",
+ "tax_category": ""
}
],
"stock_uom": "_Test UOM 1"
@@ -344,5 +344,121 @@
"stock_uom": "_Test UOM",
"show_in_website": 1,
"website_warehouse": "_Test Warehouse Group-C1 - _TC"
+ },
+ {
+ "description": "_Test Item With Item Tax Template",
+ "doctype": "Item",
+ "has_batch_no": 0,
+ "has_serial_no": 0,
+ "inspection_required": 0,
+ "is_stock_item": 1,
+ "is_sub_contracted_item": 0,
+ "item_code": "_Test Item With Item Tax Template",
+ "item_group": "_Test Item Group",
+ "item_name": "_Test Item With Item Tax Template",
+ "stock_uom": "_Test UOM",
+ "gst_hsn_code": "999800",
+ "item_defaults": [{
+ "company": "_Test Company",
+ "default_warehouse": "_Test Warehouse - _TC",
+ "expense_account": "_Test Account Cost for Goods Sold - _TC",
+ "buying_cost_center": "_Test Cost Center - _TC",
+ "selling_cost_center": "_Test Cost Center - _TC",
+ "income_account": "Sales - _TC"
+ }],
+ "taxes": [
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 10",
+ "tax_category": ""
+ },
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 12",
+ "tax_category": "_Test Tax Category 1"
+ }
+ ]
+ },
+ {
+ "description": "_Test Item Inherit Group Item Tax Template 1",
+ "doctype": "Item",
+ "has_batch_no": 0,
+ "has_serial_no": 0,
+ "inspection_required": 0,
+ "is_stock_item": 1,
+ "is_sub_contracted_item": 0,
+ "item_code": "_Test Item Inherit Group Item Tax Template 1",
+ "item_group": "_Test Item Group Tax Parent",
+ "item_name": "_Test Item Inherit Group Item Tax Template 1",
+ "stock_uom": "_Test UOM",
+ "gst_hsn_code": "999800",
+ "item_defaults": [{
+ "company": "_Test Company",
+ "default_warehouse": "_Test Warehouse - _TC",
+ "expense_account": "_Test Account Cost for Goods Sold - _TC",
+ "buying_cost_center": "_Test Cost Center - _TC",
+ "selling_cost_center": "_Test Cost Center - _TC",
+ "income_account": "Sales - _TC"
+ }]
+ },
+ {
+ "description": "_Test Item Inherit Group Item Tax Template 2",
+ "doctype": "Item",
+ "has_batch_no": 0,
+ "has_serial_no": 0,
+ "inspection_required": 0,
+ "is_stock_item": 1,
+ "is_sub_contracted_item": 0,
+ "item_code": "_Test Item Inherit Group Item Tax Template 2",
+ "item_group": "_Test Item Group Tax Child Override",
+ "item_name": "_Test Item Inherit Group Item Tax Template 2",
+ "stock_uom": "_Test UOM",
+ "gst_hsn_code": "999800",
+ "item_defaults": [{
+ "company": "_Test Company",
+ "default_warehouse": "_Test Warehouse - _TC",
+ "expense_account": "_Test Account Cost for Goods Sold - _TC",
+ "buying_cost_center": "_Test Cost Center - _TC",
+ "selling_cost_center": "_Test Cost Center - _TC",
+ "income_account": "Sales - _TC"
+ }]
+ },
+ {
+ "description": "_Test Item Override Group Item Tax Template",
+ "doctype": "Item",
+ "has_batch_no": 0,
+ "has_serial_no": 0,
+ "inspection_required": 0,
+ "is_stock_item": 1,
+ "is_sub_contracted_item": 0,
+ "item_code": "_Test Item Override Group Item Tax Template",
+ "item_group": "_Test Item Group Tax Child Override",
+ "item_name": "_Test Item Override Group Item Tax Template",
+ "stock_uom": "_Test UOM",
+ "gst_hsn_code": "999800",
+ "item_defaults": [{
+ "company": "_Test Company",
+ "default_warehouse": "_Test Warehouse - _TC",
+ "expense_account": "_Test Account Cost for Goods Sold - _TC",
+ "buying_cost_center": "_Test Cost Center - _TC",
+ "selling_cost_center": "_Test Cost Center - _TC",
+ "income_account": "Sales - _TC"
+ }],
+ "taxes": [
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Account Excise Duty @ 20",
+ "tax_category": ""
+ },
+ {
+ "doctype": "Item Tax",
+ "parentfield": "taxes",
+ "item_tax_template": "_Test Item Tax Template 1",
+ "tax_category": "_Test Tax Category 1"
+ }
+ ]
}
]
diff --git a/erpnext/stock/doctype/item_tax/item_tax.json b/erpnext/stock/doctype/item_tax/item_tax.json
index 6c1bd09..37daa29 100644
--- a/erpnext/stock/doctype/item_tax/item_tax.json
+++ b/erpnext/stock/doctype/item_tax/item_tax.json
@@ -1,5 +1,7 @@
{
"allow_copy": 0,
+ "allow_events_in_timeline": 0,
+ "allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"beta": 0,
@@ -10,70 +12,86 @@
"editable_grid": 1,
"fields": [
{
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "tax_type",
+ "columns": 0,
+ "fieldname": "item_tax_template",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
- "label": "Tax",
+ "in_standard_filter": 0,
+ "label": "Item Tax Template",
"length": 0,
"no_copy": 0,
"oldfieldname": "tax_type",
"oldfieldtype": "Link",
- "options": "Account",
+ "options": "Item Tax Template",
"permlevel": 0,
"print_hide": 0,
"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,
+ "translatable": 0,
"unique": 0
},
{
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "tax_rate",
- "fieldtype": "Float",
+ "columns": 0,
+ "fetch_from": "",
+ "fieldname": "tax_category",
+ "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
+ "in_global_search": 0,
"in_list_view": 1,
- "label": "Tax Rate",
+ "in_standard_filter": 0,
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
"oldfieldname": "tax_rate",
"oldfieldtype": "Currency",
+ "options": "Tax Category",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
+ "remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
+ "translatable": 0,
"unique": 0
}
],
+ "has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 1,
"image_view": 0,
"in_create": 0,
-
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2016-07-11 03:28:01.235369",
+ "modified": "2018-12-21 23:52:40.798944",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item Tax",
@@ -82,5 +100,8 @@
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
- "track_seen": 0
+ "show_name_in_global_search": 0,
+ "track_changes": 0,
+ "track_seen": 0,
+ "track_views": 0
}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
index 3e9ff49..61767d9 100755
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
@@ -85,7 +85,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "default": "{supplier_name}",
+ "default": "{supplier_name}",
"fieldname": "title",
"fieldtype": "Data",
"hidden": 1,
@@ -98,6 +98,7 @@
"label": "Title",
"length": 0,
"no_copy": 1,
+ "options": "",
"permlevel": 0,
"precision": "",
"print_hide": 1,
@@ -247,7 +248,7 @@
"set_only_once": 0,
"translatable": 0,
"unique": 0
- },
+ },
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
@@ -1748,8 +1749,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "description": "",
- "fieldname": "taxes_and_charges",
+ "fieldname": "tax_category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -1758,13 +1758,12 @@
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Taxes and Charges",
+ "label": "Tax Category",
"length": 0,
"no_copy": 0,
- "oldfieldname": "purchase_other_charges",
- "oldfieldtype": "Link",
- "options": "Purchase Taxes and Charges Template",
+ "options": "Tax Category",
"permlevel": 0,
+ "precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -1878,6 +1877,41 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "description": "",
+ "fieldname": "taxes_and_charges",
+ "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": "Purchase Taxes and Charges Template",
+ "length": 0,
+ "no_copy": 0,
+ "oldfieldname": "purchase_other_charges",
+ "oldfieldtype": "Link",
+ "options": "Purchase Taxes and Charges Template",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "taxes",
"fieldtype": "Table",
"hidden": 0,
@@ -3708,7 +3742,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2018-11-02 19:59:01.423485",
+ "modified": "2018-12-27 02:06:29.508848",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",
@@ -3813,7 +3847,7 @@
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 1,
- "search_fields": "status, posting_date, supplier",
+ "search_fields": "status, posting_date, supplier",
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "DESC",
diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
index 3746dfb..dcc70d7 100644
--- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
+++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -2066,6 +2066,39 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "item_tax_template",
+ "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": "Item Tax Template",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Item Tax Template",
+ "permlevel": 0,
+ "precision": "",
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "translatable": 0,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_in_quick_entry": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "project",
"fieldtype": "Link",
"hidden": 0,
@@ -2608,7 +2641,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2019-01-07 16:51:59.002215",
+ "modified": "2018-11-23 16:52:02.808534",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt Item",
@@ -2623,4 +2656,4 @@
"track_changes": 0,
"track_seen": 0,
"track_views": 0
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 692fe5d..f86be14 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -44,6 +44,10 @@
out = get_basic_details(args, item)
+ get_item_tax_template(args, item, out)
+ out["item_tax_rate"] = get_item_tax_map(args.company, args.get("item_tax_template") if out.get("item_tax_template") is None \
+ else out.get("item_tax_template"), as_json=True)
+
get_party_item_code(args, item, out)
set_valuation_rate(out, args)
@@ -248,8 +252,6 @@
'has_serial_no': item.has_serial_no,
'has_batch_no': item.has_batch_no,
"batch_no": None,
- "item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in
- item.get("taxes")))),
"uom": args.uom,
"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
"qty": args.qty or 1.0,
@@ -305,6 +307,59 @@
return out
@frappe.whitelist()
+def get_item_tax_info(company, tax_category, item_codes):
+ out = {}
+ if isinstance(item_codes, string_types):
+ item_codes = json.loads(item_codes)
+
+ for item_code in item_codes:
+ if not item_code or item_code in out:
+ continue
+ out[item_code] = {}
+ item = frappe.get_cached_doc("Item", item_code)
+ get_item_tax_template({"tax_category": tax_category}, item, out[item_code])
+ out[item_code]["item_tax_rate"] = get_item_tax_map(company, out[item_code].get("item_tax_template"), as_json=True)
+
+ return out
+
+def get_item_tax_template(args, item, out):
+ """
+ args = {
+ "tax_category": None
+ "item_tax_template": None
+ }
+ """
+ item_tax_template = args.get("item_tax_template")
+
+ if not item_tax_template:
+ item_tax_template = _get_item_tax_template(args, item.taxes, out)
+
+ if not item_tax_template:
+ item_group = item.item_group
+ while item_group and not item_tax_template:
+ item_group_doc = frappe.get_cached_doc("Item Group", item_group)
+ item_tax_template = _get_item_tax_template(args, item_group_doc.taxes, out)
+ item_group = item_group_doc.parent_item_group
+
+def _get_item_tax_template(args, taxes, out):
+ for tax in taxes:
+ if cstr(tax.tax_category) == cstr(args.get("tax_category")):
+ out["item_tax_template"] = tax.item_tax_template
+ return tax.item_tax_template
+ return None
+
+@frappe.whitelist()
+def get_item_tax_map(company, item_tax_template, as_json=True):
+ item_tax_map = {}
+ if item_tax_template:
+ template = frappe.get_cached_doc("Item Tax Template", item_tax_template)
+ for d in template.taxes:
+ if frappe.get_cached_value("Account", d.tax_type, "company") == company:
+ item_tax_map[d.tax_type] = d.tax_rate
+
+ return json.dumps(item_tax_map) if as_json else item_tax_map
+
+@frappe.whitelist()
def calculate_service_end_date(args, item=None):
args = process_args(args)
if not item: