From df71907be453a481a43d2c62a5c076602ab8af07 Mon Sep 17 00:00:00 2001
From: GangaManoj
Date: Tue, 8 Feb 2022 17:36:28 +0530
Subject: [PATCH 01/14] fix: Fetch valuation rate
---
.../doctype/asset_repair/asset_repair.js | 17 ++++++++++
.../doctype/asset_repair/asset_repair.py | 33 +++++++++++++++++++
.../asset_repair_consumed_item.json | 3 +-
3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js
index d554d52a718..7bd3a7246d9 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.js
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.js
@@ -68,6 +68,23 @@ frappe.ui.form.on('Asset Repair', {
});
frappe.ui.form.on('Asset Repair Consumed Item', {
+ item_code: function(frm, cdt, cdn) {
+ var row = locals[cdt][cdn];
+
+ frappe.call ({
+ method: "erpnext.assets.doctype.asset_repair.asset_repair.get_valuation_rate",
+ args: {
+ "item_code": row.item_code,
+ "warehouse": frm.doc.warehouse
+ },
+ callback: function(r) {
+ if(r.message) {
+ frappe.model.set_value(cdt, cdn, 'valuation_rate', r.message[0]);
+ }
+ }
+ });
+ },
+
consumed_quantity: function(frm, cdt, cdn) {
var row = locals[cdt][cdn];
frappe.model.set_value(cdt, cdn, 'total_value', row.consumed_quantity * row.valuation_rate);
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index 36848e9f15c..86a63fd1bca 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -256,3 +256,36 @@ class AssetRepair(AccountsController):
def get_downtime(failure_date, completion_date):
downtime = time_diff_in_hours(completion_date, failure_date)
return round(downtime, 2)
+
+@frappe.whitelist()
+def get_valuation_rate(item_code, warehouse):
+ last_valuation_rate = frappe.get_all(
+ "Stock Ledger Entry",
+ filters = {
+ "item_code": item_code,
+ "warehouse": warehouse,
+ "valuation_rate": [">=", 0],
+ "docstatus": ["<", 2]
+ },
+ pluck = "valuation_rate",
+ order_by = "posting_date desc, posting_time desc, name desc"
+ )
+
+ if last_valuation_rate:
+ return last_valuation_rate
+ else:
+ valuation_rate = frappe.db.get_value("Item", item_code, "valuation_rate")
+
+ if not valuation_rate:
+ # try Item Standard rate
+ valuation_rate = frappe.db.get_value("Item", item_code, "standard_rate")
+
+ if not valuation_rate:
+ # try in price list
+ valuation_rate = frappe.db.get_value(
+ "Item Price",
+ dict(item_code=item_code, buying=1),
+ "price_list_rate"
+ )
+
+ return valuation_rate
diff --git a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
index f63add12356..3c850c82653 100644
--- a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
+++ b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
@@ -13,7 +13,6 @@
],
"fields": [
{
- "fetch_from": "item.valuation_rate",
"fieldname": "valuation_rate",
"fieldtype": "Currency",
"in_list_view": 1,
@@ -49,7 +48,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2021-11-11 18:23:00.492483",
+ "modified": "2022-02-08 17:37:20.028290",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Repair Consumed Item",
From e1a9b61103e27099696ae4b186a6575b28c16b06 Mon Sep 17 00:00:00 2001
From: GangaManoj
Date: Tue, 8 Feb 2022 17:59:06 +0530
Subject: [PATCH 02/14] fix: Pass value instead of array
---
erpnext/assets/doctype/asset_repair/asset_repair.js | 2 +-
erpnext/assets/doctype/asset_repair/asset_repair.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js
index 7bd3a7246d9..18454fe3678 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.js
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.js
@@ -79,7 +79,7 @@ frappe.ui.form.on('Asset Repair Consumed Item', {
},
callback: function(r) {
if(r.message) {
- frappe.model.set_value(cdt, cdn, 'valuation_rate', r.message[0]);
+ frappe.model.set_value(cdt, cdn, 'valuation_rate', r.message);
}
}
});
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index 86a63fd1bca..d5e3d3c811a 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -272,7 +272,7 @@ def get_valuation_rate(item_code, warehouse):
)
if last_valuation_rate:
- return last_valuation_rate
+ return last_valuation_rate[0]
else:
valuation_rate = frappe.db.get_value("Item", item_code, "valuation_rate")
From 57d5a027fb929803ffd62463da3e5b4611b17ff4 Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Mon, 21 Feb 2022 13:58:01 +0530
Subject: [PATCH 03/14] fix: remove redundant method
---
.../doctype/asset_repair/asset_repair.js | 21 +++++++-----
.../doctype/asset_repair/asset_repair.py | 33 -------------------
2 files changed, 13 insertions(+), 41 deletions(-)
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js
index 18454fe3678..1e4c4e082d6 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.js
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.js
@@ -69,18 +69,23 @@ frappe.ui.form.on('Asset Repair', {
frappe.ui.form.on('Asset Repair Consumed Item', {
item_code: function(frm, cdt, cdn) {
- var row = locals[cdt][cdn];
+ var item = locals[cdt][cdn];
- frappe.call ({
- method: "erpnext.assets.doctype.asset_repair.asset_repair.get_valuation_rate",
+ let item_args = {
+ 'item_code': item.item_code,
+ 'warehouse': frm.doc.warehouse,
+ 'qty': item.consumed_quantity,
+ 'serial_no': item.serial_no,
+ 'company': frm.doc.company
+ }
+
+ frappe.call({
+ method: 'erpnext.stock.utils.get_incoming_rate',
args: {
- "item_code": row.item_code,
- "warehouse": frm.doc.warehouse
+ args: item_args
},
callback: function(r) {
- if(r.message) {
- frappe.model.set_value(cdt, cdn, 'valuation_rate', r.message);
- }
+ frappe.model.set_value(cdt, cdn, 'valuation_rate', r.message);
}
});
},
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index d5e3d3c811a..36848e9f15c 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -256,36 +256,3 @@ class AssetRepair(AccountsController):
def get_downtime(failure_date, completion_date):
downtime = time_diff_in_hours(completion_date, failure_date)
return round(downtime, 2)
-
-@frappe.whitelist()
-def get_valuation_rate(item_code, warehouse):
- last_valuation_rate = frappe.get_all(
- "Stock Ledger Entry",
- filters = {
- "item_code": item_code,
- "warehouse": warehouse,
- "valuation_rate": [">=", 0],
- "docstatus": ["<", 2]
- },
- pluck = "valuation_rate",
- order_by = "posting_date desc, posting_time desc, name desc"
- )
-
- if last_valuation_rate:
- return last_valuation_rate[0]
- else:
- valuation_rate = frappe.db.get_value("Item", item_code, "valuation_rate")
-
- if not valuation_rate:
- # try Item Standard rate
- valuation_rate = frappe.db.get_value("Item", item_code, "standard_rate")
-
- if not valuation_rate:
- # try in price list
- valuation_rate = frappe.db.get_value(
- "Item Price",
- dict(item_code=item_code, buying=1),
- "price_list_rate"
- )
-
- return valuation_rate
From 2aba6c38b36e5fce373800eb129a93eb010c691f Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Mon, 21 Feb 2022 14:01:12 +0530
Subject: [PATCH 04/14] fix: cannot edit valutaion_rate in asset repair
---
.../asset_repair_consumed_item/asset_repair_consumed_item.json | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
index 3c850c82653..4685a09db63 100644
--- a/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
+++ b/erpnext/assets/doctype/asset_repair_consumed_item/asset_repair_consumed_item.json
@@ -16,8 +16,7 @@
"fieldname": "valuation_rate",
"fieldtype": "Currency",
"in_list_view": 1,
- "label": "Valuation Rate",
- "read_only": 1
+ "label": "Valuation Rate"
},
{
"fieldname": "consumed_quantity",
From bc28755978c17d7e85cdc5ffd4a45a629183e2c8 Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Mon, 21 Feb 2022 14:26:21 +0530
Subject: [PATCH 05/14] fix: sider
---
erpnext/assets/doctype/asset_repair/asset_repair.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js
index 1e4c4e082d6..3fe6b2d0d5d 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.js
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.js
@@ -77,7 +77,7 @@ frappe.ui.form.on('Asset Repair Consumed Item', {
'qty': item.consumed_quantity,
'serial_no': item.serial_no,
'company': frm.doc.company
- }
+ };
frappe.call({
method: 'erpnext.stock.utils.get_incoming_rate',
From 6b87d38a8090893fdb5639a6d784cf29dc74fb33 Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Mon, 21 Feb 2022 20:17:05 +0530
Subject: [PATCH 06/14] fix: JobCard TimeLog to_date (#29872) (#29919)
(cherry picked from commit e4c4dc402e75d3ec501095fa3e914553fcd07a4d)
Co-authored-by: Sagar Sharma
---
erpnext/manufacturing/doctype/job_card/job_card.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py
index e6090ba02a2..3c406156ebd 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card.py
@@ -62,7 +62,7 @@ class JobCard(Document):
if self.get('time_logs'):
for d in self.get('time_logs'):
- if get_datetime(d.from_time) > get_datetime(d.to_time):
+ if d.to_time and get_datetime(d.from_time) > get_datetime(d.to_time):
frappe.throw(_("Row {0}: From time must be less than to time").format(d.idx))
data = self.get_overlap_for(d)
From 233a75a438d99774ab4ce30d7b67dae3acea9708 Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Mon, 21 Feb 2022 23:10:20 +0530
Subject: [PATCH 07/14] fix(LMS): program enrollment does not give any feedback
(backport #29922) (#29924)
Co-authored-by: Rucha Mahabal
---
erpnext/www/lms/macros/hero.html | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/erpnext/www/lms/macros/hero.html b/erpnext/www/lms/macros/hero.html
index e72bfc8175b..95ba8f7df28 100644
--- a/erpnext/www/lms/macros/hero.html
+++ b/erpnext/www/lms/macros/hero.html
@@ -11,7 +11,7 @@
{% if frappe.session.user == 'Guest' %}
{{_('Sign Up')}}
{% elif not has_access %}
-
+
{% endif %}
@@ -20,34 +20,35 @@
From 0f101b52097d2681d475d2ccc0cc68dd3735ee31 Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Tue, 22 Feb 2022 11:56:56 +0530
Subject: [PATCH 08/14] fix(Salary Slip): TypeError while clearing any amount
field in components (backport #29931) (#29932)
Co-authored-by: Rucha Mahabal
---
erpnext/payroll/doctype/salary_slip/salary_slip.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/erpnext/payroll/doctype/salary_slip/salary_slip.py b/erpnext/payroll/doctype/salary_slip/salary_slip.py
index 8ea791f620f..e70c5116bed 100644
--- a/erpnext/payroll/doctype/salary_slip/salary_slip.py
+++ b/erpnext/payroll/doctype/salary_slip/salary_slip.py
@@ -1265,7 +1265,7 @@ class SalarySlip(TransactionBase):
for i, earning in enumerate(self.earnings):
if earning.salary_component == salary_component:
self.earnings[i].amount = wages_amount
- self.gross_pay += self.earnings[i].amount
+ self.gross_pay += flt(self.earnings[i].amount, earning.precision("amount"))
self.net_pay = flt(self.gross_pay) - flt(self.total_deduction)
def compute_year_to_date(self):
From 6539d32ca90e44a9abfd04b36fc998c4cb9c9ece Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Tue, 22 Feb 2022 13:01:31 +0530
Subject: [PATCH 09/14] fix: Fetch conversion factor even if it already existed
in row, on item change (#29917) (#29935)
* fix: Fetch conversion factor even if it already existed in row, on item change
* fix: Retain manually changed conversion factor
- If item code changes, reset conversion factor on client side
- Keep API behavious consistent, if conversion factor is sent, same must come back
- API should not ideally reset values in most cases
(cherry picked from commit 235fc127b3ecf943176ed9c208425f9bda100798)
Co-authored-by: Marica
---
erpnext/public/js/controllers/transaction.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index e742ae9a890..4801b333df9 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -525,6 +525,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
item.weight_per_unit = 0;
item.weight_uom = '';
+ item.conversion_factor = 0;
if(['Sales Invoice'].includes(this.frm.doc.doctype)) {
update_stock = cint(me.frm.doc.update_stock);
From 2e6a076f902846c1b06eb9876cb080a7dcf67524 Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Mon, 21 Feb 2022 12:41:08 +0530
Subject: [PATCH 10/14] fix(asset): no. of depreciation booked cannot be equal
to total no. of depreciations
(cherry picked from commit c5808543c83ea43f62784331fb7c513543e454f0)
---
erpnext/assets/doctype/asset/asset.py | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index a4f5eb4d92d..fb48712c825 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -418,11 +418,12 @@ class Asset(AccountsController):
def validate_asset_finance_books(self, row):
if flt(row.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
frappe.throw(_("Row {0}: Expected Value After Useful Life must be less than Gross Purchase Amount")
- .format(row.idx))
+ .format(row.idx), title=_("Invalid Schedule"))
if not row.depreciation_start_date:
if not self.available_for_use_date:
- frappe.throw(_("Row {0}: Depreciation Start Date is required").format(row.idx))
+ frappe.throw(_("Row {0}: Depreciation Start Date is required")
+ .format(row.idx), title=_("Invalid Schedule"))
row.depreciation_start_date = get_last_day(self.available_for_use_date)
if not self.is_existing_asset:
@@ -440,8 +441,9 @@ class Asset(AccountsController):
else:
self.number_of_depreciations_booked = 0
- if cint(self.number_of_depreciations_booked) > cint(row.total_number_of_depreciations):
- frappe.throw(_("Number of Depreciations Booked cannot be greater than Total Number of Depreciations"))
+ if flt(row.total_number_of_depreciations) <= cint(self.number_of_depreciations_booked):
+ frappe.throw(_("Row {0}: Total Number of Depreciations cannot be less than or equal to Number of Depreciations Booked")
+ .format(row.idx), title=_("Invalid Schedule"))
if row.depreciation_start_date and getdate(row.depreciation_start_date) < getdate(self.purchase_date):
frappe.throw(_("Depreciation Row {0}: Next Depreciation Date cannot be before Purchase Date")
From b6d42ff571b5be2f0fff44e3576753591d8acb80 Mon Sep 17 00:00:00 2001
From: Saqib Ansari
Date: Mon, 21 Feb 2022 12:45:52 +0530
Subject: [PATCH 11/14] test: number_of_depr_booked = total_number_of_depr
(cherry picked from commit 780694f6e2d686ca7d037556a52e097802814266)
---
erpnext/assets/doctype/asset/test_asset.py | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index a15a1b6f388..6afd6dab264 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -820,8 +820,9 @@ class TestDepreciationBasics(AssetSetup):
self.assertRaises(frappe.ValidationError, asset.save)
def test_number_of_depreciations(self):
- """Tests if an error is raised when number_of_depreciations_booked > total_number_of_depreciations."""
+ """Tests if an error is raised when number_of_depreciations_booked >= total_number_of_depreciations."""
+ # number_of_depreciations_booked > total_number_of_depreciations
asset = create_asset(
item_code = "Macbook Pro",
calculate_depreciation = 1,
@@ -836,6 +837,21 @@ class TestDepreciationBasics(AssetSetup):
self.assertRaises(frappe.ValidationError, asset.save)
+ # number_of_depreciations_booked = total_number_of_depreciations
+ asset_2 = create_asset(
+ item_code = "Macbook Pro",
+ calculate_depreciation = 1,
+ available_for_use_date = "2019-12-31",
+ total_number_of_depreciations = 5,
+ expected_value_after_useful_life = 10000,
+ depreciation_start_date = "2020-07-01",
+ opening_accumulated_depreciation = 10000,
+ number_of_depreciations_booked = 5,
+ do_not_save = 1
+ )
+
+ self.assertRaises(frappe.ValidationError, asset_2.save)
+
def test_depreciation_start_date_is_before_purchase_date(self):
asset = create_asset(
item_code = "Macbook Pro",
From 807997c6ecb183172a513b17062426c0fad39092 Mon Sep 17 00:00:00 2001
From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com>
Date: Tue, 22 Feb 2022 18:20:59 +0530
Subject: [PATCH 12/14] fix: remove customer field value when MR is not
customer provided (#29938) (#29941)
(cherry picked from commit 7f55226a5807645db4f93c8038f1cc03a6fc0ce6)
Co-authored-by: Ankush Menat
---
.../stock/doctype/material_request/material_request.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index bdbf5e47f03..50d43171f80 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -57,14 +57,13 @@ class MaterialRequest(BuyingController):
if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):
frappe.throw(_("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(actual_so_qty - already_indented, item, so_no))
- # Validate
- # ---------------------
def validate(self):
super(MaterialRequest, self).validate()
self.validate_schedule_date()
self.check_for_on_hold_or_closed_status('Sales Order', 'sales_order')
self.validate_uom_is_integer("uom", "qty")
+ self.validate_material_request_type()
if not self.status:
self.status = "Draft"
@@ -84,6 +83,12 @@ class MaterialRequest(BuyingController):
self.reset_default_field_value("set_warehouse", "items", "warehouse")
self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
+ def validate_material_request_type(self):
+ """ Validate fields in accordance with selected type """
+
+ if self.material_request_type != "Customer Provided":
+ self.customer = None
+
def set_title(self):
'''Set title as comma separated list of items'''
if not self.title:
From 46ed9a059c9384b65500cc28c19eef5f2c50a70a Mon Sep 17 00:00:00 2001
From: Subin Tom
Date: Tue, 22 Feb 2022 17:20:48 +0530
Subject: [PATCH 13/14] fix: Taxjar minor fixes
(cherry picked from commit 1682a26fe69b9b3fa64293e692e79a553b842ca2)
---
.../taxjar_integration.py | 46 +++++++++++--------
1 file changed, 27 insertions(+), 19 deletions(-)
diff --git a/erpnext/erpnext_integrations/taxjar_integration.py b/erpnext/erpnext_integrations/taxjar_integration.py
index a4e21579e32..14c86d56328 100644
--- a/erpnext/erpnext_integrations/taxjar_integration.py
+++ b/erpnext/erpnext_integrations/taxjar_integration.py
@@ -8,10 +8,6 @@ from frappe.utils import cint, flt
from erpnext import get_default_company, get_region
-TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
-SHIP_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "shipping_account_head")
-TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
-TAXJAR_CALCULATE_TAX = frappe.db.get_single_value("TaxJar Settings", "taxjar_calculate_tax")
SUPPORTED_COUNTRY_CODES = ["AT", "AU", "BE", "BG", "CA", "CY", "CZ", "DE", "DK", "EE", "ES", "FI",
"FR", "GB", "GR", "HR", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "NL", "PL", "PT", "RO",
"SE", "SI", "SK", "US"]
@@ -35,12 +31,14 @@ def get_client():
if api_key and api_url:
client = taxjar.Client(api_key=api_key, api_url=api_url)
client.set_api_config('headers', {
- 'x-api-version': '2020-08-07'
+ 'x-api-version': '2022-01-24'
})
return client
def create_transaction(doc, method):
+ TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
+
"""Create an order transaction in TaxJar"""
if not TAXJAR_CREATE_TRANSACTIONS:
@@ -51,6 +49,7 @@ def create_transaction(doc, method):
if not client:
return
+ TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
sales_tax = sum([tax.tax_amount for tax in doc.taxes if tax.account_head == TAX_ACCOUNT_HEAD])
if not sales_tax:
@@ -79,6 +78,7 @@ def create_transaction(doc, method):
def delete_transaction(doc, method):
"""Delete an existing TaxJar order transaction"""
+ TAXJAR_CREATE_TRANSACTIONS = frappe.db.get_single_value("TaxJar Settings", "taxjar_create_transactions")
if not TAXJAR_CREATE_TRANSACTIONS:
return
@@ -92,6 +92,8 @@ def delete_transaction(doc, method):
def get_tax_data(doc):
+ SHIP_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "shipping_account_head")
+
from_address = get_company_address_details(doc)
from_shipping_state = from_address.get("state")
from_country_code = frappe.db.get_value("Country", from_address.country, "code")
@@ -113,20 +115,20 @@ def get_tax_data(doc):
to_shipping_state = get_state_code(to_address, 'Shipping')
tax_dict = {
- 'from_country': from_country_code,
- 'from_zip': from_address.pincode,
- 'from_state': from_shipping_state,
- 'from_city': from_address.city,
- 'from_street': from_address.address_line1,
- 'to_country': to_country_code,
- 'to_zip': to_address.pincode,
- 'to_city': to_address.city,
- 'to_street': to_address.address_line1,
- 'to_state': to_shipping_state,
- 'shipping': shipping,
- 'amount': doc.net_total,
- 'plugin': 'erpnext',
- 'line_items': line_items
+ "from_country": from_country_code,
+ "from_zip": from_address.pincode,
+ "from_state": from_shipping_state,
+ "from_city": from_address.city,
+ "from_street": from_address.address_line1,
+ "to_country": to_country_code,
+ "to_zip": to_address.pincode,
+ "to_city": to_address.city,
+ "to_street": to_address.address_line1,
+ "to_state": to_shipping_state,
+ "shipping": shipping,
+ "amount": doc.net_total,
+ "plugin": "erpnext",
+ "line_items": line_items
}
return tax_dict
@@ -156,6 +158,9 @@ def get_line_item_dict(item, docstatus):
return tax_dict
def set_sales_tax(doc, method):
+ TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
+ TAXJAR_CALCULATE_TAX = frappe.db.get_single_value("TaxJar Settings", "taxjar_calculate_tax")
+
if not TAXJAR_CALCULATE_TAX:
return
@@ -206,6 +211,7 @@ def set_sales_tax(doc, method):
doc.run_method("calculate_taxes_and_totals")
def check_for_nexus(doc, tax_dict):
+ TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
if not frappe.db.get_value('TaxJar Nexus', {'region_code': tax_dict["to_state"]}):
for item in doc.get("items"):
item.tax_collectable = flt(0)
@@ -218,6 +224,8 @@ def check_for_nexus(doc, tax_dict):
def check_sales_tax_exemption(doc):
# if the party is exempt from sales tax, then set all tax account heads to zero
+ TAX_ACCOUNT_HEAD = frappe.db.get_single_value("TaxJar Settings", "tax_account_head")
+
sales_tax_exempted = hasattr(doc, "exempt_from_sales_tax") and doc.exempt_from_sales_tax \
or frappe.db.has_column("Customer", "exempt_from_sales_tax") \
and frappe.db.get_value("Customer", doc.customer, "exempt_from_sales_tax")
From cebe8888af49f4540da5633334ecd87baf542344 Mon Sep 17 00:00:00 2001
From: Suraj Shetty
Date: Wed, 23 Feb 2022 10:54:44 +0530
Subject: [PATCH 14/14] fix: Email translations
(cherry picked from commit aaa84a21ba8c1749735c6510c5f311c3db505aef)
---
erpnext/translations/de.csv | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv
index d46ffb56096..6e70bc579e7 100644
--- a/erpnext/translations/de.csv
+++ b/erpnext/translations/de.csv
@@ -3726,7 +3726,7 @@ Earliest Age,Frühestes Alter,
Edit Details,Details bearbeiten,
Edit Profile,Profil bearbeiten,
Either GST Transporter ID or Vehicle No is required if Mode of Transport is Road,Bei Straßentransport ist entweder die GST-Transporter-ID oder die Fahrzeug-Nr. Erforderlich,
-Email,Email,
+Email,E-Mail,
Email Campaigns,E-Mail-Kampagnen,
Employee ID is linked with another instructor,Die Mitarbeiter-ID ist mit einem anderen Ausbilder verknüpft,
Employee Tax and Benefits,Mitarbeitersteuern und -leistungen,
@@ -6481,7 +6481,7 @@ Select Users,Wählen Sie Benutzer aus,
Send Emails At,Die E-Mails senden um,
Reminder,Erinnerung,
Daily Work Summary Group User,Tägliche Arbeit Zusammenfassung Gruppenbenutzer,
-email,Email,
+email,E-Mail,
Parent Department,Elternabteilung,
Leave Block List,Urlaubssperrenliste,
Days for which Holidays are blocked for this department.,"Tage, an denen eine Urlaubssperre für diese Abteilung gilt.",