Merge pull request #35346 from nabinhait/account-closing-balance-patch-fix
fix: account closing balance patch
diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
index ad3477e..1f2d980 100644
--- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
+++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py
@@ -302,7 +302,7 @@
"docstatus": 1,
}
- if not tax_details.get("consider_party_ledger_amount") and doctype != "Sales Invoice":
+ if doctype != "Sales Invoice":
filters.update(
{"apply_tds": 1, "tax_withholding_category": tax_details.get("tax_withholding_category")}
)
diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
index 1e86cf5..bc4f670 100644
--- a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
+++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py
@@ -110,9 +110,9 @@
invoices.append(pi1)
# Cumulative threshold is 30000
- # Threshold calculation should be on both the invoices
- # TDS should be applied only on 1000
- self.assertEqual(pi1.taxes[0].tax_amount, 1000)
+ # Threshold calculation should be only on the Second invoice
+ # Second didn't breach, no TDS should be applied
+ self.assertEqual(pi1.taxes, [])
for d in reversed(invoices):
d.cancel()
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index 203612f..f3a9ba0 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -691,7 +691,7 @@
)
self.assertEqual(asset.status, "Draft")
- expected_schedules = [["2032-12-31", 30000.0, 77095.89], ["2033-06-06", 12904.11, 90000.0]]
+ expected_schedules = [["2032-12-31", 42904.11, 90000.0]]
schedules = [
[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
for d in get_depr_schedule(asset.name, "Draft")
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
index 116593a..ad5ec3d 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
@@ -337,7 +337,7 @@
depreciation_amount += value_after_depreciation - row.expected_value_after_useful_life
skip_row = True
- if depreciation_amount > 0:
+ if flt(depreciation_amount, asset_doc.precision("gross_purchase_amount")) > 0:
self.add_depr_schedule_row(
schedule_date,
depreciation_amount,
@@ -521,9 +521,11 @@
)
# if the Depreciation Schedule is being prepared for the first time
else:
- return (flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)) / flt(
- row.total_number_of_depreciations
- )
+ return (
+ flt(asset.gross_purchase_amount)
+ - flt(asset.opening_accumulated_depreciation)
+ - flt(row.expected_value_after_useful_life)
+ ) / flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked)
def get_wdv_or_dd_depr_amount(
diff --git a/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py b/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
index e37f291..64170ed 100644
--- a/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
+++ b/erpnext/patches/v13_0/update_amt_in_work_order_required_items.py
@@ -7,4 +7,6 @@
frappe.reload_doc("manufacturing", "doctype", "work_order")
frappe.reload_doc("manufacturing", "doctype", "work_order_item")
- frappe.db.sql("""UPDATE `tabWork Order Item` SET amount = rate * required_qty""")
+ frappe.db.sql(
+ """UPDATE `tabWork Order Item` SET amount = ifnull(rate, 0.0) * ifnull(required_qty, 0.0)"""
+ )
diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js
index d943126..47b88a0 100644
--- a/erpnext/public/js/controllers/accounts.js
+++ b/erpnext/public/js/controllers/accounts.js
@@ -91,6 +91,12 @@
});
frappe.ui.form.on('Purchase Invoice', {
+ setup: (frm) => {
+ frm.make_methods = {
+ 'Landed Cost Voucher': function () { frm.trigger('create_landedcost_voucher') },
+ }
+ },
+
mode_of_payment: function(frm) {
get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
frm.set_value('cash_bank_account', account);
@@ -99,6 +105,20 @@
payment_terms_template: function() {
cur_frm.trigger("disable_due_date");
+ },
+
+ create_landedcost_voucher: function (frm) {
+ let lcv = frappe.model.get_new_doc('Landed Cost Voucher');
+ lcv.company = frm.doc.company;
+
+ let lcv_receipt = frappe.model.get_new_doc('Landed Cost Purchase Invoice');
+ lcv_receipt.receipt_document_type = 'Purchase Invoice';
+ lcv_receipt.receipt_document = frm.doc.name;
+ lcv_receipt.supplier = frm.doc.supplier;
+ lcv_receipt.grand_total = frm.doc.grand_total;
+ lcv.purchase_receipts = [lcv_receipt];
+
+ frappe.set_route("Form", lcv.doctype, lcv.name);
}
});
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 693fc92..61969fe 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -288,7 +288,7 @@
)
# sales team
- for d in customer.get("sales_team"):
+ for d in customer.get("sales_team") or []:
target.append(
"sales_team",
{
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index 46d6e9e..74927c7 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -29,6 +29,7 @@
self.validate_for_qty()
def before_save(self):
+ self.update_status()
self.set_item_locations()
# set percentage picked in SO
@@ -89,20 +90,20 @@
self.update_reference_qty()
self.update_sales_order_picking_status()
- def update_status(self, status=None, update_modified=True):
+ def update_status(self, status=None):
if not status:
if self.docstatus == 0:
status = "Draft"
elif self.docstatus == 1:
- if self.status == "Draft":
- status = "Open"
- elif target_document_exists(self.name, self.purpose):
+ if target_document_exists(self.name, self.purpose):
status = "Completed"
+ else:
+ status = "Open"
elif self.docstatus == 2:
status = "Cancelled"
if status:
- frappe.db.set_value("Pick List", self.name, "status", status, update_modified=update_modified)
+ self.db_set("status", status)
def update_reference_qty(self):
packed_items = []
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index fb52697..10654dd 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -256,8 +256,6 @@
if isinstance(args, str):
args = json.loads(args)
- voucher_no = args.get("voucher_no") or args.get("name")
-
in_rate = None
if (args.get("serial_no") or "").strip():
in_rate = get_avg_purchase_rate(args.get("serial_no"))
@@ -280,12 +278,13 @@
in_rate = (
_get_fifo_lifo_rate(previous_stock_queue, args.get("qty") or 0, valuation_method)
if previous_stock_queue
- else 0
+ else None
)
elif valuation_method == "Moving Average":
- in_rate = previous_sle.get("valuation_rate") or 0
+ in_rate = previous_sle.get("valuation_rate")
if in_rate is None:
+ voucher_no = args.get("voucher_no") or args.get("name")
in_rate = get_valuation_rate(
args.get("item_code"),
args.get("warehouse"),
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js
index 45289b1..4bf008a 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js
@@ -76,26 +76,14 @@
}
});
- let batch_no_field = frm.get_docfield("items", "batch_no");
+ let batch_no_field = frm.get_docfield('items', 'batch_no');
if (batch_no_field) {
batch_no_field.get_route_options_for_new_doc = function(row) {
return {
- "item": row.doc.item_code
+ 'item': row.doc.item_code
}
};
}
-
- frappe.db.get_single_value('Buying Settings', 'backflush_raw_materials_of_subcontract_based_on').then(val => {
- if (val == 'Material Transferred for Subcontract') {
- frm.fields_dict['supplied_items'].grid.grid_rows.forEach((grid_row) => {
- grid_row.docfields.forEach((df) => {
- if (df.fieldname == 'consumed_qty') {
- df.read_only = 0;
- }
- });
- });
- }
- });
},
refresh: (frm) => {
@@ -157,6 +145,8 @@
}
});
}, __('Get Items From'));
+
+ frm.fields_dict.supplied_items.grid.update_docfield_property('consumed_qty', 'read_only', frm.doc.__onload && frm.doc.__onload.backflush_based_on === 'BOM');
}
},
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
index 2c84262..416f4f8 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py
@@ -28,6 +28,14 @@
},
]
+ def onload(self):
+ self.set_onload(
+ "backflush_based_on",
+ frappe.db.get_single_value(
+ "Buying Settings", "backflush_raw_materials_of_subcontract_based_on"
+ ),
+ )
+
def update_status_updater_args(self):
if cint(self.is_return):
self.status_updater.extend(