From 5764d1d173d8c8016049ee6d39bba5d7d20c8245 Mon Sep 17 00:00:00 2001 From: Mohd Haris Date: Tue, 28 Jul 2026 13:04:31 +0530 Subject: [PATCH 01/82] fix: prevent TimestampMismatchError resolving Dunning with multiple overdue installments `get_linked_dunnings_as_per_state` joins Dunning to its Overdue Payment child table without DISTINCT. When a Sales Invoice has more than one overdue installment, its Dunning holds one Overdue Payment row per installment, so the query returns the same Dunning name once per row. `update_linked_dunnings` then loads that Dunning name into a separate document object for each duplicate row and saves each one. The first save bumps the `modified` timestamp, so the second (now stale) save fails with `TimestampMismatchError` ("Document has been modified after you have opened it"). The error is raised on the Dunning while the user is submitting a Payment Entry, making it confusing, and payments for such invoices cannot be posted at all. Add DISTINCT so each linked Dunning is returned (and saved) exactly once. Co-Authored-By: Claude Opus 4.8 (cherry picked from commit 06bfc23436432c054c32aa86ece03d64e8dbbd27) --- erpnext/accounts/doctype/dunning/dunning.py | 1 + .../accounts/doctype/dunning/test_dunning.py | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/erpnext/accounts/doctype/dunning/dunning.py b/erpnext/accounts/doctype/dunning/dunning.py index 70cdb99ae1d..508294161a3 100644 --- a/erpnext/accounts/doctype/dunning/dunning.py +++ b/erpnext/accounts/doctype/dunning/dunning.py @@ -275,6 +275,7 @@ def get_linked_dunnings_as_per_state(sales_invoice, state): .join(overdue_payment) .on(overdue_payment.parent == dunning.name) .select(dunning.name) + .distinct() .where( (dunning.status == state) & (dunning.docstatus != 2) diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py index 6eaf1d8798e..47cd0afe5d3 100644 --- a/erpnext/accounts/doctype/dunning/test_dunning.py +++ b/erpnext/accounts/doctype/dunning/test_dunning.py @@ -122,6 +122,41 @@ class TestDunning(ERPNextTestSuite): self.assertEqual(sales_invoice.status, "Overdue") self.assertEqual(dunning.status, "Unresolved") + def test_payment_against_invoice_with_multiple_overdue_installments_in_dunning(self): + """ + When an invoice has more than one overdue installment, its Dunning holds one + Overdue Payment row per installment. Submitting a Payment Entry for the invoice + must resolve the Dunning without raising a TimestampMismatchError caused by the + same Dunning being loaded and saved more than once. + """ + create_payment_terms_template_for_dunning() + # Post far enough in the past that BOTH installments (5 and 10 credit days) are overdue. + sales_invoice = create_sales_invoice_against_cost_center( + posting_date=add_days(today(), -15), + qty=1, + rate=100, + do_not_submit=True, + ) + sales_invoice.payment_terms_template = "_Test 50-50 for Dunning" + sales_invoice.submit() + + dunning = create_dunning_from_sales_invoice(sales_invoice.name) + # Two overdue installments -> two overdue payment rows for the same invoice. + self.assertEqual(len(dunning.overdue_payments), 2) + dunning.submit() + self.assertEqual(dunning.status, "Unresolved") + + # Pay the invoice in full. This previously raised TimestampMismatchError on the Dunning. + pe = get_payment_entry("Sales Invoice", sales_invoice.name) + pe.reference_no, pe.reference_date = "3", nowdate() + pe.insert() + pe.submit() + + sales_invoice.reload() + dunning.reload() + self.assertEqual(sales_invoice.outstanding_amount, 0) + self.assertEqual(dunning.status, "Resolved") + def test_dunning_resolution_from_credit_note(self): """ Test that dunning is resolved when a credit note is issued against the original invoice. From 6bee70596bc2776dc6a0c799edb60f86c10344ac Mon Sep 17 00:00:00 2001 From: ljain112 Date: Mon, 6 Jul 2026 17:37:09 +0530 Subject: [PATCH 02/82] refactor: move functionality in postprocess for mapped doc (cherry picked from commit 0691c7c7bc6c23bb05ed764d01192ff733da72fb) # Conflicts: # erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py --- .../subcontracting_inward_order.py | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py index 9687a070bda..1b225db401c 100644 --- a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py +++ b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py @@ -345,6 +345,26 @@ class SubcontractingInwardOrder(SubcontractingController): if target_doc and target_doc.get("items"): target_doc.items = [] + def postprocess(source, target): + target.purpose = "Receive from Customer" + target.subcontracting_inward_order = source.name + target.set_stock_entry_type() + + for rm_item in source.received_items: + if not rm_item.required_qty or not rm_item.is_customer_provided_item: + continue + + target.append( + "items", + { + "scio_detail": rm_item.get("name"), + "item_code": rm_item.get("rm_item_code"), + "qty": calculate_qty_as_per_bom(rm_item), + "t_warehouse": rm_item.get("warehouse"), + "stock_uom": rm_item.get("stock_uom"), + }, + ) + stock_entry = get_mapped_doc( "Subcontracting Inward Order", self.name, @@ -357,9 +377,11 @@ class SubcontractingInwardOrder(SubcontractingController): }, }, target_doc, + postprocess=postprocess, ignore_child_tables=True, ) +<<<<<<< HEAD stock_entry.purpose = "Receive from Customer" stock_entry.subcontracting_inward_order = self.name @@ -380,6 +402,8 @@ class SubcontractingInwardOrder(SubcontractingController): stock_entry.add_to_stock_entry_detail(items_dict) +======= +>>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -390,6 +414,27 @@ class SubcontractingInwardOrder(SubcontractingController): if target_doc and target_doc.get("items"): target_doc.items = [] + def postprocess(source, target): + target.purpose = "Return Raw Material to Customer" + target.subcontracting_inward_order = source.name + target.set_stock_entry_type() + + for rm_item in source.received_items: + qty = rm_item.received_qty - rm_item.work_order_qty - rm_item.returned_qty + if not qty: + continue + + target.append( + "items", + { + "scio_detail": rm_item.get("name"), + "item_code": rm_item.get("rm_item_code"), + "qty": qty, + "s_warehouse": rm_item.get("warehouse"), + "stock_uom": rm_item.get("stock_uom"), + }, + ) + stock_entry = get_mapped_doc( "Subcontracting Inward Order", self.name, @@ -402,9 +447,11 @@ class SubcontractingInwardOrder(SubcontractingController): }, }, target_doc, + postprocess=postprocess, ignore_child_tables=True, ) +<<<<<<< HEAD stock_entry.purpose = "Return Raw Material to Customer" stock_entry.set_stock_entry_type() stock_entry.subcontracting_inward_order = self.name @@ -421,6 +468,8 @@ class SubcontractingInwardOrder(SubcontractingController): stock_entry.add_to_stock_entry_detail(items_dict) +======= +>>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -431,6 +480,58 @@ class SubcontractingInwardOrder(SubcontractingController): if target_doc and target_doc.get("items"): target_doc.items = [] + def postprocess(source, target): + target.purpose = "Subcontracting Delivery" + target.subcontracting_inward_order = source.name + target.set_stock_entry_type() + + scio_details = [] + allow_over = frappe.get_single_value("Selling Settings", "allow_delivery_of_overproduced_qty") + for fg_item in source.items: + qty = ( + fg_item.produced_qty + if allow_over + else min(fg_item.qty, fg_item.produced_qty) - fg_item.delivered_qty + ) + if qty < 0: + continue + + scio_details.append(fg_item.name) + target.append( + "items", + { + "qty": qty, + "item_code": fg_item.item_code, + "s_warehouse": fg_item.delivery_warehouse, + "stock_uom": fg_item.stock_uom, + "scio_detail": fg_item.name, + "is_finished_item": 1, + }, + ) + + if ( + frappe.get_single_value("Selling Settings", "deliver_secondary_items") + and source.secondary_items + and scio_details + ): + for secondary_item in source.secondary_items: + if secondary_item.reference_name not in scio_details: + continue + + qty = secondary_item.produced_qty - secondary_item.delivered_qty + if qty > 0: + target.append( + "items", + { + "qty": qty, + "item_code": secondary_item.item_code, + "s_warehouse": secondary_item.warehouse, + "stock_uom": secondary_item.stock_uom, + "scio_detail": secondary_item.name, + "secondary_item_type": secondary_item.secondary_item_type, + }, + ) + stock_entry = get_mapped_doc( "Subcontracting Inward Order", self.name, @@ -443,9 +544,11 @@ class SubcontractingInwardOrder(SubcontractingController): }, }, target_doc, + postprocess=postprocess, ignore_child_tables=True, ) +<<<<<<< HEAD stock_entry.purpose = "Subcontracting Delivery" stock_entry.set_stock_entry_type() stock_entry.subcontracting_inward_order = self.name @@ -499,6 +602,8 @@ class SubcontractingInwardOrder(SubcontractingController): stock_entry.add_to_stock_entry_detail(items_dict) +======= +>>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -509,6 +614,26 @@ class SubcontractingInwardOrder(SubcontractingController): if target_doc and target_doc.get("items"): target_doc.items = [] + def postprocess(source, target): + target.purpose = "Subcontracting Return" + target.set_stock_entry_type() + + for fg_item in source.items: + qty = fg_item.delivered_qty - fg_item.returned_qty + if qty < 0: + continue + + target.append( + "items", + { + "qty": qty, + "item_code": fg_item.item_code, + "stock_uom": fg_item.stock_uom, + "scio_detail": fg_item.name, + "is_finished_item": 1, + }, + ) + stock_entry = get_mapped_doc( "Subcontracting Inward Order", self.name, @@ -522,9 +647,11 @@ class SubcontractingInwardOrder(SubcontractingController): }, }, target_doc, + postprocess=postprocess, ignore_child_tables=True, ) +<<<<<<< HEAD stock_entry.purpose = "Subcontracting Return" stock_entry.set_stock_entry_type() @@ -544,6 +671,8 @@ class SubcontractingInwardOrder(SubcontractingController): stock_entry.add_to_stock_entry_detail(items_dict) +======= +>>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: From 3141387949201dcb9593ec6ee92f0413ac445b73 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Wed, 5 Aug 2026 12:33:01 +0530 Subject: [PATCH 03/82] chore: resolve conflicts --- .../subcontracting_inward_order.py | 120 ------------------ 1 file changed, 120 deletions(-) diff --git a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py index 1b225db401c..d6ec3219684 100644 --- a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py +++ b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py @@ -381,29 +381,6 @@ class SubcontractingInwardOrder(SubcontractingController): ignore_child_tables=True, ) -<<<<<<< HEAD - stock_entry.purpose = "Receive from Customer" - stock_entry.subcontracting_inward_order = self.name - - stock_entry.set_stock_entry_type() - - for rm_item in self.received_items: - if not rm_item.required_qty or not rm_item.is_customer_provided_item: - continue - - items_dict = { - rm_item.get("rm_item_code"): { - "scio_detail": rm_item.get("name"), - "qty": calculate_qty_as_per_bom(rm_item), - "to_warehouse": rm_item.get("warehouse"), - "stock_uom": rm_item.get("stock_uom"), - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - -======= ->>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -451,25 +428,6 @@ class SubcontractingInwardOrder(SubcontractingController): ignore_child_tables=True, ) -<<<<<<< HEAD - stock_entry.purpose = "Return Raw Material to Customer" - stock_entry.set_stock_entry_type() - stock_entry.subcontracting_inward_order = self.name - - for rm_item in self.received_items: - items_dict = { - rm_item.get("rm_item_code"): { - "scio_detail": rm_item.get("name"), - "qty": rm_item.received_qty - rm_item.work_order_qty - rm_item.returned_qty, - "from_warehouse": rm_item.get("warehouse"), - "stock_uom": rm_item.get("stock_uom"), - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - -======= ->>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -548,62 +506,6 @@ class SubcontractingInwardOrder(SubcontractingController): ignore_child_tables=True, ) -<<<<<<< HEAD - stock_entry.purpose = "Subcontracting Delivery" - stock_entry.set_stock_entry_type() - stock_entry.subcontracting_inward_order = self.name - scio_details = [] - - allow_over = frappe.get_single_value("Selling Settings", "allow_delivery_of_overproduced_qty") - for fg_item in self.items: - qty = ( - fg_item.produced_qty - if allow_over - else min(fg_item.qty, fg_item.produced_qty) - fg_item.delivered_qty - ) - if qty < 0: - continue - - scio_details.append(fg_item.name) - items_dict = { - fg_item.item_code: { - "qty": qty, - "from_warehouse": fg_item.delivery_warehouse, - "stock_uom": fg_item.stock_uom, - "scio_detail": fg_item.name, - "is_finished_item": 1, - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - - if ( - frappe.get_single_value("Selling Settings", "deliver_secondary_items") - and self.secondary_items - and scio_details - ): - secondary_items = [ - secondary_item - for secondary_item in self.secondary_items - if secondary_item.reference_name in scio_details - ] - for secondary_item in secondary_items: - qty = secondary_item.produced_qty - secondary_item.delivered_qty - if qty > 0: - items_dict = { - secondary_item.item_code: { - "qty": secondary_item.produced_qty - secondary_item.delivered_qty, - "from_warehouse": secondary_item.warehouse, - "stock_uom": secondary_item.stock_uom, - "scio_detail": secondary_item.name, - "type": secondary_item.type, - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - -======= ->>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: @@ -651,28 +553,6 @@ class SubcontractingInwardOrder(SubcontractingController): ignore_child_tables=True, ) -<<<<<<< HEAD - stock_entry.purpose = "Subcontracting Return" - stock_entry.set_stock_entry_type() - - for fg_item in self.items: - qty = fg_item.delivered_qty - fg_item.returned_qty - if qty < 0: - continue - - items_dict = { - fg_item.item_code: { - "qty": qty, - "stock_uom": fg_item.stock_uom, - "scio_detail": fg_item.name, - "is_finished_item": 1, - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - -======= ->>>>>>> 0691c7c7bc (refactor: move functionality in postprocess for mapped doc) if target_doc: return stock_entry else: From b412266e182e0c53c8700828a4bed7dc375c6d5f Mon Sep 17 00:00:00 2001 From: ljain112 Date: Wed, 5 Aug 2026 17:01:39 +0530 Subject: [PATCH 04/82] chore: resolve conflicts --- .../subcontracting_inward_order/subcontracting_inward_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py index d6ec3219684..69539f7b091 100644 --- a/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py +++ b/erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py @@ -486,7 +486,7 @@ class SubcontractingInwardOrder(SubcontractingController): "s_warehouse": secondary_item.warehouse, "stock_uom": secondary_item.stock_uom, "scio_detail": secondary_item.name, - "secondary_item_type": secondary_item.secondary_item_type, + "type": secondary_item.type, }, ) From 98bef1cac8c357e08d10fd3ad6e51c1e78e02618 Mon Sep 17 00:00:00 2001 From: ervishnucs Date: Wed, 5 Aug 2026 19:00:51 +0530 Subject: [PATCH 05/82] fix(assets): split FIFO/LIFO rate across grouped stock item rows (cherry picked from commit a05ec49062526d75fcb526fc543775e78dcb23d6) --- .../asset_capitalization.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py index 8bbec9e40df..5a7b9995f39 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py @@ -158,6 +158,8 @@ class AssetCapitalization(StockController): if d.meta.has_field(k) and (not d.get(k) or k in force_fields): d.set(k, v) + self.split_valuation_rate_for_grouped_stock_items() + for d in self.asset_items: args = self.as_dict() args.update(d.as_dict()) @@ -179,6 +181,30 @@ class AssetCapitalization(StockController): if d.meta.has_field(k) and (not d.get(k) or k in force_fields): d.set(k, v) + def split_valuation_rate_for_grouped_stock_items(self): + groups = {} + for d in self.stock_items: + if d.item_code and d.warehouse and not (d.serial_no or d.batch_no or d.serial_and_batch_bundle): + groups.setdefault((d.item_code, d.warehouse), []).append(d) + + for rows in groups.values(): + if len(rows) < 2: + continue + + cumulative_qty = 0.0 + prev_cumulative_value = 0.0 + for d in rows: + cumulative_qty += flt(d.stock_qty) + args = self.get_args_for_incoming_rate(d) + args["qty"] = -1 * cumulative_qty + cumulative_rate = flt(get_incoming_rate(args, raise_error_if_no_rate=False)) + cumulative_value = cumulative_rate * cumulative_qty + + row_value = cumulative_value - prev_cumulative_value + d.valuation_rate = flt(row_value / d.stock_qty) if flt(d.stock_qty) else 0.0 + d.amount = flt(flt(d.stock_qty) * d.valuation_rate, d.precision("amount")) + prev_cumulative_value = cumulative_value + def validate_target_item(self): target_item = frappe.get_cached_doc("Item", self.target_item_code) @@ -312,6 +338,8 @@ class AssetCapitalization(StockController): warehouse_details = get_warehouse_details(args) d.update(warehouse_details) + self.split_valuation_rate_for_grouped_stock_items() + @frappe.whitelist() def set_asset_values(self): for d in self.get("asset_items"): From c014e01144842863dafbefd4f3ac57f67b90d2aa Mon Sep 17 00:00:00 2001 From: ervishnucs Date: Wed, 5 Aug 2026 19:01:10 +0530 Subject: [PATCH 06/82] test(assets): cover grouped stock item rows splitting FIFO rate (cherry picked from commit 2cbc5b89d64c4afef35ad64b6f9db176f81a76e9) --- .../test_asset_capitalization.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py index e297fc94634..18b2c088d47 100644 --- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py @@ -400,6 +400,33 @@ class TestAssetCapitalization(ERPNextTestSuite): actual_gle = get_actual_gle_dict(asset_capitalization.name) self.assertEqual(actual_gle, {}) + def test_grouped_stock_item_rows_split_fifo_rate(self): + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + company = "_Test Company" + warehouse = create_warehouse("_Test Warehouse for Grouped FIFO Rows", company=company) + item = create_item( + "_Test Grouped FIFO Rows Item", is_stock_item=1, is_fixed_asset=0, is_purchase_item=1 + ) + target_item = create_fixed_asset_item("_Test Grouped FIFO Rows Target Item") + + make_purchase_receipt(item_code=item.item_code, qty=1, rate=100, company=company, warehouse=warehouse) + make_purchase_receipt(item_code=item.item_code, qty=1, rate=200, company=company, warehouse=warehouse) + + asset_capitalization = frappe.new_doc("Asset Capitalization") + asset_capitalization.company = company + asset_capitalization.target_item_code = target_item.name + asset_capitalization.append( + "stock_items", {"item_code": item.item_code, "warehouse": warehouse, "stock_qty": 1} + ) + asset_capitalization.append( + "stock_items", {"item_code": item.item_code, "warehouse": warehouse, "stock_qty": 1} + ) + asset_capitalization.insert() + + rates = [d.valuation_rate for d in asset_capitalization.stock_items] + self.assertEqual(rates, [100, 200]) + def create_asset_capitalization_data(): create_item("Capitalization Target Stock Item", is_stock_item=1, is_fixed_asset=0, is_purchase_item=0) From de06cb7f45dd28ce6893b12697104c409b06b70c Mon Sep 17 00:00:00 2001 From: soulxone Date: Tue, 11 Aug 2026 11:48:41 -0500 Subject: [PATCH 07/82] fix(Material Requirements Planning Report): detailed-view chart timescale The detailed-view chart collapsed every row into a single "today" column and was additionally capped at 10 points, so the chart never matched the report's date filters or the table data. Two causes in get_detailed_view_chart_data: 1. `row.deliver_date` was a typo for `row.delivery_date` (the name used everywhere else in this report). On a frappe._dict the missing attribute resolves to None, so `getdate(None)` returned today and the past-date filter silently compared every row against today instead of its own delivery date. 2. A hard `if i == 10: break` truncated the chart to 10 date buckets. Use the correct field name and drop the cap. The null check now runs before the date comparison, since `getdate(None)` returning today meant the original ordering could never filter a null delivery_date out. Fixes #52632 (cherry picked from commit 3c17a604be62cd192753ab266e679e26c88a1113) --- .../material_requirements_planning_report.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py index fc987d29f93..6831d75d542 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py @@ -268,22 +268,17 @@ class MaterialRequirementsPlanningReport: def get_detailed_view_chart_data(self, data): chart_data = frappe._dict({}) - i = 0 sorted_data = sorted(data, key=lambda x: getdate(x.get("delivery_date"))) for row in sorted_data: - if getdate(row.deliver_date) < getdate(today()): - continue - if not row.delivery_date: continue - if i == 10: - break + if getdate(row.delivery_date) < getdate(today()): + continue delivery_date = formatdate(row.delivery_date, "dd MMM") if delivery_date not in chart_data: - i += 1 chart_data[delivery_date] = frappe._dict( { "demand": 0.0, From 5b68db0156c02beb3bb51d88215dc30851392bee Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 12 Aug 2026 11:39:53 +0530 Subject: [PATCH 08/82] test(manufacturing): cover MRP chart date range (cherry picked from commit 592924cc0d382c2ecc9188fc2b16484a271fdaf8) # Conflicts: # erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py --- ...t_material_requirements_planning_report.py | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py new file mode 100644 index 00000000000..d91f44be985 --- /dev/null +++ b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py @@ -0,0 +1,205 @@ +# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import add_days, flt, formatdate, today + +from erpnext.accounts.doctype.tax_rule.test_tax_rule import make_tax_rule +from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom +from erpnext.manufacturing.report.material_requirements_planning_report.material_requirements_planning_report import ( + MaterialRequirementsPlanningReport, + execute, + get_item_lead_time, + make_order, +) +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.tests.utils import ERPNextTestSuite + +COMPANY = "_Test Company" +WAREHOUSE = "_Test Warehouse - _TC" +SUPPLIER = "_Test Supplier" +TAX_TEMPLATE = "_Test Purchase Taxes and Charges Template - _TC" + + +class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): + def test_detailed_chart_includes_full_date_range(self): + start_date = add_days(today(), 1) + delivery_dates = [add_days(start_date, offset) for offset in range(12)] + rows = [make_chart_row(delivery_date) for delivery_date in delivery_dates] + rows.append(make_chart_row(delivery_dates[-1], planned_qty=2)) + + chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) + + self.assertEqual( + chart["data"]["labels"], + [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], + ) + self.assertEqual(chart["data"]["datasets"][0]["values"], [1] * 11 + [3]) + + def test_detailed_chart_excludes_past_and_empty_delivery_dates(self): + delivery_dates = [today(), add_days(today(), 1)] + rows = [ + make_chart_row(add_days(today(), -1)), + make_chart_row(None), + *[make_chart_row(delivery_date) for delivery_date in delivery_dates], + ] + + chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) + + self.assertEqual( + chart["data"]["labels"], + [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], + ) + + def test_manufacture_lead_time_is_not_int_truncated(self): + """lead_time = 1440 / manufacturing_time_in_mins + buffer_time. Both columns are Int; + integer/integer division truncates on Postgres (1440/7 -> 205) while MariaDB yields a + decimal, so the computed lead time (and the derived release date) diverged by engine.""" + item = make_item("_Test MRP Lead Time Item", {"is_stock_item": 1}).name + frappe.get_doc( + { + "doctype": "Item Lead Time", + "item_code": item, + "manufacturing_time_in_mins": 7, + "buffer_time": 2, + } + ).insert() + + lead_time = get_item_lead_time(item, "Manufacture") + # 1440 / 7 + 2 = 207.714...; a truncating integer division on Postgres would give 207. + self.assertAlmostEqual(float(lead_time), 1440 / 7 + 2, places=2) + + def test_make_order_creates_draft_purchase_and_work_orders(self): + plan = make_mrp_plan(self) + + make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) + + purchase_order = get_created_order(plan.mps, "Purchase Order") + self.assertEqual(purchase_order.docstatus, 0) + self.assertEqual(purchase_order.supplier, SUPPLIER) + self.assertEqual([d.item_code for d in purchase_order.items], [plan.rm_item]) + self.assertEqual(purchase_order.items[0].qty, plan.planned_qty * plan.rm_qty) + + work_order = get_created_order(plan.mps, "Work Order") + self.assertEqual(work_order.docstatus, 0) + self.assertEqual(work_order.production_item, plan.fg_item) + self.assertEqual(work_order.bom_no, plan.bom) + self.assertEqual(work_order.qty, plan.planned_qty) + + def test_purchase_order_gets_defaults_from_set_missing_values(self): + plan = make_mrp_plan(self) + make_tax_rule(tax_type="Purchase", purchase_tax_template=TAX_TEMPLATE, priority=1, save=1) + frappe.get_doc( + { + "doctype": "Item Price", + "item_code": plan.rm_item, + "price_list": "Standard Buying", + "price_list_rate": 100, + } + ).insert() + + make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) + + purchase_order = get_created_order(plan.mps, "Purchase Order") + self.assertEqual(purchase_order.buying_price_list, "Standard Buying") + self.assertEqual(purchase_order.items[0].rate, 100) + template = frappe.get_doc("Purchase Taxes and Charges Template", TAX_TEMPLATE) + self.assertEqual(purchase_order.taxes_and_charges, TAX_TEMPLATE) + self.assertEqual([d.rate for d in purchase_order.taxes], [d.rate for d in template.taxes]) + + net_total = flt(purchase_order.net_total) + self.assertEqual( + purchase_order.grand_total, net_total + net_total * flt(template.taxes[0].rate) / 100 + ) + + +def make_chart_row(delivery_date, planned_qty=1): + return frappe._dict( + { + "delivery_date": delivery_date, + "planned_qty": planned_qty, + "in_hand_qty": 0, + "po_ordered_qty": 0, + "wo_ordered_qty": 0, + } + ) + + +def make_mrp_plan(test_case, planned_qty=10, rm_qty=2): + """Build a finished good with a submitted BOM and an MPS demanding it, then return the + report's own output rows -- the same payload the report's client sends to `make_order`.""" + rm_item = make_item( + properties={ + "is_stock_item": 1, + "is_purchase_item": 1, + "item_defaults": [ + {"company": COMPANY, "default_warehouse": WAREHOUSE, "default_supplier": SUPPLIER} + ], + } + ).name + fg_item = make_item( + properties={ + "is_stock_item": 1, + "item_defaults": [{"company": COMPANY, "default_warehouse": WAREHOUSE}], + } + ).name + + # on_submit sets Item.default_bom, which is how the report finds the raw materials + bom = make_bom(item=fg_item, raw_materials=[rm_item], rm_qty=rm_qty, rate=100).name + + mps = frappe.get_doc( + { + "doctype": "Master Production Schedule", + "company": COMPANY, + "posting_date": today(), + "from_date": today(), + "parent_warehouse": WAREHOUSE, + "items": [ + { + "item_code": fg_item, + "warehouse": WAREHOUSE, + "delivery_date": add_days(today(), 30), + "planned_qty": planned_qty, + "uom": frappe.get_cached_value("Item", fg_item, "stock_uom"), + } + ], + } + ) + # left in draft: on_submit enqueues MRP Log creation in a background job + mps.insert() + + _, data, _, _ = execute( + frappe._dict( + { + "company": COMPANY, + "from_date": today(), + "to_date": add_days(today(), 90), + "warehouse": WAREHOUSE, + "mps": mps.name, + "type_of_material": "All", + "add_safety_stock": 0, + } + ) + ) + + # the report separates each finished good with a blank row + rows = [row for row in data if row.get("item_code")] + test_case.assertTrue(rows, msg="the report returned no rows to create orders from") + + return frappe._dict( + rm_item=rm_item, + fg_item=fg_item, + bom=bom, + mps=mps.name, + planned_qty=planned_qty, + rm_qty=rm_qty, + rows=rows, + ) + + +def get_created_order(mps, doctype): + names = frappe.get_all(doctype, filters={"mps": mps}, pluck="name") + if len(names) != 1: + frappe.throw(f"Expected exactly one {doctype} for {mps}, got {names}") + + return frappe.get_doc(doctype, names[0]) From 1b37fd2edc4157c66ff86952547b9cb5eeb9dcb3 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 12 Aug 2026 12:28:13 +0530 Subject: [PATCH 09/82] fix(manufacturing): keep MRP chart dates distinct (cherry picked from commit 5ad085887d38136f3daf2797b2bde6735ecab85f) --- .../material_requirements_planning_report.py | 9 ++- ...t_material_requirements_planning_report.py | 61 ++++++++++++------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py index 6831d75d542..bc13afb2792 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py @@ -277,7 +277,7 @@ class MaterialRequirementsPlanningReport: if getdate(row.delivery_date) < getdate(today()): continue - delivery_date = formatdate(row.delivery_date, "dd MMM") + delivery_date = getdate(row.delivery_date) if delivery_date not in chart_data: chart_data[delivery_date] = frappe._dict( { @@ -294,6 +294,7 @@ class MaterialRequirementsPlanningReport: demand_data = [] supply_data = [] + delivery_dates = list(chart_data) for row in chart_data: value = chart_data[row] @@ -302,7 +303,7 @@ class MaterialRequirementsPlanningReport: return { "data": { - "labels": list(chart_data.keys()), + "labels": self.get_detailed_chart_labels(delivery_dates), "datasets": [ { "name": _("Demand"), @@ -320,6 +321,10 @@ class MaterialRequirementsPlanningReport: "title": _("Demand vs Supply"), } + def get_detailed_chart_labels(self, delivery_dates): + date_format = "dd MMM yyyy" if len({date.year for date in delivery_dates}) > 1 else "dd MMM" + return [formatdate(date, date_format) for date in delivery_dates] + def get_bucket_view_chart_data(self, data): chart_data = frappe._dict({}) labels = [] diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py index d91f44be985..d7f7ca9e725 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py @@ -2,6 +2,7 @@ # See license.txt import frappe +from frappe.tests.classes.context_managers import freeze_time from frappe.utils import add_days, flt, formatdate, today from erpnext.accounts.doctype.tax_rule.test_tax_rule import make_tax_rule @@ -23,33 +24,51 @@ TAX_TEMPLATE = "_Test Purchase Taxes and Charges Template - _TC" class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): def test_detailed_chart_includes_full_date_range(self): - start_date = add_days(today(), 1) - delivery_dates = [add_days(start_date, offset) for offset in range(12)] - rows = [make_chart_row(delivery_date) for delivery_date in delivery_dates] - rows.append(make_chart_row(delivery_dates[-1], planned_qty=2)) + with freeze_time("2026-08-12"): + start_date = add_days(today(), 1) + delivery_dates = [add_days(start_date, offset) for offset in range(12)] + rows = [make_chart_row(delivery_date) for delivery_date in delivery_dates] + rows.append(make_chart_row(delivery_dates[-1], planned_qty=2)) - chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) + chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) - self.assertEqual( - chart["data"]["labels"], - [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], - ) - self.assertEqual(chart["data"]["datasets"][0]["values"], [1] * 11 + [3]) + self.assertEqual( + chart["data"]["labels"], + [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], + ) + self.assertEqual(chart["data"]["datasets"][0]["values"], [1] * 11 + [3]) + + def test_detailed_chart_distinguishes_delivery_dates_across_years(self): + with freeze_time("2026-08-12"): + delivery_dates = ["2026-08-15", "2027-08-15"] + rows = [ + make_chart_row(delivery_dates[0]), + make_chart_row(delivery_dates[1], planned_qty=2), + ] + + chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) + + self.assertEqual( + chart["data"]["labels"], + [formatdate(delivery_date, "dd MMM yyyy") for delivery_date in delivery_dates], + ) + self.assertEqual(chart["data"]["datasets"][0]["values"], [1, 2]) def test_detailed_chart_excludes_past_and_empty_delivery_dates(self): - delivery_dates = [today(), add_days(today(), 1)] - rows = [ - make_chart_row(add_days(today(), -1)), - make_chart_row(None), - *[make_chart_row(delivery_date) for delivery_date in delivery_dates], - ] + with freeze_time("2026-08-12"): + delivery_dates = [today(), add_days(today(), 1)] + rows = [ + make_chart_row(add_days(today(), -1)), + make_chart_row(None), + *[make_chart_row(delivery_date) for delivery_date in delivery_dates], + ] - chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) + chart = MaterialRequirementsPlanningReport(frappe._dict()).get_detailed_view_chart_data(rows) - self.assertEqual( - chart["data"]["labels"], - [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], - ) + self.assertEqual( + chart["data"]["labels"], + [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], + ) def test_manufacture_lead_time_is_not_int_truncated(self): """lead_time = 1440 / manufacturing_time_in_mins + buffer_time. Both columns are Int; From 58a489f73fcfb9f7b82bb7f0dec7f28d5f01ebf7 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 12 Aug 2026 15:14:42 +0530 Subject: [PATCH 10/82] chore: resolve conflict --- ...t_material_requirements_planning_report.py | 154 +----------------- 1 file changed, 1 insertion(+), 153 deletions(-) diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py index d7f7ca9e725..a449f27f8a6 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py @@ -3,24 +3,13 @@ import frappe from frappe.tests.classes.context_managers import freeze_time -from frappe.utils import add_days, flt, formatdate, today +from frappe.utils import add_days, formatdate, today -from erpnext.accounts.doctype.tax_rule.test_tax_rule import make_tax_rule -from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom from erpnext.manufacturing.report.material_requirements_planning_report.material_requirements_planning_report import ( MaterialRequirementsPlanningReport, - execute, - get_item_lead_time, - make_order, ) -from erpnext.stock.doctype.item.test_item import make_item from erpnext.tests.utils import ERPNextTestSuite -COMPANY = "_Test Company" -WAREHOUSE = "_Test Warehouse - _TC" -SUPPLIER = "_Test Supplier" -TAX_TEMPLATE = "_Test Purchase Taxes and Charges Template - _TC" - class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): def test_detailed_chart_includes_full_date_range(self): @@ -70,67 +59,6 @@ class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], ) - def test_manufacture_lead_time_is_not_int_truncated(self): - """lead_time = 1440 / manufacturing_time_in_mins + buffer_time. Both columns are Int; - integer/integer division truncates on Postgres (1440/7 -> 205) while MariaDB yields a - decimal, so the computed lead time (and the derived release date) diverged by engine.""" - item = make_item("_Test MRP Lead Time Item", {"is_stock_item": 1}).name - frappe.get_doc( - { - "doctype": "Item Lead Time", - "item_code": item, - "manufacturing_time_in_mins": 7, - "buffer_time": 2, - } - ).insert() - - lead_time = get_item_lead_time(item, "Manufacture") - # 1440 / 7 + 2 = 207.714...; a truncating integer division on Postgres would give 207. - self.assertAlmostEqual(float(lead_time), 1440 / 7 + 2, places=2) - - def test_make_order_creates_draft_purchase_and_work_orders(self): - plan = make_mrp_plan(self) - - make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) - - purchase_order = get_created_order(plan.mps, "Purchase Order") - self.assertEqual(purchase_order.docstatus, 0) - self.assertEqual(purchase_order.supplier, SUPPLIER) - self.assertEqual([d.item_code for d in purchase_order.items], [plan.rm_item]) - self.assertEqual(purchase_order.items[0].qty, plan.planned_qty * plan.rm_qty) - - work_order = get_created_order(plan.mps, "Work Order") - self.assertEqual(work_order.docstatus, 0) - self.assertEqual(work_order.production_item, plan.fg_item) - self.assertEqual(work_order.bom_no, plan.bom) - self.assertEqual(work_order.qty, plan.planned_qty) - - def test_purchase_order_gets_defaults_from_set_missing_values(self): - plan = make_mrp_plan(self) - make_tax_rule(tax_type="Purchase", purchase_tax_template=TAX_TEMPLATE, priority=1, save=1) - frappe.get_doc( - { - "doctype": "Item Price", - "item_code": plan.rm_item, - "price_list": "Standard Buying", - "price_list_rate": 100, - } - ).insert() - - make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) - - purchase_order = get_created_order(plan.mps, "Purchase Order") - self.assertEqual(purchase_order.buying_price_list, "Standard Buying") - self.assertEqual(purchase_order.items[0].rate, 100) - template = frappe.get_doc("Purchase Taxes and Charges Template", TAX_TEMPLATE) - self.assertEqual(purchase_order.taxes_and_charges, TAX_TEMPLATE) - self.assertEqual([d.rate for d in purchase_order.taxes], [d.rate for d in template.taxes]) - - net_total = flt(purchase_order.net_total) - self.assertEqual( - purchase_order.grand_total, net_total + net_total * flt(template.taxes[0].rate) / 100 - ) - def make_chart_row(delivery_date, planned_qty=1): return frappe._dict( @@ -142,83 +70,3 @@ def make_chart_row(delivery_date, planned_qty=1): "wo_ordered_qty": 0, } ) - - -def make_mrp_plan(test_case, planned_qty=10, rm_qty=2): - """Build a finished good with a submitted BOM and an MPS demanding it, then return the - report's own output rows -- the same payload the report's client sends to `make_order`.""" - rm_item = make_item( - properties={ - "is_stock_item": 1, - "is_purchase_item": 1, - "item_defaults": [ - {"company": COMPANY, "default_warehouse": WAREHOUSE, "default_supplier": SUPPLIER} - ], - } - ).name - fg_item = make_item( - properties={ - "is_stock_item": 1, - "item_defaults": [{"company": COMPANY, "default_warehouse": WAREHOUSE}], - } - ).name - - # on_submit sets Item.default_bom, which is how the report finds the raw materials - bom = make_bom(item=fg_item, raw_materials=[rm_item], rm_qty=rm_qty, rate=100).name - - mps = frappe.get_doc( - { - "doctype": "Master Production Schedule", - "company": COMPANY, - "posting_date": today(), - "from_date": today(), - "parent_warehouse": WAREHOUSE, - "items": [ - { - "item_code": fg_item, - "warehouse": WAREHOUSE, - "delivery_date": add_days(today(), 30), - "planned_qty": planned_qty, - "uom": frappe.get_cached_value("Item", fg_item, "stock_uom"), - } - ], - } - ) - # left in draft: on_submit enqueues MRP Log creation in a background job - mps.insert() - - _, data, _, _ = execute( - frappe._dict( - { - "company": COMPANY, - "from_date": today(), - "to_date": add_days(today(), 90), - "warehouse": WAREHOUSE, - "mps": mps.name, - "type_of_material": "All", - "add_safety_stock": 0, - } - ) - ) - - # the report separates each finished good with a blank row - rows = [row for row in data if row.get("item_code")] - test_case.assertTrue(rows, msg="the report returned no rows to create orders from") - - return frappe._dict( - rm_item=rm_item, - fg_item=fg_item, - bom=bom, - mps=mps.name, - planned_qty=planned_qty, - rm_qty=rm_qty, - rows=rows, - ) - - -def get_created_order(mps, doctype): - names = frappe.get_all(doctype, filters={"mps": mps}, pluck="name") - if len(names) != 1: - frappe.throw(f"Expected exactly one {doctype} for {mps}, got {names}") - - return frappe.get_doc(doctype, names[0]) From 0fe5436a131c1a2be10d039f30a5b99bef237a39 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 04:23:10 +0000 Subject: [PATCH 11/82] Fix/item description in the item price list (backport #58084) (#58102) Co-authored-by: Mohsin Akhtar <167299936+akhtarmohsin@users.noreply.github.com> --- erpnext/stock/doctype/item_price/item_price.json | 4 ++-- erpnext/stock/doctype/item_price/item_price.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/item_price/item_price.json b/erpnext/stock/doctype/item_price/item_price.json index acbaef6b05e..69085f57b1c 100644 --- a/erpnext/stock/doctype/item_price/item_price.json +++ b/erpnext/stock/doctype/item_price/item_price.json @@ -89,7 +89,7 @@ }, { "fieldname": "item_description", - "fieldtype": "Text", + "fieldtype": "Text Editor", "label": "Item Description", "read_only": 1 }, @@ -226,7 +226,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2025-03-19 20:27:21.382369", + "modified": "2026-08-12 13:14:41.847412", "modified_by": "Administrator", "module": "Stock", "name": "Item Price", diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py index dc693890cd7..c982a2f706f 100644 --- a/erpnext/stock/doctype/item_price/item_price.py +++ b/erpnext/stock/doctype/item_price/item_price.py @@ -28,7 +28,7 @@ class ItemPrice(Document): currency: DF.Link | None customer: DF.Link | None item_code: DF.Link - item_description: DF.Text | None + item_description: DF.TextEditor | None item_name: DF.Data | None lead_time_days: DF.Int note: DF.Text | None From 956be58c9c3b7df31eafc0687955060f30f2f3bb Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Fri, 7 Aug 2026 17:20:00 +0530 Subject: [PATCH 12/82] fix: apply Sales Person user permissions in Accounts Receivable The report only narrowed by sales person when the filter was set, so a user restricted to a Sales Person saw every row once the filter was cleared. Resolve the permitted Sales Persons from user permissions and apply them on top of the filter. Each Sales Team parent type is matched against its own applicable_for scope, so a permission scoped to one doctype cannot authorise rows through the other. Descendants are already expanded by get_user_permissions, so Hide Descendants is respected. Gated to Receivable, since the class is shared with Accounts Payable. (cherry picked from commit 8b09ba429e2c4779890fda1fe6543943fb124277) # Conflicts: # erpnext/accounts/report/accounts_receivable/accounts_receivable.py --- .../accounts_receivable.py | 59 +++++++++++++++++-- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 47fdf9516f7..5b4e35b14fb 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -6,7 +6,11 @@ from collections import OrderedDict import frappe from frappe import _, qb, query_builder, scrub +<<<<<<< HEAD from frappe.database.schema import get_definition +======= +from frappe.permissions import get_allowed_docs_for_doctype +>>>>>>> 8b09ba429e (fix: apply Sales Person user permissions in Accounts Receivable) from frappe.query_builder import Criterion from frappe.query_builder.functions import Date, Substring, Sum from frappe.utils import cint, cstr, flt, getdate, nowdate @@ -52,6 +56,7 @@ class ReceivablePayableReport: self.filters = frappe._dict(filters or {}) self.qb_selection_filter = [] self.ple = qb.DocType("Payment Ledger Entry") + self.sales_person_records = None self.filters.report_date = getdate(self.filters.report_date or nowdate()) self.age_as_on = ( getdate(nowdate()) @@ -92,6 +97,7 @@ class ReceivablePayableReport: self.party_type = get_party_types_from_account_type(self.account_type) self.party_details = {} self.invoices = set() + self.sales_person_records = None self.skip_total_row = 0 self.advance_payment_doctypes = get_advance_payment_doctypes() @@ -206,7 +212,7 @@ class ReceivablePayableReport: def get_invoices(self, ple): if ple.voucher_type in ("Sales Invoice", "Purchase Invoice"): - if self.filters.get("sales_person"): + if self.sales_person_records is not None: if ple.voucher_no in self.sales_person_records.get( "Sales Invoice", [] ) or ple.party in self.sales_person_records.get("Customer", []): @@ -237,7 +243,7 @@ class ReceivablePayableReport: ] def get_voucher_balance(self, ple): - if self.filters.get("sales_person"): + if self.sales_person_records is not None: if not ( ple.party in self.sales_person_records.get("Customer", []) or ple.against_voucher_no in self.sales_person_records.get("Sales Invoice", []) @@ -896,9 +902,37 @@ class ReceivablePayableReport: self.ple_query = query + def get_permitted_sales_persons(self, parenttype): + if self.account_type != "Receivable": + return None + + permissions = frappe.permissions.get_user_permissions(frappe.session.user).get("Sales Person", []) + if not permissions: + return None + + return get_allowed_docs_for_doctype(permissions, parenttype) + def get_sales_invoices_or_customers_based_on_sales_person(self): + parenttypes = ["Customer", "Sales Invoice"] + permitted = {p: self.get_permitted_sales_persons(p) for p in parenttypes} + + if not (self.filters.get("sales_person") or any(p is not None for p in permitted.values())): + return + + steam = frappe.qb.DocType("Sales Team") + + scope = [] + for parenttype in parenttypes: + criterion = steam.parenttype == parenttype + if (allowed := permitted[parenttype]) is not None: + criterion &= steam.sales_person.isin(allowed or [""]) + scope.append(criterion) + + conditions = [Criterion.any(scope)] + if self.filters.get("sales_person"): lft, rgt = frappe.db.get_value("Sales Person", self.filters.get("sales_person"), ["lft", "rgt"]) +<<<<<<< HEAD # nosemgrep records = frappe.db.sql( @@ -910,11 +944,26 @@ class ReceivablePayableReport: """, (lft, rgt), as_dict=1, +======= + sp = frappe.qb.DocType("Sales Person") + conditions.append( + steam.sales_person.isin( + frappe.qb.from_(sp).select(sp.name).where((sp.lft >= lft) & (sp.rgt <= rgt)) + ) +>>>>>>> 8b09ba429e (fix: apply Sales Person user permissions in Accounts Receivable) ) - self.sales_person_records = frappe._dict() - for d in records: - self.sales_person_records.setdefault(d.parenttype, set()).add(d.parent) + records = ( + frappe.qb.from_(steam) + .select(steam.parent, steam.parenttype) + .distinct() + .where(Criterion.all(conditions)) + .run(as_dict=1) + ) + + self.sales_person_records = frappe._dict() + for d in records: + self.sales_person_records.setdefault(d.parenttype, set()).add(d.parent) def get_invoices_based_on_sales_partner(self): if not self.filters.get("sales_partner"): From 3fd3f9485b5bff49d4b8de7266a751135332131c Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Thu, 13 Aug 2026 11:52:26 +0530 Subject: [PATCH 13/82] fix: resolve backport conflicts --- .../accounts_receivable/accounts_receivable.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 5b4e35b14fb..8f6ee266286 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -6,11 +6,8 @@ from collections import OrderedDict import frappe from frappe import _, qb, query_builder, scrub -<<<<<<< HEAD from frappe.database.schema import get_definition -======= from frappe.permissions import get_allowed_docs_for_doctype ->>>>>>> 8b09ba429e (fix: apply Sales Person user permissions in Accounts Receivable) from frappe.query_builder import Criterion from frappe.query_builder.functions import Date, Substring, Sum from frappe.utils import cint, cstr, flt, getdate, nowdate @@ -932,25 +929,11 @@ class ReceivablePayableReport: if self.filters.get("sales_person"): lft, rgt = frappe.db.get_value("Sales Person", self.filters.get("sales_person"), ["lft", "rgt"]) -<<<<<<< HEAD - - # nosemgrep - records = frappe.db.sql( - """ - select distinct parent, parenttype - from `tabSales Team` steam - where parenttype in ('Customer', 'Sales Invoice') - and exists(select name from `tabSales Person` where lft >= %s and rgt <= %s and name = steam.sales_person) - """, - (lft, rgt), - as_dict=1, -======= sp = frappe.qb.DocType("Sales Person") conditions.append( steam.sales_person.isin( frappe.qb.from_(sp).select(sp.name).where((sp.lft >= lft) & (sp.rgt <= rgt)) ) ->>>>>>> 8b09ba429e (fix: apply Sales Person user permissions in Accounts Receivable) ) records = ( From 72114fa7380559df021b268394c988f9a2e8a6bf Mon Sep 17 00:00:00 2001 From: ljain112 Date: Mon, 10 Aug 2026 14:11:41 +0530 Subject: [PATCH 14/82] fix: run set_missing_values before creating Purchase Order from MRP report (cherry picked from commit 94d363851f77cfeccace16b9cce06612f74e48b0) --- .../material_requirements_planning_report.py | 36 ++-- ...t_material_requirements_planning_report.py | 154 +++++++++++++++++- erpnext/tests/utils.py | 24 +++ 3 files changed, 197 insertions(+), 17 deletions(-) diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py index bc13afb2792..5e0eb92dbbd 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py @@ -1327,13 +1327,7 @@ def make_order(selected_rows, company, warehouse=None, mps=None): def make_purchase_orders(purchase_orders, company, warehouse=None, mps=None): for (supplier, release_date), items in purchase_orders.items(): - po = frappe.new_doc("Purchase Order") - po.supplier = supplier - po.company = company - po.mps = mps - po.transaction_date = release_date - po.set("items", []) - + po_items = [] for item in items: uom = item.purchase_uom or item.uom if not uom: @@ -1346,23 +1340,33 @@ def make_purchase_orders(purchase_orders, company, warehouse=None, mps=None): if flt(item.required_qty) < flt(item.min_order_qty): item.required_qty = item.min_order_qty - po.append( - "items", + po_items.append( { "item_code": item.item_code, "qty": item.required_qty, "uom": uom, "schedule_date": item.delivery_date if item.delivery_date else today(), "warehouse": warehouse or item.default_warehouse, - }, + } ) - if len(po.items) > 0: - po.insert() - frappe.msgprint( - _("Purchase Order {0} created").format(frappe.bold(po.name)), - alert=True, - ) + if not po_items: + continue + + po = frappe.new_doc("Purchase Order") + po.supplier = supplier + po.company = company + po.mps = mps + po.transaction_date = release_date + po.set("items", po_items) + + po.run_method("set_missing_values") + po.insert() + + frappe.msgprint( + _("Purchase Order {0} created").format(frappe.bold(po.name)), + alert=True, + ) def make_work_orders(work_orders, company, warehouse=None, mps=None): diff --git a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py index a449f27f8a6..1b873c5b3d5 100644 --- a/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py +++ b/erpnext/manufacturing/report/material_requirements_planning_report/test_material_requirements_planning_report.py @@ -3,13 +3,24 @@ import frappe from frappe.tests.classes.context_managers import freeze_time -from frappe.utils import add_days, formatdate, today +from frappe.utils import add_days, flt, formatdate, today +from erpnext.accounts.doctype.tax_rule.test_tax_rule import make_tax_rule +from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom from erpnext.manufacturing.report.material_requirements_planning_report.material_requirements_planning_report import ( MaterialRequirementsPlanningReport, + execute, + get_item_lead_time, + make_order, ) +from erpnext.stock.doctype.item.test_item import make_item from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" +WAREHOUSE = "_Test Warehouse - _TC" +SUPPLIER = "_Test Supplier" +TAX_TEMPLATE = "_Test Purchase Taxes and Charges Template - _TC" + class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): def test_detailed_chart_includes_full_date_range(self): @@ -59,6 +70,147 @@ class TestMaterialRequirementsPlanningReport(ERPNextTestSuite): [formatdate(delivery_date, "dd MMM") for delivery_date in delivery_dates], ) + def test_manufacture_lead_time_is_not_int_truncated(self): + """lead_time = 1440 / manufacturing_time_in_mins + buffer_time. Both columns are Int; + integer/integer division truncates on Postgres (1440/7 -> 205) while MariaDB yields a + decimal, so the computed lead time (and the derived release date) diverged by engine.""" + item = make_item("_Test MRP Lead Time Item", {"is_stock_item": 1}).name + frappe.get_doc( + { + "doctype": "Item Lead Time", + "item_code": item, + "manufacturing_time_in_mins": 7, + "buffer_time": 2, + } + ).insert() + + lead_time = get_item_lead_time(item, "Manufacture") + # 1440 / 7 + 2 = 207.714...; a truncating integer division on Postgres would give 207. + self.assertAlmostEqual(float(lead_time), 1440 / 7 + 2, places=2) + + def test_make_order_creates_draft_purchase_and_work_orders(self): + plan = make_mrp_plan(self) + + make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) + + purchase_order = get_created_order(plan.mps, "Purchase Order") + self.assertEqual(purchase_order.docstatus, 0) + self.assertEqual(purchase_order.supplier, SUPPLIER) + self.assertEqual([d.item_code for d in purchase_order.items], [plan.rm_item]) + self.assertEqual(purchase_order.items[0].qty, plan.planned_qty * plan.rm_qty) + + work_order = get_created_order(plan.mps, "Work Order") + self.assertEqual(work_order.docstatus, 0) + self.assertEqual(work_order.production_item, plan.fg_item) + self.assertEqual(work_order.bom_no, plan.bom) + self.assertEqual(work_order.qty, plan.planned_qty) + + def test_purchase_order_gets_defaults_from_set_missing_values(self): + plan = make_mrp_plan(self) + make_tax_rule(tax_type="Purchase", purchase_tax_template=TAX_TEMPLATE, priority=1, save=1) + frappe.get_doc( + { + "doctype": "Item Price", + "item_code": plan.rm_item, + "price_list": "Standard Buying", + "price_list_rate": 100, + } + ).insert() + + make_order(plan.rows, COMPANY, warehouse=WAREHOUSE, mps=plan.mps) + + purchase_order = get_created_order(plan.mps, "Purchase Order") + self.assertEqual(purchase_order.buying_price_list, "Standard Buying") + self.assertEqual(purchase_order.items[0].rate, 100) + template = frappe.get_doc("Purchase Taxes and Charges Template", TAX_TEMPLATE) + self.assertEqual(purchase_order.taxes_and_charges, TAX_TEMPLATE) + self.assertEqual([d.rate for d in purchase_order.taxes], [d.rate for d in template.taxes]) + + net_total = flt(purchase_order.net_total) + self.assertEqual( + purchase_order.grand_total, net_total + net_total * flt(template.taxes[0].rate) / 100 + ) + + +def make_mrp_plan(test_case, planned_qty=10, rm_qty=2): + """Build a finished good with a submitted BOM and an MPS demanding it, then return the + report's own output rows -- the same payload the report's client sends to `make_order`.""" + rm_item = make_item( + properties={ + "is_stock_item": 1, + "is_purchase_item": 1, + "item_defaults": [ + {"company": COMPANY, "default_warehouse": WAREHOUSE, "default_supplier": SUPPLIER} + ], + } + ).name + fg_item = make_item( + properties={ + "is_stock_item": 1, + "item_defaults": [{"company": COMPANY, "default_warehouse": WAREHOUSE}], + } + ).name + + # on_submit sets Item.default_bom, which is how the report finds the raw materials + bom = make_bom(item=fg_item, raw_materials=[rm_item], rm_qty=rm_qty, rate=100).name + + mps = frappe.get_doc( + { + "doctype": "Master Production Schedule", + "company": COMPANY, + "posting_date": today(), + "from_date": today(), + "parent_warehouse": WAREHOUSE, + "items": [ + { + "item_code": fg_item, + "warehouse": WAREHOUSE, + "delivery_date": add_days(today(), 30), + "planned_qty": planned_qty, + "uom": frappe.get_cached_value("Item", fg_item, "stock_uom"), + } + ], + } + ) + # left in draft: on_submit enqueues MRP Log creation in a background job + mps.insert() + + _, data, _, _ = execute( + frappe._dict( + { + "company": COMPANY, + "from_date": today(), + "to_date": add_days(today(), 90), + "warehouse": WAREHOUSE, + "mps": mps.name, + "type_of_material": "All", + "add_safety_stock": 0, + } + ) + ) + + # the report separates each finished good with a blank row + rows = [row for row in data if row.get("item_code")] + test_case.assertTrue(rows, msg="the report returned no rows to create orders from") + + return frappe._dict( + rm_item=rm_item, + fg_item=fg_item, + bom=bom, + mps=mps.name, + planned_qty=planned_qty, + rm_qty=rm_qty, + rows=rows, + ) + + +def get_created_order(mps, doctype): + names = frappe.get_all(doctype, filters={"mps": mps}, pluck="name") + if len(names) != 1: + frappe.throw(f"Expected exactly one {doctype} for {mps}, got {names}") + + return frappe.get_doc(doctype, names[0]) + def make_chart_row(delivery_date, planned_qty=1): return frappe._dict( diff --git a/erpnext/tests/utils.py b/erpnext/tests/utils.py index a48f193c700..cf168d16545 100644 --- a/erpnext/tests/utils.py +++ b/erpnext/tests/utils.py @@ -184,6 +184,7 @@ class BootStrapTestData: self.make_loyalty_program() self.make_shareholder() self.make_sales_taxes_template() + self.make_purchase_taxes_template() self.make_workstation() self.make_operation() self.make_bom() @@ -2339,6 +2340,29 @@ class BootStrapTestData: ] self.make_records(["title", "company"], records) + def make_purchase_taxes_template(self): + records = [ + { + "company": "_Test Company", + "doctype": "Purchase Taxes and Charges Template", + "title": "_Test Purchase Taxes and Charges Template", + "taxes": [ + { + "account_head": "_Test Account VAT - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Net Total", + "cost_center": "Main - _TC", + "description": "VAT", + "doctype": "Purchase Taxes and Charges", + "parentfield": "taxes", + "rate": 6, + } + ], + } + ] + self.make_records(["title", "company"], records) + def make_asset_category(self): records = [ { From aecc551b5e0a379a7e565a58df965885894f8ac0 Mon Sep 17 00:00:00 2001 From: Henil Maru Date: Thu, 13 Aug 2026 14:46:05 +0530 Subject: [PATCH 15/82] fix: Qty and UOM not fetched when adding Item in Material Request (#58118) --- erpnext/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 910a6c95ebd..6f653026dde 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -177,7 +177,12 @@ def normalize_ctx_input(T: type) -> callable: def decorator(func: callable): # conserve annotations for frappe.utils.typing_validations - @functools.wraps(func, assigned=(a for a in functools.WRAPPER_ASSIGNMENTS if a != "__annotations__")) + @functools.wraps( + func, + assigned=( + a for a in functools.WRAPPER_ASSIGNMENTS if a not in ("__annotations__", "__annotate__") + ), + ) def wrapper(ctx: T | Document | dict | str, *args, **kwargs): if isinstance(ctx, Document): ctx = T(**ctx.as_dict()) From 2a9e4304a211b18964ef4d8863101a8313c61e84 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 13 Aug 2026 15:06:14 +0530 Subject: [PATCH 16/82] fix(manufacturing): derive material transfers from actual coverage (#58115) --- .../doctype/work_order/services/__init__.py | 1 + .../work_order/services/material_coverage.py | 22 +++ .../doctype/work_order/test_work_order.py | 138 +++++++++++++++++- .../doctype/work_order/work_order.py | 53 ++----- erpnext/patches.txt | 1 + .../repair_work_order_material_transfer.py | 66 +++++++++ .../stock/doctype/stock_entry/stock_entry.py | 69 +++++++++ 7 files changed, 308 insertions(+), 42 deletions(-) create mode 100644 erpnext/manufacturing/doctype/work_order/services/__init__.py create mode 100644 erpnext/manufacturing/doctype/work_order/services/material_coverage.py create mode 100644 erpnext/patches/v16_0/repair_work_order_material_transfer.py diff --git a/erpnext/manufacturing/doctype/work_order/services/__init__.py b/erpnext/manufacturing/doctype/work_order/services/__init__.py new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/erpnext/manufacturing/doctype/work_order/services/__init__.py @@ -0,0 +1 @@ + diff --git a/erpnext/manufacturing/doctype/work_order/services/material_coverage.py b/erpnext/manufacturing/doctype/work_order/services/material_coverage.py new file mode 100644 index 00000000000..8363e0c1284 --- /dev/null +++ b/erpnext/manufacturing/doctype/work_order/services/material_coverage.py @@ -0,0 +1,22 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from collections.abc import Mapping + +from frappe.utils import flt + + +def get_minimum_material_coverage_fraction( + required_qty: Mapping[str, float], transferred_qty: Mapping[str, float], precision: int +) -> float: + """Return the least-covered component ratio at the configured quantity precision.""" + coverage = [] + for item_code, required in required_qty.items(): + transferred = flt(transferred_qty.get(item_code)) + # Stored values can differ after the digits that the user can enter or see. + if flt(transferred, precision) == flt(required, precision): + coverage.append(1.0) + else: + coverage.append(transferred / required) + + return min(coverage, default=0.0) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index 18bd6ff7998..ea1d167f71a 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -1464,9 +1464,11 @@ class TestWorkOrder(ERPNextTestSuite): del transfer_entry.get("items")[0] # transfer only one RM transfer_entry.submit() - # WO's "Material Transferred for Mfg" shows all is transferred, one RM is pending + # One required item is still missing, so no finished-good quantity is covered yet. work_order.reload() - self.assertEqual(work_order.material_transferred_for_manufacturing, 1) + self.assertEqual(transfer_entry.fg_completed_qty, 0) + self.assertEqual(work_order.material_transferred_for_manufacturing, 0) + self.assertEqual(work_order.status, "In Process") self.assertEqual(work_order.required_items[0].transferred_qty, 0) self.assertEqual(work_order.required_items[1].transferred_qty, 2) @@ -1486,6 +1488,47 @@ class TestWorkOrder(ERPNextTestSuite): self.assertEqual(work_order.required_items[0].transferred_qty, 1) self.assertEqual(work_order.required_items[1].transferred_qty, 2) + def test_material_transfer_claim_follows_actual_coverage(self): + work_order = make_wo_order_test_record(planned_start_date=now(), qty=4) + test_stock_entry.make_stock_entry( + item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=5000.0 + ) + test_stock_entry.make_stock_entry( + item_code="_Test Item Home Desktop 100", + target="_Test Warehouse - _TC", + qty=20, + basic_rate=1000.0, + ) + + transfer_entry = frappe.get_doc( + make_stock_entry(work_order.name, "Material Transfer for Manufacture", 4) + ) + for row in transfer_entry.items: + if row.item_code == "_Test Item": + row.qty = 1 + transfer_entry.submit() + + work_order.reload() + self.assertEqual(transfer_entry.fg_completed_qty, 1) + self.assertEqual(work_order.material_transferred_for_manufacturing, 1) + + remainder_entry = frappe.get_doc( + make_stock_entry(work_order.name, "Material Transfer for Manufacture", 3) + ) + remainder_entry.submit() + + work_order.reload() + self.assertEqual(remainder_entry.fg_completed_qty, 3) + self.assertEqual(work_order.material_transferred_for_manufacturing, 4) + + def test_material_coverage_cap_skips_manufacture_entry(self): + work_order = make_wo_order_test_record(planned_start_date=now(), qty=1) + manufacture_entry = frappe.get_doc(make_stock_entry(work_order.name, "Manufacture", 1)) + manufacture_entry.pro_doc = work_order + manufacture_entry._action = "submit" + + self.assertFalse(manufacture_entry._should_cap_completed_qty()) + def test_material_transferred_min_fraction_on_partial_pick_list(self): """Pick-list flow (fg_completed_qty = 0): 'Material Transferred for Manufacturing' must reflect the least-transferred required item (the bottleneck), instead of being @@ -1548,6 +1591,97 @@ class TestWorkOrder(ERPNextTestSuite): work_order.reload() self.assertEqual(work_order.material_transferred_for_manufacturing, 2.0) + def test_material_transferred_ignores_hidden_precision_difference(self): + work_order = make_wo_order_test_record(planned_start_date=now(), qty=2) + test_stock_entry.make_stock_entry( + item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=5000.0 + ) + test_stock_entry.make_stock_entry( + item_code="_Test Item Home Desktop 100", + target="_Test Warehouse - _TC", + qty=10, + basic_rate=1000.0, + ) + + precision = work_order.precision("required_qty", "required_items") + hidden_difference = 4 / (10 ** (precision + 1)) + row = work_order.required_items[0] + row.db_set("required_qty", flt(row.required_qty) + hidden_difference, update_modified=False) + work_order.reload() + required_qty = {row.item_code: flt(row.required_qty) for row in work_order.required_items} + + transfer_entry = frappe.get_doc( + make_stock_entry(work_order.name, "Material Transfer for Manufacture", 0) + ) + for item in transfer_entry.items: + item.qty = flt(required_qty[item.item_code], precision) + item.transfer_qty = item.qty + transfer_entry.submit() + + work_order.reload() + self.assertEqual( + flt(work_order.required_items[0].required_qty, precision), + flt(work_order.required_items[0].transferred_qty, precision), + ) + self.assertEqual(work_order.material_transferred_for_manufacturing, work_order.qty) + + def test_repair_material_transfer_precision_patch(self): + from erpnext.patches.v16_0.repair_work_order_material_transfer import ( + execute, + get_precision_affected_work_orders, + ) + + precision = frappe.get_precision("Work Order Item", "required_qty") + hidden_difference = 4 / (10 ** (precision + 1)) + work_order = make_wo_order_test_record(planned_start_date=now(), qty=2) + for index, row in enumerate(work_order.required_items): + required_qty = flt(row.required_qty) + (hidden_difference if index == 0 else 0) + row.db_set( + { + "required_qty": required_qty, + "transferred_qty": flt(required_qty, precision), + }, + update_modified=False, + ) + work_order.db_set("material_transferred_for_manufacturing", 1.99, update_modified=False) + + partial_work_order = make_wo_order_test_record(planned_start_date=now(), qty=2) + for row in partial_work_order.required_items: + row.db_set("transferred_qty", row.required_qty, update_modified=False) + partial_row = partial_work_order.required_items[0] + partial_row.db_set( + "transferred_qty", + flt(partial_row.required_qty, precision) - (1 / (10**precision)), + update_modified=False, + ) + partial_work_order.db_set("material_transferred_for_manufacturing", 1.99, update_modified=False) + + terminal_work_orders = [] + for status in ("Stopped", "Closed", "Completed"): + terminal_work_order = make_wo_order_test_record(planned_start_date=now(), qty=2) + for row in terminal_work_order.required_items: + row.db_set("transferred_qty", row.required_qty, update_modified=False) + terminal_work_order.db_set( + {"material_transferred_for_manufacturing": 1.99, "status": status}, + update_modified=False, + ) + terminal_work_orders.append(terminal_work_order) + + updates = get_precision_affected_work_orders() + self.assertIn(work_order.name, updates) + self.assertNotIn(partial_work_order.name, updates) + for terminal_work_order in terminal_work_orders: + self.assertNotIn(terminal_work_order.name, updates) + + execute() + work_order.reload() + partial_work_order.reload() + self.assertEqual(work_order.material_transferred_for_manufacturing, work_order.qty) + self.assertEqual(partial_work_order.material_transferred_for_manufacturing, 1.99) + for terminal_work_order in terminal_work_orders: + terminal_work_order.reload() + self.assertEqual(terminal_work_order.material_transferred_for_manufacturing, 1.99) + def test_work_order_material_request_and_bom_details(self): from erpnext.stock.doctype.material_request.material_request import ( make_stock_entry as mr_to_stock_entry, diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 2af7497564b..4a8aaac03dd 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -34,6 +34,9 @@ from erpnext.manufacturing.doctype.bom.bom import ( from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings import ( get_mins_between_operations, ) +from erpnext.manufacturing.doctype.work_order.services.material_coverage import ( + get_minimum_material_coverage_fraction, +) from erpnext.stock.doctype.batch.batch import make_batch from erpnext.stock.doctype.item.item import get_item_defaults, validate_end_of_life from erpnext.stock.doctype.serial_no.serial_no import get_available_serial_nos, get_serial_nos @@ -720,29 +723,9 @@ class WorkOrder(Document): return status def _has_transferred_material(self): - """True if any raw material transferred against this work order via a pick list or a - material request is still, net of returns, in WIP (these leave - material_transferred_for_manufacturing at 0 via the min-fraction rule).""" + """True if any raw material transferred against this work order is still in WIP.""" ste = frappe.qb.DocType("Stock Entry") ste_child = frappe.qb.DocType("Stock Entry Detail") - mr_ste = frappe.qb.DocType("Stock Entry") - mr_child = frappe.qb.DocType("Stock Entry Detail") - # Stock Entry only carries `material_request` at the child-row level, so a Stock - # Entry is "MR-sourced" if *any* of its rows link back to a Material Request against - # this work order; the join to mr_ste keeps this scoped to this work order's entries - # instead of scanning every Material-Request-linked row in the system. - mr_sourced_stock_entries = ( - frappe.qb.from_(mr_child) - .inner_join(mr_ste) - .on(mr_ste.name == mr_child.parent) - .select(mr_child.parent) - .where( - (mr_child.material_request.isnotnull()) - & (mr_ste.work_order == self.name) - & (mr_ste.docstatus == 1) - & (mr_ste.purpose == "Material Transfer for Manufacture") - ) - ) common_filters = ( (ste.work_order == self.name) & (ste.docstatus == 1) @@ -753,11 +736,7 @@ class WorkOrder(Document): .inner_join(ste_child) .on(ste_child.parent == ste.name) .select(Sum(ste_child.transfer_qty)) - .where( - common_filters - & (ste.is_return == 0) - & (ste.pick_list.isnotnull() | ste.name.isin(mr_sourced_stock_entries)) - ) + .where(common_filters & (ste.is_return == 0)) ).run()[0][0] # Returns don't carry their own pick_list/material_request reference, so net every # return against this work order to correctly clear WIP after a full return. @@ -1808,22 +1787,15 @@ class WorkOrder(Document): return frappe._dict({d.original_item or d.item_code: d.qty for d in data}) def recompute_material_transferred_for_manufacturing(self, transferred_items): - """Set material_transferred_for_manufacturing based on actual item-level transfers, not fg_completed_qty.""" + """Set transferred quantity from the raw materials that have actually moved.""" # Job Card transfers use the minimum completed quantity across operations. if self.operations and self.transfer_material_against == "Job Card": return - # When fg_completed_qty > 0 (direct stock entries, excess transfer), preserve the - # SUM(fg_completed_qty) approach so excess-transfer tracking works correctly. - sum_fg_completed_qty = self.get_transferred_or_manufactured_qty( + claimed_qty = self.get_transferred_or_manufactured_qty( "Material Transfer for Manufacture", "material_transferred_for_manufacturing" ) - if sum_fg_completed_qty: - self.db_set("material_transferred_for_manufacturing", sum_fg_completed_qty) - return - # Pick list flow sets fg_completed_qty=0; use min-fraction of actual item transfers - # so partial availability does not prematurely mark the work order as fully transferred. required_by_item = {} for row in self.required_items: if not row.include_item_in_manufacturing or flt(row.required_qty) <= 0: @@ -1833,12 +1805,13 @@ class WorkOrder(Document): if not required_by_item: return - min_fraction = min( - flt(transferred_items.get(item_code) or 0) / required_qty - for item_code, required_qty in required_by_item.items() + min_fraction = get_minimum_material_coverage_fraction( + required_by_item, + transferred_items, + self.precision("required_qty", "required_items"), ) - min_fraction = min(min_fraction, 1.0) - material_transferred = min_fraction * flt(self.qty) + covered_qty = min_fraction * flt(self.qty) + material_transferred = min(covered_qty, max(flt(self.qty), claimed_qty)) self.db_set("material_transferred_for_manufacturing", material_transferred) def update_qty_in_stock_reservation(self, row, transferred_qty, row_wise_serial_batch): diff --git a/erpnext/patches.txt b/erpnext/patches.txt index a9fa908e29d..df0f8071cbe 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -499,3 +499,4 @@ erpnext.patches.v16_0.merge_seeded_item_group_root erpnext.patches.v16_0.rename_italy_customer_name_fields erpnext.patches.v16_0.set_stock_uom_in_job_card erpnext.patches.v16_0.recalculate_purchase_receipt_billing_status +erpnext.patches.v16_0.repair_work_order_material_transfer diff --git a/erpnext/patches/v16_0/repair_work_order_material_transfer.py b/erpnext/patches/v16_0/repair_work_order_material_transfer.py new file mode 100644 index 00000000000..94458b34466 --- /dev/null +++ b/erpnext/patches/v16_0/repair_work_order_material_transfer.py @@ -0,0 +1,66 @@ +import frappe +from frappe.utils import flt +from pypika import functions as fn + +from erpnext.manufacturing.doctype.work_order.services.material_coverage import ( + get_minimum_material_coverage_fraction, +) + + +def execute(): + updates = get_precision_affected_work_orders() + frappe.db.bulk_update("Work Order", updates, update_modified=False) + + +def get_precision_affected_work_orders(): + """Return Work Orders whose components cover the plan at quantity precision.""" + work_orders = {} + for row in _get_candidate_rows(): + work_order = work_orders.setdefault( + row.work_order, + {"qty": flt(row.qty), "required_qty": {}, "transferred_qty": {}}, + ) + item_code = row.item_code + work_order["required_qty"][item_code] = work_order["required_qty"].get(item_code, 0.0) + flt( + row.required_qty + ) + work_order["transferred_qty"][item_code] = max( + work_order["transferred_qty"].get(item_code, 0.0), flt(row.transferred_qty) + ) + + precision = frappe.get_precision("Work Order Item", "required_qty") + return { + name: {"material_transferred_for_manufacturing": values["qty"]} + for name, values in work_orders.items() + if get_minimum_material_coverage_fraction( + values["required_qty"], values["transferred_qty"], precision + ) + >= 1.0 + } + + +def _get_candidate_rows(): + work_order = frappe.qb.DocType("Work Order") + required_item = frappe.qb.DocType("Work Order Item") + return ( + frappe.qb.from_(work_order) + .inner_join(required_item) + .on(required_item.parent == work_order.name) + .select( + work_order.name.as_("work_order"), + work_order.qty, + required_item.item_code, + required_item.required_qty, + required_item.transferred_qty, + ) + .where( + (work_order.docstatus == 1) + & (work_order.status.notin(["Stopped", "Closed", "Completed"])) + & (fn.Coalesce(work_order.skip_transfer, 0) == 0) + & (fn.Coalesce(work_order.track_semi_finished_goods, 0) == 0) + & (fn.Coalesce(work_order.material_transferred_for_manufacturing, 0) < work_order.qty) + & (fn.Coalesce(work_order.transfer_material_against, "") != "Job Card") + & (required_item.include_item_in_manufacturing == 1) + & (required_item.required_qty > 0) + ) + ).run(as_dict=True) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index cd442909b1c..604bb994eb3 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -33,6 +33,9 @@ from erpnext.manufacturing.doctype.bom.bom import ( get_secondary_items_from_sub_assemblies, validate_bom_no, ) +from erpnext.manufacturing.doctype.work_order.services.material_coverage import ( + get_minimum_material_coverage_fraction, +) from erpnext.setup.doctype.brand.brand import get_brand_defaults from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.stock.doctype.batch.batch import get_batch_qty @@ -312,6 +315,7 @@ class StockEntry(StockController, SubcontractingInwardController): self.calculate_rate_and_amount() self.validate_putaway_capacity() self.validate_component_and_quantities() + self._cap_completed_qty_to_material_coverage() self.validate_finished_good_serial_batch_for_work_order() # Stock Entry overrides validate() without calling super(), so the shared mandatory # inventory dimension check must be invoked explicitly here. @@ -1294,6 +1298,71 @@ class StockEntry(StockController, SubcontractingInwardController): title=_("Missing Item"), ) + def _cap_completed_qty_to_material_coverage(self): + if not self._should_cap_completed_qty(): + return + # Keep an excessive claim intact so the Work Order allowance check can reject it. + max_qty = flt(self.pro_doc.qty) + overproduction_percentage = flt( + frappe.db.get_single_value("Manufacturing Settings", "overproduction_percentage_for_work_order") + ) + extra_materials_percentage = flt( + frappe.db.get_single_value("Manufacturing Settings", "transfer_extra_materials_percentage") + ) + to_transfer_qty = flt(self.pro_doc.material_transferred_for_manufacturing) + flt( + self.fg_completed_qty + ) + limit_percentage = extra_materials_percentage or overproduction_percentage + transfer_limit_qty = max_qty + (max_qty * limit_percentage / 100) + if transfer_limit_qty < to_transfer_qty: + return + + required_qty, transferred_qty = self._get_work_order_material_qty() + if not required_qty: + return + + covered_before = self._get_covered_work_order_qty(required_qty, transferred_qty) + for row in self.items: + item_code = row.original_item or row.item_code + if row.s_warehouse and item_code in required_qty: + transferred_qty[item_code] += flt(row.qty) * flt(row.conversion_factor or 1) + + covered_after = self._get_covered_work_order_qty(required_qty, transferred_qty) + covered_by_entry = flt(max(covered_after - covered_before, 0), self.precision("fg_completed_qty")) + self.fg_completed_qty = min(flt(self.fg_completed_qty), covered_by_entry) + + def _should_cap_completed_qty(self): + if self.get("_action") != "submit": + return False + if self.purpose != "Material Transfer for Manufacture": + return False + if not self.pro_doc or not self.fg_completed_qty: + return False + if self.is_return or self.get("is_additional_transfer_entry"): + return False + return not (self.pro_doc.operations and self.pro_doc.transfer_material_against == "Job Card") + + def _get_work_order_material_qty(self): + required_qty = {} + transferred_qty = {} + for row in self.pro_doc.required_items: + if not row.include_item_in_manufacturing or flt(row.required_qty) <= 0: + continue + required_qty[row.item_code] = required_qty.get(row.item_code, 0.0) + flt(row.required_qty) + # Duplicate required-item rows each hold the aggregate transferred quantity. + transferred_qty[row.item_code] = max( + transferred_qty.get(row.item_code, 0.0), flt(row.transferred_qty) + ) + return required_qty, transferred_qty + + def _get_covered_work_order_qty(self, required_qty, transferred_qty): + min_fraction = get_minimum_material_coverage_fraction( + required_qty, + transferred_qty, + self.pro_doc.precision("required_qty", "required_items"), + ) + return min_fraction * flt(self.pro_doc.qty) + def _validate_no_excess_transfer(self): if self.is_return: return From 1ec2a2cd5d99d6a0a1eef3f52f9f523177a817e7 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Thu, 13 Aug 2026 14:51:31 +0530 Subject: [PATCH 17/82] fix: describe stale exchange rate settings (cherry picked from commit 84cdd0daf03de5d47e1e417b1a25bd598c49c17f) # Conflicts: # erpnext/accounts/doctype/accounts_settings/accounts_settings.json --- .../doctype/accounts_settings/accounts_settings.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 3bc183151c0..96a1e858fb6 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -198,10 +198,12 @@ }, { "default": "1", + "description": "System will use the latest saved Currency Exchange rate on or before the transaction date, however old it is.
\nUncheck to ignore rates older than Stale Days and fetch a fresh rate from the exchange rate provider instead.", "fieldname": "allow_stale", "fieldtype": "Check", "in_list_view": 1, - "label": "Allow Stale Exchange Rates" + "label": "Allow Stale Exchange Rates", + "show_description_on_click": 1 }, { "default": "1", @@ -788,7 +790,11 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], +<<<<<<< HEAD "modified": "2026-07-27 12:00:00.000000", +======= + "modified": "2026-08-13 14:48:13.211701", +>>>>>>> 84cdd0daf0 (fix: describe stale exchange rate settings) "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", From cbe7931b3bd4a822836bd9d1c3c7bbd79f6bc72b Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Thu, 13 Aug 2026 15:22:38 +0530 Subject: [PATCH 18/82] fix: conflicts --- .../accounts/doctype/accounts_settings/accounts_settings.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 96a1e858fb6..3177d377267 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -790,11 +790,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-07-27 12:00:00.000000", -======= "modified": "2026-08-13 14:48:13.211701", ->>>>>>> 84cdd0daf0 (fix: describe stale exchange rate settings) "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", From 5afaffe7b4b94ba6efa917380151e6b91d4c8ac6 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:32:12 +0000 Subject: [PATCH 19/82] chore: update deps in banking app (backport #57971) (#58130) chore: update deps in banking app (#57971) (cherry picked from commit 5b2952aa23305961326ffa3b557d5d0fb755f460) Co-authored-by: Nikhil Kothari --- banking/package.json | 14 +- banking/yarn.lock | 379 +++++++++++++++++++++++++------------------ 2 files changed, 231 insertions(+), 162 deletions(-) diff --git a/banking/package.json b/banking/package.json index a957fb01bf6..384aec9793b 100644 --- a/banking/package.json +++ b/banking/package.json @@ -24,10 +24,10 @@ "cmdk": "^1.1.1", "date-fns": "^4.1.0", "dayjs": "^1.11.20", - "frappe-react-sdk": "^1.17.0", + "frappe-react-sdk": "^1.17.1", "fuse.js": "^7.3.0", - "jotai": "^2.20.1", - "jotai-family": "^1.0.2", + "jotai": "^2.20.2", + "jotai-family": "^1.1.0", "lodash.isplainobject": "^4.0.6", "lucide-react": "^1.14.0", "radix-ui": "^1.6.1", @@ -39,7 +39,7 @@ "react-hook-form": "^7.75.0", "react-hotkeys-hook": "^5.3.2", "react-markdown": "^10.1.0", - "react-router": "^8.1.0", + "react-router": "^8.3.0", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "safe-expr-eval": "^1.0.4", @@ -48,14 +48,14 @@ "tailwindcss": "^4.3.0", "tw-animate-css": "^1.4.0", "usehooks-ts": "^3.1.1", - "vite": "^8.0.16" + "vite": "^8.2.1" }, "devDependencies": { - "@eslint/js": "^9.39.4", + "@eslint/js": "^9.39.5", "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "eslint": "^9.39.1", + "eslint": "^9.39.5", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", "globals": "^16.5.0", diff --git a/banking/yarn.lock b/banking/yarn.lock index 08ba0fdf146..7597d8518fd 100644 --- a/banking/yarn.lock +++ b/banking/yarn.lock @@ -177,7 +177,7 @@ dependencies: tslib "^2.0.0" -"@emnapi/core@1.11.1", "@emnapi/core@^1.11.1": +"@emnapi/core@^1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.1.tgz#b9e1064f3a6b1631e241e638eb48d736bfd372a6" integrity sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ== @@ -185,7 +185,7 @@ "@emnapi/wasi-threads" "1.2.2" tslib "^2.4.0" -"@emnapi/runtime@1.11.1", "@emnapi/runtime@^1.11.1": +"@emnapi/runtime@^1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.1.tgz#58f1f3d5d81a9b12f793ab688c96371901027c24" integrity sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw== @@ -234,10 +234,10 @@ dependencies: "@types/json-schema" "^7.0.15" -"@eslint/eslintrc@^3.3.5": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60" - integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== +"@eslint/eslintrc@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.6.tgz#d22bfd6b3a7d8e1f2c0b2f2e6de111b53ec6e13e" + integrity sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA== dependencies: ajv "^6.14.0" debug "^4.3.2" @@ -245,14 +245,14 @@ globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^4.1.1" + js-yaml "^4.3.0" minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.39.4", "@eslint/js@^9.39.4": - version "9.39.4" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.4.tgz#a3f83bfc6fd9bf33a853dfacd0b49b398eb596c1" - integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== +"@eslint/js@9.39.5": + version "9.39.5" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" + integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== "@eslint/object-schema@^2.1.7": version "2.1.7" @@ -359,17 +359,17 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@napi-rs/wasm-runtime@^1.1.4", "@napi-rs/wasm-runtime@^1.1.6": +"@napi-rs/wasm-runtime@^1.1.4": version "1.1.6" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz#ed33806d0f9be98dc76d0c3d4fd872fda701b5d5" integrity sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg== dependencies: "@tybys/wasm-util" "^0.10.3" -"@oxc-project/types@=0.137.0": - version "0.137.0" - resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.137.0.tgz#56e77f8bb221fa05f18b1cd34d73f94f0954a773" - integrity sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA== +"@oxc-project/types@=0.143.0": + version "0.143.0" + resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.143.0.tgz#c3e4f3178b7b54e4dd194eac6d45258a60f0092b" + integrity sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA== "@radix-ui/number@1.1.2": version "1.1.2" @@ -1032,84 +1032,75 @@ resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.2.tgz#0761a82af55c7e302d5b509eaf1c97ea1fc5feea" integrity sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA== -"@rolldown/binding-android-arm64@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz#cc6153029c3d9afc9caaae2dc362d899ae94ac4f" - integrity sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g== +"@rolldown/binding-android-arm64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz#001b8b0b01844701efda1bb6bed84b681c4a488b" + integrity sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw== -"@rolldown/binding-darwin-arm64@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz#3af681a5d7610340257b3ac7753353b23e884765" - integrity sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw== +"@rolldown/binding-darwin-arm64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz#5e87c602ed634a6fef092e2162e24fbfb881c4ec" + integrity sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA== -"@rolldown/binding-darwin-x64@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz#80ada35e9f35efb7e48a887444ce2052f615d645" - integrity sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw== +"@rolldown/binding-darwin-x64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz#f32e0b286714bd03a421d693415d05d97d265b77" + integrity sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA== -"@rolldown/binding-freebsd-x64@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz#65b2bbb82f005f08aeeff0b6d81e19be68360201" - integrity sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw== +"@rolldown/binding-freebsd-x64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz#5f38ad5761b6b7b21b57a99566bb52634c60ab19" + integrity sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg== -"@rolldown/binding-linux-arm-gnueabihf@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz#7e8d34ad0c7bcfd3baed268e9798571e3888ca71" - integrity sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg== +"@rolldown/binding-linux-arm-gnueabihf@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz#ab4dcd07f1bd88e8d659ae0c3bb9d2f290adb897" + integrity sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw== -"@rolldown/binding-linux-arm64-gnu@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz#52bbf400ff219bda1e56c042160d96deb08bfecc" - integrity sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA== +"@rolldown/binding-linux-arm64-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz#d279b7016039a725fb66d82784b9841f42df83da" + integrity sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw== -"@rolldown/binding-linux-arm64-musl@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz#9e82899186f73329f3d8155fa1618ae2e86ffa2a" - integrity sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w== +"@rolldown/binding-linux-arm64-musl@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz#d08bbc93d2742214548c5adf7df7788944e5a89a" + integrity sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q== -"@rolldown/binding-linux-ppc64-gnu@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz#050520177316586ccad816eb466ea11015e17ba7" - integrity sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw== +"@rolldown/binding-linux-ppc64-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz#6418e63745b3193f26ab3bb88744b3a4a1356d7c" + integrity sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w== -"@rolldown/binding-linux-s390x-gnu@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz#50efa7b20219c6e31235fded0fd3427f36123e5a" - integrity sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA== +"@rolldown/binding-linux-s390x-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz#77ec30d0704cf4eb1cb4a63f501c9852c6728cf4" + integrity sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg== -"@rolldown/binding-linux-x64-gnu@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz#c5973445113dff50d4077d0edaa4b8a69533dc6f" - integrity sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg== +"@rolldown/binding-linux-x64-gnu@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz#3b9b6e0dd3e86c597f42858748ca25f1dfd58ed8" + integrity sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w== -"@rolldown/binding-linux-x64-musl@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz#ddb023f7fc98ccbb8c1b683545216ca7b4e7ebdd" - integrity sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g== +"@rolldown/binding-linux-x64-musl@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz#f78033c592c8bd2af48284a45f8e4baaa0befbf5" + integrity sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A== -"@rolldown/binding-openharmony-arm64@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz#832a6da3472722427c73d178c75681858b76aeed" - integrity sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ== +"@rolldown/binding-openharmony-arm64@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz#36e951f5a6fca922a5205e283d0a82b9f98199ca" + integrity sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug== -"@rolldown/binding-wasm32-wasi@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz#256cdcc06ad9ada611606526f319642fc0830b0f" - integrity sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg== - dependencies: - "@emnapi/core" "1.11.1" - "@emnapi/runtime" "1.11.1" - "@napi-rs/wasm-runtime" "^1.1.6" +"@rolldown/binding-win32-arm64-msvc@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz#c1e494ac47e13bd857fca0b3ad59c33580241f7e" + integrity sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw== -"@rolldown/binding-win32-arm64-msvc@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz#e735c7024a5e17ebaf13689112fa0bdfc6886c38" - integrity sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g== - -"@rolldown/binding-win32-x64-msvc@1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz#f06c09db5c8ad4b6904b4d406c9b6f17f392b5c6" - integrity sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA== +"@rolldown/binding-win32-x64-msvc@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz#b0effffcd6872f8a021373eb437916b1b52283a4" + integrity sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg== "@rolldown/pluginutils@^1.0.0", "@rolldown/pluginutils@^1.0.1": version "1.0.1" @@ -1879,18 +1870,18 @@ eslint-visitor-keys@^5.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@^9.39.1: - version "9.39.4" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.4.tgz#855da1b2e2ad66dc5991195f35e262bcec8117b5" - integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== +eslint@9.39.5: + version "9.39.5" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" + integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" "@eslint/config-array" "^0.21.2" "@eslint/config-helpers" "^0.4.2" "@eslint/core" "^0.17.0" - "@eslint/eslintrc" "^3.3.5" - "@eslint/js" "9.39.4" + "@eslint/eslintrc" "^3.3.6" + "@eslint/js" "9.39.5" "@eslint/plugin-kit" "^0.4.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" @@ -2033,21 +2024,21 @@ form-data@^4.0.5: hasown "^2.0.4" mime-types "^2.1.35" -frappe-js-sdk@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/frappe-js-sdk/-/frappe-js-sdk-1.14.0.tgz#6cfc3a91598dc179890ff2b1db675f228bd1565a" - integrity sha512-v0n75UP8SffSH77QWbvD43FXndF+P8Us1MyIVH287uwPpLYYk7tXCA/ftNTn3a2YV7VdncNU7XDwxYNgAoBt8w== +frappe-js-sdk@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/frappe-js-sdk/-/frappe-js-sdk-1.14.1.tgz#b6737e64e6019ee072a667be6f56ebad3b3dd81a" + integrity sha512-HxY1KygYs/05ykjKo1YB0hQlUOiA3odEg+TWKIWRgNH0bURlXxSPiNKtBmQVOm92EhDGyqQQjQe5I1QdKSImbw== dependencies: axios "^1.18.1" -frappe-react-sdk@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/frappe-react-sdk/-/frappe-react-sdk-1.17.0.tgz#4777261b80e6ba195a007e61e75757c02b881cc1" - integrity sha512-1Q0T5Qdtm1+g0sb0PSxIvleVK17gG2QTXgRVeCC927JCFgH8UsrQNbx8MZ1ojlPIp8AahA0NRwH+C4RL0cT8sw== +frappe-react-sdk@^1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/frappe-react-sdk/-/frappe-react-sdk-1.17.1.tgz#7bd0bc87065e41acae5474d27096a18a59d56780" + integrity sha512-9FxtG8kb1kUHx67P0AsdFeEnI39HyPP2SXDquy7IkYWRX4XCA/gdrP75u/idH+SiDoy3jWJLbewSdqHq9oq5gw== dependencies: - frappe-js-sdk "^1.14.0" + frappe-js-sdk "^1.14.1" socket.io-client "4.7.1" - swr "^2.4.1" + swr "^2.4.2" fsevents@~2.3.3: version "2.3.3" @@ -2349,25 +2340,25 @@ jiti@^2.7.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.7.0.tgz#974228f2f4ca2bc21885a1797b45fea68e950c64" integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== -jotai-family@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jotai-family/-/jotai-family-1.0.2.tgz#11d9f88a39579aaf0d80dcd8826b8c32cf6b5269" - integrity sha512-U1aTMGxmsmz2Z8gaJD1/ljmMnsmG4/dqrcsfwGbjWV7p6boB9Vy3+75YwUpwPj7GbLNJk9O8rl1VNi8d7+6Rxw== +jotai-family@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jotai-family/-/jotai-family-1.1.0.tgz#87eab9c6e8b241f3bc39b6f04a3b55247ebd40bb" + integrity sha512-T1ACRsLnN5Mu0B8/DIWUW1hW7x1RmpBprm/+CWmUTf4ZZUmIFEQpBJ9PNQtXPjdUD2uu8RvwBxr7nJPdCw5BXg== -jotai@^2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.20.1.tgz#473274f1b78c60acce1b868be5655b3c706dec8e" - integrity sha512-dnuKfU/GLi8B28RRMjQ3AfoN7kfzP8o41+AX2FmITZqEMY8PHnjABq+VkEooomLwYaGjda+pgy0yFSjaHX/ZPg== +jotai@^2.20.2: + version "2.20.2" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.20.2.tgz#fccdc02ee68b314c2a723a8b9c35de6fcca5e644" + integrity sha512-aHB4CNb9qRcyf0mwSB6EO5bCGAjx8cTwFgOFCE2leOnTzqACbnSWG8XoWB3LxCT1Qoj03I1OWAHszDmN4uHb/w== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" - integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== +js-yaml@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.1.tgz#01216c001d67f48e2cd560d708c7af21090a3848" + integrity sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ== dependencies: argparse "^2.0.1" @@ -2416,57 +2407,112 @@ lightningcss-android-arm64@1.32.0: resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== +lightningcss-android-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz#9a6841f88ae50fc83502903892b41af41bc2b907" + integrity sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg== + lightningcss-darwin-arm64@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== +lightningcss-darwin-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz#c0f2c31c0bfd19fa4dd3f18e957a1f1a152097d6" + integrity sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg== + lightningcss-darwin-x64@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== +lightningcss-darwin-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz#cb0705965acb538c6683949ce6925fb3cdf7c361" + integrity sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ== + lightningcss-freebsd-x64@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== +lightningcss-freebsd-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz#763538828b26bab2680dadafcc84ee78b0eb502b" + integrity sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg== + lightningcss-linux-arm-gnueabihf@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== +lightningcss-linux-arm-gnueabihf@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz#6862e3176a331aedbdec1ed352b4d7d0dd0784de" + integrity sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ== + lightningcss-linux-arm64-gnu@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== +lightningcss-linux-arm64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz#c6a3a2ed15141daf6bdc2628930f8e39bdf473aa" + integrity sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg== + lightningcss-linux-arm64-musl@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== +lightningcss-linux-arm64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz#7fa1334971fc82845f9827df6ef8a0b20914bac6" + integrity sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ== + lightningcss-linux-x64-gnu@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== +lightningcss-linux-x64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz#8b927862ea8c2bbc6831a46509244b50d9936e55" + integrity sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg== + lightningcss-linux-x64-musl@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== +lightningcss-linux-x64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz#0c525bb077dfd94404c059cfe42dad797e96aeaf" + integrity sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw== + lightningcss-win32-arm64-msvc@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== +lightningcss-win32-arm64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz#850ee1103dac989cfab50e3ac22d1a69e394e63d" + integrity sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA== + lightningcss-win32-x64-msvc@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== -lightningcss@1.32.0, lightningcss@^1.32.0: +lightningcss-win32-x64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz#e343ae152eed3609dc6e11949d1a3bf39a1c946f" + integrity sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA== + +lightningcss@1.32.0: version "1.32.0" resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== @@ -2485,6 +2531,25 @@ lightningcss@1.32.0, lightningcss@^1.32.0: lightningcss-win32-arm64-msvc "1.32.0" lightningcss-win32-x64-msvc "1.32.0" +lightningcss@^1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.33.0.tgz#c08867d71a79385c6e190214fd72fef3e5f95f0b" + integrity sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.33.0" + lightningcss-darwin-arm64 "1.33.0" + lightningcss-darwin-x64 "1.33.0" + lightningcss-freebsd-x64 "1.33.0" + lightningcss-linux-arm-gnueabihf "1.33.0" + lightningcss-linux-arm64-gnu "1.33.0" + lightningcss-linux-arm64-musl "1.33.0" + lightningcss-linux-x64-gnu "1.33.0" + lightningcss-linux-x64-musl "1.33.0" + lightningcss-win32-arm64-msvc "1.33.0" + lightningcss-win32-x64-msvc "1.33.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3032,10 +3097,10 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.12: - version "3.3.15" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.15.tgz#36c490fad8c6e86c824c940dfdde999b69ed4316" - integrity sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA== +nanoid@^3.3.17: + version "3.3.18" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" + integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== natural-compare@^1.4.0: version "1.4.0" @@ -3125,12 +3190,17 @@ picomatch@^4.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== -postcss@^8.5.16: - version "8.5.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.16.tgz#1230ce0b5df354c24c0ea45f99ce5f6a88279d28" - integrity sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg== +picomatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" + integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== + +postcss@^8.5.25: + version "8.5.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620" + integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== dependencies: - nanoid "^3.3.12" + nanoid "^3.3.17" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -3306,10 +3376,10 @@ react-remove-scroll@^2.7.2: use-callback-ref "^1.3.3" use-sidecar "^1.1.3" -react-router@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-8.1.0.tgz#242c9169bdf8da4e080279c92048f0016eb3aa4b" - integrity sha512-Mdfi61uObuvWNN9OhChOC0HV6YWOIfKRzEWOvCHRSuQg8IM+Nv10edaM/2HE8ZixBpUTdQbruyWqC3sDkkh9vw== +react-router@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-8.3.0.tgz#b7bc69c3e3833ba79ebf892aef03d62b649508f8" + integrity sha512-qyPMvW83jGIct3yiieisxdk9M745anqhpIMKN5m1t6yBMfgVPpt77aHOqs5fUlEJRMCGffg9BaQLH9oPVOL7xQ== dependencies: cookie-es "^3.1.1" @@ -3382,29 +3452,28 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -rolldown@~1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.1.3.tgz#87072bfd0d1bdd02a66076a261a62e8e49b3f0e2" - integrity sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g== +rolldown@~1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.2.3.tgz#103bdcbbd575d51265277b8b510f080827b6eb6f" + integrity sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A== dependencies: - "@oxc-project/types" "=0.137.0" + "@oxc-project/types" "=0.143.0" "@rolldown/pluginutils" "^1.0.0" optionalDependencies: - "@rolldown/binding-android-arm64" "1.1.3" - "@rolldown/binding-darwin-arm64" "1.1.3" - "@rolldown/binding-darwin-x64" "1.1.3" - "@rolldown/binding-freebsd-x64" "1.1.3" - "@rolldown/binding-linux-arm-gnueabihf" "1.1.3" - "@rolldown/binding-linux-arm64-gnu" "1.1.3" - "@rolldown/binding-linux-arm64-musl" "1.1.3" - "@rolldown/binding-linux-ppc64-gnu" "1.1.3" - "@rolldown/binding-linux-s390x-gnu" "1.1.3" - "@rolldown/binding-linux-x64-gnu" "1.1.3" - "@rolldown/binding-linux-x64-musl" "1.1.3" - "@rolldown/binding-openharmony-arm64" "1.1.3" - "@rolldown/binding-wasm32-wasi" "1.1.3" - "@rolldown/binding-win32-arm64-msvc" "1.1.3" - "@rolldown/binding-win32-x64-msvc" "1.1.3" + "@rolldown/binding-android-arm64" "1.2.3" + "@rolldown/binding-darwin-arm64" "1.2.3" + "@rolldown/binding-darwin-x64" "1.2.3" + "@rolldown/binding-freebsd-x64" "1.2.3" + "@rolldown/binding-linux-arm-gnueabihf" "1.2.3" + "@rolldown/binding-linux-arm64-gnu" "1.2.3" + "@rolldown/binding-linux-arm64-musl" "1.2.3" + "@rolldown/binding-linux-ppc64-gnu" "1.2.3" + "@rolldown/binding-linux-s390x-gnu" "1.2.3" + "@rolldown/binding-linux-x64-gnu" "1.2.3" + "@rolldown/binding-linux-x64-musl" "1.2.3" + "@rolldown/binding-openharmony-arm64" "1.2.3" + "@rolldown/binding-win32-arm64-msvc" "1.2.3" + "@rolldown/binding-win32-x64-msvc" "1.2.3" safe-expr-eval@^1.0.4: version "1.0.4" @@ -3505,10 +3574,10 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -swr@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/swr/-/swr-2.4.2.tgz#741ba9c804db756cfa966376cbc33f84a2d88cfd" - integrity sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw== +swr@^2.4.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.5.0.tgz#186c68b08b3419a5ebba4cea53d776467c9fa2d4" + integrity sha512-W0GomadRJe9OfzIoRX0kZHhDSaRRfdiOUeH6uazgR05SibBhDNwfdTbhAxmFtObvkf59fFymo22mooKukosvNA== dependencies: dequal "^2.0.3" use-sync-external-store "^1.6.0" @@ -3705,15 +3774,15 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vite@^8.0.16: - version "8.1.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-8.1.2.tgz#3ac29b5868ccf28c59321391be1ebe906f135ebd" - integrity sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ== +vite@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-8.2.1.tgz#6fc8d8bb843bd52353091fac978e194d4de5b31d" + integrity sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw== dependencies: - lightningcss "^1.32.0" - picomatch "^4.0.4" - postcss "^8.5.16" - rolldown "~1.1.3" + lightningcss "^1.33.0" + picomatch "^4.0.5" + postcss "^8.5.25" + rolldown "~1.2.1" tinyglobby "^0.2.17" optionalDependencies: fsevents "~2.3.3" From f9fd3bc5262776181a36b24b380705ec12ef541b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 13:30:40 +0000 Subject: [PATCH 20/82] chore(deps): update eslint in banking app (backport #58129) (#58137) chore(deps): update eslint in banking app (#58129) (cherry picked from commit 0bbaf4da3ebde553f87883d4c72ff3c0b9c3fb4b) Co-authored-by: Nikhil Kothari --- banking/package.json | 4 +- banking/yarn.lock | 413 +++++++++++++++---------------------------- 2 files changed, 149 insertions(+), 268 deletions(-) diff --git a/banking/package.json b/banking/package.json index 384aec9793b..1312ddc704a 100644 --- a/banking/package.json +++ b/banking/package.json @@ -55,11 +55,11 @@ "@types/node": "^25.3.0", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "eslint": "^9.39.5", + "eslint": "^10.8.1", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", "globals": "^16.5.0", "typescript": "~5.9.3", - "typescript-eslint": "^8.62.1" + "typescript-eslint": "^8.67.0" } } diff --git a/banking/yarn.lock b/banking/yarn.lock index 7597d8518fd..512ce1fbe5d 100644 --- a/banking/yarn.lock +++ b/banking/yarn.lock @@ -206,65 +206,50 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": +"@eslint-community/regexpp@^4.12.2": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/config-array@^0.21.2": - version "0.21.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" - integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== +"@eslint/config-array@^0.23.5": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.5.tgz#56e86d243049195d8acc0c06a1b3dfdc3fa3de95" + integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== dependencies: - "@eslint/object-schema" "^2.1.7" + "@eslint/object-schema" "^3.0.5" debug "^4.3.1" - minimatch "^3.1.5" + minimatch "^10.2.4" -"@eslint/config-helpers@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" - integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== +"@eslint/config-helpers@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.7.0.tgz#09ee4aa07b73f059ec2d4c74bf4b2ff02b322377" + integrity sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw== dependencies: - "@eslint/core" "^0.17.0" + "@eslint/core" "^1.2.1" -"@eslint/core@^0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" - integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== +"@eslint/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== dependencies: "@types/json-schema" "^7.0.15" -"@eslint/eslintrc@^3.3.6": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.6.tgz#d22bfd6b3a7d8e1f2c0b2f2e6de111b53ec6e13e" - integrity sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA== - dependencies: - ajv "^6.14.0" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.3.0" - minimatch "^3.1.5" - strip-json-comments "^3.1.1" - -"@eslint/js@9.39.5": +"@eslint/js@^9.39.5": version "9.39.5" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== -"@eslint/object-schema@^2.1.7": - version "2.1.7" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" - integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== +"@eslint/object-schema@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.5.tgz#88e9bf4d11d2b19c082e78ebe7ce88724a5eb091" + integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== -"@eslint/plugin-kit@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" - integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== +"@eslint/plugin-kit@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz#4b0962f3f2c7ce8bc98b3ecfe34525c09d2cb729" + integrity sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A== dependencies: - "@eslint/core" "^0.17.0" + "@eslint/core" "^1.2.1" levn "^0.4.1" "@floating-ui/core@^1.7.5": @@ -1262,6 +1247,11 @@ dependencies: "@types/ms" "*" +"@types/esrecurse@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" + integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== + "@types/estree-jsx@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" @@ -1269,7 +1259,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8": version "1.0.9" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== @@ -1327,100 +1317,100 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@typescript-eslint/eslint-plugin@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz#1736dcdca6cae3359d818456a47d18b674761f7f" - integrity sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA== +"@typescript-eslint/eslint-plugin@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz#52f9f0e47d5a7571c4336e69bfeea581509ef2cf" + integrity sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ== dependencies: "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.62.1" - "@typescript-eslint/type-utils" "8.62.1" - "@typescript-eslint/utils" "8.62.1" - "@typescript-eslint/visitor-keys" "8.62.1" + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/type-utils" "8.67.0" + "@typescript-eslint/utils" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" ignore "^7.0.5" natural-compare "^1.4.0" ts-api-utils "^2.5.0" -"@typescript-eslint/parser@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.62.1.tgz#d3f7ba18f1bf78bfb7256fea021d1927b48e7080" - integrity sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA== +"@typescript-eslint/parser@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.67.0.tgz#0158022ec9927e0afcd58a8cc2ad57e01d892f5c" + integrity sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w== dependencies: - "@typescript-eslint/scope-manager" "8.62.1" - "@typescript-eslint/types" "8.62.1" - "@typescript-eslint/typescript-estree" "8.62.1" - "@typescript-eslint/visitor-keys" "8.62.1" + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" debug "^4.4.3" -"@typescript-eslint/project-service@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.62.1.tgz#78d880eb1cf6859b5ec263d04f95403e9f90ae47" - integrity sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg== +"@typescript-eslint/project-service@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.67.0.tgz#1552db007ca9206a1c6c7acf49e210bd17a8c56f" + integrity sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.62.1" - "@typescript-eslint/types" "^8.62.1" + "@typescript-eslint/tsconfig-utils" "^8.67.0" + "@typescript-eslint/types" "^8.67.0" debug "^4.4.3" -"@typescript-eslint/scope-manager@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz#7ee65e9a6eb3ccdc4816593a4ff38840306de88a" - integrity sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg== +"@typescript-eslint/scope-manager@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz#4d4c2da09560d10dd7d947cba2d29d14d25af16d" + integrity sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg== dependencies: - "@typescript-eslint/types" "8.62.1" - "@typescript-eslint/visitor-keys" "8.62.1" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" -"@typescript-eslint/tsconfig-utils@8.62.1", "@typescript-eslint/tsconfig-utils@^8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz#e2b5f24fe721044189cb7e81117c96d75979d627" - integrity sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g== +"@typescript-eslint/tsconfig-utils@8.67.0", "@typescript-eslint/tsconfig-utils@^8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz#f45a3eba6b9132fb47141ec03ce2f275f1ea991d" + integrity sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg== -"@typescript-eslint/type-utils@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz#ebd30b13bacb13070917259a23309cf644121f9a" - integrity sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg== +"@typescript-eslint/type-utils@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz#96bed105275559df3bcf0449b73a6414d35c59ce" + integrity sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q== dependencies: - "@typescript-eslint/types" "8.62.1" - "@typescript-eslint/typescript-estree" "8.62.1" - "@typescript-eslint/utils" "8.62.1" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + "@typescript-eslint/utils" "8.67.0" debug "^4.4.3" ts-api-utils "^2.5.0" -"@typescript-eslint/types@8.62.1", "@typescript-eslint/types@^8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.62.1.tgz#c58be954e483b2fc98275374d5bcb40b99842dc1" - integrity sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q== +"@typescript-eslint/types@8.67.0", "@typescript-eslint/types@^8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.67.0.tgz#4a8d00cc1faba5c14feabc60f85b7a32652f34b6" + integrity sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww== -"@typescript-eslint/typescript-estree@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz#98c1bb17635d5b026b24193a8d29188ac64380ff" - integrity sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA== +"@typescript-eslint/typescript-estree@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz#116c3a47c06119c5a050e8851861d6497dd64bc2" + integrity sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw== dependencies: - "@typescript-eslint/project-service" "8.62.1" - "@typescript-eslint/tsconfig-utils" "8.62.1" - "@typescript-eslint/types" "8.62.1" - "@typescript-eslint/visitor-keys" "8.62.1" + "@typescript-eslint/project-service" "8.67.0" + "@typescript-eslint/tsconfig-utils" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/visitor-keys" "8.67.0" debug "^4.4.3" minimatch "^10.2.2" semver "^7.7.3" tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.62.1.tgz#1622b75c7e6df308181dd0b44855dc4228da0457" - integrity sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g== +"@typescript-eslint/utils@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.67.0.tgz#3e478a3d69d330a1fc50c12746cc2ee0732ccfcd" + integrity sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.62.1" - "@typescript-eslint/types" "8.62.1" - "@typescript-eslint/typescript-estree" "8.62.1" + "@typescript-eslint/scope-manager" "8.67.0" + "@typescript-eslint/types" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" -"@typescript-eslint/visitor-keys@8.62.1": - version "8.62.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz#499657d77ffafb8a99eb1d6c97847ca430234722" - integrity sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g== +"@typescript-eslint/visitor-keys@8.67.0": + version "8.67.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz#601d40af9acf82a28da2286f3edafc69bba9017f" + integrity sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA== dependencies: - "@typescript-eslint/types" "8.62.1" + "@typescript-eslint/types" "8.67.0" eslint-visitor-keys "^5.0.0" "@ungap/structured-clone@^1.0.0": @@ -1440,10 +1430,10 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.15.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe" - integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== +acorn@^8.16.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== agent-base@6: version "6.0.2" @@ -1462,18 +1452,6 @@ ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - aria-hidden@^1.2.4: version "1.2.6" resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.6.tgz#73051c9b088114c795b1ea414e9c0fff874ffc1a" @@ -1506,11 +1484,6 @@ bail@^2.0.0: resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - balanced-match@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" @@ -1521,14 +1494,6 @@ baseline-browser-mapping@^2.10.38: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz#f372c8eb36ff4ad0b5e7ae467014abef124554ba" integrity sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw== -brace-expansion@^1.1.7: - version "1.1.15" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.15.tgz#a6d90d54067236e5f42570a3b7378d594d9b7738" - integrity sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - brace-expansion@^5.0.5: version "5.0.7" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.7.tgz#1b0e46965b479dad65af737b4a02790a05498337" @@ -1536,6 +1501,13 @@ brace-expansion@^5.0.5: dependencies: balanced-match "^4.0.2" +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== + dependencies: + balanced-match "^4.0.2" + browserslist@^4.24.0: version "4.28.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.4.tgz#dd8b8167a32845ff5f8cd6ce13f5abba16cd04c9" @@ -1555,11 +1527,6 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - caniuse-lite@^1.0.30001799: version "1.0.30001800" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz#b896c773e1c39400809415162bb5320371291b36" @@ -1570,14 +1537,6 @@ ccount@^2.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - character-entities-html4@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" @@ -1625,18 +1584,6 @@ cmdk@^1.1.1: "@radix-ui/react-id" "^1.1.0" "@radix-ui/react-primitive" "^2.0.2" -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1649,11 +1596,6 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -1847,11 +1789,13 @@ eslint-plugin-react-refresh@^0.5.3: resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz#0311218631193fc1ea1c37531a1e7085a813bb60" integrity sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA== -eslint-scope@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" - integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== +eslint-scope@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" + integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" esrecurse "^4.3.0" estraverse "^5.2.0" @@ -1860,42 +1804,34 @@ eslint-visitor-keys@^3.4.3: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint-visitor-keys@^5.0.0: +eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@9.39.5: - version "9.39.5" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" - integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== +eslint@^10.8.1: + version "10.8.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.8.1.tgz#fb37d514c19b6dd5b2d6b70169fd26fddfa97967" + integrity sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.21.2" - "@eslint/config-helpers" "^0.4.2" - "@eslint/core" "^0.17.0" - "@eslint/eslintrc" "^3.3.6" - "@eslint/js" "9.39.5" - "@eslint/plugin-kit" "^0.4.1" + "@eslint-community/regexpp" "^4.12.2" + "@eslint/config-array" "^0.23.5" + "@eslint/config-helpers" "^0.7.0" + "@eslint/core" "^1.2.1" + "@eslint/plugin-kit" "^0.7.2" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" "@types/estree" "^1.0.6" ajv "^6.14.0" - chalk "^4.0.0" cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.4.0" - eslint-visitor-keys "^4.2.1" - espree "^10.4.0" - esquery "^1.5.0" + eslint-scope "^9.1.2" + eslint-visitor-keys "^5.0.1" + espree "^11.2.0" + esquery "^1.7.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^8.0.0" @@ -1905,21 +1841,20 @@ eslint@9.39.5: imurmurhash "^0.1.4" is-glob "^4.0.0" json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.5" + minimatch "^10.2.5" natural-compare "^1.4.0" optionator "^0.9.3" -espree@^10.0.1, espree@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" - integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== +espree@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" + integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== dependencies: - acorn "^8.15.0" + acorn "^8.16.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.1" + eslint-visitor-keys "^5.0.1" -esquery@^1.5.0: +esquery@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== @@ -2096,11 +2031,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - globals@^16.5.0: version "16.5.0" resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" @@ -2116,11 +2046,6 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" @@ -2272,14 +2197,6 @@ ignore@^7.0.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2355,13 +2272,6 @@ jotai@^2.20.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.1.tgz#01216c001d67f48e2cd560d708c7af21090a3848" - integrity sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ== - dependencies: - argparse "^2.0.1" - jsesc@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -2567,11 +2477,6 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" @@ -3085,12 +2990,12 @@ minimatch@^10.2.2: dependencies: brace-expansion "^5.0.5" -minimatch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" - integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== +minimatch@^10.2.4, minimatch@^10.2.5: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^5.0.8" ms@^2.1.3: version "2.1.3" @@ -3143,13 +3048,6 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - parse-entities@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" @@ -3447,11 +3345,6 @@ remark-stringify@^11.0.0: mdast-util-to-markdown "^2.0.0" unified "^11.0.0" -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - rolldown@~1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.2.3.tgz#103bdcbbd575d51265277b8b510f080827b6eb6f" @@ -3548,11 +3441,6 @@ stringify-entities@^4.0.0: character-entities-html4 "^2.0.0" character-entities-legacy "^3.0.0" -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - style-to-js@^1.0.0: version "1.1.21" resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" @@ -3567,13 +3455,6 @@ style-to-object@1.0.14: dependencies: inline-style-parser "0.2.7" -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - swr@^2.4.2: version "2.5.0" resolved "https://registry.yarnpkg.com/swr/-/swr-2.5.0.tgz#186c68b08b3419a5ebba4cea53d776467c9fa2d4" @@ -3637,15 +3518,15 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -typescript-eslint@^8.62.1: - version "8.62.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.62.1.tgz#eb93fd94d527aa04ec5b844fb0b4ada613cc7d3f" - integrity sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw== +typescript-eslint@^8.67.0: + version "8.67.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.67.0.tgz#1e92de09ee0ff2d96cc0848f5e9f345ea930d963" + integrity sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg== dependencies: - "@typescript-eslint/eslint-plugin" "8.62.1" - "@typescript-eslint/parser" "8.62.1" - "@typescript-eslint/typescript-estree" "8.62.1" - "@typescript-eslint/utils" "8.62.1" + "@typescript-eslint/eslint-plugin" "8.67.0" + "@typescript-eslint/parser" "8.67.0" + "@typescript-eslint/typescript-estree" "8.67.0" + "@typescript-eslint/utils" "8.67.0" typescript@~5.9.3: version "5.9.3" From 4f3ffd382023bd3872de1450086daff58f6c57ab Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 13 Aug 2026 19:37:31 +0530 Subject: [PATCH 21/82] fix(stock): confirm before changing item qty from the batch selector (backport #58123) (#58125) --- .../js/utils/serial_no_batch_selector.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js index 9161903ba7f..0f84a84e300 100644 --- a/erpnext/public/js/utils/serial_no_batch_selector.js +++ b/erpnext/public/js/utils/serial_no_batch_selector.js @@ -670,6 +670,27 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { frappe.throw(__("Rejected Warehouse and Accepted Warehouse cannot be same.")); } + let qty_to_fetch = flt(this.dialog.get_value("qty")); + let total_qty = entries.reduce((total, row) => total + (flt(row.qty) || 1.0), 0); + + if (flt(total_qty, 6) !== flt(qty_to_fetch, 6)) { + const confirm_dialog = frappe.confirm( + __( + "Total qty of the rows ({0}) does not match the Qty to Fetch ({1}). Qty of the item will be changed to {0}. Are you sure want to proceed?", + [format_number(total_qty), format_number(qty_to_fetch)] + ), + () => this.create_bundle_entries(entries, warehouse) + ); + confirm_dialog.indicator = "blue"; + confirm_dialog.set_indicator(); + + return; + } + + this.create_bundle_entries(entries, warehouse); + } + + create_bundle_entries(entries, warehouse) { frappe .call({ method: "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.add_serial_batch_ledgers", From 795cf8544c6ee4bd572b284eee7eded219c3f82e Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Thu, 13 Aug 2026 22:44:23 +0530 Subject: [PATCH 22/82] fix(crm_settings): create custom fields for Frappe CRM on enabling synchronization (cherry picked from commit be2dea0ba2f108f388e39e316d95d4a83442a1a3) --- erpnext/crm/doctype/crm_settings/crm_settings.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/erpnext/crm/doctype/crm_settings/crm_settings.py b/erpnext/crm/doctype/crm_settings/crm_settings.py index 379c55ae5b3..73c0156e291 100644 --- a/erpnext/crm/doctype/crm_settings/crm_settings.py +++ b/erpnext/crm/doctype/crm_settings/crm_settings.py @@ -69,6 +69,13 @@ class CRMSettings(Document): self.allowed_users = [] def custom_fields_for_frappe_crm_data_sync(self): + custom_fields = self.get_frappe_crm_custom_fields() + + if self.enable_frappe_crm_data_synchronization: + create_custom_fields(custom_fields, ignore_validate=True) + + @staticmethod + def get_frappe_crm_custom_fields(): custom_fields = { "Quotation": [ { @@ -88,4 +95,4 @@ class CRMSettings(Document): ], } - create_custom_fields(custom_fields, ignore_validate=True) + return custom_fields From d66dc143e362492410337b552c7d91a5bd038462 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Thu, 13 Aug 2026 22:51:24 +0530 Subject: [PATCH 23/82] fix: patch to delete the `crm_deal` custom fields (cherry picked from commit 9613d72d8182305148cf0fb4915cb013ea37839d) --- erpnext/patches.txt | 1 + .../v16_0/remove_frappe_crm_custom_fields.py | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 erpnext/patches/v16_0/remove_frappe_crm_custom_fields.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index df0f8071cbe..617441cab50 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -500,3 +500,4 @@ erpnext.patches.v16_0.rename_italy_customer_name_fields erpnext.patches.v16_0.set_stock_uom_in_job_card erpnext.patches.v16_0.recalculate_purchase_receipt_billing_status erpnext.patches.v16_0.repair_work_order_material_transfer +erpnext.patches.v16_0.remove_frappe_crm_custom_fields diff --git a/erpnext/patches/v16_0/remove_frappe_crm_custom_fields.py b/erpnext/patches/v16_0/remove_frappe_crm_custom_fields.py new file mode 100644 index 00000000000..3f1c8e1a6f4 --- /dev/null +++ b/erpnext/patches/v16_0/remove_frappe_crm_custom_fields.py @@ -0,0 +1,27 @@ +import frappe +from frappe.custom.doctype.custom_field.custom_field import delete_custom_fields + +from erpnext.crm.doctype.crm_settings.crm_settings import CRMSettings + + +def execute(): + """Delete the `crm_deal` fields on Quotation and Customer if Frappe CRM Data Synchronization is disabled and there's no data on those fields.""" + + crm_deal_exists_in_quotation = frappe.db.has_column("Quotation", "crm_deal") and frappe.get_all( + "Quotation", filters={"crm_deal": ["is", "set"]}, limit=1 + ) + + crm_deal_exists_in_customer = frappe.db.has_column("Customer", "crm_deal") and frappe.get_all( + "Customer", filters={"crm_deal": ["is", "set"]}, limit=1 + ) + + enable_frappe_crm_data_sync = frappe.get_single_value( + "CRM Settings", "enable_frappe_crm_data_synchronization" + ) + + if enable_frappe_crm_data_sync or crm_deal_exists_in_quotation or crm_deal_exists_in_customer: + return + + custom_fields = CRMSettings.get_frappe_crm_custom_fields() + + delete_custom_fields(custom_fields) From 61b549960e47dc3b9f704ee937d265f52e097310 Mon Sep 17 00:00:00 2001 From: Pandiyan P Date: Fri, 14 Aug 2026 09:00:55 +0530 Subject: [PATCH 24/82] fix(buying): allow purchase returns against a closed purchase order (#58139) --- .../purchase_invoice/purchase_invoice.py | 8 +--- erpnext/controllers/buying_controller.py | 10 ++++- .../purchase_receipt/purchase_receipt.py | 4 +- .../purchase_receipt/test_purchase_receipt.py | 37 +++++++++++++++++++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 82fed84eafb..2ac7888671c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -286,9 +286,7 @@ class PurchaseInvoice(BuyingController): self.check_conversion_rate() self.validate_credit_to_acc() self.clear_unallocated_advances("Purchase Invoice Advance", "advances") - self.check_for_on_hold_or_closed_status( - "Purchase Order", "purchase_order", exclude_if_field="purchase_receipt" - ) + self.check_purchase_order_on_hold_or_close("purchase_order", exclude_if_field="purchase_receipt") self.validate_with_previous_doc() self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "stock_qty") @@ -1752,9 +1750,7 @@ class PurchaseInvoice(BuyingController): super().on_cancel() PurchaseTaxWithholding(self).on_cancel() - self.check_for_on_hold_or_closed_status( - "Purchase Order", "purchase_order", exclude_if_field="purchase_receipt" - ) + self.check_purchase_order_on_hold_or_close("purchase_order", exclude_if_field="purchase_receipt") if self.is_return and not self.update_billed_amount_in_purchase_order: # NOTE status updating bypassed for is_return diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index b2e8a73d065..4d83b18010e 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -981,6 +981,14 @@ class BuyingController(SubcontractingController): item.serial_and_batch_bundle, warehouse, type_of_transaction=type_of_transaction ) + def check_purchase_order_on_hold_or_close(self, ref_fieldname, exclude_if_field=None): + if self.get("is_return"): + return + + self.check_for_on_hold_or_closed_status( + "Purchase Order", ref_fieldname, exclude_if_field=exclude_if_field + ) + def update_ordered_and_reserved_qty(self): po_map = {} for d in self.get("items"): @@ -994,7 +1002,7 @@ class BuyingController(SubcontractingController): if po and po_item_rows: po_obj = frappe.get_lazy_doc("Purchase Order", po) - if po_obj.status in ["Closed", "Cancelled"]: + if po_obj.status == "Cancelled" or (po_obj.status == "Closed" and not self.get("is_return")): frappe.throw( _("{doctype} {name} is cancelled or closed.").format( doctype=frappe.bold(_("Purchase Order")), diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 54acee1af02..24227810dcb 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -264,7 +264,7 @@ class PurchaseReceipt(BuyingController): self.validate_cwip_accounts() self.validate_provisional_expense_account() - self.check_for_on_hold_or_closed_status("Purchase Order", "purchase_order") + self.check_purchase_order_on_hold_or_close("purchase_order") if getdate(self.posting_date) > getdate(nowdate()): throw(_("Posting Date cannot be future date")) @@ -437,7 +437,7 @@ class PurchaseReceipt(BuyingController): def on_cancel(self): super().on_cancel() - self.check_for_on_hold_or_closed_status("Purchase Order", "purchase_order") + self.check_purchase_order_on_hold_or_close("purchase_order") self.update_prevdoc_status() self.update_billing_status() diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 4e9dc7f747a..cede0dc726d 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -703,6 +703,43 @@ class TestPurchaseReceipt(ERPNextTestSuite): update_purchase_receipt_status(pr.name, "Closed") self.assertEqual(frappe.db.get_value("Purchase Receipt", pr.name, "status"), "Closed") + def test_purchase_return_against_closed_purchase_order(self): + from erpnext.buying.doctype.purchase_order.purchase_order import ( + make_purchase_receipt as make_pr_from_po, + ) + from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order + from erpnext.controllers.sales_and_purchase_return import make_return_doc + + po = create_purchase_order(qty=2, rate=100) + + receipts = [] + for _ in range(2): + pr = make_pr_from_po(po.name) + pr.items[0].qty = pr.items[0].received_qty = 1 + pr.submit() + receipts.append(pr) + + first_return = make_return_doc("Purchase Receipt", receipts[0].name) + first_return.submit() + + po.reload() + po.update_status("Closed") + + # a return against a closed Purchase Order should still go through, + # the same way a Delivery Note return does against a closed Sales Order + second_return = make_return_doc("Purchase Receipt", receipts[1].name) + second_return.submit() + + self.assertEqual(second_return.docstatus, 1) + self.assertEqual(frappe.db.get_value("Purchase Order", po.name, "status"), "Closed") + + # cancelling the return runs the same check on the closed order + second_return.cancel() + + # a regular receipt against the closed order must still be blocked + blocked_pr = make_pr_from_po(po.name) + self.assertRaisesRegex(frappe.InvalidStatusError, "Closed", blocked_pr.save) + def test_pr_billing_status(self): """Flow: 1. PO -> PR1 -> PI From c18881b37d5816cdb87ff4f1386500e27e1e145c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 11:18:50 +0530 Subject: [PATCH 25/82] fix: ignore historical negative batch stock in outward validation (backport #58148) (#58151) fix: ignore historical negative batch stock in outward validation (#58148) (cherry picked from commit 9239d1c2a3f4d922f44c624425746519bf44c956) Co-authored-by: rohitwaghchaure --- .../serial_and_batch_bundle.py | 5 +- .../test_serial_and_batch_bundle.py | 152 ++++++++++++++++++ 2 files changed, 156 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index cd141849eed..fc19b46c133 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -1736,13 +1736,16 @@ class SerialandBatchBundle(Document): ) precision = frappe.get_precision("Serial and Batch Entry", "qty") + posting_datetime = get_datetime(self.posting_datetime) if self.posting_datetime else None for row in batchwise_entries: if row.batch_no in available_qty: available_qty[row.batch_no] += flt(row.qty) else: available_qty[row.batch_no] = flt(row.qty) - if flt(available_qty[row.batch_no], precision) < 0: + if flt(available_qty[row.batch_no], precision) < 0 and ( + not posting_datetime or get_datetime(row.posting_datetime) >= posting_datetime + ): self.throw_negative_batch( row.batch_no, available_qty[row.batch_no], precision, row.posting_datetime ) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py index 2202987c83e..3380aaa7108 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py @@ -1419,6 +1419,158 @@ class TestSerialandBatchBundle(ERPNextTestSuite): batch_no="LSBRV-BATCH-0001", ) + def _setup_negative_batch_item(self, item_code, batches): + make_item(item_code, properties={"is_stock_item": 1, "has_batch_no": 1}) + for batch_no in batches: + if not frappe.db.exists("Batch", batch_no): + frappe.get_doc( + {"doctype": "Batch", "batch_id": batch_no, "item": item_code, "company": "_Test Company"} + ).insert(ignore_permissions=True) + + def _allow_negative_stock_temporarily(self): + for field in ("allow_negative_stock", "allow_negative_stock_for_batch"): + original = frappe.db.get_single_value("Stock Settings", field) + frappe.db.set_single_value("Stock Settings", field, 1) + self.addCleanup(frappe.db.set_single_value, "Stock Settings", field, original) + + def _disable_negative_stock(self): + frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 0) + frappe.db.set_single_value("Stock Settings", "allow_negative_stock_for_batch", 0) + + def test_historical_negative_batch_stock_does_not_block_outward(self): + from unittest.mock import patch + + from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import ( + BatchNegativeStockError, + SerialandBatchBundle, + ) + + item_code = "Test Hist Neg Batch Item" + ballast_batch, batch_no = "THNB-BALLAST-001", "THNB-BATCH-001" + self._setup_negative_batch_item(item_code, [ballast_batch, batch_no]) + warehouse = "_Test Warehouse - _TC" + + self._allow_negative_stock_temporarily() + make_stock_entry( + item_code=item_code, + qty=1000, + rate=100, + target=warehouse, + use_serial_batch_fields=True, + batch_no=ballast_batch, + posting_date=add_days(today(), -730), + posting_time="10:00:00", + ) + make_stock_entry( + item_code=item_code, + qty=100, + rate=100, + target=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -365), + posting_time="10:00:00", + ) + with patch.object(SerialandBatchBundle, "validate_negative_batch"): + make_stock_entry( + item_code=item_code, + qty=5, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -730), + posting_time="11:00:00", + ) + self._disable_negative_stock() + + make_stock_entry( + item_code=item_code, + qty=10, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + ) + + outward = make_stock_entry( + item_code=item_code, + qty=200, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + do_not_submit=True, + ) + self.assertRaises(BatchNegativeStockError, outward.submit) + + def test_backdated_outward_cannot_make_future_batch_stock_negative(self): + from erpnext.stock.stock_ledger import NegativeStockError + + item_code = "Test Future Neg Batch Item" + ballast_batch, batch_no = "TFNB-BALLAST-001", "TFNB-BATCH-001" + self._setup_negative_batch_item(item_code, [ballast_batch, batch_no]) + warehouse = "_Test Warehouse - _TC" + + make_stock_entry( + item_code=item_code, + qty=1000, + rate=100, + target=warehouse, + use_serial_batch_fields=True, + batch_no=ballast_batch, + posting_date=add_days(today(), -365), + posting_time="10:00:00", + ) + make_stock_entry( + item_code=item_code, + qty=100, + rate=100, + target=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -365), + posting_time="11:00:00", + ) + make_stock_entry( + item_code=item_code, + qty=90, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -180), + posting_time="10:00:00", + ) + make_stock_entry( + item_code=item_code, + qty=60, + rate=100, + target=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -30), + posting_time="10:00:00", + ) + + make_stock_entry( + item_code=item_code, + qty=5, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -240), + posting_time="10:00:00", + ) + + backdated = make_stock_entry( + item_code=item_code, + qty=50, + source=warehouse, + use_serial_batch_fields=True, + batch_no=batch_no, + posting_date=add_days(today(), -240), + posting_time="11:00:00", + do_not_submit=True, + ) + self.assertRaises(NegativeStockError, backdated.submit) + def get_batch_from_bundle(bundle): from erpnext.stock.serial_batch_bundle import get_batch_nos From 271d22fff1fac732ebc39b9b00d37d67900468b4 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Wed, 12 Aug 2026 15:59:16 +0530 Subject: [PATCH 26/82] test(accounts): cover reversal of a reverse journal entry also assert that a user without read access on the entry gets a permission error instead of the reversal relationship. (cherry picked from commit 80422d2108137ddafc171bf0d38b025204952bbf) --- .../journal_entry/test_journal_entry.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index 51922757d05..a34b440a228 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -248,6 +248,27 @@ class TestJournalEntry(ERPNextTestSuite): self.check_gl_entries() + def test_disallow_reversal_of_a_reversal_journal_entry(self): + from erpnext.accounts.doctype.journal_entry.mapper import make_reverse_journal_entry + + jv = make_journal_entry("_Test Bank - _TC", "Sales - _TC", 100, submit=True) + + rjv = make_reverse_journal_entry(jv.name) + rjv.posting_date = nowdate() + rjv.submit() + + self.assertRaisesRegex( + frappe.ValidationError, + "is already a Reverse Journal Entry", + make_reverse_journal_entry, + rjv.name, + ) + + # the guard must not disclose the reversal to a user who cannot read the entry + frappe.set_user("Guest") + self.addCleanup(frappe.set_user, "Administrator") + self.assertRaises(frappe.PermissionError, make_reverse_journal_entry, rjv.name) + def test_disallow_change_in_account_currency_for_a_party(self): # create jv in USD jv = make_journal_entry("_Test Bank USD - _TC", "_Test Receivable USD - _TC", 100, save=False) From 8a26834704dc4d9133f37685c1b5b60d43716f20 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Wed, 12 Aug 2026 15:59:16 +0530 Subject: [PATCH 27/82] fix(accounts): disallow reversing a reverse journal entry check read permission on the source entry before the guards run, so the reversal relationship is not disclosed to a user who cannot read it. (cherry picked from commit 9dd37d5f32b739be66123d81f4cd592746ca3803) --- .../doctype/journal_entry/journal_entry.js | 2 +- .../doctype/journal_entry/journal_entry.py | 14 ++++++++++++++ .../doctype/journal_entry/test_journal_entry.py | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index a4f096af595..3e5a3071c8f 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -95,7 +95,7 @@ frappe.ui.form.on("Journal Entry", { ); } - if (frm.doc.docstatus == 1) { + if (frm.doc.docstatus == 1 && !frm.doc.reversal_of) { frm.add_custom_button( __("Reverse Journal Entry"), function () { diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 331ed50dea3..90baa886ef5 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -1777,6 +1777,20 @@ def make_inter_company_journal_entry(name, voucher_type, company): @frappe.whitelist() def make_reverse_journal_entry(source_name, target_doc=None): + # `get_mapped_doc` checks this as well, but the guards below disclose which entry + # reverses which, so read access has to be settled before they run + if not frappe.has_permission("Journal Entry", doc=source_name): + frappe.throw(_("Not permitted"), frappe.PermissionError) + + reversal_of = frappe.db.get_value("Journal Entry", source_name, "reversal_of") + if reversal_of: + frappe.throw( + _("{0} is already a Reverse Journal Entry of {1}. Cancel it instead of reversing it.").format( + get_link_to_form("Journal Entry", source_name), + get_link_to_form("Journal Entry", reversal_of), + ) + ) + existing_reverse = frappe.db.exists("Journal Entry", {"reversal_of": source_name, "docstatus": 1}) if existing_reverse: frappe.throw( diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index a34b440a228..7b9efbd7f55 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -249,7 +249,7 @@ class TestJournalEntry(ERPNextTestSuite): self.check_gl_entries() def test_disallow_reversal_of_a_reversal_journal_entry(self): - from erpnext.accounts.doctype.journal_entry.mapper import make_reverse_journal_entry + from erpnext.accounts.doctype.journal_entry.journal_entry import make_reverse_journal_entry jv = make_journal_entry("_Test Bank - _TC", "Sales - _TC", 100, submit=True) From ea238a90acea40814abca7adb8d4b48b8f6edfdf Mon Sep 17 00:00:00 2001 From: Smit Vora Date: Tue, 28 Jul 2026 17:21:55 +0530 Subject: [PATCH 28/82] feat: taxable-base resolver hook for custom charge types (#56175) (cherry picked from commit 986cea2331ccd9965eff94893cc4fdd482326eaf) --- erpnext/controllers/taxes_and_totals.py | 105 ++++++++++++------ .../tests/test_taxes_and_totals.py | 99 +++++++++++++++++ .../public/js/controllers/taxes_and_totals.js | 90 +++++++++------ 3 files changed, 228 insertions(+), 66 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index e50a34e2f14..f8f6217e050 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -314,33 +314,32 @@ class calculate_taxes_and_totals: for item in self.doc.items: item._unrounded_net_amount = None item_tax_map = self._load_item_tax_rate(item.item_tax_rate) - cumulated_tax_fraction = 0 - total_inclusive_tax_amount_per_qty = 0 + total_tax_slope = 0 + total_tax_intercept = 0 for i, tax in enumerate(self.doc.get("taxes")): ( tax.tax_fraction_for_current_item, - inclusive_tax_amount_per_qty, - ) = self.get_current_tax_fraction(tax, item_tax_map) + tax_intercept_per_qty, + ) = self.get_current_tax_fraction(tax, item_tax_map, item) + tax.inclusive_amount_per_qty = tax_intercept_per_qty if i == 0: tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item + tax.grand_total_amount_per_qty = tax_intercept_per_qty else: + prev = self.doc.get("taxes")[i - 1] tax.grand_total_fraction_for_current_item = ( - self.doc.get("taxes")[i - 1].grand_total_fraction_for_current_item - + tax.tax_fraction_for_current_item + prev.grand_total_fraction_for_current_item + tax.tax_fraction_for_current_item ) + tax.grand_total_amount_per_qty = prev.grand_total_amount_per_qty + tax_intercept_per_qty - cumulated_tax_fraction += tax.tax_fraction_for_current_item - total_inclusive_tax_amount_per_qty += inclusive_tax_amount_per_qty * flt(item.qty) + total_tax_slope += tax.tax_fraction_for_current_item + total_tax_intercept += tax_intercept_per_qty * flt(item.qty) - if ( - not self.discount_amount_applied - and item.qty - and (cumulated_tax_fraction or total_inclusive_tax_amount_per_qty) - ): - amount = flt(item.amount) - total_inclusive_tax_amount_per_qty + if not self.discount_amount_applied and item.qty and (total_tax_slope or total_tax_intercept): + amount = flt(item.amount) - total_tax_intercept - item._unrounded_net_amount = amount / (1 + cumulated_tax_fraction) + item._unrounded_net_amount = amount / (1 + total_tax_slope) item.net_amount = flt(item._unrounded_net_amount, item.precision("net_amount")) item.net_rate = flt(item.net_amount / item.qty, item.precision("net_rate")) item.discount_percentage = flt( @@ -352,41 +351,48 @@ class calculate_taxes_and_totals: def _load_item_tax_rate(self, item_tax_rate): return json.loads(item_tax_rate) if item_tax_rate else {} - def get_current_tax_fraction(self, tax, item_tax_map): + def get_current_tax_fraction(self, tax, item_tax_map, item): """ - Get tax fraction for calculating tax exclusive amount - from tax inclusive amount + tax = slope * net + intercept. + Returns (slope, intercept_per_qty) """ - current_tax_fraction = 0 - inclusive_tax_amount_per_qty = 0 + tax_slope = 0 + tax_intercept = 0 if cint(tax.included_in_print_rate): tax_rate = self._get_tax_rate(tax, item_tax_map) if tax_rate == NOT_APPLICABLE_TAX: - return current_tax_fraction, inclusive_tax_amount_per_qty + return tax_slope, tax_intercept if tax.charge_type == "On Net Total": - current_tax_fraction = tax_rate / 100.0 + tax_slope = tax_rate / 100.0 elif tax.charge_type == "On Previous Row Amount": - current_tax_fraction = (tax_rate / 100.0) * self.doc.get("taxes")[ - cint(tax.row_id) - 1 - ].tax_fraction_for_current_item + row = self.doc.get("taxes")[cint(tax.row_id) - 1] + tax_slope = (tax_rate / 100.0) * row.tax_fraction_for_current_item + tax_intercept = (tax_rate / 100.0) * flt(getattr(row, "inclusive_amount_per_qty", 0)) elif tax.charge_type == "On Previous Row Total": - current_tax_fraction = (tax_rate / 100.0) * self.doc.get("taxes")[ - cint(tax.row_id) - 1 - ].grand_total_fraction_for_current_item + row = self.doc.get("taxes")[cint(tax.row_id) - 1] + tax_slope = (tax_rate / 100.0) * row.grand_total_fraction_for_current_item + tax_intercept = (tax_rate / 100.0) * flt(getattr(row, "grand_total_amount_per_qty", 0)) elif tax.charge_type == "On Item Quantity": - inclusive_tax_amount_per_qty = flt(tax_rate) + tax_intercept = flt(tax_rate) + + else: + # Custom charge_type: the rate applies to a resolved (fixed) base, + # e.g. a tax on MRP included in the printed price. + qty = flt(item.qty) or 1 + base = self.get_item_taxable_base(item, tax) + tax_intercept = (tax_rate / 100.0) * base / qty if getattr(tax, "add_deduct_tax", None) and tax.add_deduct_tax == "Deduct": - current_tax_fraction *= -1.0 - inclusive_tax_amount_per_qty *= -1.0 + tax_slope *= -1.0 + tax_intercept *= -1.0 - return current_tax_fraction, inclusive_tax_amount_per_qty + return tax_slope, tax_intercept def _get_tax_rate(self, tax, item_tax_map): if tax.account_head in item_tax_map: @@ -612,7 +618,6 @@ class calculate_taxes_and_totals: elif tax.charge_type == "On Net Total": if tax.account_head in item_tax_map: current_net_amount = item.net_amount - # Use unrounded net for inclusive taxes to avoid double rounding if ( cint(tax.included_in_print_rate) @@ -631,12 +636,46 @@ class calculate_taxes_and_totals: elif tax.charge_type == "On Item Quantity": # don't sum current net amount due to the field being a currency field current_tax_amount = tax_rate * item.qty + else: + # Custom charge_type: rate applies to the resolver-provided base. + base = self.get_item_taxable_base(item, tax) + current_net_amount = base + current_tax_amount = (tax_rate / 100.0) * base if not tax.get("dont_recompute_tax"): self.set_item_wise_tax(item, tax, tax_rate, current_tax_amount, current_net_amount) return current_net_amount, current_tax_amount + def get_item_taxable_base(self, item, tax): + """Per-item base a custom charge_type's rate is applied to. + + Override the base (gross, MRP, net of other taxes, …) via the + `erpnext_taxable_base_resolvers` hook + + Register a resolver in `hooks.py`, keyed by charge_type: + + erpnext_taxable_base_resolvers = {"On Gross Amount": "my_app.taxes.gross_base"} + + It receives (calc, item, tax) — calc is this instance, calc.doc the parent — + and returns the base (flt-coerced by the caller): + + def gross_base(calc, item, tax): + return item.custom_field_mrp * item.qty + + A resolver may stamp transient attributes on `item`; it can be called more than once + per item, so such stamping must be idempotent. + """ + resolvers = frappe.get_hooks("erpnext_taxable_base_resolvers") or {} + path = resolvers.get(tax.charge_type) + + if path: + method = path[-1] if isinstance(path, list | tuple) else path + return flt(frappe.get_attr(method)(self, item, tax)) + + # fallback + return flt(item.net_amount) + def set_item_wise_tax(self, item, tax, tax_rate, current_tax_amount, current_net_amount): # store tax breakup for each item multiplier = -1 if tax.get("add_deduct_tax") == "Deduct" else 1 diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py index 54067c4ce22..90eba36bcd7 100644 --- a/erpnext/controllers/tests/test_taxes_and_totals.py +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -1,12 +1,24 @@ +from unittest import mock from unittest.mock import patch import frappe +from frappe.utils import flt from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.tests.utils import ERPNextTestSuite +def resolve_on_gross(calc, item, tax): + # base = gross printed line amount + return flt(item.amount) + + +def resolve_on_mrp(calc, item, tax): + # base = MRP, not net + return flt(item.price_list_rate) * flt(item.qty) + + class TestTaxesAndTotals(ERPNextTestSuite): def test_regional_round_off_accounts(self): """ @@ -30,6 +42,93 @@ class TestTaxesAndTotals(ERPNextTestSuite): self.assertIn(test_account, frappe.flags.round_off_applicable_accounts) + def test_exclusive_custom_charge_on_resolved_base(self): + """Added (exclusive) custom charge_type whose base is resolved by the + `erpnext_taxable_base_resolvers` hook. IPI 10% on the gross product value 1000 + -> tax 100, net 1000, grand 1100.""" + so = make_sales_order(do_not_save=True) + so.items = [] + so.append( + "items", + { + "item_code": "_Test Item", + "qty": 1, + "rate": 1000, + "price_list_rate": 1000, + "warehouse": "_Test Warehouse - _TC", + }, + ) + so.set("taxes", []) + so.append( + "taxes", + { + "charge_type": "On Gross Value", + "account_head": "_Test Account Excise Duty - _TC", + "description": "IPI 10% on gross product value", + "rate": 10, + "cost_center": "_Test Cost Center - _TC", + }, + ) + + real_get_hooks = frappe.get_hooks + + def fake_get_hooks(hook=None, *args, **kwargs): + if hook == "erpnext_taxable_base_resolvers": + return { + "On Gross Value": ["erpnext.controllers.tests.test_taxes_and_totals.resolve_on_gross"] + } + return real_get_hooks(hook, *args, **kwargs) + + with mock.patch("frappe.get_hooks", side_effect=fake_get_hooks): + calculate_taxes_and_totals(so) + + self.assertEqual(so.net_total, 1000.0) + self.assertEqual(so.taxes[0].tax_amount, 100.0) + self.assertEqual(so.grand_total, 1100.0) + + def test_inclusive_custom_charge_on_resolved_base(self): + """Inclusive custom charge on a resolved base backs out non-compounding + (tax = rate x resolved base) — a resolved base is fixed, so it never + compounds. MRP 1200, printed 1000, rate 10%: tax 120, net 880.""" + so = make_sales_order(do_not_save=True) + so.items = [] + so.append( + "items", + { + "item_code": "_Test Item", + "qty": 1, + "rate": 1000, + "price_list_rate": 1200, + "warehouse": "_Test Warehouse - _TC", + }, + ) + so.set("taxes", []) + so.append( + "taxes", + { + "charge_type": "On MRP", + "account_head": "_Test Account VAT - _TC", + "description": "Tax 10% on MRP, inclusive", + "rate": 10, + "included_in_print_rate": 1, + "cost_center": "_Test Cost Center - _TC", + }, + ) + + real_get_hooks = frappe.get_hooks + + def fake_get_hooks(hook=None, *args, **kwargs): + if hook == "erpnext_taxable_base_resolvers": + return {"On MRP": ["erpnext.controllers.tests.test_taxes_and_totals.resolve_on_mrp"]} + return real_get_hooks(hook, *args, **kwargs) + + with mock.patch("frappe.get_hooks", side_effect=fake_get_hooks): + calculate_taxes_and_totals(so) + + self.assertEqual(so.taxes[0].tax_amount, 120.0) + self.assertEqual(so.net_total, 880.0) + self.assertEqual(so.grand_total, 1000.0) + def test_disabling_rounded_total_resets_base_fields(self): """Disabling rounded total should also clear base rounded values.""" so = make_sales_order(do_not_save=True) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index af993a6a082..30dcfb0e83a 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -3,6 +3,11 @@ const NOT_APPLICABLE_TAX = "N/A"; +// Per-charge_type base resolvers, mirror of the `erpnext_taxable_base_resolvers` +// server hook. A localization registers `fn(calc, item, tax)` returning the per-item +// base, so the client preview matches the server for custom charge types. +erpnext.taxable_base_resolvers = erpnext.taxable_base_resolvers || {}; + erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { setup() { this.fetch_round_off_accounts(); @@ -278,32 +283,32 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { $.each(this.frm.doc.items || [], function (n, item) { item._unrounded_net_amount = null; var item_tax_map = me._load_item_tax_rate(item.item_tax_rate); - var cumulated_tax_fraction = 0.0; - var total_inclusive_tax_amount_per_qty = 0; + var total_tax_slope = 0.0; + var total_tax_intercept = 0; $.each(me.frm.doc["taxes"] || [], function (i, tax) { - var current_tax_fraction = me.get_current_tax_fraction(tax, item_tax_map); - tax.tax_fraction_for_current_item = current_tax_fraction[0]; - var inclusive_tax_amount_per_qty = current_tax_fraction[1]; + var tax_contribution = me.get_current_tax_fraction(tax, item_tax_map, item); + tax.tax_fraction_for_current_item = tax_contribution[0]; + var tax_intercept_per_qty = tax_contribution[1]; + tax.inclusive_amount_per_qty = tax_intercept_per_qty; if (i == 0) { tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item; + tax.grand_total_amount_per_qty = tax_intercept_per_qty; } else { + var prev = me.frm.doc["taxes"][i - 1]; tax.grand_total_fraction_for_current_item = - me.frm.doc["taxes"][i - 1].grand_total_fraction_for_current_item + - tax.tax_fraction_for_current_item; + prev.grand_total_fraction_for_current_item + tax.tax_fraction_for_current_item; + tax.grand_total_amount_per_qty = + flt(prev.grand_total_amount_per_qty) + tax_intercept_per_qty; } - cumulated_tax_fraction += tax.tax_fraction_for_current_item; - total_inclusive_tax_amount_per_qty += inclusive_tax_amount_per_qty * flt(item.qty); + total_tax_slope += tax.tax_fraction_for_current_item; + total_tax_intercept += tax_intercept_per_qty * flt(item.qty); }); - if ( - !me.discount_amount_applied && - item.qty && - (total_inclusive_tax_amount_per_qty || cumulated_tax_fraction) - ) { - var amount = flt(item.amount) - total_inclusive_tax_amount_per_qty; - item._unrounded_net_amount = amount / (1 + cumulated_tax_fraction); + if (!me.discount_amount_applied && item.qty && (total_tax_intercept || total_tax_slope)) { + var amount = flt(item.amount) - total_tax_intercept; + item._unrounded_net_amount = amount / (1 + total_tax_slope); item.net_amount = flt(item._unrounded_net_amount, precision("net_amount", item)); item.net_rate = item.qty ? flt(item.net_amount / item.qty, precision("net_rate", item)) : 0; @@ -312,39 +317,53 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { }); } - get_current_tax_fraction(tax, item_tax_map) { - // Get tax fraction for calculating tax exclusive amount - // from tax inclusive amount - var current_tax_fraction = 0.0; - var inclusive_tax_amount_per_qty = 0; + get_current_tax_fraction(tax, item_tax_map, item) { + // tax = slope * net + intercept. + // Returns [slope, intercept_per_qty] + var tax_slope = 0.0; + var tax_intercept = 0; if (cint(tax.included_in_print_rate)) { var tax_rate = this._get_tax_rate(tax, item_tax_map); if (tax_rate === NOT_APPLICABLE_TAX) { - return [current_tax_fraction, inclusive_tax_amount_per_qty]; + return [tax_slope, tax_intercept]; } if (tax.charge_type == "On Net Total") { - current_tax_fraction = tax_rate / 100.0; + tax_slope = tax_rate / 100.0; } else if (tax.charge_type == "On Previous Row Amount") { - current_tax_fraction = - (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.row_id) - 1].tax_fraction_for_current_item; + const row = this.frm.doc["taxes"][cint(tax.row_id) - 1]; + tax_slope = (tax_rate / 100.0) * row.tax_fraction_for_current_item; + tax_intercept = (tax_rate / 100.0) * flt(row.inclusive_amount_per_qty); } else if (tax.charge_type == "On Previous Row Total") { - current_tax_fraction = - (tax_rate / 100.0) * - this.frm.doc["taxes"][cint(tax.row_id) - 1].grand_total_fraction_for_current_item; + const row = this.frm.doc["taxes"][cint(tax.row_id) - 1]; + tax_slope = (tax_rate / 100.0) * row.grand_total_fraction_for_current_item; + tax_intercept = (tax_rate / 100.0) * flt(row.grand_total_amount_per_qty); } else if (tax.charge_type == "On Item Quantity") { - inclusive_tax_amount_per_qty = flt(tax_rate); + tax_intercept = flt(tax_rate); + } else { + // Custom charge_type: the rate applies to a resolved (fixed) base, + // e.g. a tax on MRP included in the printed price. + const qty = flt(item.qty) || 1; + const base = this.get_item_taxable_base(item, tax); + tax_intercept = ((tax_rate / 100.0) * base) / qty; } } if (tax.add_deduct_tax && tax.add_deduct_tax == "Deduct") { - current_tax_fraction *= -1; - inclusive_tax_amount_per_qty *= -1; + tax_slope *= -1; + tax_intercept *= -1; } - return [current_tax_fraction, inclusive_tax_amount_per_qty]; + return [tax_slope, tax_intercept]; + } + + get_item_taxable_base(item, tax) { + // Mirror of the server get_item_taxable_base: a custom charge_type's resolver + // overrides the base value; otherwise the net amount. + const resolver = erpnext.taxable_base_resolvers[tax.charge_type]; + if (resolver) return flt(resolver(this, item, tax)); + return flt(item.net_amount); } _get_tax_rate(tax, item_tax_map) { @@ -606,6 +625,11 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { } else if (tax.charge_type == "On Item Quantity") { // don't sum current net amount due to the field being a currency field current_tax_amount = tax_rate * item.qty; + } else { + // Custom charge_type: rate applies to the resolver-provided base. + var resolved_base = this.get_item_taxable_base(item, tax); + current_net_amount = resolved_base; + current_tax_amount = (tax_rate / 100.0) * resolved_base; } return [current_net_amount, current_tax_amount]; From f8c327004981f966b743b777053875d2d97d0056 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 08:25:09 +0000 Subject: [PATCH 29/82] feat(accounts): opt-in 'Consider Accounting Dimension' filter on General Ledger Report (backport #58156) (#58158) --- .../accounts_settings/accounts_settings.json | 17 ++++++++++++----- .../accounts_settings/accounts_settings.py | 1 + .../report/general_ledger/general_ledger.js | 2 +- erpnext/startup/boot.py | 3 +++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 3177d377267..d55a95f2ea3 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -94,13 +94,14 @@ "column_break_25", "reports_tab", "remarks_section", - "general_ledger_remarks_length", - "receivable_payable_remarks_length", + "disable_include_dimensions", "column_break_lvjk", + "general_ledger_remarks_length", "accounts_receivable_payable_tuning_section", "receivable_payable_fetch_method", "default_ageing_range", "column_break_ntmi", + "receivable_payable_remarks_length", "legacy_section", "ignore_is_opening_check_for_reporting", "tab_break_dpet", @@ -476,7 +477,7 @@ { "fieldname": "remarks_section", "fieldtype": "Section Break", - "label": "Remarks Column Length" + "label": "General Ledger Report" }, { "default": "0", @@ -550,7 +551,7 @@ { "fieldname": "accounts_receivable_payable_tuning_section", "fieldtype": "Section Break", - "label": "Accounts Receivable / Payable Tuning" + "label": "Accounts Receivable / Payable Report" }, { "fieldname": "legacy_section", @@ -782,6 +783,12 @@ "fieldname": "book_stock_expense_gl_entries", "fieldtype": "Check", "label": "Book Stock Expense GL Entries" + }, + { + "default": "0", + "fieldname": "disable_include_dimensions", + "fieldtype": "Check", + "label": "Disable \"Consider Accounting Dimension\" Filter" } ], "grid_page_length": 50, @@ -790,7 +797,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-08-13 14:48:13.211701", + "modified": "2026-08-14 13:12:47.895908", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py index 0497429e6d2..da653cb3c50 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -72,6 +72,7 @@ class AccountsSettings(Document): default_ageing_range: DF.Data | None delete_linked_ledger_entries: DF.Check determine_address_tax_category_from: DF.Literal["Billing Address", "Shipping Address"] + disable_include_dimensions: DF.Check enable_accounting_dimensions: DF.Check enable_common_party_accounting: DF.Check enable_discounts_and_margin: DF.Check diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 7ebaf84d9d2..f41d8a27113 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -175,7 +175,7 @@ frappe.query_reports["General Ledger"] = { fieldname: "include_dimensions", label: __("Consider Accounting Dimensions"), fieldtype: "Check", - default: 1, + default: frappe.boot.sysdefaults.disable_include_dimensions ? 0 : 1, }, { fieldname: "disable_opening_balance_calculation", diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py index 08cf9154c2b..ca9fbfc3884 100644 --- a/erpnext/startup/boot.py +++ b/erpnext/startup/boot.py @@ -24,6 +24,9 @@ def boot_session(bootinfo): bootinfo.sysdefaults.over_billing_allowance = frappe.get_single_value( "Accounts Settings", "over_billing_allowance" ) + bootinfo.sysdefaults.disable_include_dimensions = cint( + frappe.get_single_value("Accounts Settings", "disable_include_dimensions") + ) bootinfo.sysdefaults.quotation_valid_till = cint( frappe.db.get_single_value("CRM Settings", "default_valid_till") From 0255314ea73abf7436b479060c1df7141d85752d Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 14 Aug 2026 14:50:10 +0530 Subject: [PATCH 30/82] fix: get items from sales order in sales invoice (#58163) --- erpnext/selling/doctype/sales_order/sales_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index b77145f8b69..07fcff0e7a3 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1331,8 +1331,8 @@ def get_qty_net_of_returns(so_item) -> float: def make_sales_invoice( source_name: str, target_doc: str | dict | Document | None = None, - ignore_permissions: bool = False, args: str | dict | None = None, + ignore_permissions: bool = False, ): if args is None: args = {} From 1ea1d5d6a5a66a0e58f4f3e541537b2d506430f1 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 16:05:22 +0530 Subject: [PATCH 31/82] fix: renaming the overdue billing checkbox (backport #58165) (#58166) fix: renaming the overdue billing checkbox (#58165) (cherry picked from commit 917badb82b4289664ad74b8df843b64491d010ae) Co-authored-by: Jatin3128 <140256508+Jatin3128@users.noreply.github.com> --- .../accounts/doctype/accounts_settings/accounts_settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index d55a95f2ea3..6ca87828e84 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -283,7 +283,7 @@ "description": "Block a new Sales Invoice when the customer's overdue amount exceeds the Overdue Limit set on the customer.", "fieldname": "enable_overdue_billing_threshold", "fieldtype": "Check", - "label": "Restrict Customer Over Billing" + "label": "Prevent Sales Invoice when Customer is Overdue" }, { "depends_on": "eval:doc.enable_overdue_billing_threshold", @@ -797,7 +797,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-08-14 13:12:47.895908", + "modified": "2026-08-14 15:26:49.070889", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", From 7b0df4b28bab40c228a40235966575116c4cd4cb Mon Sep 17 00:00:00 2001 From: nishkagosalia Date: Fri, 14 Aug 2026 15:52:30 +0530 Subject: [PATCH 32/82] fix: validation for task end date check (cherry picked from commit 7c6da80f9883ee2f6291631c3e1ce8e4086df4d1) --- erpnext/projects/doctype/task/task.py | 42 ++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index 708558f62cd..2e4a47e3209 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -122,19 +122,35 @@ class Task(NestedSet): if not self.project or frappe.in_test: return - if project_end_date := frappe.db.get_value("Project", self.project, "expected_end_date"): - project_end_date = getdate(project_end_date) - for fieldname in ("exp_start_date", "exp_end_date", "act_start_date", "act_end_date"): - task_date = self.get(fieldname) - if task_date and date_diff(project_end_date, getdate(task_date)) < 0: - frappe.throw( - _("{0}'s {1} cannot be after {2}'s Expected End Date.").format( - frappe.bold(frappe.get_desk_link("Task", self.name)), - _(self.meta.get_label(fieldname)), - frappe.bold(frappe.get_desk_link("Project", self.project)), - ), - frappe.exceptions.InvalidDates, - ) + project_start_date, project_end_date = frappe.db.get_value( + "Project", self.project, ["expected_start_date", "expected_end_date"] + ) + + for fieldname in ("exp_start_date", "exp_end_date", "act_start_date", "act_end_date"): + task_date = self.get(fieldname) + if not task_date: + continue + task_date = getdate(task_date) + + if project_end_date and date_diff(getdate(project_end_date), task_date) < 0: + frappe.throw( + _("{0}'s {1} cannot be after {2}'s Expected End Date.").format( + get_link_to_form("Task", self.name), + _(self.meta.get_label(fieldname)), + get_link_to_form("Project", self.project), + ), + frappe.exceptions.InvalidDates, + ) + + if project_start_date and date_diff(task_date, getdate(project_start_date)) < 0: + frappe.throw( + _("{0}'s {1} cannot be before {2}'s Expected Start Date.").format( + get_link_to_form("Task", self.name), + _(self.meta.get_label(fieldname)), + get_link_to_form("Project", self.project), + ), + frappe.exceptions.InvalidDates, + ) def validate_status(self): if self.is_template and self.status != "Template": From 4bb7799919bbc7db501b340d7e64c460de7f0c09 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 17:43:14 +0530 Subject: [PATCH 33/82] fix: rewriting the description of the overdue billing checkbox (backport #58172) (#58174) fix: rewriting the description of the overdue billing checkbox (#58172) fix: rewritting the description of the overdue billing checkbox (cherry picked from commit cbf8f61101fb2c3252f24db7aa5bc15193d1b031) Co-authored-by: Jatin3128 <140256508+Jatin3128@users.noreply.github.com> --- .../accounts/doctype/accounts_settings/accounts_settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 6ca87828e84..93928e9b149 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -280,7 +280,7 @@ }, { "default": "0", - "description": "Block a new Sales Invoice when the customer's overdue amount exceeds the Overdue Limit set on the customer.", + "description": "Enabling this option prevents the creation of a new Sales Invoice when the customer has an overdue limit set and their outstanding overdue amount exceeds that limit.", "fieldname": "enable_overdue_billing_threshold", "fieldtype": "Check", "label": "Prevent Sales Invoice when Customer is Overdue" From d3a4d476eb61295b09443d6fdbba49750a674b23 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:58:07 +0000 Subject: [PATCH 34/82] fix(stock): honour pick serial / batch based on in the batch selector (backport #58176) (#58182) Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com> --- .../public/js/utils/serial_no_batch_selector.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js index 0f84a84e300..1b93c9b46c9 100644 --- a/erpnext/public/js/utils/serial_no_batch_selector.js +++ b/erpnext/public/js/utils/serial_no_batch_selector.js @@ -8,6 +8,16 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { ? this.item.rejected_serial_and_batch_bundle : this.item.serial_and_batch_bundle; + this.init(); + } + + async init() { + try { + this.based_on = await erpnext.stock.get_pick_serial_batch_based_on(); + } catch (e) { + this.based_on = "FIFO"; + } + this.make(); this.render_data(); } @@ -390,7 +400,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { { fieldtype: "Select", options: ["FIFO", "LIFO", "Expiry"], - default: "FIFO", + default: this.based_on, fieldname: "based_on", label: __("Fetch Based On"), onchange: () => this.get_auto_data(), @@ -536,7 +546,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate { } if (!based_on) { - based_on = "FIFO"; + based_on = this.based_on; } let warehouse = this.item.warehouse || this.item.s_warehouse; From d805f4d3fc7ebd0eed762436e2192ae4e416fa29 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 16:57:25 +0000 Subject: [PATCH 35/82] feat: Belgian Charts of Accounts (commercial + non-profit, FR + NL) (backport #54679) (#58186) Co-authored-by: Antoine Maas Co-authored-by: Claude Co-authored-by: Diptanil Saha --- .../unverified/be_l10nbe_chart_template.json | 1539 ---------------- ...liseerd_rekeningstelsel_ondernemingen.json | 1597 +++++++++++++++++ ...eningstelsel_verenigingen_stichtingen.json | 1478 +++++++++++++++ ...mum_normalise_associations_fondations.json | 1478 +++++++++++++++ ...mptable_minimum_normalise_entreprises.json | 1597 +++++++++++++++++ 5 files changed, 6150 insertions(+), 1539 deletions(-) delete mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/unverified/be_l10nbe_chart_template.json create mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_ondernemingen.json create mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_verenigingen_stichtingen.json create mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_associations_fondations.json create mode 100644 erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_entreprises.json diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/be_l10nbe_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/be_l10nbe_chart_template.json deleted file mode 100644 index 7fc58ce410b..00000000000 --- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/be_l10nbe_chart_template.json +++ /dev/null @@ -1,1539 +0,0 @@ -{ - "country_code": "be", - "name": "Belgian - PCMN", - "tree": { - "CLASSE 1": { - "BENEFICE (PERTE) REPORTE(E)": { - "B\u00e9n\u00e9fice report\u00e9": {}, - "Perte report\u00e9e": {} - }, - "CAPITAL": { - "Capital non appel\u00e9": {}, - "Capital souscrit ou capital personnel": { - "Capital amorti": {}, - "Capital non amorti": {} - }, - "Compte de l'exploitant": { - "Imp\u00f4ts personnels": {}, - "Op\u00e9rations courantes": {}, - "R\u00e9mun\u00e9rations et autres avantages": {} - } - }, - "COMPTES DE LIAISON DES ETABLISSEMENTS ET SUCCURSALES": {}, - "DETTES A PLUS D'UN AN": { - "Acomptes re\u00e7us sur commandes": {}, - "Autres emprunts": {}, - "Cautionnements re\u00e7us en num\u00e9raires": {}, - "Dettes commerciales": { - "Effets \u00e0 payer": { - "Entreprises apparent\u00e9es": { - "Entreprises avec lesquelles il existe un lien de participation": {}, - "Entreprises li\u00e9es": {} - }, - "Fournisseurs ordinaires": { - "Fournisseurs C.E.E.": {}, - "Fournisseurs belges": {}, - "Fournisseurs importation": {} - } - }, - "Fournisseurs : dettes en compte": { - "Entreprises apparent\u00e9es": { - "Entreprises avec lesquelles il existe un lien de participation": {}, - "Entreprises li\u00e9es": {} - }, - "Fournisseurs ordinaires": { - "Fournisseurs C.E.E.": {}, - "Fournisseurs belges": {}, - "Fournisseurs importation": {} - } - } - }, - "Dettes de location-financement et assimil\u00e9s": { - "Dettes de location-financement de biens immobiliers": {}, - "Dettes de location-financement de biens mobiliers": {}, - "Dettes sur droits r\u00e9els sur immeubles": {} - }, - "Dettes diverses": { - "Administrateurs, g\u00e9rants, associ\u00e9s": {}, - "Autres dettes diverses": {}, - "Autres entreprises avec lesquelles il existe un lien de participation": {}, - "Dettes envers les coparticipants des associations momentan\u00e9es et en participation": {}, - "Entreprises li\u00e9es": {}, - "Rentes viag\u00e8res capitalis\u00e9es": {} - }, - "Emprunts obligataires non subordonn\u00e9s": { - "Convertibles": {}, - "Non convertibles": {} - }, - "Emprunts subordonn\u00e9s": { - "Convertibles": {}, - "Non convertibles": {} - }, - "Etablissements de cr\u00e9dit": { - "Cr\u00e9dits d'acceptation": { - "Banque A": {}, - "Banque B": {} - }, - "Dettes en compte": { - "Banque A": {}, - "Banque B": {} - }, - "Promesses": { - "Banque A": {}, - "Banque B": {} - } - } - }, - "PLUS-VALUES DE REEVALUATION": { - "Plus-values de r\u00e9\u00e9valuation sur immobilisations corporelles": { - "Plus-values de r\u00e9\u00e9valuation": {}, - "Reprises de r\u00e9ductions de valeur": {} - }, - "Plus-values de r\u00e9\u00e9valuation sur immobilisations financi\u00e8res": { - "Plus-values de r\u00e9\u00e9valuation": {}, - "Reprises de r\u00e9ductions de valeur": {} - }, - "Plus-values de r\u00e9\u00e9valuation sur immobilisations incorporelles": { - "Plus-values de r\u00e9\u00e9valuation": {}, - "Reprises de r\u00e9ductions de valeur": {} - }, - "Plus-values de r\u00e9\u00e9valuation sur stocks": {}, - "Reprises de r\u00e9ductions de valeur sur placements de tr\u00e9sorerie": {} - }, - "PRIMES D'EMISSION": {}, - "PROVISIONS POUR RISQUES ET CHARGES": { - "Provisions pour autres risques et charges": {}, - "Provisions pour charges fiscales": {}, - "Provisions pour engagements relatifs \u00e0 l'acquisition ou \u00e0 la cession d'immobilisations": {}, - "Provisions pour ex\u00e9cution de commandes pass\u00e9es ou re\u00e7ues": {}, - "Provisions pour garanties techniques attach\u00e9es aux ventes et prestations d\u00e9j\u00e0 effectu\u00e9es par l'entreprise": {}, - "Provisions pour grosses r\u00e9parations et gros entretiens": {}, - "Provisions pour pensions et obligations similaires": {}, - "Provisions pour positions et march\u00e9s \u00e0 terme en devises ou positions et march\u00e9s \u00e0 terme en marchandises": {}, - "Provisions pour s\u00fbret\u00e9s personnelles ou r\u00e9elles constitu\u00e9es \u00e0 l'appui de dettes et d'engagements de tiers": {} - }, - "RESERVES": { - "R\u00e9serve l\u00e9gale": {}, - "R\u00e9serves disponibles": { - "R\u00e9serve pour installations en faveur du personnel 1333 R\u00e9serves libres": {}, - "R\u00e9serve pour renouvellement des immobilisations": {}, - "R\u00e9serve pour r\u00e9gularisation de dividendes": {} - }, - "R\u00e9serves immunis\u00e9es": {}, - "R\u00e9serves indisponibles": { - "Autres r\u00e9serves indisponibles": {}, - "R\u00e9serve pour actions propres": {} - } - }, - "SUBSIDES EN CAPITAL": { - "Montants obtenus": {}, - "Montants transf\u00e9r\u00e9s aux r\u00e9sultats": {} - }, - "root_type": "" - }, - "CLASSE 2. FRAIS D'ETABLISSEMENT. ACTIFS IMMOBILISES ET CREANCES A PLUS D'UN AN": { - "AUTRES IMMOBILISATIONS CORPORELLES": { - "Amortissements sur autres immobilisations corporelles": { - "Amortissements sur emballages r\u00e9cup\u00e9rables": {}, - "Amortissements sur frais d'am\u00e9nagement des locaux pris en location": {}, - "Amortissements sur maison d'habitation": {}, - "Amortissements sur mat\u00e9riel d'emballage": {}, - "Amortissements sur r\u00e9serve immobili\u00e8re": {} - }, - "Emballages r\u00e9cup\u00e9rables": {}, - "Frais d'am\u00e9nagements de locaux pris en location": {}, - "Maison d'habitation": {}, - "Mat\u00e9riel d'emballage": {}, - "Plus-values act\u00e9es sur autres immobilisations corporelles": {}, - "R\u00e9serve immobili\u00e8re": {} - }, - "CREANCES A PLUS D'UN AN": { - "Autres cr\u00e9ances": { - "Cr\u00e9ances douteuses": {}, - "Cr\u00e9ances en compte": { - "Cr\u00e9ances autres d\u00e9biteurs": {}, - "Cr\u00e9ances entreprises avec lesquelles il existe un lien de participation": {}, - "Cr\u00e9ances entreprises li\u00e9es": {} - }, - "Cr\u00e9ances r\u00e9sultant de la cession d'immobilisations donn\u00e9es en leasing": {}, - "Effets \u00e0 recevoir": { - "Sur autres d\u00e9biteurs": {}, - "Sur entreprises avec lesquelles il existe un lien de participation": {}, - "Sur entreprises li\u00e9es": {} - }, - "R\u00e9ductions de valeur act\u00e9es": {} - }, - "Cr\u00e9ances commerciales": { - "Acomptes vers\u00e9s": {}, - "Clients": { - "Cr\u00e9ances en compte sur entreprises li\u00e9es": {}, - "Cr\u00e9ances sur les coparticipants": {}, - "Sur clients Belgique": {}, - "Sur clients C.E.E.": {}, - "Sur clients exportation hors C.E.E.": {}, - "Sur entreprises avec lesquelles il existe un lien de participation": {} - }, - "Cr\u00e9ances douteuses": {}, - "Effets \u00e0 recevoir": { - "Sur clients Belgique": {}, - "Sur clients C.E.E.": {}, - "Sur clients exportation hors C.E.E.": {}, - "Sur entreprises avec lesquelles il existe un lien de participation": {}, - "Sur entreprises li\u00e9es": {} - }, - "Retenues sur garanties": {}, - "R\u00e9ductions de valeur act\u00e9es": {} - } - }, - "FRAIS D'ETABLISSEMENT": { - "Autres frais d'\u00e9tablissement": { - "Amortissements sur autres frais d'\u00e9tablissement": {}, - "Autres frais d'\u00e9tablissement": {} - }, - "Frais d'\u00e9mission d'emprunts et primes de remboursement": { - "Agios sur emprunts et frais d'\u00e9mission d'emprunts": {}, - "Amortissements sur agios sur emprunts et frais d'\u00e9mission d'emprunts": {} - }, - "Frais de constitution et d'augmentation de capital": { - "Amortissements sur frais de constitution et d'augmentation de capital": {}, - "Frais de constitution et d'augmentation de capital": {} - }, - "Frais de restructuration": { - "Amortissements sur frais de restructuration": {}, - "Co\u00fbt des frais de restructuration": {} - }, - "Int\u00e9r\u00eats intercalaires": { - "Amortissements sur int\u00e9r\u00eats intercalaires": {}, - "Int\u00e9r\u00eats intercalaires": {} - } - }, - "IMMOBILISATION DETENUES EN LOCATION-FINANCEMENT ET DROITS SIMILAIRES": { - "Installations, machines et outillage": { - "Amortissements sur installations, machines et outillage pris en leasing": {}, - "Installations": {}, - "Machines": {}, - "Outillage": {}, - "Plus-values act\u00e9es sur installations, machines et outillage pris en leasing": {} - }, - "Mobilier et mat\u00e9riel roulant": { - "Amortissements sur mobilier et mat\u00e9riel roulant en leasing": {}, - "Mat\u00e9riel roulant": {}, - "Mobilier": {}, - "Plus-values act\u00e9es sur mobilier et mat\u00e9riel roulant en leasing": {} - }, - "Terrains et constructions": { - "Amortissements et r\u00e9ductions de valeur sur terrains et constructions en leasing": {}, - "Constructions": {}, - "Plus-values sur emphyt\u00e9ose, leasing et droits similaires : terrains et constructions": {}, - "Terrains": {} - } - }, - "IMMOBILISATIONS CORPORELLES EN COURS ET ACOMPTES VERSES": { - "Avances et acomptes vers\u00e9s sur immobilisations en cours": {}, - "Immobilisations en cours": { - "Autres immobilisations corporelles": {}, - "Constructions": {}, - "Installations, machines et outillage": {}, - "Mobilier et mat\u00e9riel roulant": {} - } - }, - "IMMOBILISATIONS FINANCIERES": { - "Autres actions et parts": { - "Montants non appel\u00e9s": {}, - "Plus-values act\u00e9es": {}, - "R\u00e9ductions de valeur act\u00e9es": {}, - "Valeur d'acquisition": {} - }, - "Autres cr\u00e9ances": { - "Cr\u00e9ances douteuses": {}, - "Cr\u00e9ances en compte": {}, - "Effets \u00e0 recevoir": {}, - "R\u00e9ductions de valeur act\u00e9es": {}, - "Titres \u00e0 revenu fixe": {} - }, - "Cautionnements vers\u00e9s en num\u00e9raires": { - "Autres cautionnements vers\u00e9s en num\u00e9raires": {}, - "Eau": {}, - "Electricit\u00e9": {}, - "Gaz": {}, - "T\u00e9l\u00e9phone, t\u00e9lefax, t\u00e9lex": {} - }, - "Cr\u00e9ances sur des entreprises avec lesquelles il existe un lien de participation": { - "Cr\u00e9ances douteuses": {}, - "Cr\u00e9ances en compte": {}, - "Effets \u00e0 recevoir": {}, - "R\u00e9ductions de valeurs act\u00e9es": {}, - "Titres \u00e0 revenu fixe": {} - }, - "Cr\u00e9ances sur des entreprises li\u00e9es": { - "Cr\u00e9ances douteuses": {}, - "Cr\u00e9ances en compte": {}, - "Effets \u00e0 recevoir": {}, - "R\u00e9ductions de valeurs act\u00e9es": {}, - "Titres \u00e0 revenu fixes": {} - }, - "Participations dans des entreprises avec lesquelles il existe un lien de participation": { - "Montants non appel\u00e9s": {}, - "Plus-values act\u00e9es": {}, - "R\u00e9ductions de valeurs act\u00e9es": {}, - "Valeur d'acquisition": {} - }, - "Participations dans des entreprises li\u00e9es": { - "Montants non appel\u00e9s": {}, - "Plus-values act\u00e9es": {}, - "R\u00e9ductions de valeurs act\u00e9es": {}, - "Valeur d'acquisition": {} - } - }, - "IMMOBILISATIONS INCORPORELLES": { - "Acomptes vers\u00e9s": {}, - "Concessions, brevets, licences, savoir-faire, marques et droits similaires": { - "Amortissements sur concessions, brevets, etc...": {}, - "Concessions, brevets, licences, savoir-faire, marques, etc...": {}, - "Plus-values act\u00e9es sur concessions, brevets, etc...": {} - }, - "Frais de recherche et de d\u00e9veloppement": { - "Amortissements sur frais de recherche et de mise au point": {}, - "Frais de recherche et de mise au point": {}, - "Plus-values act\u00e9es sur frais de recherche et de mise au point": {} - }, - "Goodwill": { - "Amortissements sur goodwill": {}, - "Co\u00fbt d'acquisition": {}, - "Plus-values act\u00e9es": {} - } - }, - "INSTALLATIONS, MACHINES ET OUTILLAGE": { - "Amortissements": { - "Sur installations": {}, - "Sur machines": {}, - "Sur outillage": {} - }, - "Installations": { - "Installation d'eau": {}, - "Installation d'\u00e9lectricit\u00e9": {}, - "Installation de chargement": {}, - "Installation de chauffage": {}, - "Installation de conditionnement d'air": {}, - "Installation de gaz": {}, - "Installation de vapeur": {} - }, - "Machines": { - "Division A": {}, - "Division B": {} - }, - "Outillage": { - "Division A": {}, - "Division B": {} - }, - "Plus-values act\u00e9es": { - "Sur installations": {}, - "Sur machines": {}, - "Sur outillage": {} - } - }, - "MOBILIER ET MATERIEL ROULANT": { - "Mat\u00e9riel roulant": { - "Amortissements sur mat\u00e9riel roulant": { - "Amortissements sur mat\u00e9riel automobile": {}, - "Idem sur mat\u00e9riel a\u00e9rien": {}, - "Idem sur mat\u00e9riel ferroviaire": {}, - "Idem sur mat\u00e9riel fluvial": {}, - "Idem sur mat\u00e9riel naval": {} - }, - "Mat\u00e9riel automobile": { - "Camions": {}, - "Voitures": {} - }, - "Mat\u00e9riel a\u00e9rien": {}, - "Mat\u00e9riel ferroviaire": {}, - "Mat\u00e9riel fluvial": {}, - "Mat\u00e9riel naval": {}, - "Plus-values sur mat\u00e9riel roulant": { - "Idem sur mat\u00e9riel a\u00e9rien": {}, - "Idem sur mat\u00e9riel ferroviaire": {}, - "Idem sur mat\u00e9riel fluvial": {}, - "Idem sur mat\u00e9riel naval": {}, - "Plus-values sur mat\u00e9riel automobile": {} - } - }, - "Mobilier": { - "Amortissements": { - "Amortissements sur mat\u00e9riel de bureau et service social": {}, - "Amortissements sur mobilier": {} - }, - "Mat\u00e9riel de bureau et de service social": { - "Des autres b\u00e2timents d'exploitation": {}, - "Des b\u00e2timents administratifs et commerciaux": {}, - "Des b\u00e2timents industriels": {}, - "Des oeuvres sociales": {} - }, - "Mobilier": { - "Mobilier des autres b\u00e2timents d'exploitation": {}, - "Mobilier des b\u00e2timents administratifs et commerciaux": {}, - "Mobilier des b\u00e2timents industriels": {}, - "Mobilier oeuvres sociales": {} - }, - "Plus-values act\u00e9es": { - "Plus-values act\u00e9es sur mat\u00e9riel de bureau et service social": {}, - "Plus-values act\u00e9es sur mobilier": {} - } - } - }, - "TERRAINS ET CONSTRUCTIONS": { - "Autres droits r\u00e9els sur des immeubles": { - "Amortissements": {}, - "Plus-values act\u00e9es": {}, - "Valeur d'acquisition": {} - }, - "Constructions": { - "Amortissements sur constructions": { - "Sur autres b\u00e2timents d'exploitation": {}, - "Sur b\u00e2timents administratifs et commerciaux": {}, - "Sur b\u00e2timents industriels": {}, - "Sur constructions sur sol d'autrui": {}, - "Sur frais d'acquisition sur constructions": {}, - "Sur voies de transport et ouvrages d'art": {} - }, - "Autres b\u00e2timents d'exploitation": {}, - "B\u00e2timents administratifs et commerciaux": {}, - "B\u00e2timents industriels": {}, - "Constructions sur sol d'autrui": {}, - "Frais d'acquisition sur constructions": {}, - "Plus-values act\u00e9es": { - "Sur autres b\u00e2timents d'exploitation": {}, - "Sur b\u00e2timents administratifs et commerciaux": {}, - "Sur b\u00e2timents industriels": {}, - "Sur voies de transport et ouvrages d'art": {} - }, - "Voies de transport et ouvrages d'art": {} - }, - "Terrains": { - "Amortissements et r\u00e9ductions de valeur": { - "Amortissements sur frais d'acquisition": {}, - "R\u00e9ductions de valeur sur terrains": {} - }, - "Frais d'acquisition sur terrains": {}, - "Plus-values act\u00e9es sur terrains": {}, - "Terrains": {} - }, - "Terrains b\u00e2tis": { - "Amortissements sur terrains b\u00e2tis": { - "Sur autres b\u00e2timents d'exploitation": {}, - "Sur b\u00e2timents administratifs et commerciaux": {}, - "Sur b\u00e2timents industriels": {}, - "Sur frais d'acquisition des terrains b\u00e2tis": {}, - "Sur voies de transport et ouvrages d'art": {} - }, - "Plus-values act\u00e9es": { - "Sur autres b\u00e2timents d'exploitation": {}, - "Sur b\u00e2timents administratifs et commerciaux": {}, - "Sur b\u00e2timents industriels": {}, - "Sur voies de transport et ouvrages d'art": {} - }, - "Valeur d'acquisition": { - "Autres b\u00e2timents d'exploitation": {}, - "B\u00e2timents administratifs et commerciaux": {}, - "B\u00e2timents industriels": {}, - "Frais d'acquisition des terrains \u00e0 b\u00e2tir": {}, - "Voies de transport et ouvrages d'art": {} - } - } - }, - "root_type": "" - }, - "CLASSE 3. STOCK ET COMMANDES EN COURS D'EXECUTION": { - "ACOMPTES VERSES SUR ACHATS POUR STOCKS": { - "Acomptes vers\u00e9s": { - "account_type": "Stock" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "APPROVISIONNEMENTS - MATIERES PREMIERES": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "APPROVISIONNEMENTS ET FOURNITURES": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "Emballages commerciaux": { - "Emballages perdus": { - "account_type": "Stock" - }, - "Emballages r\u00e9cup\u00e9rables": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "Energie, charbon, coke, Mazout, essence, propane": { - "account_type": "Stock" - }, - "Fournitures de services sociaux": { - "account_type": "Stock" - }, - "Fournitures diverses et petit outillage": { - "account_type": "Stock" - }, - "Imprim\u00e9s et fournitures de bureau": { - "account_type": "Stock" - }, - "Mati\u00e8res d'approvisionnement": { - "account_type": "Stock" - }, - "Produits d'entretien": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "COMMANDES EN COURS D'EXECUTION": { - "B\u00e9n\u00e9fice pris en compte": { - "account_type": "Stock" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "EN COURS DE FABRICATION": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "D\u00e9chets": { - "account_type": "Stock" - }, - "Produits en cours de fabrication": { - "account_type": "Stock" - }, - "Produits semi-ouvr\u00e9s": { - "account_type": "Stock" - }, - "Rebuts": { - "account_type": "Stock" - }, - "Travaux en association momentan\u00e9e": { - "account_type": "Stock" - }, - "Travaux en cours": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "IMMEUBLES DESTINES A LA VENTE": { - "Immeubles construits en vue de leur revente": { - "Immeuble A": { - "account_type": "Stock" - }, - "Immeuble B": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "R\u00e9ductions de valeurs act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "Immeuble A": { - "account_type": "Stock" - }, - "Immeuble B": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "MARCHANDISES": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "Groupe A": { - "account_type": "Stock" - }, - "Groupe B": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "PRODUITS FINIS": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Stock" - }, - "Valeur d'acquisition": { - "Produits finis": { - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock" - }, - "account_type": "Stock", - "root_type": "" - }, - "CLASSE 4. CREANCES ET DETTES A UN AN AU PLUS": { - "ACOMPTES RECUS SUR COMMANDES": { - "account_type": "Payable" - }, - "AUTRES CREANCES": { - "Capital appel\u00e9, non vers\u00e9": { - "Actionnaires d\u00e9faillants": { - "account_type": "Receivable" - }, - "Appels de fonds": { - "account_type": "Receivable" - } - }, - "Cautionnements vers\u00e9s en num\u00e9raires": { - "account_type": "Receivable" - }, - "Cr\u00e9ances diverses": { - "Associ\u00e9s": { - "account_type": "Receivable" - }, - "Avances et pr\u00eats au personnel": { - "account_type": "Receivable" - }, - "Compte courant des administrateurs et g\u00e9rants": { - "account_type": "Receivable" - }, - "Compte courant des associ\u00e9s en S.P.R.L.": { - "account_type": "Receivable" - }, - "Cr\u00e9ances sur soci\u00e9t\u00e9s apparent\u00e9es": { - "account_type": "Receivable" - }, - "Emballages et mat\u00e9riel \u00e0 rendre": { - "account_type": "Receivable" - }, - "Etat et \u00e9tablissements publics": { - "Autres cr\u00e9ances": { - "account_type": "Receivable" - }, - "Subsides \u00e0 recevoir": { - "account_type": "Receivable" - } - }, - "Rabais, ristournes, remises \u00e0 obtenir et autres avoirs non encore re\u00e7us": { - "account_type": "Receivable" - } - }, - "Cr\u00e9ances douteuses": { - "account_type": "Receivable" - }, - "Imp\u00f4ts et versements fiscaux \u00e0 r\u00e9cup\u00e9rer": { - "Imp\u00f4ts \u00e9trangers": { - "account_type": "Receivable" - }, - "\u00e0 4124 Imp\u00f4ts belges sur le r\u00e9sultat": { - "account_type": "Receivable" - }, - "\u00e0 4127 Autres imp\u00f4ts belges": { - "account_type": "Receivable" - } - }, - "Produits \u00e0 recevoir": { - "account_type": "Receivable" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Receivable" - }, - "T.V.A. \u00e0 r\u00e9cup\u00e9rer": { - "Compte courant administration T.V.A.": { - "account_type": "Receivable" - }, - "T.V.A D\u00e9ductible": { - "account_type": "Receivable" - }, - "Taxe d'\u00e9galisation due": { - "account_type": "Receivable" - } - } - }, - "COMPTES DE REGULARISATION ET COMPTES D'ATTENTE": { - "Charges \u00e0 imputer": { - "account_type": "Payable" - }, - "Charges \u00e0 reporter": { - "account_type": "Payable" - }, - "Comptes d'attente": { - "Compte d'attente": { - "account_type": "Payable" - }, - "Compte de r\u00e9partition p\u00e9riodique des charges": { - "account_type": "Payable" - }, - "Transferts d'exercice": { - "account_type": "Payable" - } - }, - "Produits acquis": { - "Produits d'exploitation": { - "Autres produits d'exploitation": { - "account_type": "Payable" - }, - "Commissions \u00e0 obtenir": { - "account_type": "Payable" - }, - "Ristournes, rabais \u00e0 obtenir": { - "account_type": "Payable" - } - }, - "Produits financiers": { - "Autres produits financiers": { - "account_type": "Payable" - }, - "Int\u00e9r\u00eats courus et non \u00e9chus sur pr\u00eats et d\u00e9bits": { - "account_type": "Payable" - } - } - }, - "Produits \u00e0 reporter": { - "Produits d'exploitation \u00e0 reporter": { - "account_type": "Payable" - }, - "Produits financiers \u00e0 reporter": { - "account_type": "Payable" - } - } - }, - "CREANCES COMMERCIALES": { - "Acomptes vers\u00e9s": { - "account_type": "Receivable" - }, - "Clients": { - "Clients": { - "account_type": "Receivable" - }, - "Cr\u00e9ances r\u00e9sultant de livraisons de biens": { - "account_type": "Receivable" - }, - "Rabais, remises, ristournes \u00e0 accorder et autres notes de cr\u00e9dit \u00e0 \u00e9tablir": { - "account_type": "Receivable" - } - }, - "Clients : retenues sur garanties": { - "account_type": "Receivable" - }, - "Clients, cr\u00e9ances courantes, entreprises apparent\u00e9es, administrateurs et g\u00e9rants": { - "Administrateurs et g\u00e9rants d'entreprise": { - "account_type": "Receivable" - }, - "Autres entreprises avec lesquelles il existe un lien de participation": { - "account_type": "Receivable" - }, - "Entreprises li\u00e9es": { - "account_type": "Receivable" - } - }, - "Compensation clients": { - "account_type": "Receivable" - }, - "Cr\u00e9ances douteuses": { - "account_type": "Receivable" - }, - "Effets \u00e0 recevoir": { - "Effets \u00e0 l'encaissement": { - "account_type": "Receivable" - }, - "Effets \u00e0 l'escompte": { - "account_type": "Receivable" - }, - "Effets \u00e0 recevoir": { - "account_type": "Receivable" - } - }, - "Effets \u00e0 recevoir sur entreprises apparent\u00e9es et administrateurs et g\u00e9rants": { - "Administrateurs et g\u00e9rants de l'entreprise": { - "account_type": "Receivable" - }, - "Autres entreprises avec lesquelles il existe un lien de participation": { - "account_type": "Receivable" - }, - "Entreprises li\u00e9es": { - "account_type": "Receivable" - } - }, - "Produits \u00e0 recevoir": { - "account_type": "Receivable" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Receivable" - } - }, - "DETTES A PLUS D'UN AN ECHEANT DANS L'ANNEE": { - "Autres emprunts": { - "account_type": "Payable" - }, - "Cautionnements re\u00e7us en num\u00e9raires": { - "account_type": "Payable" - }, - "Dettes commerciales": { - "Effets \u00e0 payer": { - "account_type": "Payable" - }, - "Fournisseurs": { - "account_type": "Payable" - } - }, - "Dettes de location-financement et assimil\u00e9es": { - "Financement de biens immobiliers": { - "account_type": "Payable" - }, - "Financement de biens mobiliers": { - "account_type": "Payable" - } - }, - "Dettes diverses": { - "Administrateurs, g\u00e9rants, associ\u00e9s": { - "account_type": "Payable" - }, - "Autres dettes": { - "account_type": "Payable" - }, - "Entreprises avec lesquelles il existe un lien de participation": { - "account_type": "Payable" - }, - "Entreprises li\u00e9es": { - "account_type": "Payable" - } - }, - "Emprunts obligataires non subordonn\u00e9s": { - "Convertibles": { - "account_type": "Payable" - }, - "Non convertibles": { - "account_type": "Payable" - } - }, - "Emprunts subordonn\u00e9s": { - "Convertibles": { - "account_type": "Payable" - }, - "Non convertibles": { - "account_type": "Payable" - } - }, - "Etablissements de cr\u00e9dit": { - "Cr\u00e9dits d'acceptation": { - "account_type": "Payable" - }, - "Dettes en compte": { - "account_type": "Payable" - }, - "Promesses": { - "account_type": "Payable" - } - } - }, - "DETTES COMMERCIALES": { - "Acomptes re\u00e7us": { - "account_type": "Payable" - }, - "Compensations fournisseurs": { - "account_type": "Payable" - }, - "Effets \u00e0 payer": { - "Entreprises apparent\u00e9es": { - "Entreprises avec lesquelles il existe un lien de participation": { - "account_type": "Payable" - }, - "Entreprises li\u00e9es": { - "account_type": "Payable" - } - }, - "Fournisseurs ordinaires": { - "Fournisseurs CEE": { - "account_type": "Payable" - }, - "Fournisseurs belges": { - "account_type": "Payable" - }, - "Fournisseurs importation": { - "account_type": "Payable" - } - } - }, - "Factures \u00e0 recevoir": { - "account_type": "Payable" - }, - "Fournisseurs": { - "Dettes envers les coparticipants": { - "account_type": "Payable" - }, - "Entreprises apparent\u00e9es": { - "Entreprises avec lesquelles il existe un lien de participation": { - "account_type": "Payable" - }, - "Entreprises li\u00e9es": { - "account_type": "Payable" - } - }, - "Fournisseurs - retenues de garanties": { - "account_type": "Payable" - }, - "Fournisseurs ordinaires": { - "Fournisseurs CEE": { - "account_type": "Payable" - }, - "Fournisseurs belges": { - "account_type": "Payable" - }, - "Fournisseurs importation": { - "account_type": "Payable" - } - } - } - }, - "DETTES DECOULANT DE L'AFFECTATION DES RESULTATS": { - "Autres allocataires": { - "account_type": "Payable" - }, - "Dividendes de l'exercice": { - "account_type": "Payable" - }, - "Dividendes et tanti\u00e8mes d'exercices ant\u00e9rieurs": { - "account_type": "Payable" - }, - "Tanti\u00e8mes de l'exercice": { - "account_type": "Payable" - } - }, - "DETTES DIVERSES": { - "Acomptes re\u00e7us d'autres tiers \u00e0 moins d'un an": { - "account_type": "Payable" - }, - "Actionnaires - capital \u00e0 rembourser": { - "account_type": "Payable" - }, - "Autres dettes diverses": { - "account_type": "Payable" - }, - "Cautionnements re\u00e7us en num\u00e9raires": { - "account_type": "Payable" - }, - "Emballages et mat\u00e9riel consign\u00e9s": { - "account_type": "Payable" - }, - "Obligations et coupons \u00e9chus": { - "account_type": "Payable" - }, - "Participation du personnel \u00e0 payer": { - "account_type": "Payable" - } - }, - "DETTES FINANCIERES": { - "Autres emprunts": { - "account_type": "Payable" - }, - "Etablissements de cr\u00e9dit. Cr\u00e9dits d'acceptation": { - "account_type": "Payable" - }, - "Etablissements de cr\u00e9dit. Dettes en compte courant": { - "account_type": "Payable" - }, - "Etablissements de cr\u00e9dit. Emprunts en compte \u00e0 terme fixe": { - "account_type": "Payable" - }, - "Etablissements de cr\u00e9dit. Promesses": { - "account_type": "Payable" - } - }, - "DETTES FISCALES, SALARIALES ET SOCIALES": { - "Autres dettes sociales": { - "Assurances relatives au personnel": { - "Assurance groupe ": { - "account_type": "Payable" - }, - "Assurance loi": { - "account_type": "Payable" - }, - "Assurance salaire garanti ": { - "account_type": "Payable" - }, - "Assurances individuelles": { - "account_type": "Payable" - } - }, - "Caisse d'assurances sociales pour travailleurs ind\u00e9pendants": { - "account_type": "Payable" - }, - "Dettes et provisions sociales diverses": { - "account_type": "Payable" - }, - "D\u00e9parts de personnel": { - "account_type": "Payable" - }, - "Oppositions sur r\u00e9mun\u00e9rations": { - "account_type": "Payable" - }, - "Provision pour gratifications de fin d'ann\u00e9e": { - "account_type": "Payable" - } - }, - "Dettes fiscales estim\u00e9es": { - "Imp\u00f4ts \u00e0 l'\u00e9tranger": { - "account_type": "Payable" - }, - "\u00e0 4504 Imp\u00f4ts sur le r\u00e9sultat": { - "account_type": "Payable" - }, - "\u00e0 4507 Autres imp\u00f4ts en Belgique": { - "account_type": "Payable" - } - }, - "Imp\u00f4ts et taxes \u00e0 payer": { - "Autres imp\u00f4ts et taxes en Belgique": { - "Autres imp\u00f4ts et taxes \u00e0 payer": { - "account_type": "Payable" - }, - "Imp\u00f4ts communaux \u00e0 payer": { - "account_type": "Payable" - }, - "Imp\u00f4ts provinciaux \u00e0 payer": { - "account_type": "Payable" - }, - "Pr\u00e9compte immobilier": { - "account_type": "Payable" - } - }, - "Autres imp\u00f4ts sur le r\u00e9sultat": { - "account_type": "Payable" - }, - "Imp\u00f4ts et taxes \u00e0 l'\u00e9tranger": { - "account_type": "Payable" - } - }, - "Office National de la S\u00e9curit\u00e9 Sociale": { - "1er trimestre": { - "account_type": "Payable" - }, - "2\u00e8me trimestre": { - "account_type": "Payable" - }, - "3\u00e8me trimestre": { - "account_type": "Payable" - }, - "4\u00e8me trimestre": { - "account_type": "Payable" - }, - "Arri\u00e9r\u00e9s": { - "account_type": "Payable" - } - }, - "Pr\u00e9comptes retenus": { - "Autres pr\u00e9comptes retenus": { - "account_type": "Payable" - }, - "Pr\u00e9compte mobilier retenu sur dividendes attribu\u00e9s": { - "account_type": "Payable" - }, - "Pr\u00e9compte mobilier retenu sur int\u00e9r\u00eats pay\u00e9s": { - "account_type": "Payable" - }, - "Pr\u00e9compte professionnel retenu sur r\u00e9mun\u00e9rations": { - "account_type": "Payable" - }, - "Pr\u00e9compte professionnel retenu sur tanti\u00e8mes": { - "account_type": "Payable" - } - }, - "P\u00e9cules de vacances": { - "Direction": { - "account_type": "Payable" - }, - "Employ\u00e9s": { - "account_type": "Payable" - }, - "Ouvriers": { - "account_type": "Payable" - } - }, - "R\u00e9mun\u00e9rations": { - "Administrateurs, g\u00e9rants et commissaires": { - "account_type": "Payable" - }, - "Direction": { - "account_type": "Payable" - }, - "Employ\u00e9s": { - "account_type": "Payable" - }, - "Ouvriers": { - "account_type": "Payable" - } - }, - "T.V.A. \u00e0 payer": { - "Compte courant administration T.V.A.": { - "account_type": "Payable" - }, - "T.V.A. \u00e0 payer": { - "account_type": "Payable" - }, - "T.V.A. \u00e0 payer - Cocontractant": { - "account_type": "Receivable" - }, - "T.V.A. \u00e0 payer - Import": { - "account_type": "Receivable" - }, - "T.V.A. \u00e0 payer - Intra-communautaire": { - "account_type": "Receivable" - }, - "Taxe d'\u00e9galisation due": { - "account_type": "Payable" - } - } - }, - "root_type": "" - }, - "CLASSE 5. PLACEMENTS DE TRESORERIE ET DE VALEURS DISPONIBLES": { - "ACTIONS ET PARTS": { - "Montants non appel\u00e9s": { - "account_type": "Cash" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Cash" - }, - "Valeur d'acquisition": { - "account_type": "Cash" - } - }, - "ACTIONS PROPRES": { - "account_type": "Cash" - }, - "CAISSES": { - "Caisses - esp\u00e8ces": { - "Caisse principale": { - "account_type": "Cash" - } - }, - "Caisses - timbres": { - "account_type": "Cash" - } - }, - "DEPOTS A TERME": { - "D'un mois au plus": { - "account_type": "Cash" - }, - "De plus d'un an": { - "account_type": "Cash" - }, - "De plus d'un mois et \u00e0 un an au plus": { - "account_type": "Cash" - }, - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Cash" - } - }, - "ETABLISSEMENTS DE CREDIT.": { - "Comptes ouverts aupr\u00e8s des divers \u00e9tablissements": {} - }, - "OFFICE DES CHEQUES POSTAUX": { - "Ch\u00e8ques \u00e9mis": { - "account_type": "Cash" - }, - "Compte courant": { - "account_type": "Cash" - } - }, - "TITRES A REVENUS FIXES": { - "R\u00e9ductions de valeur act\u00e9es": { - "account_type": "Cash" - }, - "Valeur d'acquisition": { - "account_type": "Cash" - } - }, - "VALEURS ECHUES A L'ENCAISSEMENT": { - "Ch\u00e8ques \u00e0 encaisser": { - "account_type": "Cash" - }, - "Coupons \u00e0 encaisser": { - "account_type": "Cash" - } - }, - "VIREMENTS INTERNES": { - "account_type": "Cash" - }, - "root_type": "" - }, - "CLASSE 6. - CHARGES": { - "AFFECTATION DES RESULTATS": { - "Administrateurs ou g\u00e9rants": {}, - "Autres allocataires": {}, - "B\u00e9n\u00e9fice \u00e0 reporter": {}, - "Dotation aux autres r\u00e9serves": {}, - "Dotation \u00e0 la r\u00e9serve l\u00e9gale": {}, - "Perte report\u00e9e de l'exercice pr\u00e9c\u00e9dent": {}, - "R\u00e9mun\u00e9ration du capital": {} - }, - "AMORTISSEMENTS, REDUCTIONS DE VALEUR ET PROVISIONS POUR RISQUES ET CHARGES": { - "Dotations aux amortissements et aux r\u00e9ductions de valeur sur immobilisations": { - "Dotations aux amortissements sur frais d'\u00e9tablissement": {}, - "Dotations aux amortissements sur immobilisations corporelles": {}, - "Dotations aux amortissements sur immobilisations incorporelles": {}, - "Dotations aux r\u00e9ductions de valeur sur immobilisations corporelles": {}, - "Dotations aux r\u00e9ductions de valeur sur immobilisations incorporelles": {} - }, - "Provisions pour autres risques et charges": { - "Dotations ": {}, - "Utilisations et reprises": {} - }, - "Provisions pour grosses r\u00e9parations et gros entretiens": { - "Dotations": {}, - "Utilisations et reprises": {} - }, - "Provisions pour pensions et obligations similaires": { - "Dotations": {}, - "Utilisations et reprises": {} - }, - "R\u00e9ductions de valeur sur commandes en cours d'ex\u00e9cution": { - "Dotations": {}, - "Reprises": {} - }, - "R\u00e9ductions de valeur sur cr\u00e9ances commerciales \u00e0 plus d'un an": { - "Dotations": {}, - "Reprises": {} - }, - "R\u00e9ductions de valeur sur cr\u00e9ances commerciales \u00e0 un an au plus": { - "Dotations": {}, - "Reprises": {} - }, - "R\u00e9ductions de valeur sur stocks": { - "Dotations": {}, - "Reprises": {} - } - }, - "APPROVISIONNEMENTS ET MARCHANDISES": { - "Achats d'immeubles destin\u00e9s \u00e0 la revente": {}, - "Achats de fournitures": {}, - "Achats de marchandises": {}, - "Achats de mati\u00e8res premi\u00e8res": {}, - "Achats de services, travaux et \u00e9tudes": {}, - "Remises, ristournes et rabais obtenus sur achats": {}, - "Sous-traitances g\u00e9n\u00e9rales": {}, - "Variations de stocks": { - "D'immeubles destin\u00e9s \u00e0 la vente": {}, - "De fournitures": {}, - "De marchandises": {}, - "De mati\u00e8res premi\u00e8res": {} - } - }, - "AUTRES CHARGES D'EXPLOITATION": { - "Charges d'exploitation port\u00e9es \u00e0 l'actif au titre de restructuration": {}, - "Charges fiscales d'exploitation": { - "Imp\u00f4ts provinciaux et communaux": { - "Taxe sur la force motrice": {}, - "Taxe sur le personnel occup\u00e9": {} - }, - "Taxes diverses": {}, - "Taxes et imp\u00f4ts directs": { - "Taxes sur autos et camions": {} - }, - "Taxes et imp\u00f4ts indirects": { - "Droits d'enregistrement": {}, - "T.V.A. non d\u00e9ductible": {}, - "Timbres fiscaux pris en charge par la firme": {} - } - }, - "Moins-values sur r\u00e9alisations courantes d'immobilisations corporelles": {}, - "Moins-values sur r\u00e9alisations de cr\u00e9ances commerciales": {}, - "\u00e0 648 Charges d'exploitations diverses": {} - }, - "CHARGES EXCEPTIONNELLES": { - "Amortissements et r\u00e9ductions de valeur exceptionnels": { - "Sur frais d'\u00e9tablissement": {}, - "Sur immobilisations corporelles": {}, - "Sur immobilisations incorporelles": {} - }, - "Autres charges exceptionnelles": {}, - "Charges exceptionnelles transf\u00e9r\u00e9es \u00e0 l'actif en frais de restructuration": {}, - "Diff\u00e9rence de charge": {}, - "Moins-values sur r\u00e9alisation d'actifs immobilis\u00e9s": { - "Sur immeubles acquis ou construits en vue de la revente": {}, - "Sur immobilisations corporelles": {}, - "Sur immobilisations d\u00e9tenues en location-financement et droits similaires": {}, - "Sur immobilisations financi\u00e8res": {}, - "Sur immobilisations incorporelles": {} - }, - "Provisions pour risques et charges exceptionnels": {}, - "P\u00e9nalit\u00e9s et amendes diverses": {}, - "R\u00e9ductions de valeur sur immobilisations financi\u00e8res": {} - }, - "CHARGES FINANCIERES": { - "Charges d'escompte de cr\u00e9ances": {}, - "Charges des dettes": { - "Amortissements des agios et frais d'\u00e9mission d'emprunts": {}, - "Autres charges de dettes": {}, - "Int\u00e9r\u00eats intercalaires port\u00e9s \u00e0 l'actif": {}, - "Int\u00e9r\u00eats, commissions et frais aff\u00e9rents aux dettes": {} - }, - "Commissions sur ouvertures de cr\u00e9dit, cautions, avals": {}, - "Diff\u00e9rences de change": {}, - "Ecarts de conversion des devises": {}, - "Frais de banques, de ch\u00e8ques postaux": {}, - "Frais de vente des titres": {}, - "Moins-values sur r\u00e9alisation d'actifs circulants": {}, - "R\u00e9ductions de valeur sur actifs circulants": { - "Dotations ": {}, - "Reprises": {} - } - }, - "IMPOTS SUR LE RESULTAT": { - "Imp\u00f4ts belges sur le r\u00e9sultat d'exercices ant\u00e9rieurs": { - "Provisions fiscales constitu\u00e9es": {}, - "Suppl\u00e9ments d'imp\u00f4ts dus ou vers\u00e9s": {}, - "Suppl\u00e9ments d'imp\u00f4ts estim\u00e9s": {} - }, - "Imp\u00f4ts belges sur le r\u00e9sultat de l'exercice": { - "Charges fiscales estim\u00e9es": {}, - "Exc\u00e9dent de versements d'imp\u00f4ts et pr\u00e9comptes port\u00e9 \u00e0 l'actif": {}, - "Imp\u00f4ts et pr\u00e9comptes dus ou vers\u00e9s": {} - }, - "Imp\u00f4ts \u00e9trangers sur le r\u00e9sultat d'exercices ant\u00e9rieurs": {}, - "Imp\u00f4ts \u00e9trangers sur le r\u00e9sultat de l'exercice": {} - }, - "REMUNERATIONS, CHARGES SOCIALES ET PENSIONS": { - "Autres frais de personnel": { - "Assurances du personnel": { - "Assurance salaire garanti": {}, - "Assurances individuelles": {}, - "Assurances loi, responsabilit\u00e9 civile, chemin du travail": {} - }, - "Charges sociales des administrateurs, g\u00e9rants et commissaires": { - "Allocations familiales compl\u00e9mentaires pour non salari\u00e9s": {}, - "Divers": {}, - "Lois sociales pour ind\u00e9pendants": {} - }, - "Charges sociales diverses": { - "Allocations familiales compl\u00e9mentaires": {}, - "Jours f\u00e9ri\u00e9s pay\u00e9s": {}, - "Salaire hebdomadaire garanti": {} - } - }, - "Cotisations patronales d'assurances sociales": { - "Sur appointements et commissions": {}, - "Sur salaires": {} - }, - "Pensions de retraite et de survie": { - "Administrateurs et g\u00e9rants": {}, - "Personnel": {} - }, - "Primes patronales pour assurances extral\u00e9gales": {}, - "Provision pour p\u00e9cule de vacances": { - "Dotations": {}, - "Utilisations et reprises": {} - }, - "R\u00e9mun\u00e9rations et avantages sociaux directs": { - "Administrateurs ou g\u00e9rants": {}, - "Autres membres du personnel": {}, - "Employ\u00e9s": {}, - "Ouvriers": {}, - "Personnel de direction": {} - } - }, - "SERVICES ET BIENS DIVERS": { - "Annonces, publicit\u00e9, propagande et documentation": { - "Annonces et insertions": {}, - "Cadeaux \u00e0 la client\u00e8le": {}, - "Catalogues et imprim\u00e9s": {}, - "Documentation": {}, - "Echantillons": {}, - "Foires et expositions": {}, - "Missions et r\u00e9ceptions": {}, - "Primes": {} - }, - "Entretien et r\u00e9paration": {}, - "Fournitures faites \u00e0 l'entreprise": { - "Eau, gaz, \u00e9lectricit\u00e9, vapeur": { - "Eau": {}, - "Electricit\u00e9": {}, - "Gaz": {}, - "Vapeur": {} - }, - "Imprim\u00e9s et fournitures de bureau": {}, - "Livres, biblioth\u00e8que": {}, - "T\u00e9l\u00e9phone, t\u00e9l\u00e9grammes, t\u00e9lex, t\u00e9l\u00e9fax, frais postaux": { - "Frais postaux": {}, - "T\u00e9lex et t\u00e9l\u00e9fax": {}, - "T\u00e9l\u00e9grammes": {}, - "T\u00e9l\u00e9phone": {} - } - }, - "Loyers et charges locatives": { - "Charges locatives": {}, - "Loyers divers": {} - }, - "Personnel int\u00e9rimaire et personnes mises \u00e0 la disposition de l'entreprise": {}, - "R\u00e9mun\u00e9rations, primes pour assurances extral\u00e9gales": {}, - "R\u00e9tributions de tiers": { - "Assurances non relatives au personnel": { - "Assurance autos": {}, - "Assurance cr\u00e9dit": {}, - "Assurance incendie": {}, - "Assurance vol": {}, - "Assurances frais g\u00e9n\u00e9raux": {} - }, - "Divers": { - "Commissions aux tiers": {}, - "Cotisations aux groupements professionnels": {}, - "Dons, lib\u00e9ralit\u00e9s, ...": {}, - "Frais de contentieux": {}, - "Honoraires d'avocats, d'experts, etc ...": {}, - "Publications l\u00e9gales": {} - }, - "Personnel int\u00e9rimaire": {}, - "Redevances et royalties": { - "Autres redevances": {}, - "Redevances pour brevets, licences, marques, accessoires": {} - }, - "Transports et d\u00e9placements": { - "Transports de personnel": {}, - "Voyages, d\u00e9placements, repr\u00e9sentations": {} - } - }, - "Sous-traitants": { - "Quote-part b\u00e9n\u00e9ficiaire des coparticipants": {}, - "Sous-traitants d'associations momentan\u00e9es": {}, - "Sous-traitants pour activit\u00e9s propres": {} - } - }, - "TRANSFERTS AUX RESERVES IMMUNISEES": {}, - "root_type": "" - }, - "CLASSE 7. - PRODUITS": { - "AFFECTATION AUX RESULTATS": { - "B\u00e9n\u00e9fice report\u00e9 de l'exercice pr\u00e9c\u00e9dent": {}, - "Intervention d'associ\u00e9s": {}, - "Perte \u00e0 reporter": {}, - "Pr\u00e9l\u00e8vement sur le capital et les primes d'\u00e9mission": {}, - "Pr\u00e9l\u00e8vement sur les r\u00e9serves": {} - }, - "AUTRES PRODUITS D'EXPLOITATION": { - "Commissions et courtages": {}, - "Locations diverses \u00e0 caract\u00e8re professionnel": {}, - "Plus-values sur r\u00e9alisations courantes d'immobilisations corporelles": {}, - "Plus-values sur r\u00e9alisations de cr\u00e9ances commerciales": {}, - "Prestations de services": {}, - "Produits de services exploit\u00e9s dans l'int\u00e9r\u00eat du personnel": {}, - "Produits divers": { - "Bonis sur reprises d'emballages consign\u00e9s": {}, - "Bonis sur travaux en associations momentan\u00e9es": {} - }, - "Redevances pour brevets et licences": {}, - "Revenus des immeubles affect\u00e9s aux activit\u00e9s non professionnelles": {}, - "Subsides d'exploitation et montants compensatoires": {} - }, - "CHIFFRE D'AFFAIRES": { - "Facturations des travaux en cours": {}, - "Prestations de services": { - "Prestations de services dans les pays membres de la C.E.E.": {}, - "Prestations de services en Belgique": {}, - "Prestations de services en vue de l'exportation": {} - }, - "P\u00e9nalit\u00e9s et d\u00e9dits obtenus par l'entreprise": {}, - "Remises, ristournes et rabais accord\u00e9s": { - "Mali sur travaux factur\u00e9s aux associations momentan\u00e9es": {}, - "Sur prestations de services": {}, - "Sur ventes de d\u00e9chets et rebuts": {}, - "Sur ventes de marchandises": {}, - "Sur ventes de produits finis": {} - }, - "Ventes d'emballages r\u00e9cup\u00e9rables": {}, - "Ventes de d\u00e9chets et rebuts": { - "Ventes dans les pays membres de la C.E.E.": {}, - "Ventes en Belgique": {}, - "Ventes \u00e0 l'exportation": {} - }, - "Ventes de marchandises": { - "Ventes dans les pays membres de la C.E.E.": {}, - "Ventes en Belgique": {}, - "Ventes \u00e0 l'exportation": {} - }, - "Ventes de produits finis": { - "Ventes dans les pays membres de la C.E.E.": {}, - "Ventes en Belgique": {}, - "Ventes \u00e0 l'exportation": {} - } - }, - "PRODUCTION IMMOBILISEE": { - "En frais d'\u00e9tablissement": {}, - "En immobilisations corporelles": {}, - "En immobilisations en cours": {}, - "En immobilisations incorporelles": {} - }, - "PRODUITS EXCEPTIONNELS": { - "Autres produits exceptionnels": {}, - "Plus-values sur r\u00e9alisation d'actifs immobilis\u00e9s": { - "Sur immobilisations corporelles": {}, - "Sur immobilisations financi\u00e8res": {}, - "Sur immobilisations incorporelles": {} - }, - "Reprises d'amortissements et de r\u00e9ductions de valeur": { - "Sur immobilisations corporelles": {}, - "Sur immobilisations incorporelles": {} - }, - "Reprises de provisions pour risques et charges exceptionnelles": {}, - "Reprises de r\u00e9ductions de valeur sur immobilisations financi\u00e8res": {} - }, - "PRODUITS FINANCIERS": { - "Diff\u00e9rences de change": {}, - "Ecarts de conversion des devises": {}, - "Escomptes obtenus": {}, - "Plus-values sur r\u00e9alisations d'actifs circulants": {}, - "Produits des actifs circulants": {}, - "Produits des autres cr\u00e9ances": {}, - "Produits des immobilisations financi\u00e8res": { - "Revenus des actions": {}, - "Revenus des cr\u00e9ances \u00e0 plus d'un an": {}, - "Revenus des obligations": {} - }, - "Subsides en capital et en int\u00e9r\u00eats": {} - }, - "REGULARISATIONS D'IMPOTS ET REPRISES DE PROVISIONS FISCALES": { - "Imp\u00f4ts belges sur le r\u00e9sultat": { - "Reprises de provisions fiscales": {}, - "R\u00e9gularisations d'imp\u00f4ts dus ou vers\u00e9s": {}, - "R\u00e9gularisations d'imp\u00f4ts estim\u00e9s": {} - }, - "Imp\u00f4ts \u00e9trangers sur le r\u00e9sultat": {} - }, - "VARIATION DES STOCKS ET DES COMMANDES EN COURS D'EXECUTION": { - "Des commandes en cours d'ex\u00e9cution": { - "B\u00e9n\u00e9fices port\u00e9s en compte sur commandes en cours": { - "Sur commandes en cours d'ex\u00e9cution": {}, - "Sur travaux en cours des associations momentan\u00e9es": {} - }, - "Commandes en cours - Co\u00fbt de revient": { - "Co\u00fbt des commandes en cours d'ex\u00e9cution": {}, - "Co\u00fbt des travaux en cours des associations momentan\u00e9es": {} - } - }, - "Des en cours de fabrication": {}, - "Des immeubles construits destin\u00e9s \u00e0 la vente": {}, - "Des produits finis": {} - }, - "root_type": "" - } - } -} diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_ondernemingen.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_ondernemingen.json new file mode 100644 index 00000000000..21a48c71db7 --- /dev/null +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_ondernemingen.json @@ -0,0 +1,1597 @@ +{ + "country_code": "be", + "name": "België - Minimum genormaliseerd algemeen rekeningstelsel voor ondernemingen", + "tree": { + "KLASSE 1 : EIGEN VERMOGEN": { + "root_type": "Equity", + "Kapitaal": { + "Geplaatst kapitaal": { + "account_number": "100", + "account_type": "Equity" + }, + "Niet opgevraagd kapitaal (-)": { + "account_number": "101", + "account_type": "Equity" + }, + "account_number": "10", + "account_type": "Equity" + }, + "Inbreng buiten kapitaal": { + "Beschikbare inbreng buiten kapitaal": { + "Uitgiftepremie": { + "account_number": "1100", + "account_type": "Equity" + }, + "Andere": { + "account_number": "1109", + "account_type": "Equity" + }, + "account_number": "110", + "account_type": "Equity" + }, + "Onbeschikbare inbreng buiten kapitaal": { + "Uitgiftepremie": { + "account_number": "1110", + "account_type": "Equity" + }, + "Andere": { + "account_number": "1119", + "account_type": "Equity" + }, + "account_number": "111", + "account_type": "Equity" + }, + "account_number": "11", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden": { + "Herwaarderingsmeerwaarden op immateriële vaste activa": { + "account_number": "120", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden op materiële vaste activa": { + "account_number": "121", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden op financiële vaste activa": { + "account_number": "122", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden op voorraden": { + "account_number": "123", + "account_type": "Equity" + }, + "Terugneming van waardeverminderingen op geldbeleggingen": { + "account_number": "124", + "account_type": "Equity" + }, + "account_number": "12", + "account_type": "Equity" + }, + "Reserves": { + "Wettelijke reserves": { + "account_number": "130", + "account_type": "Equity" + }, + "Andere onbeschikbare reserves": { + "Statutair onbeschikbare reserves": { + "account_number": "1311", + "account_type": "Equity" + }, + "Reserve voor eigen aandelen": { + "account_number": "1312", + "account_type": "Equity" + }, + "Financiële steunverlening": { + "account_number": "1313", + "account_type": "Equity" + }, + "Overige": { + "account_number": "1319", + "account_type": "Equity" + }, + "account_number": "131", + "account_type": "Equity" + }, + "Belastingvrije reserves": { + "account_number": "132", + "account_type": "Equity" + }, + "Beschikbare reserves": { + "account_number": "133", + "account_type": "Equity" + }, + "account_number": "13", + "account_type": "Equity" + }, + "Overgedragen winst of Overgedragen verlies (-)": { + "account_number": "14", + "account_type": "Equity" + }, + "Kapitaalsubsidies": { + "account_number": "15", + "account_type": "Equity" + } + }, + "KLASSE 1 : VOORZIENINGEN, UITGESTELDE BELASTINGEN EN SCHULDEN OP MEER DAN ÉÉN JAAR": { + "root_type": "Liability", + "Voorzieningen en uitgestelde belastingen": { + "Voorzieningen voor pensioenen en soortgelijke verplichtingen": { + "account_number": "160", + "account_type": "Liability" + }, + "Voorzieningen voor belastingen": { + "account_number": "161", + "account_type": "Liability" + }, + "Voorzieningen voor grote herstellingswerken en grote onderhoudswerken": { + "account_number": "162", + "account_type": "Liability" + }, + "Voorzieningen voor milieuverplichtingen": { + "account_number": "163", + "account_type": "Liability" + }, + "Uitgestelde belastingen": { + "Uitgestelde belastingen op kapitaalsubsidies": { + "account_number": "1680", + "account_type": "Liability" + }, + "Uitgestelde belastingen op gerealiseerde meerwaarden op immateriële vaste activa": { + "account_number": "1681", + "account_type": "Liability" + }, + "Uitgestelde belastingen op gerealiseerde meerwaarden op materiële vaste activa": { + "account_number": "1682", + "account_type": "Liability" + }, + "Uitgestelde belastingen op gerealiseerde meerwaarden op effecten die zijn uitgegeven door de Belgische openbare sector": { + "account_number": "1687", + "account_type": "Liability" + }, + "Buitenlandse uitgestelde belastingen": { + "account_number": "1688", + "account_type": "Liability" + }, + "account_number": "168", + "account_type": "Liability" + }, + "account_number": "16", + "account_type": "Liability" + }, + "Schulden op meer dan één jaar": { + "Achtergestelde leningen": { + "Converteerbaar": { + "account_number": "1700", + "account_type": "Liability" + }, + "Niet converteerbaar": { + "account_number": "1701", + "account_type": "Liability" + }, + "account_number": "170", + "account_type": "Liability" + }, + "Niet-achtergestelde obligatieleningen": { + "Converteerbaar": { + "account_number": "1710", + "account_type": "Liability" + }, + "Niet converteerbaar": { + "account_number": "1711", + "account_type": "Liability" + }, + "account_number": "171", + "account_type": "Liability" + }, + "Leasingschulden en soortgelijke schulden": { + "account_number": "172", + "account_type": "Liability" + }, + "Kredietinstellingen": { + "Schulden op rekening": { + "account_number": "1730", + "account_type": "Liability" + }, + "Promessen": { + "account_number": "1731", + "account_type": "Liability" + }, + "Acceptkredieten": { + "account_number": "1732", + "account_type": "Liability" + }, + "account_number": "173", + "account_type": "Liability" + }, + "Overige leningen": { + "account_number": "174", + "account_type": "Liability" + }, + "Handelsschulden": { + "Leveranciers": { + "account_number": "1750", + "account_type": "Liability" + }, + "Te betalen wissels": { + "account_number": "1751", + "account_type": "Liability" + }, + "account_number": "175", + "account_type": "Liability" + }, + "Vooruitbetalingen op bestellingen": { + "account_number": "176", + "account_type": "Liability" + }, + "Borgtochten ontvangen in contanten": { + "account_number": "178", + "account_type": "Liability" + }, + "Overige schulden": { + "account_number": "179", + "account_type": "Liability" + }, + "account_number": "17", + "account_type": "Liability" + }, + "Voorschot aan de vennoten op de verdeling van het netto-actief (-)": { + "account_number": "19", + "account_type": "Liability" + } + }, + "KLASSE 2 : OPRICHTINGSKOSTEN, VASTE ACTIVA EN VORDERINGEN OP MEER DAN ÉÉN JAAR": { + "root_type": "Asset", + "Oprichtingskosten": { + "Kosten van oprichting, kapitaalverhoging of verhoging van de inbreng": { + "account_number": "200", + "account_type": "Fixed Asset" + }, + "Kosten bij uitgifte van leningen": { + "account_number": "201", + "account_type": "Fixed Asset" + }, + "Overige oprichtingskosten": { + "account_number": "202", + "account_type": "Fixed Asset" + }, + "Herstructureringskosten": { + "account_number": "204", + "account_type": "Fixed Asset" + }, + "account_number": "20", + "account_type": "Fixed Asset" + }, + "Immateriële vaste activa": { + "Kosten van onderzoek en ontwikkeling": { + "account_number": "210", + "account_type": "Fixed Asset" + }, + "Concessies, octrooien, licenties, know-how, merken en soortgelijke rechten": { + "account_number": "211", + "account_type": "Fixed Asset" + }, + "Goodwill": { + "account_number": "212", + "account_type": "Fixed Asset" + }, + "Vooruitbetalingen": { + "account_number": "213", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "219", + "account_type": "Accumulated Depreciation" + }, + "account_number": "21", + "account_type": "Fixed Asset" + }, + "Terreinen en gebouwen": { + "Terreinen": { + "account_number": "220", + "account_type": "Fixed Asset" + }, + "Gebouwen": { + "account_number": "221", + "account_type": "Fixed Asset" + }, + "Bebouwde terreinen": { + "account_number": "222", + "account_type": "Fixed Asset" + }, + "Overige zakelijke rechten op onroerende goederen": { + "account_number": "223", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "229", + "account_type": "Accumulated Depreciation" + }, + "account_number": "22", + "account_type": "Fixed Asset" + }, + "Installaties, machines en uitrusting": { + "account_number": "23", + "account_type": "Fixed Asset" + }, + "Meubilair en rollend materieel": { + "account_number": "24", + "account_type": "Fixed Asset" + }, + "Vaste activa in leasing of op grond van een soortgelijk recht": { + "Terreinen en gebouwen": { + "account_number": "250", + "account_type": "Fixed Asset" + }, + "Installaties, machines en uitrusting": { + "account_number": "251", + "account_type": "Fixed Asset" + }, + "Meubilair en rollend materieel": { + "account_number": "252", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "259", + "account_type": "Accumulated Depreciation" + }, + "account_number": "25", + "account_type": "Fixed Asset" + }, + "Overige materiële vaste activa": { + "account_number": "26", + "account_type": "Fixed Asset" + }, + "Vaste activa in aanbouw en vooruitbetalingen": { + "account_number": "27", + "account_type": "Fixed Asset" + }, + "Financiële vaste activa": { + "Deelnemingen in verbonden ondernemingen": { + "Aanschaffingswaarde": { + "account_number": "2800", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2801", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2808", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2809", + "account_type": "Fixed Asset" + }, + "account_number": "280", + "account_type": "Fixed Asset" + }, + "Vorderingen op verbonden ondernemingen": { + "Vorderingen op rekening": { + "account_number": "2810", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2811", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2812", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2817", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2819", + "account_type": "Fixed Asset" + }, + "account_number": "281", + "account_type": "Fixed Asset" + }, + "Deelnemingen in ondernemingen waarmee een deelnemingsverhouding bestaat": { + "Aanschaffingswaarde": { + "account_number": "2820", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2821", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2828", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2829", + "account_type": "Fixed Asset" + }, + "account_number": "282", + "account_type": "Fixed Asset" + }, + "Vorderingen op ondernemingen waarmee een deelnemingsverhouding bestaat": { + "Vorderingen op rekening": { + "account_number": "2830", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2831", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2832", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2837", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2839", + "account_type": "Fixed Asset" + }, + "account_number": "283", + "account_type": "Fixed Asset" + }, + "Andere aandelen": { + "Aanschaffingswaarde": { + "account_number": "2840", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2841", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2848", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2849", + "account_type": "Fixed Asset" + }, + "account_number": "284", + "account_type": "Fixed Asset" + }, + "Overige vorderingen": { + "Vorderingen op rekening": { + "account_number": "2850", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2851", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2852", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2857", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2859", + "account_type": "Fixed Asset" + }, + "account_number": "285", + "account_type": "Fixed Asset" + }, + "Borgtochten betaald in contanten": { + "account_number": "288", + "account_type": "Fixed Asset" + }, + "account_number": "28", + "account_type": "Fixed Asset" + }, + "Vorderingen op meer dan één jaar": { + "Handelsvorderingen": { + "Handelsdebiteuren": { + "account_number": "2900" + }, + "Te innen wissels": { + "account_number": "2901" + }, + "Vooruitbetalingen": { + "account_number": "2906" + }, + "Dubieuze debiteuren": { + "account_number": "2907" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2909" + }, + "account_number": "290" + }, + "Overige vorderingen": { + "Vorderingen op rekening": { + "account_number": "2910" + }, + "Te innen wissels": { + "account_number": "2911" + }, + "Dubieuze debiteuren": { + "account_number": "2917" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2919" + }, + "account_number": "291" + }, + "account_number": "29" + } + }, + "KLASSE 3 : VOORRADEN EN BESTELLINGEN IN UITVOERING": { + "root_type": "Asset", + "Grondstoffen": { + "Aanschaffingswaarde": { + "account_number": "300" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "309" + }, + "account_number": "30" + }, + "Hulpstoffen": { + "Aanschaffingswaarde": { + "account_number": "310" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "319" + }, + "account_number": "31" + }, + "Goederen in bewerking": { + "Aanschaffingswaarde": { + "account_number": "320" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "329" + }, + "account_number": "32" + }, + "Gereed product": { + "Aanschaffingswaarde": { + "account_number": "330" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "339" + }, + "account_number": "33" + }, + "Handelsgoederen": { + "Aanschaffingswaarde": { + "account_number": "340", + "account_type": "Stock" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "349" + }, + "account_number": "34", + "account_type": "Stock" + }, + "Onroerende goederen bestemd voor verkoop": { + "Aanschaffingswaarde": { + "account_number": "350" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "359" + }, + "account_number": "35" + }, + "Vooruitbetalingen op voorraadinkopen": { + "Vooruitbetalingen": { + "account_number": "360" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "369" + }, + "account_number": "36" + }, + "Bestellingen in uitvoering": { + "Aanschaffingswaarde": { + "account_number": "370" + }, + "Toegerekende winst": { + "account_number": "371" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "379" + }, + "account_number": "37" + }, + "Geleverde voorraad, niet gefactureerd": { + "account_type": "Stock Delivered But Not Billed" + } + }, + "KLASSE 4 : VORDERINGEN OP TEN HOOGSTE ÉÉN JAAR": { + "root_type": "Asset", + "Handelsvorderingen": { + "Handelsdebiteuren": { + "account_number": "400", + "account_type": "Receivable" + }, + "Te innen wissels": { + "account_number": "401", + "account_type": "Receivable" + }, + "Te innen opbrengsten": { + "account_number": "404", + "account_type": "Receivable" + }, + "Vooruitbetalingen": { + "account_number": "406" + }, + "Dubieuze debiteuren": { + "account_number": "407", + "account_type": "Receivable" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "409" + }, + "account_number": "40", + "account_type": "Receivable" + }, + "Overige vorderingen": { + "Opgevraagd, niet gestort kapitaal of inbreng": { + "account_number": "410" + }, + "Terug te vorderen btw": { + "account_number": "411", + "account_type": "Tax" + }, + "Terug te vorderen belastingen en voorheffingen": { + "Buitenlandse belastingen": { + "account_number": "4128" + }, + "account_number": "412" + }, + "Te innen opbrengsten": { + "account_number": "414" + }, + "Diverse vorderingen": { + "account_number": "416" + }, + "Dubieuze debiteuren": { + "account_number": "417" + }, + "Borgtochten betaald in contanten": { + "account_number": "418" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "419" + }, + "account_number": "41" + } + }, + "KLASSE 4 : SCHULDEN OP TEN HOOGSTE ÉÉN JAAR": { + "root_type": "Liability", + "Schulden op meer dan één jaar die binnen het jaar vervallen (16) (zelfde onderverdeling als 17)": { + "account_number": "42" + }, + "Financiële schulden": { + "Kredietinstellingen - Leningen op rekening met vaste termijn": { + "account_number": "430" + }, + "Kredietinstellingen - Promessen": { + "account_number": "431" + }, + "Kredietinstellingen - Acceptkredieten": { + "account_number": "432" + }, + "Kredietinstellingen - Schulden in rekening-courant": { + "account_number": "433" + }, + "Overige leningen": { + "account_number": "439" + }, + "account_number": "43" + }, + "Handelsschulden": { + "Leveranciers": { + "account_number": "440", + "account_type": "Payable" + }, + "Te betalen wissels": { + "account_number": "441", + "account_type": "Payable" + }, + "Te ontvangen facturen": { + "account_number": "444", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "44", + "account_type": "Payable" + }, + "Schulden met betrekking tot belastingen, bezoldigingen en sociale lasten": { + "Geraamd bedrag der belastingschulden": { + "Buitenlandse belastingen en taksen": { + "account_number": "4508" + }, + "account_number": "450" + }, + "Te betalen btw": { + "account_number": "451", + "account_type": "Tax" + }, + "Te betalen belastingen en taksen": { + "Buitenlandse belastingen en taksen": { + "account_number": "4528" + }, + "account_number": "452" + }, + "Ingehouden voorheffingen": { + "account_number": "453" + }, + "Rijksdienst voor Sociale Zekerheid": { + "account_number": "454" + }, + "Bezoldigingen": { + "account_number": "455" + }, + "Vakantiegeld": { + "account_number": "456" + }, + "Andere sociale schulden": { + "account_number": "459" + }, + "account_number": "45" + }, + "Vooruitbetalingen op bestellingen": { + "account_number": "46" + }, + "Schulden uit de bestemming van het resultaat": { + "Dividenden en tantièmes over vorige boekjaren": { + "account_number": "470" + }, + "Dividenden over het boekjaar": { + "account_number": "471" + }, + "Tantièmes over het boekjaar": { + "account_number": "472" + }, + "Andere rechthebbenden": { + "account_number": "473" + }, + "account_number": "47" + }, + "Diverse schulden": { + "Vervallen obligaties en coupons": { + "account_number": "480" + }, + "Borgtochten ontvangen in contanten": { + "account_number": "488" + }, + "Andere diverse schulden": { + "account_number": "489" + }, + "account_number": "48" + }, + "Overlopende rekeningen": { + "Over te dragen kosten": { + "account_number": "490" + }, + "Verkregen opbrengsten": { + "account_number": "491" + }, + "Toe te rekenen kosten": { + "account_number": "492" + }, + "Over te dragen opbrengsten": { + "account_number": "493" + }, + "Wachtrekeningen": { + "account_number": "499" + }, + "account_number": "49" + } + }, + "KLASSE 5 : GELDBELEGGINGEN EN LIQUIDE MIDDELEN": { + "root_type": "Asset", + "Eigen aandelen": { + "account_number": "50" + }, + "Aandelen en geldbeleggingen andere dan vastrentende beleggingen": { + "Aanschaffingswaarde": { + "Aandelen": { + "account_number": "5100" + }, + "Geldbeleggingen andere dan vastrentende beleggingen": { + "account_number": "5101" + }, + "account_number": "510" + }, + "Niet-opgevraagde bedragen (-)": { + "Aandelen": { + "account_number": "5110" + }, + "account_number": "511" + }, + "Geboekte waardeverminderingen (-)": { + "Aandelen": { + "account_number": "5190" + }, + "Geldbeleggingen andere dan vastrentende beleggingen": { + "account_number": "5191" + }, + "account_number": "519" + }, + "account_number": "51" + }, + "Vastrentende effecten": { + "Aanschaffingswaarde": { + "account_number": "520" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "529" + }, + "account_number": "52" + }, + "Termijndeposito's": { + "Op meer dan één jaar": { + "account_number": "530" + }, + "Op meer dan één maand en op ten hoogste één jaar": { + "account_number": "531" + }, + "Op ten hoogste één maand": { + "account_number": "532" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "539" + }, + "account_number": "53" + }, + "Te incasseren vervallen waarden": { + "account_number": "54" + }, + "Kredietinstellingen": { + "Bank": { + "account_number": "5500", + "account_type": "Bank" + }, + "account_number": "55", + "account_type": "Bank" + }, + "Kassen": { + "Kassen-zegels": { + "account_number": "578", + "account_type": "Cash" + }, + "account_number": "57", + "account_type": "Cash" + }, + "Interne overboekingen": { + "account_number": "58", + "account_type": "Temporary" + } + }, + "KLASSE 6 : KOSTEN": { + "root_type": "Expense", + "Handelsgoederen, grond- en hulpstoffen": { + "Aankopen van grondstoffen": { + "account_number": "600", + "account_type": "Expense Account" + }, + "Aankopen van hulpstoffen": { + "account_number": "601", + "account_type": "Expense Account" + }, + "Aankopen van diensten, werk en studies": { + "account_number": "602", + "account_type": "Expense Account" + }, + "Algemene onderaannemingen": { + "account_number": "603", + "account_type": "Expense Account" + }, + "Aankopen van handelsgoederen": { + "account_number": "604", + "account_type": "Cost of Goods Sold" + }, + "Aankopen van onroerende goederen bestemd voor verkoop": { + "account_number": "605", + "account_type": "Expense Account" + }, + "Ontvangen kortingen, ristorno's en rabatten (-)": { + "account_number": "608", + "account_type": "Expense Account" + }, + "Voorraadwijzigingen": { + "van grondstoffen": { + "account_number": "6090", + "account_type": "Stock Adjustment" + }, + "van hulpstoffen": { + "account_number": "6091", + "account_type": "Stock Adjustment" + }, + "van handelsgoederen": { + "account_number": "6094", + "account_type": "Stock Adjustment" + }, + "van gekochte onroerende goederen bestemd voor verkoop": { + "account_number": "6095", + "account_type": "Stock Adjustment" + }, + "account_number": "609", + "account_type": "Stock Adjustment" + }, + "account_number": "60", + "account_type": "Expense Account" + }, + "Diensten en diverse goederen": { + "Uitzendkrachten en personen ter beschikking gesteld van de onderneming": { + "account_number": "617", + "account_type": "Expense Account" + }, + "Bezoldigingen en pensioenen van bestuurders, zaakvoerders en werkende vennoten, buiten arbeidsovereenkomst": { + "account_number": "618", + "account_type": "Expense Account" + }, + "Aankoopkosten begrepen in de waarde van de voorraden": { + "account_type": "Expenses Included In Valuation" + }, + "account_number": "61", + "account_type": "Expense Account" + }, + "Bezoldigingen, sociale lasten en pensioenen": { + "Bezoldigingen en rechtstreekse sociale voordelen": { + "Bestuurders of zaakvoerders": { + "account_number": "6200", + "account_type": "Expense Account" + }, + "Directiepersoneel": { + "account_number": "6201", + "account_type": "Expense Account" + }, + "Bedienden": { + "account_number": "6202", + "account_type": "Expense Account" + }, + "Arbeiders": { + "account_number": "6203", + "account_type": "Expense Account" + }, + "Andere personeelsleden": { + "account_number": "6204", + "account_type": "Expense Account" + }, + "account_number": "620", + "account_type": "Expense Account" + }, + "Werkgeversbijdragen voor sociale verzekeringen": { + "account_number": "621", + "account_type": "Expense Account" + }, + "Werkgeverspremies voor bovenwettelijke verzekeringen": { + "account_number": "622", + "account_type": "Expense Account" + }, + "Andere personeelskosten": { + "account_number": "623", + "account_type": "Expense Account" + }, + "Ouderdoms- en overlevingspensioenen": { + "Bestuurders of zaakvoerders": { + "account_number": "6240", + "account_type": "Expense Account" + }, + "Personeel": { + "account_number": "6241", + "account_type": "Expense Account" + }, + "account_number": "624", + "account_type": "Expense Account" + }, + "account_number": "62", + "account_type": "Expense Account" + }, + "Afschrijvingen, waardeverminderingen en voorzieningen voor risico's": { + "Afschrijvingen en waardeverminderingen op vaste activa-toevoeging": { + "Afschrijvingen op oprichtingskosten": { + "account_number": "6300", + "account_type": "Depreciation" + }, + "Afschrijvingen op immateriële vaste activa": { + "account_number": "6301", + "account_type": "Depreciation" + }, + "Afschrijvingen op materiële vaste activa": { + "account_number": "6302", + "account_type": "Depreciation" + }, + "Waardeverminderingen op immateriële vaste activa": { + "account_number": "6308", + "account_type": "Depreciation" + }, + "Waardeverminderingen op materiële vaste activa": { + "account_number": "6309", + "account_type": "Depreciation" + }, + "account_number": "630", + "account_type": "Depreciation" + }, + "Waardeverminderingen op voorraden": { + "Toevoeging": { + "account_number": "6310", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6311", + "account_type": "Depreciation" + }, + "account_number": "631", + "account_type": "Depreciation" + }, + "Waardeverminderingen op bestellingen in uitvoering": { + "Toevoeging": { + "account_number": "6320", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6321", + "account_type": "Depreciation" + }, + "account_number": "632", + "account_type": "Depreciation" + }, + "Waardeverminderingen op handelsvorderingen op meer dan één jaar": { + "Toevoeging": { + "account_number": "6330", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6331", + "account_type": "Depreciation" + }, + "account_number": "633", + "account_type": "Depreciation" + }, + "Waardeverminderingen op handelsvorderingen op ten hoogste één jaar": { + "Toevoeging": { + "account_number": "6340", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6341", + "account_type": "Depreciation" + }, + "account_number": "634", + "account_type": "Depreciation" + }, + "Voorzieningen voor pensioenen en soortgelijke verplichtingen": { + "Toevoeging": { + "account_number": "6350", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6351", + "account_type": "Depreciation" + }, + "account_number": "635", + "account_type": "Depreciation" + }, + "Voorzieningen voor grote herstellingswerken en grote onderhoudswerken": { + "Toevoeging": { + "account_number": "6360", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6361", + "account_type": "Depreciation" + }, + "account_number": "636", + "account_type": "Depreciation" + }, + "Voorzieningen voor milieuverplichtingen": { + "Toevoeging": { + "account_number": "6370", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6371", + "account_type": "Depreciation" + }, + "account_number": "637", + "account_type": "Depreciation" + }, + "Voorzieningen voor andere risico's en kosten": { + "Toevoeging": { + "account_number": "6380", + "account_type": "Expense Account" + }, + "Besteding en terugneming (-)": { + "account_number": "6381", + "account_type": "Expense Account" + }, + "account_number": "638", + "account_type": "Expense Account" + }, + "account_number": "63", + "account_type": "Expense Account" + }, + "Andere bedrijfskosten": { + "Bedrijfsbelastingen": { + "account_number": "640", + "account_type": "Expense Account" + }, + "Minderwaarden op de courante realisatie van vaste activa": { + "account_number": "641", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van handelsvorderingen": { + "account_number": "642", + "account_type": "Expense Account" + }, + "Diverse bedrijfskosten (643 tot 648)": { + "account_number": "643", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde bedrijfskosten (-)": { + "account_number": "649", + "account_type": "Expense Account" + }, + "account_number": "64", + "account_type": "Expense Account" + }, + "Financiële kosten": { + "Kosten van schulden": { + "Rente, commissies en kosten verbonden aan schulden": { + "account_number": "6500", + "account_type": "Expense Account" + }, + "Afschrijving van kosten bij uitgifte van leningen": { + "account_number": "6501", + "account_type": "Expense Account" + }, + "Geactiveerde intercalaire interesten (-)": { + "account_number": "6502", + "account_type": "Expense Account" + }, + "account_number": "650", + "account_type": "Expense Account" + }, + "Waardeverminderingen op vlottende activa": { + "Toevoeging": { + "account_number": "6510", + "account_type": "Expense Account" + }, + "Terugneming (-)": { + "account_number": "6511", + "account_type": "Expense Account" + }, + "account_number": "651", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van vlottende activa": { + "account_number": "652", + "account_type": "Expense Account" + }, + "Discontokosten op vorderingen": { + "account_number": "653", + "account_type": "Expense Account" + }, + "Wisselresultaten": { + "account_number": "654", + "account_type": "Expense Account" + }, + "Resultaten uit de omrekening van vreemde valuta": { + "account_number": "655", + "account_type": "Expense Account" + }, + "Voorzieningen met financieel karakter": { + "Toevoegingen": { + "account_number": "6560", + "account_type": "Expense Account" + }, + "Bestedingen en terugnemingen (-)": { + "account_number": "6561", + "account_type": "Expense Account" + }, + "account_number": "656", + "account_type": "Expense Account" + }, + "Diverse financiële kosten (657 tot 658)": { + "account_number": "657", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde financiële kosten (-)": { + "account_number": "659", + "account_type": "Expense Account" + }, + "account_number": "65", + "account_type": "Expense Account" + }, + "Niet-recurrente bedrijfs- of financiële kosten": { + "Niet-recurrente afschrijvingen en waardeverminderingen (toevoeging)": { + "op oprichtingskosten": { + "account_number": "6600", + "account_type": "Expense Account" + }, + "op immateriële vaste activa": { + "account_number": "6601", + "account_type": "Expense Account" + }, + "op materiële vaste activa": { + "account_number": "6602", + "account_type": "Expense Account" + }, + "account_number": "660", + "account_type": "Expense Account" + }, + "Waardeverminderingen op financiële vaste activa (toevoeging)": { + "account_number": "661", + "account_type": "Expense Account" + }, + "Voorzieningen voor niet-recurrente risico's en kosten": { + "Voorzieningen voor niet-recurrente bedrijfsrisico's en -kosten": { + "Toevoeging": { + "account_number": "66200", + "account_type": "Expense Account" + }, + "Besteding (-)": { + "account_number": "66201", + "account_type": "Expense Account" + }, + "account_number": "6620", + "account_type": "Expense Account" + }, + "Voorzieningen voor niet-recurrente financiële risico's en -kosten": { + "Toevoeging": { + "account_number": "66210", + "account_type": "Expense Account" + }, + "Besteding (-)": { + "account_number": "66211", + "account_type": "Expense Account" + }, + "account_number": "6621", + "account_type": "Expense Account" + }, + "account_number": "662", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van vaste activa": { + "Minderwaarden op de realisatie van immateriële en materiële vaste activa": { + "account_number": "6630", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van financiële vaste activa": { + "account_number": "6631", + "account_type": "Expense Account" + }, + "account_number": "663", + "account_type": "Expense Account" + }, + "Andere niet-recurrente bedrijfskosten (664 tot 667)": { + "account_number": "664", + "account_type": "Expense Account" + }, + "Andere niet-recurrente financiële kosten": { + "account_number": "668", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde niet-recurrente bedrijfskosten (-)": { + "account_number": "6690", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde niet-recurrente financiële kosten (-)": { + "account_number": "6691", + "account_type": "Expense Account" + }, + "account_number": "66", + "account_type": "Expense Account" + }, + "Belastingen op het resultaat": { + "Belgische belastingen op het resultaat van het boekjaar": { + "Verschuldigde of gestorte belastingen en voorheffingen": { + "account_number": "6700", + "account_type": "Expense Account" + }, + "Geactiveerde overschotten van betaalde belastingen en voorheffingen (-)": { + "account_number": "6701", + "account_type": "Expense Account" + }, + "Geraamde belastingen": { + "account_number": "6702", + "account_type": "Expense Account" + }, + "account_number": "670", + "account_type": "Expense Account" + }, + "Belgische belastingen op het resultaat van vorige boekjaren": { + "Verschuldigde of gestorte belastingsupplementen": { + "account_number": "6710", + "account_type": "Expense Account" + }, + "Geraamde belastingsupplementen": { + "account_number": "6711", + "account_type": "Expense Account" + }, + "Gevormde fiscale voorzieningen": { + "account_number": "6712", + "account_type": "Expense Account" + }, + "account_number": "671", + "account_type": "Expense Account" + }, + "Buitenlandse belastingen op het resultaat van het boekjaar": { + "account_number": "672", + "account_type": "Expense Account" + }, + "Buitenlandse belastingen op het resultaat van vorige boekjaren": { + "account_number": "673", + "account_type": "Expense Account" + }, + "account_number": "67", + "account_type": "Expense Account" + }, + "Overboeking naar de uitgestelde belastingen en naar de belastingvrije reserves": { + "Overboeking naar de uitgestelde belastingen": { + "account_number": "680", + "account_type": "Expense Account" + }, + "Overboeking naar de belastingvrije reserves": { + "account_number": "689", + "account_type": "Expense Account" + }, + "account_number": "68", + "account_type": "Expense Account" + }, + "Resultatenverwerking": { + "Overgedragen verlies van het vorige boekjaar": { + "account_number": "690", + "account_type": "Expense Account" + }, + "Toevoeging aan de inbreng": { + "account_number": "691", + "account_type": "Expense Account" + }, + "Toevoeging aan de reserves": { + "Toevoeging aan de wettelijke reserve": { + "account_number": "6920", + "account_type": "Expense Account" + }, + "Toevoeging aan de overige reserves": { + "account_number": "6921", + "account_type": "Expense Account" + }, + "account_number": "692", + "account_type": "Expense Account" + }, + "Over te dragen winst": { + "account_number": "693", + "account_type": "Expense Account" + }, + "Vergoeding van de inbreng": { + "account_number": "694", + "account_type": "Expense Account" + }, + "Bestuurders of zaakvoerders": { + "account_number": "695", + "account_type": "Expense Account" + }, + "Werknemers": { + "account_number": "696", + "account_type": "Expense Account" + }, + "Andere rechthebbenden": { + "account_number": "697", + "account_type": "Expense Account" + }, + "account_number": "69", + "account_type": "Expense Account" + } + }, + "KLASSE 7 : OPBRENGSTEN": { + "root_type": "Income", + "Omzet": { + "Toegekende kortingen, ristorno's en rabatten (-)": { + "account_number": "708", + "account_type": "Income Account" + }, + "account_number": "70", + "account_type": "Income Account" + }, + "Wijzigingen in de voorraden en in de bestellingen in uitvoering": { + "In de voorraad goederen in bewerking": { + "account_number": "712", + "account_type": "Income Account" + }, + "In de voorraad gereed product": { + "account_number": "713", + "account_type": "Income Account" + }, + "In de voorraad onroerende goederen bestemd voor verkoop": { + "account_number": "715", + "account_type": "Income Account" + }, + "In de bestellingen in uitvoering": { + "Aanschaffingswaarde": { + "account_number": "7170", + "account_type": "Income Account" + }, + "Toegerekende winst": { + "account_number": "7171", + "account_type": "Income Account" + }, + "account_number": "717", + "account_type": "Income Account" + }, + "account_number": "71", + "account_type": "Income Account" + }, + "Geproduceerde vaste activa": { + "account_number": "72", + "account_type": "Income Account" + }, + "Andere bedrijfsopbrengsten": { + "Bedrijfssubsidies en compenserende bedragen": { + "account_number": "740", + "account_type": "Income Account" + }, + "Meerwaarden op de courante realisatie van materiële vaste activa": { + "account_number": "741", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van handelsvorderingen": { + "account_number": "742", + "account_type": "Income Account" + }, + "Diverse bedrijfsopbrengsten (743 tot 749)": { + "account_number": "743", + "account_type": "Income Account" + }, + "account_number": "74", + "account_type": "Income Account" + }, + "Financiële opbrengsten": { + "Opbrengsten uit financiële vaste activa": { + "account_number": "750", + "account_type": "Income Account" + }, + "Opbrengsten uit vlottende activa": { + "account_number": "751", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van vlottende activa": { + "account_number": "752", + "account_type": "Income Account" + }, + "Kapitaal- en interestsubsidies": { + "account_number": "753", + "account_type": "Income Account" + }, + "Wisselresultaten": { + "account_number": "754", + "account_type": "Income Account" + }, + "Resultaten uit de omrekening van vreemde valuta": { + "account_number": "755", + "account_type": "Income Account" + }, + "Diverse financiële opbrengsten (756 tot 759)": { + "account_number": "756", + "account_type": "Income Account" + }, + "account_number": "75", + "account_type": "Income Account" + }, + "Niet-recurrente bedrijfs- of financiële opbrengsten": { + "Terugneming van afschrijvingen en waardeverminderingen": { + "op immateriële vaste activa": { + "account_number": "7600", + "account_type": "Income Account" + }, + "op materiële vaste activa": { + "account_number": "7601", + "account_type": "Income Account" + }, + "account_number": "760", + "account_type": "Income Account" + }, + "Terugneming van waardeverminderingen op financiële vaste activa": { + "account_number": "761", + "account_type": "Income Account" + }, + "Terugneming van voorzieningen voor niet-recurrente risico's en kosten": { + "Terugneming van voorzieningen voor niet-recurrente bedrijfsrisico's en -kosten": { + "account_number": "7620", + "account_type": "Income Account" + }, + "Terugneming van voorzieningen voor niet-recurrente financiële risico's en -kosten": { + "account_number": "7621", + "account_type": "Income Account" + }, + "account_number": "762", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van vaste activa": { + "Meerwaarde op de realisatie van immateriële en materiële vaste activa": { + "account_number": "7630", + "account_type": "Income Account" + }, + "Meerwaarde op de realisatie van financiële vaste activa": { + "account_number": "7631", + "account_type": "Income Account" + }, + "account_number": "763", + "account_type": "Income Account" + }, + "Andere niet-recurrente bedrijfsopbrengsten (764 tot 768)": { + "account_number": "764", + "account_type": "Income Account" + }, + "Andere niet-recurrente financiële opbrengsten": { + "account_number": "769", + "account_type": "Income Account" + }, + "account_number": "76", + "account_type": "Income Account" + }, + "Regularisering van belastingen en terugneming van fiscale voorzieningen": { + "Belgische belastingen op het resultaat": { + "Regularisering van verschuldigde of betaalde belastingen": { + "account_number": "7710", + "account_type": "Income Account" + }, + "Regularisering van geraamde belastingen": { + "account_number": "7711", + "account_type": "Income Account" + }, + "Terugneming van fiscale voorzieningen": { + "account_number": "7712", + "account_type": "Income Account" + }, + "account_number": "771", + "account_type": "Income Account" + }, + "Buitenlandse belastingen op het resultaat": { + "account_number": "773", + "account_type": "Income Account" + }, + "account_number": "77", + "account_type": "Income Account" + }, + "Onttrekkingen aan de belastingvrije reserves en uitgestelde belastingen": { + "Onttrekkingen aan de uitgestelde belastingen": { + "account_number": "780", + "account_type": "Income Account" + }, + "Onttrekkingen aan de belastingvrije reserves": { + "account_number": "789", + "account_type": "Income Account" + }, + "account_number": "78", + "account_type": "Income Account" + }, + "Resultaatverwerking": { + "Overgedragen winst van het vorige boekjaar": { + "account_number": "790", + "account_type": "Income Account" + }, + "Onttrekking aan de inbreng": { + "account_number": "791", + "account_type": "Income Account" + }, + "Onttrekking aan de reserves": { + "account_number": "792", + "account_type": "Income Account" + }, + "Over te dragen verlies": { + "account_number": "793", + "account_type": "Income Account" + }, + "Tussenkomst van vennoten (of van de eigenaar) in het verlies": { + "account_number": "794", + "account_type": "Income Account" + }, + "account_number": "79", + "account_type": "Income Account" + } + } + } +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_verenigingen_stichtingen.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_verenigingen_stichtingen.json new file mode 100644 index 00000000000..d94c3552e40 --- /dev/null +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_minimum_genormaliseerd_rekeningstelsel_verenigingen_stichtingen.json @@ -0,0 +1,1478 @@ +{ + "country_code": "be", + "name": "België - Minimum genormaliseerd algemeen rekeningstelsel voor verenigingen en stichtingen", + "tree": { + "KLASSE 1 : VERENIGINGSFONDS EN STICHTINGSFONDS": { + "root_type": "Equity", + "Fondsen van de vereniging of stichting": { + "account_number": "10", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden": { + "Herwaarderingsmeerwaarden op immateriële vaste activa": { + "account_number": "120", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden op materiële vaste activa": { + "account_number": "121", + "account_type": "Equity" + }, + "Herwaarderingsmeerwaarden op financiële vaste activa": { + "account_number": "122", + "account_type": "Equity" + }, + "Terugneming van waardeverminderingen op geldbeleggingen": { + "account_number": "124", + "account_type": "Equity" + }, + "account_number": "12", + "account_type": "Equity" + }, + "Bestemde fondsen en andere reserves": { + "Fondsen bestemd voor investeringen": { + "account_number": "130", + "account_type": "Equity" + }, + "Fondsen bestemd voor sociaal passief": { + "account_number": "131", + "account_type": "Equity" + }, + "Belastingvrije reserves": { + "account_number": "132", + "account_type": "Equity" + }, + "Andere bestemde fondsen en andere reserves": { + "account_number": "139", + "account_type": "Equity" + }, + "account_number": "13", + "account_type": "Equity" + }, + "Overgedragen resultaat (+)(-)": { + "account_number": "14", + "account_type": "Equity" + }, + "Kapitaalsubsidies": { + "account_number": "15", + "account_type": "Equity" + } + }, + "KLASSE 1 : VOORZIENINGEN, UITGESTELDE BELASTINGEN EN SCHULDEN OP MEER DAN ÉÉN JAAR": { + "root_type": "Liability", + "Voorzieningen en uitgestelde belastingen": { + "Voorzieningen voor pensioenen en soortgelijke verplichtingen": { + "account_number": "160", + "account_type": "Liability" + }, + "Voorzieningen voor belastingen": { + "account_number": "161", + "account_type": "Liability" + }, + "Voorzieningen voor grote herstellingswerken en grote onderhoudswerken": { + "account_number": "162", + "account_type": "Liability" + }, + "Voorzieningen voor milieuverplichtingen": { + "account_number": "163", + "account_type": "Liability" + }, + "Voorzieningen voor terug te betalen subsidies, legaten en schenkingen met terugnemingsrecht": { + "account_number": "167", + "account_type": "Liability" + }, + "Uitgestelde belastingen": { + "account_number": "168", + "account_type": "Liability" + }, + "account_number": "16", + "account_type": "Liability" + }, + "Schulden op meer dan één jaar": { + "Achtergestelde leningen": { + "account_number": "170", + "account_type": "Liability" + }, + "Niet-achtergestelde obligatieleningen": { + "account_number": "171", + "account_type": "Liability" + }, + "Leasingschulden en soortgelijke schulden": { + "account_number": "172", + "account_type": "Liability" + }, + "Kredietinstellingen": { + "Schulden op rekening": { + "account_number": "1730", + "account_type": "Liability" + }, + "Promessen": { + "account_number": "1731", + "account_type": "Liability" + }, + "Acceptkredieten": { + "account_number": "1732", + "account_type": "Liability" + }, + "account_number": "173", + "account_type": "Liability" + }, + "Overige leningen": { + "account_number": "174", + "account_type": "Liability" + }, + "Handelsschulden": { + "Leveranciers": { + "account_number": "1750", + "account_type": "Liability" + }, + "Te betalen wissels": { + "account_number": "1751", + "account_type": "Liability" + }, + "account_number": "175", + "account_type": "Liability" + }, + "Vooruitbetalingen op bestellingen": { + "account_number": "176", + "account_type": "Liability" + }, + "Borgtochten in contanten": { + "account_number": "178", + "account_type": "Liability" + }, + "Overige schulden": { + "Rentedragend": { + "account_number": "1790", + "account_type": "Liability" + }, + "Niet-rentedragend of gekoppeld aan een abnormaal lage rente": { + "account_number": "1791", + "account_type": "Liability" + }, + "account_number": "179", + "account_type": "Liability" + }, + "account_number": "17", + "account_type": "Liability" + } + }, + "KLASSE 2 : OPRICHTINGSKOSTEN, VASTE ACTIVA EN VORDERINGEN OP MEER DAN ÉÉN JAAR": { + "root_type": "Asset", + "Oprichtingskosten": { + "Kosten van oprichting": { + "account_number": "200", + "account_type": "Fixed Asset" + }, + "Kosten bij uitgifte van leningen": { + "account_number": "201", + "account_type": "Fixed Asset" + }, + "Overige oprichtingskosten": { + "account_number": "202", + "account_type": "Fixed Asset" + }, + "Herstructureringskosten": { + "account_number": "204", + "account_type": "Fixed Asset" + }, + "account_number": "20", + "account_type": "Fixed Asset" + }, + "Immateriële vaste activa": { + "Kosten van onderzoek en ontwikkeling": { + "account_number": "210", + "account_type": "Fixed Asset" + }, + "Concessies, octrooien, licenties, knowhow, merken en soortgelijke rechten": { + "account_number": "211", + "account_type": "Fixed Asset" + }, + "Goodwill": { + "account_number": "212", + "account_type": "Fixed Asset" + }, + "Vooruitbetalingen": { + "account_number": "213", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "219", + "account_type": "Accumulated Depreciation" + }, + "account_number": "21", + "account_type": "Fixed Asset" + }, + "Terreinen en gebouwen": { + "Terreinen": { + "account_number": "220", + "account_type": "Fixed Asset" + }, + "Gebouwen": { + "account_number": "221", + "account_type": "Fixed Asset" + }, + "Bebouwde terreinen": { + "account_number": "222", + "account_type": "Fixed Asset" + }, + "Overige zakelijke rechten op onroerende goederen": { + "account_number": "223", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "229", + "account_type": "Accumulated Depreciation" + }, + "account_number": "22", + "account_type": "Fixed Asset" + }, + "Installaties, machines en uitrusting": { + "account_number": "23", + "account_type": "Fixed Asset" + }, + "Meubilair en rollend materieel": { + "account_number": "24", + "account_type": "Fixed Asset" + }, + "Vaste activa in leasing of op grond van soortgelijke rechten": { + "Terreinen en gebouwen": { + "account_number": "250", + "account_type": "Fixed Asset" + }, + "Installaties, machines en uitrusting": { + "account_number": "251", + "account_type": "Fixed Asset" + }, + "Meubilair en rollend materieel": { + "account_number": "252", + "account_type": "Fixed Asset" + }, + "Geboekte afschrijvingen en waardeverminderingen (-)": { + "account_number": "259", + "account_type": "Accumulated Depreciation" + }, + "account_number": "25", + "account_type": "Fixed Asset" + }, + "Overige materiële vaste activa": { + "account_number": "26", + "account_type": "Fixed Asset" + }, + "Materiële activa in aanbouw en vooruitbetalingen": { + "account_number": "27", + "account_type": "Fixed Asset" + }, + "Financiële vaste activa": { + "Deelnemingen in verbonden vennootschappen": { + "Aanschaffingswaarde": { + "account_number": "2800", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2801", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2808", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2809", + "account_type": "Fixed Asset" + }, + "account_number": "280", + "account_type": "Fixed Asset" + }, + "Vorderingen op verbonden entiteiten": { + "Vorderingen op rekening": { + "account_number": "2810", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2811", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2812", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2817", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2819", + "account_type": "Fixed Asset" + }, + "account_number": "281", + "account_type": "Fixed Asset" + }, + "Deelnemingen in vennootschappen waarmee een deelnemingsverhouding bestaat": { + "Aanschaffingswaarde": { + "account_number": "2820", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2821", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2828", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2829", + "account_type": "Fixed Asset" + }, + "account_number": "282", + "account_type": "Fixed Asset" + }, + "Vorderingen op vennootschappen waarmee een deelnemingsverhouding bestaat": { + "Vorderingen op rekening": { + "account_number": "2830", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2831", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2832", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2837", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2839", + "account_type": "Fixed Asset" + }, + "account_number": "283", + "account_type": "Fixed Asset" + }, + "Andere aandelen": { + "Aanschaffingswaarde": { + "account_number": "2840", + "account_type": "Fixed Asset" + }, + "Nog te storten bedragen (-)": { + "account_number": "2841", + "account_type": "Fixed Asset" + }, + "Geboekte meerwaarden": { + "account_number": "2848", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2849", + "account_type": "Fixed Asset" + }, + "account_number": "284", + "account_type": "Fixed Asset" + }, + "Overige vorderingen": { + "Vorderingen op rekening": { + "account_number": "2850", + "account_type": "Fixed Asset" + }, + "Te innen wissels": { + "account_number": "2851", + "account_type": "Fixed Asset" + }, + "Vastrentende effecten": { + "account_number": "2852", + "account_type": "Fixed Asset" + }, + "Dubieuze debiteuren": { + "account_number": "2857", + "account_type": "Fixed Asset" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2859", + "account_type": "Fixed Asset" + }, + "account_number": "285", + "account_type": "Fixed Asset" + }, + "Borgtochten betaald in contanten": { + "account_number": "288", + "account_type": "Fixed Asset" + }, + "account_number": "28", + "account_type": "Fixed Asset" + }, + "Vorderingen op meer dan 1 jaar": { + "Handelsvorderingen": { + "Handelsdebiteuren": { + "account_number": "2900" + }, + "Te innen wissels": { + "account_number": "2901" + }, + "Vooruitbetalingen": { + "account_number": "2906" + }, + "Dubieuze debiteuren": { + "account_number": "2907" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2909" + }, + "account_number": "290" + }, + "Overige vorderingen": { + "Vorderingen op rekening": { + "account_number": "2910" + }, + "Te innen wissels": { + "account_number": "2911" + }, + "Te ontvangen subsidies": { + "account_number": "2912" + }, + "Niet-rentedragende vorderingen of gekoppeld aan een abnormaal lage rente": { + "account_number": "2915" + }, + "Dubieuze debiteuren": { + "account_number": "2916" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "2919" + }, + "account_number": "291" + }, + "account_number": "29" + } + }, + "KLASSE 3 : VOORRADEN EN BESTELLINGEN IN UITVOERING": { + "root_type": "Asset", + "Grondstoffen": { + "Aanschaffingswaarde": { + "account_number": "300" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "309" + }, + "account_number": "30" + }, + "Hulpstoffen": { + "Aanschaffingswaarde": { + "account_number": "310" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "319" + }, + "account_number": "31" + }, + "Goederen in bewerking": { + "Aanschaffingswaarde": { + "account_number": "320" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "329" + }, + "account_number": "32" + }, + "Gereed product": { + "Aanschaffingswaarde": { + "account_number": "330" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "339" + }, + "account_number": "33" + }, + "Handelsgoederen": { + "Aanschaffingswaarde": { + "account_number": "340", + "account_type": "Stock" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "349" + }, + "account_number": "34", + "account_type": "Stock" + }, + "Onroerende goederen bestemd voor verkoop": { + "Aanschaffingswaarde": { + "account_number": "350" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "359" + }, + "account_number": "35" + }, + "Vooruitbetalingen op voorraadinkopen": { + "Vooruitbetalingen": { + "account_number": "360" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "369" + }, + "account_number": "36" + }, + "Bestellingen in uitvoering": { + "Aanschaffingswaarde": { + "account_number": "370" + }, + "Toegerekende winst": { + "account_number": "371" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "379" + }, + "account_number": "37" + }, + "Geleverde voorraad, niet gefactureerd": { + "account_type": "Stock Delivered But Not Billed" + } + }, + "KLASSE 4 : VORDERINGEN OP TEN HOOGSTE ÉÉN JAAR": { + "root_type": "Asset", + "Handelsvorderingen": { + "Handelsdebiteuren": { + "account_number": "400", + "account_type": "Receivable" + }, + "Te innen wissels": { + "account_number": "401", + "account_type": "Receivable" + }, + "Te innen opbrengsten": { + "account_number": "404", + "account_type": "Receivable" + }, + "Vooruitbetalingen": { + "account_number": "406" + }, + "Dubieuze debiteuren": { + "account_number": "407", + "account_type": "Receivable" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "409" + }, + "account_number": "40", + "account_type": "Receivable" + }, + "Overige vorderingen": { + "Terug te vorderen btw": { + "account_number": "411", + "account_type": "Tax" + }, + "Terug te vorderen belastingen en voorheffingen": { + "Andere Belgische belastingen": { + "account_number": "4125" + }, + "Buitenlandse belastingen": { + "account_number": "4128" + }, + "account_number": "412" + }, + "Te ontvangen subsidies": { + "account_number": "413" + }, + "Te innen opbrengsten": { + "account_number": "414" + }, + "Niet-rentedragende vorderingen of gekoppeld aan een abnormaal lage rente": { + "account_number": "415" + }, + "Diverse vorderingen": { + "account_number": "416" + }, + "Dubieuze debiteuren": { + "account_number": "417" + }, + "Borgtochten betaald in contanten": { + "account_number": "418" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "419" + }, + "account_number": "41" + } + }, + "KLASSE 4 : SCHULDEN OP TEN HOOGSTE ÉÉN JAAR": { + "root_type": "Liability", + "Schulden op meer dan één jaar die binnen het jaar vervallen": { + "account_number": "42" + }, + "Financiële schulden": { + "Kredietinstellingen - Leningen op rekening met vaste termijn": { + "account_number": "430" + }, + "Kredietinstellingen - Promessen": { + "account_number": "431" + }, + "Kredietinstellingen - Acceptkredieten": { + "account_number": "432" + }, + "Kredietinstellingen - Schulden op rekening-courant": { + "account_number": "433" + }, + "Overige leningen": { + "account_number": "439" + }, + "account_number": "43" + }, + "Handelsschulden": { + "Leveranciers": { + "account_number": "440", + "account_type": "Payable" + }, + "Te betalen wissels": { + "account_number": "441", + "account_type": "Payable" + }, + "Te ontvangen facturen": { + "account_number": "444", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "44", + "account_type": "Payable" + }, + "Schulden met betrekking tot belastingen, bezoldigingen en sociale lasten": { + "Geraamd bedrag der belastingschulden": { + "Andere Belgische belastingen": { + "account_number": "4505" + }, + "Buitenlandse belastingen": { + "account_number": "4508" + }, + "account_number": "450" + }, + "Te betalen btw": { + "account_number": "451", + "account_type": "Tax" + }, + "Te betalen belastingen en taksen": { + "Andere Belgische belastingen": { + "account_number": "4525" + }, + "Buitenlandse belastingen": { + "account_number": "4528" + }, + "account_number": "452" + }, + "Ingehouden voorheffingen": { + "account_number": "453" + }, + "Rijksdienst voor Sociale Zekerheid": { + "account_number": "454" + }, + "Bezoldigingen": { + "account_number": "455" + }, + "Vakantiegeld": { + "account_number": "456" + }, + "Andere sociale schulden": { + "account_number": "459" + }, + "account_number": "45" + }, + "Overlopende rekeningen": { + "Over te dragen kosten": { + "account_number": "490" + }, + "Verkregen opbrengsten": { + "account_number": "491" + }, + "Toe te rekenen kosten": { + "account_number": "492" + }, + "Over te dragen opbrengsten": { + "account_number": "493" + }, + "Wachtrekeningen": { + "account_number": "499" + }, + "account_number": "49" + }, + "Vervallen obligaties en coupons": { + "account_number": "480" + }, + "Terug te betalen subsidies": { + "account_number": "483" + }, + "Borgtochten ontvangen in contanten": { + "account_number": "488" + }, + "Andere diverse schulden": { + "Rentedragend": { + "account_number": "4890" + }, + "Niet-rentedragend of gekoppeld aan een abnormaal lage rente": { + "account_number": "4891" + }, + "account_number": "489" + } + }, + "KLASSE 5 : GELDBELEGGINGEN EN LIQUIDE MIDDELEN": { + "root_type": "Asset", + "Geldbeleggingen andere dan aandelen, vastrentende effecten en termijndeposito's": { + "Aanschaffingswaarde": { + "account_number": "500" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "509" + }, + "account_number": "50" + }, + "Aandelen": { + "Aanschaffingswaarde": { + "account_number": "510" + }, + "Nog te storten bedragen (-)": { + "account_number": "511" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "519" + }, + "account_number": "51" + }, + "Vastrentende effecten": { + "Aanschaffingswaarde": { + "account_number": "520" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "529" + }, + "account_number": "52" + }, + "Termijndeposito's": { + "Op meer dan één jaar": { + "account_number": "530" + }, + "Op meer dan één maand en op ten hoogste één jaar": { + "account_number": "531" + }, + "Op ten hoogste één maand": { + "account_number": "532" + }, + "Geboekte waardeverminderingen (-)": { + "account_number": "539" + }, + "account_number": "53" + }, + "Te incasseren vervallen waarden": { + "account_number": "54" + }, + "Kredietinstellingen": { + "Bank": { + "account_number": "5500", + "account_type": "Bank" + }, + "account_number": "55", + "account_type": "Bank" + }, + "Kassen": { + "Kassen-contanten": { + "account_number": "570", + "account_type": "Cash" + }, + "Kassen-zegels": { + "account_number": "578", + "account_type": "Cash" + }, + "account_number": "57", + "account_type": "Cash" + }, + "Interne overboekingen": { + "account_number": "58", + "account_type": "Temporary" + } + }, + "KLASSE 6 : KOSTEN": { + "root_type": "Expense", + "Handelsgoederen, grond- en hulpstoffen": { + "Aankopen van grondstoffen": { + "account_number": "600", + "account_type": "Expense Account" + }, + "Aankopen van hulpstoffen": { + "account_number": "601", + "account_type": "Expense Account" + }, + "Aankopen van diensten, werk en studies": { + "account_number": "602", + "account_type": "Expense Account" + }, + "Algemene onderaannemingen": { + "account_number": "603", + "account_type": "Expense Account" + }, + "Aankopen van handelsgoederen": { + "account_number": "604", + "account_type": "Cost of Goods Sold" + }, + "Aankopen van onroerende goederen bestemd voor verkoop": { + "account_number": "605", + "account_type": "Expense Account" + }, + "Ontvangen kortingen, ristorno's en rabatten (-)": { + "account_number": "608", + "account_type": "Expense Account" + }, + "Voorraadwijzigingen": { + "van grondstoffen": { + "account_number": "6090", + "account_type": "Stock Adjustment" + }, + "van hulpstoffen": { + "account_number": "6091", + "account_type": "Stock Adjustment" + }, + "van handelsgoederen": { + "account_number": "6094", + "account_type": "Stock Adjustment" + }, + "van gekochte onroerende goederen bestemd voor verkoop": { + "account_number": "6095", + "account_type": "Stock Adjustment" + }, + "account_number": "609", + "account_type": "Stock Adjustment" + }, + "account_number": "60", + "account_type": "Expense Account" + }, + "Diensten en diverse goederen": { + "Uitzendpersoneel en personen die ter beschikking worden gesteld van de vereniging of stichting": { + "account_number": "617", + "account_type": "Expense Account" + }, + "Bezoldigingen en pensioenen van bestuurders, buiten arbeidsovereenkomst": { + "account_number": "618", + "account_type": "Expense Account" + }, + "Aankoopkosten begrepen in de waarde van de voorraden": { + "account_type": "Expenses Included In Valuation" + }, + "account_number": "61", + "account_type": "Expense Account" + }, + "Bezoldigingen, sociale lasten en pensioenen": { + "Bezoldigingen en rechtstreekse sociale voordelen": { + "Bestuurders of zaakvoerders": { + "account_number": "6200", + "account_type": "Expense Account" + }, + "Directiepersoneel": { + "account_number": "6201", + "account_type": "Expense Account" + }, + "Bedienden": { + "account_number": "6202", + "account_type": "Expense Account" + }, + "Arbeiders": { + "account_number": "6203", + "account_type": "Expense Account" + }, + "Andere personeelsleden": { + "account_number": "6204", + "account_type": "Expense Account" + }, + "account_number": "620", + "account_type": "Expense Account" + }, + "Werkgeversbijdragen voor sociale verzekeringen": { + "account_number": "621", + "account_type": "Expense Account" + }, + "Werkgeverspremies voor buitenwettelijke verzekeringen": { + "account_number": "622", + "account_type": "Expense Account" + }, + "Andere personeelskosten": { + "account_number": "623", + "account_type": "Expense Account" + }, + "Ouderdoms- en overlevingspensioenen": { + "Bestuurders of zaakvoerders": { + "account_number": "6240", + "account_type": "Expense Account" + }, + "Personeel": { + "account_number": "6241", + "account_type": "Expense Account" + }, + "account_number": "624", + "account_type": "Expense Account" + }, + "account_number": "62", + "account_type": "Expense Account" + }, + "Afschrijvingen, waardeverminderingen en voorzieningen voor risico's en kosten": { + "Afschrijvingen en waardeverminderingen op vaste activa-toevoeging": { + "Afschrijvingen op oprichtingskosten": { + "account_number": "6300", + "account_type": "Depreciation" + }, + "Afschrijvingen op immateriële vaste activa": { + "account_number": "6301", + "account_type": "Depreciation" + }, + "Afschrijvingen op materiële vaste activa": { + "account_number": "6302", + "account_type": "Depreciation" + }, + "Waardeverminderingen op immateriële vaste activa": { + "account_number": "6308", + "account_type": "Depreciation" + }, + "Waardeverminderingen op materiële vaste activa": { + "account_number": "6309", + "account_type": "Depreciation" + }, + "account_number": "630", + "account_type": "Depreciation" + }, + "Waardeverminderingen op voorraden": { + "Toevoeging": { + "account_number": "6310", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6311", + "account_type": "Depreciation" + }, + "account_number": "631", + "account_type": "Depreciation" + }, + "Waardeverminderingen op bestellingen in uitvoering": { + "Toevoeging": { + "account_number": "6320", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6321", + "account_type": "Depreciation" + }, + "account_number": "632", + "account_type": "Depreciation" + }, + "Waardeverminderingen op handelsvorderingen op meer dan één jaar": { + "Toevoeging": { + "account_number": "6330", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6331", + "account_type": "Depreciation" + }, + "account_number": "633", + "account_type": "Depreciation" + }, + "Waardeverminderingen op handelsvorderingen op ten hoogste één jaar": { + "Toevoeging": { + "account_number": "6340", + "account_type": "Depreciation" + }, + "Terugneming (-)": { + "account_number": "6341", + "account_type": "Depreciation" + }, + "account_number": "634", + "account_type": "Depreciation" + }, + "Voorzieningen voor pensioenen en soortgelijke verplichtingen": { + "Toevoeging": { + "account_number": "6350", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6351", + "account_type": "Depreciation" + }, + "account_number": "635", + "account_type": "Depreciation" + }, + "Voorzieningen voor grote herstellingswerken en grote onderhoudswerken": { + "Toevoeging": { + "account_number": "6360", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6361", + "account_type": "Depreciation" + }, + "account_number": "636", + "account_type": "Depreciation" + }, + "Voorzieningen voor milieuverplichtingen": { + "Toevoeging": { + "account_number": "6370", + "account_type": "Depreciation" + }, + "Besteding en terugneming (-)": { + "account_number": "6371", + "account_type": "Depreciation" + }, + "account_number": "637", + "account_type": "Depreciation" + }, + "Voorzieningen voor terug te betalen subsidies en legaten en voor schenkingen met terugnemingsrecht": { + "Toevoeging": { + "account_number": "6380", + "account_type": "Expense Account" + }, + "Besteding en terugneming (-)": { + "account_number": "6381", + "account_type": "Expense Account" + }, + "account_number": "638", + "account_type": "Expense Account" + }, + "Voorzieningen voor andere risico's en kosten": { + "Toevoeging": { + "account_number": "6390", + "account_type": "Expense Account" + }, + "Besteding en terugneming (-)": { + "account_number": "6391", + "account_type": "Expense Account" + }, + "account_number": "639", + "account_type": "Expense Account" + }, + "account_number": "63", + "account_type": "Expense Account" + }, + "Andere bedrijfskosten": { + "Bedrijfsbelastingen": { + "account_number": "640", + "account_type": "Expense Account" + }, + "Minderwaarden op de courante realisatie van materiële vaste activa": { + "account_number": "641", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van handelsvorderingen": { + "account_number": "642", + "account_type": "Expense Account" + }, + "Schenkingen": { + "account_number": "643", + "account_type": "Expense Account" + }, + "Diverse bedrijfskosten (644 tot 648)": { + "account_number": "644", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde bedrijfskosten (-)": { + "account_number": "649", + "account_type": "Expense Account" + }, + "account_number": "64", + "account_type": "Expense Account" + }, + "Financiële kosten": { + "Kosten van schulden": { + "Rente, commissies en kosten verbonden aan schulden": { + "account_number": "6500", + "account_type": "Expense Account" + }, + "Afschrijving van kosten bij uitgifte van leningen en van disagio": { + "account_number": "6501", + "account_type": "Expense Account" + }, + "Geactiveerde intercalaire interesten (-)": { + "account_number": "6502", + "account_type": "Expense Account" + }, + "account_number": "650", + "account_type": "Expense Account" + }, + "Waardeverminderingen op vlottende activa": { + "Toevoeging": { + "account_number": "6510", + "account_type": "Expense Account" + }, + "Terugneming (-)": { + "account_number": "6511", + "account_type": "Expense Account" + }, + "account_number": "651", + "account_type": "Expense Account" + }, + "Minderwaarden op verwezenlijking van vlottende activa": { + "account_number": "652", + "account_type": "Expense Account" + }, + "Discontokosten op vorderingen": { + "account_number": "653", + "account_type": "Expense Account" + }, + "Wisselresultaten": { + "account_number": "654", + "account_type": "Expense Account" + }, + "Resultaten uit de omrekening van vreemde valuta": { + "account_number": "655", + "account_type": "Expense Account" + }, + "Voorzieningen van financiële aard": { + "Toevoeging": { + "account_number": "6560", + "account_type": "Expense Account" + }, + "Besteding en terugneming (-)": { + "account_number": "6561", + "account_type": "Expense Account" + }, + "account_number": "656", + "account_type": "Expense Account" + }, + "Diverse financiële kosten (657 tot 658)": { + "account_number": "657", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde financiële kosten (-)": { + "account_number": "659", + "account_type": "Expense Account" + }, + "account_number": "65", + "account_type": "Expense Account" + }, + "Niet-recurrente bedrijfs- of financiële kosten": { + "Niet-recurrente afschrijvingen en waardeverminderingen (toevoeging)": { + "op oprichtingskosten": { + "account_number": "6600", + "account_type": "Expense Account" + }, + "op immateriële vaste activa": { + "account_number": "6601", + "account_type": "Expense Account" + }, + "op materiële vaste activa": { + "account_number": "6602", + "account_type": "Expense Account" + }, + "account_number": "660", + "account_type": "Expense Account" + }, + "Waardeverminderingen op vaste financiële activa (toevoeging)": { + "account_number": "661", + "account_type": "Expense Account" + }, + "Voorzieningen voor niet-recurrente risico's en kosten": { + "Voorzieningen voor niet-recurrente bedrijfsrisico's en -kosten": { + "Toevoeging": { + "account_number": "66200", + "account_type": "Expense Account" + }, + "Bestedingen (-)": { + "account_number": "66201", + "account_type": "Expense Account" + }, + "account_number": "6620", + "account_type": "Expense Account" + }, + "Voorzieningen voor niet-recurrente financiële risico's en -kosten": { + "Toevoeging": { + "account_number": "66210", + "account_type": "Expense Account" + }, + "Besteding (-)": { + "account_number": "66211", + "account_type": "Expense Account" + }, + "account_number": "6621", + "account_type": "Expense Account" + }, + "account_number": "662", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van vaste activa": { + "Minderwaarden op de realisatie van immateriële en materiële vaste activa": { + "account_number": "6630", + "account_type": "Expense Account" + }, + "Minderwaarden op de realisatie van financiële vaste activa": { + "account_number": "6631", + "account_type": "Expense Account" + }, + "account_number": "663", + "account_type": "Expense Account" + }, + "Andere niet-recurrente bedrijfskosten (664 tot 667)": { + "account_number": "664", + "account_type": "Expense Account" + }, + "Andere niet-recurrente financiële kosten": { + "account_number": "668", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde niet-recurrente bedrijfskosten (-)": { + "account_number": "6690", + "account_type": "Expense Account" + }, + "Als herstructureringskosten geactiveerde niet-recurrente financiële kosten (-)": { + "account_number": "6691", + "account_type": "Expense Account" + }, + "account_number": "66", + "account_type": "Expense Account" + }, + "Belastingen": { + "Belgische belastingen op het resultaat van het boekjaar": { + "Verschuldigde of gestorte belastingen en voorheffingen": { + "account_number": "6700", + "account_type": "Expense Account" + }, + "Geactiveerde overschotten van betaalde belastingen en voorheffingen (-)": { + "account_number": "6701", + "account_type": "Expense Account" + }, + "Geraamde belastingen": { + "account_number": "6702", + "account_type": "Expense Account" + }, + "account_number": "670", + "account_type": "Expense Account" + }, + "Buitenlandse belastingen op het resultaat van vorige boekjaren": { + "account_number": "673", + "account_type": "Expense Account" + }, + "Verschuldigde of gestorte belastingsupplementen": { + "account_number": "6710", + "account_type": "Expense Account" + }, + "Geraamde belastingsupplementen": { + "account_number": "6711", + "account_type": "Expense Account" + }, + "Gevormde fiscale voorzieningen": { + "account_number": "6712", + "account_type": "Expense Account" + }, + "account_number": "67", + "account_type": "Expense Account" + }, + "Overboeking naar de uitgestelde belastingen en naar de belastingvrije reserves": { + "Overboeking naar de uitgestelde belastingen": { + "account_number": "680", + "account_type": "Expense Account" + }, + "Overboeking naar de belastingvrije reserves": { + "account_number": "689", + "account_type": "Expense Account" + }, + "account_number": "68", + "account_type": "Expense Account" + }, + "Resultaatverwerking": { + "Overgedragen negatief resultaat van het vorig boekjaar": { + "account_number": "690", + "account_type": "Expense Account" + }, + "Overboeking naar de bestemde fondsen en andere reserves": { + "account_number": "691", + "account_type": "Expense Account" + }, + "Over te dragen positief resultaat": { + "account_number": "692", + "account_type": "Expense Account" + }, + "account_number": "69", + "account_type": "Expense Account" + } + }, + "KLASSE 7 : OPBRENGSTEN": { + "root_type": "Income", + "Omzet": { + "Toegekende kortingen, ristorno's en rabatten (-)": { + "account_number": "708", + "account_type": "Income Account" + }, + "account_number": "70", + "account_type": "Income Account" + }, + "Wijziging in de voorraad en bestellingen in uitvoering": { + "In de voorraad goederen in bewerking": { + "account_number": "712", + "account_type": "Income Account" + }, + "In de voorraad gereed product": { + "account_number": "713", + "account_type": "Income Account" + }, + "In de voorraad onroerende goederen bestemd voor verkoop": { + "account_number": "715", + "account_type": "Income Account" + }, + "In de bestellingen in uitvoering": { + "Aanschaffingswaarde": { + "account_number": "7170", + "account_type": "Income Account" + }, + "Toegerekende winst": { + "account_number": "7171", + "account_type": "Income Account" + }, + "account_number": "717", + "account_type": "Income Account" + }, + "account_number": "71", + "account_type": "Income Account" + }, + "Geproduceerde vaste activa": { + "account_number": "72", + "account_type": "Income Account" + }, + "Lidgeld, schenkingen, legaten en subsidies": { + "Lidgelden": { + "account_number": "730", + "account_type": "Income Account" + }, + "Schenkingen": { + "account_number": "731", + "account_type": "Income Account" + }, + "Legaten": { + "account_number": "732", + "account_type": "Income Account" + }, + "Subsidies": { + "account_number": "733", + "account_type": "Income Account" + }, + "account_number": "73", + "account_type": "Income Account" + }, + "Overige bedrijfsopbrengsten": { + "Meerwaarden op de courante realisatie van materiële vaste activa": { + "account_number": "741", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van handelsvorderingen": { + "account_number": "742", + "account_type": "Income Account" + }, + "Diverse bedrijfsopbrengsten (743 tot 749)": { + "account_number": "743", + "account_type": "Income Account" + }, + "account_number": "74", + "account_type": "Income Account" + }, + "Financiële opbrengsten": { + "Opbrengsten uit financiële vaste activa": { + "account_number": "750", + "account_type": "Income Account" + }, + "Opbrengsten uit vlottende activa": { + "account_number": "751", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van vlottende activa": { + "account_number": "752", + "account_type": "Income Account" + }, + "Wisselresultaten": { + "account_number": "754", + "account_type": "Income Account" + }, + "Resultaten uit de omrekening van vreemde valuta": { + "account_number": "755", + "account_type": "Income Account" + }, + "Diverse financiële opbrengsten (756 tot 759)": { + "account_number": "756", + "account_type": "Income Account" + }, + "account_number": "75", + "account_type": "Income Account" + }, + "Niet-recurrente bedrijfs- of financiële opbrengsten": { + "Terugneming van afschrijvingen en waardeverminderingen": { + "op immateriële vaste activa": { + "account_number": "7600", + "account_type": "Income Account" + }, + "op materiële vaste activa": { + "account_number": "7601", + "account_type": "Income Account" + }, + "account_number": "760", + "account_type": "Income Account" + }, + "Terugneming van waardeverminderingen op financiële vaste activa": { + "account_number": "761", + "account_type": "Income Account" + }, + "Terugneming van voorzieningen voor niet-recurrente risico's en kosten": { + "Terugneming van voorzieningen voor niet-recurrente bedrijfsrisico's en -kosten": { + "account_number": "7620", + "account_type": "Income Account" + }, + "Terugneming van voorzieningen voor niet-recurrente financiële risico's en -kosten": { + "account_number": "7621", + "account_type": "Income Account" + }, + "account_number": "762", + "account_type": "Income Account" + }, + "Meerwaarden op de realisatie van vaste activa": { + "Meerwaarde op de realisatie van immateriële en materiële vaste activa": { + "account_number": "7630", + "account_type": "Income Account" + }, + "Meerwaarde op de realisatie van financiële vaste activa": { + "account_number": "7631", + "account_type": "Income Account" + }, + "account_number": "763", + "account_type": "Income Account" + }, + "Andere niet-recurrente bedrijfsopbrengsten (764 tot 768)": { + "account_number": "764", + "account_type": "Income Account" + }, + "Andere niet-recurrente financiële opbrengsten": { + "account_number": "769", + "account_type": "Income Account" + }, + "account_number": "76", + "account_type": "Income Account" + }, + "Regularisering van belastingen": { + "account_number": "77", + "account_type": "Income Account" + }, + "Onttrekking aan de belastingvrije reserves en uitgestelde belastingen": { + "Onttrekking aan de uitgestelde belastingen": { + "account_number": "780", + "account_type": "Income Account" + }, + "Onttrekking aan de belastingvrije reserves": { + "account_number": "789", + "account_type": "Income Account" + }, + "account_number": "78", + "account_type": "Income Account" + }, + "Resultaatverwerking": { + "Overgedragen positief resultaat van het vorige boekjaar": { + "account_number": "790", + "account_type": "Income Account" + }, + "Andere reserves": { + "account_number": "791", + "account_type": "Income Account" + }, + "Over te dragen negatief resultaat": { + "account_number": "792", + "account_type": "Income Account" + }, + "account_number": "79", + "account_type": "Income Account" + } + } + } +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_associations_fondations.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_associations_fondations.json new file mode 100644 index 00000000000..5191aa32de9 --- /dev/null +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_associations_fondations.json @@ -0,0 +1,1478 @@ +{ + "country_code": "be", + "name": "Belgique - Plan comptable minimum normalisé (PCMN) des associations et fondations", + "tree": { + "CLASSE 1 : FONDS ASSOCIATIFS ET DE LA FONDATION": { + "root_type": "Equity", + "Fonds de l'association ou de la fondation": { + "account_number": "10", + "account_type": "Equity" + }, + "Plus-values de réévaluation": { + "Plus-values de réévaluation sur immobilisations incorporelles": { + "account_number": "120", + "account_type": "Equity" + }, + "Plus-values de réévaluation sur immobilisations corporelles": { + "account_number": "121", + "account_type": "Equity" + }, + "Plus-values de réévaluation sur immobilisations financières": { + "account_number": "122", + "account_type": "Equity" + }, + "Reprises de réductions de valeur sur placements de trésorerie": { + "account_number": "124", + "account_type": "Equity" + }, + "account_number": "12", + "account_type": "Equity" + }, + "Fonds affectés et autres réserves": { + "Fonds affectés pour investissements": { + "account_number": "130", + "account_type": "Equity" + }, + "Fonds affectés pour passif social": { + "account_number": "131", + "account_type": "Equity" + }, + "Réserves immunisées": { + "account_number": "132", + "account_type": "Equity" + }, + "Autres fonds affectés et autres réserves": { + "account_number": "139", + "account_type": "Equity" + }, + "account_number": "13", + "account_type": "Equity" + }, + "Résultats reportés (+)(-)": { + "account_number": "14", + "account_type": "Equity" + }, + "Subsides en capital": { + "account_number": "15", + "account_type": "Equity" + } + }, + "CLASSE 1 : PROVISIONS ET DETTES À PLUS D'UN AN": { + "root_type": "Liability", + "Provisions et impôts différés": { + "Provisions pour pensions et obligations similaires": { + "account_number": "160", + "account_type": "Liability" + }, + "Provisions pour charges fiscales": { + "account_number": "161", + "account_type": "Liability" + }, + "Provisions pour grosses réparations et gros entretien": { + "account_number": "162", + "account_type": "Liability" + }, + "Provisions pour obligations environnementales": { + "account_number": "163", + "account_type": "Liability" + }, + "Provisions pour remboursement de subsides, legs et dons avec droit de reprise": { + "account_number": "167", + "account_type": "Liability" + }, + "Impôts différés": { + "account_number": "168", + "account_type": "Liability" + }, + "account_number": "16", + "account_type": "Liability" + }, + "Dettes à plus d'un an": { + "Emprunts subordonnés": { + "account_number": "170", + "account_type": "Liability" + }, + "Emprunts obligataires non subordonnés": { + "account_number": "171", + "account_type": "Liability" + }, + "Dettes de location-financement et dettes assimilées": { + "account_number": "172", + "account_type": "Liability" + }, + "Établissements de crédit": { + "Dettes en compte": { + "account_number": "1730", + "account_type": "Liability" + }, + "Promesses": { + "account_number": "1731", + "account_type": "Liability" + }, + "Crédits d'acceptation": { + "account_number": "1732", + "account_type": "Liability" + }, + "account_number": "173", + "account_type": "Liability" + }, + "Autres emprunts": { + "account_number": "174", + "account_type": "Liability" + }, + "Dettes commerciales": { + "Fournisseurs": { + "account_number": "1750", + "account_type": "Liability" + }, + "Effets à payer": { + "account_number": "1751", + "account_type": "Liability" + }, + "account_number": "175", + "account_type": "Liability" + }, + "Acomptes sur commandes": { + "account_number": "176", + "account_type": "Liability" + }, + "Cautionnements en numéraire": { + "account_number": "178", + "account_type": "Liability" + }, + "Autres dettes": { + "Productives d'intérêts": { + "account_number": "1790", + "account_type": "Liability" + }, + "Non productives d'intérêts ou assorties d'un intérêt anormalement faible": { + "account_number": "1791", + "account_type": "Liability" + }, + "account_number": "179", + "account_type": "Liability" + }, + "account_number": "17", + "account_type": "Liability" + } + }, + "CLASSE 2 : FRAIS D'ÉTABLISSEMENT, ACTIFS IMMOBILISÉS ET CRÉANCES À PLUS D'UN AN": { + "root_type": "Asset", + "Frais d'établissement": { + "Frais de constitution": { + "account_number": "200", + "account_type": "Fixed Asset" + }, + "Frais d'émission d'emprunts": { + "account_number": "201", + "account_type": "Fixed Asset" + }, + "Autres frais d'établissement": { + "account_number": "202", + "account_type": "Fixed Asset" + }, + "Frais de restructuration": { + "account_number": "204", + "account_type": "Fixed Asset" + }, + "account_number": "20", + "account_type": "Fixed Asset" + }, + "Immobilisations incorporelles": { + "Frais de recherche et de développement": { + "account_number": "210", + "account_type": "Fixed Asset" + }, + "Concessions, brevets, licences, savoir-faire, marques et droits similaires": { + "account_number": "211", + "account_type": "Fixed Asset" + }, + "Goodwill": { + "account_number": "212", + "account_type": "Fixed Asset" + }, + "Acomptes versés": { + "account_number": "213", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "219", + "account_type": "Accumulated Depreciation" + }, + "account_number": "21", + "account_type": "Fixed Asset" + }, + "Terrains et constructions": { + "Terrains": { + "account_number": "220", + "account_type": "Fixed Asset" + }, + "Constructions": { + "account_number": "221", + "account_type": "Fixed Asset" + }, + "Terrains bâtis": { + "account_number": "222", + "account_type": "Fixed Asset" + }, + "Autres droits réels sur des immeubles": { + "account_number": "223", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "229", + "account_type": "Accumulated Depreciation" + }, + "account_number": "22", + "account_type": "Fixed Asset" + }, + "Installations, machines et outillage": { + "account_number": "23", + "account_type": "Fixed Asset" + }, + "Mobilier et matériel roulant": { + "account_number": "24", + "account_type": "Fixed Asset" + }, + "Immobilisations détenues en location-financement et droits similaires": { + "Terrains et constructions": { + "account_number": "250", + "account_type": "Fixed Asset" + }, + "Installations, machines et outillage": { + "account_number": "251", + "account_type": "Fixed Asset" + }, + "Mobilier et matériel roulant": { + "account_number": "252", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "259", + "account_type": "Accumulated Depreciation" + }, + "account_number": "25", + "account_type": "Fixed Asset" + }, + "Autres immobilisations corporelles": { + "account_number": "26", + "account_type": "Fixed Asset" + }, + "Immobilisations corporelles en cours et acomptes versés": { + "account_number": "27", + "account_type": "Fixed Asset" + }, + "Immobilisations financières": { + "Participations dans des sociétés liées": { + "Valeur d'acquisition": { + "account_number": "2800", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2801", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2808", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2809", + "account_type": "Fixed Asset" + }, + "account_number": "280", + "account_type": "Fixed Asset" + }, + "Créances sur des entités liées": { + "Créances en compte": { + "account_number": "2810", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2811", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2812", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2817", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2819", + "account_type": "Fixed Asset" + }, + "account_number": "281", + "account_type": "Fixed Asset" + }, + "Participations dans des sociétés avec lesquelles il existe un lien de participation": { + "Valeur d'acquisition": { + "account_number": "2820", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2821", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2828", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2829", + "account_type": "Fixed Asset" + }, + "account_number": "282", + "account_type": "Fixed Asset" + }, + "Créances sur des sociétés avec lesquelles il existe un lien de participation": { + "Créances en compte": { + "account_number": "2830", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2831", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2832", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2837", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2839", + "account_type": "Fixed Asset" + }, + "account_number": "283", + "account_type": "Fixed Asset" + }, + "Autres actions et parts": { + "Valeur d'acquisition": { + "account_number": "2840", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2841", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2848", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2849", + "account_type": "Fixed Asset" + }, + "account_number": "284", + "account_type": "Fixed Asset" + }, + "Autres créances": { + "Créances en compte": { + "account_number": "2850", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2851", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2852", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2857", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2859", + "account_type": "Fixed Asset" + }, + "account_number": "285", + "account_type": "Fixed Asset" + }, + "Cautionnements versés en numéraire": { + "account_number": "288", + "account_type": "Fixed Asset" + }, + "account_number": "28", + "account_type": "Fixed Asset" + }, + "Créances à plus d'un an": { + "Créances commerciales": { + "Clients": { + "account_number": "2900" + }, + "Effets à recevoir": { + "account_number": "2901" + }, + "Acomptes versés": { + "account_number": "2906" + }, + "Créances douteuses": { + "account_number": "2907" + }, + "Réductions de valeur actées (-)": { + "account_number": "2909" + }, + "account_number": "290" + }, + "Autres créances": { + "Créances en compte": { + "account_number": "2910" + }, + "Effets à recevoir": { + "account_number": "2911" + }, + "Subsides à recevoir": { + "account_number": "2912" + }, + "Créances non productives d'intérêts ou assorties d'un intérêt anormalement faible": { + "account_number": "2915" + }, + "Créances douteuses": { + "account_number": "2916" + }, + "Réductions de valeur actées (-)": { + "account_number": "2919" + }, + "account_number": "291" + }, + "account_number": "29" + } + }, + "CLASSE 3 : STOCKS ET COMMANDES EN COURS D'EXÉCUTION": { + "root_type": "Asset", + "Matières premières": { + "Valeur d'acquisition": { + "account_number": "300" + }, + "Réductions de valeur actées (-)": { + "account_number": "309" + }, + "account_number": "30" + }, + "Fournitures": { + "Valeur d'acquisition": { + "account_number": "310" + }, + "Réductions de valeur actées (-)": { + "account_number": "319" + }, + "account_number": "31" + }, + "En-cours de fabrication": { + "Valeur d'acquisition": { + "account_number": "320" + }, + "Réductions de valeur actées (-)": { + "account_number": "329" + }, + "account_number": "32" + }, + "Produits finis": { + "Valeur d'acquisition": { + "account_number": "330" + }, + "Réductions de valeur actées (-)": { + "account_number": "339" + }, + "account_number": "33" + }, + "Marchandises": { + "Valeur d'acquisition": { + "account_number": "340", + "account_type": "Stock" + }, + "Réductions de valeur actées (-)": { + "account_number": "349" + }, + "account_number": "34", + "account_type": "Stock" + }, + "Immeubles destinés à la vente": { + "Valeur d'acquisition": { + "account_number": "350" + }, + "Réductions de valeur actées (-)": { + "account_number": "359" + }, + "account_number": "35" + }, + "Acomptes versés sur achats pour stocks": { + "Acomptes versés": { + "account_number": "360" + }, + "Réductions de valeur actées (-)": { + "account_number": "369" + }, + "account_number": "36" + }, + "Commandes en cours d'exécution": { + "Valeur d'acquisition": { + "account_number": "370" + }, + "Bénéfice pris en compte": { + "account_number": "371" + }, + "Réductions de valeur actées (-)": { + "account_number": "379" + }, + "account_number": "37" + }, + "Stock livré non facturé": { + "account_type": "Stock Delivered But Not Billed" + } + }, + "CLASSE 4 : CRÉANCES À UN AN AU PLUS": { + "root_type": "Asset", + "Créances commerciales": { + "Clients": { + "account_number": "400", + "account_type": "Receivable" + }, + "Effets à recevoir": { + "account_number": "401", + "account_type": "Receivable" + }, + "Produits à recevoir": { + "account_number": "404", + "account_type": "Receivable" + }, + "Acomptes versés": { + "account_number": "406" + }, + "Créances douteuses": { + "account_number": "407", + "account_type": "Receivable" + }, + "Réductions de valeur actées (-)": { + "account_number": "409" + }, + "account_number": "40", + "account_type": "Receivable" + }, + "Autres créances": { + "TVA à récupérer": { + "account_number": "411", + "account_type": "Tax" + }, + "Impôts et précomptes à récupérer": { + "Autres impôts et taxes belges (4125 à 4127)": { + "account_number": "4125" + }, + "Impôts et taxes étrangers": { + "account_number": "4128" + }, + "account_number": "412" + }, + "Subsides à recevoir": { + "account_number": "413" + }, + "Produits à recevoir": { + "account_number": "414" + }, + "Créances non productives d'intérêts ou assorties d'un intérêt anormalement faible": { + "account_number": "415" + }, + "Créances diverses": { + "account_number": "416" + }, + "Créances douteuses": { + "account_number": "417" + }, + "Cautionnements versés en numéraire": { + "account_number": "418" + }, + "Réductions de valeur actées (-)": { + "account_number": "419" + }, + "account_number": "41" + } + }, + "CLASSE 4 : DETTES À UN AN AU PLUS": { + "root_type": "Liability", + "Dettes à plus d'un an échéant dans l'année": { + "account_number": "42" + }, + "Dettes financières": { + "Établissements de crédit - Emprunts en compte à terme fixe": { + "account_number": "430" + }, + "Établissements de crédit - Promesses": { + "account_number": "431" + }, + "Établissements de crédit - Crédits d'acceptation": { + "account_number": "432" + }, + "Établissements de crédit - Dettes en compte courant": { + "account_number": "433" + }, + "Autres emprunts": { + "account_number": "439" + }, + "account_number": "43" + }, + "Dettes commerciales": { + "Fournisseurs": { + "account_number": "440", + "account_type": "Payable" + }, + "Effets à payer": { + "account_number": "441", + "account_type": "Payable" + }, + "Factures à recevoir": { + "account_number": "444", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "44", + "account_type": "Payable" + }, + "Dettes fiscales, salariales et sociales": { + "Dettes fiscales estimées": { + "Autres impôts et taxes belges (4505 à 4507)": { + "account_number": "4505" + }, + "Impôts et taxes étrangers": { + "account_number": "4508" + }, + "account_number": "450" + }, + "TVA à payer": { + "account_number": "451", + "account_type": "Tax" + }, + "Impôts et taxes à payer": { + "Autres impôts et taxes belges (4525 à 4527)": { + "account_number": "4525" + }, + "Impôts et taxes étrangers": { + "account_number": "4528" + }, + "account_number": "452" + }, + "Précomptes retenus": { + "account_number": "453" + }, + "Office national de la Sécurité sociale": { + "account_number": "454" + }, + "Rémunérations": { + "account_number": "455" + }, + "Pécules de vacances": { + "account_number": "456" + }, + "Autres dettes sociales": { + "account_number": "459" + }, + "account_number": "45" + }, + "Comptes de régularisation et d'attente": { + "Charges à reporter": { + "account_number": "490" + }, + "Produits acquis": { + "account_number": "491" + }, + "Charges à imputer": { + "account_number": "492" + }, + "Produits à reporter": { + "account_number": "493" + }, + "Comptes d'attente": { + "account_number": "499" + }, + "account_number": "49" + }, + "Obligations et coupons échus": { + "account_number": "480" + }, + "Subsides à rembourser": { + "account_number": "483" + }, + "Cautionnements reçus en numéraire": { + "account_number": "488" + }, + "Autres dettes diverses": { + "Productives d'intérêts": { + "account_number": "4890" + }, + "Non productives d'intérêts ou assorties d'un intérêt anormalement faible": { + "account_number": "4891" + }, + "account_number": "489" + } + }, + "CLASSE 5 : PLACEMENTS DE TRÉSORERIE ET VALEURS DISPONIBLES": { + "root_type": "Asset", + "Placements de trésorerie autres que actions et parts, titres à revenu fixe et dépôts à terme": { + "Valeur d'acquisition": { + "account_number": "500" + }, + "Réductions de valeur actées (-)": { + "account_number": "509" + }, + "account_number": "50" + }, + "Actions et parts": { + "Valeur d'acquisition": { + "account_number": "510" + }, + "Montants non appelés (-)": { + "account_number": "511" + }, + "Réductions de valeur actées (-)": { + "account_number": "519" + }, + "account_number": "51" + }, + "Titres à revenu fixe": { + "Valeur d'acquisition": { + "account_number": "520" + }, + "Réductions de valeur actées (-)": { + "account_number": "529" + }, + "account_number": "52" + }, + "Dépôts à terme": { + "De plus d'un an": { + "account_number": "530" + }, + "De plus d'un mois et à un an au plus": { + "account_number": "531" + }, + "D'un mois au plus": { + "account_number": "532" + }, + "Réductions de valeur actées (-)": { + "account_number": "539" + }, + "account_number": "53" + }, + "Valeurs échues à l'encaissement": { + "account_number": "54" + }, + "Établissements de crédit": { + "Banque": { + "account_number": "5500", + "account_type": "Bank" + }, + "account_number": "55", + "account_type": "Bank" + }, + "Caisses": { + "Caisses-espèces (570 à 577)": { + "account_number": "570", + "account_type": "Cash" + }, + "Caisses-timbres": { + "account_number": "578", + "account_type": "Cash" + }, + "account_number": "57", + "account_type": "Cash" + }, + "Virements internes": { + "account_number": "58", + "account_type": "Temporary" + } + }, + "CLASSE 6 : CHARGES": { + "root_type": "Expense", + "Approvisionnements et marchandises": { + "Achats de matières premières": { + "account_number": "600", + "account_type": "Expense Account" + }, + "Achats de fournitures": { + "account_number": "601", + "account_type": "Expense Account" + }, + "Achats de services, travaux et études": { + "account_number": "602", + "account_type": "Expense Account" + }, + "Sous-traitances générales": { + "account_number": "603", + "account_type": "Expense Account" + }, + "Achats de marchandises": { + "account_number": "604", + "account_type": "Cost of Goods Sold" + }, + "Achats d'immeubles destinés à la vente": { + "account_number": "605", + "account_type": "Expense Account" + }, + "Remises, ristournes et rabais obtenus (-)": { + "account_number": "608", + "account_type": "Expense Account" + }, + "Variations des stocks": { + "de matières premières": { + "account_number": "6090", + "account_type": "Stock Adjustment" + }, + "de fournitures": { + "account_number": "6091", + "account_type": "Stock Adjustment" + }, + "de marchandises": { + "account_number": "6094", + "account_type": "Stock Adjustment" + }, + "d'immeubles destinés à la vente": { + "account_number": "6095", + "account_type": "Stock Adjustment" + }, + "account_number": "609", + "account_type": "Stock Adjustment" + }, + "account_number": "60", + "account_type": "Expense Account" + }, + "Services et biens divers": { + "Personnel intérimaire et personnes mises à la disposition de l'association ou de la fondation": { + "account_number": "617", + "account_type": "Expense Account" + }, + "Rémunérations et pensions des administrateurs, hors contrat de travail": { + "account_number": "618", + "account_type": "Expense Account" + }, + "Frais accessoires d'achat inclus dans la valeur des stocks": { + "account_type": "Expenses Included In Valuation" + }, + "account_number": "61", + "account_type": "Expense Account" + }, + "Rémunérations, charges sociales et pensions": { + "Rémunérations et avantages sociaux directs": { + "Administrateurs ou gérants": { + "account_number": "6200", + "account_type": "Expense Account" + }, + "Personnel de direction": { + "account_number": "6201", + "account_type": "Expense Account" + }, + "Employés": { + "account_number": "6202", + "account_type": "Expense Account" + }, + "Ouvriers": { + "account_number": "6203", + "account_type": "Expense Account" + }, + "Autres membres du personnel": { + "account_number": "6204", + "account_type": "Expense Account" + }, + "account_number": "620", + "account_type": "Expense Account" + }, + "Cotisations patronales pour assurances sociales": { + "account_number": "621", + "account_type": "Expense Account" + }, + "Primes patronales pour assurances extra-légales": { + "account_number": "622", + "account_type": "Expense Account" + }, + "Autres frais du personnel": { + "account_number": "623", + "account_type": "Expense Account" + }, + "Pensions de retraite et de survie": { + "Administrateurs ou gérants": { + "account_number": "6240", + "account_type": "Expense Account" + }, + "Personnel": { + "account_number": "6241", + "account_type": "Expense Account" + }, + "account_number": "624", + "account_type": "Expense Account" + }, + "account_number": "62", + "account_type": "Expense Account" + }, + "Amortissements, réductions de valeur et provisions pour risques et charges": { + "Dotations aux amortissements et aux réductions de valeur sur immobilisations": { + "Dotations aux amortissements sur frais d'établissement": { + "account_number": "6300", + "account_type": "Depreciation" + }, + "Dotation aux amortissements sur immobilisations incorporelles": { + "account_number": "6301", + "account_type": "Depreciation" + }, + "Dotation aux amortissements sur immobilisations corporelles": { + "account_number": "6302", + "account_type": "Depreciation" + }, + "Dotation aux réductions de valeur sur immobilisations incorporelles": { + "account_number": "6308", + "account_type": "Depreciation" + }, + "Dotation aux réductions de valeur sur immobilisations corporelles": { + "account_number": "6309", + "account_type": "Depreciation" + }, + "account_number": "630", + "account_type": "Depreciation" + }, + "Réductions de valeur sur stocks": { + "Dotations": { + "account_number": "6310", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6311", + "account_type": "Depreciation" + }, + "account_number": "631", + "account_type": "Depreciation" + }, + "Réductions de valeur sur commandes en cours d'exécution": { + "Dotations": { + "account_number": "6320", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6321", + "account_type": "Depreciation" + }, + "account_number": "632", + "account_type": "Depreciation" + }, + "Réductions de valeur sur créances commerciales à plus d'un an": { + "Dotations": { + "account_number": "6330", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6331", + "account_type": "Depreciation" + }, + "account_number": "633", + "account_type": "Depreciation" + }, + "Réductions de valeur sur créances à un an au plus": { + "Dotations": { + "account_number": "6340", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6341", + "account_type": "Depreciation" + }, + "account_number": "634", + "account_type": "Depreciation" + }, + "Provisions pour pensions et obligations similaires": { + "Dotations": { + "account_number": "6350", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6351", + "account_type": "Depreciation" + }, + "account_number": "635", + "account_type": "Depreciation" + }, + "Provisions pour grosses réparations et gros entretien": { + "Dotations": { + "account_number": "6360", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6361", + "account_type": "Depreciation" + }, + "account_number": "636", + "account_type": "Depreciation" + }, + "Provisions pour obligations environnementales": { + "Dotations": { + "account_number": "6370", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6371", + "account_type": "Depreciation" + }, + "account_number": "637", + "account_type": "Depreciation" + }, + "Provisions pour subsides et legs à rembourser et pour dons avec droit de reprise": { + "Dotations": { + "account_number": "6380", + "account_type": "Expense Account" + }, + "Utilisations et reprises (-)": { + "account_number": "6381", + "account_type": "Expense Account" + }, + "account_number": "638", + "account_type": "Expense Account" + }, + "Provisions pour autres risques et charges": { + "Dotations": { + "account_number": "6390", + "account_type": "Expense Account" + }, + "Utilisations et reprises (-)": { + "account_number": "6391", + "account_type": "Expense Account" + }, + "account_number": "639", + "account_type": "Expense Account" + }, + "account_number": "63", + "account_type": "Expense Account" + }, + "Autres charges d'exploitation": { + "Charges fiscales": { + "account_number": "640", + "account_type": "Expense Account" + }, + "Moins-values sur réalisations courantes d'immobilisations corporelles": { + "account_number": "641", + "account_type": "Expense Account" + }, + "Moins-values sur réalisations de créances commerciales": { + "account_number": "642", + "account_type": "Expense Account" + }, + "Dons": { + "account_number": "643", + "account_type": "Expense Account" + }, + "Charges d'exploitations diverses (644 à 648)": { + "account_number": "644", + "account_type": "Expense Account" + }, + "Charges d'exploitation portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "649", + "account_type": "Expense Account" + }, + "account_number": "64", + "account_type": "Expense Account" + }, + "Charges financières": { + "Charges des dettes": { + "Intérêts, commissions et frais afférents aux dettes": { + "account_number": "6500", + "account_type": "Expense Account" + }, + "Amortissements frais d'émission d'emprunts et des primes de remboursement": { + "account_number": "6501", + "account_type": "Expense Account" + }, + "Intérêts intercalaires portés à l'actif (-)": { + "account_number": "6502", + "account_type": "Expense Account" + }, + "account_number": "650", + "account_type": "Expense Account" + }, + "Réductions de valeur sur actifs circulants": { + "Dotations": { + "account_number": "6510", + "account_type": "Expense Account" + }, + "Reprises (-)": { + "account_number": "6511", + "account_type": "Expense Account" + }, + "account_number": "651", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'actifs circulants": { + "account_number": "652", + "account_type": "Expense Account" + }, + "Charges d'escompte de créances": { + "account_number": "653", + "account_type": "Expense Account" + }, + "Différences de change": { + "account_number": "654", + "account_type": "Expense Account" + }, + "Écarts de conversion des devises": { + "account_number": "655", + "account_type": "Expense Account" + }, + "Provisions à caractère financier": { + "Dotations": { + "account_number": "6560", + "account_type": "Expense Account" + }, + "Utilisations et reprises (-)": { + "account_number": "6561", + "account_type": "Expense Account" + }, + "account_number": "656", + "account_type": "Expense Account" + }, + "Charges financières diverses (657 à 658)": { + "account_number": "657", + "account_type": "Expense Account" + }, + "Charges financières portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "659", + "account_type": "Expense Account" + }, + "account_number": "65", + "account_type": "Expense Account" + }, + "Charges d'exploitation ou financières non récurrentes": { + "Amortissements et réductions de valeur non récurrents (dotations)": { + "sur frais d'établissement": { + "account_number": "6600", + "account_type": "Expense Account" + }, + "sur immobilisations incorporelles": { + "account_number": "6601", + "account_type": "Expense Account" + }, + "sur immobilisations corporelles": { + "account_number": "6602", + "account_type": "Expense Account" + }, + "account_number": "660", + "account_type": "Expense Account" + }, + "Réduction de valeur sur immobilisations financières (dotation)": { + "account_number": "661", + "account_type": "Expense Account" + }, + "Provisions pour risques et charges non récurrents": { + "Provisions pour risques et charges d'exploitation non récurrents": { + "Dotations": { + "account_number": "66200", + "account_type": "Expense Account" + }, + "Utilisations (-)": { + "account_number": "66201", + "account_type": "Expense Account" + }, + "account_number": "6620", + "account_type": "Expense Account" + }, + "Provisions pour risques et charges financiers non récurrents": { + "Dotations": { + "account_number": "66210", + "account_type": "Expense Account" + }, + "Utilisations (-)": { + "account_number": "66211", + "account_type": "Expense Account" + }, + "account_number": "6621", + "account_type": "Expense Account" + }, + "account_number": "662", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'actifs immobilisés": { + "Moins-values sur réalisation d'immobilisations incorporelles et corporelles": { + "account_number": "6630", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'immobilisations financières": { + "account_number": "6631", + "account_type": "Expense Account" + }, + "account_number": "663", + "account_type": "Expense Account" + }, + "Autres charges d'exploitation non récurrentes (664 à 667)": { + "account_number": "664", + "account_type": "Expense Account" + }, + "Autres charges financières non récurrentes": { + "account_number": "668", + "account_type": "Expense Account" + }, + "Charges d'exploitation portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "6690", + "account_type": "Expense Account" + }, + "Charges financières non récurrentes portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "6691", + "account_type": "Expense Account" + }, + "account_number": "66", + "account_type": "Expense Account" + }, + "Impôts": { + "Impôts belges sur le résultat de l'exercice": { + "Impôts et précomptes dus ou versés": { + "account_number": "6700", + "account_type": "Expense Account" + }, + "Excédent de versements d'impôts et de précomptes porté à l'actif (-)": { + "account_number": "6701", + "account_type": "Expense Account" + }, + "Charges fiscales estimées": { + "account_number": "6702", + "account_type": "Expense Account" + }, + "account_number": "670", + "account_type": "Expense Account" + }, + "Impôts belges sur le résultat d'exercices antérieurs": { + "account_number": "673", + "account_type": "Expense Account" + }, + "Suppléments d'impôts dus ou versés": { + "account_number": "6710", + "account_type": "Expense Account" + }, + "Suppléments d'impôts estimés": { + "account_number": "6711", + "account_type": "Expense Account" + }, + "Provisions fiscales constituées": { + "account_number": "6712", + "account_type": "Expense Account" + }, + "account_number": "67", + "account_type": "Expense Account" + }, + "Transferts aux impôts différés et aux réserves immunisées": { + "Transferts aux impôts différés": { + "account_number": "680", + "account_type": "Expense Account" + }, + "Transferts aux réserves immunisées": { + "account_number": "689", + "account_type": "Expense Account" + }, + "account_number": "68", + "account_type": "Expense Account" + }, + "Affectations et prélèvements": { + "Résultat négatif de l'exercice antérieur reporté": { + "account_number": "690", + "account_type": "Expense Account" + }, + "Transfert aux fonds affectés et autres réserves": { + "account_number": "691", + "account_type": "Expense Account" + }, + "Résultat positif à reporter": { + "account_number": "692", + "account_type": "Expense Account" + }, + "account_number": "69", + "account_type": "Expense Account" + } + }, + "CLASSE 7 : PRODUITS": { + "root_type": "Income", + "Chiffre d'affaires": { + "Remises, ristournes et rabais accordés (-)": { + "account_number": "708", + "account_type": "Income Account" + }, + "account_number": "70", + "account_type": "Income Account" + }, + "Variation des stocks et des commandes en cours d'exécution": { + "Des en-cours de fabrication": { + "account_number": "712", + "account_type": "Income Account" + }, + "Des produits finis": { + "account_number": "713", + "account_type": "Income Account" + }, + "Des immeubles construits destinés à la vente": { + "account_number": "715", + "account_type": "Income Account" + }, + "Des commandes en cours d'exécution": { + "Valeur d'acquisition": { + "account_number": "7170", + "account_type": "Income Account" + }, + "Bénéfice pris en compte": { + "account_number": "7171", + "account_type": "Income Account" + }, + "account_number": "717", + "account_type": "Income Account" + }, + "account_number": "71", + "account_type": "Income Account" + }, + "Production immobilisée": { + "account_number": "72", + "account_type": "Income Account" + }, + "Cotisations, dons, legs et subsides": { + "Cotisations": { + "account_number": "730", + "account_type": "Income Account" + }, + "Dons": { + "account_number": "731", + "account_type": "Income Account" + }, + "Legs": { + "account_number": "732", + "account_type": "Income Account" + }, + "Subsides": { + "account_number": "733", + "account_type": "Income Account" + }, + "account_number": "73", + "account_type": "Income Account" + }, + "Autres produits d'exploitation": { + "Plus-values sur réalisations courantes d'immobilisations corporelles": { + "account_number": "741", + "account_type": "Income Account" + }, + "Plus-values sur réalisation de créances commerciales": { + "account_number": "742", + "account_type": "Income Account" + }, + "Produits d'exploitation divers (743 à 749)": { + "account_number": "743", + "account_type": "Income Account" + }, + "account_number": "74", + "account_type": "Income Account" + }, + "Produits financiers": { + "Produits des immobilisations financières": { + "account_number": "750", + "account_type": "Income Account" + }, + "Produits des actifs circulants": { + "account_number": "751", + "account_type": "Income Account" + }, + "Plus-values sur la réalisation d'actifs circulants": { + "account_number": "752", + "account_type": "Income Account" + }, + "Différences de change": { + "account_number": "754", + "account_type": "Income Account" + }, + "Écarts de conversion des devises": { + "account_number": "755", + "account_type": "Income Account" + }, + "Produits financiers divers (756 à 759)": { + "account_number": "756", + "account_type": "Income Account" + }, + "account_number": "75", + "account_type": "Income Account" + }, + "Produits d'exploitation ou financiers non récurrents": { + "Reprise d'amortissements et réductions de valeur": { + "sur immobilisations incorporelles": { + "account_number": "7600", + "account_type": "Income Account" + }, + "sur immobilisations corporelles": { + "account_number": "7601", + "account_type": "Income Account" + }, + "account_number": "760", + "account_type": "Income Account" + }, + "Reprises de réductions de valeur sur immobilisations financières": { + "account_number": "761", + "account_type": "Income Account" + }, + "Reprises de provisions pour risques et charges non récurrents": { + "Reprises de provisions pour risques et charges d'exploitation non récurrents": { + "account_number": "7620", + "account_type": "Income Account" + }, + "Reprises de provisions pour risques et charges financiers non récurrents": { + "account_number": "7621", + "account_type": "Income Account" + }, + "account_number": "762", + "account_type": "Income Account" + }, + "Plus-values sur réalisation d'actifs immobilisés": { + "Plus-values sur réalisation d'immobilisations incorporelles et corporelles": { + "account_number": "7630", + "account_type": "Income Account" + }, + "Plus-values sur réalisation d'immobilisations financières": { + "account_number": "7631", + "account_type": "Income Account" + }, + "account_number": "763", + "account_type": "Income Account" + }, + "Autres produits d'exploitation non récurrents (764 à 768)": { + "account_number": "764", + "account_type": "Income Account" + }, + "Autres produits financiers non récurrents": { + "account_number": "769", + "account_type": "Income Account" + }, + "account_number": "76", + "account_type": "Income Account" + }, + "Régularisation d'impôts": { + "account_number": "77", + "account_type": "Income Account" + }, + "Prélèvements sur les réserves immunisées et les impôts différés": { + "Prélèvements sur les impôts différés": { + "account_number": "780", + "account_type": "Income Account" + }, + "Prélèvement sur les réserves immunisées": { + "account_number": "789", + "account_type": "Income Account" + }, + "account_number": "78", + "account_type": "Income Account" + }, + "Affectations et prélèvements": { + "Résultat positif de l'exercice antérieur reporté": { + "account_number": "790", + "account_type": "Income Account" + }, + "Autres réserves": { + "account_number": "791", + "account_type": "Income Account" + }, + "Résultat négatif à reporter": { + "account_number": "792", + "account_type": "Income Account" + }, + "account_number": "79", + "account_type": "Income Account" + } + } + } +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_entreprises.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_entreprises.json new file mode 100644 index 00000000000..2deb46f7300 --- /dev/null +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/be_plan_comptable_minimum_normalise_entreprises.json @@ -0,0 +1,1597 @@ +{ + "country_code": "be", + "name": "Belgique - Plan comptable minimum normalisé (PCMN) des entreprises", + "tree": { + "CLASSE 1 : CAPITAUX PROPRES": { + "root_type": "Equity", + "Capital": { + "Capital souscrit": { + "account_number": "100", + "account_type": "Equity" + }, + "Capital non appelé (-)": { + "account_number": "101", + "account_type": "Equity" + }, + "account_number": "10", + "account_type": "Equity" + }, + "Apport hors capital": { + "Apport disponible hors capital": { + "Prime d'émission": { + "account_number": "1100", + "account_type": "Equity" + }, + "Autres": { + "account_number": "1109", + "account_type": "Equity" + }, + "account_number": "110", + "account_type": "Equity" + }, + "Apport indisponible hors capital": { + "Prime d'émission": { + "account_number": "1110", + "account_type": "Equity" + }, + "Autres": { + "account_number": "1119", + "account_type": "Equity" + }, + "account_number": "111", + "account_type": "Equity" + }, + "account_number": "11", + "account_type": "Equity" + }, + "Plus-values de réévaluation": { + "Plus-values de réévaluation sur immobilisations incorporelles": { + "account_number": "120", + "account_type": "Equity" + }, + "Plus-values de réévaluation sur immobilisations corporelles": { + "account_number": "121", + "account_type": "Equity" + }, + "Plus-values de réévaluation sur immobilisations financières": { + "account_number": "122", + "account_type": "Equity" + }, + "Plus-values de réévaluation sur stocks": { + "account_number": "123", + "account_type": "Equity" + }, + "Reprises de réductions de valeur sur placements de trésorerie": { + "account_number": "124", + "account_type": "Equity" + }, + "account_number": "12", + "account_type": "Equity" + }, + "Réserves": { + "Réserves légales": { + "account_number": "130", + "account_type": "Equity" + }, + "Autres réserves indisponibles": { + "Réserves statutairement indisponibles": { + "account_number": "1311", + "account_type": "Equity" + }, + "Réserve pour actions propres": { + "account_number": "1312", + "account_type": "Equity" + }, + "Soutien financier": { + "account_number": "1313", + "account_type": "Equity" + }, + "Autres": { + "account_number": "1319", + "account_type": "Equity" + }, + "account_number": "131", + "account_type": "Equity" + }, + "Réserves immunisées": { + "account_number": "132", + "account_type": "Equity" + }, + "Réserves disponibles": { + "account_number": "133", + "account_type": "Equity" + }, + "account_number": "13", + "account_type": "Equity" + }, + "Bénéfice reporté ou perte reportée (-)": { + "account_number": "14", + "account_type": "Equity" + }, + "Subsides en capital": { + "account_number": "15", + "account_type": "Equity" + } + }, + "CLASSE 1 : PROVISIONS ET DETTES À PLUS D'UN AN": { + "root_type": "Liability", + "Provisions et impôts différés": { + "Provisions pour pensions et obligations similaires": { + "account_number": "160", + "account_type": "Liability" + }, + "Provisions pour charges fiscales": { + "account_number": "161", + "account_type": "Liability" + }, + "Provisions pour grosses réparations et gros entretien": { + "account_number": "162", + "account_type": "Liability" + }, + "Provisions pour obligations environnementales": { + "account_number": "163", + "account_type": "Liability" + }, + "Impôts différés": { + "Impôts différés afférents à des subsides en capital": { + "account_number": "1680", + "account_type": "Liability" + }, + "Impôts différés afférents à des plus-values réalisées sur immobilisations incorporelles": { + "account_number": "1681", + "account_type": "Liability" + }, + "Impôts différés afférents à des plus-values réalisées sur immobilisations corporelles": { + "account_number": "1682", + "account_type": "Liability" + }, + "Impôts différés afférents à des plus-values réalisées sur titres émis par le secteur public belge": { + "account_number": "1687", + "account_type": "Liability" + }, + "Impôts différés étrangers": { + "account_number": "1688", + "account_type": "Liability" + }, + "account_number": "168", + "account_type": "Liability" + }, + "account_number": "16", + "account_type": "Liability" + }, + "Dettes à plus d'un an": { + "Emprunts subordonnés": { + "Convertibles": { + "account_number": "1700", + "account_type": "Liability" + }, + "Non convertibles": { + "account_number": "1701", + "account_type": "Liability" + }, + "account_number": "170", + "account_type": "Liability" + }, + "Emprunts obligataires non subordonnés": { + "Convertibles": { + "account_number": "1710", + "account_type": "Liability" + }, + "Non convertibles": { + "account_number": "1711", + "account_type": "Liability" + }, + "account_number": "171", + "account_type": "Liability" + }, + "Dettes de location-financement et assimilées": { + "account_number": "172", + "account_type": "Liability" + }, + "Établissements de crédit": { + "Dettes en compte": { + "account_number": "1730", + "account_type": "Liability" + }, + "Promesses": { + "account_number": "1731", + "account_type": "Liability" + }, + "Crédits d'acceptation": { + "account_number": "1732", + "account_type": "Liability" + }, + "account_number": "173", + "account_type": "Liability" + }, + "Autres emprunts": { + "account_number": "174", + "account_type": "Liability" + }, + "Dettes commerciales": { + "Fournisseurs": { + "account_number": "1750", + "account_type": "Liability" + }, + "Effets à payer": { + "account_number": "1751", + "account_type": "Liability" + }, + "account_number": "175", + "account_type": "Liability" + }, + "Acomptes sur commandes": { + "account_number": "176", + "account_type": "Liability" + }, + "Cautionnements reçus en numéraire": { + "account_number": "178", + "account_type": "Liability" + }, + "Dettes diverses": { + "account_number": "179", + "account_type": "Liability" + }, + "account_number": "17", + "account_type": "Liability" + }, + "Acompte aux associés sur le partage de l'actif net (-)": { + "account_number": "19", + "account_type": "Liability" + } + }, + "CLASSE 2 : FRAIS D'ÉTABLISSEMENT, ACTIFS IMMOBILISÉS ET CRÉANCES À PLUS D'UN AN": { + "root_type": "Asset", + "Frais d'établissement": { + "Frais de constitution, d'augmentation de capital ou d'augmentation de l'apport": { + "account_number": "200", + "account_type": "Fixed Asset" + }, + "Frais d'émission d'emprunts": { + "account_number": "201", + "account_type": "Fixed Asset" + }, + "Autres frais d'établissement": { + "account_number": "202", + "account_type": "Fixed Asset" + }, + "Frais de restructuration": { + "account_number": "204", + "account_type": "Fixed Asset" + }, + "account_number": "20", + "account_type": "Fixed Asset" + }, + "Immobilisations incorporelles": { + "Frais de recherche et de développement": { + "account_number": "210", + "account_type": "Fixed Asset" + }, + "Concessions, brevets, licences, savoir-faire, marques et droits similaires": { + "account_number": "211", + "account_type": "Fixed Asset" + }, + "Goodwill": { + "account_number": "212", + "account_type": "Fixed Asset" + }, + "Acomptes versés": { + "account_number": "213", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "219", + "account_type": "Accumulated Depreciation" + }, + "account_number": "21", + "account_type": "Fixed Asset" + }, + "Terrains et constructions": { + "Terrains": { + "account_number": "220", + "account_type": "Fixed Asset" + }, + "Constructions": { + "account_number": "221", + "account_type": "Fixed Asset" + }, + "Terrains bâtis": { + "account_number": "222", + "account_type": "Fixed Asset" + }, + "Autres droits réels sur des immeubles": { + "account_number": "223", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "229", + "account_type": "Accumulated Depreciation" + }, + "account_number": "22", + "account_type": "Fixed Asset" + }, + "Installations, machines et outillage": { + "account_number": "23", + "account_type": "Fixed Asset" + }, + "Mobilier et matériel roulant": { + "account_number": "24", + "account_type": "Fixed Asset" + }, + "Immobilisations détenues en location-financement et droits similaires": { + "Terrains et constructions": { + "account_number": "250", + "account_type": "Fixed Asset" + }, + "Installations, machines et outillage": { + "account_number": "251", + "account_type": "Fixed Asset" + }, + "Mobilier et matériel roulant": { + "account_number": "252", + "account_type": "Fixed Asset" + }, + "Amortissements et réductions de valeur actées (-)": { + "account_number": "259", + "account_type": "Accumulated Depreciation" + }, + "account_number": "25", + "account_type": "Fixed Asset" + }, + "Autres immobilisations corporelles": { + "account_number": "26", + "account_type": "Fixed Asset" + }, + "Immobilisations corporelles en cours et acomptes versés": { + "account_number": "27", + "account_type": "Fixed Asset" + }, + "Immobilisations financières": { + "Participations dans des entreprises liées": { + "Valeur d'acquisition": { + "account_number": "2800", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2801", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2808", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2809", + "account_type": "Fixed Asset" + }, + "account_number": "280", + "account_type": "Fixed Asset" + }, + "Créances sur des entreprises liées": { + "Créances en compte": { + "account_number": "2810", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2811", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2812", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2817", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2819", + "account_type": "Fixed Asset" + }, + "account_number": "281", + "account_type": "Fixed Asset" + }, + "Participations dans des entreprises avec lesquelles il existe un lien de participation": { + "Valeur d'acquisition": { + "account_number": "2820", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2821", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2828", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2829", + "account_type": "Fixed Asset" + }, + "account_number": "282", + "account_type": "Fixed Asset" + }, + "Créances sur des entreprises avec lesquelles il existe un lien de participation": { + "Créances en compte": { + "account_number": "2830", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2831", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2832", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2837", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2839", + "account_type": "Fixed Asset" + }, + "account_number": "283", + "account_type": "Fixed Asset" + }, + "Autres actions et parts": { + "Valeur d'acquisition": { + "account_number": "2840", + "account_type": "Fixed Asset" + }, + "Montants non appelés (-)": { + "account_number": "2841", + "account_type": "Fixed Asset" + }, + "Plus-values actées": { + "account_number": "2848", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2849", + "account_type": "Fixed Asset" + }, + "account_number": "284", + "account_type": "Fixed Asset" + }, + "Autres créances": { + "Créances en compte": { + "account_number": "2850", + "account_type": "Fixed Asset" + }, + "Effets à recevoir": { + "account_number": "2851", + "account_type": "Fixed Asset" + }, + "Titres à revenu fixe": { + "account_number": "2852", + "account_type": "Fixed Asset" + }, + "Créances douteuses": { + "account_number": "2857", + "account_type": "Fixed Asset" + }, + "Réductions de valeur actées (-)": { + "account_number": "2859", + "account_type": "Fixed Asset" + }, + "account_number": "285", + "account_type": "Fixed Asset" + }, + "Cautionnements versés en numéraire": { + "account_number": "288", + "account_type": "Fixed Asset" + }, + "account_number": "28", + "account_type": "Fixed Asset" + }, + "Créances à plus d'un an": { + "Créances commerciales": { + "Clients": { + "account_number": "2900" + }, + "Effets à recevoir": { + "account_number": "2901" + }, + "Acomptes versés": { + "account_number": "2906" + }, + "Créances douteuses": { + "account_number": "2907" + }, + "Réductions de valeur actées (-)": { + "account_number": "2909" + }, + "account_number": "290" + }, + "Autres créances": { + "Créances en compte": { + "account_number": "2910" + }, + "Effets à recevoir": { + "account_number": "2911" + }, + "Créances douteuses": { + "account_number": "2917" + }, + "Réductions de valeur actées (-)": { + "account_number": "2919" + }, + "account_number": "291" + }, + "account_number": "29" + } + }, + "CLASSE 3 : STOCKS ET COMMANDES EN COURS D'EXÉCUTION": { + "root_type": "Asset", + "Matières premières": { + "Valeur d'acquisition": { + "account_number": "300" + }, + "Réductions de valeur actées (-)": { + "account_number": "309" + }, + "account_number": "30" + }, + "Approvisionnements et fournitures": { + "Valeur d'acquisition": { + "account_number": "310" + }, + "Réductions de valeur actées (-)": { + "account_number": "319" + }, + "account_number": "31" + }, + "En-cours de fabrication": { + "Valeur d'acquisition": { + "account_number": "320" + }, + "Réductions de valeur actées (-)": { + "account_number": "329" + }, + "account_number": "32" + }, + "Produits finis": { + "Valeur d'acquisition": { + "account_number": "330" + }, + "Réductions de valeur actées (-)": { + "account_number": "339" + }, + "account_number": "33" + }, + "Marchandises": { + "Valeur d'acquisition": { + "account_number": "340", + "account_type": "Stock" + }, + "Réductions de valeur actées (-)": { + "account_number": "349" + }, + "account_number": "34", + "account_type": "Stock" + }, + "Immeubles destinés à la vente": { + "Valeur d'acquisition": { + "account_number": "350" + }, + "Réductions de valeur actées (-)": { + "account_number": "359" + }, + "account_number": "35" + }, + "Acomptes versés sur achats pour stocks": { + "Acomptes versés": { + "account_number": "360" + }, + "Réductions de valeur actées (-)": { + "account_number": "369" + }, + "account_number": "36" + }, + "Commandes en cours d'exécution": { + "Valeur d'acquisition": { + "account_number": "370" + }, + "Bénéfice pris en compte": { + "account_number": "371" + }, + "Réductions de valeur actées (-)": { + "account_number": "379" + }, + "account_number": "37" + }, + "Stock livré non facturé": { + "account_type": "Stock Delivered But Not Billed" + } + }, + "CLASSE 4 : CRÉANCES À UN AN AU PLUS": { + "root_type": "Asset", + "Créances commerciales": { + "Clients": { + "account_number": "400", + "account_type": "Receivable" + }, + "Effets à recevoir": { + "account_number": "401", + "account_type": "Receivable" + }, + "Produits à recevoir": { + "account_number": "404", + "account_type": "Receivable" + }, + "Acomptes versés": { + "account_number": "406" + }, + "Créances douteuses": { + "account_number": "407", + "account_type": "Receivable" + }, + "Réductions de valeur actées (-)": { + "account_number": "409" + }, + "account_number": "40", + "account_type": "Receivable" + }, + "Autres créances": { + "Capital ou apport appelé, non versé": { + "account_number": "410" + }, + "TVA à récupérer": { + "account_number": "411", + "account_type": "Tax" + }, + "Impôts et précomptes à récupérer": { + "Impôts et taxes étrangers": { + "account_number": "4128" + }, + "account_number": "412" + }, + "Produits à recevoir": { + "account_number": "414" + }, + "Créances diverses": { + "account_number": "416" + }, + "Créances douteuses": { + "account_number": "417" + }, + "Cautionnements versés en numéraire": { + "account_number": "418" + }, + "Réductions de valeur actées (-)": { + "account_number": "419" + }, + "account_number": "41" + } + }, + "CLASSE 4 : DETTES À UN AN AU PLUS": { + "root_type": "Liability", + "Dettes à plus d'un an échéant dans l'année (16) (même subdivision que le compte 17)": { + "account_number": "42" + }, + "Dettes financières": { + "Établissements de crédit - Emprunts en compte à terme fixe": { + "account_number": "430" + }, + "Établissements de crédit - Promesses": { + "account_number": "431" + }, + "Établissements de crédit - Crédits d'acceptation": { + "account_number": "432" + }, + "Établissements de crédit - Dettes en compte courant": { + "account_number": "433" + }, + "Autres emprunts": { + "account_number": "439" + }, + "account_number": "43" + }, + "Dettes commerciales": { + "Fournisseurs": { + "account_number": "440", + "account_type": "Payable" + }, + "Effets à payer": { + "account_number": "441", + "account_type": "Payable" + }, + "Factures à recevoir": { + "account_number": "444", + "account_type": "Stock Received But Not Billed" + }, + "account_number": "44", + "account_type": "Payable" + }, + "Dettes fiscales, salariales et sociales": { + "Dettes fiscales estimées": { + "Impôts et taxes étrangers": { + "account_number": "4508" + }, + "account_number": "450" + }, + "TVA à payer": { + "account_number": "451", + "account_type": "Tax" + }, + "Impôts et taxes à payer": { + "Impôts et taxes étrangers": { + "account_number": "4528" + }, + "account_number": "452" + }, + "Précomptes retenus": { + "account_number": "453" + }, + "Office national de la Sécurité sociale": { + "account_number": "454" + }, + "Rémunérations": { + "account_number": "455" + }, + "Pécules de vacances": { + "account_number": "456" + }, + "Autres dettes sociales": { + "account_number": "459" + }, + "account_number": "45" + }, + "Acomptes sur commandes": { + "account_number": "46" + }, + "Dettes découlant de l'affectation du résultat": { + "Dividendes et tantièmes d'exercices antérieurs": { + "account_number": "470" + }, + "Dividendes de l'exercice": { + "account_number": "471" + }, + "Tantièmes de l'exercice": { + "account_number": "472" + }, + "Autres allocataires": { + "account_number": "473" + }, + "account_number": "47" + }, + "Dettes diverses": { + "Obligations et coupons échus": { + "account_number": "480" + }, + "Cautionnements reçus en numéraire": { + "account_number": "488" + }, + "Autres dettes diverses": { + "account_number": "489" + }, + "account_number": "48" + }, + "Comptes de régularisation et d'attente": { + "Charges à reporter": { + "account_number": "490" + }, + "Produits acquis": { + "account_number": "491" + }, + "Charges à imputer": { + "account_number": "492" + }, + "Produits à reporter": { + "account_number": "493" + }, + "Comptes d'attente": { + "account_number": "499" + }, + "account_number": "49" + } + }, + "CLASSE 5 : PLACEMENTS DE TRÉSORERIE ET VALEURS DISPONIBLES": { + "root_type": "Asset", + "Actions propres": { + "account_number": "50" + }, + "Actions, parts et placements de trésorerie autres que placements à revenu fixe": { + "Valeur d'acquisition": { + "Actions et parts": { + "account_number": "5100" + }, + "Placements de trésorerie autres que placements à revenu fixe": { + "account_number": "5101" + }, + "account_number": "510" + }, + "Montants non appelés (-)": { + "Actions et parts": { + "account_number": "5110" + }, + "account_number": "511" + }, + "Réductions de valeur actées (-)": { + "Actions et parts": { + "account_number": "5190" + }, + "Placements de trésorerie autres que placements à revenu fixe": { + "account_number": "5191" + }, + "account_number": "519" + }, + "account_number": "51" + }, + "Titres à revenu fixe": { + "Valeur d'acquisition": { + "account_number": "520" + }, + "Réductions de valeur actées (-)": { + "account_number": "529" + }, + "account_number": "52" + }, + "Dépôts à terme": { + "De plus d'un an": { + "account_number": "530" + }, + "De plus d'un mois et à un an au plus": { + "account_number": "531" + }, + "D'un mois au plus": { + "account_number": "532" + }, + "Réductions de valeur actées (-)": { + "account_number": "539" + }, + "account_number": "53" + }, + "Valeurs échues à l'encaissement": { + "account_number": "54" + }, + "Établissements de crédit": { + "Banque": { + "account_number": "5500", + "account_type": "Bank" + }, + "account_number": "55", + "account_type": "Bank" + }, + "Caisses": { + "Caisses-timbres": { + "account_number": "578", + "account_type": "Cash" + }, + "account_number": "57", + "account_type": "Cash" + }, + "Virements internes": { + "account_number": "58", + "account_type": "Temporary" + } + }, + "CLASSE 6 : CHARGES": { + "root_type": "Expense", + "Approvisionnements et marchandises": { + "Achats de matières premières": { + "account_number": "600", + "account_type": "Expense Account" + }, + "Achats de fournitures": { + "account_number": "601", + "account_type": "Expense Account" + }, + "Achats de services, travaux et études": { + "account_number": "602", + "account_type": "Expense Account" + }, + "Sous-traitances générales": { + "account_number": "603", + "account_type": "Expense Account" + }, + "Achats de marchandises": { + "account_number": "604", + "account_type": "Cost of Goods Sold" + }, + "Achats d'immeubles destinés à la vente": { + "account_number": "605", + "account_type": "Expense Account" + }, + "Remises, ristournes et rabais (-)": { + "account_number": "608", + "account_type": "Expense Account" + }, + "Variations des stocks": { + "de matières premières": { + "account_number": "6090", + "account_type": "Stock Adjustment" + }, + "de fournitures": { + "account_number": "6091", + "account_type": "Stock Adjustment" + }, + "de marchandises": { + "account_number": "6094", + "account_type": "Stock Adjustment" + }, + "d'immeubles achetés destinés à la vente": { + "account_number": "6095", + "account_type": "Stock Adjustment" + }, + "account_number": "609", + "account_type": "Stock Adjustment" + }, + "account_number": "60", + "account_type": "Expense Account" + }, + "Services et biens divers": { + "Personnel intérimaire et personnes mises à la disposition de l'entreprise": { + "account_number": "617", + "account_type": "Expense Account" + }, + "Rémunérations et pensions des administrateurs, gérants et associés actifs, hors contrat de travail": { + "account_number": "618", + "account_type": "Expense Account" + }, + "Frais accessoires d'achat inclus dans la valeur des stocks": { + "account_type": "Expenses Included In Valuation" + }, + "account_number": "61", + "account_type": "Expense Account" + }, + "Rémunérations, charges sociales et pensions": { + "Rémunérations et avantages sociaux directs": { + "Administrateurs ou gérants": { + "account_number": "6200", + "account_type": "Expense Account" + }, + "Personnel de direction": { + "account_number": "6201", + "account_type": "Expense Account" + }, + "Employés": { + "account_number": "6202", + "account_type": "Expense Account" + }, + "Ouvriers": { + "account_number": "6203", + "account_type": "Expense Account" + }, + "Autres membres du personnel": { + "account_number": "6204", + "account_type": "Expense Account" + }, + "account_number": "620", + "account_type": "Expense Account" + }, + "Cotisations patronales pour assurances sociales": { + "account_number": "621", + "account_type": "Expense Account" + }, + "Primes patronales pour assurances extra-légales": { + "account_number": "622", + "account_type": "Expense Account" + }, + "Autres frais du personnel": { + "account_number": "623", + "account_type": "Expense Account" + }, + "Pensions de retraite et de survie": { + "Administrateurs ou gérants": { + "account_number": "6240", + "account_type": "Expense Account" + }, + "Personnel": { + "account_number": "6241", + "account_type": "Expense Account" + }, + "account_number": "624", + "account_type": "Expense Account" + }, + "account_number": "62", + "account_type": "Expense Account" + }, + "Amortissements, réductions de valeur et provisions pour risques": { + "Dotations aux amortissements et aux réductions de valeur sur immobilisations": { + "Dotations aux amortissements sur frais d'établissement": { + "account_number": "6300", + "account_type": "Depreciation" + }, + "Dotation aux amortissements sur immobilisations incorporelles": { + "account_number": "6301", + "account_type": "Depreciation" + }, + "Dotation aux amortissements sur immobilisations corporelles": { + "account_number": "6302", + "account_type": "Depreciation" + }, + "Dotation aux réductions de valeur sur immobilisations incorporelles": { + "account_number": "6308", + "account_type": "Depreciation" + }, + "Dotation aux réductions de valeur sur immobilisations corporelles": { + "account_number": "6309", + "account_type": "Depreciation" + }, + "account_number": "630", + "account_type": "Depreciation" + }, + "Réductions de valeur sur stocks": { + "Dotations": { + "account_number": "6310", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6311", + "account_type": "Depreciation" + }, + "account_number": "631", + "account_type": "Depreciation" + }, + "Réductions de valeur sur commandes en cours d'exécution": { + "Dotations": { + "account_number": "6320", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6321", + "account_type": "Depreciation" + }, + "account_number": "632", + "account_type": "Depreciation" + }, + "Réductions de valeur sur créances commerciales à plus d'un an": { + "Dotations": { + "account_number": "6330", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6331", + "account_type": "Depreciation" + }, + "account_number": "633", + "account_type": "Depreciation" + }, + "Réductions de valeur sur créances à un an au plus": { + "Dotations": { + "account_number": "6340", + "account_type": "Depreciation" + }, + "Reprises (-)": { + "account_number": "6341", + "account_type": "Depreciation" + }, + "account_number": "634", + "account_type": "Depreciation" + }, + "Provisions pour pensions et obligations similaires": { + "Dotations": { + "account_number": "6350", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6351", + "account_type": "Depreciation" + }, + "account_number": "635", + "account_type": "Depreciation" + }, + "Provisions pour grosses réparations et gros entretien": { + "Dotations": { + "account_number": "6360", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6361", + "account_type": "Depreciation" + }, + "account_number": "636", + "account_type": "Depreciation" + }, + "Provisions pour obligations environnementales": { + "Dotations": { + "account_number": "6370", + "account_type": "Depreciation" + }, + "Utilisations et reprises (-)": { + "account_number": "6371", + "account_type": "Depreciation" + }, + "account_number": "637", + "account_type": "Depreciation" + }, + "Provisions pour autres risques et charges": { + "Dotations": { + "account_number": "6380", + "account_type": "Expense Account" + }, + "Utilisations et reprises (-)": { + "account_number": "6381", + "account_type": "Expense Account" + }, + "account_number": "638", + "account_type": "Expense Account" + }, + "account_number": "63", + "account_type": "Expense Account" + }, + "Autres charges d'exploitation": { + "Charges fiscales d'exploitation": { + "account_number": "640", + "account_type": "Expense Account" + }, + "Moins-values sur réalisations courantes d'immobilisations corporelles": { + "account_number": "641", + "account_type": "Expense Account" + }, + "Moins-values sur réalisations de créances commerciales": { + "account_number": "642", + "account_type": "Expense Account" + }, + "Charges d'exploitations diverses (643 à 648)": { + "account_number": "643", + "account_type": "Expense Account" + }, + "Charges d'exploitation portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "649", + "account_type": "Expense Account" + }, + "account_number": "64", + "account_type": "Expense Account" + }, + "Charges financières": { + "Charges des dettes": { + "Intérêts, commissions et frais afférents aux dettes": { + "account_number": "6500", + "account_type": "Expense Account" + }, + "Amortissements des frais d'émission d'emprunts": { + "account_number": "6501", + "account_type": "Expense Account" + }, + "Intérêts intercalaires portés à l'actif (-)": { + "account_number": "6502", + "account_type": "Expense Account" + }, + "account_number": "650", + "account_type": "Expense Account" + }, + "Réductions de valeur sur actifs circulants": { + "Dotations": { + "account_number": "6510", + "account_type": "Expense Account" + }, + "Reprises (-)": { + "account_number": "6511", + "account_type": "Expense Account" + }, + "account_number": "651", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'actifs circulants": { + "account_number": "652", + "account_type": "Expense Account" + }, + "Charges d'escompte de créances": { + "account_number": "653", + "account_type": "Expense Account" + }, + "Différences de change": { + "account_number": "654", + "account_type": "Expense Account" + }, + "Écarts de conversion des devises": { + "account_number": "655", + "account_type": "Expense Account" + }, + "Provisions à caractère financier": { + "Dotations": { + "account_number": "6560", + "account_type": "Expense Account" + }, + "Utilisations et reprises (-)": { + "account_number": "6561", + "account_type": "Expense Account" + }, + "account_number": "656", + "account_type": "Expense Account" + }, + "Charges financières diverses (657 à 658)": { + "account_number": "657", + "account_type": "Expense Account" + }, + "Charges financières portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "659", + "account_type": "Expense Account" + }, + "account_number": "65", + "account_type": "Expense Account" + }, + "Charges d'exploitation et charges financières non récurrentes": { + "Amortissements et réductions de valeur non récurrents (dotations)": { + "sur frais d'établissement": { + "account_number": "6600", + "account_type": "Expense Account" + }, + "sur immobilisations incorporelles": { + "account_number": "6601", + "account_type": "Expense Account" + }, + "sur immobilisations corporelles": { + "account_number": "6602", + "account_type": "Expense Account" + }, + "account_number": "660", + "account_type": "Expense Account" + }, + "Réduction de valeur sur immobilisations financières (dotation)": { + "account_number": "661", + "account_type": "Expense Account" + }, + "Provisions pour risques et charges non récurrents": { + "Provisions pour risques et charges d'exploitation non récurrents": { + "Dotations": { + "account_number": "66200", + "account_type": "Expense Account" + }, + "Utilisations (-)": { + "account_number": "66201", + "account_type": "Expense Account" + }, + "account_number": "6620", + "account_type": "Expense Account" + }, + "Provisions pour risques et charges financiers non récurrents": { + "Dotations": { + "account_number": "66210", + "account_type": "Expense Account" + }, + "Utilisations (-)": { + "account_number": "66211", + "account_type": "Expense Account" + }, + "account_number": "6621", + "account_type": "Expense Account" + }, + "account_number": "662", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'actifs immobilisés": { + "Moins-values sur réalisation d'immobilisations incorporelles et corporelles": { + "account_number": "6630", + "account_type": "Expense Account" + }, + "Moins-values sur réalisation d'immobilisations financières": { + "account_number": "6631", + "account_type": "Expense Account" + }, + "account_number": "663", + "account_type": "Expense Account" + }, + "Autres charges d'exploitation non récurrentes (664 à 667)": { + "account_number": "664", + "account_type": "Expense Account" + }, + "Autres charges financières non récurrentes": { + "account_number": "668", + "account_type": "Expense Account" + }, + "Charges d'exploitation non récurrentes portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "6690", + "account_type": "Expense Account" + }, + "Charges financières non récurrentes portées à l'actif au titre de frais de restructuration (-)": { + "account_number": "6691", + "account_type": "Expense Account" + }, + "account_number": "66", + "account_type": "Expense Account" + }, + "Impôts sur le résultat": { + "Impôts belges sur le résultat de l'exercice": { + "Impôts et précomptes dus ou versés": { + "account_number": "6700", + "account_type": "Expense Account" + }, + "Excédent de versements d'impôts et de précomptes porté à l'actif (-)": { + "account_number": "6701", + "account_type": "Expense Account" + }, + "Charges fiscales estimées": { + "account_number": "6702", + "account_type": "Expense Account" + }, + "account_number": "670", + "account_type": "Expense Account" + }, + "Impôts belges sur le résultat d'exercices antérieurs": { + "Suppléments d'impôts dus ou versés": { + "account_number": "6710", + "account_type": "Expense Account" + }, + "Suppléments d'impôts estimés": { + "account_number": "6711", + "account_type": "Expense Account" + }, + "Provisions fiscales constituées": { + "account_number": "6712", + "account_type": "Expense Account" + }, + "account_number": "671", + "account_type": "Expense Account" + }, + "Impôts étrangers sur le résultat de l'exercice": { + "account_number": "672", + "account_type": "Expense Account" + }, + "Impôts étrangers sur le résultat d'exercices antérieurs": { + "account_number": "673", + "account_type": "Expense Account" + }, + "account_number": "67", + "account_type": "Expense Account" + }, + "Transferts aux impôts différés et aux réserves immunisées": { + "Transferts aux impôts différés": { + "account_number": "680", + "account_type": "Expense Account" + }, + "Transferts aux réserves immunisées": { + "account_number": "689", + "account_type": "Expense Account" + }, + "account_number": "68", + "account_type": "Expense Account" + }, + "Affectations et prélèvements": { + "Perte reportée de l'exercice précédent": { + "account_number": "690", + "account_type": "Expense Account" + }, + "Affectations à l'apport": { + "account_number": "691", + "account_type": "Expense Account" + }, + "Dotation aux réserves": { + "Dotation à la réserve légale": { + "account_number": "6920", + "account_type": "Expense Account" + }, + "Dotation aux autres réserves": { + "account_number": "6921", + "account_type": "Expense Account" + }, + "account_number": "692", + "account_type": "Expense Account" + }, + "Bénéfices à reporter": { + "account_number": "693", + "account_type": "Expense Account" + }, + "Rémunération de l'apport": { + "account_number": "694", + "account_type": "Expense Account" + }, + "Administrateurs ou gérants": { + "account_number": "695", + "account_type": "Expense Account" + }, + "Employés": { + "account_number": "696", + "account_type": "Expense Account" + }, + "Autres applications": { + "account_number": "697", + "account_type": "Expense Account" + }, + "account_number": "69", + "account_type": "Expense Account" + } + }, + "CLASSE 7 : PRODUITS": { + "root_type": "Income", + "Chiffre d'affaires": { + "Remises, ristournes et rabais accordés (-)": { + "account_number": "708", + "account_type": "Income Account" + }, + "account_number": "70", + "account_type": "Income Account" + }, + "Variation des stocks et des commandes en cours d'exécution": { + "Des en-cours de fabrication": { + "account_number": "712", + "account_type": "Income Account" + }, + "Des produits finis": { + "account_number": "713", + "account_type": "Income Account" + }, + "Des immeubles construits destinés à la vente": { + "account_number": "715", + "account_type": "Income Account" + }, + "Des commandes en cours d'exécution": { + "Valeur d'acquisition": { + "account_number": "7170", + "account_type": "Income Account" + }, + "Bénéfice pris en compte": { + "account_number": "7171", + "account_type": "Income Account" + }, + "account_number": "717", + "account_type": "Income Account" + }, + "account_number": "71", + "account_type": "Income Account" + }, + "Production immobilisée": { + "account_number": "72", + "account_type": "Income Account" + }, + "Autres produits d'exploitation": { + "Subsides d'exploitation et montants compensatoires": { + "account_number": "740", + "account_type": "Income Account" + }, + "Plus-values sur réalisations courantes d'immobilisations corporelles": { + "account_number": "741", + "account_type": "Income Account" + }, + "Plus-values sur réalisation de créances commerciales": { + "account_number": "742", + "account_type": "Income Account" + }, + "Produits d'exploitation divers (743 à 749)": { + "account_number": "743", + "account_type": "Income Account" + }, + "account_number": "74", + "account_type": "Income Account" + }, + "Produits financiers": { + "Produits des immobilisations financières": { + "account_number": "750", + "account_type": "Income Account" + }, + "Produits des actifs circulants": { + "account_number": "751", + "account_type": "Income Account" + }, + "Plus-values sur réalisation d'actifs circulants": { + "account_number": "752", + "account_type": "Income Account" + }, + "Subsides en capital et en intérêts": { + "account_number": "753", + "account_type": "Income Account" + }, + "Différences de change": { + "account_number": "754", + "account_type": "Income Account" + }, + "Écarts de conversion des devises": { + "account_number": "755", + "account_type": "Income Account" + }, + "Produits financiers divers (756 à 759)": { + "account_number": "756", + "account_type": "Income Account" + }, + "account_number": "75", + "account_type": "Income Account" + }, + "Produits d'exploitation ou financiers non récurrents": { + "Reprises d'amortissements et de réductions de valeur": { + "sur immobilisations incorporelles": { + "account_number": "7600", + "account_type": "Income Account" + }, + "sur immobilisations corporelles": { + "account_number": "7601", + "account_type": "Income Account" + }, + "account_number": "760", + "account_type": "Income Account" + }, + "Reprises de réductions de valeur sur immobilisations financières": { + "account_number": "761", + "account_type": "Income Account" + }, + "Reprises de provisions pour risques et charges non récurrents": { + "Reprises de provisions pour risques et charges d'exploitation non récurrents": { + "account_number": "7620", + "account_type": "Income Account" + }, + "Reprises de provisions pour risques et charges financiers non récurrents": { + "account_number": "7621", + "account_type": "Income Account" + }, + "account_number": "762", + "account_type": "Income Account" + }, + "Plus-values sur réalisation d'actifs immobilisés": { + "Plus-values sur réalisation d'immobilisations incorporelles et corporelles": { + "account_number": "7630", + "account_type": "Income Account" + }, + "Plus-values sur réalisation d'immobilisations financières": { + "account_number": "7631", + "account_type": "Income Account" + }, + "account_number": "763", + "account_type": "Income Account" + }, + "Autres bénéfices d'exploitation non récurrents (764 à 768)": { + "account_number": "764", + "account_type": "Income Account" + }, + "Autres produits financiers non récurrents": { + "account_number": "769", + "account_type": "Income Account" + }, + "account_number": "76", + "account_type": "Income Account" + }, + "Régularisations d'impôts et reprises de provisions fiscales": { + "Impôts belges sur le résultat": { + "Régularisation d'impôts dus ou versés": { + "account_number": "7710", + "account_type": "Income Account" + }, + "Régularisation d'impôts estimés": { + "account_number": "7711", + "account_type": "Income Account" + }, + "Reprises de provisions fiscales": { + "account_number": "7712", + "account_type": "Income Account" + }, + "account_number": "771", + "account_type": "Income Account" + }, + "Impôts étrangers sur le résultat": { + "account_number": "773", + "account_type": "Income Account" + }, + "account_number": "77", + "account_type": "Income Account" + }, + "Prélèvements sur les réserves immunisées et les impôts différés": { + "Prélèvements sur les impôts différés": { + "account_number": "780", + "account_type": "Income Account" + }, + "Prélèvement sur les réserves immunisées": { + "account_number": "789", + "account_type": "Income Account" + }, + "account_number": "78", + "account_type": "Income Account" + }, + "Affectations et prélèvements": { + "Bénéfice reporté de l'exercice précédent": { + "account_number": "790", + "account_type": "Income Account" + }, + "Prélèvements sur l'apport": { + "account_number": "791", + "account_type": "Income Account" + }, + "Prélèvements sur les réserves": { + "account_number": "792", + "account_type": "Income Account" + }, + "Perte à reporter": { + "account_number": "793", + "account_type": "Income Account" + }, + "Intervention d'associés (ou du propriétaire) dans la perte": { + "account_number": "794", + "account_type": "Income Account" + }, + "account_number": "79", + "account_type": "Income Account" + } + } + } +} \ No newline at end of file From 900064e395950bc7ad4cb5662f809982d37543aa Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 15:20:17 +0530 Subject: [PATCH 36/82] feat: validate purchase receipt exchange rate parity on purchase invoice (backport #58177) (#58190) feat: validate purchase receipt exchange rate parity on purchase invoice (#58177) (cherry picked from commit 70a8a2d0c521c4295348446567da631066a0c552) Co-authored-by: rohitwaghchaure --- .../purchase_invoice/purchase_invoice.py | 42 ++++++++++++++ .../purchase_invoice/test_purchase_invoice.py | 56 ++++++++----------- 2 files changed, 66 insertions(+), 32 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 2ac7888671c..17b4ca6152b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -298,6 +298,7 @@ class PurchaseInvoice(BuyingController): self.validate_multiple_billing("Purchase Receipt", "pr_detail", "amount") self.set_status() self.validate_purchase_receipt_if_update_stock() + self.validate_exchange_rate_with_purchase_receipt() validate_inter_company_party( self.doctype, self.supplier, self.company, self.inter_company_invoice_reference ) @@ -321,6 +322,47 @@ class PurchaseInvoice(BuyingController): if total_billed_qty and total_received_qty: self.per_received = total_received_qty / total_billed_qty * 100 + def validate_exchange_rate_with_purchase_receipt(self): + if self.is_internal_transfer() or not erpnext.is_perpetual_inventory_enabled(self.company): + return + + stock_items = self.get_stock_items() + receipts = { + item.purchase_receipt + for item in self.items + if item.purchase_receipt and item.item_code in stock_items + } + if not receipts: + return + + if frappe.db.get_single_value("Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate"): + return + + mismatched = [ + f"{frappe.bold(row.name)} ({row.conversion_rate})" + for row in frappe.get_all( + "Purchase Receipt", + filters={"name": ("in", list(receipts))}, + fields=["name", "currency", "conversion_rate"], + ) + if row.currency == self.currency + and flt(row.conversion_rate) + and flt(row.conversion_rate) != flt(self.conversion_rate) + ] + if not mismatched: + return + + frappe.throw( + _( + "Exchange rate {0} does not match the exchange rate of Purchase Receipt {1}. Use the same exchange rate as the Purchase Receipt or enable {2} in {3} to adjust the landed cost based on this invoice." + ).format( + frappe.bold(self.conversion_rate), + ", ".join(mismatched), + frappe.bold(_("Set Landed Cost Based on Purchase Invoice Rate")), + get_link_to_form("Buying Settings", "Buying Settings", _("Buying Settings")), + ) + ) + def validate_invoice_hold(self): if self.is_return: frappe.throw(_("Return Purchase Invoice cannot be held.")) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8d9e7309366..650da3a499c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -507,6 +507,12 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): ) frappe.db.set_single_value("Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 0) + self.addCleanup( + frappe.db.set_single_value, + "Buying Settings", + "set_landed_cost_based_on_purchase_invoice_rate", + original_value, + ) pr = make_purchase_receipt( company="_Test Company with perpetual inventory", @@ -518,25 +524,15 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): pi = create_purchase_invoice(pr.name) pi.conversion_rate = 80 + self.assertRaises(frappe.ValidationError, pi.insert) + + pi.conversion_rate = 70 pi.insert() pi.submit() - # Get exchnage gain and loss account exchange_gain_loss_account = frappe.db.get_value("Company", pi.company, "exchange_gain_loss_account") - - # fetching the latest GL Entry with exchange gain and loss account account - amount = frappe.db.get_value( - "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "debit" - ) - - discrepancy_caused_by_exchange_rate_diff = abs( - pi.items[0].base_net_amount - pr.items[0].base_net_amount - ) - - self.assertEqual(discrepancy_caused_by_exchange_rate_diff, amount) - - frappe.db.set_single_value( - "Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", original_value + self.assertFalse( + frappe.db.exists("GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}) ) def test_purchase_invoice_with_exchange_rate_difference_for_non_stock_item(self): @@ -544,7 +540,17 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): make_purchase_invoice as create_purchase_invoice, ) - # Creating Purchase Invoice with USD currency + original_value = frappe.db.get_single_value( + "Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate" + ) + frappe.db.set_single_value("Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 0) + self.addCleanup( + frappe.db.set_single_value, + "Buying Settings", + "set_landed_cost_based_on_purchase_invoice_rate", + original_value, + ) + pr = frappe.new_doc("Purchase Receipt") pr.currency = "USD" pr.company = "_Test Company with perpetual inventory" @@ -558,34 +564,20 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): "rate": 100, }, ) - pr.append( - "items", - {"item_code": "_Test Item", "qty": 1, "rate": 5, "warehouse": "Stores - TCP1"}, - ) pr.insert() pr.submit() - # Createing purchase invoice against Purchase Receipt pi = create_purchase_invoice(pr.name) pi.conversion_rate = 80 pi.credit_to = "_Test Payable USD - TCP1" pi.insert() pi.submit() - # Get exchnage gain and loss account exchange_gain_loss_account = frappe.db.get_value("Company", pi.company, "exchange_gain_loss_account") - - # fetching the latest GL Entry with exchange gain and loss account account - amount = frappe.db.get_value( - "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "credit" + self.assertFalse( + frappe.db.exists("GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}) ) - discrepancy_caused_by_exchange_rate_diff = abs( - pi.items[1].base_net_amount - pr.items[1].base_net_amount - ) - - self.assertEqual(flt(discrepancy_caused_by_exchange_rate_diff, 2), amount) - def test_purchase_invoice_change_naming_series(self): pi = frappe.copy_doc(self.globalTestRecords["Purchase Invoice"][1]) pi.insert() From 32ebd69abc15069ce30df18c683e7822ac774912 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 16:40:09 +0000 Subject: [PATCH 37/82] fix(email_digest): added permission check for `get_msg_html` (backport #58197) (#58200) Co-authored-by: diptanilsaha --- erpnext/setup/doctype/email_digest/email_digest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 4e323097970..6590794a1a5 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -910,7 +910,9 @@ def send(): @frappe.whitelist() def get_digest_msg(name): - return frappe.get_doc("Email Digest", name).get_msg_html() + email_digest = frappe.get_doc("Email Digest", name) + email_digest.check_permission() + return email_digest.get_msg_html() def get_incomes_expenses_for_period(account, from_date, to_date): From 2b84ed78e8df27f1345e293b0bafff4822cb7922 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 16 Aug 2026 15:34:10 +0530 Subject: [PATCH 38/82] feat: add status filter to Supplier Quotation Comparison report --- .../supplier_quotation_comparison.js | 11 +++++++++++ .../supplier_quotation_comparison.py | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js index 0df7e0787a9..5073459636e 100644 --- a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js +++ b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js @@ -85,6 +85,17 @@ frappe.query_reports["Supplier Quotation Comparison"] = { ], default: __("Categorize by Supplier"), }, + { + fieldname: "status", + label: __("Status"), + fieldtype: "Select", + options: [ + { label: "", value: "" }, + { label: __("Draft"), value: "Draft" }, + { label: __("Submitted"), value: "Submitted" }, + ], + default: "Submitted", + }, { fieldtype: "Check", label: __("Include Expired"), diff --git a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py index 7c11dda7225..47ce00fa692 100644 --- a/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py +++ b/erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py @@ -58,13 +58,20 @@ def get_data(filters): ) .where( (sq_item.parent == sq.name) - & (sq_item.docstatus < 2) & (sq.company == filters.get("company")) & (sq.transaction_date.between(filters.get("from_date"), filters.get("to_date"))) ) .orderby(sq.transaction_date, sq_item.item_code) ) + # blank -> Draft + Submitted, else filter to the chosen docstatus + if filters.get("status") == "Draft": + query = query.where(sq_item.docstatus == 0) + elif filters.get("status") == "Submitted": + query = query.where(sq_item.docstatus == 1) + else: + query = query.where(sq_item.docstatus < 2) + if filters.get("item_code"): query = query.where(sq_item.item_code == filters.get("item_code")) From c3cf7f2e91bf73089dbf0094cf6d5f7bc91b5547 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 16 Aug 2026 17:28:32 +0530 Subject: [PATCH 39/82] fix: drop removed Restaurant doctype from sales tax template dashboard (backport #58191) (#58211) --- .../sales_taxes_and_charges_template_dashboard.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py index 6432acaae93..fca17cc14ec 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py +++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py @@ -7,10 +7,9 @@ def get_data(): "non_standard_fieldnames": { "Tax Rule": "sales_tax_template", "Subscription": "sales_tax_template", - "Restaurant": "default_tax_template", }, "transactions": [ {"label": _("Transactions"), "items": ["Sales Invoice", "Sales Order", "Delivery Note"]}, - {"label": _("References"), "items": ["POS Profile", "Subscription", "Restaurant", "Tax Rule"]}, + {"label": _("References"), "items": ["POS Profile", "Subscription", "Tax Rule"]}, ], } From 28fe021d79735a11bac5ec0f31d565b76e4587d3 Mon Sep 17 00:00:00 2001 From: MochaMind Date: Sun, 16 Aug 2026 18:03:26 +0530 Subject: [PATCH 40/82] chore: update POT file (#58207) --- erpnext/locale/main.pot | 1941 ++++++++++++++++++++------------------- 1 file changed, 1004 insertions(+), 937 deletions(-) diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index 6ce1377b298..3fa7e39d18c 100644 --- a/erpnext/locale/main.pot +++ b/erpnext/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ERPNext VERSION\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-08-09 09:47+0000\n" -"PO-Revision-Date: 2026-08-09 09:47+0000\n" +"POT-Creation-Date: 2026-08-16 09:41+0000\n" +"PO-Revision-Date: 2026-08-16 09:41+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -106,7 +106,7 @@ msgstr "" msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:273 +#: erpnext/public/js/utils/serial_no_batch_selector.js:283 msgid "\"SN-01::10\" for \"SN-01\" to \"SN-10\"" msgstr "" @@ -271,11 +271,11 @@ msgstr "" msgid "% of materials delivered against this Sales Order" msgstr "" -#: erpnext/controllers/accounts_controller.py:2419 +#: erpnext/controllers/accounts_controller.py:2455 msgid "'Account' in the Accounting section of Customer {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:362 +#: erpnext/selling/doctype/sales_order/sales_order.py:363 msgid "'Allow Multiple Sales Orders Against a Customer's Purchase Order'" msgstr "" @@ -287,7 +287,7 @@ msgstr "" msgid "'Days Since Last Order' must be greater than or equal to zero" msgstr "" -#: erpnext/controllers/accounts_controller.py:2424 +#: erpnext/controllers/accounts_controller.py:2460 msgid "'Default {0} Account' in Company {1}" msgstr "" @@ -619,8 +619,8 @@ msgstr "" msgid "90 Above" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1298 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1299 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1330 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1331 msgid "<0" msgstr "" @@ -800,7 +800,7 @@ msgstr "" msgid "
  • Clearance date must be after cheque date for row(s): {0}
  • " msgstr "" -#: erpnext/controllers/accounts_controller.py:2302 +#: erpnext/controllers/accounts_controller.py:2338 msgid "
  • Item {0} in row(s) {1} billed more than {2}
  • " msgstr "" @@ -817,7 +817,7 @@ msgstr "" msgid "
  • {}
  • " msgstr "" -#: erpnext/controllers/accounts_controller.py:2299 +#: erpnext/controllers/accounts_controller.py:2335 msgid "

    Cannot overbill for the following Items:

    " msgstr "" @@ -862,7 +862,7 @@ msgstr "" msgid "

    Price List Rate has not been set as editable in Selling Settings. In this scenario, setting Update Price List Based On to Price List Rate will prevent auto-updation of Item Price.

    Are you sure you want to continue?" msgstr "" -#: erpnext/controllers/accounts_controller.py:2311 +#: erpnext/controllers/accounts_controller.py:2347 msgid "

    To allow over-billing, please set allowance in Accounts Settings.

    " msgstr "" @@ -955,6 +955,10 @@ msgstr "" msgid "Outstanding Amount: {0}" msgstr "" +#: erpnext/public/js/utils/serial_no_batch_selector.js:690 +msgid "Total qty of the rows ({0}) does not match the Qty to Fetch ({1}). Qty of the item will be changed to {0}. Are you sure want to proceed?" +msgstr "" + #. Content of the 'html_19' (HTML) field in DocType 'Inventory Dimension' #: erpnext/stock/doctype/inventory_dimension/inventory_dimension.json msgid "" @@ -1040,7 +1044,7 @@ msgstr "" msgid "A Reconciliation Job {0} is running for the same filters. Cannot reconcile now" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1783 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1797 msgid "A Reverse Journal Entry {0} already exists for this Journal Entry." msgstr "" @@ -1081,7 +1085,7 @@ msgstr "" msgid "A logical Warehouse against which stock entries are made." msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1565 +#: erpnext/stock/serial_batch_bundle.py:1568 msgid "A naming series conflict occurred while creating serial numbers. Please change the naming series for the item {0}." msgstr "" @@ -1118,7 +1122,7 @@ msgstr "" msgid "A third party distributor / dealer / commission agent / affiliate / reseller who sells the companies products for a commission." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:70 +#: erpnext/crm/doctype/appointment/appointment.py:71 msgid "A verified appointment cannot be moved back to 'Unverified' status." msgstr "" @@ -1211,7 +1215,7 @@ msgstr "" msgid "Abbreviation: {0} must appear only once" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1295 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1327 msgid "Above" msgstr "" @@ -1265,7 +1269,7 @@ msgid "Accepted Qty in Stock UOM" msgstr "" #. Label of the qty (Float) field in DocType 'Purchase Receipt Item' -#: erpnext/public/js/controllers/transaction.js:2875 +#: erpnext/public/js/controllers/transaction.js:2876 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json msgid "Accepted Quantity" msgstr "" @@ -1301,7 +1305,7 @@ msgstr "" msgid "According to CEFACT/ICG/2010/IC013 or CEFACT/ICG/2010/IC010" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1290 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1295 msgid "According to the BOM {0}, the Item '{1}' is missing in the stock entry." msgstr "" @@ -1425,7 +1429,7 @@ msgid "Account Manager" msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1063 -#: erpnext/controllers/accounts_controller.py:2428 +#: erpnext/controllers/accounts_controller.py:2464 msgid "Account Missing" msgstr "" @@ -1665,7 +1669,7 @@ msgstr "" msgid "Account {0} is frozen" msgstr "" -#: erpnext/controllers/accounts_controller.py:1503 +#: erpnext/controllers/accounts_controller.py:1539 msgid "Account {0} is invalid. Account Currency must be {1}" msgstr "" @@ -1701,7 +1705,7 @@ msgstr "" msgid "Account: {0} is not permitted under Payment Entry" msgstr "" -#: erpnext/controllers/accounts_controller.py:3312 +#: erpnext/controllers/accounts_controller.py:3348 msgid "Account: {0} with currency: {1} can not be selected" msgstr "" @@ -1982,12 +1986,12 @@ msgstr "" #: erpnext/assets/doctype/asset/asset.py:941 #: erpnext/assets/doctype/asset/asset.py:956 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:546 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:574 msgid "Accounting Entry for Asset" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2396 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2416 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2466 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2486 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1995,33 +1999,33 @@ msgstr "" msgid "Accounting Entry for Landed Cost Voucher for SCR {0}" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:833 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:837 msgid "Accounting Entry for Service" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1056 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1077 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1095 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1116 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1137 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1165 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1277 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1542 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1564 -#: erpnext/controllers/stock_controller.py:787 -#: erpnext/controllers/stock_controller.py:804 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:930 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2341 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2355 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1096 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1117 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1135 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1156 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1177 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1205 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1317 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1582 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1604 +#: erpnext/controllers/stock_controller.py:796 +#: erpnext/controllers/stock_controller.py:813 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:934 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2411 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2425 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:753 msgid "Accounting Entry for Stock" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:729 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:730 msgid "Accounting Entry for {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:2469 +#: erpnext/controllers/accounts_controller.py:2505 msgid "Accounting Entry for {0}: {1} can only be made in currency: {2}" msgstr "" @@ -2091,7 +2095,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/assets/doctype/asset_category/asset_category.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:448 +#: erpnext/setup/doctype/company/company.py:449 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json @@ -2166,7 +2170,7 @@ msgstr "" #. Label of the accounts_receivable_payable_tuning_section (Section Break) #. field in DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Accounts Receivable / Payable Tuning" +msgid "Accounts Receivable / Payable Report" msgstr "" #. Label of the receivable_payable_remarks_length (Int) field in DocType @@ -2218,6 +2222,10 @@ msgstr "" msgid "Accounts Setup" msgstr "" +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:495 +msgid "Accounts cannot be removed, as user doesn't have access to all the accounts of {0}" +msgstr "" + #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1348 msgid "Accounts table cannot be blank." msgstr "" @@ -2530,7 +2538,7 @@ msgstr "" msgid "Actual End Date (via Timesheet)" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:304 +#: erpnext/manufacturing/doctype/work_order/work_order.py:307 msgid "Actual End Date cannot be before Actual Start Date" msgstr "" @@ -3060,7 +3068,7 @@ msgstr "" msgid "Additional Discount Amount (Company Currency)" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:854 +#: erpnext/controllers/taxes_and_totals.py:893 msgid "Additional Discount Amount ({discount_amount}) cannot exceed the total before such discount ({total_before_discount})" msgstr "" @@ -3178,7 +3186,7 @@ msgstr "" msgid "Additional Transferred Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:841 +#: erpnext/manufacturing/doctype/work_order/work_order.py:820 msgid "" "Additional Transferred Qty {0}\n" "\t\t\t\t\tcannot be greater than {1}.\n" @@ -3336,7 +3344,7 @@ msgstr "" msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:653 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:654 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3417,7 +3425,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/controllers/accounts_controller.py:311 +#: erpnext/controllers/accounts_controller.py:330 #: erpnext/setup/doctype/company/company.json msgid "Advance Payments" msgstr "" @@ -3453,7 +3461,7 @@ msgstr "" msgid "Advance amount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:991 +#: erpnext/controllers/taxes_and_totals.py:1031 msgid "Advance amount cannot be greater than {0} {1}" msgstr "" @@ -3636,7 +3644,7 @@ msgstr "" msgid "Against Stock Entry" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:349 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 msgid "Against Supplier Invoice {0}" msgstr "" @@ -3681,7 +3689,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:154 #: erpnext/accounts/report/accounts_payable/accounts_payable.html:138 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:139 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1229 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1261 msgid "Age (Days)" msgstr "" @@ -3788,9 +3796,9 @@ msgstr "" msgid "Alias" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:169 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:153 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:173 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:181 #: erpnext/accounts/utils.py:1626 erpnext/public/js/setup_wizard.js:279 msgid "All Accounts" msgstr "" @@ -3815,7 +3823,7 @@ msgstr "" msgid "All Activities HTML" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:391 +#: erpnext/manufacturing/doctype/bom/bom.py:419 msgid "All BOMs" msgstr "" @@ -3843,21 +3851,21 @@ msgstr "" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:441 -#: erpnext/setup/doctype/company/company.py:444 -#: erpnext/setup/doctype/company/company.py:449 -#: erpnext/setup/doctype/company/company.py:455 -#: erpnext/setup/doctype/company/company.py:461 -#: erpnext/setup/doctype/company/company.py:467 -#: erpnext/setup/doctype/company/company.py:473 -#: erpnext/setup/doctype/company/company.py:479 -#: erpnext/setup/doctype/company/company.py:485 -#: erpnext/setup/doctype/company/company.py:491 -#: erpnext/setup/doctype/company/company.py:497 -#: erpnext/setup/doctype/company/company.py:503 -#: erpnext/setup/doctype/company/company.py:509 -#: erpnext/setup/doctype/company/company.py:515 -#: erpnext/setup/doctype/company/company.py:521 +#: erpnext/setup/doctype/company/company.py:442 +#: erpnext/setup/doctype/company/company.py:445 +#: erpnext/setup/doctype/company/company.py:450 +#: erpnext/setup/doctype/company/company.py:456 +#: erpnext/setup/doctype/company/company.py:462 +#: erpnext/setup/doctype/company/company.py:468 +#: erpnext/setup/doctype/company/company.py:474 +#: erpnext/setup/doctype/company/company.py:480 +#: erpnext/setup/doctype/company/company.py:486 +#: erpnext/setup/doctype/company/company.py:492 +#: erpnext/setup/doctype/company/company.py:498 +#: erpnext/setup/doctype/company/company.py:504 +#: erpnext/setup/doctype/company/company.py:510 +#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:522 msgid "All Departments" msgstr "" @@ -3959,7 +3967,7 @@ msgstr "" msgid "All items are already requested" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1510 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1523 msgid "All items have already been Invoiced/Returned" msgstr "" @@ -3967,11 +3975,11 @@ msgstr "" msgid "All items have already been received" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3728 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3844 msgid "All items have already been transferred for this Work Order." msgstr "" -#: erpnext/public/js/controllers/transaction.js:2998 +#: erpnext/public/js/controllers/transaction.js:2999 msgid "All items in this document already have a linked Quality Inspection." msgstr "" @@ -4642,7 +4650,7 @@ msgstr "" msgid "Alternative item must not be same as item code" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:382 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:394 msgid "Alternatively, you can download the template and fill your data in." msgstr "" @@ -5046,7 +5054,7 @@ msgstr "" msgid "An Item Group is a way to classify items based on types." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:74 +#: erpnext/crm/doctype/appointment/appointment.py:75 msgid "An appointment booked through the portal can only be opened via email verification." msgstr "" @@ -5217,15 +5225,15 @@ msgstr "" msgid "Applicable for external driver" msgstr "" -#: erpnext/regional/italy/setup.py:162 +#: erpnext/regional/italy/setup.py:166 msgid "Applicable if the company is SpA, SApA or SRL" msgstr "" -#: erpnext/regional/italy/setup.py:171 +#: erpnext/regional/italy/setup.py:175 msgid "Applicable if the company is a limited liability company" msgstr "" -#: erpnext/regional/italy/setup.py:122 +#: erpnext/regional/italy/setup.py:126 msgid "Applicable if the company is an Individual or a Proprietorship" msgstr "" @@ -5460,11 +5468,11 @@ msgstr "" msgid "Appointment Booking Slots" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:181 +#: erpnext/crm/doctype/appointment/appointment.py:182 msgid "Appointment Confirmation" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:189 +#: erpnext/crm/doctype/appointment/appointment.py:190 msgid "Appointment Confirmed" msgstr "" @@ -5507,15 +5515,15 @@ msgstr "" msgid "Appointment With" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:86 +#: erpnext/crm/doctype/appointment/appointment.py:87 msgid "Appointment can only be scheduled up to {0} day(s) in advance." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:79 +#: erpnext/crm/doctype/appointment/appointment.py:80 msgid "Appointment cannot be scheduled for a past time." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:98 +#: erpnext/crm/doctype/appointment/appointment.py:99 msgid "Appointment cannot be scheduled on a holiday." msgstr "" @@ -5527,11 +5535,11 @@ msgstr "" msgid "Appointment is already verified." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:116 +#: erpnext/crm/doctype/appointment/appointment.py:117 msgid "Appointment must be scheduled within the available slot timings." msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:66 +#: erpnext/crm/doctype/appointment/appointment.py:67 msgid "Appointments created manually cannot have 'Unverified' status." msgstr "" @@ -6085,7 +6093,7 @@ msgstr "" msgid "Asset cannot be scrapped before the last depreciation entry." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:601 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:629 msgid "Asset capitalized after Asset Capitalization {0} was submitted" msgstr "" @@ -6105,7 +6113,7 @@ msgstr "" msgid "Asset issued to Employee {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:182 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:183 msgid "Asset out of order due to Asset Repair {0}" msgstr "" @@ -6117,7 +6125,7 @@ msgstr "" msgid "Asset restored" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:609 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:637 msgid "Asset restored after Asset Capitalization {0} was cancelled" msgstr "" @@ -6150,7 +6158,7 @@ msgstr "" msgid "Asset updated after being split into Asset {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:445 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:453 msgid "Asset updated due to Asset Repair {0} {1}." msgstr "" @@ -6158,7 +6166,7 @@ msgstr "" msgid "Asset {0} cannot be scrapped, as it is already {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:199 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:225 msgid "Asset {0} does not belong to Item {1}" msgstr "" @@ -6174,16 +6182,16 @@ msgstr "" msgid "Asset {0} does not belong to the location {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:650 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:750 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:678 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:778 msgid "Asset {0} does not exist" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:576 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:604 msgid "Asset {0} has been updated. Please set the depreciation details if any and submit it." msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:75 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:76 msgid "Asset {0} is in {1} status and cannot be repaired." msgstr "" @@ -6199,7 +6207,7 @@ msgstr "" msgid "Asset {0} must be submitted" msgstr "" -#: erpnext/controllers/buying_controller.py:1112 +#: erpnext/controllers/buying_controller.py:1120 msgid "Asset {assets_link} created for {item_code}" msgstr "" @@ -6237,15 +6245,15 @@ msgstr "" msgid "Assets Setup" msgstr "" -#: erpnext/controllers/buying_controller.py:1130 +#: erpnext/controllers/buying_controller.py:1138 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "" -#: erpnext/controllers/buying_controller.py:1117 +#: erpnext/controllers/buying_controller.py:1125 msgid "Assets {assets_link} created for {item_code}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:712 +#: erpnext/manufacturing/doctype/job_card/job_card.js:722 msgid "Assign Job to Employee" msgstr "" @@ -6310,7 +6318,7 @@ msgstr "" msgid "At least one of the Selling or Buying must be selected" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:437 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:442 msgid "At least one raw material item must be present in the stock entry for the type {0}" msgstr "" @@ -6318,11 +6326,11 @@ msgstr "" msgid "At least one row is required for a financial report template" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1002 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1007 msgid "At least one warehouse is mandatory" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:905 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "At row #{0}: the Difference Account must not be a Stock type account, please change the Account Type for the account {1} or select a different account" msgstr "" @@ -6330,7 +6338,7 @@ msgstr "" msgid "At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:916 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:921 msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account" msgstr "" @@ -6350,7 +6358,7 @@ msgstr "" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:735 +#: erpnext/controllers/stock_controller.py:744 msgid "At row {0}: Serial and Batch Bundle {1} has already created. Please remove the values from the serial no or batch no fields." msgstr "" @@ -6367,7 +6375,7 @@ msgstr "" msgid "Atmosphere" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:255 +#: erpnext/public/js/utils/serial_no_batch_selector.js:265 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:73 msgid "Attach CSV File" msgstr "" @@ -6521,11 +6529,11 @@ msgstr "" msgid "Auto Creation of Contact" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:379 +#: erpnext/public/js/utils/serial_no_batch_selector.js:389 msgid "Auto Fetch" msgstr "" -#: erpnext/selling/page/point_of_sale/pos_item_details.js:227 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:238 msgid "Auto Fetch Serial Numbers" msgstr "" @@ -6585,7 +6593,7 @@ msgstr "" msgid "Auto Reposting of Incorrect Valuation" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:208 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:209 msgid "Auto Tax Settings Error" msgstr "" @@ -6863,7 +6871,7 @@ msgstr "" msgid "Available for use date is required" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1252 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1257 msgid "Available quantity is {0}, you need {1}" msgstr "" @@ -6990,7 +6998,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:209 #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/bom_explorer/bom_explorer.js:8 -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:67 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:73 #: erpnext/manufacturing/report/bom_stock_analysis/bom_stock_analysis.js:8 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:109 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -7011,7 +7019,7 @@ msgstr "" msgid "BOM 1" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1823 +#: erpnext/manufacturing/doctype/bom/bom.py:1844 msgid "BOM 1 {0} and BOM 2 {1} should not be same" msgstr "" @@ -7105,7 +7113,7 @@ msgstr "" msgid "BOM Item" msgstr "" -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:71 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:77 #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py:174 msgid "BOM Level" msgstr "" @@ -7258,7 +7266,7 @@ msgstr "" msgid "BOM Website Operation" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2834 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2904 msgid "BOM and Finished Good Quantity is mandatory for Disassembly" msgstr "" @@ -7277,23 +7285,23 @@ msgstr "" msgid "BOM recursion: {0} cannot be child of {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:790 +#: erpnext/manufacturing/doctype/bom/bom.py:818 msgid "BOM recursion: {1} cannot be parent or child of {0}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1541 +#: erpnext/manufacturing/doctype/bom/bom.py:1562 msgid "BOM {0} does not belong to Item {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1523 +#: erpnext/manufacturing/doctype/bom/bom.py:1544 msgid "BOM {0} must be active" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1526 +#: erpnext/manufacturing/doctype/bom/bom.py:1547 msgid "BOM {0} must be submitted" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:878 +#: erpnext/manufacturing/doctype/bom/bom.py:899 msgid "BOM {0} not found for the item {1}" msgstr "" @@ -7361,7 +7369,7 @@ msgstr "" #: erpnext/accounts/report/account_balance/account_balance.py:36 #: erpnext/accounts/report/general_ledger/general_ledger.html:168 #: erpnext/accounts/report/purchase_register/purchase_register.py:258 -#: erpnext/accounts/report/sales_register/sales_register.py:292 +#: erpnext/accounts/report/sales_register/sales_register.py:301 #: erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py:71 msgid "Balance" msgstr "" @@ -8150,9 +8158,9 @@ msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:89 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:115 -#: erpnext/public/js/controllers/transaction.js:2901 +#: erpnext/public/js/controllers/transaction.js:2902 #: erpnext/public/js/utils/barcode_scanner.js:286 -#: erpnext/public/js/utils/serial_no_batch_selector.js:449 +#: erpnext/public/js/utils/serial_no_batch_selector.js:459 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_price/item_price.json #: erpnext/stock/doctype/packed_item/packed_item.json @@ -8185,7 +8193,7 @@ msgstr "" msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3597 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3600 msgid "Batch No {0} does not exists" msgstr "" @@ -8202,13 +8210,13 @@ msgstr "" msgid "Batch No." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:16 -#: erpnext/public/js/utils/serial_no_batch_selector.js:201 +#: erpnext/public/js/utils/serial_no_batch_selector.js:26 +#: erpnext/public/js/utils/serial_no_batch_selector.js:211 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:50 msgid "Batch Nos" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2125 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2128 msgid "Batch Nos are created successfully" msgstr "" @@ -8262,7 +8270,7 @@ msgstr "" msgid "Batch and Serial No" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1068 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1050 msgid "Batch not created for item {} since it does not have a batch series." msgstr "" @@ -8285,12 +8293,12 @@ msgstr "" msgid "Batch {0} is not available in warehouse {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3912 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4028 #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:290 msgid "Batch {0} of Item {1} has expired." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3918 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4034 msgid "Batch {0} of Item {1} is disabled." msgstr "" @@ -8345,7 +8353,7 @@ msgstr "" #. Label of the bill_date (Date) field in DocType 'Journal Entry' #. Label of the bill_date (Date) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1214 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1246 #: erpnext/accounts/report/purchase_register/purchase_register.py:230 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill Date" @@ -8354,7 +8362,7 @@ msgstr "" #. Label of the bill_no (Data) field in DocType 'Journal Entry' #. Label of the bill_no (Data) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1213 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1245 #: erpnext/accounts/report/purchase_register/purchase_register.py:229 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill No" @@ -8369,7 +8377,7 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Workspace Sidebar Item -#: erpnext/manufacturing/doctype/bom/bom.py:1373 +#: erpnext/manufacturing/doctype/bom/bom.py:1394 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.js:142 #: erpnext/stock/doctype/stock_entry/stock_entry.js:772 @@ -8473,7 +8481,7 @@ msgstr "" msgid "Billing Address Name" msgstr "" -#: erpnext/controllers/accounts_controller.py:598 +#: erpnext/controllers/accounts_controller.py:617 msgid "Billing Address does not belong to the {0}" msgstr "" @@ -8721,12 +8729,6 @@ msgstr "" msgid "Block Supplier" msgstr "" -#. Description of the 'Restrict Customer Over Billing' (Check) field in DocType -#. 'Accounts Settings' -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Block a new Sales Invoice when the customer's overdue amount exceeds the Overdue Limit set on the customer." -msgstr "" - #. Description of the 'Is Frozen' (Check) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Blocks all further accounting entries on this customer's account. Only users with the frozen-entries role can override.\n" @@ -8747,6 +8749,12 @@ msgstr "" msgid "Blood Group" msgstr "" +#. Label of the body (Text Editor) field in DocType 'Process Statement Of +#. Accounts' +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json +msgid "Body" +msgstr "" + #. Label of the body_text (Text Editor) field in DocType 'Dunning' #. Label of the body_text (Text Editor) field in DocType 'Dunning Letter Text' #: erpnext/accounts/doctype/dunning/dunning.json @@ -9225,6 +9233,7 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a shortcut in the ERPNext Settings Workspace #. Label of a Workspace Sidebar Item +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:362 #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json @@ -9571,7 +9580,7 @@ msgstr "" msgid "Can be approved by {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2852 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2829 msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state." msgstr "" @@ -9605,7 +9614,7 @@ msgid "Can only make payment against unbilled {0}" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1510 -#: erpnext/controllers/accounts_controller.py:3221 +#: erpnext/controllers/accounts_controller.py:3257 #: erpnext/public/js/controllers/accounts.js:100 msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'" msgstr "" @@ -9643,7 +9652,7 @@ msgstr "" msgid "Cancelation Date" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1521 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1618 msgid "Cancelled Job Card cannot be processed." msgstr "" @@ -9714,11 +9723,11 @@ msgstr "" msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1246 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1228 msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "" -#: erpnext/stock/stock_ledger.py:206 +#: erpnext/stock/stock_ledger.py:208 msgid "Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet." msgstr "" @@ -9730,11 +9739,11 @@ msgstr "" msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "" -#: erpnext/controllers/buying_controller.py:1219 +#: erpnext/controllers/buying_controller.py:1227 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:680 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:685 msgid "Cannot cancel transaction for Completed Work Order." msgstr "" @@ -9762,7 +9771,7 @@ msgstr "" msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "" -#: erpnext/projects/doctype/task/task.py:148 +#: erpnext/projects/doctype/task/task.py:164 msgid "Cannot complete task {0} as its dependant task {1} are not completed / cancelled." msgstr "" @@ -9786,11 +9795,11 @@ msgstr "" msgid "Cannot create Intercompany {0}. All items in the source {1} have already been fully invoiced. Please check the existing linked {2}s." msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1011 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1015 msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1905 +#: erpnext/selling/doctype/sales_order/sales_order.py:1937 #: erpnext/stock/doctype/pick_list/pick_list.py:260 msgid "Cannot create a pick list for Sales Order {0} because it has reserved stock. Please unreserve the stock in order to create a pick list." msgstr "" @@ -9803,7 +9812,7 @@ msgstr "" msgid "Cannot create return for consolidated invoice {0}." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1211 +#: erpnext/manufacturing/doctype/bom/bom.py:1232 msgid "Cannot deactivate or cancel BOM as it is linked with other BOMs" msgstr "" @@ -9824,7 +9833,7 @@ msgstr "" msgid "Cannot delete Serial No {0}, as it is used in stock transactions" msgstr "" -#: erpnext/controllers/accounts_controller.py:3871 +#: erpnext/controllers/accounts_controller.py:3907 msgid "Cannot delete an item which has been ordered" msgstr "" @@ -9841,7 +9850,7 @@ msgstr "" msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." msgstr "" -#: erpnext/setup/doctype/company/company.py:564 +#: erpnext/setup/doctype/company/company.py:565 msgid "Cannot disable perpetual inventory, as there are existing Stock Ledger Entries for the company {0}. Please cancel the stock transactions first and try again." msgstr "" @@ -9849,11 +9858,11 @@ msgstr "" msgid "Cannot disable {0} as it may lead to incorrect stock valuation." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:858 +#: erpnext/manufacturing/doctype/work_order/work_order.py:837 msgid "Cannot disassemble more than produced quantity." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1045 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1050 msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "" @@ -9865,8 +9874,8 @@ msgstr "" msgid "Cannot enable Opportunity creation from Contact Us because the Contact Us form is disabled." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:781 -#: erpnext/selling/doctype/sales_order/sales_order.py:804 +#: erpnext/selling/doctype/sales_order/sales_order.py:782 +#: erpnext/selling/doctype/sales_order/sales_order.py:805 msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "" @@ -9882,7 +9891,7 @@ msgstr "" msgid "Cannot find Item with this Barcode" msgstr "" -#: erpnext/controllers/accounts_controller.py:3810 +#: erpnext/controllers/accounts_controller.py:3846 msgid "Cannot find a default warehouse for item {0}. Please select one in the Update Items dialog, or set a default in the Item Master or in Stock Settings." msgstr "" @@ -9890,15 +9899,15 @@ msgstr "" msgid "Cannot merge {0} '{1}' into '{2}' as both have existing accounting entries in different currencies for company '{3}'." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:647 +#: erpnext/manufacturing/doctype/work_order/work_order.py:650 msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1620 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1602 msgid "Cannot produce more item for {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1624 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1606 msgid "Cannot produce more than {0} items for {1}" msgstr "" @@ -9906,12 +9915,12 @@ msgstr "" msgid "Cannot receive from customer against negative outstanding" msgstr "" -#: erpnext/controllers/accounts_controller.py:4020 +#: erpnext/controllers/accounts_controller.py:4056 msgid "Cannot reduce quantity than ordered or purchased quantity" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1523 -#: erpnext/controllers/accounts_controller.py:3236 +#: erpnext/controllers/accounts_controller.py:3272 #: erpnext/public/js/controllers/accounts.js:117 msgid "Cannot refer row number greater than or equal to current row number for this Charge type" msgstr "" @@ -9935,9 +9944,9 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1516 #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1694 #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1848 -#: erpnext/controllers/accounts_controller.py:3226 +#: erpnext/controllers/accounts_controller.py:3262 #: erpnext/public/js/controllers/accounts.js:109 -#: erpnext/public/js/controllers/taxes_and_totals.js:570 +#: erpnext/public/js/controllers/taxes_and_totals.js:589 msgid "Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row" msgstr "" @@ -9953,11 +9962,11 @@ msgstr "" msgid "Cannot set multiple Item Defaults for a company." msgstr "" -#: erpnext/controllers/accounts_controller.py:3986 +#: erpnext/controllers/accounts_controller.py:4022 msgid "Cannot set quantity less than delivered quantity." msgstr "" -#: erpnext/controllers/accounts_controller.py:3987 +#: erpnext/controllers/accounts_controller.py:4023 msgid "Cannot set quantity less than received quantity." msgstr "" @@ -9969,11 +9978,11 @@ msgstr "" msgid "Cannot start deletion. Another deletion {0} is already queued/running. Please wait for it to complete." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:874 +#: erpnext/manufacturing/doctype/job_card/job_card.py:879 msgid "Cannot submit Job Card {0} while it is On Hold. Please resume and complete the job before submission." msgstr "" -#: erpnext/controllers/accounts_controller.py:4014 +#: erpnext/controllers/accounts_controller.py:4050 msgid "Cannot update rate as item {0} is already ordered or purchased against this quotation" msgstr "" @@ -10006,7 +10015,7 @@ msgstr "" msgid "Capacity Planning" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1232 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1214 msgid "Capacity Planning Error, planned start time can not be same as end time" msgstr "" @@ -10154,7 +10163,7 @@ msgstr "" msgid "Cash In Hand" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:339 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:379 msgid "Cash or Bank Account is mandatory for making payment entry" msgstr "" @@ -10388,7 +10397,7 @@ msgid "Channel Partner" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2277 -#: erpnext/controllers/accounts_controller.py:3289 +#: erpnext/controllers/accounts_controller.py:3325 msgid "Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount" msgstr "" @@ -10582,7 +10591,7 @@ msgstr "" #. Label of the reference_date (Date) field in DocType 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json -#: erpnext/public/js/controllers/transaction.js:2812 +#: erpnext/public/js/controllers/transaction.js:2813 msgid "Cheque/Reference Date" msgstr "" @@ -10640,7 +10649,7 @@ msgstr "" #. Label of the child_row_reference (Data) field in DocType 'Quality #. Inspection' -#: erpnext/public/js/controllers/transaction.js:2907 +#: erpnext/public/js/controllers/transaction.js:2908 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Child Row Reference" msgstr "" @@ -10649,7 +10658,7 @@ msgstr "" msgid "Child Table Not Allowed" msgstr "" -#: erpnext/projects/doctype/task/task.py:332 +#: erpnext/projects/doctype/task/task.py:348 msgid "Child Task exists for this Task. You can not delete this Task." msgstr "" @@ -10663,11 +10672,11 @@ msgstr "" msgid "Child tables that will also be deleted" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:103 +#: erpnext/stock/doctype/warehouse/warehouse.py:123 msgid "Child warehouse exists for this warehouse. You can not delete this warehouse." msgstr "" -#: erpnext/projects/doctype/task/task.py:263 +#: erpnext/projects/doctype/task/task.py:279 msgid "Circular Reference Error" msgstr "" @@ -10847,11 +10856,11 @@ msgstr "" msgid "Closed Period" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2775 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2751 msgid "Closed Work Order can not be stopped or Re-opened" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:540 +#: erpnext/selling/doctype/sales_order/sales_order.py:541 msgid "Closed order cannot be cancelled. Unclose to cancel." msgstr "" @@ -11686,11 +11695,11 @@ msgstr "" msgid "Company Address Name" msgstr "" -#: erpnext/controllers/accounts_controller.py:4450 +#: erpnext/controllers/accounts_controller.py:4486 msgid "Company Address is missing. You don't have permission to create an Address. Please contact your System Manager." msgstr "" -#: erpnext/controllers/accounts_controller.py:4438 +#: erpnext/controllers/accounts_controller.py:4474 msgid "Company Address is missing. You don't have permission to update it. Please contact your System Manager." msgstr "" @@ -11910,7 +11919,8 @@ msgstr "" msgid "Competitors" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:663 +#: erpnext/manufacturing/doctype/job_card/job_card.js:412 +#: erpnext/manufacturing/doctype/job_card/job_card.js:673 #: erpnext/manufacturing/doctype/workstation/workstation.js:151 msgid "Complete Job" msgstr "" @@ -11933,7 +11943,7 @@ msgstr "" msgid "Completed On" msgstr "" -#: erpnext/projects/doctype/task/task.py:188 +#: erpnext/projects/doctype/task/task.py:204 msgid "Completed On cannot be greater than Today" msgstr "" @@ -11957,16 +11967,23 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1538 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1520 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:258 -#: erpnext/manufacturing/doctype/job_card/job_card.js:392 +#: erpnext/manufacturing/doctype/job_card/job_card.js:265 #: erpnext/manufacturing/doctype/workstation/workstation.js:296 msgid "Completed Quantity" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.py:1678 +msgid "Completed Quantity ({0}), Pending Quantity ({1}) and Process Loss Quantity ({2}) must add up to the Qty to Manufacture ({3})." +msgstr "" + +#: erpnext/manufacturing/doctype/job_card/job_card.js:282 +msgid "Completed Quantity cannot be greater than {0}" +msgstr "" + #: erpnext/projects/report/project_summary/project_summary.py:136 #: erpnext/public/js/templates/crm_activities.html:64 msgid "Completed Tasks" @@ -11982,6 +11999,10 @@ msgstr "" msgid "Completed Work Orders" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.js:255 +msgid "Completed, Pending and Process Loss quantities must add up to this." +msgstr "" + #: erpnext/projects/report/project_summary/project_summary.py:73 msgid "Completion" msgstr "" @@ -12000,7 +12021,7 @@ msgstr "" msgid "Completion Date" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:86 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:87 msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly." msgstr "" @@ -12351,7 +12372,7 @@ msgstr "" msgid "Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1944 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1920 msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}" msgstr "" @@ -12370,7 +12391,7 @@ msgstr "" msgid "Consumed Stock Items" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:289 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:315 msgid "Consumed Stock Items, Consumed Asset Items or Consumed Service Items is mandatory for Capitalization" msgstr "" @@ -12380,7 +12401,7 @@ msgstr "" msgid "Consumed Stock Total Value" msgstr "" -#: erpnext/stock/doctype/stock_entry_type/stock_entry_type.py:136 +#: erpnext/stock/doctype/stock_entry_type/stock_entry_type.py:138 msgid "Consumed quantity of item {0} exceeds transferred quantity." msgstr "" @@ -12508,7 +12529,7 @@ msgstr "" msgid "Contact Person" msgstr "" -#: erpnext/controllers/accounts_controller.py:610 +#: erpnext/controllers/accounts_controller.py:629 msgid "Contact Person does not belong to the {0}" msgstr "" @@ -12710,15 +12731,15 @@ msgstr "" msgid "Conversion factor for item {0} has been reset to 1.0 as the uom {1} is same as stock uom {2}." msgstr "" -#: erpnext/controllers/accounts_controller.py:3004 +#: erpnext/controllers/accounts_controller.py:3040 msgid "Conversion rate cannot be 0" msgstr "" -#: erpnext/controllers/accounts_controller.py:3011 +#: erpnext/controllers/accounts_controller.py:3047 msgid "Conversion rate is 1.00, but document currency is different from company currency" msgstr "" -#: erpnext/controllers/accounts_controller.py:3007 +#: erpnext/controllers/accounts_controller.py:3043 msgid "Conversion rate must be 1.00 if document currency is same as company currency" msgstr "" @@ -12795,13 +12816,13 @@ msgstr "" msgid "Corrective Action" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:446 +#: erpnext/manufacturing/doctype/job_card/job_card.js:457 msgid "Corrective Job Card" msgstr "" #. Label of the corrective_operation_section (Tab Break) field in DocType 'Job #. Card' -#: erpnext/manufacturing/doctype/job_card/job_card.js:455 +#: erpnext/manufacturing/doctype/job_card/job_card.js:466 #: erpnext/manufacturing/doctype/job_card/job_card.json msgid "Corrective Operation" msgstr "" @@ -12968,7 +12989,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:28 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:47 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:30 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1199 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1231 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:47 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.js:42 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:204 @@ -12981,7 +13002,7 @@ msgstr "" #: erpnext/accounts/report/purchase_register/purchase_register.js:46 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:29 #: erpnext/accounts/report/sales_register/sales_register.js:52 -#: erpnext/accounts/report/sales_register/sales_register.py:266 +#: erpnext/accounts/report/sales_register/sales_register.py:275 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:79 #: erpnext/accounts/report/trial_balance/trial_balance.js:49 #: erpnext/assets/doctype/asset/asset.json @@ -13072,8 +13093,8 @@ msgstr "" msgid "Cost Center is required" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1508 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:898 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1548 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:902 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "" @@ -13119,7 +13140,7 @@ msgstr "" msgid "Cost Per Unit" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:442 +#: erpnext/manufacturing/doctype/bom/bom.py:470 msgid "Cost allocation between finished goods and secondary items should equal 100%" msgstr "" @@ -13155,7 +13176,7 @@ msgstr "" msgid "Cost of Goods Sold" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:924 msgid "Cost of Goods Sold Account in Items Table" msgstr "" @@ -13775,7 +13796,7 @@ msgstr "" msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2095 +#: erpnext/stock/stock_ledger.py:2097 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -13835,7 +13856,7 @@ msgstr "" msgid "Creates an Item Price automatically when the item is saved" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:140 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:128 msgid "Creating Accounts..." msgstr "" @@ -13953,7 +13974,7 @@ msgstr "" #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:431 #: erpnext/accounts/report/general_ledger/general_ledger.html:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:257 -#: erpnext/accounts/report/sales_register/sales_register.py:291 +#: erpnext/accounts/report/sales_register/sales_register.py:300 #: erpnext/accounts/report/trial_balance/trial_balance.py:530 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:212 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.py:34 @@ -14083,7 +14104,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:176 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1223 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1255 #: erpnext/controllers/sales_and_purchase_return.py:473 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:306 #: erpnext/stock/doctype/delivery_note/delivery_note.js:89 @@ -14117,9 +14138,9 @@ msgstr "" #. Label of the credit_to (Link) field in DocType 'Purchase Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:393 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:401 -#: erpnext/controllers/accounts_controller.py:2408 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:433 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:441 +#: erpnext/controllers/accounts_controller.py:2444 msgid "Credit To" msgstr "" @@ -14197,7 +14218,7 @@ msgstr "" msgid "Criteria weights must add up to 100%" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:195 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:196 msgid "Cron Interval should be between 1 and 59 Min" msgstr "" @@ -14334,7 +14355,7 @@ msgstr "" msgid "Currency of the Closing Account must be {0}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:724 +#: erpnext/manufacturing/doctype/bom/bom.py:752 msgid "Currency of the price list {0} must be {1} or {2}" msgstr "" @@ -14620,7 +14641,7 @@ msgstr "" #: erpnext/accounts/report/pos_register/pos_register.py:120 #: erpnext/accounts/report/pos_register/pos_register.py:181 #: erpnext/accounts/report/sales_register/sales_register.js:21 -#: erpnext/accounts/report/sales_register/sales_register.py:201 +#: erpnext/accounts/report/sales_register/sales_register.py:210 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier/supplier.js:225 @@ -14782,7 +14803,7 @@ msgstr "" #. Label of the customer_contact_display (Small Text) field in DocType #. 'Purchase Order' #. Label of the customer_contact (Small Text) field in DocType 'Delivery Stop' -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1193 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1225 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/stock/doctype/delivery_stop/delivery_stop.json msgid "Customer Contact" @@ -14888,7 +14909,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:115 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1251 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1283 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:96 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:185 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:56 @@ -14896,7 +14917,7 @@ msgstr "" #: erpnext/accounts/report/gross_profit/gross_profit.py:425 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:208 #: erpnext/accounts/report/sales_register/sales_register.js:27 -#: erpnext/accounts/report/sales_register/sales_register.py:216 +#: erpnext/accounts/report/sales_register/sales_register.py:225 #: erpnext/controllers/trends.py:448 #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/doctype/prospect/prospect.json @@ -14950,7 +14971,7 @@ msgstr "" msgid "Customer Items" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1242 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1274 msgid "Customer LPO" msgstr "" @@ -15002,13 +15023,13 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1182 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1214 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:92 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:35 #: erpnext/accounts/report/gross_profit/gross_profit.py:432 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:228 -#: erpnext/accounts/report/sales_register/sales_register.py:207 +#: erpnext/accounts/report/sales_register/sales_register.py:216 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/controllers/trends.py:428 #: erpnext/crm/doctype/opportunity/opportunity.json @@ -15109,7 +15130,7 @@ msgstr "" msgid "Customer Provided Item Cost" msgstr "" -#: erpnext/setup/doctype/company/company.py:490 +#: erpnext/setup/doctype/company/company.py:491 msgid "Customer Service" msgstr "" @@ -15167,7 +15188,7 @@ msgid "Customer required for 'Customerwise Discount'" msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1196 -#: erpnext/selling/doctype/sales_order/sales_order.py:436 +#: erpnext/selling/doctype/sales_order/sales_order.py:437 #: erpnext/stock/doctype/delivery_note/delivery_note.py:407 msgid "Customer {0} does not belong to project {1}" msgstr "" @@ -15530,7 +15551,7 @@ msgstr "" #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:424 #: erpnext/accounts/report/general_ledger/general_ledger.html:166 #: erpnext/accounts/report/purchase_register/purchase_register.py:256 -#: erpnext/accounts/report/sales_register/sales_register.py:290 +#: erpnext/accounts/report/sales_register/sales_register.py:299 #: erpnext/accounts/report/trial_balance/trial_balance.py:523 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:205 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.py:27 @@ -15593,7 +15614,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:178 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1226 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1258 #: erpnext/controllers/sales_and_purchase_return.py:477 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:307 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:45 @@ -15623,7 +15644,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1067 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1078 -#: erpnext/controllers/accounts_controller.py:2408 +#: erpnext/controllers/accounts_controller.py:2444 msgid "Debit To" msgstr "" @@ -15807,15 +15828,15 @@ msgstr "" msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2536 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2512 msgid "Default BOM for {0} not found" msgstr "" -#: erpnext/controllers/accounts_controller.py:4058 +#: erpnext/controllers/accounts_controller.py:4094 msgid "Default BOM not found for FG Item {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2533 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2509 msgid "Default BOM not found for Item {0} and Project {1}" msgstr "" @@ -16603,7 +16624,7 @@ msgstr "" #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js:22 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:21 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:291 -#: erpnext/accounts/report/sales_register/sales_register.py:259 +#: erpnext/accounts/report/sales_register/sales_register.py:268 #: erpnext/selling/doctype/sales_order/sales_order.js:1048 #: erpnext/selling/doctype/sales_order/sales_order_list.js:81 #: erpnext/selling/doctype/selling_settings/selling_settings.js:52 @@ -16663,7 +16684,7 @@ msgstr "" msgid "Delivery Note {0} is not submitted" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1246 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1278 #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:75 msgid "Delivery Notes" msgstr "" @@ -16753,7 +16774,7 @@ msgstr "" #. DocType 'Master Production Schedule' #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py:233 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:313 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:309 #: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:378 msgid "Demand" msgstr "" @@ -16764,7 +16785,7 @@ msgstr "" msgid "Demand Qty" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:325 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:321 #: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:390 msgid "Demand vs Supply" msgstr "" @@ -16810,7 +16831,7 @@ msgstr "" msgid "Dependent Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:181 +#: erpnext/projects/doctype/task/task.py:197 msgid "Dependent Task {0} is not a Template Task" msgstr "" @@ -17129,11 +17150,11 @@ msgstr "" msgid "Difference Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:908 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:913 msgid "Difference Account in Items Table" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:897 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:902 msgid "Difference Account must be a Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" msgstr "" @@ -17265,6 +17286,12 @@ msgstr "" msgid "Direct return is not allowed for Timesheet." msgstr "" +#. Label of the disable_include_dimensions (Check) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Disable \"Consider Accounting Dimension\" Filter" +msgstr "" + #. Label of the disable_capacity_planning (Check) field in DocType #. 'Manufacturing Settings' #: erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json @@ -17355,7 +17382,7 @@ msgstr "" msgid "Disabled items cannot be selected in any transaction." msgstr "" -#: erpnext/controllers/accounts_controller.py:936 +#: erpnext/controllers/accounts_controller.py:972 msgid "Disabled pricing rules since this {} is an internal transfer" msgstr "" @@ -17364,7 +17391,7 @@ msgstr "" msgid "Disabled suppliers are hidden from selection in new transactions but remain in historical records" msgstr "" -#: erpnext/controllers/accounts_controller.py:950 +#: erpnext/controllers/accounts_controller.py:986 msgid "Disabled tax included prices since this {} is an internal transfer" msgstr "" @@ -17392,7 +17419,7 @@ msgstr "" msgid "Disassemble Order" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2776 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2846 msgid "Disassemble Qty cannot be less than or equal to 0." msgstr "" @@ -17434,7 +17461,7 @@ msgstr "" msgid "Discount" msgstr "" -#: erpnext/selling/page/point_of_sale/pos_item_details.js:177 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:188 msgid "Discount (%)" msgstr "" @@ -17683,7 +17710,7 @@ msgstr "" msgid "Dislikes" msgstr "" -#: erpnext/setup/doctype/company/company.py:484 +#: erpnext/setup/doctype/company/company.py:485 msgid "Dispatch" msgstr "" @@ -17971,7 +17998,7 @@ msgstr "" msgid "Do you want to submit the material request" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:108 +#: erpnext/manufacturing/doctype/job_card/job_card.js:113 msgid "Do you want to submit the stock entry?" msgstr "" @@ -18085,7 +18112,7 @@ msgstr "" msgid "Double Declining Balance" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:246 +#: erpnext/public/js/utils/serial_no_batch_selector.js:256 msgid "Download CSV Template" msgstr "" @@ -18332,7 +18359,7 @@ msgstr "" msgid "Duplicate Sales Invoices found" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1568 +#: erpnext/stock/serial_batch_bundle.py:1571 msgid "Duplicate Serial Number Error" msgstr "" @@ -18583,7 +18610,7 @@ msgstr "" msgid "Either target qty or target amount is mandatory." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:677 +#: erpnext/manufacturing/doctype/job_card/job_card.js:687 msgid "Elapsed Time" msgstr "" @@ -18900,7 +18927,7 @@ msgstr "" msgid "Employee {0} does not belong to the company {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:377 +#: erpnext/manufacturing/doctype/job_card/job_card.py:379 msgid "Employee {0} is currently working on another workstation. Please assign another employee." msgstr "" @@ -18925,7 +18952,7 @@ msgstr "" msgid "Ems(Pica)" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2970 +#: erpnext/public/js/controllers/transaction.js:2971 msgid "Enable {0} on the Item master to proceed with {1} inspection." msgstr "" @@ -19240,6 +19267,12 @@ msgstr "" msgid "Enabling this ensures each Purchase Invoice has a unique value in Supplier Invoice No. field within a particular fiscal year" msgstr "" +#. Description of the 'Prevent Sales Invoice when Customer is Overdue' (Check) +#. field in DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enabling this option prevents the creation of a new Sales Invoice when the customer has an overdue limit set and their outstanding overdue amount exceeds that limit." +msgstr "" + #. Description of the 'Book Advance Payments in Separate Party Account' (Check) #. field in DocType 'Company' #: erpnext/setup/doctype/company/company.json @@ -19281,8 +19314,7 @@ msgstr "" #. Label of the end_time (Time) field in DocType 'Stock Reposting Settings' #. Label of the end_time (Time) field in DocType 'Service Day' #. Label of the end_time (Datetime) field in DocType 'Call Log' -#: erpnext/manufacturing/doctype/job_card/job_card.js:331 -#: erpnext/manufacturing/doctype/job_card/job_card.js:399 +#: erpnext/manufacturing/doctype/job_card/job_card.js:383 #: erpnext/manufacturing/doctype/workstation_working_hour/workstation_working_hour.json #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json #: erpnext/support/doctype/service_day/service_day.json @@ -19373,16 +19405,14 @@ msgstr "" msgid "Enter First and Last name of Employee, based on Which Full Name will be updated. IN transactions, it will be Full Name which will be fetched." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:212 +#: erpnext/public/js/utils/serial_no_batch_selector.js:222 msgid "Enter Manually" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:290 +#: erpnext/public/js/utils/serial_no_batch_selector.js:300 msgid "Enter Serial Nos" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:360 -#: erpnext/manufacturing/doctype/job_card/job_card.js:422 #: erpnext/manufacturing/doctype/workstation/workstation.js:312 msgid "Enter Value" msgstr "" @@ -19431,7 +19461,7 @@ msgstr "" msgid "Enter discount percentage." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:293 +#: erpnext/public/js/utils/serial_no_batch_selector.js:303 msgid "Enter each serial no in a new line" msgstr "" @@ -19648,7 +19678,7 @@ msgstr "" msgid "Example: If the transaction amount is 200, then this will be calculated as {} = {}" msgstr "" -#: erpnext/stock/stock_ledger.py:2377 +#: erpnext/stock/stock_ledger.py:2379 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -19658,11 +19688,11 @@ msgstr "" msgid "Exception Budget Approver Role" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1052 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1057 msgid "Excess Disassembly" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1348 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1418 msgid "Excess Material Transfer" msgstr "" @@ -19670,7 +19700,7 @@ msgstr "" msgid "Excess Materials Consumed" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1167 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1177 msgid "Excess Transfer" msgstr "" @@ -19706,12 +19736,12 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:677 +#: erpnext/setup/doctype/company/company.py:678 msgid "Exchange Gain/Loss" msgstr "" -#: erpnext/controllers/accounts_controller.py:1809 -#: erpnext/controllers/accounts_controller.py:1894 +#: erpnext/controllers/accounts_controller.py:1845 +#: erpnext/controllers/accounts_controller.py:1930 msgid "Exchange Gain/Loss amount has been booked through {0}" msgstr "" @@ -19803,6 +19833,10 @@ msgstr "" msgid "Exchange Rate must be same as {0} {1} ({2})" msgstr "" +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:356 +msgid "Exchange rate {0} does not match the exchange rate of Purchase Receipt {1}. Use the same exchange rate as the Purchase Receipt or enable {2} in {3} to adjust the landed cost based on this invoice." +msgstr "" + #. Option for the 'Entry Type' (Select) field in DocType 'Journal Entry' #. Option for the 'Journal Entry Type' (Select) field in DocType 'Journal Entry #. Template' @@ -19937,7 +19971,7 @@ msgstr "" msgid "Expected Delivery Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:417 +#: erpnext/selling/doctype/sales_order/sales_order.py:418 msgid "Expected Delivery Date should be after Sales Order Date" msgstr "" @@ -20013,7 +20047,7 @@ msgstr "" #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.json -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:611 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:651 #: erpnext/accounts/report/account_balance/account_balance.js:28 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:89 #: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:192 @@ -20021,7 +20055,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/controllers/stock_controller.py:1081 +#: erpnext/controllers/stock_controller.py:1090 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -20069,7 +20103,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/controllers/stock_controller.py:1061 +#: erpnext/controllers/stock_controller.py:1070 msgid "Expense Account Missing" msgstr "" @@ -20084,13 +20118,13 @@ msgstr "" msgid "Expense Head" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:505 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:529 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:549 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:545 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:569 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:589 msgid "Expense Head Changed" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:607 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:647 msgid "Expense account is mandatory for item {0}" msgstr "" @@ -20122,7 +20156,7 @@ msgstr "" msgid "Expenses Added To Stock Contra Account" msgstr "" -#: erpnext/controllers/stock_controller.py:934 +#: erpnext/controllers/stock_controller.py:943 msgid "Expenses Added To Stock for Item {0}" msgstr "" @@ -20216,7 +20250,7 @@ msgstr "" msgid "Extra Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:264 +#: erpnext/manufacturing/doctype/job_card/job_card.py:266 msgid "Extra Job Card Quantity" msgstr "" @@ -20354,7 +20388,7 @@ msgstr "" msgid "Failed to setup defaults" msgstr "" -#: erpnext/setup/doctype/company/company.py:859 +#: erpnext/setup/doctype/company/company.py:860 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "" @@ -20417,7 +20451,7 @@ msgstr "" msgid "Fees" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:395 +#: erpnext/public/js/utils/serial_no_batch_selector.js:405 msgid "Fetch Based On" msgstr "" @@ -20481,7 +20515,7 @@ msgstr "" msgid "Fetched automatically on sales orders and invoices for this customer." msgstr "" -#: erpnext/selling/page/point_of_sale/pos_item_details.js:457 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:468 msgid "Fetched only {0} available serial numbers." msgstr "" @@ -20494,7 +20528,7 @@ msgid "Fetching Sales Orders..." msgstr "" #: erpnext/accounts/doctype/dunning/dunning.js:135 -#: erpnext/public/js/controllers/transaction.js:1619 +#: erpnext/public/js/controllers/transaction.js:1620 msgid "Fetching exchange rates ..." msgstr "" @@ -20807,15 +20841,15 @@ msgstr "" msgid "Finished Good Item Quantity" msgstr "" -#: erpnext/controllers/accounts_controller.py:4044 +#: erpnext/controllers/accounts_controller.py:4080 msgid "Finished Good Item is not specified for service item {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:4061 +#: erpnext/controllers/accounts_controller.py:4097 msgid "Finished Good Item {0} Qty can not be zero" msgstr "" -#: erpnext/controllers/accounts_controller.py:4055 +#: erpnext/controllers/accounts_controller.py:4091 msgid "Finished Good Item {0} must be a sub-contracted item" msgstr "" @@ -20902,11 +20936,11 @@ msgstr "" msgid "Finished Goods based Operating Cost" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2102 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2172 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1069 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1074 msgid "Finished good quantity being consumed ({0} in stock UOM) must equal the quantity to disassemble ({1}). Do not change the UOM, conversion factor or quantity of the finished good row." msgstr "" @@ -21077,7 +21111,7 @@ msgstr "" msgid "Fixed Asset Turnover Ratio" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:781 +#: erpnext/manufacturing/doctype/bom/bom.py:809 msgid "Fixed Asset item {0} cannot be used in BOMs." msgstr "" @@ -21155,7 +21189,7 @@ msgstr "" msgid "Following Material Requests have been raised automatically based on Item's re-order level" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:967 +#: erpnext/selling/doctype/customer/customer.py:968 msgid "Following fields are mandatory to create address:" msgstr "" @@ -21212,7 +21246,7 @@ msgstr "" msgid "For Item" msgstr "" -#: erpnext/controllers/stock_controller.py:1783 +#: erpnext/controllers/stock_controller.py:1792 msgid "For Item {0} cannot be received more than {1} qty against the {2} {3}" msgstr "" @@ -21222,7 +21256,7 @@ msgid "For Job Card" msgstr "" #. Label of the for_operation (Link) field in DocType 'Job Card' -#: erpnext/manufacturing/doctype/job_card/job_card.js:464 +#: erpnext/manufacturing/doctype/job_card/job_card.js:475 #: erpnext/manufacturing/doctype/job_card/job_card.json msgid "For Operation" msgstr "" @@ -21247,7 +21281,7 @@ msgstr "" msgid "For Production" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1019 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1024 msgid "For Quantity (Manufactured Qty) is mandatory" msgstr "" @@ -21257,7 +21291,7 @@ msgstr "" msgid "For Raw Materials" msgstr "" -#: erpnext/controllers/accounts_controller.py:1474 +#: erpnext/controllers/accounts_controller.py:1510 msgid "For Return Invoices with Stock effect, '0' qty Items are not allowed. Following rows are affected: {0}" msgstr "" @@ -21281,15 +21315,15 @@ msgstr "" msgid "For Warehouse" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:136 +#: erpnext/public/js/utils/serial_no_batch_selector.js:146 msgid "For Work Order" msgstr "" -#: erpnext/controllers/status_updater.py:292 +#: erpnext/controllers/status_updater.py:295 msgid "For an item {0}, quantity must be negative number" msgstr "" -#: erpnext/controllers/status_updater.py:289 +#: erpnext/controllers/status_updater.py:292 msgid "For an item {0}, quantity must be positive number" msgstr "" @@ -21337,11 +21371,11 @@ msgstr "" msgid "For legacy serial nos, do not fetch incoming rate from serial no and calculate it based on the inward transaction" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:368 +#: erpnext/manufacturing/doctype/bom/bom.py:396 msgid "For operation {0} at row {1}, please add raw materials or set a BOM against it." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2922 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2899 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})" msgstr "" @@ -21358,7 +21392,7 @@ msgstr "" msgid "For projected and forecast quantities, the system will consider all child warehouses under the selected parent warehouse." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2134 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2204 msgid "For quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -21391,16 +21425,16 @@ msgstr "" msgid "For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1279 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1284 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." msgstr "" -#: erpnext/public/js/controllers/transaction.js:1429 +#: erpnext/public/js/controllers/transaction.js:1430 msgctxt "Clear payment terms template and/or payment schedule when due date is changed" msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "" -#: erpnext/controllers/stock_controller.py:502 +#: erpnext/controllers/stock_controller.py:511 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" @@ -21995,13 +22029,13 @@ msgid "Further nodes can be only created under 'Group' type nodes" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:188 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1238 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1270 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:177 msgid "Future Payment Amount" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:187 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1237 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1269 msgid "Future Payment Ref" msgstr "" @@ -22092,7 +22126,7 @@ msgstr "" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:134 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:220 -#: erpnext/setup/doctype/company/company.py:685 +#: erpnext/setup/doctype/company/company.py:686 msgid "Gain/Loss on Asset Disposal" msgstr "" @@ -22149,6 +22183,12 @@ msgctxt "Warehouse" msgid "General Ledger" msgstr "" +#. Label of the remarks_section (Section Break) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "General Ledger Report" +msgstr "" + #. Label of the general_ledger_remarks_length (Int) field in DocType 'Accounts #. Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -22561,7 +22601,7 @@ msgstr "" msgid "Goods Transferred" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2703 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2773 msgid "Goods are already received against the outward entry {0}" msgstr "" @@ -22691,7 +22731,7 @@ msgstr "" #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/report/pos_register/pos_register.py:202 #: erpnext/accounts/report/purchase_register/purchase_register.py:291 -#: erpnext/accounts/report/sales_register/sales_register.py:319 +#: erpnext/accounts/report/sales_register/sales_register.py:328 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json @@ -23192,7 +23232,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:2080 +#: erpnext/stock/stock_ledger.py:2082 msgid "Here are the options to proceed:" msgstr "" @@ -23427,7 +23467,7 @@ msgstr "" msgid "Hrs" msgstr "" -#: erpnext/setup/doctype/company/company.py:496 +#: erpnext/setup/doctype/company/company.py:497 msgid "Human Resources" msgstr "" @@ -23851,7 +23891,7 @@ msgstr "" msgid "If no taxes are set, and Taxes and Charges Template is selected, the system will automatically apply the taxes from the chosen template." msgstr "" -#: erpnext/stock/stock_ledger.py:2090 +#: erpnext/stock/stock_ledger.py:2092 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -23897,7 +23937,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:2083 +#: erpnext/stock/stock_ledger.py:2085 msgid "If the item is transacting as a Zero Valuation Rate item in this entry, please enable 'Allow Zero Valuation Rate' in the {0} Item table." msgstr "" @@ -24219,7 +24259,7 @@ msgstr "" msgid "Import MT940 Fromat" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:144 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:132 msgid "Import Successful" msgstr "" @@ -24234,7 +24274,7 @@ msgstr "" msgid "Import Supplier Invoice" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:228 +#: erpnext/public/js/utils/serial_no_batch_selector.js:238 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:84 msgid "Import Using CSV file" msgstr "" @@ -24821,7 +24861,7 @@ msgstr "" msgid "Incorrect Company" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1286 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1291 msgid "Incorrect Component Quantity" msgstr "" @@ -25035,14 +25075,14 @@ msgstr "" msgid "Inspected By" msgstr "" -#: erpnext/controllers/stock_controller.py:1677 -#: erpnext/manufacturing/doctype/job_card/job_card.py:834 +#: erpnext/controllers/stock_controller.py:1686 +#: erpnext/manufacturing/doctype/job_card/job_card.py:836 msgid "Inspection Rejected" msgstr "" #. Label of the inspection_required (Check) field in DocType 'Stock Entry' -#: erpnext/controllers/stock_controller.py:1647 -#: erpnext/controllers/stock_controller.py:1649 +#: erpnext/controllers/stock_controller.py:1656 +#: erpnext/controllers/stock_controller.py:1658 #: erpnext/stock/doctype/stock_entry/stock_entry.json msgid "Inspection Required" msgstr "" @@ -25059,8 +25099,8 @@ msgstr "" msgid "Inspection Required before Purchase" msgstr "" -#: erpnext/controllers/stock_controller.py:1662 -#: erpnext/manufacturing/doctype/job_card/job_card.py:815 +#: erpnext/controllers/stock_controller.py:1671 +#: erpnext/manufacturing/doctype/job_card/job_card.py:817 msgid "Inspection Submission" msgstr "" @@ -25129,11 +25169,11 @@ msgstr "" msgid "Insufficient Capacity" msgstr "" -#: erpnext/controllers/accounts_controller.py:3940 -#: erpnext/controllers/accounts_controller.py:3962 -#: erpnext/controllers/accounts_controller.py:4480 -#: erpnext/controllers/accounts_controller.py:4486 -#: erpnext/controllers/accounts_controller.py:4508 +#: erpnext/controllers/accounts_controller.py:3976 +#: erpnext/controllers/accounts_controller.py:3998 +#: erpnext/controllers/accounts_controller.py:4516 +#: erpnext/controllers/accounts_controller.py:4522 +#: erpnext/controllers/accounts_controller.py:4544 msgid "Insufficient Permissions" msgstr "" @@ -25141,13 +25181,13 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:150 #: erpnext/stock/doctype/pick_list/pick_list.py:168 #: erpnext/stock/doctype/pick_list/pick_list.py:1123 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1256 -#: erpnext/stock/serial_batch_bundle.py:1311 erpnext/stock/stock_ledger.py:1771 -#: erpnext/stock/stock_ledger.py:2268 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1261 +#: erpnext/stock/serial_batch_bundle.py:1314 erpnext/stock/stock_ledger.py:1773 +#: erpnext/stock/stock_ledger.py:2270 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2283 +#: erpnext/stock/stock_ledger.py:2285 msgid "Insufficient Stock for Batch" msgstr "" @@ -25310,7 +25350,7 @@ msgstr "" msgid "Internal Purchase Order" msgstr "" -#: erpnext/controllers/accounts_controller.py:836 +#: erpnext/controllers/accounts_controller.py:872 msgid "Internal Sale or Delivery Reference missing." msgstr "" @@ -25318,7 +25358,7 @@ msgstr "" msgid "Internal Sales Order" msgstr "" -#: erpnext/controllers/accounts_controller.py:838 +#: erpnext/controllers/accounts_controller.py:874 msgid "Internal Sales Reference Missing" msgstr "" @@ -25349,7 +25389,7 @@ msgstr "" msgid "Internal Transfer" msgstr "" -#: erpnext/controllers/accounts_controller.py:847 +#: erpnext/controllers/accounts_controller.py:883 msgid "Internal Transfer Reference Missing" msgstr "" @@ -25373,7 +25413,7 @@ msgstr "" msgid "Internal notes about this customer. Not visible on transactions or the portal." msgstr "" -#: erpnext/controllers/stock_controller.py:1744 +#: erpnext/controllers/stock_controller.py:1753 msgid "Internal transfers can only be done in company's default currency" msgstr "" @@ -25387,14 +25427,14 @@ msgstr "" msgid "Interval should be between 1 to 59 MInutes" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:394 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:402 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:434 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:442 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1073 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1083 #: erpnext/assets/doctype/asset_category/asset_category.py:69 #: erpnext/assets/doctype/asset_category/asset_category.py:97 -#: erpnext/controllers/accounts_controller.py:3250 -#: erpnext/controllers/accounts_controller.py:3258 +#: erpnext/controllers/accounts_controller.py:3286 +#: erpnext/controllers/accounts_controller.py:3294 msgid "Invalid Account" msgstr "" @@ -25419,7 +25459,7 @@ msgstr "" msgid "Invalid Attribute Values" msgstr "" -#: erpnext/controllers/accounts_controller.py:650 +#: erpnext/controllers/accounts_controller.py:669 msgid "Invalid Auto Repeat Date" msgstr "" @@ -25432,7 +25472,7 @@ msgstr "" msgid "Invalid Barcode. There is no Item attached to this barcode." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3191 +#: erpnext/public/js/controllers/transaction.js:3192 msgid "Invalid Blanket Order for the selected Customer and Item" msgstr "" @@ -25454,7 +25494,7 @@ msgstr "" #: erpnext/assets/doctype/asset/asset.py:365 #: erpnext/assets/doctype/asset/asset.py:372 -#: erpnext/controllers/accounts_controller.py:3273 +#: erpnext/controllers/accounts_controller.py:3309 msgid "Invalid Cost Center" msgstr "" @@ -25462,16 +25502,16 @@ msgstr "" msgid "Invalid Customer Group" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:419 +#: erpnext/selling/doctype/sales_order/sales_order.py:420 msgid "Invalid Delivery Date" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1108 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1113 msgid "Invalid Disassembly Item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1074 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1123 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1079 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1128 msgid "Invalid Disassembly Quantity" msgstr "" @@ -25479,7 +25519,7 @@ msgstr "" msgid "Invalid Discount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:861 +#: erpnext/controllers/taxes_and_totals.py:900 msgid "Invalid Discount Amount" msgstr "" @@ -25499,8 +25539,8 @@ msgstr "" msgid "Invalid File Type" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:374 -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:379 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:377 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:382 msgid "Invalid Formula" msgstr "" @@ -25561,7 +25601,7 @@ msgstr "" msgid "Invalid Priority" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1276 +#: erpnext/manufacturing/doctype/bom/bom.py:1297 msgid "Invalid Process Loss Configuration" msgstr "" @@ -25569,12 +25609,12 @@ msgstr "" msgid "Invalid Purchase Invoice" msgstr "" -#: erpnext/controllers/accounts_controller.py:3982 -#: erpnext/controllers/accounts_controller.py:3996 +#: erpnext/controllers/accounts_controller.py:4018 +#: erpnext/controllers/accounts_controller.py:4032 msgid "Invalid Qty" msgstr "" -#: erpnext/controllers/accounts_controller.py:1492 +#: erpnext/controllers/accounts_controller.py:1528 msgid "Invalid Quantity" msgstr "" @@ -25582,7 +25622,7 @@ msgstr "" msgid "Invalid Query" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:325 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:328 msgid "Invalid Reading" msgstr "" @@ -25603,12 +25643,12 @@ msgstr "" msgid "Invalid Selling Price" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2177 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2247 msgid "Invalid Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1375 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1397 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1445 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1467 msgid "Invalid Source and Target Warehouse" msgstr "" @@ -25809,7 +25849,7 @@ msgstr "" msgid "Invoice Document Type Selection Error" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1218 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1250 msgid "Invoice Grand Total" msgstr "" @@ -25911,14 +25951,14 @@ msgstr "" msgid "Invoice can't be made for zero billing hour" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1933 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1971 msgid "Invoice is not blocked. Block the invoice to change the release date." msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:171 #: erpnext/accounts/report/accounts_payable/accounts_payable.html:139 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:140 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1220 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1252 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:164 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:194 msgid "Invoiced Amount" @@ -26339,7 +26379,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:68 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:74 msgid "Is Phantom Item" msgstr "" @@ -26626,7 +26666,7 @@ msgstr "" msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "" -#: erpnext/public/js/controllers/transaction.js:2569 +#: erpnext/public/js/controllers/transaction.js:2570 msgid "It is needed to fetch Item Details." msgstr "" @@ -26692,7 +26732,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:33 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:204 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/taxes_and_totals.py:1253 +#: erpnext/controllers/taxes_and_totals.py:1293 #: erpnext/controllers/trends.py:377 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/manufacturing/doctype/bom/bom.js:1092 @@ -26992,7 +27032,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/workstation/workstation.js:471 #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:163 -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:60 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:66 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.js:8 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:103 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:100 @@ -27006,11 +27046,11 @@ msgstr "" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:119 #: erpnext/projects/doctype/timesheet/timesheet.js:216 -#: erpnext/public/js/controllers/transaction.js:2863 +#: erpnext/public/js/controllers/transaction.js:2864 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:596 #: erpnext/public/js/utils.js:754 -#: erpnext/public/js/utils/serial_no_batch_selector.js:96 +#: erpnext/public/js/utils/serial_no_batch_selector.js:106 #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/installation_note_item/installation_note_item.json @@ -27102,12 +27142,12 @@ msgstr "" msgid "Item Code cannot be changed for Serial No." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:461 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:501 msgid "Item Code required at Row No {0}" msgstr "" #: erpnext/selling/page/point_of_sale/pos_controller.js:816 -#: erpnext/selling/page/point_of_sale/pos_item_details.js:277 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:288 msgid "Item Code: {0} is not available under warehouse {1}." msgstr "" @@ -27135,7 +27175,7 @@ msgstr "" #. Label of the item_details (Section Break) field in DocType 'Material Request #. Plan Item' #. Label of the description (Small Text) field in DocType 'Work Order' -#. Label of the item_description (Text) field in DocType 'Item Price' +#. Label of the item_description (Text Editor) field in DocType 'Item Price' #. Label of the item_description (Small Text) field in DocType 'Quick Stock #. Balance' #: erpnext/manufacturing/doctype/bom/bom.json @@ -27483,7 +27523,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.html:8 -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:66 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:72 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:109 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:106 #: erpnext/manufacturing/report/job_card_summary/job_card_summary.py:158 @@ -27493,7 +27533,7 @@ msgstr "" #: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:371 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:92 #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:138 -#: erpnext/public/js/controllers/transaction.js:2869 +#: erpnext/public/js/controllers/transaction.js:2870 #: erpnext/public/js/utils.js:852 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:1286 @@ -27589,8 +27629,8 @@ msgstr "" msgid "Item Price Stock" msgstr "" -#: erpnext/stock/get_item_details.py:1143 -#: erpnext/stock/get_item_details.py:1167 +#: erpnext/stock/get_item_details.py:1228 +#: erpnext/stock/get_item_details.py:1252 msgid "Item Price added for {0} in Price List - {1}" msgstr "" @@ -27602,7 +27642,7 @@ msgstr "" msgid "Item Price created at rate {0}" msgstr "" -#: erpnext/stock/get_item_details.py:1126 +#: erpnext/stock/get_item_details.py:1211 msgid "Item Price updated for {0} in Price List {1}" msgstr "" @@ -27882,7 +27922,7 @@ msgstr "" msgid "Item Wise Tax Details" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:568 +#: erpnext/controllers/taxes_and_totals.py:574 msgid "Item Wise Tax Details do not match with Taxes and Charges at the following rows:" msgstr "" @@ -27902,7 +27942,7 @@ msgstr "" msgid "Item and Warranty Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3891 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4007 msgid "Item for row {0} does not match Material Request" msgstr "" @@ -27914,7 +27954,7 @@ msgstr "" msgid "Item is mandatory in Raw Materials table." msgstr "" -#: erpnext/selling/page/point_of_sale/pos_item_details.js:110 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:121 msgid "Item is removed since no serial / batch no selected." msgstr "" @@ -27932,11 +27972,11 @@ msgstr "" msgid "Item operation" msgstr "" -#: erpnext/controllers/accounts_controller.py:4036 +#: erpnext/controllers/accounts_controller.py:4072 msgid "Item qty can not be updated as raw materials are already processed." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1531 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1601 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "" @@ -27989,11 +28029,11 @@ msgstr "" msgid "Item {0} does not exist" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:709 +#: erpnext/manufacturing/doctype/bom/bom.py:737 msgid "Item {0} does not exist in the system or has expired" msgstr "" -#: erpnext/controllers/stock_controller.py:616 +#: erpnext/controllers/stock_controller.py:625 msgid "Item {0} does not exist." msgstr "" @@ -28009,7 +28049,7 @@ msgstr "" msgid "Item {0} has been disabled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:788 +#: erpnext/selling/doctype/sales_order/sales_order.py:789 msgid "Item {0} has no Serial No. Only serialized items can have delivery based on Serial No" msgstr "" @@ -28057,7 +28097,7 @@ msgstr "" msgid "Item {0} is not a template item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2615 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2685 msgid "Item {0} is not active or end of life has been reached" msgstr "" @@ -28065,11 +28105,11 @@ msgstr "" msgid "Item {0} must be a Fixed Asset Item" msgstr "" -#: erpnext/stock/get_item_details.py:351 +#: erpnext/stock/get_item_details.py:436 msgid "Item {0} must be a Non-Stock Item" msgstr "" -#: erpnext/stock/get_item_details.py:348 +#: erpnext/stock/get_item_details.py:433 msgid "Item {0} must be a Sub-contracted Item" msgstr "" @@ -28077,7 +28117,7 @@ msgstr "" msgid "Item {0} must be a non-stock item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1913 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1983 msgid "Item {0} not found in 'Raw Materials Supplied' table in {1} {2}" msgstr "" @@ -28139,11 +28179,11 @@ msgstr "" msgid "Item-wise sales Register" msgstr "" -#: erpnext/stock/get_item_details.py:731 +#: erpnext/stock/get_item_details.py:816 msgid "Item/Item Code required to get Item Tax Template." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:452 +#: erpnext/manufacturing/doctype/bom/bom.py:480 msgid "Item: {0} does not exist in the system" msgstr "" @@ -28187,11 +28227,11 @@ msgstr "" msgid "Items and Pricing" msgstr "" -#: erpnext/controllers/accounts_controller.py:4294 +#: erpnext/controllers/accounts_controller.py:4330 msgid "Items cannot be updated as Subcontracting Inward Order(s) exist against this Subcontracted Sales Order." msgstr "" -#: erpnext/controllers/accounts_controller.py:4287 +#: erpnext/controllers/accounts_controller.py:4323 msgid "Items cannot be updated as Subcontracting Order is created against the Purchase Order {0}." msgstr "" @@ -28203,7 +28243,7 @@ msgstr "" msgid "Items not found." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1527 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1597 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "" @@ -28278,7 +28318,7 @@ msgstr "" #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/job_card/job_card.json -#: erpnext/manufacturing/doctype/job_card/job_card.py:1030 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1034 #: erpnext/manufacturing/doctype/operation/operation.json #: erpnext/manufacturing/doctype/work_order/work_order.js:408 #: erpnext/manufacturing/doctype/work_order/work_order.json @@ -28307,7 +28347,7 @@ msgstr "" msgid "Job Card Item" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:877 +#: erpnext/manufacturing/doctype/job_card/job_card.py:882 msgid "Job Card On Hold" msgstr "" @@ -28346,10 +28386,14 @@ msgstr "" msgid "Job Card and Capacity Planning" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1561 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1660 msgid "Job Card {0} has been completed" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.py:1451 +msgid "Job Card {0}: As per the sequence of the operations in the work order {1}, submit the manufacturing entry for the operation {2} before the operation {3}." +msgstr "" + #. Label of the dashboard_tab (Tab Break) field in DocType 'Workstation' #: erpnext/manufacturing/doctype/workstation/workstation.json msgid "Job Cards" @@ -28422,7 +28466,7 @@ msgstr "" msgid "Job Worker Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2977 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2954 msgid "Job card {0} created" msgstr "" @@ -28643,7 +28687,7 @@ msgstr "" msgid "Kilowatt-Hour" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1032 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1036 msgid "Kindly cancel the Manufacturing Entries first against the work order {0}." msgstr "" @@ -29632,10 +29676,10 @@ msgstr "" msgid "Machine operator errors" msgstr "" -#: erpnext/setup/doctype/company/company.py:723 -#: erpnext/setup/doctype/company/company.py:738 +#: erpnext/setup/doctype/company/company.py:724 #: erpnext/setup/doctype/company/company.py:739 #: erpnext/setup/doctype/company/company.py:740 +#: erpnext/setup/doctype/company/company.py:741 msgid "Main" msgstr "" @@ -29878,7 +29922,7 @@ msgstr "" #. Label of the make (Data) field in DocType 'Vehicle' #: erpnext/accounts/doctype/journal_entry/journal_entry.js:127 -#: erpnext/manufacturing/doctype/job_card/job_card.js:479 +#: erpnext/manufacturing/doctype/job_card/job_card.js:490 #: erpnext/manufacturing/doctype/work_order/work_order.js:855 #: erpnext/manufacturing/doctype/work_order/work_order.js:889 #: erpnext/setup/doctype/vehicle/vehicle.json @@ -29934,12 +29978,12 @@ msgstr "" msgid "Make Serial No / Batch from Work Order" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:106 +#: erpnext/manufacturing/doctype/job_card/job_card.js:111 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:256 msgid "Make Stock Entry" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:368 +#: erpnext/manufacturing/doctype/job_card/job_card.js:419 msgid "Make Subcontracting PO" msgstr "" @@ -29982,7 +30026,7 @@ msgstr "" msgid "Manage your orders" msgstr "" -#: erpnext/setup/doctype/company/company.py:502 +#: erpnext/setup/doctype/company/company.py:503 msgid "Management" msgstr "" @@ -30024,11 +30068,11 @@ msgstr "" msgid "Mandatory Missing" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:644 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:684 msgid "Mandatory Purchase Order" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:666 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:706 msgid "Mandatory Purchase Receipt" msgstr "" @@ -30103,8 +30147,8 @@ msgstr "" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1684 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1738 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1754 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json @@ -30254,7 +30298,7 @@ msgstr "" msgid "Manufacturing Manager" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2973 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3043 msgid "Manufacturing Quantity is mandatory" msgstr "" @@ -30443,7 +30487,7 @@ msgstr "" msgid "Market Segment" msgstr "" -#: erpnext/setup/doctype/company/company.py:454 +#: erpnext/setup/doctype/company/company.py:455 msgid "Marketing" msgstr "" @@ -30534,7 +30578,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:117 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1669 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1739 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "" @@ -30615,7 +30659,7 @@ msgstr "" #: erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.js:33 #: erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py:184 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/manufacturing/doctype/job_card/job_card.js:216 +#: erpnext/manufacturing/doctype/job_card/job_card.js:221 #: erpnext/manufacturing/doctype/production_plan/production_plan.js:159 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json @@ -30714,11 +30758,11 @@ msgstr "" msgid "Material Request Type" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1119 +#: erpnext/selling/doctype/sales_order/sales_order.py:1120 msgid "Material Request already created for the ordered quantity" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1851 +#: erpnext/selling/doctype/sales_order/sales_order.py:1883 msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" @@ -30786,7 +30830,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Pick List' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#: erpnext/manufacturing/doctype/job_card/job_card.js:224 +#: erpnext/manufacturing/doctype/job_card/job_card.js:229 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/setup/setup_wizard/operations/install_fixtures.py:86 #: erpnext/stock/doctype/item/item.json @@ -30857,8 +30901,8 @@ msgstr "" msgid "Materials are already received against the {0} {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:185 -#: erpnext/manufacturing/doctype/job_card/job_card.py:855 +#: erpnext/manufacturing/doctype/job_card/job_card.py:187 +#: erpnext/manufacturing/doctype/job_card/job_card.py:860 msgid "Materials needs to be transferred to the work in progress warehouse for the job card {0}" msgstr "" @@ -30963,11 +31007,11 @@ msgstr "" msgid "Maximum Producible Items" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4507 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4623 msgid "Maximum Samples - {0} can be retained for Batch {1} and Item {2}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4498 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4614 msgid "Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}." msgstr "" @@ -31028,7 +31072,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2096 +#: erpnext/stock/stock_ledger.py:2098 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -31125,7 +31169,7 @@ msgstr "" msgid "Meter/Second" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:547 +#: erpnext/manufacturing/doctype/workstation/workstation.py:546 msgid "Method {0} is not allowed to be run on a Job Card." msgstr "" @@ -31420,7 +31464,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:97 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:200 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:603 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:643 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2484 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3100 #: erpnext/assets/doctype/asset_category/asset_category.py:116 @@ -31452,15 +31496,15 @@ msgstr "" msgid "Missing Finance Book" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2112 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2182 msgid "Missing Finished Good" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:359 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:362 msgid "Missing Formula" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1293 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1298 msgid "Missing Item" msgstr "" @@ -31476,7 +31520,7 @@ msgstr "" msgid "Missing Required Filter" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:300 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:308 msgid "Missing Serial No Bundle" msgstr "" @@ -31492,8 +31536,8 @@ msgstr "" msgid "Missing required filter: {0}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1219 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1646 +#: erpnext/manufacturing/doctype/bom/bom.py:1240 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1628 msgid "Missing value" msgstr "" @@ -31507,7 +31551,7 @@ msgstr "" #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:216 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:248 #: erpnext/accounts/report/purchase_register/purchase_register.py:217 -#: erpnext/accounts/report/sales_register/sales_register.py:238 +#: erpnext/accounts/report/sales_register/sales_register.py:247 msgid "Mode Of Payment" msgstr "" @@ -31768,11 +31812,11 @@ msgstr "" msgid "Multiple company fields available: {0}. Please select manually." msgstr "" -#: erpnext/controllers/accounts_controller.py:1338 +#: erpnext/controllers/accounts_controller.py:1374 msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2119 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2189 msgid "Multiple items cannot be marked as finished item" msgstr "" @@ -31781,10 +31825,10 @@ msgid "Music" msgstr "" #. Label of the must_be_whole_number (Check) field in DocType 'UOM' -#: erpnext/manufacturing/doctype/work_order/work_order.py:1593 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1575 #: erpnext/setup/doctype/uom/uom.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267 -#: erpnext/utilities/transaction_base.py:631 +#: erpnext/utilities/transaction_base.py:645 msgid "Must be Whole Number" msgstr "" @@ -31924,7 +31968,7 @@ msgid "Negative Stock" msgstr "" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1724 -#: erpnext/stock/serial_batch_bundle.py:1634 +#: erpnext/stock/serial_batch_bundle.py:1637 msgid "Negative Stock Error" msgstr "" @@ -32183,7 +32227,7 @@ msgstr "" #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/accounts/report/purchase_register/purchase_register.py:269 -#: erpnext/accounts/report/sales_register/sales_register.py:299 +#: erpnext/accounts/report/sales_register/sales_register.py:308 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json #: erpnext/selling/doctype/quotation/quotation.json @@ -32234,7 +32278,7 @@ msgstr "" msgid "Net Weight UOM" msgstr "" -#: erpnext/controllers/accounts_controller.py:1698 +#: erpnext/controllers/accounts_controller.py:1734 msgid "Net total calculation precision loss" msgstr "" @@ -32501,11 +32545,11 @@ msgstr "" msgid "No Impact on Accounting Ledger" msgstr "" -#: erpnext/stock/get_item_details.py:322 +#: erpnext/stock/get_item_details.py:407 msgid "No Item with Barcode {0}" msgstr "" -#: erpnext/stock/get_item_details.py:326 +#: erpnext/stock/get_item_details.py:411 msgid "No Item with Serial No {0}" msgstr "" @@ -32610,7 +32654,7 @@ msgstr "" msgid "No account set" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:822 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:826 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:905 msgid "No accounting entries for the following warehouses" msgstr "" @@ -32623,7 +32667,7 @@ msgstr "" msgid "No accounts found." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:794 +#: erpnext/selling/doctype/sales_order/sales_order.py:795 msgid "No active BOM found for item {0}. Delivery by Serial No cannot be ensured" msgstr "" @@ -32635,7 +32679,7 @@ msgstr "" msgid "No additional fields available" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:103 +#: erpnext/crm/doctype/appointment/appointment.py:104 msgid "No availability of slots are found. Please add on Appointment Booking Settings." msgstr "" @@ -32990,7 +33034,7 @@ msgstr "" msgid "Non Profit" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1635 +#: erpnext/manufacturing/doctype/bom/bom.py:1656 msgid "Non stock items" msgstr "" @@ -33094,7 +33138,7 @@ msgstr "" msgid "Not Started" msgstr "" -#: erpnext/accounts/report/cash_flow/cash_flow.py:426 +#: erpnext/accounts/report/cash_flow/cash_flow.py:430 msgid "Not able to find the earliest Fiscal Year for the given company." msgstr "" @@ -33148,7 +33192,7 @@ msgstr "" msgid "Note: Email will not be sent to disabled users" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:793 +#: erpnext/manufacturing/doctype/bom/bom.py:821 msgid "Note: If you want to use the finished good {0} as a raw material, then enable the 'Do Not Explode' checkbox in the Items table against the same raw material." msgstr "" @@ -33156,7 +33200,7 @@ msgstr "" msgid "Note: Item {0} added multiple times" msgstr "" -#: erpnext/controllers/accounts_controller.py:736 +#: erpnext/controllers/accounts_controller.py:772 msgid "Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified" msgstr "" @@ -33592,7 +33636,7 @@ msgstr "" msgid "Only 'Payment Entries' made against this advance account are supported." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:108 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:120 msgid "Only CSV and Excel files can be used to for importing data. Please check the file format you are trying to upload" msgstr "" @@ -33652,11 +33696,11 @@ msgstr "" msgid "Only one of Deposit or Withdrawal should be non-zero when applying an Excluded Fee." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:330 +#: erpnext/manufacturing/doctype/bom/bom.py:358 msgid "Only one operation can have 'Is Final Finished Good' checked when 'Track Semi Finished Goods' is enabled." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1683 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1753 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "" @@ -33934,7 +33978,7 @@ msgstr "" msgid "Opening Invoice Tool" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1722 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1762 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2044 msgid "Opening Invoice has rounding adjustment of {0}.

    '{1}' account is required to post these values. Please set it in Company: {2}.

    Or, '{3}' can be enabled to not post any rounding adjustment." msgstr "" @@ -34034,7 +34078,7 @@ msgstr "" msgid "Operating Cost Per BOM Quantity" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1740 +#: erpnext/manufacturing/doctype/bom/bom.py:1761 msgid "Operating Cost as per Work Order / BOM" msgstr "" @@ -34110,7 +34154,7 @@ msgstr "" msgid "Operation Time" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1655 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1637 msgid "Operation Time must be greater than 0 for Operation {0}" msgstr "" @@ -34125,15 +34169,15 @@ msgstr "" msgid "Operation time does not depend on quantity to produce" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:517 +#: erpnext/manufacturing/doctype/job_card/job_card.js:528 msgid "Operation {0} added multiple times in the work order {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1298 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1326 msgid "Operation {0} does not belong to the work order {1}" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:444 +#: erpnext/manufacturing/doctype/workstation/workstation.py:443 msgid "Operation {0} longer than any available working hours in workstation {1}, break down the operation into multiple operations" msgstr "" @@ -34147,7 +34191,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/work_order/work_order.js:325 #: erpnext/manufacturing/doctype/work_order/work_order.json -#: erpnext/setup/doctype/company/company.py:472 +#: erpnext/setup/doctype/company/company.py:473 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -34159,7 +34203,7 @@ msgstr "" msgid "Operations Routing" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1228 +#: erpnext/manufacturing/doctype/bom/bom.py:1249 msgid "Operations cannot be left blank" msgstr "" @@ -34470,7 +34514,7 @@ msgstr "" #: erpnext/buying/doctype/supplier/supplier_dashboard.py:11 #: erpnext/selling/doctype/customer/customer_dashboard.py:20 -#: erpnext/selling/doctype/sales_order/sales_order.py:966 +#: erpnext/selling/doctype/sales_order/sales_order.py:967 #: erpnext/setup/doctype/company/company_dashboard.py:23 msgid "Orders" msgstr "" @@ -34689,10 +34733,10 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_payable/accounts_payable.html:140 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:141 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1227 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1259 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:305 -#: erpnext/accounts/report/sales_register/sales_register.py:333 +#: erpnext/accounts/report/sales_register/sales_register.py:342 msgid "Outstanding Amount" msgstr "" @@ -34737,7 +34781,7 @@ msgstr "" msgid "Over Billing Allowance (%)" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1367 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1380 msgid "Over Billing Allowance exceeded for Purchase Receipt Item {0} ({1}) by {2}%" msgstr "" @@ -34760,7 +34804,7 @@ msgstr "" msgid "Over Picking Allowance (%)" msgstr "" -#: erpnext/controllers/stock_controller.py:1914 +#: erpnext/controllers/stock_controller.py:1923 msgid "Over Receipt" msgstr "" @@ -34785,7 +34829,7 @@ msgstr "" msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role." msgstr "" -#: erpnext/controllers/accounts_controller.py:2216 +#: erpnext/controllers/accounts_controller.py:2252 msgid "Overbilling of {} ignored because you have {} role." msgstr "" @@ -35298,7 +35342,7 @@ msgstr "" msgid "Packed Items" msgstr "" -#: erpnext/controllers/stock_controller.py:1748 +#: erpnext/controllers/stock_controller.py:1757 msgid "Packed Items cannot be transferred internally" msgstr "" @@ -35380,7 +35424,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:173 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1221 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1253 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:165 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:201 #: erpnext/accounts/report/pos_register/pos_register.py:209 @@ -35445,7 +35489,7 @@ msgstr "" msgid "Paid To Account Type" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:344 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:384 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 msgid "Paid amount + Write Off Amount can not be greater than Grand Total" msgstr "" @@ -35526,7 +35570,7 @@ msgstr "" msgid "Parent Account" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:383 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:395 msgid "Parent Account Missing" msgstr "" @@ -35540,7 +35584,7 @@ msgstr "" msgid "Parent Company" msgstr "" -#: erpnext/setup/doctype/company/company.py:607 +#: erpnext/setup/doctype/company/company.py:608 msgid "Parent Company must be a group company" msgstr "" @@ -35625,11 +35669,11 @@ msgstr "" msgid "Parent Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:171 +#: erpnext/projects/doctype/task/task.py:187 msgid "Parent Task {0} is not a Template Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:194 +#: erpnext/projects/doctype/task/task.py:210 msgid "Parent Task {0} must be a Group Task" msgstr "" @@ -35892,7 +35936,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:105 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:82 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:65 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1154 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1186 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:82 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:147 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:49 @@ -35921,7 +35965,7 @@ msgstr "" #. Name of a DocType #: erpnext/accounts/doctype/party_account/party_account.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1166 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1198 msgid "Party Account" msgstr "" @@ -35954,7 +35998,7 @@ msgstr "" msgid "Party Account No. (Bank Statement)" msgstr "" -#: erpnext/controllers/accounts_controller.py:2500 +#: erpnext/controllers/accounts_controller.py:2536 msgid "Party Account {0} currency ({1}) and document currency ({2}) should be same" msgstr "" @@ -36106,7 +36150,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:92 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:69 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:52 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1148 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1180 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:69 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:141 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 @@ -36225,7 +36269,7 @@ msgstr "" msgid "Pause" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:662 +#: erpnext/manufacturing/doctype/job_card/job_card.js:672 msgid "Pause Job" msgstr "" @@ -36276,7 +36320,7 @@ msgid "Payable" msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:50 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1164 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1196 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:209 #: erpnext/accounts/report/purchase_register/purchase_register.py:210 #: erpnext/accounts/report/purchase_register/purchase_register.py:251 @@ -36458,7 +36502,7 @@ msgstr "" msgid "Payment Entry is already created" msgstr "" -#: erpnext/controllers/accounts_controller.py:1649 +#: erpnext/controllers/accounts_controller.py:1685 msgid "Payment Entry {0} is linked against Order {1}, check if it should be pulled as advance in this invoice." msgstr "" @@ -36742,7 +36786,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/controllers/accounts_controller.py:2782 +#: erpnext/controllers/accounts_controller.py:2818 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json msgid "Payment Schedule" @@ -36771,7 +36815,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json #: erpnext/accounts/doctype/payment_term/payment_term.json #: erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1217 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1249 #: erpnext/accounts/report/gross_profit/gross_profit.py:451 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/controllers/transaction.js:549 @@ -37037,11 +37081,12 @@ msgstr "" #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py:55 #: erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py:45 -#: erpnext/manufacturing/doctype/job_card/job_card.js:272 +#: erpnext/manufacturing/doctype/job_card/job_card.js:294 msgid "Pending Quantity" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:70 +#: erpnext/manufacturing/doctype/job_card/job_card.js:72 +#: erpnext/manufacturing/doctype/job_card/job_card.js:311 msgid "Pending Quantity cannot be greater than {0}" msgstr "" @@ -37077,11 +37122,11 @@ msgstr "" msgid "Pending processing" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1534 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1631 msgid "Pending quantity cannot be greater than the for quantity." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1528 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1625 msgid "Pending quantity cannot be negative." msgstr "" @@ -37681,7 +37726,7 @@ msgstr "" msgid "Planned End Date" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:300 +#: erpnext/manufacturing/doctype/work_order/work_order.py:303 msgid "Planned End Date cannot be before Planned Start Date" msgstr "" @@ -37835,7 +37880,7 @@ msgstr "" msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:420 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:432 msgid "Please add Root Account for - {0}" msgstr "" @@ -37843,7 +37888,7 @@ msgstr "" msgid "Please add a Temporary Opening account in Chart of Accounts" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:95 +#: erpnext/crm/doctype/appointment/appointment.py:96 msgid "Please add a valid Holiday List on Appointment Booking Settings." msgstr "" @@ -37851,7 +37896,7 @@ msgstr "" msgid "Please add an account for the Bank Entry rule." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:662 +#: erpnext/public/js/utils/serial_no_batch_selector.js:672 msgid "Please add atleast one Serial No / Batch No" msgstr "" @@ -37875,7 +37920,7 @@ msgstr "" msgid "Please add {1} role to user {0}." msgstr "" -#: erpnext/controllers/stock_controller.py:1925 +#: erpnext/controllers/stock_controller.py:1934 msgid "Please adjust the qty or edit {0} to proceed." msgstr "" @@ -37929,7 +37974,7 @@ msgstr "" msgid "Please check your email to confirm the appointment" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:184 +#: erpnext/crm/doctype/appointment/appointment.py:185 msgid "Please check your email to confirm the appointment." msgstr "" @@ -37981,7 +38026,7 @@ msgstr "" msgid "Please create a new Accounting Dimension if required." msgstr "" -#: erpnext/controllers/accounts_controller.py:837 +#: erpnext/controllers/accounts_controller.py:873 msgid "Please create purchase from internal sale or delivery document itself" msgstr "" @@ -38029,11 +38074,11 @@ msgstr "" msgid "Please enable {} in {} to allow same item in multiple rows" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:391 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:431 msgid "Please ensure that the {0} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:399 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:439 msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "" @@ -38045,7 +38090,7 @@ msgstr "" msgid "Please ensure {} account {} is a Receivable account." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:883 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:888 msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}" msgstr "" @@ -38066,7 +38111,7 @@ msgstr "" msgid "Please enter Cost Center" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:423 +#: erpnext/selling/doctype/sales_order/sales_order.py:424 msgid "Please enter Delivery Date" msgstr "" @@ -38083,7 +38128,7 @@ msgstr "" msgid "Please enter Item Code to get Batch Number" msgstr "" -#: erpnext/public/js/controllers/transaction.js:3048 +#: erpnext/public/js/controllers/transaction.js:3049 msgid "Please enter Item Code to get batch no" msgstr "" @@ -38115,7 +38160,7 @@ msgstr "" msgid "Please enter Reference date" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:399 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:411 msgid "Please enter Root Type for account- {0}" msgstr "" @@ -38123,7 +38168,7 @@ msgstr "" msgid "Please enter Serial No" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:319 +#: erpnext/public/js/utils/serial_no_batch_selector.js:329 msgid "Please enter Serial Nos" msgstr "" @@ -38135,16 +38180,16 @@ msgstr "" msgid "Please enter Warehouse and Date" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:670 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:710 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1335 msgid "Please enter Write Off Account" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:680 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:720 msgid "Please enter a valid Write Off Account" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:691 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:731 msgid "Please enter a valid Write Off Cost Center" msgstr "" @@ -38164,7 +38209,7 @@ msgstr "" msgid "Please enter company name first" msgstr "" -#: erpnext/controllers/accounts_controller.py:3001 +#: erpnext/controllers/accounts_controller.py:3037 msgid "Please enter default currency in Company Master" msgstr "" @@ -38204,7 +38249,7 @@ msgstr "" msgid "Please enter the phone number first" msgstr "" -#: erpnext/controllers/buying_controller.py:1267 +#: erpnext/controllers/buying_controller.py:1275 msgid "Please enter the {schedule_date}." msgstr "" @@ -38260,7 +38305,7 @@ msgstr "" msgid "Please make sure the employees above report to another Active employee." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:378 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:390 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "" @@ -38322,12 +38367,12 @@ msgstr "" msgid "Please select Template Type to download template" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:867 -#: erpnext/public/js/controllers/taxes_and_totals.js:840 +#: erpnext/controllers/taxes_and_totals.py:906 +#: erpnext/public/js/controllers/taxes_and_totals.js:864 msgid "Please select Apply Discount On" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1768 +#: erpnext/selling/doctype/sales_order/sales_order.py:1800 msgid "Please select BOM against item {0}" msgstr "" @@ -38377,7 +38422,7 @@ msgstr "" msgid "Please select Customer first" msgstr "" -#: erpnext/setup/doctype/company/company.py:538 +#: erpnext/setup/doctype/company/company.py:539 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "" @@ -38415,11 +38460,11 @@ msgstr "" msgid "Please select Posting Date first" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1292 +#: erpnext/manufacturing/doctype/bom/bom.py:1313 msgid "Please select Price List" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1770 +#: erpnext/selling/doctype/sales_order/sales_order.py:1802 msgid "Please select Qty against item {0}" msgstr "" @@ -38439,15 +38484,15 @@ msgstr "" msgid "Please select Stock Asset Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2036 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2106 msgid "Please select Subcontracting Order instead of Purchase Order {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:2857 +#: erpnext/controllers/accounts_controller.py:2893 msgid "Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1547 +#: erpnext/manufacturing/doctype/bom/bom.py:1568 msgid "Please select a BOM" msgstr "" @@ -38460,7 +38505,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:734 #: erpnext/manufacturing/doctype/bom/bom.py:279 #: erpnext/public/js/controllers/accounts.js:274 -#: erpnext/public/js/controllers/transaction.js:3347 +#: erpnext/public/js/controllers/transaction.js:3348 msgid "Please select a Company first." msgstr "" @@ -38484,11 +38529,11 @@ msgstr "" msgid "Please select a Supplier" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:666 +#: erpnext/public/js/utils/serial_no_batch_selector.js:676 msgid "Please select a Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1686 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1809 msgid "Please select a Work Order first." msgstr "" @@ -38553,7 +38598,7 @@ msgstr "" msgid "Please select a valid Purchase Order that is configured for Subcontracting." msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1355 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1387 msgid "Please select a valid {0}" msgstr "" @@ -38565,7 +38610,7 @@ msgstr "" msgid "Please select a warehouse first." msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:203 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:218 msgid "Please select an item code before setting the warehouse." msgstr "" @@ -38713,7 +38758,7 @@ msgstr "" msgid "Please set Account for Change Amount" msgstr "" -#: erpnext/stock/__init__.py:91 +#: erpnext/stock/__init__.py:94 msgid "Please set Account in Warehouse {0} or Default Inventory Account in Company {1}" msgstr "" @@ -38761,7 +38806,7 @@ msgstr "" msgid "Please set Fixed Asset Account in Asset Category {0}" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:600 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:640 msgid "Please set Fixed Asset Account in {} against {}." msgstr "" @@ -38807,7 +38852,7 @@ msgstr "" msgid "Please set a default Holiday List for Employee {0} or Company {1}" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1156 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1196 msgid "Please set account in Warehouse {0}" msgstr "" @@ -38820,7 +38865,7 @@ msgstr "" msgid "Please set an Address on the Company '%s'" msgstr "" -#: erpnext/controllers/stock_controller.py:1056 +#: erpnext/controllers/stock_controller.py:1065 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -38856,7 +38901,7 @@ msgstr "" msgid "Please set default Exchange Gain/Loss Account in Company {}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:389 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:397 msgid "Please set default Expense Account in Company {0}" msgstr "" @@ -38864,11 +38909,11 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/controllers/stock_controller.py:835 +#: erpnext/controllers/stock_controller.py:844 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "" -#: erpnext/controllers/stock_controller.py:286 +#: erpnext/controllers/stock_controller.py:288 msgid "Please set default inventory account for item {0}, or their item group or brand." msgstr "" @@ -38881,7 +38926,7 @@ msgstr "" msgid "Please set filter based on Item or Warehouse" msgstr "" -#: erpnext/controllers/accounts_controller.py:2416 +#: erpnext/controllers/accounts_controller.py:2452 msgid "Please set one of the following:" msgstr "" @@ -38889,7 +38934,7 @@ msgstr "" msgid "Please set opening number of booked depreciations" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2712 +#: erpnext/public/js/controllers/transaction.js:2713 msgid "Please set recurring after saving" msgstr "" @@ -38905,11 +38950,11 @@ msgstr "" msgid "Please set the Item Code first" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1749 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1872 msgid "Please set the Target Warehouse in the Job Card" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1753 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1876 msgid "Please set the WIP Warehouse in the Job Card" msgstr "" @@ -38945,7 +38990,7 @@ msgid "Please set {0} in BOM Creator {1}" msgstr "" #: erpnext/controllers/buying_controller.py:345 -#: erpnext/controllers/stock_controller.py:926 +#: erpnext/controllers/stock_controller.py:935 msgid "Please set {0} in Company {1} or in the Item Defaults of Item {2}" msgstr "" @@ -38953,7 +38998,7 @@ msgstr "" msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "" -#: erpnext/controllers/accounts_controller.py:618 +#: erpnext/controllers/accounts_controller.py:637 msgid "Please set {0} to {1}, the same account that was used in the original invoice {2}." msgstr "" @@ -38965,7 +39010,7 @@ msgstr "" msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "" -#: erpnext/stock/get_item_details.py:333 +#: erpnext/stock/get_item_details.py:418 msgid "Please specify Company" msgstr "" @@ -38975,7 +39020,7 @@ msgstr "" msgid "Please specify Company to proceed" msgstr "" -#: erpnext/controllers/accounts_controller.py:3232 +#: erpnext/controllers/accounts_controller.py:3268 #: erpnext/public/js/controllers/accounts.js:114 msgid "Please specify a valid Row ID for row {0} in table {1}" msgstr "" @@ -39004,7 +39049,7 @@ msgstr "" msgid "Please uncheck 'Show in Bucket View' to create Orders" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:240 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:241 msgid "Please update Repair Status." msgstr "" @@ -39174,7 +39219,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1146 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1178 #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:38 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:7 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:65 @@ -39188,7 +39233,7 @@ msgstr "" #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:94 #: erpnext/accounts/report/pos_register/pos_register.py:172 #: erpnext/accounts/report/purchase_register/purchase_register.py:185 -#: erpnext/accounts/report/sales_register/sales_register.py:199 +#: erpnext/accounts/report/sales_register/sales_register.py:208 #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json @@ -39221,7 +39266,7 @@ msgstr "" msgid "Posting Date" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:269 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:270 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:143 msgid "Posting Date cannot be future date" msgstr "" @@ -39232,7 +39277,7 @@ msgstr "" msgid "Posting Date inheritance for exchange gain / loss" msgstr "" -#: erpnext/public/js/controllers/transaction.js:1139 +#: erpnext/public/js/controllers/transaction.js:1140 msgid "Posting Date will change to today's date as Edit Posting Date and Time is unchecked. Are you sure want to proceed?" msgstr "" @@ -39295,7 +39340,7 @@ msgstr "" msgid "Posting Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2923 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2993 msgid "Posting date and posting time is mandatory" msgstr "" @@ -39438,6 +39483,12 @@ msgstr "" msgid "Prevent RFQs" msgstr "" +#. Label of the enable_overdue_billing_threshold (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Prevent Sales Invoice when Customer is Overdue" +msgstr "" + #. Option for the 'Corrective/Preventive' (Select) field in DocType 'Quality #. Action' #: erpnext/quality_management/doctype/quality_action/quality_action.json @@ -39622,7 +39673,7 @@ msgstr "" msgid "Price List Currency" msgstr "" -#: erpnext/stock/get_item_details.py:1345 +#: erpnext/stock/get_item_details.py:1430 msgid "Price List Currency not selected" msgstr "" @@ -39747,7 +39798,7 @@ msgstr "" msgid "Price is not set for the item." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:605 +#: erpnext/manufacturing/doctype/bom/bom.py:633 msgid "Price not found for item {0} in price list {1}" msgstr "" @@ -40136,7 +40187,7 @@ msgstr "" msgid "Process Loss %" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1272 +#: erpnext/manufacturing/doctype/bom/bom.py:1293 msgid "Process Loss Percentage cannot be greater than 100" msgstr "" @@ -40163,10 +40214,14 @@ msgstr "" msgid "Process Loss Qty" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:288 +#: erpnext/manufacturing/doctype/job_card/job_card.js:325 msgid "Process Loss Quantity" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.js:341 +msgid "Process Loss Quantity cannot be greater than {0}" +msgstr "" + #. Name of a report #: erpnext/manufacturing/report/process_loss_report/process_loss_report.json msgid "Process Loss Report" @@ -40244,7 +40299,7 @@ msgstr "" msgid "Process in Single Transaction" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1531 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1628 msgid "Process loss quantity cannot be negative." msgstr "" @@ -40417,7 +40472,7 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:478 +#: erpnext/setup/doctype/company/company.py:479 msgid "Production" msgstr "" @@ -40626,7 +40681,7 @@ msgstr "" msgid "Profitability Analysis" msgstr "" -#: erpnext/projects/doctype/task/task.py:157 +#: erpnext/projects/doctype/task/task.py:173 #, python-format msgid "Progress % for a task cannot be more than 100." msgstr "" @@ -40972,7 +41027,7 @@ msgstr "" msgid "Providing" msgstr "" -#: erpnext/setup/doctype/company/company.py:577 +#: erpnext/setup/doctype/company/company.py:578 msgid "Provisional Account" msgstr "" @@ -41044,7 +41099,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:466 erpnext/setup/install.py:428 +#: erpnext/setup/doctype/company/company.py:467 erpnext/setup/install.py:428 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item/item_list.js:30 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -41204,7 +41259,7 @@ msgstr "" msgid "Purchase Invoice Trends" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:331 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:371 msgid "Purchase Invoice can be held after submitting." msgstr "" @@ -41212,11 +41267,11 @@ msgstr "" msgid "Purchase Invoice cannot be made against an existing asset {0}" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1943 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1981 msgid "Purchase Invoice without any outstanding amount cannot be held." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:2033 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:2071 msgid "Purchase Invoices" msgstr "" @@ -41257,7 +41312,7 @@ msgstr "" #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js:48 #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:203 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/buying_controller.py:1000 +#: erpnext/controllers/buying_controller.py:1008 #: erpnext/crm/doctype/contract/contract.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:54 #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -41345,11 +41400,11 @@ msgstr "" msgid "Purchase Order Pricing Rule" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:640 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:680 msgid "Purchase Order Required" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:635 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:675 msgid "Purchase Order Required for item {}" msgstr "" @@ -41367,15 +41422,15 @@ msgstr "" msgid "Purchase Order already created for all Sales Order items" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:338 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:339 msgid "Purchase Order number required for Item {0}" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1363 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1367 msgid "Purchase Order {0} created" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:700 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:740 msgid "Purchase Order {0} is not submitted" msgstr "" @@ -41409,7 +41464,7 @@ msgstr "" msgid "Purchase Orders to Receive" msgstr "" -#: erpnext/controllers/accounts_controller.py:2048 +#: erpnext/controllers/accounts_controller.py:2084 msgid "Purchase Orders {0} are un-linked" msgstr "" @@ -41495,11 +41550,11 @@ msgstr "" msgid "Purchase Receipt No" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:662 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:702 msgid "Purchase Receipt Required" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:657 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:697 msgid "Purchase Receipt Required for item {}" msgstr "" @@ -41527,7 +41582,7 @@ msgstr "" msgid "Purchase Receipt {0} created." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:707 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:747 msgid "Purchase Receipt {0} is not submitted" msgstr "" @@ -41653,7 +41708,7 @@ msgstr "" msgid "Purpose" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:700 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:705 msgid "Purpose must be one of {0}" msgstr "" @@ -41752,7 +41807,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order_additional_item/work_order_additional_item.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:28 -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:69 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:75 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:243 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:341 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:406 @@ -41879,11 +41934,11 @@ msgstr "" msgid "Qty To Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1589 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1571 msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:261 +#: erpnext/manufacturing/doctype/job_card/job_card.py:263 msgid "Qty To Manufacture in the job card cannot be greater than Qty To Manufacture in the work order for the operation {0}.

    Solution: Either you can reduce the Qty To Manufacture in the job card or set the 'Overproduction Percentage For Work Order' in the {1}." msgstr "" @@ -41947,6 +42002,10 @@ msgstr "" msgid "Qty in Stock UOM" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.js:297 +msgid "Qty left for a later cycle or for another job card." +msgstr "" + #. Label of the for_qty (Float) field in DocType 'Pick List' #: erpnext/stock/doctype/pick_list/pick_list.js:206 #: erpnext/stock/doctype/pick_list/pick_list.json @@ -41963,6 +42022,10 @@ msgstr "" msgid "Qty of raw materials will be decided based on the qty of the Finished Goods Item" msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.js:327 +msgid "Qty scrapped in this cycle, nobody will produce it." +msgstr "" + #. Label of the consumed_qty (Float) field in DocType 'Purchase Receipt Item #. Supplied' #: erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json @@ -41986,13 +42049,12 @@ msgstr "" msgid "Qty to Disassemble" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:384 +#: erpnext/public/js/utils/serial_no_batch_selector.js:394 msgid "Qty to Fetch" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:246 -#: erpnext/manufacturing/doctype/job_card/job_card.py:906 -msgid "Qty to Manufacture" +#: erpnext/manufacturing/doctype/job_card/job_card.js:251 +msgid "Qty to Manufacture in this Cycle" msgstr "" #. Label of the qty (Float) field in DocType 'Production Plan Sub Assembly @@ -42160,7 +42222,7 @@ msgstr "" msgid "Quality Inspection Analysis" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2969 +#: erpnext/public/js/controllers/transaction.js:2970 msgid "Quality Inspection Not Configured" msgstr "" @@ -42225,17 +42287,17 @@ msgstr "" msgid "Quality Inspection Template Name" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:800 +#: erpnext/manufacturing/doctype/job_card/job_card.py:802 msgid "Quality Inspection is required for the item {0} before completing the job card {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:811 -#: erpnext/manufacturing/doctype/job_card/job_card.py:820 +#: erpnext/manufacturing/doctype/job_card/job_card.py:813 +#: erpnext/manufacturing/doctype/job_card/job_card.py:822 msgid "Quality Inspection {0} is not submitted for the item: {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:830 -#: erpnext/manufacturing/doctype/job_card/job_card.py:839 +#: erpnext/manufacturing/doctype/job_card/job_card.py:832 +#: erpnext/manufacturing/doctype/job_card/job_card.py:841 msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "" @@ -42249,7 +42311,7 @@ msgstr "" msgid "Quality Inspections" msgstr "" -#: erpnext/setup/doctype/company/company.py:508 +#: erpnext/setup/doctype/company/company.py:509 msgid "Quality Management" msgstr "" @@ -42383,7 +42445,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/public/js/controllers/buying.js:620 #: erpnext/public/js/stock_analytics.js:50 -#: erpnext/public/js/utils/serial_no_batch_selector.js:499 +#: erpnext/public/js/utils/serial_no_batch_selector.js:509 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/page/point_of_sale/pos_item_cart.js:51 @@ -42541,13 +42603,12 @@ msgstr "" msgid "Quantity must not be more than {0}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:773 +#: erpnext/manufacturing/doctype/bom/bom.py:801 msgid "Quantity required for Item {0} in row {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:717 -#: erpnext/manufacturing/doctype/job_card/job_card.js:341 -#: erpnext/manufacturing/doctype/job_card/job_card.js:409 +#: erpnext/manufacturing/doctype/bom/bom.py:745 +#: erpnext/manufacturing/doctype/job_card/job_card.js:393 #: erpnext/manufacturing/doctype/workstation/workstation.js:303 msgid "Quantity should be greater than 0" msgstr "" @@ -42556,11 +42617,11 @@ msgstr "" msgid "Quantity to Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2915 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2892 msgid "Quantity to Manufacture can not be zero for the operation {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1581 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1563 msgid "Quantity to Manufacture must be greater than 0." msgstr "" @@ -42593,7 +42654,7 @@ msgstr "" msgid "Query Route String" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:199 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:200 msgid "Queue Size should be between 5 and 100" msgstr "" @@ -42702,11 +42763,11 @@ msgstr "" msgid "Quotation Trends" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:487 +#: erpnext/selling/doctype/sales_order/sales_order.py:488 msgid "Quotation {0} is cancelled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:400 +#: erpnext/selling/doctype/sales_order/sales_order.py:401 msgid "Quotation {0} not of type {1}" msgstr "" @@ -43018,7 +43079,7 @@ msgstr "" msgid "Rate at which this tax is applied" msgstr "" -#: erpnext/controllers/accounts_controller.py:4162 +#: erpnext/controllers/accounts_controller.py:4198 msgid "Rate of '{}' items cannot be changed" msgstr "" @@ -43187,7 +43248,7 @@ msgstr "" msgid "Raw Materials Consumption" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:440 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:445 msgid "Raw Materials Missing" msgstr "" @@ -43221,7 +43282,7 @@ msgstr "" msgid "Raw Materials Supplied Cost" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:765 +#: erpnext/manufacturing/doctype/bom/bom.py:793 msgid "Raw Materials cannot be blank." msgstr "" @@ -43432,10 +43493,10 @@ msgid "Receivable / Payable Account" msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:79 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1162 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1194 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:241 -#: erpnext/accounts/report/sales_register/sales_register.py:231 -#: erpnext/accounts/report/sales_register/sales_register.py:285 +#: erpnext/accounts/report/sales_register/sales_register.py:240 +#: erpnext/accounts/report/sales_register/sales_register.py:294 msgid "Receivable Account" msgstr "" @@ -43893,7 +43954,7 @@ msgstr "" msgid "Reference #{0} dated {1}" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2825 +#: erpnext/public/js/controllers/transaction.js:2826 msgid "Reference Date for Early Payment Discount" msgstr "" @@ -44151,7 +44212,7 @@ msgstr "" msgid "Rejected Warehouse" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:670 +#: erpnext/public/js/utils/serial_no_batch_selector.js:680 msgid "Rejected Warehouse and Accepted Warehouse cannot be same." msgstr "" @@ -44181,7 +44242,7 @@ msgstr "" msgid "Release Date" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:335 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:375 msgid "Release date must be in the future" msgstr "" @@ -44199,7 +44260,7 @@ msgid "Remaining Amount" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:189 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1239 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1271 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:178 msgid "Remaining Balance" msgstr "" @@ -44257,12 +44318,12 @@ msgstr "" #: erpnext/accounts/print_format/payment_receipt_voucher/payment_receipt_voucher.html:11 #: erpnext/accounts/report/accounts_payable/accounts_payable.html:135 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:136 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1271 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1303 #: erpnext/accounts/report/general_ledger/general_ledger.html:163 #: erpnext/accounts/report/general_ledger/general_ledger.py:818 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:112 #: erpnext/accounts/report/purchase_register/purchase_register.py:312 -#: erpnext/accounts/report/sales_register/sales_register.py:349 +#: erpnext/accounts/report/sales_register/sales_register.py:358 #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/downtime_entry/downtime_entry.json #: erpnext/manufacturing/doctype/job_card/job_card.json @@ -44275,12 +44336,6 @@ msgstr "" msgid "Remarks" msgstr "" -#. Label of the remarks_section (Section Break) field in DocType 'Accounts -#. Settings' -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Remarks Column Length" -msgstr "" - #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html:71 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html:92 msgid "Remarks:" @@ -44924,7 +44979,7 @@ msgstr "" msgid "Research" msgstr "" -#: erpnext/setup/doctype/company/company.py:514 +#: erpnext/setup/doctype/company/company.py:515 msgid "Research & Development" msgstr "" @@ -45012,7 +45067,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/controllers/stock_controller.py:1505 +#: erpnext/controllers/stock_controller.py:1514 msgid "Reserved Batch Conflict" msgstr "" @@ -45086,7 +45141,7 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2383 +#: erpnext/stock/stock_ledger.py:2385 msgid "Reserved Serial No." msgstr "" @@ -45104,13 +45159,13 @@ msgstr "" #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:569 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:205 -#: erpnext/stock/stock_ledger.py:2367 +#: erpnext/stock/stock_ledger.py:2369 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:205 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:333 msgid "Reserved Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2412 +#: erpnext/stock/stock_ledger.py:2414 msgid "Reserved Stock for Batch" msgstr "" @@ -45325,12 +45380,6 @@ msgstr "" msgid "Restrict" msgstr "" -#. Label of the enable_overdue_billing_threshold (Check) field in DocType -#. 'Accounts Settings' -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Restrict Customer Over Billing" -msgstr "" - #. Label of the restrict_based_on (Select) field in DocType 'Party Specific #. Item' #: erpnext/selling/doctype/party_specific_item/party_specific_item.json @@ -45374,7 +45423,7 @@ msgstr "" msgid "Resume" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:661 +#: erpnext/manufacturing/doctype/job_card/job_card.js:671 msgid "Resume Job" msgstr "" @@ -45490,7 +45539,7 @@ msgstr "" msgid "Return Issued" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:328 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:368 msgid "Return Purchase Invoice cannot be held." msgstr "" @@ -45864,7 +45913,7 @@ msgstr "" msgid "Root Type" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:403 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:415 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "" @@ -45947,7 +45996,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/purchase_register/purchase_register.py:298 -#: erpnext/accounts/report/sales_register/sales_register.py:326 +#: erpnext/accounts/report/sales_register/sales_register.py:335 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json #: erpnext/selling/doctype/quotation/quotation.json @@ -46030,8 +46079,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/controllers/stock_controller.py:847 -#: erpnext/controllers/stock_controller.py:862 +#: erpnext/controllers/stock_controller.py:856 +#: erpnext/controllers/stock_controller.py:871 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -46074,7 +46123,7 @@ msgstr "" msgid "Row # {0}: Returned Item {1} does not exist in {2} {3}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:354 +#: erpnext/manufacturing/doctype/work_order/work_order.py:357 msgid "Row #1: Sequence ID must be 1 for Operation {0}." msgstr "" @@ -46092,11 +46141,11 @@ msgstr "" msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:378 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:381 msgid "Row #{0}: Acceptance Criteria Formula is incorrect." msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:358 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:361 msgid "Row #{0}: Acceptance Criteria Formula is required." msgstr "" @@ -46109,7 +46158,7 @@ msgstr "" msgid "Row #{0}: Accepted Warehouse is mandatory for the accepted Item {1}" msgstr "" -#: erpnext/controllers/accounts_controller.py:1326 +#: erpnext/controllers/accounts_controller.py:1362 msgid "Row #{0}: Account {1} does not belong to company {2}" msgstr "" @@ -46126,7 +46175,7 @@ msgstr "" msgid "Row #{0}: Allocated amount:{1} is greater than outstanding amount:{2} for Payment Term {3}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:279 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:305 msgid "Row #{0}: Amount must be a positive number" msgstr "" @@ -46142,7 +46191,7 @@ msgstr "" msgid "Row #{0}: BOM is not specified for subcontracting item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:302 +#: erpnext/selling/doctype/sales_order/sales_order.py:303 msgid "Row #{0}: BOM not found for FG Item {1}" msgstr "" @@ -46174,35 +46223,35 @@ msgstr "" msgid "Row #{0}: Cannot create entry with different taxable AND withholding document links." msgstr "" -#: erpnext/controllers/accounts_controller.py:3864 +#: erpnext/controllers/accounts_controller.py:3900 msgid "Row #{0}: Cannot delete item {1} which has already been billed." msgstr "" -#: erpnext/controllers/accounts_controller.py:3838 +#: erpnext/controllers/accounts_controller.py:3874 msgid "Row #{0}: Cannot delete item {1} which has already been delivered" msgstr "" -#: erpnext/controllers/accounts_controller.py:3857 +#: erpnext/controllers/accounts_controller.py:3893 msgid "Row #{0}: Cannot delete item {1} which has already been received" msgstr "" -#: erpnext/controllers/accounts_controller.py:3844 +#: erpnext/controllers/accounts_controller.py:3880 msgid "Row #{0}: Cannot delete item {1} which has work order assigned to it." msgstr "" -#: erpnext/controllers/accounts_controller.py:3850 +#: erpnext/controllers/accounts_controller.py:3886 msgid "Row #{0}: Cannot delete item {1} which is already ordered against this Sales Order." msgstr "" -#: erpnext/controllers/accounts_controller.py:4172 +#: erpnext/controllers/accounts_controller.py:4208 msgid "Row #{0}: Cannot set Rate if the billed amount is greater than the amount for Item {1}." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1162 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1169 msgid "Row #{0}: Cannot transfer more than Required Qty {1} for Item {2} against Job Card {3}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1338 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1408 msgid "Row #{0}: Cannot transfer {1} {2} of Item {3}. Maximum transferable quantity is {4} {2}." msgstr "" @@ -46210,23 +46259,23 @@ msgstr "" msgid "Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:254 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:280 msgid "Row #{0}: Consumed Asset {1} cannot be Draft" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:257 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:283 msgid "Row #{0}: Consumed Asset {1} cannot be cancelled" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:239 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:265 msgid "Row #{0}: Consumed Asset {1} cannot be the same as the Target Asset" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:248 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:274 msgid "Row #{0}: Consumed Asset {1} cannot be {2}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:262 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:288 msgid "Row #{0}: Consumed Asset {1} does not belong to company {2}" msgstr "" @@ -46252,11 +46301,11 @@ msgstr "" msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times in the Subcontracting Inward process." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:431 +#: erpnext/manufacturing/doctype/work_order/work_order.py:434 msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:456 +#: erpnext/manufacturing/doctype/work_order/work_order.py:459 msgid "Row #{0}: Customer Provided Item {1} does not exist in the Required Items table linked to the Subcontracting Inward Order." msgstr "" @@ -46264,7 +46313,7 @@ msgstr "" msgid "Row #{0}: Customer Provided Item {1} exceeds quantity available through Subcontracting Inward Order" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:444 +#: erpnext/manufacturing/doctype/work_order/work_order.py:447 msgid "Row #{0}: Customer Provided Item {1} has insufficient quantity in the Subcontracting Inward Order. Available quantity is {2}." msgstr "" @@ -46293,38 +46342,42 @@ msgstr "" msgid "Row #{0}: Duplicate entry in References {1} {2}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:332 +#: erpnext/selling/doctype/sales_order/sales_order.py:333 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/controllers/stock_controller.py:1058 +#: erpnext/controllers/stock_controller.py:1067 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:149 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:150 msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "" +#: erpnext/manufacturing/doctype/bom/bom.py:332 +msgid "Row #{0}: FG / Semi FG Item is required for the operation {1} as 'Track Semi Finished Goods' is enabled." +msgstr "" + #: erpnext/buying/doctype/purchase_order/purchase_order.py:366 -#: erpnext/selling/doctype/sales_order/sales_order.py:305 +#: erpnext/selling/doctype/sales_order/sales_order.py:306 msgid "Row #{0}: Finished Good Item Qty can not be zero" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:348 -#: erpnext/selling/doctype/sales_order/sales_order.py:285 +#: erpnext/selling/doctype/sales_order/sales_order.py:286 msgid "Row #{0}: Finished Good Item is not specified for service item {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:339 +#: erpnext/manufacturing/doctype/bom/bom.py:367 msgid "Row #{0}: Finished Good Item {1} cannot be added in the Secondary Items table." msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:355 -#: erpnext/selling/doctype/sales_order/sales_order.py:292 +#: erpnext/selling/doctype/sales_order/sales_order.py:293 msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:656 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:661 msgid "Row #{0}: Finished Good must be {1}" msgstr "" @@ -46353,7 +46406,7 @@ msgstr "" msgid "Row #{0}: From Date cannot be before To Date" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:894 +#: erpnext/manufacturing/doctype/job_card/job_card.py:899 msgid "Row #{0}: From Time and To Time fields are required" msgstr "" @@ -46361,7 +46414,7 @@ msgstr "" msgid "Row #{0}: Item added" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1967 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2037 msgid "Row #{0}: Item {1} cannot be transferred more than {2} against {3} {4}" msgstr "" @@ -46398,15 +46451,15 @@ msgstr "" msgid "Row #{0}: Item {1} is not a part of Subcontracting Inward Order {2}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:273 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:299 msgid "Row #{0}: Item {1} is not a service item" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:227 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:253 msgid "Row #{0}: Item {1} is not a stock item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1104 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1109 msgid "Row #{0}: Item {1} is not part of the source manufacture entry and cannot be added to this disassembly." msgstr "" @@ -46418,7 +46471,7 @@ msgstr "" msgid "Row #{0}: Item {1} mismatch. Changing of item code is not permitted." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1113 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1118 msgid "Row #{0}: Item {1} quantity ({2} in stock UOM) does not match the quantity derived from the source ({3}). Do not change the UOM, conversion factor or quantity of disassembly rows." msgstr "" @@ -46434,7 +46487,7 @@ msgstr "" msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:673 +#: erpnext/selling/doctype/sales_order/sales_order.py:674 msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "" @@ -46446,7 +46499,7 @@ msgstr "" msgid "Row #{0}: Opening Accumulated Depreciation must be less than or equal to {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1168 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1173 msgid "Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}." msgstr "" @@ -46475,11 +46528,11 @@ msgstr "" msgid "Row #{0}: Please set reorder quantity" msgstr "" -#: erpnext/controllers/accounts_controller.py:641 +#: erpnext/controllers/accounts_controller.py:660 msgid "Row #{0}: Please update deferred revenue/expense account in item row or default account in company master" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:346 +#: erpnext/manufacturing/doctype/bom/bom.py:374 #, python-format msgid "Row #{0}: Process Loss Percentage should be less than 100% for {1} Item {2}" msgstr "" @@ -46488,8 +46541,8 @@ msgstr "" msgid "Row #{0}: Qty increased by {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:230 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:276 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:256 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:302 msgid "Row #{0}: Qty must be a positive number" msgstr "" @@ -46497,15 +46550,15 @@ msgstr "" msgid "Row #{0}: Qty should be less than or equal to Available Qty to Reserve (Actual Qty - Reserved Qty) {1} for Iem {2} against Batch {3} in Warehouse {4}." msgstr "" -#: erpnext/controllers/stock_controller.py:1643 +#: erpnext/controllers/stock_controller.py:1652 msgid "Row #{0}: Quality Inspection is required for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1658 +#: erpnext/controllers/stock_controller.py:1667 msgid "Row #{0}: Quality Inspection {1} is not submitted for the item: {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1673 +#: erpnext/controllers/stock_controller.py:1682 msgid "Row #{0}: Quality Inspection {1} was rejected for item {2}" msgstr "" @@ -46513,7 +46566,7 @@ msgstr "" msgid "Row #{0}: Quantity cannot be a non-positive number. Please increase the quantity or remove the Item {1}" msgstr "" -#: erpnext/controllers/accounts_controller.py:1489 +#: erpnext/controllers/accounts_controller.py:1525 msgid "Row #{0}: Quantity for Item {1} cannot be zero." msgstr "" @@ -46529,14 +46582,14 @@ msgstr "" msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "" -#: erpnext/controllers/accounts_controller.py:904 -#: erpnext/controllers/accounts_controller.py:916 +#: erpnext/controllers/accounts_controller.py:940 +#: erpnext/controllers/accounts_controller.py:952 #: erpnext/utilities/transaction_base.py:172 #: erpnext/utilities/transaction_base.py:178 msgid "Row #{0}: Rate must be same as {1}: {2} ({3} / {4})" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:316 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:319 msgid "Row #{0}: Reading {1} {2} is not a valid number in the {3} number format. Use {4} as the decimal separator." msgstr "" @@ -46556,7 +46609,7 @@ msgstr "" msgid "Row #{0}: Rejected Warehouse is mandatory for the rejected Item {1}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:167 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:168 msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "" @@ -46584,11 +46637,11 @@ msgid "" "\t\t\t\t\tthis validation." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:360 +#: erpnext/manufacturing/doctype/work_order/work_order.py:363 msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." msgstr "" -#: erpnext/controllers/stock_controller.py:358 +#: erpnext/controllers/stock_controller.py:367 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -46604,19 +46657,19 @@ msgstr "" msgid "Row #{0}: Serial No(s) {1} are not a part of the linked Subcontracting Inward Order. Please select valid Serial No(s)." msgstr "" -#: erpnext/controllers/accounts_controller.py:669 +#: erpnext/controllers/accounts_controller.py:705 msgid "Row #{0}: Service End Date cannot be before Invoice Posting Date" msgstr "" -#: erpnext/controllers/accounts_controller.py:663 +#: erpnext/controllers/accounts_controller.py:699 msgid "Row #{0}: Service Start Date cannot be greater than Service End Date" msgstr "" -#: erpnext/controllers/accounts_controller.py:657 +#: erpnext/controllers/accounts_controller.py:693 msgid "Row #{0}: Service Start and End Date is required for deferred accounting" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:495 +#: erpnext/selling/doctype/sales_order/sales_order.py:496 msgid "Row #{0}: Set Supplier for item {1}" msgstr "" @@ -46628,19 +46681,19 @@ msgstr "" msgid "Row #{0}: Source Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:465 +#: erpnext/manufacturing/doctype/work_order/work_order.py:468 msgid "Row #{0}: Source Warehouse {1} for item {2} cannot be a customer warehouse." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:420 +#: erpnext/manufacturing/doctype/work_order/work_order.py:423 msgid "Row #{0}: Source Warehouse {1} for item {2} must be same as Source Warehouse {3} in the Work Order." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1372 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1442 msgid "Row #{0}: Source and Target Warehouse cannot be the same for Material Transfer" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1394 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1464 msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer" msgstr "" @@ -46693,10 +46746,14 @@ msgstr "" msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/controllers/stock_controller.py:371 +#: erpnext/controllers/stock_controller.py:380 msgid "Row #{0}: The batch {1} has already expired." msgstr "" +#: erpnext/manufacturing/doctype/bom/bom.py:342 +msgid "Row #{0}: The operation {1} has 'Is Final Finished Good' checked, so its FG / Semi FG Item must be {2}." +msgstr "" + #: erpnext/stock/doctype/item/item.py:581 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "" @@ -46741,11 +46798,11 @@ msgstr "" msgid "Row #{0}: {1} can not be negative for item {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1322 +#: erpnext/controllers/stock_controller.py:1331 msgid "Row #{0}: {1} is mandatory for the Inventory Dimension {2}." msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:371 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:374 msgid "Row #{0}: {1} is not a valid reading field. Please refer to the field description." msgstr "" @@ -46757,7 +46814,7 @@ msgstr "" msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "" -#: erpnext/controllers/accounts_controller.py:3979 +#: erpnext/controllers/accounts_controller.py:4015 msgid "Row #{0}:Quantity for Item {1} cannot be zero." msgstr "" @@ -46773,7 +46830,7 @@ msgstr "" msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "" -#: erpnext/controllers/buying_controller.py:1142 +#: erpnext/controllers/buying_controller.py:1150 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "" @@ -46793,7 +46850,7 @@ msgstr "" msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "" -#: erpnext/controllers/buying_controller.py:1259 +#: erpnext/controllers/buying_controller.py:1267 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "" @@ -46862,11 +46919,11 @@ msgstr "" msgid "Row #{}: {} {} doesn't belong to Company {}. Please select valid {}." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:450 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:490 msgid "Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:748 +#: erpnext/manufacturing/doctype/job_card/job_card.py:750 msgid "Row {0} : Operation is required against the raw material item {1}" msgstr "" @@ -46874,7 +46931,7 @@ msgstr "" msgid "Row {0} picked quantity is less than the required quantity, additional {1} {2} required." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1991 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2061 msgid "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" msgstr "" @@ -46906,7 +46963,7 @@ msgstr "" msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1663 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1733 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "" @@ -46926,7 +46983,7 @@ msgstr "" msgid "Row {0}: Conversion Factor is mandatory" msgstr "" -#: erpnext/controllers/accounts_controller.py:3270 +#: erpnext/controllers/accounts_controller.py:3306 msgid "Row {0}: Cost Center {1} does not belong to Company {2}" msgstr "" @@ -46938,7 +46995,7 @@ msgstr "" msgid "Row {0}: Credit entry can not be linked with a {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:579 +#: erpnext/manufacturing/doctype/bom/bom.py:607 msgid "Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}" msgstr "" @@ -46954,7 +47011,7 @@ msgstr "" msgid "Row {0}: Delivery Warehouse cannot be same as Customer Warehouse for Item {1}." msgstr "" -#: erpnext/controllers/accounts_controller.py:2770 +#: erpnext/controllers/accounts_controller.py:2806 msgid "Row {0}: Due Date in the Payment Terms table cannot be before Posting Date" msgstr "" @@ -46963,7 +47020,7 @@ msgid "Row {0}: Either Delivery Note Item or Packed Item reference is mandatory. msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1037 -#: erpnext/controllers/taxes_and_totals.py:1382 +#: erpnext/controllers/taxes_and_totals.py:1422 msgid "Row {0}: Exchange Rate is mandatory" msgstr "" @@ -46979,15 +47036,15 @@ msgstr "" msgid "Row {0}: Expense Account {1} is linked to company {2}. Please select an account belonging to company {3}." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:540 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:580 msgid "Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:497 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:537 msgid "Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:522 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:562 msgid "Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}" msgstr "" @@ -46999,16 +47056,16 @@ msgstr "" msgid "Row {0}: From Time and To Time is mandatory." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:326 +#: erpnext/manufacturing/doctype/job_card/job_card.py:328 #: erpnext/projects/doctype/timesheet/timesheet.py:225 msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1739 +#: erpnext/controllers/stock_controller.py:1748 msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:317 +#: erpnext/manufacturing/doctype/job_card/job_card.py:319 msgid "Row {0}: From time must be less than to time" msgstr "" @@ -47044,7 +47101,7 @@ msgstr "" msgid "Row {0}: Item {1}'s quantity cannot be higher than the available quantity." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1245 +#: erpnext/manufacturing/doctype/bom/bom.py:1266 msgid "Row {0}: Operation time should be greater than 0 for operation {1}" msgstr "" @@ -47116,7 +47173,7 @@ msgstr "" msgid "Row {0}: Qty cannot be greater than {1} for the Item {2}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:747 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:752 msgid "Row {0}: Qty in Stock UOM can not be zero." msgstr "" @@ -47128,7 +47185,7 @@ msgstr "" msgid "Row {0}: Quantity cannot be negative." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1242 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1247 msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})" msgstr "" @@ -47136,7 +47193,7 @@ msgstr "" msgid "Row {0}: Sales Invoice {1} is already created for {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:353 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:358 msgid "Row {0}: Serial/Batch has been reset to values linked with Work Order {1} because the previously selected serial/batch does not belong to this Work Order." msgstr "" @@ -47144,11 +47201,11 @@ msgstr "" msgid "Row {0}: Shift cannot be changed since the depreciation has already been processed" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2004 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2074 msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1730 +#: erpnext/controllers/stock_controller.py:1739 msgid "Row {0}: Target Warehouse is mandatory for internal transfers" msgstr "" @@ -47156,15 +47213,15 @@ msgstr "" msgid "Row {0}: Task {1} does not belong to Project {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:187 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:202 msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:793 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:798 msgid "Row {0}: The item {1}, quantity must be positive number" msgstr "" -#: erpnext/controllers/accounts_controller.py:3247 +#: erpnext/controllers/accounts_controller.py:3283 msgid "Row {0}: The {3} Account {1} does not belong to the company {2}" msgstr "" @@ -47172,11 +47229,11 @@ msgstr "" msgid "Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3986 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4102 msgid "Row {0}: Transferred quantity cannot be greater than the requested quantity." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:741 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:746 msgid "Row {0}: UOM Conversion Factor is mandatory" msgstr "" @@ -47192,12 +47249,12 @@ msgstr "" msgid "Row {0}: Warehouse {1} is linked to company {2}. Please select a warehouse belonging to company {3}." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1239 -#: erpnext/manufacturing/doctype/work_order/work_order.py:494 +#: erpnext/manufacturing/doctype/bom/bom.py:1260 +#: erpnext/manufacturing/doctype/work_order/work_order.py:497 msgid "Row {0}: Workstation or Workstation Type is mandatory for an operation {1}" msgstr "" -#: erpnext/controllers/accounts_controller.py:1208 +#: erpnext/controllers/accounts_controller.py:1244 msgid "Row {0}: user has not applied the rule {1} on the item {2}" msgstr "" @@ -47209,7 +47266,7 @@ msgstr "" msgid "Row {0}: {1} must be greater than 0" msgstr "" -#: erpnext/controllers/accounts_controller.py:814 +#: erpnext/controllers/accounts_controller.py:850 msgid "Row {0}: {1} {2} cannot be same as {3} (Party Account) {4}" msgstr "" @@ -47225,11 +47282,11 @@ msgstr "" msgid "Row {0}: {2} Item {1} does not exist in {2} {3}" msgstr "" -#: erpnext/utilities/transaction_base.py:626 +#: erpnext/utilities/transaction_base.py:640 msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "" -#: erpnext/controllers/buying_controller.py:1124 +#: erpnext/controllers/buying_controller.py:1132 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "" @@ -47255,7 +47312,7 @@ msgstr "" msgid "Rows with Same Account heads will be merged on Ledger" msgstr "" -#: erpnext/controllers/accounts_controller.py:2781 +#: erpnext/controllers/accounts_controller.py:2817 msgid "Rows with duplicate due dates in other rows were found: {0}" msgstr "" @@ -47263,7 +47320,7 @@ msgstr "" msgid "Rows: {0} have 'Payment Entry' as reference_type. This should not be set manually." msgstr "" -#: erpnext/controllers/accounts_controller.py:307 +#: erpnext/controllers/accounts_controller.py:326 msgid "Rows: {0} in {1} section are Invalid. Reference Name should point to a valid Payment Entry or Journal Entry." msgstr "" @@ -47481,8 +47538,8 @@ msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:145 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:460 -#: erpnext/setup/doctype/company/company.py:652 +#: erpnext/setup/doctype/company/company.py:461 +#: erpnext/setup/doctype/company/company.py:653 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 #: erpnext/setup/install.py:423 @@ -47497,7 +47554,7 @@ msgstr "" msgid "Sales & Purchase" msgstr "" -#: erpnext/setup/doctype/company/company.py:652 +#: erpnext/setup/doctype/company/company.py:653 msgid "Sales Account" msgstr "" @@ -47697,7 +47754,7 @@ msgstr "" msgid "Sales Invoice {0} has already been submitted" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:591 +#: erpnext/selling/doctype/sales_order/sales_order.py:592 msgid "Sales Invoice {0} must be deleted before cancelling this Sales Order" msgstr "" @@ -47752,7 +47809,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:380 #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:284 -#: erpnext/accounts/report/sales_register/sales_register.py:252 +#: erpnext/accounts/report/sales_register/sales_register.py:261 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json #: erpnext/controllers/selling_controller.py:494 @@ -47896,12 +47953,12 @@ msgstr "" msgid "Sales Order required for Item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:356 +#: erpnext/selling/doctype/sales_order/sales_order.py:357 msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1805 -#: erpnext/selling/doctype/sales_order/sales_order.py:1818 +#: erpnext/selling/doctype/sales_order/sales_order.py:1837 +#: erpnext/selling/doctype/sales_order/sales_order.py:1850 msgid "Sales Order {0} is not available for production" msgstr "" @@ -47909,7 +47966,7 @@ msgstr "" msgid "Sales Order {0} is not submitted" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:570 +#: erpnext/manufacturing/doctype/work_order/work_order.py:573 msgid "Sales Order {0} is not valid" msgstr "" @@ -47966,7 +48023,7 @@ msgstr "" #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:130 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1260 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1292 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:117 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:194 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:74 @@ -48072,7 +48129,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:158 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:136 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1257 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1289 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:123 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:191 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:80 @@ -48340,12 +48397,12 @@ msgstr "" #. Label of the sample_size (Float) field in DocType 'Quality Inspection' #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:93 -#: erpnext/public/js/controllers/transaction.js:2882 +#: erpnext/public/js/controllers/transaction.js:2883 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Sample Size" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4489 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4605 msgid "Sample quantity {0} cannot be more than received quantity {1}" msgstr "" @@ -48403,7 +48460,7 @@ msgstr "" msgid "Scan Barcode" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:171 +#: erpnext/public/js/utils/serial_no_batch_selector.js:181 msgid "Scan Batch No" msgstr "" @@ -48419,7 +48476,7 @@ msgstr "" msgid "Scan Mode" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:156 +#: erpnext/public/js/utils/serial_no_batch_selector.js:166 msgid "Scan Serial No" msgstr "" @@ -48772,7 +48829,7 @@ msgstr "" msgid "Select BOM and Qty for Production" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:258 #: erpnext/public/js/utils/sales_common.js:441 #: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Batch No" @@ -48802,7 +48859,7 @@ msgstr "" msgid "Select Company Address" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:476 +#: erpnext/manufacturing/doctype/job_card/job_card.js:487 msgid "Select Corrective Operation" msgstr "" @@ -48838,7 +48895,7 @@ msgstr "" msgid "Select Dispatch Address " msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:705 +#: erpnext/manufacturing/doctype/job_card/job_card.js:715 msgid "Select Employees" msgstr "" @@ -48863,7 +48920,7 @@ msgstr "" msgid "Select Items based on Delivery Date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2917 +#: erpnext/public/js/controllers/transaction.js:2918 msgid "Select Items for Quality Inspection" msgstr "" @@ -48906,13 +48963,13 @@ msgstr "" msgid "Select Quantity" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:258 #: erpnext/public/js/utils/sales_common.js:441 #: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Serial No" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:246 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:261 #: erpnext/public/js/utils/sales_common.js:444 #: erpnext/stock/doctype/pick_list/pick_list.js:402 msgid "Select Serial and Batch" @@ -49048,7 +49105,7 @@ msgstr "" msgid "Select date" msgstr "" -#: erpnext/controllers/accounts_controller.py:3022 +#: erpnext/controllers/accounts_controller.py:3058 msgid "Select finance book for the item {0} at row {1}" msgstr "" @@ -49456,8 +49513,8 @@ msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:74 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:114 -#: erpnext/public/js/controllers/transaction.js:2895 -#: erpnext/public/js/utils/serial_no_batch_selector.js:432 +#: erpnext/public/js/controllers/transaction.js:2896 +#: erpnext/public/js/utils/serial_no_batch_selector.js:442 #: erpnext/selling/doctype/installation_note_item/installation_note_item.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/packed_item/packed_item.json @@ -49513,11 +49570,11 @@ msgstr "" msgid "Serial No Ledger" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:270 +#: erpnext/public/js/utils/serial_no_batch_selector.js:280 msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2802 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2805 msgid "Serial No Reserved" msgstr "" @@ -49586,7 +49643,7 @@ msgstr "" msgid "Serial No status sync has been queued. Reload the report after a few minutes." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:603 +#: erpnext/public/js/utils/serial_no_batch_selector.js:613 msgid "Serial No {0} already exists" msgstr "" @@ -49607,7 +49664,7 @@ msgstr "" msgid "Serial No {0} does not exist" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3591 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3594 msgid "Serial No {0} does not exists" msgstr "" @@ -49644,15 +49701,15 @@ msgid "Serial No: {0} has already been transacted into another POS Invoice." msgstr "" #: erpnext/public/js/utils/barcode_scanner.js:297 -#: erpnext/public/js/utils/serial_no_batch_selector.js:16 -#: erpnext/public/js/utils/serial_no_batch_selector.js:201 +#: erpnext/public/js/utils/serial_no_batch_selector.js:26 +#: erpnext/public/js/utils/serial_no_batch_selector.js:211 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:50 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:170 msgid "Serial Nos" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:20 -#: erpnext/public/js/utils/serial_no_batch_selector.js:205 +#: erpnext/public/js/utils/serial_no_batch_selector.js:30 +#: erpnext/public/js/utils/serial_no_batch_selector.js:215 msgid "Serial Nos / Batch Nos" msgstr "" @@ -49661,11 +49718,11 @@ msgstr "" msgid "Serial Nos / Batches" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2074 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2077 msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2373 +#: erpnext/stock/stock_ledger.py:2375 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" @@ -49750,11 +49807,11 @@ msgstr "" msgid "Serial and Batch Bundle Exists" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2303 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2306 msgid "Serial and Batch Bundle created" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2399 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2402 msgid "Serial and Batch Bundle updated" msgstr "" @@ -49766,7 +49823,7 @@ msgstr "" msgid "Serial and Batch Bundle {0} is not submitted" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2373 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2376 msgid "Serial and Batch Bundle {0} is submitted and its entries cannot be modified." msgstr "" @@ -49822,7 +49879,7 @@ msgstr "" msgid "Serial number {0} entered more than once" msgstr "" -#: erpnext/selling/page/point_of_sale/pos_item_details.js:451 +#: erpnext/selling/page/point_of_sale/pos_item_details.js:462 msgid "Serial numbers unavailable for Item {0} under warehouse {1}. Please try changing warehouse." msgstr "" @@ -50022,12 +50079,12 @@ msgid "Service Stop Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:45 -#: erpnext/public/js/controllers/transaction.js:1804 +#: erpnext/public/js/controllers/transaction.js:1805 msgid "Service Stop Date cannot be after Service End Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:42 -#: erpnext/public/js/controllers/transaction.js:1801 +#: erpnext/public/js/controllers/transaction.js:1802 msgid "Service Stop Date cannot be before Service Start Date" msgstr "" @@ -50051,7 +50108,7 @@ msgstr "" #. Label of the set_basic_rate_manually (Check) field in DocType 'Stock Entry #. Detail' -#: erpnext/stock/doctype/stock_entry/stock_entry.py:420 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:425 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Set Basic Rate Manually" msgstr "" @@ -50070,11 +50127,6 @@ msgstr "" msgid "Set Dropship Items Delivered Quantity" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:362 -#: erpnext/manufacturing/doctype/job_card/job_card.js:424 -msgid "Set Finished Good Quantity" -msgstr "" - #. Label of the set_from_warehouse (Link) field in DocType 'Purchase Invoice' #. Label of the set_from_warehouse (Link) field in DocType 'Purchase Order' #. Label of the set_from_warehouse (Link) field in DocType 'Purchase Receipt' @@ -50098,6 +50150,7 @@ msgstr "" #. Label of the set_landed_cost_based_on_purchase_invoice_rate (Check) field in #. DocType 'Buying Settings' +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:361 #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Set Landed Cost Based on Purchase Invoice Rate" msgstr "" @@ -50242,11 +50295,11 @@ msgstr "" msgid "Set closing balance as per bank statement" msgstr "" -#: erpnext/setup/doctype/company/company.py:550 +#: erpnext/setup/doctype/company/company.py:551 msgid "Set default inventory account for perpetual inventory" msgstr "" -#: erpnext/setup/doctype/company/company.py:576 +#: erpnext/setup/doctype/company/company.py:577 msgid "Set default {0} account for non stock items" msgstr "" @@ -50293,7 +50346,7 @@ msgstr "" msgid "Set the status manually." msgstr "" -#: erpnext/regional/italy/setup.py:231 +#: erpnext/regional/italy/setup.py:235 msgid "Set this if the customer is a Public Administration company." msgstr "" @@ -50388,8 +50441,8 @@ msgstr "" msgid "Setting up company" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1218 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1645 +#: erpnext/manufacturing/doctype/bom/bom.py:1239 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1627 msgid "Setting {0} is required" msgstr "" @@ -50639,7 +50692,7 @@ msgstr "" msgid "Shipping Address Template" msgstr "" -#: erpnext/controllers/accounts_controller.py:600 +#: erpnext/controllers/accounts_controller.py:619 msgid "Shipping Address does not belong to the {0}" msgstr "" @@ -50791,10 +50844,6 @@ msgstr "" msgid "Shortage Qty" msgstr "" -#: banking/src/components/features/Settings/KeyboardShortcuts.tsx:85 -msgid "Shortcut" -msgstr "" - #: erpnext/buying/report/purchase_analytics/purchase_analytics.js:70 #: erpnext/selling/report/sales_analytics/sales_analytics.js:103 msgid "Show Aggregate Value from Subsidiary Companies" @@ -51116,11 +51165,11 @@ msgstr "" msgid "Simultaneous" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:871 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:876 msgid "Since there is a process loss of {0} units for the finished good {1}, you should reduce the quantity by {0} units for the finished good {1} in the Items Table." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:323 +#: erpnext/manufacturing/doctype/bom/bom.py:351 msgid "Since you have enabled 'Track Semi Finished Goods', at least one operation must have 'Is Final Finished Good' checked. For that set the FG / Semi FG Item as {0} against an operation." msgstr "" @@ -51228,7 +51277,7 @@ msgstr "" msgid "Solvency Ratios" msgstr "" -#: erpnext/controllers/accounts_controller.py:4430 +#: erpnext/controllers/accounts_controller.py:4466 msgid "Some required Company details are missing. You don't have permission to update them. Please contact your System Manager." msgstr "" @@ -51301,11 +51350,11 @@ msgstr "" msgid "Source Stock Entry (Manufacture)" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1033 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1038 msgid "Source Stock Entry {0} belongs to Work Order {1}, not {2}. Please use a manufacture entry from the same Work Order." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2756 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2826 msgid "Source Stock Entry {0} has no finished goods quantity" msgstr "" @@ -51363,7 +51412,7 @@ msgstr "" msgid "Source Warehouse is mandatory for the Item {0}." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:379 +#: erpnext/manufacturing/doctype/work_order/work_order.py:382 msgid "Source Warehouse {0} must be same as Customer Warehouse {1} in the Subcontracting Inward Order." msgstr "" @@ -51371,7 +51420,7 @@ msgstr "" msgid "Source and Target Location cannot be same" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:999 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1004 msgid "Source and target warehouse cannot be same for row {0}" msgstr "" @@ -51384,13 +51433,13 @@ msgstr "" msgid "Source of Funds (Liabilities)" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:966 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:982 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:989 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:971 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:987 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:994 msgid "Source warehouse is mandatory for row {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:455 +#: erpnext/selling/doctype/sales_order/sales_order.py:456 msgid "Source warehouse required for stock item {0}" msgstr "" @@ -51535,17 +51584,17 @@ msgstr "" msgid "Stale Days" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:169 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:170 msgid "Stale Days should start from 1." msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:488 -#: erpnext/tests/utils.py:275 +#: erpnext/tests/utils.py:276 msgid "Standard Buying" msgstr "" -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:73 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:79 msgid "Standard Description" msgstr "" @@ -51555,8 +51604,8 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:496 -#: erpnext/stock/doctype/item/item.py:276 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2519 +#: erpnext/stock/doctype/item/item.py:276 erpnext/tests/utils.py:284 +#: erpnext/tests/utils.py:2543 msgid "Standard Selling" msgstr "" @@ -51616,7 +51665,7 @@ msgstr "" msgid "Start Date should be lower than End Date" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.js:660 +#: erpnext/manufacturing/doctype/job_card/job_card.js:670 #: erpnext/manufacturing/doctype/workstation/workstation.js:124 msgid "Start Job" msgstr "" @@ -51759,7 +51808,7 @@ msgstr "" msgid "Status must be one of {0}" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:283 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:286 msgid "Status set to rejected as there are one or more rejected readings." msgstr "" @@ -51789,8 +51838,8 @@ msgstr "" #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:96 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:158 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1416 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1455 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1456 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1495 #: erpnext/accounts/report/account_balance/account_balance.js:58 msgid "Stock Adjustment" msgstr "" @@ -51913,7 +51962,7 @@ msgstr "" msgid "Stock Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1210 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1215 msgid "Stock Entries already created for Work Order {0}: {1}" msgstr "" @@ -51977,7 +52026,7 @@ msgstr "" msgid "Stock Entry {0} created" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1614 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1737 msgid "Stock Entry {0} has created" msgstr "" @@ -52271,7 +52320,7 @@ msgstr "" #: erpnext/controllers/subcontracting_inward_controller.py:1037 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:2261 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2416 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2392 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1784 msgid "Stock Reservation Entries Created" msgstr "" @@ -52379,6 +52428,7 @@ msgstr "" #. Label of the stock_uom (Link) field in DocType 'BOM Explosion Item' #. Label of the stock_uom (Link) field in DocType 'BOM Item' #. Label of the stock_uom (Link) field in DocType 'BOM Secondary Item' +#. Label of the stock_uom (Link) field in DocType 'Job Card' #. Label of the stock_uom (Link) field in DocType 'Job Card Item' #. Label of the stock_uom (Link) field in DocType 'Job Card Secondary Item' #. Label of the stock_uom (Link) field in DocType 'Production Plan Sub Assembly @@ -52426,6 +52476,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/bom_secondary_item/bom_secondary_item.json +#: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_item/job_card_item.json #: erpnext/manufacturing/doctype/job_card_secondary_item/job_card_secondary_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -52475,7 +52526,7 @@ msgstr "" msgid "Stock Uom" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:768 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:808 msgid "Stock Update Not Allowed" msgstr "" @@ -52595,11 +52646,11 @@ msgstr "" msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:765 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:805 msgid "Stock cannot be updated for Purchase Invoice {0} because a Purchase Receipt {1} has already been created for this transaction. Please disable the 'Update Stock' checkbox in the Purchase Invoice and save the invoice." msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:124 +#: erpnext/stock/doctype/warehouse/warehouse.py:144 msgid "Stock entries exist with the old account. Changing the account may lead to a mismatch between the warehouse closing balance and the account closing balance. The overall closing balance will still match, but not for the specific account." msgstr "" @@ -52663,14 +52714,14 @@ msgstr "" msgid "Stop Reason" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1236 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1218 msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "" #: erpnext/setup/doctype/company/company.py:387 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:540 -#: erpnext/stock/doctype/item/item.py:313 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:313 erpnext/tests/utils.py:249 msgid "Stores" msgstr "" @@ -52728,7 +52779,7 @@ msgstr "" #. Label of the operation (Link) field in DocType 'Job Card Time Log' #. Name of a DocType -#: erpnext/manufacturing/doctype/job_card/job_card.js:309 +#: erpnext/manufacturing/doctype/job_card/job_card.js:361 #: erpnext/manufacturing/doctype/job_card_time_log/job_card_time_log.json #: erpnext/manufacturing/doctype/sub_operation/sub_operation.json msgid "Sub Operation" @@ -53122,7 +53173,7 @@ msgstr "" msgid "Submit your Quotation" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1524 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1621 msgid "Submitted Job Card cannot be processed." msgstr "" @@ -53564,7 +53615,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_payable/accounts_payable.js:119 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:102 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1264 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1296 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:198 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:178 #: erpnext/accounts/report/purchase_register/purchase_register.js:27 @@ -53627,7 +53678,7 @@ msgstr "" msgid "Supplier Invoice No" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1851 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1889 msgid "Supplier Invoice No exists in Purchase Invoice {0}" msgstr "" @@ -53665,7 +53716,7 @@ msgstr "" #. Label of the supplier_name (Data) field in DocType 'Purchase Receipt' #. Label of the supplier_name (Data) field in DocType 'Stock Entry' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1179 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1211 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:196 #: erpnext/accounts/report/purchase_register/purchase_register.py:193 @@ -53860,7 +53911,7 @@ msgstr "" #. Label of the supplier_warehouse (Link) field in DocType 'Purchase Receipt' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/manufacturing/doctype/job_card/job_card.js:91 +#: erpnext/manufacturing/doctype/job_card/job_card.js:95 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json msgid "Supplier Warehouse" msgstr "" @@ -53905,7 +53956,7 @@ msgstr "" msgid "Supplies subject to the reverse charge provision" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:317 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:313 #: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:382 msgid "Supply" msgstr "" @@ -54023,7 +54074,7 @@ msgstr "" msgid "System will fetch all the entries if limit value is zero." msgstr "" -#: erpnext/controllers/accounts_controller.py:2261 +#: erpnext/controllers/accounts_controller.py:2297 msgid "System will not check over billing since amount for Item {0} in {1} is zero" msgstr "" @@ -54033,6 +54084,14 @@ msgstr "" msgid "System will notify to increase or decrease quantity or amount " msgstr "" +#. Description of the 'Allow Stale Exchange Rates' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "" +"System will use the latest saved Currency Exchange rate on or before the transaction date, however old it is.
    \n" +"Uncheck to ignore rates older than Stale Days and fetch a fresh rate from the exchange rate provider instead." +msgstr "" + #. Description of the 'Tax Withholding Category' (Link) field in DocType #. 'Supplier' #: erpnext/buying/doctype/supplier/supplier.json @@ -54046,7 +54105,7 @@ msgstr "" msgid "TDS Computation Summary" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1609 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1649 msgid "TDS Deducted" msgstr "" @@ -54090,23 +54149,23 @@ msgstr "" msgid "Target Asset" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:212 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:238 msgid "Target Asset {0} cannot be cancelled" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:210 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:236 msgid "Target Asset {0} cannot be submitted" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:206 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:232 msgid "Target Asset {0} cannot be {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:216 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:242 msgid "Target Asset {0} does not belong to company {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:195 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:221 msgid "Target Asset {0} needs to be composite asset" msgstr "" @@ -54152,7 +54211,7 @@ msgstr "" msgid "Target Item Code" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:186 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:212 msgid "Target Item {0} must be a Fixed Asset item" msgstr "" @@ -54213,7 +54272,7 @@ msgstr "" msgid "Target Warehouse Address Link" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:324 +#: erpnext/manufacturing/doctype/work_order/work_order.py:327 msgid "Target Warehouse Reservation Error" msgstr "" @@ -54221,7 +54280,7 @@ msgstr "" msgid "Target Warehouse for Finished Good must be same as Finished Good Warehouse {1} in Work Order {2} linked to the Subcontracting Inward Order." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:924 +#: erpnext/manufacturing/doctype/work_order/work_order.py:906 msgid "Target Warehouse is required before Submit" msgstr "" @@ -54229,13 +54288,13 @@ msgstr "" msgid "Target Warehouse is set for some items but the customer is not an internal customer." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:395 +#: erpnext/manufacturing/doctype/work_order/work_order.py:398 msgid "Target Warehouse {0} must be same as Delivery Warehouse {1} in the Subcontracting Inward Order Item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:972 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:978 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:993 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:977 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:983 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:998 msgid "Target warehouse is mandatory for row {0}" msgstr "" @@ -54454,7 +54513,7 @@ msgstr "" #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:86 #: erpnext/accounts/report/general_ledger/general_ledger.js:142 #: erpnext/accounts/report/purchase_register/purchase_register.py:208 -#: erpnext/accounts/report/sales_register/sales_register.py:229 +#: erpnext/accounts/report/sales_register/sales_register.py:238 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:67 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:203 #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:56 @@ -54543,7 +54602,7 @@ msgstr "" msgid "Tax Template is mandatory." msgstr "" -#: erpnext/accounts/report/sales_register/sales_register.py:309 +#: erpnext/accounts/report/sales_register/sales_register.py:318 msgid "Tax Total" msgstr "" @@ -54698,7 +54757,7 @@ msgstr "" #. Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:237 -#: erpnext/controllers/taxes_and_totals.py:1253 +#: erpnext/controllers/taxes_and_totals.py:1293 msgid "Taxable Amount" msgstr "" @@ -54910,7 +54969,7 @@ msgstr "" msgid "Template Item" msgstr "" -#: erpnext/stock/get_item_details.py:342 +#: erpnext/stock/get_item_details.py:427 msgid "Template Item Selected" msgstr "" @@ -55122,7 +55181,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/territory_item/territory_item.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:142 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1248 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1280 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:108 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:182 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:68 @@ -55131,7 +55190,7 @@ msgstr "" #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js:8 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:22 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:259 -#: erpnext/accounts/report/sales_register/sales_register.py:223 +#: erpnext/accounts/report/sales_register/sales_register.py:232 #: erpnext/controllers/trends.py:410 erpnext/controllers/trends.py:434 #: erpnext/controllers/trends.py:499 erpnext/crm/doctype/lead/lead.json #: erpnext/crm/doctype/opportunity/opportunity.json @@ -55231,7 +55290,7 @@ msgstr "" msgid "The BOM which will be replaced" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1631 +#: erpnext/stock/serial_batch_bundle.py:1634 msgid "The Batch {0} has negative batch quantity {1}. To fix this, go to the batch and click on Recalculate Batch Qty. If the issue still persists, create an inward entry." msgstr "" @@ -55259,6 +55318,10 @@ msgstr "" msgid "The GL Entries will be cancelled in the background, it can take a few minutes." msgstr "" +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3313 +msgid "The Job Card {0} has only {1} left to produce, but this entry books {2} ({3} finished goods and {4} process loss). Cancel or update its other manufacture entries first." +msgstr "" + #: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:178 msgid "The Loyalty Program isn't valid for the selected company" msgstr "" @@ -55275,7 +55338,7 @@ msgstr "" msgid "The Pick List having Stock Reservation Entries cannot be updated. If you need to make changes, we recommend canceling the existing Stock Reservation Entries before updating the Pick List." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3208 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3269 msgid "The Process Loss Qty has reset as per job cards Process Loss Qty" msgstr "" @@ -55287,11 +55350,11 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2799 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2802 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2174 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2244 msgid "The Serial and Batch Bundle {0} is not valid for this transaction. The 'Type of Transaction' should be 'Outward' instead of 'Inward' in Serial and Batch Bundle {0}" msgstr "" @@ -55335,7 +55398,7 @@ msgstr "" msgid "The bank account is not a company account. Please select a company account" msgstr "" -#: erpnext/controllers/stock_controller.py:1496 +#: erpnext/controllers/stock_controller.py:1505 msgid "The batch {0} is reserved for {1} in the warehouse {2} and the remaining quantity is not enough to cover the reservations. So, cannot proceed with the {3} {4}." msgstr "" @@ -55351,10 +55414,14 @@ msgstr "" msgid "The company {0} is not in United Arab Emirates. UAE VAT 201 report is only available for companies in United Arab Emirates." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1379 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1419 msgid "The completed quantity {0} of an operation {1} cannot be greater than the completed quantity {2} of a previous operation {3}." msgstr "" +#: erpnext/manufacturing/doctype/job_card/job_card.py:1464 +msgid "The completed quantity {0} of an operation {1} cannot be greater than the manufactured quantity {2} of a previous operation {3}. Submit the manufacturing entry for the operation {3} first." +msgstr "" + #: erpnext/accounts/doctype/dunning/dunning.py:87 msgid "The currency of invoice {} ({}) is different from the currency of this dunning ({})." msgstr "" @@ -55433,7 +55500,7 @@ msgstr "" msgid "The following Items, having Putaway Rules, could not be accomodated:" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:141 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:142 msgid "The following Purchase Invoices are not submitted:" msgstr "" @@ -55445,7 +55512,7 @@ msgstr "" msgid "The following batches are expired, please restock them:
    {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:451 +#: erpnext/controllers/accounts_controller.py:470 msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "" @@ -55467,7 +55534,7 @@ msgid "" "{0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:115 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:116 msgid "The following rows are duplicates:" msgstr "" @@ -55498,7 +55565,7 @@ msgstr "" msgid "The invoice is not fully allocated as there is a difference of {0}." msgstr "" -#: erpnext/controllers/buying_controller.py:1326 +#: erpnext/controllers/buying_controller.py:1334 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "" @@ -55506,15 +55573,15 @@ msgstr "" msgid "The items {0} and {1} are present in the following {2} :" msgstr "" -#: erpnext/controllers/buying_controller.py:1319 +#: erpnext/controllers/buying_controller.py:1327 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:583 +#: erpnext/manufacturing/doctype/workstation/workstation.py:582 msgid "The job card {0} is in {1} state and you cannot complete." msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:577 +#: erpnext/manufacturing/doctype/workstation/workstation.py:576 msgid "The job card {0} is in {1} state and you cannot start it again." msgstr "" @@ -55564,7 +55631,7 @@ msgstr "" msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:233 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:245 msgid "The parent account {0} does not exists in the uploaded template" msgstr "" @@ -55664,7 +55731,7 @@ msgstr "" msgid "The shares don't exist with the {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:866 +#: erpnext/stock/stock_ledger.py:868 msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." msgstr "" @@ -55762,11 +55829,7 @@ msgstr "" msgid "The withdrawal or deposit amounts - only required if there's no amount column." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:909 -msgid "The {0} ({1}) must be equal to {2} ({3})" -msgstr "" - -#: erpnext/public/js/controllers/transaction.js:3387 +#: erpnext/public/js/controllers/transaction.js:3388 msgid "The {0} contains Unit Price Items." msgstr "" @@ -55782,7 +55845,7 @@ msgstr "" msgid "The {0} {1} does not match with the {0} {2} in the {3} {4}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1028 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1032 msgid "The {0} {1} is used to calculate the valuation cost for the finished good {2}." msgstr "" @@ -55867,7 +55930,7 @@ msgstr "" msgid "There is one unreconciled transaction before {0}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2111 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2181 msgid "There must be atleast 1 Finished Good in this Stock Entry" msgstr "" @@ -55939,7 +56002,7 @@ msgstr "" msgid "This Purchase Order has been fully subcontracted." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:2069 +#: erpnext/selling/doctype/sales_order/sales_order.py:2101 msgid "This Sales Order has been fully subcontracted." msgstr "" @@ -56082,7 +56145,7 @@ msgstr "" msgid "This is considered dangerous from accounting point of view." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:546 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:586 msgid "This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice" msgstr "" @@ -56165,11 +56228,11 @@ msgstr "" msgid "This schedule was created when Asset {0} was adjusted through Asset Value Adjustment {1}." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:479 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:507 msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:438 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:446 msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "" @@ -56177,7 +56240,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was restored due to Sales Invoice {1} cancellation." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:588 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:616 msgid "This schedule was created when Asset {0} was restored on Asset Capitalization {1}'s cancellation." msgstr "" @@ -56399,11 +56462,11 @@ msgstr "" msgid "Time in mins." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:886 +#: erpnext/manufacturing/doctype/job_card/job_card.py:891 msgid "Time logs are required for {0} {1}" msgstr "" -#: erpnext/crm/doctype/appointment/appointment.py:133 +#: erpnext/crm/doctype/appointment/appointment.py:134 msgid "Time slot is not available" msgstr "" @@ -56411,13 +56474,6 @@ msgstr "" msgid "Time(in mins)" msgstr "" -#. Label of the section_break_18 (Section Break) field in DocType 'Project' -#. Label of the sb_timeline (Section Break) field in DocType 'Task' -#: erpnext/projects/doctype/project/project.json -#: erpnext/projects/doctype/task/task.json -msgid "Timeline" -msgstr "" - #. Description of the 'PCV Job Timeout (seconds)' (Int) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -56514,7 +56570,7 @@ msgstr "" msgid "To Currency" msgstr "" -#: erpnext/controllers/accounts_controller.py:650 +#: erpnext/controllers/accounts_controller.py:669 #: erpnext/setup/doctype/holiday_list/holiday_list.py:121 msgid "To Date cannot be before From Date" msgstr "" @@ -56786,7 +56842,7 @@ msgid "To include sub-assembly costs and secondary items in Finished Goods on a msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2268 -#: erpnext/controllers/accounts_controller.py:3280 +#: erpnext/controllers/accounts_controller.py:3316 msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" @@ -56810,11 +56866,11 @@ msgstr "" msgid "To still proceed with editing this Attribute Value, enable {0} in Item Variant Settings." msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:637 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:677 msgid "To submit the invoice without purchase order please set {0} as {1} in {2}" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:659 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:699 msgid "To submit the invoice without purchase receipt please set {0} as {1} in {2}" msgstr "" @@ -57114,12 +57170,15 @@ msgstr "" #. Label of the total_completed_qty (Float) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/job_card/job_card.json -#: erpnext/manufacturing/doctype/job_card/job_card.py:905 #: erpnext/manufacturing/report/job_card_summary/job_card_summary.py:174 msgid "Total Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:192 +#: erpnext/manufacturing/doctype/job_card/job_card.py:911 +msgid "Total Completed Qty ({0}), Process Loss Qty ({1}) and Pending Qty ({2}) must add up to the Qty to Manufacture ({3})." +msgstr "" + +#: erpnext/manufacturing/doctype/job_card/job_card.py:194 msgid "Total Completed Qty is required for Job Card {0}, please start and complete the job card before submission" msgstr "" @@ -57421,7 +57480,7 @@ msgstr "" msgid "Total Paid Amount" msgstr "" -#: erpnext/controllers/accounts_controller.py:2835 +#: erpnext/controllers/accounts_controller.py:2871 msgid "Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total" msgstr "" @@ -57433,7 +57492,7 @@ msgstr "" msgid "Total Payments" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:722 +#: erpnext/selling/doctype/sales_order/sales_order.py:723 msgid "Total Picked Quantity {0} is more than ordered qty {1}. You can set the Over Picking Allowance in Stock Settings." msgstr "" @@ -57879,7 +57938,7 @@ msgstr "" msgid "Transaction Dates" msgstr "" -#: erpnext/setup/doctype/company/company.py:1093 +#: erpnext/setup/doctype/company/company.py:1094 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "" @@ -58012,7 +58071,7 @@ msgstr "" msgid "Transaction from which tax is withheld" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:863 +#: erpnext/manufacturing/doctype/job_card/job_card.py:868 msgid "Transaction not allowed against stopped Work Order {0}" msgstr "" @@ -58055,7 +58114,7 @@ msgstr "" msgid "Transactions Annual History" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:117 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:74 msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "" @@ -58511,7 +58570,7 @@ msgstr "" #: erpnext/manufacturing/doctype/sales_forecast_item/sales_forecast_item.json #: erpnext/manufacturing/doctype/work_order_additional_item/work_order_additional_item.json #: erpnext/manufacturing/doctype/workstation/workstation.js:480 -#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:70 +#: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:76 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:110 #: erpnext/public/js/stock_analytics.js:94 erpnext/public/js/utils.js:861 #: erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json @@ -58627,7 +58686,7 @@ msgstr "" msgid "UOM Name" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4411 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4527 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "" @@ -58703,7 +58762,7 @@ msgstr "" msgid "Unable to find score starting at {0}. You need to have standing scores covering 0 to 100" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1194 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1176 msgid "Unable to find the time slot in the next {0} days for the operation {1}. Please increase the 'Capacity Planning For (Days)' in the {2}." msgstr "" @@ -58811,7 +58870,7 @@ msgstr "" msgid "Unit Of Measure" msgstr "" -#: erpnext/controllers/accounts_controller.py:4162 +#: erpnext/controllers/accounts_controller.py:4198 msgid "Unit Price" msgstr "" @@ -59891,11 +59950,11 @@ msgstr "" msgid "Valuation Rate (In / Out)" msgstr "" -#: erpnext/stock/stock_ledger.py:2099 +#: erpnext/stock/stock_ledger.py:2101 msgid "Valuation Rate Missing" msgstr "" -#: erpnext/stock/stock_ledger.py:2077 +#: erpnext/stock/stock_ledger.py:2079 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" @@ -59927,7 +59986,7 @@ msgid "Valuation rate for the item as per Sales Invoice (Only for Internal Trans msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2292 -#: erpnext/controllers/accounts_controller.py:3304 +#: erpnext/controllers/accounts_controller.py:3340 msgid "Valuation type charges can not be marked as Inclusive" msgstr "" @@ -60416,7 +60475,7 @@ msgid "Volt-Ampere" msgstr "" #: erpnext/accounts/report/purchase_register/purchase_register.py:179 -#: erpnext/accounts/report/sales_register/sales_register.py:193 +#: erpnext/accounts/report/sales_register/sales_register.py:202 msgid "Voucher" msgstr "" @@ -60495,7 +60554,7 @@ msgstr "" #: erpnext/accounts/doctype/repost_accounting_ledger_items/repost_accounting_ledger_items.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1203 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1235 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:56 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:221 #: erpnext/accounts/report/general_ledger/general_ledger.js:49 @@ -60569,13 +60628,13 @@ msgstr "" #: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1201 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1233 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:212 #: erpnext/accounts/report/general_ledger/general_ledger.py:760 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:31 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:165 #: erpnext/accounts/report/purchase_register/purchase_register.py:174 -#: erpnext/accounts/report/sales_register/sales_register.py:188 +#: erpnext/accounts/report/sales_register/sales_register.py:197 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.py:17 #: erpnext/public/js/utils/unreconcile.js:71 #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json @@ -60762,7 +60821,7 @@ msgstr "" msgid "Warehouse and Reference" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:100 +#: erpnext/stock/doctype/warehouse/warehouse.py:120 msgid "Warehouse can not be deleted as stock ledger entry exists for this warehouse." msgstr "" @@ -60778,7 +60837,7 @@ msgstr "" msgid "Warehouse is required to get producible FG Items" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:241 +#: erpnext/stock/doctype/warehouse/warehouse.py:261 msgid "Warehouse not found against the account {0}" msgstr "" @@ -60792,7 +60851,7 @@ msgstr "" msgid "Warehouse wise Item Balance Age and Value" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:94 +#: erpnext/stock/doctype/warehouse/warehouse.py:114 msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "" @@ -60804,16 +60863,16 @@ msgstr "" msgid "Warehouse {0} does not belong to company {1}" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:288 +#: erpnext/stock/doctype/warehouse/warehouse.py:308 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:99 msgid "Warehouse {0} does not exist" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:321 +#: erpnext/manufacturing/doctype/work_order/work_order.py:324 msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:875 +#: erpnext/controllers/stock_controller.py:884 msgid "Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}." msgstr "" @@ -60830,15 +60889,15 @@ msgstr "" msgid "Warehouses" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:147 +#: erpnext/stock/doctype/warehouse/warehouse.py:167 msgid "Warehouses with child nodes cannot be converted to ledger" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:157 +#: erpnext/stock/doctype/warehouse/warehouse.py:177 msgid "Warehouses with existing transaction can not be converted to group." msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:149 +#: erpnext/stock/doctype/warehouse/warehouse.py:169 msgid "Warehouses with existing transaction can not be converted to ledger." msgstr "" @@ -60926,7 +60985,7 @@ msgstr "" msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "" -#: erpnext/stock/stock_ledger.py:876 +#: erpnext/stock/stock_ledger.py:878 msgid "Warning on Negative Stock" msgstr "" @@ -60934,7 +60993,7 @@ msgstr "" msgid "Warning!" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:122 +#: erpnext/stock/doctype/warehouse/warehouse.py:142 msgid "Warning: Account changed for warehouse" msgstr "" @@ -60946,11 +61005,11 @@ msgstr "" msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1630 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1612 msgid "Warning: Quantity exceeds maximum producible quantity based on quantity of raw materials received through the Subcontracting Inward Order {0}." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:349 +#: erpnext/selling/doctype/sales_order/sales_order.py:350 msgid "Warning: Sales Order {0} already exists against Customer's Purchase Order {1}" msgstr "" @@ -61262,7 +61321,7 @@ msgstr "" msgid "When enabled, transactions with this supplier will be blocked based on the Hold Type below" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:417 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:422 msgid "When there are multiple finished goods ({0}) in a Repack stock entry, the basic rate for all finished goods must be set manually. To set rate manually, enable the checkbox 'Set Basic Rate Manually' in the respective finished good row." msgstr "" @@ -61501,7 +61560,7 @@ msgstr "" msgid "Work Order Item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1036 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1041 msgid "Work Order Mismatch" msgstr "" @@ -61546,12 +61605,12 @@ msgstr "" msgid "Work Order cannot be created for following reason:
    {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1574 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1556 msgid "Work Order cannot be raised against a Item Template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2779 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2859 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2755 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2836 msgid "Work Order has been {0}" msgstr "" @@ -61559,15 +61618,15 @@ msgstr "" msgid "Work Order not created" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1392 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1396 msgid "Work Order {0} created" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2772 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2842 msgid "Work Order {0} has no produced qty" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1160 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1165 msgid "Work Order {0}: Job Card not found for the operation {1}" msgstr "" @@ -61597,7 +61656,7 @@ msgstr "" msgid "Work-in-Progress Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:922 +#: erpnext/manufacturing/doctype/work_order/work_order.py:904 msgid "Work-in-Progress Warehouse is required before Submit" msgstr "" @@ -61719,7 +61778,7 @@ msgstr "" msgid "Workstation Working Hour" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:464 +#: erpnext/manufacturing/doctype/workstation/workstation.py:463 msgid "Workstation is closed on the following dates as per Holiday List: {0}" msgstr "" @@ -61742,7 +61801,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:670 +#: erpnext/setup/doctype/company/company.py:671 msgid "Write Off" msgstr "" @@ -61895,7 +61954,7 @@ msgstr "" msgid "You are importing data for the code list:" msgstr "" -#: erpnext/controllers/accounts_controller.py:3959 +#: erpnext/controllers/accounts_controller.py:3995 msgid "You are not allowed to update as per the conditions set in {} Workflow." msgstr "" @@ -61911,7 +61970,7 @@ msgstr "" msgid "You are not authorized to set Frozen value" msgstr "" -#: erpnext/projects/doctype/task/task.py:317 +#: erpnext/projects/doctype/task/task.py:333 msgid "You are not permitted to create a Task for Project {0}" msgstr "" @@ -61976,7 +62035,7 @@ msgstr "" msgid "You can use {0} to reconcile against {1} later." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1391 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1477 msgid "You can't make any changes to Job Card since Work Order is closed." msgstr "" @@ -62016,7 +62075,7 @@ msgstr "" msgid "You cannot edit root node." msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:204 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:205 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" @@ -62061,7 +62120,7 @@ msgstr "" msgid "You do not have permission to import bank transactions" msgstr "" -#: erpnext/controllers/accounts_controller.py:3937 +#: erpnext/controllers/accounts_controller.py:3973 msgid "You do not have permissions to {} items in a {}." msgstr "" @@ -62073,11 +62132,11 @@ msgstr "" msgid "You don't have enough points to redeem." msgstr "" -#: erpnext/controllers/accounts_controller.py:4505 +#: erpnext/controllers/accounts_controller.py:4541 msgid "You don't have permission to create a Company Address. Please contact your System Manager." msgstr "" -#: erpnext/controllers/accounts_controller.py:4485 +#: erpnext/controllers/accounts_controller.py:4521 msgid "You don't have permission to update Company details. Please contact your System Manager." msgstr "" @@ -62085,7 +62144,7 @@ msgstr "" msgid "You don't have permission to update Received Qty DocField for item {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:4479 +#: erpnext/controllers/accounts_controller.py:4515 msgid "You don't have permission to update this document. Please contact your System Manager." msgstr "" @@ -62141,7 +62200,7 @@ msgstr "" msgid "You need to cancel POS Closing Entry {} to be able to cancel this document." msgstr "" -#: erpnext/controllers/accounts_controller.py:3255 +#: erpnext/controllers/accounts_controller.py:3291 msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account." msgstr "" @@ -62201,7 +62260,7 @@ msgstr "" msgid "Zero Rated" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:747 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:752 msgid "Zero quantity" msgstr "" @@ -62227,7 +62286,7 @@ msgstr "" msgid "`Allow Negative rates for Items`" msgstr "" -#: erpnext/stock/stock_ledger.py:2091 +#: erpnext/stock/stock_ledger.py:2093 msgid "after" msgstr "" @@ -62267,7 +62326,7 @@ msgstr "" msgid "cannot be greater than 100" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:351 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:391 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1158 msgid "dated {0}" msgstr "" @@ -62419,7 +62478,7 @@ msgstr "" msgid "per hour" msgstr "" -#: erpnext/stock/stock_ledger.py:2092 +#: erpnext/stock/stock_ledger.py:2094 msgid "performing either one below:" msgstr "" @@ -62563,7 +62622,7 @@ msgstr "" msgid "you must select Capital Work in Progress Account in accounts table" msgstr "" -#: erpnext/controllers/accounts_controller.py:1318 +#: erpnext/controllers/accounts_controller.py:1354 msgid "{0} '{1}' is disabled" msgstr "" @@ -62571,7 +62630,7 @@ msgstr "" msgid "{0} '{1}' not in Fiscal Year {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:808 +#: erpnext/manufacturing/doctype/work_order/work_order.py:787 msgid "{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}" msgstr "" @@ -62579,7 +62638,7 @@ msgstr "" msgid "{0} {1} has submitted Assets. Remove Item {2} from table to continue." msgstr "" -#: erpnext/controllers/accounts_controller.py:2415 +#: erpnext/controllers/accounts_controller.py:2451 msgid "{0} Account not found against Customer {1}." msgstr "" @@ -62607,7 +62666,7 @@ msgstr "" msgid "{0} Number {1} is already used in {2} {3}" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1694 +#: erpnext/manufacturing/doctype/bom/bom.py:1715 msgid "{0} Operating Cost for operation {1}" msgstr "" @@ -62635,7 +62694,7 @@ msgstr "" msgid "{0} account is not of type {1}" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:491 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:492 msgid "{0} account not found while submitting purchase receipt" msgstr "" @@ -62717,7 +62776,7 @@ msgstr "" msgid "{0} does not belong to Company {1}" msgstr "" -#: erpnext/controllers/accounts_controller.py:377 +#: erpnext/controllers/accounts_controller.py:396 msgid "{0} does not belong to the Company {1}." msgstr "" @@ -62759,7 +62818,7 @@ msgstr "" msgid "{0} hours" msgstr "" -#: erpnext/controllers/accounts_controller.py:2775 +#: erpnext/controllers/accounts_controller.py:2811 msgid "{0} in row {1}" msgstr "" @@ -62785,6 +62844,10 @@ msgstr "" msgid "{0} is added multiple times on rows: {1}" msgstr "" +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1788 +msgid "{0} is already a Reverse Journal Entry of {1}. Cancel it instead of reversing it." +msgstr "" + #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:639 msgid "{0} is already running for {1}" msgstr "" @@ -62814,15 +62877,15 @@ msgstr "" msgid "{0} is mandatory for account {1}" msgstr "" -#: erpnext/public/js/controllers/taxes_and_totals.js:132 +#: erpnext/public/js/controllers/taxes_and_totals.js:137 msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}" msgstr "" -#: erpnext/controllers/accounts_controller.py:3212 +#: erpnext/controllers/accounts_controller.py:3248 msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1929 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1932 msgid "{0} is not a CSV file." msgstr "" @@ -62834,7 +62897,7 @@ msgstr "" msgid "{0} is not a group node. Please select a group node as parent cost center" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:799 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:804 msgid "{0} is not a stock Item" msgstr "" @@ -62914,7 +62977,7 @@ msgstr "" msgid "{0} not allowed to transact with {1}. Please change the Company or add the Company in the 'Allowed To Transact With'-Section in the Customer record." msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:612 +#: erpnext/manufacturing/doctype/bom/bom.py:640 msgid "{0} not found for item {1}" msgstr "" @@ -62926,7 +62989,7 @@ msgstr "" msgid "{0} payment entries can not be filtered by {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1917 +#: erpnext/controllers/stock_controller.py:1926 msgid "{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}." msgstr "" @@ -62955,16 +63018,16 @@ msgstr "" msgid "{0} units of {1} are required in {2} with the inventory dimension: {3} on {4} {5} for {6} to complete the transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1744 erpnext/stock/stock_ledger.py:2259 -#: erpnext/stock/stock_ledger.py:2273 +#: erpnext/stock/stock_ledger.py:1746 erpnext/stock/stock_ledger.py:2261 +#: erpnext/stock/stock_ledger.py:2275 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:2360 erpnext/stock/stock_ledger.py:2405 +#: erpnext/stock/stock_ledger.py:2362 erpnext/stock/stock_ledger.py:2407 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1738 +#: erpnext/stock/stock_ledger.py:1740 msgid "{0} units of {1} needed in {2} to complete this transaction." msgstr "" @@ -62996,11 +63059,11 @@ msgstr "" msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1037 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1041 msgid "{0} {1}" msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:265 +#: erpnext/public/js/utils/serial_no_batch_selector.js:275 msgid "{0} {1} Manually" msgstr "" @@ -63035,7 +63098,7 @@ msgid "{0} {1} has already been partly paid. Please use the 'Get Outstanding Inv msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:426 -#: erpnext/selling/doctype/sales_order/sales_order.py:600 +#: erpnext/selling/doctype/sales_order/sales_order.py:601 #: erpnext/stock/doctype/material_request/material_request.py:306 msgid "{0} {1} has been modified. Please refresh." msgstr "" @@ -63126,7 +63189,7 @@ msgstr "" msgid "{0} {1} status is {2}." msgstr "" -#: erpnext/public/js/utils/serial_no_batch_selector.js:241 +#: erpnext/public/js/utils/serial_no_batch_selector.js:251 msgid "{0} {1} via CSV File" msgstr "" @@ -63153,7 +63216,7 @@ msgstr "" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "" -#: erpnext/controllers/stock_controller.py:1087 +#: erpnext/controllers/stock_controller.py:1096 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "" @@ -63198,12 +63261,16 @@ msgstr "" msgid "{0}% of total invoice value will be given as discount." msgstr "" -#: erpnext/projects/doctype/task/task.py:131 +#: erpnext/projects/doctype/task/task.py:137 msgid "{0}'s {1} cannot be after {2}'s Expected End Date." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1363 -#: erpnext/manufacturing/doctype/job_card/job_card.py:1371 +#: erpnext/projects/doctype/task/task.py:147 +msgid "{0}'s {1} cannot be before {2}'s Expected Start Date." +msgstr "" + +#: erpnext/manufacturing/doctype/job_card/job_card.py:1403 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1411 msgid "{0}, complete the operation {1} before the operation {2}." msgstr "" @@ -63235,11 +63302,11 @@ msgstr "" msgid "{0}: select the typed value {1} from the list or clear it" msgstr "" -#: erpnext/controllers/accounts_controller.py:567 +#: erpnext/controllers/accounts_controller.py:586 msgid "{0}: {1} does not belong to the Company: {2}" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1364 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1396 msgid "{0}: {1} does not exist" msgstr "" @@ -63251,11 +63318,11 @@ msgstr "" msgid "{0}: {1} must be less than {2}" msgstr "" -#: erpnext/controllers/buying_controller.py:1101 +#: erpnext/controllers/buying_controller.py:1109 msgid "{count} Assets created for {item_code}" msgstr "" -#: erpnext/controllers/buying_controller.py:999 +#: erpnext/controllers/buying_controller.py:1007 msgid "{doctype} {name} is cancelled or closed." msgstr "" @@ -63263,11 +63330,11 @@ msgstr "" msgid "{field_label} is mandatory for sub-contracted {doctype}." msgstr "" -#: erpnext/controllers/stock_controller.py:2383 +#: erpnext/controllers/stock_controller.py:2392 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "" -#: erpnext/controllers/stock_controller.py:2146 +#: erpnext/controllers/stock_controller.py:2155 msgid "{ref_doctype} {ref_name} status is {status}." msgstr "" From 6a0b9e1c70614ee36948b4500b4d776032a20c4a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 16 Aug 2026 14:16:29 +0000 Subject: [PATCH 41/82] fix(crm)!: remove unused `get_last_interaction` endpoint (backport #58214) (#58216) Co-authored-by: Diptanil Saha --- erpnext/crm/doctype/utils.py | 47 ------------------------------------ 1 file changed, 47 deletions(-) diff --git a/erpnext/crm/doctype/utils.py b/erpnext/crm/doctype/utils.py index c42db1757b9..f3230e36568 100644 --- a/erpnext/crm/doctype/utils.py +++ b/erpnext/crm/doctype/utils.py @@ -1,53 +1,6 @@ import frappe -@frappe.whitelist() -def get_last_interaction(contact=None, lead=None): - if not contact and not lead: - return - - last_communication = None - last_issue = None - if contact: - query_condition = "" - values = [] - contact = frappe.get_doc("Contact", contact) - for link in contact.links: - if link.link_doctype == "Customer": - last_issue = get_last_issue_from_customer(link.link_name) - query_condition += "(`reference_doctype`=%s AND `reference_name`=%s) OR" - values += [link.link_doctype, link.link_name] - - if query_condition: - # remove extra appended 'OR' - query_condition = query_condition[:-2] - last_communication = frappe.db.sql( - f""" - SELECT `name`, `content` - FROM `tabCommunication` - WHERE `sent_or_received`='Received' - AND ({query_condition}) - ORDER BY `creation` - LIMIT 1 - """, - values, - as_dict=1, - ) # nosec - - if lead: - last_communication = frappe.get_all( - "Communication", - filters={"reference_doctype": "Lead", "reference_name": lead, "sent_or_received": "Received"}, - fields=["name", "content"], - order_by="`creation` DESC", - limit=1, - ) - - last_communication = last_communication[0] if last_communication else None - - return {"last_communication": last_communication, "last_issue": last_issue} - - def get_last_issue_from_customer(customer_name): issues = frappe.get_all( "Issue", From 2b685ed98291a7ad4a9daaeb245a316cc5cb6102 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 16 Aug 2026 15:04:21 +0000 Subject: [PATCH 42/82] fix(bank_statement_import): add missing permission check on `get_import_status` (backport #58217) (#58219) Co-authored-by: Diptanil Saha --- .../doctype/bank_statement_import/bank_statement_import.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py index f459481a496..fbe5d3fcd07 100644 --- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py +++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py @@ -392,6 +392,7 @@ def get_import_status(docname): import_status = {} data_import = frappe.get_doc("Bank Statement Import", docname) + data_import.check_permission() import_status["status"] = data_import.status logs = frappe.get_all( From 81461ea56c58bc86b57ce246863f61a9f750dfe9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sun, 16 Aug 2026 18:03:24 +0000 Subject: [PATCH 43/82] fix(bank_statement_import): add missing permission check on multiple whitelisted methods (backport #58221) (#58224) Co-authored-by: Diptanil Saha --- .../bank_statement_import.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py index fbe5d3fcd07..cf173ad5aed 100644 --- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py +++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py @@ -167,9 +167,10 @@ def get_transaction_reference(txn_data: dict) -> str: ).strip() -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def convert_mt940_to_csv(data_import, mt940_file_path): doc = frappe.get_doc("Bank Statement Import", data_import) + doc.check_permission("write") _file_doc, content = get_file(mt940_file_path) @@ -234,26 +235,30 @@ def convert_mt940_to_csv(data_import, mt940_file_path): @frappe.whitelist() def get_preview_from_template(data_import, import_file=None, google_sheets_url=None): - return frappe.get_doc("Bank Statement Import", data_import).get_preview_from_template( - import_file, google_sheets_url - ) + bsi = frappe.get_doc("Bank Statement Import", data_import) + bsi.check_permission() + return bsi.get_preview_from_template(import_file, google_sheets_url) @frappe.whitelist() def form_start_import(data_import): - job_id = frappe.get_doc("Bank Statement Import", data_import).start_import() - return job_id is not None + bsi = frappe.get_doc("Bank Statement Import", data_import) + bsi.check_permission("write") + return bsi.start_import() @frappe.whitelist() def download_errored_template(data_import_name): data_import = frappe.get_doc("Bank Statement Import", data_import_name) + data_import.check_permission() data_import.export_errored_rows() @frappe.whitelist() def download_import_log(data_import_name): - return frappe.get_doc("Bank Statement Import", data_import_name).download_import_log() + bsi = frappe.get_doc("Bank Statement Import", data_import_name) + bsi.check_permission() + return bsi.download_import_log() def is_mt940_format(content: str) -> bool: From 56ac87292f186746daeaf6407c2e436e9da93ffd Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 10:52:42 +0530 Subject: [PATCH 44/82] fix: correct Item Group doctype name in item tax template dashboard (backport #58192) (#58213) Co-authored-by: Pandiyan P --- .../doctype/item_tax_template/item_tax_template_dashboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py b/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py index 5a2bd720dd3..58320b237c3 100644 --- a/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py +++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py @@ -8,6 +8,6 @@ def get_data(): {"label": _("Pre Sales"), "items": ["Quotation", "Supplier Quotation"]}, {"label": _("Sales"), "items": ["Sales Invoice", "Sales Order", "Delivery Note"]}, {"label": _("Purchase"), "items": ["Purchase Invoice", "Purchase Order", "Purchase Receipt"]}, - {"label": _("Stock"), "items": ["Item Groups", "Item"]}, + {"label": _("Stock"), "items": ["Item Group", "Item"]}, ], } From 861fb26b2c6594a9f288ff6d5ed95ee8d61af168 Mon Sep 17 00:00:00 2001 From: Pandiyan P Date: Mon, 17 Aug 2026 15:26:15 +0530 Subject: [PATCH 45/82] =?UTF-8?q?fix(manufacturing):=20fall=20back=20to=20?= =?UTF-8?q?item=20group=20defaults=20for=20work=20order=20w=E2=80=A6=20(#5?= =?UTF-8?q?8237)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doctype/work_order/work_order.py | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 4a8aaac03dd..0facf78cad6 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -37,6 +37,7 @@ from erpnext.manufacturing.doctype.manufacturing_settings.manufacturing_settings from erpnext.manufacturing.doctype.work_order.services.material_coverage import ( get_minimum_material_coverage_fraction, ) +from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.stock.doctype.batch.batch import make_batch from erpnext.stock.doctype.item.item import get_item_defaults, validate_end_of_life from erpnext.stock.doctype.serial_no.serial_no import get_available_serial_nos, get_serial_nos @@ -576,7 +577,18 @@ class WorkOrder(Document): if not self.wip_warehouse and not self.skip_transfer: self.wip_warehouse = frappe.get_cached_value("Company", self.company, "default_wip_warehouse") if not self.fg_warehouse: - self.fg_warehouse = frappe.get_cached_value("Company", self.company, "default_fg_warehouse") + self.fg_warehouse = ( + frappe.get_cached_value("Company", self.company, "default_fg_warehouse") + or self.get_production_item_warehouse() + ) + + def get_production_item_warehouse(self): + if not self.production_item: + return None + + return get_item_defaults(self.production_item, self.company).get( + "default_warehouse" + ) or get_item_group_defaults(self.production_item, self.company).get("default_warehouse") def check_wip_warehouse_skip(self): if self.skip_transfer and not self.from_wip_warehouse: @@ -1714,7 +1726,12 @@ class WorkOrder(Document): "allow_alternative_item": item.allow_alternative_item, "required_qty": item.qty, "source_warehouse": ( - self.source_warehouse or item.source_warehouse or item.default_warehouse + self.source_warehouse + or item.source_warehouse + or item.default_warehouse + or get_item_group_defaults(item.item_code, self.company).get( + "default_warehouse" + ) ) if not reset_source_warehouse else self.source_warehouse, From dd4d10862deb5d7ea4fbdd6938dfb402b69c7857 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 17 Aug 2026 18:28:46 +0530 Subject: [PATCH 46/82] fix: don't set work order status to In Process only due to skip material transfer (#58245) --- erpnext/manufacturing/doctype/work_order/work_order.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 0facf78cad6..d7c1684193c 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -696,11 +696,7 @@ class WorkOrder(Document): elif self.docstatus == 1: if status not in ["Closed", "Stopped"]: status = "Not Started" - if ( - flt(self.material_transferred_for_manufacturing) > 0 - or self.skip_transfer - or self._has_transferred_material() - ): + if flt(self.material_transferred_for_manufacturing) > 0 or self._has_transferred_material(): status = "In Process" precision = frappe.get_precision("Work Order", "produced_qty") From a62a949b2af2fdc796c8acbf5aaad760ab5b626f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 08:41:58 +0000 Subject: [PATCH 47/82] fix(accounts): allocate drop-ship cost by invoice quantity (backport #58226) (#58263) Co-authored-by: Mihir Kandoi --- .../report/gross_profit/gross_profit.py | 76 +++++++++++++------ .../report/gross_profit/test_gross_profit.py | 66 +++++++++++++--- 2 files changed, 108 insertions(+), 34 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 8d03e2afe37..838e086ddd8 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -510,6 +510,7 @@ class GrossProfitGenerator: self.average_buying_rate = {} self.filters = frappe._dict(filters) self.load_invoice_items() + self.load_drop_ship_buying_rates() self.get_delivery_notes() self.load_product_bundle() @@ -641,7 +642,11 @@ class GrossProfitGenerator: returned_item_row.qty += row.qty returned_item_row.base_amount += row.base_amount - if not row.delivered_by_supplier: + if row.delivered_by_supplier: + buying_amount = self.get_drop_ship_buying_amount(row) + if buying_amount is not None: + row.buying_amount = flt(buying_amount, self.currency_precision) + else: row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision) def get_average_rate_based_on_group_by(self): @@ -781,28 +786,12 @@ class GrossProfitGenerator: # IMP NOTE # stock_ledger_entries should already be filtered by item_code and warehouse and # sorted by posting_date desc, posting_time desc - if ( - row.delivered_by_supplier - and row.so_detail - and ( - po_details := frappe.get_all( - "Purchase Order Item", - filters={"sales_order_item": row.so_detail, "docstatus": 1}, - pluck="name", - ) - ) - ): - from frappe.query_builder.functions import Sum + if row.delivered_by_supplier: + buying_amount = self.get_drop_ship_buying_amount(row) + if buying_amount is not None: + return buying_amount - table = frappe.qb.DocType("Purchase Invoice Item") - query = ( - frappe.qb.from_(table) - .select(Sum(table.qty * table.base_net_rate)) - .where((table.po_detail.isin(po_details)) & (table.docstatus == 1)) - ) - return flt(query.run()[0][0]) - - elif item_code in self.non_stock_items and (row.project or row.cost_center): + if item_code in self.non_stock_items and (row.project or row.cost_center): # Issue 6089-Get last purchasing rate for non-stock item item_rate = self.get_last_purchase_rate(item_code, row) return flt(row.qty) * item_rate @@ -833,6 +822,49 @@ class GrossProfitGenerator: return flt(row.qty) * self.get_average_buying_rate(row, item_code) + def load_drop_ship_buying_rates(self): + self.drop_ship_buying_rates = {} + sales_order_items = { + row.so_detail for row in self.si_list if row.delivered_by_supplier and row.so_detail + } + if not sales_order_items: + return + + from frappe.query_builder.functions import Sum + + purchase_order_item = frappe.qb.DocType("Purchase Order Item") + purchase_invoice_item = frappe.qb.DocType("Purchase Invoice Item") + buying_amounts = ( + frappe.qb.from_(purchase_order_item) + .left_join(purchase_invoice_item) + .on( + (purchase_invoice_item.po_detail == purchase_order_item.name) + & (purchase_invoice_item.docstatus == 1) + ) + .select( + purchase_order_item.sales_order_item, + Sum(purchase_invoice_item.qty * purchase_invoice_item.base_net_rate).as_("buying_amount"), + Sum(purchase_invoice_item.stock_qty).as_("stock_qty"), + ) + .where( + (purchase_order_item.sales_order_item.isin(sales_order_items)) + & (purchase_order_item.docstatus == 1) + ) + .groupby(purchase_order_item.sales_order_item) + .run(as_dict=True) + ) + + for row in buying_amounts: + self.drop_ship_buying_rates[row.sales_order_item] = ( + flt(row.buying_amount) / flt(row.stock_qty) if flt(row.stock_qty) else 0 + ) + + def get_drop_ship_buying_amount(self, row): + if row.so_detail not in self.drop_ship_buying_rates: + return + + return flt(row.qty) * self.drop_ship_buying_rates[row.so_detail] + def get_buying_amount_from_so_dn(self, sales_order, so_detail, item_code): from frappe.query_builder.functions import Avg diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index 1b26733e50a..0c7054d7c76 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -676,19 +676,9 @@ class TestGrossProfit(ERPNextTestSuite): self.assertEqual(total[8], 0.0) # gross profit % def test_drop_ship(self): - from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice - from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order, make_sales_invoice - from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order - from erpnext.stock.doctype.item.test_item import make_item + from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice - item = make_item("_Test Drop Ship Item", properties={"is_stock_item": 1, "delivered_by_supplier": 1}) - - so = make_sales_order(item=item.name, qty=10, rate=100) - po = make_purchase_order(so.name, selected_items=[so.items[0]])[0] - po.items[0].rate = 80 - po.supplier = "_Test Supplier" - po.submit() - make_purchase_invoice(po.name).submit() + so = self.create_drop_ship_order() si = make_sales_invoice(so.name).submit() filters = frappe._dict( @@ -700,6 +690,58 @@ class TestGrossProfit(ERPNextTestSuite): self.assertIsNone(data[1].buying_rate) self.assertEqual(data[1]["gross_profit_%"], 20) + def test_drop_ship_partial_billing_and_return(self): + from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice + + so = self.create_drop_ship_order() + first_invoice = make_sales_invoice(so.name) + first_invoice.items[0].qty = 4 + first_invoice.submit() + second_invoice = make_sales_invoice(so.name).submit() + + filters = frappe._dict( + company=first_invoice.company, + from_date=first_invoice.posting_date, + to_date=first_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_rows = { + row.parent_invoice: row + for row in data + if row.parent_invoice in {first_invoice.name, second_invoice.name} and row.indent == 1 + } + self.assertEqual(invoice_rows[first_invoice.name].buying_amount, 320) + self.assertEqual(invoice_rows[second_invoice.name].buying_amount, 480) + + sales_return = make_sales_return(first_invoice.name) + sales_return.items[0].qty = -2 + sales_return.submit() + + _, data = execute(filters=filters) + first_invoice_row = next( + row for row in data if row.parent_invoice == first_invoice.name and row.indent == 1 + ) + self.assertEqual(first_invoice_row.qty, 2) + self.assertEqual(first_invoice_row.buying_amount, 160) + self.assertEqual(first_invoice_row.gross_profit, 40) + + def create_drop_ship_order(self, qty=10, selling_rate=100, buying_rate=80): + from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice + from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + from erpnext.stock.doctype.item.test_item import make_item + + item = make_item("_Test Drop Ship Item", properties={"is_stock_item": 1, "delivered_by_supplier": 1}) + so = make_sales_order(item=item.name, qty=qty, rate=selling_rate) + purchase_order = make_purchase_order(so.name, selected_items=[so.items[0]])[0] + purchase_order.items[0].rate = buying_rate + purchase_order.supplier = "_Test Supplier" + purchase_order.submit() + make_purchase_invoice(purchase_order.name).submit() + + return so + def create_rate_adjustment_debit_note(self, against_invoice, adjustment_rate, item_code=None): """Create a rate adjustment debit note with no stock movement.""" dn = self.create_sales_invoice(qty=1, rate=adjustment_rate, do_not_save=True, do_not_submit=True) From 9b0db26c2552c62f33eca85a0d76383f7925adcc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 09:08:31 +0000 Subject: [PATCH 48/82] fix(accounts): match returns to source invoice items (backport #58250) (#58264) Co-authored-by: Mihir Kandoi --- .../report/gross_profit/gross_profit.py | 124 ++++++-- .../report/gross_profit/test_gross_profit.py | 301 +++++++++++++++++- 2 files changed, 393 insertions(+), 32 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 838e086ddd8..d73faead0f7 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -519,6 +519,7 @@ class GrossProfitGenerator: self.load_non_stock_items() self.get_returned_invoice_items() + self.allocate_legacy_return_items() self.process() def process(self): @@ -535,6 +536,8 @@ class GrossProfitGenerator: base_amount = 0 for row in reversed(self.si_list): + sales_invoice_item = row.item_row + if self.filters.get("group_by") == "Monthly": row.monthly = formatdate(row.posting_date, "MMM YYYY") @@ -597,7 +600,7 @@ class GrossProfitGenerator: row.buying_rate, row.base_rate = 0.0, 0.0 if self.is_not_invoice_row(row): - self.update_return_invoices(row) + self.update_return_invoices(row, sales_invoice_item) if grouped_by_invoice and row.indent == 1.0: buying_amount += row.buying_amount @@ -624,30 +627,32 @@ class GrossProfitGenerator: if self.grouped: self.get_average_rate_based_on_group_by() - def update_return_invoices(self, row): - if row.parent in self.returned_invoices and row.item_code in self.returned_invoices[row.parent]: - returned_item_rows = self.returned_invoices[row.parent][row.item_code] - for returned_item_row in returned_item_rows: - # returned_items 'qty' should be stateful - if returned_item_row.qty != 0: - if row.qty >= abs(returned_item_row.qty): - row.qty += returned_item_row.qty - row.base_amount += flt(returned_item_row.base_amount, self.currency_precision) - returned_item_row.qty = 0 - returned_item_row.base_amount = 0 + def update_return_invoices(self, row, sales_invoice_item): + returned_item_rows = self.returned_invoices.get(row.parent, {}).get(sales_invoice_item) + if not returned_item_rows: + return - else: - row.qty = 0 - row.base_amount = 0 - returned_item_row.qty += row.qty - returned_item_row.base_amount += row.base_amount + for returned_item_row in returned_item_rows: + # returned_items 'qty' should be stateful + if returned_item_row.qty != 0: + if row.qty >= abs(returned_item_row.qty): + row.qty += returned_item_row.qty + row.base_amount += flt(returned_item_row.base_amount, self.currency_precision) + returned_item_row.qty = 0 + returned_item_row.base_amount = 0 - if row.delivered_by_supplier: - buying_amount = self.get_drop_ship_buying_amount(row) - if buying_amount is not None: - row.buying_amount = flt(buying_amount, self.currency_precision) - else: - row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision) + else: + returned_item_row.qty += row.qty + returned_item_row.base_amount += row.base_amount + row.qty = 0 + row.base_amount = 0 + + if row.delivered_by_supplier: + buying_amount = self.get_drop_ship_buying_amount(row) + if buying_amount is not None: + row.buying_amount = flt(buying_amount, self.currency_precision) + else: + row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision) def get_average_rate_based_on_group_by(self): for key in list(self.grouped): @@ -728,7 +733,8 @@ class GrossProfitGenerator: returned_invoices = frappe.db.sql( """ select - si.name, si_item.item_code, si_item.stock_qty as qty, si_item.base_net_amount as base_amount, si.return_against + si.name, si_item.item_code, si_item.sales_invoice_item, si_item.stock_qty as qty, + si_item.base_net_amount as base_amount, si.return_against from `tabSales Invoice` si, `tabSales Invoice Item` si_item where @@ -742,17 +748,73 @@ class GrossProfitGenerator: ) self.returned_invoices = frappe._dict() + self.legacy_returned_invoices = frappe._dict() for inv in returned_invoices: - self.returned_invoices.setdefault(inv.return_against, frappe._dict()).setdefault( - inv.item_code, [] + invoice_returns = ( + self.returned_invoices if inv.sales_invoice_item else self.legacy_returned_invoices + ) + invoice_returns.setdefault(inv.return_against, frappe._dict()).setdefault( + inv.sales_invoice_item or inv.item_code, [] ).append(inv) - def skip_row(self, row): - if self.filters.get("group_by") != "Invoice": - if not row.get(scrub(self.filters.get("group_by", ""))): - return True + def allocate_legacy_return_items(self): + source_invoice_items = {} + for row in reversed(self.si_list): + if row.is_return or not row.parent or self.skip_row(row): + continue - return False + source_invoice_items.setdefault((row.parent, row.item_code), {}).setdefault(row.item_row, row.qty) + + for invoice, legacy_invoice_items in self.legacy_returned_invoices.items(): + returned_invoice_items = self.returned_invoices.setdefault(invoice, frappe._dict()) + for item_code, legacy_item_rows in legacy_invoice_items.items(): + targets = self.get_legacy_return_targets( + source_invoice_items.get((invoice, item_code), {}), returned_invoice_items + ) + for legacy_item_row in legacy_item_rows: + self.allocate_legacy_return_item(legacy_item_row, targets, returned_invoice_items) + + def get_legacy_return_targets(self, source_invoice_items, returned_invoice_items): + targets = [] + for item_row, qty in source_invoice_items.items(): + linked_return_qty = sum( + flt(returned_item.qty) for returned_item in returned_invoice_items.get(item_row, []) + ) + if available_qty := max(flt(qty) + linked_return_qty, 0): + targets.append(frappe._dict(item_row=item_row, available_qty=available_qty)) + + targets.sort(key=lambda target: bool(returned_invoice_items.get(target.item_row))) + return targets + + def allocate_legacy_return_item(self, legacy_item_row, targets, returned_invoice_items): + remaining_qty = abs(flt(legacy_item_row.qty)) + remaining_base_amount = flt(legacy_item_row.base_amount) + if not remaining_qty: + return + + qty_sign = -1 if legacy_item_row.qty < 0 else 1 + for target in targets: + if not target.available_qty: + continue + + allocated_qty = min(target.available_qty, remaining_qty) + allocated_item_row = frappe._dict(legacy_item_row.copy()) + allocated_item_row.qty = qty_sign * allocated_qty + allocated_item_row.base_amount = remaining_base_amount * allocated_qty / remaining_qty + returned_invoice_items.setdefault(target.item_row, []).append(allocated_item_row) + + target.available_qty -= allocated_qty + remaining_qty -= allocated_qty + remaining_base_amount -= allocated_item_row.base_amount + if not remaining_qty: + break + + def skip_row(self, row): + group_by = self.filters.get("group_by") + if group_by in {"Invoice", "Monthly"}: + return False + + return not row.get(scrub(group_by)) def get_buying_amount_from_product_bundle(self, row, product_bundle): buying_amount = 0.0 diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index 0c7054d7c76..43f03513c71 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -4,7 +4,7 @@ from frappe.utils import add_days, flt, get_first_day, get_last_day, nowdate from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note, make_sales_return from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice -from erpnext.accounts.report.gross_profit.gross_profit import execute +from erpnext.accounts.report.gross_profit.gross_profit import GrossProfitGenerator, execute from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.item.test_item import create_item @@ -726,6 +726,305 @@ class TestGrossProfit(ERPNextTestSuite): self.assertEqual(first_invoice_row.buying_amount, 160) self.assertEqual(first_invoice_row.gross_profit, 40) + def test_drop_ship_return_matches_sales_invoice_item(self): + from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice + from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order, make_sales_invoice + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + from erpnext.stock.doctype.item.test_item import make_item + + item = make_item( + "_Test Drop Ship Consolidated Return Item", + properties={"is_stock_item": 1, "delivered_by_supplier": 1}, + ) + sales_orders = [] + for qty, selling_rate, buying_rate in [(4, 100, 50), (6, 200, 80)]: + sales_order = make_sales_order(item=item.name, qty=qty, rate=selling_rate, do_not_submit=True) + sales_order.items[0].delivered_by_supplier = 1 + sales_order.items[0].supplier = "_Test Supplier" + sales_order.submit() + sales_orders.append(sales_order) + + purchase_order = make_purchase_order(sales_order.name, selected_items=[sales_order.items[0]])[0] + purchase_order.items[0].rate = buying_rate + purchase_order.supplier = "_Test Supplier" + purchase_order.submit() + make_purchase_invoice(purchase_order.name).submit() + + sales_invoice = make_sales_invoice(sales_orders[0].name) + sales_invoice = make_sales_invoice(sales_orders[1].name, target_doc=sales_invoice).submit() + sales_return = make_sales_return(sales_invoice.name) + sales_return.set("items", [sales_return.items[0]]) + sales_return.items[0].qty = -1 + sales_return.submit() + + filters = frappe._dict( + company=sales_invoice.company, + from_date=sales_invoice.posting_date, + to_date=sales_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_rows = [row for row in data if row.parent_invoice == sales_invoice.name and row.indent == 1] + invoice_rows.sort(key=lambda row: row["avg._selling_rate"]) + self.assertEqual([row.qty for row in invoice_rows], [3, 6]) + self.assertEqual([row.buying_amount for row in invoice_rows], [150, 480]) + + def test_return_matches_sales_invoice_item_for_delivery_note(self): + make_stock_entry( + company=self.company, + item_code=self.item, + target=self.warehouse, + qty=4, + basic_rate=50, + ) + delivery_note = self.create_delivery_note(qty=4, rate=100) + sales_invoice = make_sales_invoice(delivery_note.name).submit() + sales_return = make_sales_return(sales_invoice.name) + sales_return.items[0].qty = -1 + sales_return.submit() + + filters = frappe._dict( + company=sales_invoice.company, + from_date=sales_invoice.posting_date, + to_date=sales_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_row = next( + row for row in data if row.parent_invoice == sales_invoice.name and row.indent == 1 + ) + self.assertEqual(invoice_row.qty, 3) + self.assertEqual(invoice_row.selling_amount, 300) + + def test_return_combines_linked_and_legacy_item_buckets(self): + sales_invoice = self.create_sales_invoice(qty=4, rate=100) + linked_return = make_sales_return(sales_invoice.name) + linked_return.items[0].qty = -1 + linked_return.submit() + + legacy_return = make_sales_return(sales_invoice.name) + legacy_return.items[0].qty = -1 + legacy_return.submit() + frappe.db.set_value("Sales Invoice Item", legacy_return.items[0].name, "sales_invoice_item", None) + + filters = frappe._dict( + company=sales_invoice.company, + from_date=sales_invoice.posting_date, + to_date=sales_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_row = next( + row for row in data if row.parent_invoice == sales_invoice.name and row.indent == 1 + ) + self.assertEqual(invoice_row.qty, 2) + self.assertEqual(invoice_row.selling_amount, 200) + + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) + def test_legacy_return_prefers_item_without_linked_return(self): + sales_invoice = self.create_sales_invoice(qty=2, rate=100, do_not_submit=True) + second_item = frappe.copy_doc(sales_invoice.items[0], ignore_no_copy=False) + second_item.rate = 200 + sales_invoice.append("items", second_item) + sales_invoice.submit() + + linked_return = make_sales_return(sales_invoice.name) + linked_return.set("items", [linked_return.items[0]]) + linked_return.items[0].qty = -1 + linked_return.submit() + + legacy_return = make_sales_return(sales_invoice.name) + legacy_return.set("items", [legacy_return.items[1]]) + legacy_return.items[0].qty = -1 + legacy_return.submit() + frappe.db.set_value("Sales Invoice Item", legacy_return.items[0].name, "sales_invoice_item", None) + + filters = frappe._dict( + company=sales_invoice.company, + from_date=sales_invoice.posting_date, + to_date=sales_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_rows = [row for row in data if row.parent_invoice == sales_invoice.name and row.indent == 1] + invoice_rows.sort(key=lambda row: row["avg._selling_rate"]) + self.assertEqual([row.qty for row in invoice_rows], [1, 1]) + self.assertEqual([row.selling_amount for row in invoice_rows], [100, 200]) + + def test_legacy_return_remainder_spills_into_linked_item(self): + invoice = "SINV-TEST-RETURN-ALLOCATION" + linked_item = "SINV-ITEM-LINKED" + unlinked_item = "SINV-ITEM-LEGACY" + generator = GrossProfitGenerator.__new__(GrossProfitGenerator) + generator.currency_precision = 3 + generator.filters = frappe._dict(group_by="Invoice") + generator.returned_invoices = frappe._dict( + {invoice: frappe._dict({linked_item: [frappe._dict(qty=-1, base_amount=-100)]})} + ) + generator.legacy_returned_invoices = frappe._dict( + {invoice: frappe._dict({self.item: [frappe._dict(qty=-2, base_amount=-200)]})} + ) + linked_row = frappe._dict( + parent=invoice, + item_code=self.item, + item_row=linked_item, + is_return=False, + qty=3, + base_amount=300, + buying_rate=50, + delivered_by_supplier=False, + ) + unlinked_row = frappe._dict( + parent=invoice, + item_code=self.item, + item_row=unlinked_item, + is_return=False, + qty=1, + base_amount=100, + buying_rate=50, + delivered_by_supplier=False, + ) + + generator.si_list = [unlinked_row, linked_row] + generator.allocate_legacy_return_items() + generator.update_return_invoices(linked_row, linked_item) + generator.update_return_invoices(unlinked_row, unlinked_item) + + self.assertEqual((linked_row.qty, linked_row.base_amount), (1, 100)) + self.assertEqual((unlinked_row.qty, unlinked_row.base_amount), (0, 0)) + + def test_legacy_return_ignores_skipped_group_rows(self): + invoice = "SINV-TEST-SKIPPED-RETURN-ALLOCATION" + visible_item = "SINV-ITEM-WITH-PROJECT" + skipped_item = "SINV-ITEM-WITHOUT-PROJECT" + generator = GrossProfitGenerator.__new__(GrossProfitGenerator) + generator.currency_precision = 3 + generator.filters = frappe._dict(group_by="Project") + generator.returned_invoices = frappe._dict( + {invoice: frappe._dict({visible_item: [frappe._dict(qty=-1, base_amount=-100)]})} + ) + generator.legacy_returned_invoices = frappe._dict( + {invoice: frappe._dict({self.item: [frappe._dict(qty=-1, base_amount=-100)]})} + ) + visible_row = frappe._dict( + parent=invoice, + item_code=self.item, + item_row=visible_item, + is_return=False, + project="_Test Project", + qty=2, + base_amount=200, + buying_rate=50, + delivered_by_supplier=False, + ) + skipped_row = frappe._dict( + parent=invoice, + item_code=self.item, + item_row=skipped_item, + is_return=False, + project=None, + qty=1, + ) + + generator.si_list = [visible_row, skipped_row] + generator.allocate_legacy_return_items() + generator.update_return_invoices(visible_row, visible_item) + + self.assertNotIn(skipped_item, generator.returned_invoices[invoice]) + self.assertEqual((visible_row.qty, visible_row.base_amount), (0, 0)) + + def test_monthly_group_allocates_legacy_return(self): + invoice = "SINV-TEST-MONTHLY-RETURN-ALLOCATION" + item_row = "SINV-ITEM-MONTHLY-RETURN" + generator = GrossProfitGenerator.__new__(GrossProfitGenerator) + generator.currency_precision = 3 + generator.filters = frappe._dict(group_by="Monthly") + generator.returned_invoices = frappe._dict() + generator.legacy_returned_invoices = frappe._dict( + {invoice: frappe._dict({self.item: [frappe._dict(qty=-1, base_amount=-100)]})} + ) + invoice_row = frappe._dict( + parent=invoice, + item_code=self.item, + item_row=item_row, + is_return=False, + posting_date=nowdate(), + qty=1, + base_amount=100, + buying_rate=50, + delivered_by_supplier=False, + ) + + generator.si_list = [invoice_row] + generator.allocate_legacy_return_items() + generator.update_return_invoices(invoice_row, item_row) + + self.assertEqual((invoice_row.qty, invoice_row.base_amount), (0, 0)) + + def test_return_remainder_stays_available_for_next_row(self): + invoice = "SINV-TEST-RETURN-REMAINDER" + item_row = "SINV-ITEM-RETURN-REMAINDER" + returned_item = frappe._dict(qty=-2, base_amount=-200) + generator = GrossProfitGenerator.__new__(GrossProfitGenerator) + generator.currency_precision = 3 + generator.returned_invoices = frappe._dict({invoice: frappe._dict({item_row: [returned_item]})}) + first_row = frappe._dict( + parent=invoice, + item_code=self.item, + qty=1, + base_amount=100, + buying_rate=50, + delivered_by_supplier=False, + ) + second_row = first_row.copy() + + generator.update_return_invoices(first_row, item_row) + self.assertEqual((returned_item.qty, returned_item.base_amount), (-1, -100)) + + generator.update_return_invoices(second_row, item_row) + self.assertEqual((returned_item.qty, returned_item.base_amount), (0, 0)) + self.assertEqual((first_row.qty, second_row.qty), (0, 0)) + + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) + def test_return_keeps_buying_amount_of_unreturned_row(self): + unreturned_item = create_item( + "_Test Gross Profit Unreturned Item", warehouse=self.warehouse, company=self.company + ) + make_stock_entry( + company=self.company, + item_code=unreturned_item.name, + target=self.warehouse, + qty=40000, + basic_rate=33.33333, + ) + sales_invoice = self.create_sales_invoice(qty=1, rate=100, do_not_submit=True) + second_item = frappe.copy_doc(sales_invoice.items[0], ignore_no_copy=False) + second_item.item_code = unreturned_item.name + second_item.item_name = unreturned_item.name + second_item.qty = 30000 + sales_invoice.append("items", second_item) + sales_invoice.submit() + + sales_return = make_sales_return(sales_invoice.name) + sales_return.set("items", [sales_return.items[0]]) + sales_return.items[0].qty = -1 + sales_return.submit() + + filters = frappe._dict( + company=sales_invoice.company, + from_date=sales_invoice.posting_date, + to_date=sales_invoice.posting_date, + group_by="Invoice", + ) + _, data = execute(filters=filters) + invoice_row = next( + row + for row in data + if row.parent_invoice == sales_invoice.name and row.item_code == unreturned_item.name + ) + self.assertEqual(invoice_row.qty, 30000) + self.assertEqual(invoice_row.buying_amount, 999999.9) + def create_drop_ship_order(self, qty=10, selling_rate=100, buying_rate=80): from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order From 27a04d8e08f42cb079c2cfd5a0caba5c40289bf6 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Tue, 18 Aug 2026 15:17:32 +0530 Subject: [PATCH 49/82] fix: work order finish dialog with process loss qty from job card (backport #58256) (#58262) * fix(manufacturing): cap job card completed qty by previous operation and show process loss on finish dialog * fix: avoid double booking process loss on partial manufacture entries --- .../doctype/job_card/job_card.py | 44 +++++- .../doctype/job_card/test_job_card.py | 140 ++++++++++++++++++ .../doctype/work_order/work_order.js | 53 +++++-- .../stock/doctype/stock_entry/stock_entry.py | 6 +- 4 files changed, 222 insertions(+), 21 deletions(-) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 0e05bfb18a8..7546c0c8a16 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -150,6 +150,8 @@ class JobCard(Document): self.set_onload("job_card_excess_transfer", excess_transfer) self.set_onload("work_order_closed", self.is_work_order_closed()) self.set_onload("has_stock_entry", self.has_stock_entry()) + if self.docstatus == 0: + self.set_onload("max_completable_qty", self.get_max_completable_qty()) def on_discard(self): self.db_set("status", "Cancelled") @@ -1374,12 +1376,7 @@ class JobCard(Document): current_operation_qty += flt(self.total_completed_qty) - previous_operations = frappe.get_all( - "Work Order Operation", - fields=["name", "operation", "status", "completed_qty", "sequence_id", "finished_good"], - filters={"docstatus": 1, "parent": self.work_order, "sequence_id": ("<", self.sequence_id)}, - order_by="sequence_id, idx", - ) + previous_operations = self.get_previous_operations() message = "Job Card {}: As per the sequence of the operations in the work order {}".format( bold(self.name), bold(get_link_to_form("Work Order", self.work_order)) @@ -1443,6 +1440,41 @@ class JobCard(Document): return dict(data) + def get_previous_operations(self): + return frappe.get_all( + "Work Order Operation", + fields=["name", "operation", "status", "completed_qty", "sequence_id", "finished_good"], + filters={"docstatus": 1, "parent": self.work_order, "sequence_id": ("<", self.sequence_id)}, + order_by="sequence_id, idx", + ) + + def get_current_operation_completed_qty(self): + current_operation_qty = 0.0 + data = self.get_current_operation_data() + if data and len(data) > 0: + current_operation_qty = flt(data[0].completed_qty) + + return current_operation_qty + flt(self.total_completed_qty) + + def get_max_completable_qty(self): + if self.is_corrective_job_card or not (self.work_order and self.sequence_id): + return None + + previous_operations = self.get_previous_operations() + if not previous_operations: + return None + + if self.track_semi_finished_goods: + totals = self.get_manufactured_qty_per_operation([row.name for row in previous_operations]) + for row in previous_operations: + row.manufactured_qty = flt(totals.get(row.name)) + + qty_field = "manufactured_qty" if self.track_semi_finished_goods else "completed_qty" + min_completed_qty = min(flt(row.get(qty_field)) for row in previous_operations) + + precision = self.precision("total_completed_qty") + return flt(min_completed_qty - self.get_current_operation_completed_qty(), precision) + def validate_previous_operation_manufactured_qty(self, row, current_operation_qty): manufactured_qty = flt(row.manufactured_qty) diff --git a/erpnext/manufacturing/doctype/job_card/test_job_card.py b/erpnext/manufacturing/doctype/job_card/test_job_card.py index c12710318bd..1f99ae99482 100644 --- a/erpnext/manufacturing/doctype/job_card/test_job_card.py +++ b/erpnext/manufacturing/doctype/job_card/test_job_card.py @@ -915,6 +915,146 @@ class TestJobCard(ERPNextTestSuite): self.assertEqual(wo_doc.process_loss_qty, 2) self.assertEqual(wo_doc.status, "Completed") + def make_two_operation_work_order(self, qty=10): + from erpnext.manufacturing.doctype.routing.test_routing import ( + create_routing, + setup_bom, + setup_operations, + ) + from erpnext.stock.doctype.item.test_item import make_item + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + operations = [ + {"operation": "Test Operation A1", "workstation": "Test Workstation A", "time_in_mins": 30}, + {"operation": "Test Operation B1", "workstation": "Test Workstation A", "time_in_mins": 20}, + ] + + warehouse = create_warehouse("Test Warehouse 123 for Job Card") + setup_operations(operations) + + item_code = "Test Job Card Process Qty Item" + for item in [item_code, item_code + "RM 1", item_code + "RM 2"]: + if not frappe.db.exists("Item", item): + make_item(item, {"item_name": item, "stock_uom": "Nos", "is_stock_item": 1}) + + routing_doc = create_routing(routing_name="Testing Route", operations=operations) + bom_doc = setup_bom( + item_code=item_code, + routing=routing_doc.name, + raw_materials=[item_code + "RM 1", item_code + "RM 2"], + source_warehouse=warehouse, + ) + + for row in bom_doc.items: + make_stock_entry(item_code=row.item_code, target=row.source_warehouse, qty=qty, basic_rate=100) + + return make_wo_order_test_record( + production_item=item_code, + bom_no=bom_doc.name, + qty=qty, + skip_transfer=1, + wip_warehouse=warehouse, + source_warehouse=warehouse, + ) + + def test_completion_qty_capped_by_previous_operation(self): + wo_doc = self.make_two_operation_work_order() + job_cards = frappe.get_all( + "Job Card", + filters={"work_order": wo_doc.name}, + fields=["name", "sequence_id"], + order_by="sequence_id", + ) + + jc1 = frappe.get_doc("Job Card", job_cards[0].name) + self.assertIsNone(jc1.get_max_completable_qty()) + + jc1.append( + "time_logs", + {"from_time": now(), "to_time": add_to_date(now(), minutes=30), "completed_qty": 8}, + ) + jc1.save() + jc1.submit() + self.assertEqual(jc1.process_loss_qty, 2) + + jc2 = frappe.get_doc("Job Card", job_cards[1].name) + self.assertEqual(jc2.get_max_completable_qty(), 8) + + jc2.append("time_logs", {"from_time": add_to_date(now(), minutes=40)}) + jc2.save() + + self.assertRaises( + frappe.ValidationError, + jc2.complete_job_card, + qty=10, + for_quantity=10, + pending_qty=0, + process_loss_qty=0, + end_time=add_to_date(now(), minutes=70), + ) + + self.complete_second_operation_and_finish(wo_doc, jc2.name) + + def complete_second_operation_and_finish(self, wo_doc, job_card): + from erpnext.manufacturing.doctype.work_order.work_order import ( + make_stock_entry as make_stock_entry_for_wo, + ) + + jc2 = frappe.get_doc("Job Card", job_card) + jc2.time_logs[0].completed_qty = 7 + jc2.time_logs[0].to_time = add_to_date(now(), minutes=70) + jc2.save() + self.assertEqual(jc2.process_loss_qty, 3) + jc2.submit() + + se = frappe.get_doc(make_stock_entry_for_wo(wo_doc.name, "Manufacture", 10)) + se.submit() + + self.assertEqual(se.process_loss_qty, 3) + fg_qty = sum(d.qty for d in se.items if d.is_finished_item) + self.assertEqual(flt(fg_qty), 7) + + wo_doc.reload() + self.assertEqual(wo_doc.produced_qty, 7) + self.assertEqual(wo_doc.process_loss_qty, 3) + self.assertEqual(wo_doc.status, "Completed") + + def test_process_loss_booked_once_across_partial_entries(self): + from erpnext.manufacturing.doctype.work_order.work_order import ( + make_stock_entry as make_stock_entry_for_wo, + ) + + wo_doc = self.make_two_operation_work_order() + job_cards = frappe.get_all( + "Job Card", filters={"work_order": wo_doc.name}, fields=["name"], order_by="sequence_id" + ) + + for index, row in enumerate(job_cards): + jc = frappe.get_doc("Job Card", row.name) + from_time = add_to_date(now(), minutes=index * 40) + jc.append( + "time_logs", + {"from_time": from_time, "to_time": add_to_date(from_time, minutes=30), "completed_qty": 7}, + ) + jc.save() + jc.submit() + self.assertEqual(jc.process_loss_qty, 3) + + se1 = frappe.get_doc(make_stock_entry_for_wo(wo_doc.name, "Manufacture", 5)) + se1.submit() + self.assertEqual(se1.process_loss_qty, 3) + self.assertEqual(flt(sum(d.qty for d in se1.items if d.is_finished_item)), 2) + + se2 = frappe.get_doc(make_stock_entry_for_wo(wo_doc.name, "Manufacture", 5)) + se2.submit() + self.assertEqual(flt(se2.process_loss_qty), 0) + self.assertEqual(flt(sum(d.qty for d in se2.items if d.is_finished_item)), 5) + + wo_doc.reload() + self.assertEqual(wo_doc.process_loss_qty, 3) + self.assertEqual(wo_doc.produced_qty, 7) + self.assertEqual(wo_doc.status, "Completed") + def get_first_job_card(self, work_order): return frappe.get_doc( "Job Card", diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js index 04f259f1508..c5ceec37ccc 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.js +++ b/erpnext/manufacturing/doctype/work_order/work_order.js @@ -1021,6 +1021,15 @@ erpnext.work_order = { return flt(max, precision("qty")); }, + get_pending_operation_process_loss: (frm) => { + if (!(frm.doc.operations || []).length) { + return 0; + } + + const total_loss = Math.max(...frm.doc.operations.map((row) => flt(row.process_loss_qty))); + return flt(Math.max(total_loss - flt(frm.doc.process_loss_qty), 0), precision("qty")); + }, + show_disassembly_prompt: function (frm) { let max_qty = flt(frm.doc.produced_qty - frm.doc.disassembled_qty); @@ -1077,6 +1086,11 @@ erpnext.work_order = { show_prompt_for_qty_input: function (frm, purpose, qty, additional_transfer_entry) { let max = !additional_transfer_entry ? this.get_max_transferable_qty(frm, purpose) : qty; + if (purpose === "Manufacture") { + max = flt(Math.max(max - flt(frm.doc.process_loss_qty), 0), precision("qty")); + } + const pending_process_loss = + purpose === "Manufacture" ? this.get_pending_operation_process_loss(frm) : 0; let fields = [ { @@ -1085,23 +1099,36 @@ erpnext.work_order = { fieldname: "qty", description: __("Max: {0}", [max]), default: max, + onchange: function () { + if (pending_process_loss && frm.qty_prompt) { + frm.qty_prompt.set_value( + "finished_good_qty", + flt(Math.max(flt(this.value) - pending_process_loss, 0), precision("qty")) + ); + } + }, }, ]; - if (!additional_transfer_entry) { - fields.push({ - fieldtype: "Check", - label: __("Consider Process Loss"), - fieldname: "consider_process_loss", - default: 0, - onchange: function () { - if (this.value) { - frm.qty_prompt.set_value("qty", max - frm.doc.process_loss_qty); - } else { - frm.qty_prompt.set_value("qty", max); - } + if (pending_process_loss) { + fields.push( + { + fieldtype: "Float", + label: __("Process Loss Qty"), + fieldname: "process_loss_qty", + default: pending_process_loss, + read_only: 1, + description: __("Process loss booked against the operations of this work order."), }, - }); + { + fieldtype: "Float", + label: __("Finished Good Qty"), + fieldname: "finished_good_qty", + default: flt(Math.max(max - pending_process_loss, 0), precision("qty")), + read_only: 1, + description: __("Actual quantity of the finished good that will be manufactured."), + } + ); } return new Promise((resolve, reject) => { diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 604bb994eb3..5779f38869f 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -3323,7 +3323,7 @@ class StockEntry(StockController, SubcontractingInwardController): def get_pending_process_loss_qty(self): """Loss this entry should still book: the job card's unbooked loss when the entry - belongs to one, else the largest operation loss on the work order (legacy flow).""" + belongs to one, else the unbooked portion of the largest operation loss on the work order.""" if self.job_card: job_card = frappe.get_doc("Job Card", self.job_card) return max(flt(job_card.process_loss_qty) - flt(job_card.get_consumed_process_loss()), 0) @@ -3334,7 +3334,9 @@ class StockEntry(StockController, SubcontractingInwardController): filters={"parent": self.work_order}, fields=[{"MAX": "process_loss_qty", "as": "process_loss_qty"}], ) - return flt(data[0].process_loss_qty) if data else 0 + max_operation_loss = flt(data[0].process_loss_qty) if data else 0 + booked_loss = flt(frappe.db.get_value("Work Order", self.work_order, "process_loss_qty")) + return max(max_operation_loss - booked_loss, 0) return 0 From 6b7b4796b45f6b8b20a37ee4d515b8921cb5d83f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2026 00:16:52 +0530 Subject: [PATCH 50/82] fix: escape interpolated values in portal, print and desk templates (backport #58273) (#58278) Co-authored-by: diptanilsaha --- .../pos_invoice_with_item_image.json | 2 +- .../purchase_invoice_with_item_image.json | 2 +- .../sales_invoice_with_item_image.json | 2 +- .../purchase_order_with_item_image.json | 2 +- .../request_for_quotation_with_item_image.json | 2 +- erpnext/manufacturing/doctype/bom/bom.js | 4 +++- .../doctype/bom/bom_item_preview.html | 4 ++-- .../doctype/work_order/work_order_preview.html | 4 ++-- .../doctype/workstation/workstation_job_card.html | 14 +++++++------- .../production_plan_summary.js | 5 ++++- .../doctype/project/project_dashboard.html | 2 +- erpnext/public/js/templates/call_link.html | 4 ++-- erpnext/public/js/templates/crm_activities.html | 12 ++++++------ .../quotation_with_item_image.json | 2 +- .../sales_order_with_item_image.json | 2 +- erpnext/stock/doctype/item/item.js | 5 ++++- erpnext/stock/doctype/shipment/shipment.js | 5 ++++- .../delivery_note_with_item_image.json | 2 +- .../serial_no_and_batch_traceability.js | 7 +++++-- .../templates/form_grid/includes/visible_cols.html | 2 +- erpnext/templates/form_grid/item_grid.html | 12 ++++++------ .../templates/form_grid/material_request_grid.html | 8 ++++---- erpnext/templates/form_grid/stock_entry_grid.html | 10 +++++----- erpnext/templates/generators/sales_partner.html | 4 ++-- erpnext/templates/includes/macros.html | 10 +++++----- .../templates/includes/projects/project_row.html | 4 ++-- .../templates/includes/projects/project_tasks.html | 4 ++-- .../includes/projects/project_timesheets.html | 4 ++-- erpnext/templates/includes/rfq.js | 8 ++++---- erpnext/templates/includes/transaction_row.html | 2 +- erpnext/templates/pages/help.html | 14 +++++++------- erpnext/templates/pages/order.html | 2 +- erpnext/templates/pages/partners.html | 8 ++++---- erpnext/templates/pages/projects.html | 2 +- erpnext/templates/pages/projects.js | 6 +++--- .../includes/item_table_description.html | 2 +- erpnext/www/support/index.html | 4 ++-- 37 files changed, 101 insertions(+), 87 deletions(-) diff --git a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json index a9d81808a78..6a456894e65 100644 --- a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json @@ -9,7 +9,7 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Customer Name:
    \n\t\t\t\t\t\t
    Bill to:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.customer_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Number:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Payment Due Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Customer Name:
    \n\t\t\t\t\t\t
    Bill to:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.customer_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Number:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Payment Due Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json index f3677f07639..acd011f251b 100644 --- a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json @@ -9,7 +9,7 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.supplier_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
    \n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Purchase Invoice:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Posting Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Due By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.supplier_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
    \n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Purchase Invoice:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Posting Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Due By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, diff --git a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json index 5f19124c267..756087e819a 100644 --- a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json @@ -9,7 +9,7 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Customer Name:
    \n\t\t\t\t\t\t
    Bill to:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.customer_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Number:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Payment Due Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Customer Name:
    \n\t\t\t\t\t\t
    Bill to:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.customer_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Number:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Invoice Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.posting_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    Payment Due Date:
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.due_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, diff --git a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json index c8f9f43bb0b..85746ea47cd 100644 --- a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json +++ b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json @@ -9,7 +9,7 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.supplier_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
    \n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Purchase Order:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Order Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.transaction_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Required By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.schedule_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.supplier_name }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
    \n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Purchase Order:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.name }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Order Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.transaction_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Required By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.schedule_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
    {{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
    \n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
    \n\t\t
    \n\n\t\t
    \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, diff --git a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json index 8ec8d02c73c..bfa936e6f5f 100644 --- a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json +++ b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json @@ -9,7 +9,7 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Shipping Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.vendor }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
    \n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Order Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.transaction_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Required By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.schedule_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
    {{ letter_head }}
    \n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
    \n\t
    \n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
    \n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
    \n\t\t\t

    {{ _(\"CANCELLED\") }}

    \n\t\t
    \n\t{%- endif -%}\n\t{%- if doc.meta.is_submittable and doc.docstatus==0 and (print_settings==None or print_settings.add_draft_heading) -%}\n\t\t
    \n\t\t\t

    {{ _(\"DRAFT\") }}

    \n\t\t
    \n\t{%- endif -%}\n\n\t\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Supplier Name:\") }}
    \n\t\t\t\t\t\t
    {{ _(\"Shipping Address:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ doc.vendor }}
    \n\t\t\t\t\t\t
    \n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
    \n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
    \n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
    {% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
    \n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Order Date:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.transaction_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ _(\"Required By:\") }}
    \n\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    {{ frappe.utils.format_date(doc.schedule_date) }}
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
    {{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
    {{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t
    {{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
    \n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
    \n\t\t\t
    {{ _(\"Terms and Conditions\") }}
    \n\t\t\t{{ doc.terms}}\n\t\t
    \n\t\t{% endif %}\n\t
    \n\t
    \n\t\t{% if not no_letterhead and footer %}\n\t\t
    \n\t\t\t{{ footer }}\n\t\t
    \n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

    \n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

    \n\t\t{% endif %}\n\t
    \n
    \n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 7a002da2fac..17e9e2caeec 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -309,7 +309,9 @@ frappe.ui.form.on("BOM", { frm.set_intro( __("This is a Template BOM and will be used to make the work order for {0} of the item {1}", [ `
    variants`, - `${frm.doc.item}`, + `${frappe.utils.escape_html( + frm.doc.item + )}`, ]), true ); diff --git a/erpnext/manufacturing/doctype/bom/bom_item_preview.html b/erpnext/manufacturing/doctype/bom/bom_item_preview.html index 06dd4365c67..d3c308bbd8e 100644 --- a/erpnext/manufacturing/doctype/bom/bom_item_preview.html +++ b/erpnext/manufacturing/doctype/bom/bom_item_preview.html @@ -20,11 +20,11 @@

    {% if data.value && data.value != "BOM" %} - + {{ __("Open BOM {0}", [data.value.bold()]) }} {% endif %} {% if data.item_code %} - + {{ __("Open Item {0}", [data.item_code.bold()]) }} {% endif %}

    diff --git a/erpnext/manufacturing/doctype/work_order/work_order_preview.html b/erpnext/manufacturing/doctype/work_order/work_order_preview.html index 95bdd291ee0..112c8d8250e 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order_preview.html +++ b/erpnext/manufacturing/doctype/work_order/work_order_preview.html @@ -20,11 +20,11 @@

    {% if data.value %} - + {{ __("Open Work Order {0}", [data.value.bold()]) }} {% endif %} {% if data.item_code %} - + {{ __("Open Item {0}", [data.item_code.bold()]) }} {% endif %}

    diff --git a/erpnext/manufacturing/doctype/workstation/workstation_job_card.html b/erpnext/manufacturing/doctype/workstation/workstation_job_card.html index 2049f3fe6a5..be0e2433ce5 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation_job_card.html +++ b/erpnext/manufacturing/doctype/workstation/workstation_job_card.html @@ -14,10 +14,10 @@
    {% $.each(data, (idx, d) => { %} - -
    - {{ _(doc.status) }} -
    + {% if doc.doctype != "Request for Quotation" %} +
    + {{ _(doc.status) }} +
    + {% endif %}
    {{ doc.items_preview | e }} From 59334767783d50b94d7b5c3ef900ca1f2dccfbdc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 11:19:45 +0000 Subject: [PATCH 73/82] fix: filter available batch report by company (backport #57995) (#58077) Co-authored-by: Krishna Shirsath --- .../report/available_batch_report/available_batch_report.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/stock/report/available_batch_report/available_batch_report.py b/erpnext/stock/report/available_batch_report/available_batch_report.py index e5f14315773..84a671431ed 100644 --- a/erpnext/stock/report/available_batch_report/available_batch_report.py +++ b/erpnext/stock/report/available_batch_report/available_batch_report.py @@ -154,6 +154,9 @@ def get_batchwise_data_from_serial_batch_bundle(batchwise_data, filters): def get_query_based_on_filters(query, batch, table, filters): + if filters.company: + query = query.where(table.company == filters.company) + if filters.item_code: query = query.where(table.item_code == filters.item_code) From feb51a475a4058d527faa59729ebb04db4ac6b8c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:39:16 +0530 Subject: [PATCH 74/82] fix(italy): handle none price_list_rate in e-invoice xml generation (backport #58242) (#58370) Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com> --- erpnext/regional/italy/e-invoice.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/regional/italy/e-invoice.xml b/erpnext/regional/italy/e-invoice.xml index 713e85a556e..e1174073b27 100644 --- a/erpnext/regional/italy/e-invoice.xml +++ b/erpnext/regional/italy/e-invoice.xml @@ -191,7 +191,7 @@ {{ html2text(item.description or '') or item.item_name }} {{ format_float(item.qty) }} {{ item.stock_uom }} - {%- set item_unit_net_price = (item.price_list_rate / tax_divisor) or (item.net_rate) or (item.rate / tax_divisor) %} + {%- set item_unit_net_price = ((item.price_list_rate or 0) / tax_divisor) or (item.net_rate) or (item.rate / tax_divisor) %} {{ format_float(item_unit_net_price, item_meta.get_field("rate").precision) }} {{ render_discount_or_margin(item, tax_divisor) }} {{ format_float(item.net_amount, item_meta.get_field("amount").precision) }} From 83cc51a5d2c2dac45ace7217bd5f247d387496a3 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:39:41 +0530 Subject: [PATCH 75/82] Fix/return qty validation different uom (backport #58298) (#58364) Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com> Co-authored-by: Afsal Syed --- .../controllers/sales_and_purchase_return.py | 2 +- .../tests/test_sales_and_purchase_return.py | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index f8c54d79043..80e9d48d15e 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -214,7 +214,7 @@ def validate_quantity(doc, key, args, ref, valid_items, already_returned_items): else 0 ) - if column == "stock_qty" and not args.get("return_qty_from_rejected_warehouse"): + if column in ("stock_qty", "qty") and not args.get("return_qty_from_rejected_warehouse"): reference_qty = ref.get(column) current_stock_qty = args.get(column) elif args.get("return_qty_from_rejected_warehouse"): diff --git a/erpnext/controllers/tests/test_sales_and_purchase_return.py b/erpnext/controllers/tests/test_sales_and_purchase_return.py index e60ca29fed3..8294688a317 100644 --- a/erpnext/controllers/tests/test_sales_and_purchase_return.py +++ b/erpnext/controllers/tests/test_sales_and_purchase_return.py @@ -88,3 +88,35 @@ class TestSalesAndPurchaseReturn(ERPNextTestSuite): return_si.items[0].qty = 0 self.assertRaises(frappe.ValidationError, return_si.save) + + def test_sales_invoice_partial_return_with_different_stock_uom(self): + from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice + from erpnext.controllers.sales_and_purchase_return import make_return_doc + from erpnext.stock.doctype.item.test_item import make_item + + item_properties = {"is_stock_item": 1, "stock_uom": "Kg"} + if frappe.get_meta("Item").has_field("gst_hsn_code") and frappe.db.exists("GST HSN Code", "010121"): + item_properties["gst_hsn_code"] = "010121" + + item = make_item( + "_Test SI Return Different Stock UOM", + item_properties, + uoms=[{"uom": "Nos", "conversion_factor": 0.013888889}], + ) + + si = create_sales_invoice(item_code=item.name, qty=48, do_not_save=True) + si.items[0].uom = "Nos" + si.items[0].stock_uom = "Kg" + si.items[0].conversion_factor = 0.013888889 + si.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", si.name) + + first_return = make_return_doc(si.doctype, si.name) + first_return.items[0].qty = -24 + first_return.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", first_return.name) + + second_return = make_return_doc(si.doctype, si.name) + self.assertEqual(second_return.items[0].qty, -24) + second_return.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", second_return.name) From 2329ef64249507d74069b23d7c7c4c8cf7a09d96 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 12:11:31 +0000 Subject: [PATCH 76/82] fix: hide supplier name in rfq portal (backport #58373) (#58376) Co-authored-by: Pandiyan P --- erpnext/templates/pages/rfq.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/erpnext/templates/pages/rfq.html b/erpnext/templates/pages/rfq.html index d371bf2161d..8d55d6b47e1 100644 --- a/erpnext/templates/pages/rfq.html +++ b/erpnext/templates/pages/rfq.html @@ -22,10 +22,7 @@ {% block page_content %}
    -
    -
    {{ doc.supplier }}
    -
    -
    +
    {{ doc.get_formatted("transaction_date") }}
    From 39e15c7b2d2e79d712b6d2bf2a29a0bd19bb9d74 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Mon, 24 Aug 2026 17:51:07 +0530 Subject: [PATCH 77/82] fix: prevent duplicate supplier quotations from portal --- .../request_for_quotation.py | 86 +++++++++++++------ erpnext/templates/pages/rfq.html | 2 +- 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 0805dff2ad4..37d9fb06ea2 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -9,6 +9,7 @@ from frappe import _ from frappe.contacts.doctype.contact.contact import get_full_name from frappe.core.doctype.communication.email import make from frappe.desk.form.load import get_attachments +from frappe.model.document import Document from frappe.model.mapper import get_mapped_doc from frappe.query_builder import Order from frappe.utils import get_url @@ -489,36 +490,73 @@ def make_supplier_quotation_from_rfq(source_name, target_doc=None, for_supplier= # This method is used to make supplier quotation from supplier's portal. @frappe.whitelist() -def create_supplier_quotation(doc): +def create_supplier_quotation(doc: str | Document | dict): if isinstance(doc, str): doc = json.loads(doc) + supplier = doc.get("supplier") - if frappe.session.user not in frappe.get_all( - "Portal User", {"parent": doc.get("supplier")}, pluck="user" - ): + if frappe.session.user not in frappe.get_all("Portal User", {"parent": supplier}, pluck="user"): frappe.throw(_("Not Permitted"), frappe.PermissionError) - try: - sq_doc = frappe.get_doc( - { - "doctype": "Supplier Quotation", - "supplier": doc.get("supplier"), - "terms": doc.get("terms"), - "company": doc.get("company"), - "currency": doc.get("currency") - or get_party_account_currency("Supplier", doc.get("supplier"), doc.get("company")), - "buying_price_list": doc.get("buying_price_list") - or frappe.db.get_single_value("Buying Settings", "buying_price_list"), - } + validate_existing_supplier_quotation(supplier, doc.get("items")) + + sq_doc = frappe.get_doc( + { + "doctype": "Supplier Quotation", + "supplier": supplier, + "terms": doc.get("terms"), + "company": doc.get("company"), + "currency": doc.get("currency") + or get_party_account_currency("Supplier", supplier, doc.get("company")), + "buying_price_list": doc.get("buying_price_list") + or frappe.db.get_single_value("Buying Settings", "buying_price_list"), + } + ) + add_items(sq_doc, supplier, doc.get("items")) + sq_doc.flags.ignore_permissions = True + sq_doc.run_method("set_missing_values") + sq_doc.save() + frappe.msgprint(_("Supplier Quotation {0} Created").format(sq_doc.name)) + return sq_doc.name + + +def validate_existing_supplier_quotation(supplier, items): + request_for_quotations = {item.get("parent") for item in items if item.get("parent")} + if not request_for_quotations: + return + + rfq = frappe.qb.DocType("Request for Quotation") + ( + frappe.qb.from_(rfq) + .select(rfq.name) + .where(rfq.name.isin(request_for_quotations)) + .orderby(rfq.name) + .for_update() + ).run() + + sq = frappe.qb.DocType("Supplier Quotation") + sqi = frappe.qb.DocType("Supplier Quotation Item") + existing_quotation = ( + frappe.qb.from_(sq) + .inner_join(sqi) + .on(sq.name == sqi.parent) + .select(sq.name, sqi.request_for_quotation) + .where( + (sq.docstatus < 2) + & (sq.supplier == supplier) + & (sqi.request_for_quotation.isin(request_for_quotations)) + ) + .limit(1) + ).run(as_dict=True) + + if existing_quotation: + existing_quotation = existing_quotation[0] + frappe.throw( + _("Supplier Quotation {0} already exists against Request for Quotation {1}").format( + frappe.bold(existing_quotation.name), + frappe.bold(existing_quotation.request_for_quotation), + ) ) - add_items(sq_doc, doc.get("supplier"), doc.get("items")) - sq_doc.flags.ignore_permissions = True - sq_doc.run_method("set_missing_values") - sq_doc.save() - frappe.msgprint(_("Supplier Quotation {0} Created").format(sq_doc.name)) - return sq_doc.name - except Exception: - return None def add_items(sq_doc, supplier, items): diff --git a/erpnext/templates/pages/rfq.html b/erpnext/templates/pages/rfq.html index 8d55d6b47e1..d2a9382dc6b 100644 --- a/erpnext/templates/pages/rfq.html +++ b/erpnext/templates/pages/rfq.html @@ -13,7 +13,7 @@ {% endblock %} {% block header_actions %} -{% if doc.items %} +{% if doc.items and not doc.rfq_links %} From efe5571ca72ff15f20f8a6bb13b8a4ed72cf5e31 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Mon, 24 Aug 2026 17:55:35 +0530 Subject: [PATCH 78/82] test: verify duplicate supplier quotations are rejected --- .../test_request_for_quotation.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index 4ab06f3e799..a8b7d997191 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -162,6 +162,18 @@ class TestRequestforQuotation(ERPNextTestSuite): self.assertEqual(supplier_quotation_doc.get("items")[0].qty, 5) self.assertEqual(supplier_quotation_doc.get("items")[0].amount, 500) + def test_make_duplicate_supplier_quotation_from_portal(self): + rfq = make_request_for_quotation() + rfq.supplier = rfq.suppliers[0].supplier + supplier_quotation = frappe.get_doc("Supplier Quotation", create_supplier_quotation(rfq)) + supplier_quotation.submit() + + with self.assertRaisesRegex(frappe.ValidationError, "already exists"): + create_supplier_quotation(rfq) + + supplier_quotation.cancel() + self.assertTrue(create_supplier_quotation(rfq)) + def test_make_multi_uom_supplier_quotation(self): item_code = "_Test Multi UOM RFQ Item" if not frappe.db.exists("Item", item_code): From 37a1fd11e91890a7cb1a515393e0b11df4bfeac4 Mon Sep 17 00:00:00 2001 From: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:39:11 +0530 Subject: [PATCH 79/82] fix(stock): reset bin when no stock ledger entries remain (#58362) * fix(stock): reset bin when no stock ledger entries remain update_bin() only writes bins reachable through prev_sle_dict, and that dict is empty once the last live sle for an item and warehouse is cancelled or deleted. actual_qty is still recomputed, but stock_value and valuation_rate stay stale and a repost cannot heal them, so bin totals drift permanently from the stock balance. zero those bins after the normal update, guarded by a re-check that no live sle exists. also drop the prev_sle_dict seeding added earlier in initialize_previous_data, which never took effect because initialize_reposting() discards the dict before update_bin() reads it. * test(stock): cover bin reset when ledger is empty three cases that all leave an item and warehouse with no live sle: cancelling the only voucher, deleting it with delete_linked_ledger_entries on, and reposting over an already emptied ledger. each asserts actual_qty, valuation_rate and stock_value are all zero. (cherry picked from commit 6fbcfade6c1c89e010084afba7da1ece59b9cf4b) --- erpnext/stock/doctype/bin/test_bin.py | 62 +++++++++++++++++++++++++++ erpnext/stock/stock_ledger.py | 34 ++++++++++----- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/doctype/bin/test_bin.py b/erpnext/stock/doctype/bin/test_bin.py index 45302c66f01..02e576b5ba7 100644 --- a/erpnext/stock/doctype/bin/test_bin.py +++ b/erpnext/stock/doctype/bin/test_bin.py @@ -55,6 +55,68 @@ class TestBin(ERPNextTestSuite): self.assertEqual(bin.valuation_rate, 0) self.assertEqual(bin.stock_value, 0) + def test_repost_resets_bin_without_sle(self): + """A repost must zero the bin when the ledger is empty, e.g. after entries were deleted.""" + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + from erpnext.stock.stock_ledger import update_entries_after + + item_code = make_item().name + warehouse = "_Test Warehouse - _TC" + make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=100) + + # deleting a transaction with `delete_linked_ledger_entries` on drops its entries outright + frappe.db.delete("Stock Ledger Entry", {"item_code": item_code, "warehouse": warehouse}) + + update_entries_after( + { + "item_code": item_code, + "warehouse": warehouse, + "posting_date": "1900-01-01", + "posting_time": "00:01", + } + ) + + bin = frappe.get_doc("Bin", {"item_code": item_code, "warehouse": warehouse}) + self.assertEqual(bin.actual_qty, 0) + self.assertEqual(bin.valuation_rate, 0) + self.assertEqual(bin.stock_value, 0) + + def test_cancelling_last_entry_resets_bin(self): + """Cancelling the only voucher must clear stock value, not just quantity.""" + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + + item_code = make_item().name + warehouse = "_Test Warehouse - _TC" + se = make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=100) + + se.cancel() + + bin = frappe.get_doc("Bin", {"item_code": item_code, "warehouse": warehouse}) + self.assertEqual(bin.actual_qty, 0) + self.assertEqual(bin.valuation_rate, 0) + self.assertEqual(bin.stock_value, 0) + + def test_deleting_last_voucher_resets_bin(self): + """Deleting the only voucher wipes its ledger entries outright, the bin must still be cleared.""" + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + + item_code = make_item().name + warehouse = "_Test Warehouse - _TC" + delete_entries = frappe.get_single_value("Accounts Settings", "delete_linked_ledger_entries") + frappe.db.set_single_value("Accounts Settings", "delete_linked_ledger_entries", 1) + + try: + se = make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=100) + se.cancel() + frappe.delete_doc("Stock Entry", se.name, force=1) + finally: + frappe.db.set_single_value("Accounts Settings", "delete_linked_ledger_entries", delete_entries) + + bin = frappe.get_doc("Bin", {"item_code": item_code, "warehouse": warehouse}) + self.assertEqual(bin.actual_qty, 0) + self.assertEqual(bin.valuation_rate, 0) + self.assertEqual(bin.stock_value, 0) + def test_index_exists(self): indexes = frappe.db.sql("show index from tabBin where Non_unique = 0", as_dict=1) if not any(index.get("Key_name") == "unique_item_warehouse" for index in indexes): diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 0ee68469706..9710c05e5de 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -587,16 +587,6 @@ class update_entries_after: previous_sle = get_previous_sle_of_current_voucher(args) if previous_sle: self.prev_sle_dict[(args.get("item_code"), args.get("warehouse"))] = previous_sle - else: - self.prev_sle_dict[(args.get("item_code"), args.get("warehouse"))] = frappe._dict( - { - "qty_after_transaction": 0.0, - "valuation_rate": 0.0, - "stock_value": 0.0, - "prev_stock_value": 0.0, - "stock_queue": [], - } - ) warehouse_dict.previous_sle = previous_sle @@ -1800,6 +1790,30 @@ class update_entries_after: frappe.db.set_value("Bin", bin_name, updated_values, update_modified=True) + self.reset_bin_without_stock_ledger_entries() + + def reset_bin_without_stock_ledger_entries(self): + """Reset the bin when its ledger has no entries left, prev_sle_dict never covers that case.""" + item_code, warehouse = self.args.get("item_code"), self.args.get("warehouse") + if not item_code or not warehouse or (item_code, warehouse) in self.prev_sle_dict: + return + + if frappe.db.exists( + "Stock Ledger Entry", {"item_code": item_code, "warehouse": warehouse, "is_cancelled": 0} + ): + return + + bin_name = frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}) + if not bin_name: + return + + frappe.db.set_value( + "Bin", + bin_name, + {"actual_qty": 0.0, "stock_value": 0.0, "valuation_rate": 0.0}, + update_modified=True, + ) + def get_sle_against_current_voucher(kwargs): kwargs["posting_datetime"] = get_combine_datetime(kwargs.posting_date, kwargs.posting_time) From 6b61146d2f6cf8802600cb3961758ebfcb717c3b Mon Sep 17 00:00:00 2001 From: Pandiyan P Date: Tue, 25 Aug 2026 15:36:06 +0530 Subject: [PATCH 80/82] fix: respect zero currency precision (#58395) (cherry picked from commit ce23fcc0553324825cb96c992be6a56b9165c66e) --- erpnext/accounts/test/test_utils.py | 16 ++++++++++++++++ erpnext/accounts/utils.py | 10 +++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 9e2725d9b83..d9f843687b2 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -7,6 +7,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.party import get_party_shipping_address from erpnext.accounts.utils import ( + get_currency_precision, get_future_stock_vouchers, get_voucherwise_gl_entries, get_zero_cutoff, @@ -155,3 +156,18 @@ class TestUtils(ERPNextTestSuite): self.assertEqual(get_zero_cutoff(None), 0.005) self.assertEqual(get_zero_cutoff("EUR"), 0.005) self.assertEqual(get_zero_cutoff("BHD"), 0.0005) + + def test_get_currency_precision_respects_zero_and_fallback(self): + currency_precision = frappe.db.get_default("currency_precision") + number_format = frappe.db.get_default("number_format") + + try: + frappe.db.set_default("number_format", "#,###.##") + frappe.db.set_default("currency_precision", "0") + self.assertEqual(get_currency_precision(), 0) + + frappe.db.set_default("currency_precision", "") + self.assertEqual(get_currency_precision(), 2) + finally: + frappe.db.set_default("currency_precision", currency_precision or "") + frappe.db.set_default("number_format", number_format or "#,###.##") diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 37aa943f447..c5feb863f38 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -1189,12 +1189,12 @@ def fix_total_debit_credit(): def get_currency_precision(): - precision = cint(frappe.db.get_default("currency_precision")) - if not precision: - number_format = frappe.db.get_default("number_format") or "#,###.##" - precision = get_number_format_info(number_format)[2] + currency_precision = frappe.db.get_default("currency_precision") + if currency_precision not in (None, ""): + return cint(currency_precision) - return precision + number_format = frappe.db.get_default("number_format") or "#,###.##" + return get_number_format_info(number_format)[2] def get_fraction_units(currency: str) -> int: From ac1c6921da515b7864d971e8229402795d274745 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 25 Aug 2026 15:44:03 +0530 Subject: [PATCH 81/82] fix: send auto reorder email to all managers in single company setup (cherry picked from commit ae119b1c2957e909f547425a0544518dced8b059) --- erpnext/stock/reorder_item.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py index a92b41d52fb..496d725f1fb 100644 --- a/erpnext/stock/reorder_item.py +++ b/erpnext/stock/reorder_item.py @@ -358,6 +358,10 @@ def get_email_list(company): def get_comapny_wise_users(company): + # single company: no explicit permission needed, everyone has access + if frappe.db.count("Company") == 1: + return [] + companies = [company] if parent_company := frappe.db.get_value("Company", company, "parent_company"): From 97b2e07d5e843a34d937bdea977c042bf375cee6 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 25 Aug 2026 15:44:29 +0530 Subject: [PATCH 82/82] test: auto reorder email reaches managers without company user permission (cherry picked from commit a01cc92184a3552528fb74c3ba52d79a56424036) --- .../material_request/test_material_request.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 7d044b929f4..aaa69e9d130 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -942,6 +942,33 @@ class TestMaterialRequest(ERPNextTestSuite): for perm in permissions: perm.delete() + def test_auto_email_single_company_without_user_permission(self): + from unittest.mock import patch + + from erpnext.stock.reorder_item import get_email_list + + users = ["test_reorder_single_1@example.com", "test_reorder_single_2@example.com"] + for user in users: + if not frappe.db.exists("User", user): + frappe.get_doc( + { + "doctype": "User", + "email": user, + "first_name": user, + "send_notifications": 0, + "enabled": 1, + "user_type": "System User", + "roles": [{"role": "Purchase Manager"}], + } + ).insert(ignore_permissions=True) + + # single company: managers without any Company User Permission must still be emailed + with patch("frappe.db.count", return_value=1): + emails = get_email_list("_Test Company") + + for user in users: + self.assertIn(user, emails) + def test_manufacture_type_status_over_wo(self): from erpnext.stock.doctype.material_request.material_request import raise_work_orders