From 0eb049cd85e5e2f7273c16f295b4d37f15b21e1c Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:44:55 +0530 Subject: [PATCH 01/49] fix(UX): Item master form cleanup (#54538) * fix: UI improvements for item form * fix: add descriptions and tooltips to all checkboxes * feat: show toast notification when item price is created * fix: do not use selling rate for opening stock entry * fix: add descriptions and tooltips to item default fields * fix(test): give valuation rate for opening stock entry creation * fix: moving naming series toggle before the return * refactor: more changes in the form UI (cherry picked from commit 43937acd8b60462be1cb38ccb0ac7e38c0141f98) --- .../test_bom_stock_analysis.py | 2 + erpnext/stock/doctype/item/item.js | 30 ++- erpnext/stock/doctype/item/item.json | 234 ++++++++++++------ erpnext/stock/doctype/item/item.py | 36 ++- .../item_customer_detail.json | 6 +- .../doctype/item_default/item_default.json | 45 +++- .../doctype/item_supplier/item_supplier.json | 10 +- .../uom_conversion_detail.json | 7 +- 8 files changed, 264 insertions(+), 106 deletions(-) diff --git a/erpnext/manufacturing/report/bom_stock_analysis/test_bom_stock_analysis.py b/erpnext/manufacturing/report/bom_stock_analysis/test_bom_stock_analysis.py index fd8a52afde0..70717377ff7 100644 --- a/erpnext/manufacturing/report/bom_stock_analysis/test_bom_stock_analysis.py +++ b/erpnext/manufacturing/report/bom_stock_analysis/test_bom_stock_analysis.py @@ -94,6 +94,7 @@ def create_items(): "is_stock_item": 1, "standard_rate": 100, "opening_stock": 100, + "valuation_rate": 100, "last_purchase_rate": 100, "item_defaults": [{"company": "_Test Company", "default_warehouse": "Stores - _TC"}], } @@ -103,6 +104,7 @@ def create_items(): "is_stock_item": 1, "standard_rate": 200, "opening_stock": 200, + "valuation_rate": 200, "last_purchase_rate": 200, "item_defaults": [{"company": "_Test Company", "default_warehouse": "Stores - _TC"}], } diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index b25fc06e2dd..c03199e4348 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -73,6 +73,7 @@ frappe.ui.form.on("Item", { }, }; }, + onload: function (frm) { erpnext.item.setup_queries(frm); if (frm.doc.variant_of) { @@ -127,6 +128,21 @@ frappe.ui.form.on("Item", { refresh: function (frm) { frm.trigger("toggle_has_serial_batch_fields"); + if (frappe.defaults.get_default("item_naming_by") != "Naming Series" || frm.doc.variant_of) { + frm.toggle_display("naming_series", false); + } else { + erpnext.toggle_naming_series(); + } + + frm.toggle_display(["standard_rate"], frappe.model.can_create("Item Price")); + + if (frm.is_new()) { + frm.toggle_display("disabled", false); + return; + } + + frm.toggle_display("disabled", true); + if (frm.doc.is_stock_item) { frm.add_custom_button( __("Stock Balance"), @@ -229,8 +245,6 @@ frappe.ui.form.on("Item", { __("Create") ); } - - // frm.page.set_inner_btn_group_as_primary(__('Create')); } if (frm.doc.variant_of) { frm.set_intro( @@ -241,12 +255,6 @@ frappe.ui.form.on("Item", { ); } - if (frappe.defaults.get_default("item_naming_by") != "Naming Series" || frm.doc.variant_of) { - frm.toggle_display("naming_series", false); - } else { - erpnext.toggle_naming_series(); - } - erpnext.item.edit_prices_button(frm); erpnext.item.toggle_attributes(frm); @@ -286,8 +294,6 @@ frappe.ui.form.on("Item", { }, }; }); - - frm.toggle_display(["standard_rate"], frappe.model.can_create("Item Price")); }, validate: function (frm) { @@ -661,10 +667,10 @@ $.extend(erpnext.item, { make_dashboard: function (frm) { if (frm.doc.__islocal) return; - // Show Stock Levels only if is_stock_item if (frm.doc.is_stock_item) { frappe.require("item-dashboard.bundle.js", function () { - const section = frm.dashboard.add_section("", __("Stock Levels")); + const section = frm.fields_dict["stock_levels_html"].$wrapper; + erpnext.item.item_dashboard = new erpnext.stock.ItemDashboard({ parent: section, item_code: frm.doc.name, diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 75dcd140474..1f2581a4981 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -18,30 +18,57 @@ "stock_uom", "column_break0", "disabled", - "allow_alternative_item", "is_stock_item", - "has_variants", "is_fixed_asset", "auto_create_assets", "is_grouped_asset", "asset_category", "asset_naming_series", + "section_break_zlmj", + "is_sales_item", + "allow_alternative_item", + "has_variants", + "column_break_kpmi", + "is_purchase_item", + "is_customer_provided_item", + "customer", "section_break_gjns", - "opening_stock", - "column_break_ixrh", "standard_rate", + "column_break_ixrh", + "opening_stock", "section_break_znra", "over_delivery_receipt_allowance", "column_break_wugd", "over_billing_allowance", "image", "section_break_11", - "description", "brand", + "description", + "accounting", + "section_break_wfkx", + "item_defaults", + "deferred_accounting_section", + "enable_deferred_expense", + "no_of_months_exp", + "column_break_9s9o", + "enable_deferred_revenue", + "no_of_months", + "uom_tab", "unit_of_measure_conversion", + "uom_conversion_details_column", + "uom_help_html", "uoms", - "dashboard_tab", + "item_tax_section_break", + "section_break_oilf", + "column_break_aytr", + "taxes", + "section_break_fxqz", + "purchase_tax_withholding_category", + "column_break_ltlb", + "sales_tax_withholding_category", "inventory_section", + "stock_levels_section", + "stock_levels_html", "inventory_valuation_section", "valuation_method", "column_break_cqdk", @@ -69,32 +96,20 @@ "column_break_37", "has_serial_no", "serial_no_series", - "defaults_tab", - "item_defaults", "variants_section", "variant_of", "variant_based_on", "attributes", - "accounting", - "deferred_accounting_section", - "enable_deferred_expense", - "no_of_months_exp", - "column_break_9s9o", - "enable_deferred_revenue", - "no_of_months", "purchasing_tab", "purchase_uom", "min_order_qty", "safety_stock", - "is_purchase_item", "purchase_details_cb", "lead_time_days", "last_purchase_rate", - "is_customer_provided_item", - "customer", "supplier_details", "delivered_by_supplier", - "column_break2", + "section_break_ylma", "supplier_items", "foreign_trade_details", "country_of_origin", @@ -103,24 +118,10 @@ "sales_details", "sales_uom", "grant_commission", - "is_sales_item", "column_break3", "max_discount", "customer_details", "customer_items", - "item_tax_section_break", - "section_break_oilf", - "column_break_aytr", - "taxes", - "section_break_fxqz", - "purchase_tax_withholding_category", - "column_break_ltlb", - "sales_tax_withholding_category", - "quality_tab", - "inspection_required_before_purchase", - "inspection_required_before_delivery", - "column_break_pxjh", - "quality_inspection_template", "manufacturing", "include_item_in_manufacturing", "is_sub_contracted_item", @@ -129,10 +130,16 @@ "production_capacity", "total_projected_qty", "section_break_xili", - "customer_code", - "column_break_vipt", "default_manufacturer_part_no", - "default_item_manufacturer" + "default_item_manufacturer", + "column_break_vipt", + "customer_code", + "quality_tab", + "inspection_required_before_purchase", + "inspection_required_before_delivery", + "column_break_pxjh", + "quality_inspection_template", + "dashboard_tab" ], "fields": [ { @@ -208,32 +215,38 @@ }, { "default": "0", + "description": "Disabled items cannot be selected in any transaction.", "fieldname": "disabled", "fieldtype": "Check", "label": "Disabled", - "search_index": 1 + "search_index": 1, + "show_description_on_click": 1 }, { "default": "0", + "description": "Allow substituting this item with an alternative from the Item Alternative list when stock is unavailable.", "fieldname": "allow_alternative_item", "fieldtype": "Check", - "label": "Allow Alternative Item" + "label": "Allow Alternative Item", + "show_description_on_click": 1 }, { "allow_in_quick_entry": 1, "bold": 1, "default": "1", - "depends_on": "eval:!doc.is_fixed_asset", + "description": "ERPNext will make a stock ledger entry for each transaction of this item. Keep unchecked for non-stock or service items.", "fieldname": "is_stock_item", "fieldtype": "Check", "in_list_view": 1, "label": "Maintain Stock", "oldfieldname": "is_stock_item", - "oldfieldtype": "Select" + "oldfieldtype": "Select", + "read_only_depends_on": "eval:doc.is_fixed_asset" }, { "default": "1", "depends_on": "eval:!doc.is_fixed_asset", + "description": "Enable for raw material items used in BOM. Uncheck for additional services like 'washing' used in manufacturing.", "fieldname": "include_item_in_manufacturing", "fieldtype": "Check", "label": "Include Item In Manufacturing" @@ -241,6 +254,7 @@ { "bold": 1, "depends_on": "eval:(doc.__islocal&&doc.is_stock_item && !doc.has_serial_no && !doc.has_batch_no)", + "description": "Used to create an opening Stock Entry with the Valuation Rate when the item is saved", "fieldname": "opening_stock", "fieldtype": "Float", "label": "Opening Stock" @@ -253,7 +267,8 @@ }, { "bold": 1, - "depends_on": "eval:doc.__islocal", + "depends_on": "eval:doc.__islocal && doc.is_sales_item", + "description": "Creates an Item Price automatically when the item is saved", "fieldname": "standard_rate", "fieldtype": "Currency", "label": "Standard Selling Rate" @@ -261,9 +276,11 @@ { "allow_in_quick_entry": 1, "default": "0", + "description": "Enable if this item is a company asset like machinery or furniture.", "fieldname": "is_fixed_asset", "fieldtype": "Check", - "label": "Is Fixed Asset" + "label": "Is Fixed Asset", + "read_only_depends_on": "eval:doc.is_stock_item" }, { "allow_in_quick_entry": 1, @@ -413,16 +430,12 @@ "options": "Item Reorder" }, { - "collapsible": 1, "fieldname": "unit_of_measure_conversion", - "fieldtype": "Section Break", - "label": "Units of Measure" + "fieldtype": "Section Break" }, { - "description": "Will also apply for variants", "fieldname": "uoms", "fieldtype": "Table", - "label": "UOMs", "oldfieldname": "uom_conversion_details", "oldfieldtype": "Table", "options": "UOM Conversion Detail" @@ -438,15 +451,18 @@ { "default": "0", "depends_on": "eval:doc.is_stock_item", + "description": "Track this item in batches. Cannot be changed after a stock transaction exists.", "fieldname": "has_batch_no", "fieldtype": "Check", "label": "Has Batch No", "oldfieldname": "has_batch_no", - "oldfieldtype": "Select" + "oldfieldtype": "Select", + "show_description_on_click": 1 }, { "default": "0", "depends_on": "has_batch_no", + "description": "Batch number will be auto-created in format AAAA.00001 if not specified in transactions. Leave blank to always enter batch numbers manually.", "fieldname": "create_new_batch", "fieldtype": "Check", "label": "Automatically Create New Batch" @@ -463,6 +479,7 @@ { "default": "0", "depends_on": "has_batch_no", + "description": "Batch number will be created based on expiry date. Expiry dates can be set in the Batch master.", "fieldname": "has_expiry_date", "fieldtype": "Check", "label": "Has Expiry Date" @@ -491,11 +508,13 @@ { "default": "0", "depends_on": "eval:doc.is_stock_item", + "description": "Track each unit with a unique serial number for warranty and return tracking. Cannot be changed after a stock transaction exists.", "fieldname": "has_serial_no", "fieldtype": "Check", "label": "Has Serial No", "oldfieldname": "has_serial_no", - "oldfieldtype": "Select" + "oldfieldtype": "Select", + "show_description_on_click": 1 }, { "depends_on": "has_serial_no", @@ -520,7 +539,8 @@ "fieldname": "has_variants", "fieldtype": "Check", "in_standard_filter": 1, - "label": "Has Variants" + "label": "Has Variants", + "show_description_on_click": 1 }, { "default": "Item Attribute", @@ -547,11 +567,15 @@ }, { "default": "1", + "description": "Allow this item to be used in purchase transactions.", "fieldname": "is_purchase_item", "fieldtype": "Check", - "label": "Allow Purchase" + "label": "Allow Purchase", + "read_only_depends_on": "eval: doc.is_customer_provided_item", + "show_description_on_click": 1 }, { + "depends_on": "eval: doc.is_purchase_item", "fieldname": "purchase_uom", "fieldtype": "Link", "label": "Default Purchase Unit of Measure", @@ -560,7 +584,7 @@ { "default": "0.00", "depends_on": "is_stock_item", - "description": "Minimum quantity should be as per Stock UOM", + "description": "Minimum quantity should be as per Stock UOM\n\n", "fieldname": "min_order_qty", "fieldtype": "Float", "label": "Minimum Order Qty", @@ -569,6 +593,7 @@ "oldfieldtype": "Currency" }, { + "description": "Minimum stock level to maintain as a buffer. Used to calculate recommended reorder level: Reorder Level = Safety Stock + (Average Daily Consumption \u00d7 Lead Time).", "fieldname": "safety_stock", "fieldtype": "Float", "label": "Safety Stock", @@ -588,6 +613,7 @@ "oldfieldtype": "Int" }, { + "description": "The rate at which this item was last purchased via a Purchase Invoice. Auto-updated by the system.", "fieldname": "last_purchase_rate", "fieldtype": "Float", "label": "Last Purchase Rate", @@ -599,9 +625,12 @@ }, { "default": "0", + "description": "Enable if this item is provided by a customer and received via Stock Entry.", "fieldname": "is_customer_provided_item", "fieldtype": "Check", - "label": "Is Customer Provided Item" + "label": "Is Customer Provided Item", + "read_only_depends_on": "eval: doc.is_purchase_item", + "show_description_on_click": 1 }, { "depends_on": "eval:doc.is_customer_provided_item", @@ -611,29 +640,24 @@ "options": "Customer" }, { - "collapsible": 1, "depends_on": "eval:!doc.is_fixed_asset", "fieldname": "supplier_details", "fieldtype": "Section Break", + "hide_border": 1, "label": "Supplier Details" }, { "default": "0", + "description": "Enable for drop shipping - supplier delivers directly to the customer without passing through your warehouse.", "fieldname": "delivered_by_supplier", "fieldtype": "Check", "label": "Delivered by Supplier (Drop Ship)", "print_hide": 1 }, - { - "fieldname": "column_break2", - "fieldtype": "Column Break", - "oldfieldtype": "Column Break", - "width": "50%" - }, { "fieldname": "supplier_items", "fieldtype": "Table", - "label": "Supplier Items", + "label": "Item Supplier", "options": "Item Supplier" }, { @@ -660,6 +684,7 @@ }, { "collapsible": 1, + "depends_on": "eval: doc.is_sales_item", "fieldname": "sales_details", "fieldtype": "Tab Break", "label": "Sales", @@ -667,6 +692,7 @@ "options": "fa fa-tag" }, { + "depends_on": "eval: doc.is_sales_item", "fieldname": "sales_uom", "fieldtype": "Link", "label": "Default Sales Unit of Measure", @@ -674,9 +700,11 @@ }, { "default": "1", + "description": "Allow this item to be used in sales transactions.", "fieldname": "is_sales_item", "fieldtype": "Check", - "label": "Allow Sales" + "label": "Allow Sales", + "show_description_on_click": 1 }, { "fieldname": "column_break3", @@ -685,6 +713,7 @@ "width": "50%" }, { + "description": "Maximum discount % allowed when selling this item. Eg: if set to 20%, a discount greater than 20% cannot be applied in sales transactions.", "fieldname": "max_discount", "fieldtype": "Float", "label": "Max Discount (%)", @@ -693,6 +722,7 @@ }, { "default": "0", + "description": "Expense for this item will be recognized over a period of months. Eg: prepaid insurance or annual software license", "fieldname": "enable_deferred_revenue", "fieldtype": "Check", "label": "Enable Deferred Revenue" @@ -705,6 +735,7 @@ }, { "default": "0", + "description": "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront.", "fieldname": "enable_deferred_expense", "fieldtype": "Check", "label": "Enable Deferred Expense" @@ -716,7 +747,6 @@ "label": "No of Months (Expense)" }, { - "collapsible": 1, "depends_on": "eval:!doc.is_fixed_asset", "fieldname": "customer_details", "fieldtype": "Section Break", @@ -748,17 +778,21 @@ }, { "default": "0", + "description": "A quality inspection must be completed before generating a Purchase Receipt for this item.", "fieldname": "inspection_required_before_purchase", "fieldtype": "Check", "label": "Inspection Required before Purchase", "oldfieldname": "inspection_required", - "oldfieldtype": "Select" + "oldfieldtype": "Select", + "show_description_on_click": 1 }, { "default": "0", + "description": "A quality inspection must be completed before generating a Delivery Note for this item.", "fieldname": "inspection_required_before_delivery", "fieldtype": "Check", - "label": "Inspection Required before Delivery" + "label": "Inspection Required before Delivery", + "show_description_on_click": 1 }, { "fieldname": "quality_inspection_template", @@ -789,6 +823,7 @@ }, { "default": "0", + "description": "Enable if a vendor manufactures this item for you. You can choose to provide them raw materials using the default BOM.", "fieldname": "is_sub_contracted_item", "fieldtype": "Check", "label": "Is Subcontracted Item", @@ -817,6 +852,7 @@ }, { "depends_on": "eval:!doc.__islocal && !doc.is_fixed_asset", + "description": "Percentage by which over-delivery or over-receipt is allowed against a Sales/Purchase Order for this item. If not set, value from Stock Settings will be used.", "fieldname": "over_delivery_receipt_allowance", "fieldtype": "Float", "label": "Over Delivery/Receipt Allowance (%)", @@ -825,6 +861,7 @@ }, { "depends_on": "eval:!doc.__islocal && !doc.is_fixed_asset", + "description": "Percentage by which over-billing is allowed against a Sales/Purchase Order for this item. If not set, value from Accounts Settings will be used.", "fieldname": "over_billing_allowance", "fieldtype": "Float", "label": "Over Billing Allowance (%)" @@ -834,7 +871,7 @@ "depends_on": "is_fixed_asset", "fieldname": "auto_create_assets", "fieldtype": "Check", - "label": "Auto Create Assets on Purchase" + "label": "Auto create assets on purchase" }, { "fieldname": "default_item_manufacturer", @@ -851,19 +888,24 @@ }, { "default": "1", + "description": "If enabled, sales from this item will be included in Sales Person and Sales Partner commission calculations", "fieldname": "grant_commission", "fieldtype": "Check", - "label": "Grant Commission" + "label": "Grant Commission", + "show_description_on_click": 1 }, { "default": "0", - "depends_on": "auto_create_assets", + "depends_on": "eval: doc.is_fixed_asset && doc.auto_create_assets", + "description": "Creates a single grouped asset instead of individual assets when purchased in bulk.", "fieldname": "is_grouped_asset", "fieldtype": "Check", - "label": "Create Grouped Asset" + "label": "Create Grouped Asset", + "show_description_on_click": 1 }, { "default": "0", + "description": "Allow stock to go below zero for this item, even if negative stock is disabled in Stock Settings.", "fieldname": "allow_negative_stock", "fieldtype": "Check", "label": "Allow Negative Stock" @@ -874,6 +916,7 @@ "label": "Inventory Settings" }, { + "depends_on": "eval: doc.is_purchase_item", "fieldname": "purchasing_tab", "fieldtype": "Tab Break", "label": "Purchasing" @@ -893,7 +936,7 @@ { "fieldname": "dashboard_tab", "fieldtype": "Tab Break", - "label": "Dashboard", + "label": "Connections", "show_dashboard": 1 }, { @@ -916,11 +959,6 @@ "fieldtype": "Int", "label": "Production Capacity" }, - { - "fieldname": "defaults_tab", - "fieldtype": "Tab Break", - "label": "Defaults" - }, { "fieldname": "section_break_znra", "fieldtype": "Section Break" @@ -988,6 +1026,50 @@ { "fieldname": "column_break_vipt", "fieldtype": "Column Break" + }, + { + "fieldname": "stock_levels_html", + "fieldtype": "HTML", + "label": "Stock Levels HTML", + "options": "
" + }, + { + "fieldname": "section_break_wfkx", + "fieldtype": "Section Break" + }, + { + "fieldname": "section_break_ylma", + "fieldtype": "Section Break" + }, + { + "fieldname": "uom_tab", + "fieldtype": "Tab Break", + "label": "UOM" + }, + { + "depends_on": "eval: !doc.__islocal && doc.is_stock_item", + "fieldname": "stock_levels_section", + "fieldtype": "Section Break", + "label": "Stock Levels" + }, + { + "fieldname": "uom_conversion_details_column", + "fieldtype": "Column Break", + "label": "UOM Conversion Details" + }, + { + "fieldname": "uom_help_html", + "fieldtype": "HTML", + "options": "
Define alternate units for this item. Eg: 1 Box = 12 Nos, set conversion factor as 12. (Will also apply for variants) Learn more →
" + }, + { + "fieldname": "section_break_zlmj", + "fieldtype": "Section Break", + "label": "Item Attributes" + }, + { + "fieldname": "column_break_kpmi", + "fieldtype": "Column Break" } ], "icon": "fa fa-tag", @@ -995,7 +1077,7 @@ "image_field": "image", "links": [], "make_attachments_public": 1, - "modified": "2026-04-14 13:37:00.183583", + "modified": "2026-04-28 17:31:47.613279", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 639d6a292ec..b7ef41c7295 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -182,6 +182,14 @@ class Item(Document): for default in self.item_defaults or [frappe._dict()]: self.add_price(default.default_price_list) + frappe.msgprint( + _("Item Price created at rate {0}").format( + frappe.format(self.standard_rate, {"fieldtype": "Currency"}) + ), + indicator="green", + alert=True, + ) + if self.opening_stock: self.set_opening_stock() @@ -284,7 +292,7 @@ class Item(Document): if not self.is_stock_item or self.has_serial_no or self.has_batch_no: return - if not self.valuation_rate and not self.standard_rate and not self.is_customer_provided_item: + if self.valuation_rate is None and not self.is_customer_provided_item: frappe.throw(_("Valuation Rate is mandatory if Opening Stock entered")) from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry @@ -309,14 +317,38 @@ class Item(Document): item_code=self.name, target=default_warehouse, qty=self.opening_stock, - rate=self.valuation_rate or self.standard_rate, + rate=self.valuation_rate, company=default.company, posting_date=getdate(), posting_time=nowtime(), + do_not_save=True, ) + if self.valuation_rate == 0: + for item in stock_entry.items: + item.allow_zero_valuation_rate = 1 + + stock_entry.insert() + stock_entry.submit() + stock_entry.load_from_db() stock_entry.add_comment("Comment", _("Opening Stock")) + stock_entry_link = frappe.utils.get_link_to_form("Stock Entry", stock_entry.name) + if self.valuation_rate == 0: + frappe.msgprint( + _("Opening Stock entry created with zero valuation rate: {0}").format( + stock_entry_link + ), + indicator="orange", + alert=True, + ) + else: + frappe.msgprint( + _("Opening Stock entry created: {0}").format(stock_entry_link), + indicator="green", + alert=True, + ) + def validate_fixed_asset(self): if self.is_fixed_asset: if self.is_stock_item: diff --git a/erpnext/stock/doctype/item_customer_detail/item_customer_detail.json b/erpnext/stock/doctype/item_customer_detail/item_customer_detail.json index e83e7aed85b..6a283135c9b 100644 --- a/erpnext/stock/doctype/item_customer_detail/item_customer_detail.json +++ b/erpnext/stock/doctype/item_customer_detail/item_customer_detail.json @@ -36,6 +36,7 @@ "options": "Customer Group" }, { + "description": "Enter the Item Code that this customer uses at their end. This will be shown in Sales Orders for the customer's reference.", "fieldname": "ref_code", "fieldtype": "Data", "in_filter": 1, @@ -52,13 +53,14 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2024-03-27 13:09:54.332166", + "modified": "2026-04-23 02:09:39.602010", "modified_by": "Administrator", "module": "Stock", "name": "Item Customer Detail", "owner": "Administrator", "permissions": [], + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} diff --git a/erpnext/stock/doctype/item_default/item_default.json b/erpnext/stock/doctype/item_default/item_default.json index 1926d334f98..b00644d51f2 100644 --- a/erpnext/stock/doctype/item_default/item_default.json +++ b/erpnext/stock/doctype/item_default/item_default.json @@ -55,11 +55,13 @@ "fieldtype": "Column Break" }, { + "description": "Default price list for buying or selling this item", "fieldname": "default_price_list", "fieldtype": "Link", "in_list_view": 1, "label": "Default Price List", - "options": "Price List" + "options": "Price List", + "show_description_on_click": 1 }, { "fieldname": "purchase_defaults", @@ -67,12 +69,15 @@ "label": "Purchase Defaults" }, { + "description": "Cost center used for tracking purchase expenses for this item", "fieldname": "buying_cost_center", "fieldtype": "Link", "label": "Default Buying Cost Center", - "options": "Cost Center" + "options": "Cost Center", + "show_description_on_click": 1 }, { + "description": "This supplier will be auto-selected in new purchase transactions", "fieldname": "default_supplier", "fieldtype": "Link", "label": "Default Supplier", @@ -83,10 +88,12 @@ "fieldtype": "Column Break" }, { + "description": "Account where the cost of this item will be debited on purchase", "fieldname": "expense_account", "fieldtype": "Link", "label": "Default Expense Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { "fieldname": "selling_defaults", @@ -94,20 +101,24 @@ "label": "Sales Defaults" }, { + "description": "Cost center used for tracking sales revenue for this item", "fieldname": "selling_cost_center", "fieldtype": "Link", "label": "Default Selling Cost Center", - "options": "Cost Center" + "options": "Cost Center", + "show_description_on_click": 1 }, { "fieldname": "column_break_12", "fieldtype": "Column Break" }, { + "description": "Account where revenue from selling this item will be credited", "fieldname": "income_account", "fieldtype": "Link", "label": "Default Income Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { "fieldname": "default_discount_account", @@ -116,6 +127,7 @@ "options": "Account" }, { + "description": "Provisional liability account used for service items before invoice is received", "fieldname": "default_provisional_account", "fieldtype": "Link", "label": "Default Provisional Account (Service)", @@ -128,17 +140,21 @@ }, { "depends_on": "eval: parent.enable_deferred_expense", + "description": "When you pay for something upfront (like annual insurance), the cost is held here and recognized gradually over time", "fieldname": "deferred_expense_account", "fieldtype": "Link", "label": "Deferred Expense Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { "depends_on": "eval: parent.enable_deferred_revenue", + "description": "Revenue received in advance (e.g. annual subscription) is held here and recognized gradually over time", "fieldname": "deferred_revenue_account", "fieldtype": "Link", "label": "Deferred Revenue Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { "fieldname": "column_break_kwad", @@ -154,28 +170,35 @@ "label": "Cost of Goods Sold" }, { + "description": "Account where cost of goods sold will be posted when this item is sold", "fieldname": "default_cogs_account", "fieldtype": "Link", "label": "Default COGS Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { + "description": "Account to record additional purchase expenses like freight or customs for this item", "fieldname": "purchase_expense_account", "fieldtype": "Link", "label": "Purchase Expense Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { + "description": "Used to balance the books when recording extra purchase costs like freight or customs", "fieldname": "purchase_expense_contra_account", "fieldtype": "Link", "label": "Purchase Expense Contra Account", "options": "Account" }, { + "description": "Stock account where inventory value for this item will be tracked", "fieldname": "default_inventory_account", "fieldtype": "Link", "label": "Default Inventory Account", - "options": "Account" + "options": "Account", + "show_description_on_click": 1 }, { "fetch_from": "default_inventory_account.account_currency", @@ -188,7 +211,7 @@ ], "istable": 1, "links": [], - "modified": "2025-10-21 10:50:46.144721", + "modified": "2026-04-27 01:49:01.396845", "modified_by": "Administrator", "module": "Stock", "name": "Item Default", diff --git a/erpnext/stock/doctype/item_supplier/item_supplier.json b/erpnext/stock/doctype/item_supplier/item_supplier.json index d8fe015ca53..8a1465a0ef6 100644 --- a/erpnext/stock/doctype/item_supplier/item_supplier.json +++ b/erpnext/stock/doctype/item_supplier/item_supplier.json @@ -6,6 +6,7 @@ "engine": "InnoDB", "field_order": [ "supplier", + "column_break_vcuv", "supplier_part_no" ], "fields": [ @@ -25,19 +26,24 @@ "label": "Supplier Part Number", "print_width": "200px", "width": "200px" + }, + { + "fieldname": "column_break_vcuv", + "fieldtype": "Column Break" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2024-03-27 13:09:55.339052", + "modified": "2026-04-22 02:08:38.777228", "modified_by": "Administrator", "module": "Stock", "name": "Item Supplier", "owner": "Administrator", "permissions": [], + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json b/erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json index 8e8aa678723..7bd92f326a1 100644 --- a/erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json +++ b/erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json @@ -7,6 +7,7 @@ "engine": "InnoDB", "field_order": [ "uom", + "column_break_nmeg", "conversion_factor" ], "fields": [ @@ -27,12 +28,16 @@ "non_negative": 1, "oldfieldname": "conversion_factor", "oldfieldtype": "Float" + }, + { + "fieldname": "column_break_nmeg", + "fieldtype": "Column Break" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2025-11-19 21:27:13.968771", + "modified": "2026-04-27 02:22:52.652036", "modified_by": "Administrator", "module": "Stock", "name": "UOM Conversion Detail", From 6a53982f4a5d62f2fd936f90561cb8816dfe6061 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 8 May 2026 12:27:32 +0530 Subject: [PATCH 02/49] fix: disallow editing on reversal journals (cherry picked from commit 26ca7445eb8c122351833105f7d4dcf57cb245c2) --- erpnext/accounts/doctype/journal_entry/journal_entry.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 1e3ad530f72..62799ab820d 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -70,6 +70,10 @@ frappe.ui.form.on("Journal Entry", { }, refresh: function (frm) { + if (frm.doc.reversal_of && (frm.is_new() || frm.doc.docstatus == 0)) { + frm.set_read_only(); + } + erpnext.toggle_naming_series(); if (frm.doc.docstatus > 0) { From c041cd27b5d6700ba92a1ae02bbb8e3ad52f4c0a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 05:42:11 +0530 Subject: [PATCH 03/49] fix(general-ledger): show raw GL entries when categorize_by is empty (backport #54816) (#54830) fix(general-ledger): show raw GL entries when categorize_by is empty (#54816) (cherry picked from commit dfbe847307c22d6f37cf6a808ccfbb72db3038bd) Co-authored-by: Jatin3128 <140256508+Jatin3128@users.noreply.github.com> --- erpnext/accounts/report/general_ledger/general_ledger.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 06c305563d8..ecbee216775 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -417,7 +417,13 @@ def get_data_with_opening_closing(filters, account_details, accounting_dimension # Opening for filtered account add_total_to_data(totals, "opening") - if filters.get("categorize_by") != "Categorize by Voucher (Consolidated)": + if not filters.get("categorize_by"): + all_entries = [] + for acc_dict in gle_map.values(): + all_entries.extend(acc_dict.entries) + data += all_entries + + elif filters.get("categorize_by") != "Categorize by Voucher (Consolidated)": set_opening_closing = (not filters.get("categorize_by") and not filters.get("voucher_no")) or ( filters.get("categorize_by") and filters.get("categorize_by") != "Categorize by Voucher" ) @@ -483,7 +489,6 @@ def initialize_gle_map(gl_entries, filters): totals=get_totals_dict(), entries=[], ) - return gle_map From e7ae29661447f1f58f43b3d44a77f186f096b727 Mon Sep 17 00:00:00 2001 From: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com> Date: Wed, 13 May 2026 14:53:04 +0530 Subject: [PATCH 04/49] fix(UX): Buying settings form cleanup (#54731) * fix(UX): Buying settings form cleanup * fix: controller approach modification * fix: dark mode support (cherry picked from commit 45f05fbeaa6ef99314e438067f18766be7993fb7) --- .../buying_settings/buying_settings.js | 53 +++++- .../buying_settings/buying_settings.json | 159 ++++++++++++------ erpnext/public/js/erpnext.bundle.js | 2 +- ...ming_series_dialog.js => naming_series.js} | 119 ++++++++++++- .../selling_settings/selling_settings.js | 65 +++---- 5 files changed, 289 insertions(+), 109 deletions(-) rename erpnext/public/js/utils/{naming_series_dialog.js => naming_series.js} (73%) diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.js b/erpnext/buying/doctype/buying_settings/buying_settings.js index 11b920aea71..9cc43220226 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.js +++ b/erpnext/buying/doctype/buying_settings/buying_settings.js @@ -2,10 +2,59 @@ // For license information, please see license.txt frappe.ui.form.on("Buying Settings", { - // refresh: function(frm) { - // } + refresh(frm) { + if (!frm.naming_controller) frm.naming_controller = new erpnext.NamingSeriesController(frm); + + const display = frm.doc.supp_master_name === "Naming Series"; + frm.set_df_property("naming_series_details", "hidden", !display); + frm.set_df_property("configure", "hidden", !display); + + if (display) { + frm.naming_controller.load_master_series("Supplier", "naming_series_details"); + } + + frm.naming_controller.render_table("transaction_naming_html", get_transactions(frm)); + }, + + supp_master_name(frm) { + const display = frm.doc.supp_master_name === "Naming Series"; + frm.set_df_property("naming_series_details", "hidden", !display); + frm.set_df_property("configure", "hidden", !display); + + if (display) { + frm.naming_controller.load_master_series("Supplier", "naming_series_details"); + } else { + frm.doc.naming_series_details = ""; + frm.refresh_field("naming_series_details"); + } + + frm.naming_controller.render_table("transaction_naming_html", get_transactions(frm)); + }, + + configure(frm) { + frm.naming_controller.show_naming_series_dialog("Supplier", ({ naming_series_options }) => { + frm.doc.naming_series_details = naming_series_options; + frm.refresh_field("naming_series_details"); + }); + }, }); +function get_transactions(frm) { + const transactions = [ + { label: __("Supplier"), doctype: "Supplier" }, + { label: __("Material Request"), doctype: "Material Request" }, + { label: __("Request for Quotation"), doctype: "Request for Quotation" }, + { label: __("Purchase Order"), doctype: "Purchase Order" }, + { label: __("Purchase Invoice"), doctype: "Purchase Invoice" }, + { label: __("Purchase Receipt"), doctype: "Purchase Receipt" }, + ]; + + if (frm.doc.supp_master_name !== "Naming Series") { + return transactions.filter((t) => t.doctype !== "Supplier"); + } + + return transactions; +} frappe.tour["Buying Settings"] = [ { fieldname: "supp_master_name", diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json index 3963bbb4959..6c2d2f1bb99 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.json +++ b/erpnext/buying/doctype/buying_settings/buying_settings.json @@ -6,44 +6,51 @@ "engine": "InnoDB", "field_order": [ "supplier_and_price_defaults_section", + "supplier_defaults_section", "supp_master_name", - "supplier_group", - "buying_price_list", + "naming_series_details", + "configure", "column_break_4", + "supplier_group", + "pricing_tab", + "buying_price_list", + "section_break_vwgg", + "maintain_same_rate", + "column_break_lwxs", "maintain_same_rate_action", "role_to_override_stop_action", - "section_break_xmlt", - "po_required", - "blanket_order_allowance", - "column_break_sbwq", - "pr_required", - "project_update_frequency", "transaction_settings_section", "column_break_fcyl", - "set_landed_cost_based_on_purchase_invoice_rate", - "allow_zero_qty_in_supplier_quotation", - "use_transaction_date_exchange_rate", - "allow_zero_qty_in_request_for_quotation", - "allow_negative_rates_for_items", + "po_required", + "pr_required", + "project_update_frequency", "column_break_12", - "maintain_same_rate", "allow_multiple_items", - "bill_for_rejected_quantity_in_purchase_invoice", + "allow_negative_rates_for_items", "set_valuation_rate_for_rejected_materials", "disable_last_purchase_rate", "show_pay_button", + "purchase_invoice_settings_section", + "bill_for_rejected_quantity_in_purchase_invoice", + "use_transaction_date_exchange_rate", + "set_landed_cost_based_on_purchase_invoice_rate", + "zero_quantity_line_items_section", + "allow_zero_qty_in_supplier_quotation", + "allow_zero_qty_in_request_for_quotation", "allow_zero_qty_in_purchase_order", + "blanket_order_section", + "blanket_order_allowance", "subcontract", "backflush_raw_materials_of_subcontract_based_on", - "column_break_11", "over_transfer_allowance", "validate_consumed_qty", "section_break_xcug", "auto_create_subcontracting_order", - "column_break_izrr", "auto_create_purchase_receipt", "request_for_quotation_tab", - "fixed_email" + "fixed_email", + "document_naming_tab", + "transaction_naming_html" ], "fields": [ { @@ -54,6 +61,7 @@ "options": "Supplier Name\nNaming Series\nAuto Name" }, { + "documentation_url": "https://docs.frappe.io/erpnext/buying-settings#2-default-supplier-group", "fieldname": "supplier_group", "fieldtype": "Link", "label": "Default Supplier Group", @@ -68,26 +76,27 @@ { "fieldname": "po_required", "fieldtype": "Select", - "label": "Is Purchase Order Required for Purchase Invoice & Receipt Creation?", + "label": "Is Purchase Order required for Purchase Invoice & Receipt creation?", "options": "No\nYes" }, { "fieldname": "pr_required", "fieldtype": "Select", - "label": "Is Purchase Receipt Required for Purchase Invoice Creation?", + "label": "Is Purchase Receipt required for Purchase Invoice creation?", "options": "No\nYes" }, { "default": "0", + "description": "Warn or stop if Item rate is changed in Purchase Invoice or Purchase Receipt generated from a Purchase Order.", "fieldname": "maintain_same_rate", "fieldtype": "Check", - "label": "Maintain Same Rate Throughout the Purchase Cycle" + "label": "Maintain same rate throughout the purchase cycle" }, { "default": "0", "fieldname": "allow_multiple_items", "fieldtype": "Check", - "label": "Allow Item To Be Added Multiple Times in a Transaction" + "label": "Allow Item to be added multiple times in a transaction" }, { "fieldname": "subcontract", @@ -96,9 +105,10 @@ }, { "default": "BOM", + "documentation_url": "https://docs.frappe.io/erpnext/buying-settings#1-backflush-raw-materials-of-subcontract-based-on", "fieldname": "backflush_raw_materials_of_subcontract_based_on", "fieldtype": "Select", - "label": "Backflush Raw Materials of Subcontract Based On", + "label": "Backflush raw materials of subcontract based on", "options": "BOM\nMaterial Transferred for Subcontract" }, { @@ -108,25 +118,21 @@ "fieldtype": "Float", "label": "Over Transfer Allowance (%)" }, - { - "fieldname": "column_break_11", - "fieldtype": "Column Break" - }, { "default": "Stop", "depends_on": "maintain_same_rate", "description": "Configure the action to stop the transaction or just warn if the same rate is not maintained.", "fieldname": "maintain_same_rate_action", "fieldtype": "Select", - "label": "Action If Same Rate is Not Maintained", + "label": "Action if same rate is not maintained", "mandatory_depends_on": "maintain_same_rate", "options": "Stop\nWarn" }, { - "depends_on": "eval:doc.maintain_same_rate_action == 'Stop'", + "depends_on": "maintain_same_rate", "fieldname": "role_to_override_stop_action", "fieldtype": "Link", - "label": "Role Allowed to Override Stop Action", + "label": "Role allowed to override stop action", "options": "Role" }, { @@ -134,12 +140,12 @@ "description": "If checked, Rejected Quantity will be included while making Purchase Invoice from Purchase Receipt.", "fieldname": "bill_for_rejected_quantity_in_purchase_invoice", "fieldtype": "Check", - "label": "Bill for Rejected Quantity in Purchase Invoice" + "label": "Bill for rejected quantity in Purchase Invoice" }, { "fieldname": "supplier_and_price_defaults_section", "fieldtype": "Tab Break", - "label": "Naming Series and Price Defaults" + "label": "Defaults" }, { "fieldname": "column_break_4", @@ -156,16 +162,17 @@ }, { "default": "0", + "description": "Prevents the system from automatically using the rate from the last purchase transaction when creating new purchase orders or transactions.", "fieldname": "disable_last_purchase_rate", "fieldtype": "Check", - "label": "Disable Last Purchase Rate" + "label": "Disable last purchase rate" }, { "default": "1", "depends_on": "eval: frappe.boot.versions && frappe.boot.versions.payments", "fieldname": "show_pay_button", "fieldtype": "Check", - "label": "Show Pay Button in Purchase Order Portal" + "label": "Show pay button in Purchase Order portal" }, { "default": "0", @@ -193,30 +200,25 @@ "fieldname": "section_break_xcug", "fieldtype": "Section Break" }, - { - "fieldname": "column_break_izrr", - "fieldtype": "Column Break" - }, { "default": "0", "description": "Subcontracting Order (Draft) will be auto-created on submission of Purchase Order.", "fieldname": "auto_create_subcontracting_order", "fieldtype": "Check", - "label": "Auto Create Subcontracting Order" + "label": "Auto create Subcontracting Order" }, { "default": "0", "description": "Purchase Receipt (Draft) will be auto-created on submission of Subcontracting Receipt.", "fieldname": "auto_create_purchase_receipt", "fieldtype": "Check", - "label": "Auto Create Purchase Receipt" + "label": "Auto create Purchase Receipt" }, { "default": "Each Transaction", - "description": "How often should Project be updated of Total Purchase Cost ?", "fieldname": "project_update_frequency", "fieldtype": "Select", - "label": "Update frequency of Project", + "label": "How often should project be updated of Total Purchase Cost ?", "options": "Each Transaction\nManual" }, { @@ -240,14 +242,6 @@ "fieldtype": "Check", "label": "Allow Supplier Quotation with Zero Quantity" }, - { - "fieldname": "section_break_xmlt", - "fieldtype": "Section Break" - }, - { - "fieldname": "column_break_sbwq", - "fieldtype": "Column Break" - }, { "fieldname": "column_break_fcyl", "fieldtype": "Column Break" @@ -258,7 +252,7 @@ "description": "If enabled, the system will generate an accounting entry for materials rejected in the Purchase Receipt.", "fieldname": "set_valuation_rate_for_rejected_materials", "fieldtype": "Check", - "label": "Set Valuation Rate for Rejected Materials" + "label": "Set valuation rate for rejected Materials" }, { "fieldname": "request_for_quotation_tab", @@ -279,23 +273,77 @@ "description": "Raw materials consumed qty will be validated based on FG BOM required qty", "fieldname": "validate_consumed_qty", "fieldtype": "Check", - "label": "Validate Consumed Qty (as per BOM)" + "label": "Validate consumed quantity (as per BOM)" }, { "default": "0", "fieldname": "allow_negative_rates_for_items", "fieldtype": "Check", - "label": "Allow Negative rates for Items" + "label": "Allow negative rates for Items" + }, + { + "fieldname": "supplier_defaults_section", + "fieldtype": "Section Break", + "label": "Supplier Defaults" + }, + { + "fieldname": "section_break_vwgg", + "fieldtype": "Section Break" + }, + { + "fieldname": "blanket_order_section", + "fieldtype": "Section Break", + "label": "Blanket Orders" + }, + { + "fieldname": "zero_quantity_line_items_section", + "fieldtype": "Section Break", + "label": "Zero-Quantity Line Items" + }, + { + "fieldname": "purchase_invoice_settings_section", + "fieldtype": "Section Break", + "label": "Purchase Invoice Settings" + }, + { + "fieldname": "column_break_lwxs", + "fieldtype": "Column Break" + }, + { + "fieldname": "pricing_tab", + "fieldtype": "Tab Break", + "label": "Pricing" + }, + { + "fieldname": "document_naming_tab", + "fieldtype": "Tab Break", + "label": "Document Naming" + }, + { + "fieldname": "configure", + "fieldtype": "Button", + "hidden": 1, + "label": "Configure Series" + }, + { + "fieldname": "transaction_naming_html", + "fieldtype": "HTML" + }, + { + "fieldname": "naming_series_details", + "fieldtype": "Small Text", + "hidden": 1, + "is_virtual": 1, + "label": "Naming Series options" } ], "grid_page_length": 50, - "hide_toolbar": 0, "icon": "fa fa-cog", "idx": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-04-15 16:07:35.484787", + "modified": "2026-05-05 16:30:37.184607", "modified_by": "Administrator", "module": "Buying", "name": "Buying Settings", @@ -313,7 +361,6 @@ { "create": 1, "email": 1, - "export": 1, "print": 1, "read": 1, "role": "Purchase Manager", diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js index eca43de6f83..69b587ba002 100644 --- a/erpnext/public/js/erpnext.bundle.js +++ b/erpnext/public/js/erpnext.bundle.js @@ -37,6 +37,6 @@ import "./utils/demo.js"; import "./financial_statements.js"; import "./sales_trends_filters.js"; import "./purchase_trends_filters.js"; -import "./utils/naming_series_dialog.js"; +import "./utils/naming_series.js"; // import { sum } from 'frappe/public/utils/util.js' diff --git a/erpnext/public/js/utils/naming_series_dialog.js b/erpnext/public/js/utils/naming_series.js similarity index 73% rename from erpnext/public/js/utils/naming_series_dialog.js rename to erpnext/public/js/utils/naming_series.js index b7f1ff076a0..9a1725529aa 100644 --- a/erpnext/public/js/utils/naming_series_dialog.js +++ b/erpnext/public/js/utils/naming_series.js @@ -207,6 +207,7 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { this.frm = opts.frm; this.transactions = opts.transactions || []; this.$wrapper = opts.frm.get_field(opts.fieldname).$wrapper; + this.theme_observer = null; } render() { this.$wrapper.html(` @@ -231,6 +232,21 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { const $rows = this.$wrapper.find(".naming-series-table-rows"); this.map_configure_button($rows); this.get_row_data($rows); + + if (this.theme_observer) { + this.theme_observer.disconnect(); + } + + const observer = new MutationObserver(() => { + const badge_class = this.get_current_badge_class(); + + this.$wrapper.find(".badge").removeClass("badge-light badge-dark").addClass(badge_class); + }); + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["data-theme"], + }); } map_configure_button($rows) { @@ -258,9 +274,11 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { }); } - get_row_data($rows) { - this.transactions.forEach((t) => { - frappe.model.with_doctype(t.doctype, () => { + async get_row_data($rows) { + const rows = await Promise.all( + this.transactions.map(async (t) => { + await new Promise((resolve) => frappe.model.with_doctype(t.doctype, resolve)); + const meta = frappe.get_meta(t.doctype); const naming_df = (meta?.fields || []).find((df) => df.fieldname === "naming_series"); const series = (naming_df?.options || "") @@ -268,9 +286,12 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { .map((s) => s.trim()) .filter(Boolean); - $rows.append(this.make_row(t, series)); - }); - }); + return this.make_row(t, series); + }) + ); + + $rows.empty(); + rows.forEach(($row) => $rows.append($row)); } make_row(t, series) { @@ -296,13 +317,20 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { `); } + get_current_badge_class() { + return document.documentElement.getAttribute("data-theme") === "dark" ? "badge-dark" : "badge-light"; + } + series_list_background(series_list) { if (!series_list.length) { return `${__("Not configured")}`; } + + const badge_class = this.get_current_badge_class(); + return series_list .map( - (s) => ` ` ${frappe.utils.escape_html(s)} ` @@ -310,3 +338,80 @@ erpnext.NamingSeriesTable = class NamingSeriesTable { .join(""); } }; + +/** + * @param {Object} frm - Frappe form instance. + */ +erpnext.NamingSeriesController = class NamingSeriesController { + constructor(frm) { + this.frm = frm; + } + + /** + * Renders the naming series table in the given field. + * + * @param {string} fieldname - Fieldname where the table should be rendered. + * @param {Array<{doctype: string, label: string}>} [transactions=[]] - Transactions to display. + * @returns {void} + */ + render_table(fieldname, transactions = []) { + this.frm._naming_series_table = new erpnext.NamingSeriesTable({ + frm: this.frm, + fieldname: fieldname, + transactions: transactions, + }); + this.frm._naming_series_table.render(); + } + + /** + * Loads naming series from the given master doctype into a field. + * + * @param {string} doctype - Master doctype name. + * @param {string} field - Fieldname where series should be shown. + * @returns {void} + */ + load_master_series(doctype, field) { + frappe.model.with_doctype(doctype, () => { + const meta = frappe.get_meta(doctype); + const naming_df = (meta?.fields || []).find((df) => df.fieldname === "naming_series"); + const options = naming_df?.options || ""; + const series_list = options + .split("\n") + .map((s) => s.trim()) + .filter(Boolean); + + this.frm.doc[field] = series_list.length + ? series_list.join("\n") + : __("No naming series defined"); + this.frm.refresh_field(field); + }); + } + + /** + * Opens the naming series dialog for a doctype. + * + * @param {string} doctype - Transaction doctype. + * @param {Function} [on_update] - Called after series are updated. + * @returns {void} + */ + show_naming_series_dialog(doctype, on_update) { + if (!this.frm._naming_dialogs) this.frm._naming_dialogs = {}; + + if (!this.frm._naming_dialogs[doctype]) { + this.frm._naming_dialogs[doctype] = new erpnext.NamingSeriesDialog({ + doctype: doctype, + title: __("{0} Naming Series", [__(doctype)]), + on_update: ({ naming_series_options }) => { + const series = naming_series_options.split("\n").filter(Boolean); + this.frm + .get_field(this.opts.table_field) + .$wrapper.find(`.series-cell-${frappe.scrub(doctype)}`) + .html(this.frm._naming_series_table?.series_list_background(series)); + on_update?.({ doctype, naming_series_options }); + }, + }); + } + + this.frm._naming_dialogs[doctype].show(); + } +}; diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.js b/erpnext/selling/doctype/selling_settings/selling_settings.js index dfa2a45727d..ce22db3fff0 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.js +++ b/erpnext/selling/doctype/selling_settings/selling_settings.js @@ -3,27 +3,39 @@ frappe.ui.form.on("Selling Settings", { refresh(frm) { + if (!frm.naming_controller) frm.naming_controller = new erpnext.NamingSeriesController(frm); + const display = frm.doc.cust_master_name === "Naming Series"; frm.set_df_property("naming_series_details", "hidden", !display); frm.set_df_property("configure", "hidden", !display); + if (display) { - find_naming_series("Customer", "naming_series_details", frm); + frm.naming_controller.load_master_series("Customer", "naming_series_details"); } - load_default_naming_series(frm); + + frm.naming_controller.render_table("transaction_naming_html", get_transactions(frm)); }, + cust_master_name(frm) { const display = frm.doc.cust_master_name === "Naming Series"; frm.set_df_property("naming_series_details", "hidden", !display); frm.set_df_property("configure", "hidden", !display); + if (display) { - find_naming_series("Customer", "naming_series_details", frm); + frm.naming_controller.load_master_series("Customer", "naming_series_details"); } else { - frm.set_value("naming_series_details", ""); + frm.doc.naming_series_details = ""; + frm.refresh_field("naming_series_details"); } + + frm.naming_controller.render_table("transaction_naming_html", get_transactions(frm)); }, configure(frm) { - show_naming_series_dialog("Customer", frm); + frm.naming_controller.show_naming_series_dialog("Customer", ({ naming_series_options }) => { + frm.doc.naming_series_details = naming_series_options; + frm.refresh_field("naming_series_details"); + }); }, after_save(frm) { @@ -31,51 +43,18 @@ frappe.ui.form.on("Selling Settings", { }, }); -function show_naming_series_dialog(doctype, frm) { - if (!frm._naming_series_dialog) { - frm._naming_series_dialog = new erpnext.NamingSeriesDialog({ - doctype: doctype, - title: __("Naming Series for {0}", [__(doctype)]), - on_update: ({ naming_series_options }) => { - frm.set_value("naming_series_details", naming_series_options); - }, - }); - } - frm._naming_series_dialog.show(); -} -function find_naming_series(doctype, field, frm) { - frappe.model.with_doctype(doctype, () => { - const meta = frappe.get_meta(doctype); - const naming_df = (meta?.fields || []).find((df) => df.fieldname === "naming_series"); - const options = naming_df?.options || ""; - const series_list = options - .split("\n") - .map((s) => s.trim()) - .filter(Boolean); - - frm.doc[field] = series_list.length ? series_list.join("\n") : __("No naming series defined"); - - frm.refresh_field(field); - }); -} - -function load_default_naming_series(frm) { - let transactions = [ +function get_transactions(frm) { + const transactions = [ { label: __("Customer"), doctype: "Customer" }, { label: __("Quotation"), doctype: "Quotation" }, { label: __("Sales Order"), doctype: "Sales Order" }, { label: __("Sales Invoice"), doctype: "Sales Invoice" }, { label: __("Delivery Note"), doctype: "Delivery Note" }, - { label: __("Payment Entry"), doctype: "Payment Entry" }, - { label: __("POS Invoice"), doctype: "POS Invoice" }, ]; if (frm.doc.cust_master_name !== "Naming Series") { - transactions = transactions.filter((t) => t.doctype !== "Customer"); + return transactions.filter((t) => t.doctype !== "Customer"); } - new erpnext.NamingSeriesTable({ - frm: frm, - fieldname: "transaction_naming_html", - transactions: transactions, - }).render(); + + return transactions; } From 3283c461f1b24cae30713e2d7f22523b587646b4 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 31 Mar 2026 00:48:09 +0530 Subject: [PATCH 05/49] feat: introduce print formats for financial statements (cherry picked from commit 82cac9c40fd8f621e12274518dbfa523aa29419e) --- .../balance_sheet_standard/__init__.py | 0 .../balance_sheet_standard.json | 33 +++++++++++++++++++ .../cash_flow_statement_standard/__init__.py | 0 .../cash_flow_statement_standard.json | 33 +++++++++++++++++++ .../p&l_statement_standard/__init__.py | 0 .../p&l_statement_standard.json | 33 +++++++++++++++++++ 6 files changed, 99 insertions(+) create mode 100644 erpnext/accounts/print_format/balance_sheet_standard/__init__.py create mode 100644 erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json create mode 100644 erpnext/accounts/print_format/cash_flow_statement_standard/__init__.py create mode 100644 erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json create mode 100644 erpnext/accounts/print_format/p&l_statement_standard/__init__.py create mode 100644 erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json diff --git a/erpnext/accounts/print_format/balance_sheet_standard/__init__.py b/erpnext/accounts/print_format/balance_sheet_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json new file mode 100644 index 00000000000..a218c108d8f --- /dev/null +++ b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-30 20:20:56.195531", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-31 00:35:16.443813", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Balance Sheet Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Balance Sheet", + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/print_format/cash_flow_statement_standard/__init__.py b/erpnext/accounts/print_format/cash_flow_statement_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json new file mode 100644 index 00000000000..ca3c4d696e5 --- /dev/null +++ b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-31 00:46:27.932456", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-31 01:13:26.318158", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Cash Flow Statement Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Cash Flow", + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/print_format/p&l_statement_standard/__init__.py b/erpnext/accounts/print_format/p&l_statement_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json new file mode 100644 index 00000000000..9b7771a3ea3 --- /dev/null +++ b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-31 00:39:51.067431", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-31 00:39:51.067431", + "modified_by": "Administrator", + "module": "Accounts", + "name": "P&L Statement Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Profit and Loss Statement", + "show_section_headings": 0, + "standard": "Yes" +} From 1d08448d1ade313a33514e645d5b6da7dd0d7de8 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 31 Mar 2026 14:33:03 +0530 Subject: [PATCH 06/49] feat: print format for report trial balance (cherry picked from commit ac7e5271b0a96bf0e13142c1af3dad5b21dd9a90) --- .../trial_balance_standard/__init__.py | 0 .../trial_balance_standard.json | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 erpnext/accounts/print_format/trial_balance_standard/__init__.py create mode 100644 erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json diff --git a/erpnext/accounts/print_format/trial_balance_standard/__init__.py b/erpnext/accounts/print_format/trial_balance_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json new file mode 100644 index 00000000000..1a88cde8226 --- /dev/null +++ b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-31 01:22:21.137577", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"From Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.from_date) %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"To Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.to_date) %}\n\t\t\t
\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\tconst styling = i === 0 ? \"\" : \"width: 9em\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-31 15:04:47.032520", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Trial Balance Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Trial Balance", + "show_section_headings": 0, + "standard": "Yes" +} From daaa4ca0c8b364872a63c4e1695561dc62adf678 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 31 Mar 2026 17:33:55 +0530 Subject: [PATCH 07/49] fix: minor text issues in print (cherry picked from commit fa0a9085cab191c3aff4f21f1d6a438f22730661) --- .../balance_sheet_standard/balance_sheet_standard.json | 4 ++-- .../cash_flow_statement_standard.json | 4 ++-- .../p&l_statement_standard/p&l_statement_standard.json | 4 ++-- .../trial_balance_standard/trial_balance_standard.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json index a218c108d8f..662d2565904 100644 --- a/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json +++ b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n\t {%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 00:35:16.443813", + "modified": "2026-03-31 17:25:22.282171", "modified_by": "Administrator", "module": "Accounts", "name": "Balance Sheet Standard", diff --git a/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json index ca3c4d696e5..2130f060ccb 100644 --- a/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json +++ b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 01:13:26.318158", + "modified": "2026-03-31 17:26:56.411191", "modified_by": "Administrator", "module": "Accounts", "name": "Cash Flow Statement Standard", diff --git a/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json index 9b7771a3ea3..51cdf702372 100644 --- a/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json +++ b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 00:39:51.067431", + "modified": "2026-03-31 17:26:30.738073", "modified_by": "Administrator", "module": "Accounts", "name": "P&L Statement Standard", diff --git a/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json index 1a88cde8226..7c6521e79df 100644 --- a/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json +++ b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"From Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.from_date) %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"To Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.to_date) %}\n\t\t\t
\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\tconst styling = i === 0 ? \"\" : \"width: 9em\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= row.account_name || row.section %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"From Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.from_date) %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"To Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.to_date) %}\n\t\t\t
\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\tconst styling = i === 0 ? \"\" : \"width: 9em\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 15:04:47.032520", + "modified": "2026-03-31 17:26:50.930090", "modified_by": "Administrator", "module": "Accounts", "name": "Trial Balance Standard", From 2ff9f00ce01b087f4c3dbf6c928fcd5fde98178f Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 12 Apr 2026 13:33:18 +0530 Subject: [PATCH 08/49] refactor: print templates for financial statements (cherry picked from commit e8777a1e349c0059220837122445c51c415784c6) --- .../report/balance_sheet/balance_sheet.html | 225 +++++++++++++++++- .../accounts/report/cash_flow/cash_flow.html | 225 +++++++++++++++++- .../profit_and_loss_statement.html | 225 +++++++++++++++++- .../report/trial_balance/trial_balance.html | 211 +++++++++++++++- 4 files changed, 882 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.html b/erpnext/accounts/report/balance_sheet/balance_sheet.html index d4ae54d4f38..5774bb07a0b 100644 --- a/erpnext/accounts/report/balance_sheet/balance_sheet.html +++ b/erpnext/accounts/report/balance_sheet/balance_sheet.html @@ -1 +1,224 @@ -{% include "accounts/report/financial_statements.html" %} +{% + const report_columns = report + .get_columns_for_print() + .filter(col => !col.hidden); + + if (report_columns.length > 8) { + frappe.throw( + __("Too many columns. Export the report and print it using a spreadsheet application.") + ); + } +%} + + + +
+ +
+
+ {%= __(report.report_name) %} +
+
+ + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Company") %}: {%= filters.company %} +
+
+ {%= __("Currency") %}: + {%= filters.presentation_currency || erpnext.get_currency(filters.company) %} +
+
+ +
+
+ {%= __("Period Based On") %}: + {%= filters.filter_based_on %} +
+ + {% if (filters.filter_based_on === "Fiscal Year") { %} +
+ {%= __("Start Year") %}: {%= filters.from_fiscal_year %} +
+
+ {%= __("End Year") %}: {%= filters.to_fiscal_year %} +
+ + {% } else if (filters.filter_based_on === "Date Range") { %} +
+ {%= __("Start Date") %}: + {%= frappe.datetime.str_to_user(filters.period_start_date) %} +
+
+ {%= __("End Date") %}: + {%= frappe.datetime.str_to_user(filters.period_end_date) %} +
+ {% } %} +
+
+ {% } %} + +
+ + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + {% } %} + + + + + {% for (let j = 0, k = data.length; j < k; j++) { %} + {% + const row = data[j]; + + let row_class = ""; + if (!(row.parent_account || row.parent_section)) { + row_class = "financial-statements-important"; + } + if (!(row.account_name || row.section)) { + row_class += " financial-statements-blank-row"; + } + %} + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const value = row[col.fieldname]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + + {% } %} + + {% } %} + +
+ {%= col.label %} +
+ {% if (i === 0) { %} + + {%= String(row.account_name || row.section || "").replace(/^['"]|['"]$/g, "") %} + + {% } else if (!is_null(value)) { %} + {%= frappe.format(value, col, {}, row) %} + {% } %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file diff --git a/erpnext/accounts/report/cash_flow/cash_flow.html b/erpnext/accounts/report/cash_flow/cash_flow.html index d4ae54d4f38..6b11aea5e54 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.html +++ b/erpnext/accounts/report/cash_flow/cash_flow.html @@ -1 +1,224 @@ -{% include "accounts/report/financial_statements.html" %} +{% + const report_columns = report + .get_columns_for_print() + .filter(col => !col.hidden); + + if (report_columns.length > 8) { + frappe.throw( + __("Too many columns. Export the report and print it using a spreadsheet application.") + ); + } +%} + + + +
+ +
+
+ {%= __(report.report_name) %} +
+
+ + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Company") %}: {%= filters.company %} +
+
+ {%= __("Currency") %}: + {%= filters.presentation_currency || erpnext.get_currency(filters.company) %} +
+
+ +
+
+ {%= __("Period Based On") %}: + {%= filters.filter_based_on %} +
+ + {% if (filters.filter_based_on === "Fiscal Year") { %} +
+ {%= __("Start Year") %}: {%= filters.from_fiscal_year %} +
+
+ {%= __("End Year") %}: {%= filters.to_fiscal_year %} +
+ + {% } else if (filters.filter_based_on === "Date Range") { %} +
+ {%= __("Start Date") %}: + {%= frappe.datetime.str_to_user(filters.period_start_date) %} +
+
+ {%= __("End Date") %}: + {%= frappe.datetime.str_to_user(filters.period_end_date) %} +
+ {% } %} +
+
+ {% } %} + +
+ + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + {% } %} + + + + + {% for (let j = 0, k = data.length; j < k; j++) { %} + {% + const row = data[j]; + + let row_class = ""; + if (!(row.parent_account || row.parent_section)) { + row_class = "financial-statements-important"; + } + if (!(row.account_name || row.section)) { + row_class += " financial-statements-blank-row"; + } + %} + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const value = row[col.fieldname]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + + {% } %} + + {% } %} + +
+ {%= col.label %} +
+ {% if (i === 0) { %} + + {%= String(row.account_name || row.section || "").replace(/^['"]|['"]$/g, "") %} + + {% } else if (!is_null(value)) { %} + {%= frappe.format(value, col, {}, row) %} + {% } %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html index d4ae54d4f38..6b11aea5e54 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html @@ -1 +1,224 @@ -{% include "accounts/report/financial_statements.html" %} +{% + const report_columns = report + .get_columns_for_print() + .filter(col => !col.hidden); + + if (report_columns.length > 8) { + frappe.throw( + __("Too many columns. Export the report and print it using a spreadsheet application.") + ); + } +%} + + + +
+ +
+
+ {%= __(report.report_name) %} +
+
+ + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Company") %}: {%= filters.company %} +
+
+ {%= __("Currency") %}: + {%= filters.presentation_currency || erpnext.get_currency(filters.company) %} +
+
+ +
+
+ {%= __("Period Based On") %}: + {%= filters.filter_based_on %} +
+ + {% if (filters.filter_based_on === "Fiscal Year") { %} +
+ {%= __("Start Year") %}: {%= filters.from_fiscal_year %} +
+
+ {%= __("End Year") %}: {%= filters.to_fiscal_year %} +
+ + {% } else if (filters.filter_based_on === "Date Range") { %} +
+ {%= __("Start Date") %}: + {%= frappe.datetime.str_to_user(filters.period_start_date) %} +
+
+ {%= __("End Date") %}: + {%= frappe.datetime.str_to_user(filters.period_end_date) %} +
+ {% } %} +
+
+ {% } %} + +
+ + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + {% } %} + + + + + {% for (let j = 0, k = data.length; j < k; j++) { %} + {% + const row = data[j]; + + let row_class = ""; + if (!(row.parent_account || row.parent_section)) { + row_class = "financial-statements-important"; + } + if (!(row.account_name || row.section)) { + row_class += " financial-statements-blank-row"; + } + %} + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const value = row[col.fieldname]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + + {% } %} + + {% } %} + +
+ {%= col.label %} +
+ {% if (i === 0) { %} + + {%= String(row.account_name || row.section || "").replace(/^['"]|['"]$/g, "") %} + + {% } else if (!is_null(value)) { %} + {%= frappe.format(value, col, {}, row) %} + {% } %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file diff --git a/erpnext/accounts/report/trial_balance/trial_balance.html b/erpnext/accounts/report/trial_balance/trial_balance.html index d4ae54d4f38..be3fa7a205b 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.html +++ b/erpnext/accounts/report/trial_balance/trial_balance.html @@ -1 +1,210 @@ -{% include "accounts/report/financial_statements.html" %} +{% + const report_columns = report + .get_columns_for_print() + .filter(col => !col.hidden); + + if (report_columns.length > 8) { + frappe.throw( + __("Too many columns. Export the report and print it using a spreadsheet application.") + ); + } +%} + + + +
+ +
+
+ {%= __(report.report_name) %} +
+
+ + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Company") %}: {%= filters.company %} +
+
+ {%= __("Currency") %}: + {%= filters.presentation_currency || erpnext.get_currency(filters.company) %} +
+
+ +
+
+ {%= __("From Date") %}: + {%= frappe.datetime.str_to_user(filters.from_date) %} +
+
+ {%= __("To Date") %}: + {%= frappe.datetime.str_to_user(filters.to_date) %} +
+
+
+ {% } %} + +
+ + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const align = i === 0 ? "text-left" : "text-right"; + const styling = i === 0 ? "" : "width: 9em"; + %} + + {% } %} + + + + + {% for (let j = 0, k = data.length; j < k; j++) { %} + {% + const row = data[j]; + + let row_class = ""; + if (!(row.parent_account || row.parent_section)) { + row_class = "financial-statements-important"; + } + if (!(row.account_name || row.section)) { + row_class += " financial-statements-blank-row"; + } + %} + + + {% for (let i = 0, l = report_columns.length; i < l; i++) { %} + {% + const col = report_columns[i]; + const value = row[col.fieldname]; + const align = i === 0 ? "text-left" : "text-right"; + %} + + + {% } %} + + {% } %} + +
+ {%= col.label %} +
+ {% if (i === 0) { %} + + {%= String(row.account_name || row.section || "").replace(/^['"]|['"]$/g, "") %} + + {% } else if (!is_null(value)) { %} + {%= frappe.format(value, col, {}, row) %} + {% } %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file From 9a18d318d92237a1152e80f1f52e3a8adc756a24 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 24 Apr 2026 12:41:13 +0530 Subject: [PATCH 09/49] fix: styling in trial_balance.html and print format (cherry picked from commit 5858b140712e296e72189d95f4ca9a6dee7f7cfb) --- .../trial_balance_standard.json | 4 ++-- .../report/trial_balance/trial_balance.html | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json index 7c6521e79df..019f59be876 100644 --- a/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json +++ b/erpnext/accounts/print_format/trial_balance_standard/trial_balance_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"From Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.from_date) %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"To Date\") %}: \n\t\t\t\t{%= frappe.datetime.str_to_user(filters.to_date) %}\n\t\t\t
\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\tconst styling = i === 0 ? \"\" : \"width: 9em\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n
\n
\n {%= __(\"Company\") %}: {%= filters.company %}\n
\n
\n {%= __(\"Currency\") %}:\n {%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n
\n
\n\n
\n
\n {%= __(\"From Date\") %}:\n {%= frappe.datetime.str_to_user(filters.from_date) %}\n
\n
\n {%= __(\"To Date\") %}:\n {%= frappe.datetime.str_to_user(filters.to_date) %}\n
\n
\n
\n {% } %}\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\tconst styling = i === 0 ? \"\" : \"width: 9em\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n\n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n\n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n\n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n\n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 17:26:50.930090", + "modified": "2026-04-24 12:40:37.484173", "modified_by": "Administrator", "module": "Accounts", "name": "Trial Balance Standard", diff --git a/erpnext/accounts/report/trial_balance/trial_balance.html b/erpnext/accounts/report/trial_balance/trial_balance.html index be3fa7a205b..f3f029abcdd 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.html +++ b/erpnext/accounts/report/trial_balance/trial_balance.html @@ -50,15 +50,20 @@ font-weight: 500; } - .report-subtitle { - margin: 10px 0 14px; - } + .report-subtitle { + margin: 10px 0 14px; + } .text-center { text-align: center; } + .text-right { text-align: right; font-variant-numeric: tabular-nums; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + .text-left { text-align: left; } .text-bold { font-weight: 700; } @@ -82,7 +87,7 @@ color: #7c7c7c; } - .report-table tbody td { + .report-table tbody td.text-left { vertical-align: top; word-wrap: break-word; } From c4037daca8572a63e1195d223fa8bc0a77dca83a Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Wed, 6 May 2026 17:45:33 +0530 Subject: [PATCH 10/49] fix: add filter subtitle in print formats (cherry picked from commit e82b4d9ca73e1774b5d5d9ff93ecf738f22999ff) --- .../balance_sheet_standard/balance_sheet_standard.json | 4 ++-- .../cash_flow_statement_standard.json | 4 ++-- .../p&l_statement_standard/p&l_statement_standard.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json index 662d2565904..9529a0cb45d 100644 --- a/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json +++ b/erpnext/accounts/print_format/balance_sheet_standard/balance_sheet_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n\t {%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t{% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n
\n
\n {%= __(\"Company\") %}: {%= filters.company %}\n
\n
\n {%= __(\"Currency\") %}:\n {%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n
\n
\n\n
\n
\n {%= __(\"Period Based On\") %}:\n {%= filters.filter_based_on %}\n
\n\n {% if (filters.filter_based_on === \"Fiscal Year\") { %}\n
\n {%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n
\n
\n {%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n
\n\n {% } else if (filters.filter_based_on === \"Date Range\") { %}\n
\n {%= __(\"Start Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_start_date) %}\n
\n
\n {%= __(\"End Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_end_date) %}\n
\n {% } %}\n
\n
\n {% } %}\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n\t {%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 17:25:22.282171", + "modified": "2026-05-06 17:40:39.605807", "modified_by": "Administrator", "module": "Accounts", "name": "Balance Sheet Standard", diff --git a/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json index 2130f060ccb..fd95794a0f9 100644 --- a/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json +++ b/erpnext/accounts/print_format/cash_flow_statement_standard/cash_flow_statement_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n
\n
\n {%= __(\"Company\") %}: {%= filters.company %}\n
\n
\n {%= __(\"Currency\") %}:\n {%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n
\n
\n\n
\n
\n {%= __(\"Period Based On\") %}:\n {%= filters.filter_based_on %}\n
\n\n {% if (filters.filter_based_on === \"Fiscal Year\") { %}\n
\n {%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n
\n
\n {%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n
\n\n {% } else if (filters.filter_based_on === \"Date Range\") { %}\n
\n {%= __(\"Start Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_start_date) %}\n
\n
\n {%= __(\"End Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_end_date) %}\n
\n {% } %}\n
\n
\n {% } %}\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 17:26:56.411191", + "modified": "2026-05-06 17:42:07.113775", "modified_by": "Administrator", "module": "Accounts", "name": "Cash Flow Statement Standard", diff --git a/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json index 51cdf702372..b1a379b0b47 100644 --- a/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json +++ b/erpnext/accounts/print_format/p&l_statement_standard/p&l_statement_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Company\") %}: {%= filters.company %}\n\t\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Currency\") %}:\n\t\t\t\t{%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t{%= __(\"Period Based On\") %}: \n\t\t\t\t{%= filters.filter_based_on %}\n\t\t\t
\n\n\t\t\t{% if (filters.filter_based_on === \"Fiscal Year\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n\t\t\t\t
\n\n\t\t\t{% } else if (filters.filter_based_on === \"Date Range\") { %}\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Start Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_start_date) %}\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"End Date\") %}: \n\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.period_end_date) %}\n\t\t\t\t
\n\t\t\t{% } %}\n\t\t
\n\t
\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", + "html": "{%\n\tconst report_columns = report\n\t\t.get_columns_for_print()\n\t\t.filter(col => !col.hidden);\n\n\tif (report_columns.length > 8) {\n\t\tfrappe.throw(\n\t\t\t__(\"Too many columns. Export the report and print it using a spreadsheet application.\")\n\t\t);\n\t}\n%}\n\n\n\n
\n\n\t
\n\t\t
\n\t\t\t{%= __(report.report_name) %}\n\t\t
\n\t
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n
\n
\n {%= __(\"Company\") %}: {%= filters.company %}\n
\n
\n {%= __(\"Currency\") %}:\n {%= filters.presentation_currency || erpnext.get_currency(filters.company) %}\n
\n
\n\n
\n
\n {%= __(\"Period Based On\") %}:\n {%= filters.filter_based_on %}\n
\n\n {% if (filters.filter_based_on === \"Fiscal Year\") { %}\n
\n {%= __(\"Start Year\") %}: {%= filters.from_fiscal_year %}\n
\n
\n {%= __(\"End Year\") %}: {%= filters.to_fiscal_year %}\n
\n\n {% } else if (filters.filter_based_on === \"Date Range\") { %}\n
\n {%= __(\"Start Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_start_date) %}\n
\n
\n {%= __(\"End Date\") %}:\n {%= frappe.datetime.str_to_user(filters.period_end_date) %}\n
\n {% } %}\n
\n
\n {% } %}\n\n\t
\n \t\n \t\t\n \t\t\t\n \t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t{%\n \t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t%}\n \t\t\t\t\t\n \t\t\t\t{% } %}\n \t\t\t\n \t\t\n \n \t\t\n \t\t\t{% for (let j = 0, k = data.length; j < k; j++) { %}\n \t\t\t\t{%\n \t\t\t\t\tconst row = data[j];\n \n \t\t\t\t\tlet row_class = \"\";\n \t\t\t\t\tif (!(row.parent_account || row.parent_section)) {\n \t\t\t\t\t\trow_class = \"financial-statements-important\";\n \t\t\t\t\t}\n \t\t\t\t\tif (!(row.account_name || row.section)) {\n \t\t\t\t\t\trow_class += \" financial-statements-blank-row\";\n \t\t\t\t\t}\n \t\t\t\t%}\n \n \t\t\t\t\n \t\t\t\t\t{% for (let i = 0, l = report_columns.length; i < l; i++) { %}\n \t\t\t\t\t\t{%\n \t\t\t\t\t\t\tconst col = report_columns[i];\n \t\t\t\t\t\t\tconst value = row[col.fieldname];\n \t\t\t\t\t\t\tconst align = i === 0 ? \"text-left\" : \"text-right\";\n \t\t\t\t\t\t%}\n \n \t\t\t\t\t\t\n \t\t\t\t\t{% } %}\n \t\t\t\t\n \t\t\t{% } %}\n \t\t\n \t
\n \t\t\t\t\t\t{%= col.label %}\n \t\t\t\t\t
\n \t\t\t\t\t\t\t{% if (i === 0) { %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\t{%= String(row.account_name || row.section || \"\").replace(/^['\"]|['\"]$/g, \"\") %}\n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t{% } else if (!is_null(value)) { %}\n \t\t\t\t\t\t\t\t{%= frappe.format(value, col, {}, row) %}\n \t\t\t\t\t\t\t{% } %}\n \t\t\t\t\t\t
\n
\n\n\t

\n\t\t{%= __(\"Printed on {0}\", [\n\t\t\tfrappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n\t\t]) %}\n\t

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-31 17:26:30.738073", + "modified": "2026-05-06 17:42:47.344321", "modified_by": "Administrator", "module": "Accounts", "name": "P&L Statement Standard", From 0d07083299e1f882eae583e55527e34a4a20c258 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 15:09:38 +0530 Subject: [PATCH 11/49] =?UTF-8?q?Revert=20"fix:=20debit=20credit=20not=20e?= =?UTF-8?q?qual=20in=20purchase=20transactions=20for=20mult=E2=80=A6=20(ba?= =?UTF-8?q?ckport=20#54906)=20(#54908)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "fix: debit credit not equal in purchase transactions for mult… (#54906) * Revert "fix: debit credit not equal in purchase transactions for multi currency" This reverts commit 75bcea57f4d7600334eec941fd15aa8b17dd6279. * Revert "test: add test case" This reverts commit 1d30a202c329183af7d1523fb49b1f8be2bbc761. * Revert "fix: include rejected qty in tax (purchase receipt)" This reverts commit 8c9a88abbedf6babcfa1d1fea84335768af4067e. (cherry picked from commit cf5e8ce87846ae4557087dc465ee78332f6e97df) Co-authored-by: Mihir Kandoi --- erpnext/controllers/buying_controller.py | 12 +------- erpnext/controllers/taxes_and_totals.py | 21 ++------------ .../purchase_receipt/purchase_receipt.py | 9 +----- .../purchase_receipt/test_purchase_receipt.py | 29 +------------------ 4 files changed, 5 insertions(+), 66 deletions(-) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 0f74ea12348..47ad8459905 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -461,17 +461,7 @@ class BuyingController(SubcontractingController): get_conversion_factor(item.item_code, item.uom).get("conversion_factor") or 1.0 ) - net_rate = ( - flt( - (item.base_net_amount / item.received_qty) * item.qty, - item.precision("base_net_amount"), - ) - if item.received_qty - and frappe.get_single_value( - "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice" - ) - else item.base_net_amount - ) + net_rate = item.base_net_amount if item.sales_incoming_rate: # for internal transfer net_rate = item.qty * item.sales_incoming_rate diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 6a0a41b1799..86bb26ac607 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -169,10 +169,6 @@ class calculate_taxes_and_totals: return if not self.discount_amount_applied: - bill_for_rejected_quantity_in_purchase_invoice = frappe.get_single_value( - "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice" - ) - do_not_round_fields = ["valuation_rate", "incoming_rate"] for item in self.doc.items: @@ -236,13 +232,7 @@ class calculate_taxes_and_totals: elif not item.qty and self.doc.get("is_debit_note"): item.amount = flt(item.rate, item.precision("amount")) else: - qty = ( - (item.qty + item.rejected_qty) - if bill_for_rejected_quantity_in_purchase_invoice - and self.doc.doctype == "Purchase Receipt" - else item.qty - ) - item.amount = flt(item.rate * qty, item.precision("amount")) + item.amount = flt(item.rate * item.qty, item.precision("amount")) item.net_amount = item.amount @@ -402,16 +392,9 @@ class calculate_taxes_and_totals: self.doc.total ) = self.doc.base_total = self.doc.net_total = self.doc.base_net_total = 0.0 - bill_for_rejected_quantity_in_purchase_invoice = frappe.get_single_value( - "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice" - ) for item in self._items: self.doc.total += item.amount - self.doc.total_qty += ( - (item.qty + item.rejected_qty) - if bill_for_rejected_quantity_in_purchase_invoice and self.doc.doctype == "Purchase Receipt" - else item.qty - ) + self.doc.total_qty += item.qty self.doc.base_total += item.base_amount self.doc.net_total += item.net_amount self.doc.base_net_total += item.base_net_amount diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 770b03596d6..7806a51209b 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -561,14 +561,7 @@ class PurchaseReceipt(BuyingController): else flt(item.net_amount, item.precision("net_amount")) ) - outgoing_amount = ( - flt((item.base_net_amount / item.received_qty) * item.qty, item.precision("base_net_amount")) - if item.received_qty - and frappe.get_single_value( - "Buying Settings", "bill_for_rejected_quantity_in_purchase_invoice" - ) - else item.base_net_amount - ) + outgoing_amount = item.base_net_amount if self.is_internal_transfer() and item.valuation_rate: outgoing_amount = abs(get_stock_value_difference(self.name, item.name, item.from_warehouse)) credit_amount = outgoing_amount diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 828ad603d8e..6cb75bc5312 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -4610,7 +4610,7 @@ class TestPurchaseReceipt(ERPNextTestSuite): self.assertEqual(srbnb_cost, 1500) - def test_valuation_rate_for_rejected_materials_without_accepted_materials(self): + def test_valuation_rate_for_rejected_materials_withoout_accepted_materials(self): item = make_item("Test Item with Rej Material Valuation WO Accepted", {"is_stock_item": 1}) company = "_Test Company with perpetual inventory" @@ -5423,33 +5423,6 @@ class TestPurchaseReceipt(ERPNextTestSuite): self.assertEqual(row.warehouse, "_Test Warehouse 1 - _TC") self.assertEqual(row.incoming_rate, 100) - def test_bill_for_rejected_quantity_in_purchase_invoice(self): - item_code = make_item("Test Rejected Qty", {"is_stock_item": 1}).name - - with self.change_settings("Buying Settings", {"bill_for_rejected_quantity_in_purchase_invoice": 0}): - pr = make_purchase_receipt( - item_code=item_code, - qty=10, - rejected_qty=2, - rate=10, - warehouse="_Test Warehouse - _TC", - ) - - self.assertEqual(pr.total_qty, 10) - self.assertEqual(pr.total, 100) - - with self.change_settings("Buying Settings", {"bill_for_rejected_quantity_in_purchase_invoice": 1}): - pr = make_purchase_receipt( - item_code=item_code, - qty=10, - rejected_qty=2, - rate=10, - warehouse="_Test Warehouse - _TC", - ) - - self.assertEqual(pr.total_qty, 12) - self.assertEqual(pr.total, 120) - def test_different_exchange_rate_in_pr_and_pi(self): from erpnext.accounts.doctype.account.test_account import create_account From 928fab6f7e72dd421c2f6db7af877fb2d7a379b5 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 29 Mar 2026 02:02:59 +0530 Subject: [PATCH 12/49] fix: revamp print formats for accounts receivable summary and accounts payable summary reports (cherry picked from commit 5bbcb73808464a18fdc4b216cf1c9e50c2db2023) --- .../__init__.py | 0 .../accounts_payable_summary_standard.json | 33 ++++ .../__init__.py | 0 .../accounts_receivable_summary_standard.json | 33 ++++ .../accounts_payable_summary.html | 173 +++++++++++++++++- .../accounts_receivable_summary.html | 173 +++++++++++++++++- 6 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 erpnext/accounts/print_format/accounts_payable_summary_standard/__init__.py create mode 100644 erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json create mode 100644 erpnext/accounts/print_format/accounts_receivable_summary_standard/__init__.py create mode 100644 erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json diff --git a/erpnext/accounts/print_format/accounts_payable_summary_standard/__init__.py b/erpnext/accounts/print_format/accounts_payable_summary_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json b/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json new file mode 100644 index 00000000000..24a12fd1cb0 --- /dev/null +++ b/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-29 01:59:18.659670", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Supplier\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) { \n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Supplier\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Debit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.debit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-29 02:01:02.803591", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounts Payable Summary Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Accounts Payable Summary", + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/print_format/accounts_receivable_summary_standard/__init__.py b/erpnext/accounts/print_format/accounts_receivable_summary_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json b/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json new file mode 100644 index 00000000000..24128210dd2 --- /dev/null +++ b/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-29 01:45:09.285854", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Customer\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) { \n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Customer\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Debit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.credit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-29 02:00:53.128608", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounts Receivable Summary Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Accounts Receivable Summary", + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html index d3020b22a40..00aac67a8cd 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html @@ -1 +1,172 @@ -{% include "accounts/report/accounts_receivable/accounts_receivable.html" %} + + +
+ +
+ +
+
+ {%= __(report.report_name) %} +
+
+ +
+
+
+ {%= __("Supplier") %}: + {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
+ +
+
+ {%= __("Ageing Based On") %}: + {%= __(filters.ageing_based_on) %} +
+
+ {%= __("As on Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+
+ + +
+ + + + + + + + + + + + + {% for (var i = 0, l = data.length; i < l; i++) { + var row = data[i]; + if (!(row.party || row.is_total_row)) continue; + %} + + + + + + + + + + {% } %} + +
{%= __("Supplier") %}{%= __("Total Invoiced Amount") %}{%= __("Total Paid Amount") %}{%= __("Debit Note Amount") %}{%= __("Total Outstanding Amount") %}
+ {% if (row.is_total_row) { %} + {%= __("Total") %} + {% } else { %} + {%= row.party %} + {% } %} + + {%= format_currency(row.invoiced, row.currency) %} + + {%= format_currency(row.paid, row.currency) %} + + {%= format_currency(row.debit_note, row.currency) %} + + {%= format_currency(row.outstanding, row.currency) %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html index d3020b22a40..af7df3851ec 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html @@ -1 +1,172 @@ -{% include "accounts/report/accounts_receivable/accounts_receivable.html" %} + + +
+ +
+ +
+
+ {%= __(report.report_name) %} +
+
+ +
+
+
+ {%= __("Customer") %}: + {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
+ +
+
+ {%= __("Ageing Based On") %}: + {%= __(filters.ageing_based_on) %} +
+
+ {%= __("As on Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+
+ + +
+ + + + + + + + + + + + + {% for (var i = 0, l = data.length; i < l; i++) { + var row = data[i]; + if (!(row.party || row.is_total_row)) continue; + %} + + + + + + + + + + {% } %} + +
{%= __("Customer") %}{%= __("Total Invoiced Amount") %}{%= __("Total Paid Amount") %}{%= __("Debit Note Amount") %}{%= __("Total Outstanding Amount") %}
+ {% if (row.is_total_row) { %} + {%= __("Total") %} + {% } else { %} + {%= row.party %} + {% } %} + + {%= format_currency(row.invoiced, row.currency) %} + + {%= format_currency(row.paid, row.currency) %} + + {%= format_currency(row.credit_note, row.currency) %} + + {%= format_currency(row.outstanding, row.currency) %} +
+
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file From e1446fc6f455c78ab0a71bcafad906ac23d8e454 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Wed, 1 Apr 2026 12:30:05 +0530 Subject: [PATCH 13/49] fix: minor bugs in print templates (cherry picked from commit 86ee9959a215e76543e6455b6bd2962b49c05258) --- .../accounts_payable_summary_standard.json | 4 ++-- .../accounts_receivable_summary_standard.json | 4 ++-- .../accounts_payable_summary/accounts_payable_summary.html | 2 -- .../accounts_receivable_summary.html | 4 +--- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json b/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json index 24a12fd1cb0..95da0e221aa 100644 --- a/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json +++ b/erpnext/accounts/print_format/accounts_payable_summary_standard/accounts_payable_summary_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Supplier\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) { \n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Supplier\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Debit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.debit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Supplier\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) { \n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Supplier\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Debit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.debit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-29 02:01:02.803591", + "modified": "2026-04-01 12:31:46.117872", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Payable Summary Standard", diff --git a/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json b/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json index 24128210dd2..b430495a1f5 100644 --- a/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json +++ b/erpnext/accounts/print_format/accounts_receivable_summary_standard/accounts_receivable_summary_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Customer\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) { \n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Customer\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Debit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.credit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n
\n
\n
\n {%= __(\"Customer\") %}:\n {%= (filters.party && filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Ageing Based On\") %}:\n {%= __(filters.ageing_based_on) %}\n
\n
\n {%= __(\"As on Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n \n\n \n {% for (var i = 0, l = data.length; i < l; i++) {\n var row = data[i];\n if (!(row.party || row.is_total_row)) continue;\n %}\n \n \n\n \n \n \n \n \n {% } %}\n \n
{%= __(\"Customer\") %}{%= __(\"Total Invoiced Amount\") %}{%= __(\"Total Paid Amount\") %}{%= __(\"Credit Note Amount\") %}{%= __(\"Total Outstanding Amount\") %}
\n {% if (row.is_total_row) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= row.party %}\n {% } %}\n \n {%= format_currency(row.invoiced, row.currency) %}\n \n {%= format_currency(row.paid, row.currency) %}\n \n {%= format_currency(row.credit_note, row.currency) %}\n \n {%= format_currency(row.outstanding, row.currency) %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-29 02:00:53.128608", + "modified": "2026-04-01 12:31:21.651910", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Receivable Summary Standard", diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html index 00aac67a8cd..9f42c9f65a3 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html @@ -117,7 +117,6 @@ -
@@ -136,7 +135,6 @@ if (!(row.party || row.is_total_row)) continue; %} -
{% if (row.is_total_row) { %} {%= __("Total") %} diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html index af7df3851ec..48e42b439d4 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html @@ -117,7 +117,6 @@ -
@@ -125,7 +124,7 @@ - + @@ -136,7 +135,6 @@ if (!(row.party || row.is_total_row)) continue; %} - {% if(filters.show_remarks) { %} - + {% } %} @@ -152,6 +146,13 @@ {%= data[i]["voucher_no"] %} {% } %} + {% if(filters.show_remarks) { %} + + {% } %} From 0ead2296e6af30b31764ad67cc3549d4b3f54edb Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 12 Apr 2026 13:00:51 +0530 Subject: [PATCH 21/49] fix: minor changes in print template (cherry picked from commit e3019c827c96ba16b4e3ef96e617945d6546c171) --- .../accounts_receivable.html | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index 6000ce73120..33f09dbb3d1 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -79,6 +79,10 @@ font-weight: 500; } + .report-subtitle { + margin: 10px 0 14px; + } + @media print { @page { size: A4; @@ -93,31 +97,34 @@
-
{%= __(report.report_name) %}
- -
-
-
- {%= __("Customer") %}: - {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %} + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Customer") %}: + {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
+ +
+
+ {%= __("Report Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+ {% } %} -
-
- {%= __("Report Date") %}: - {%= frappe.datetime.str_to_user(filters.report_date) %} -
-
-
- -
{%= __("Customer") %} {%= __("Total Invoiced Amount") %} {%= __("Total Paid Amount") %}{%= __("Debit Note Amount") %}{%= __("Credit Note Amount") %} {%= __("Total Outstanding Amount") %}
{% if (row.is_total_row) { %} {%= __("Total") %} From 0d50e03595f70534ca53894c03d3fa706cc8065b Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 12 Apr 2026 13:14:24 +0530 Subject: [PATCH 14/49] fix: minor changes in print templates (cherry picked from commit 44e0b36093e8ffd176d007f194cfd05615780ff1) --- .../accounts_payable_summary.html | 40 ++++++++++++------- .../accounts_receivable_summary.html | 40 ++++++++++++------- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html index 9f42c9f65a3..885e9f5d6b3 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html @@ -72,6 +72,10 @@ font-weight: 500; } + .report-subtitle { + margin: 10px 0 14px; + } + .text-center { text-align: center; } .text-right { text-align: right; font-variant-numeric: tabular-nums; } .text-left { text-align: left; } @@ -97,25 +101,31 @@ -
-
-
- {%= __("Supplier") %}: - {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} -
+ {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }}
+ {% } else { %} +
+
+
+ {%= __("Supplier") %}: + {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
-
-
- {%= __("Ageing Based On") %}: - {%= __(filters.ageing_based_on) %} -
-
- {%= __("As on Date") %}: - {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+ {%= __("Ageing Based On") %}: + {%= __(filters.ageing_based_on) %} +
+
+ {%= __("As on Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
-
+ {% } %}
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html index 48e42b439d4..235fea669bd 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html @@ -72,6 +72,10 @@ font-weight: 500; } + .report-subtitle { + margin: 10px 0 14px; + } + .text-center { text-align: center; } .text-right { text-align: right; font-variant-numeric: tabular-nums; } .text-left { text-align: left; } @@ -97,25 +101,31 @@ -
-
-
- {%= __("Customer") %}: - {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} -
+ {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }}
+ {% } else { %} +
+
+
+ {%= __("Customer") %}: + {%= (filters.party && filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
-
-
- {%= __("Ageing Based On") %}: - {%= __(filters.ageing_based_on) %} -
-
- {%= __("As on Date") %}: - {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+ {%= __("Ageing Based On") %}: + {%= __(filters.ageing_based_on) %} +
+
+ {%= __("As on Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
-
+ {% } %}
From 748a3d72a369914535b29100d1ef4fd06218878a Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 27 Mar 2026 12:32:17 +0530 Subject: [PATCH 15/49] refactor: revamp print template for accounts payable report (cherry picked from commit c051536182531f3362cd8002c5b1f5adcdb470e7) --- .../accounts_payable/accounts_payable.html | 221 +++++++++++++++++- 1 file changed, 220 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.html b/erpnext/accounts/report/accounts_payable/accounts_payable.html index d3020b22a40..46b40017034 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.html +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.html @@ -1 +1,220 @@ -{% include "accounts/report/accounts_receivable/accounts_receivable.html" %} + + +
+ +
+ + +
+
+ {%= __(report.report_name) %} +
+
+ + +
+
+
+ {%= __("Supplier") %}: + {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
+ +
+
+ {%= __("Report Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+
+ + +
+
+ + + + + + {% if(filters.show_remarks) { %} + + {% } %} + + + + + + + + + {% for(var i=0, l=data.length; i + + + + + {% if(filters.show_remarks) { %} + + {% } %} + + + + + + {% } %} + +
{%= __("Date") %}{%= __("Reference") %}{%= __("Remarks") %}{%= __("Age (Days)") %}{%= __("Invoiced Amount") %}{%= __("Outstanding Amount") %}
{%= frappe.datetime.str_to_user(data[i]["posting_date"]) %} + {% if(i == data.length - 1) { %} + {%= __("Total") %} + {% } else { %} + {%= data[i]["voucher_no"] %} + {% } %} + + {% if(data[i]["remarks"] && data[i]["remarks"] != "No Remarks") { %} + {%= data[i]["remarks"] %} + {% } %} + {%= data[i]["age"] %}{%= format_currency(data[i]["invoiced"], data[i]["currency"]) %}{%= format_currency(data[i]["outstanding"], data[i]["currency"]) %}
+
+ +   + + {% if(filters.show_future_payments) { %} + {% + var balance_row = data.slice(-1).pop(); + var start = report.columns.findIndex(e => e.fieldname == 'age'); + var currency = data[data.length - 1]["currency"]; + + var ranges = [ + report.columns[start].label, + report.columns[start+1].label, + report.columns[start+2].label, + report.columns[start+3].label, + report.columns[start+4].label, + report.columns[start+5].label + ]; + %} + + {% if(balance_row) { %} +
+ + + + + {% for(var i = 0; i < ranges.length; i++) { %} + + {% } %} + + + + + + + + + + + + + + + +
{%= __(ranges[i]) %}{%= __("Total") %}
{%= __("Total Outstanding") %}{%= format_number(balance_row["age"], null, 2) %}{%= format_currency(balance_row["range1"], currency) %}{%= format_currency(balance_row["range2"], currency) %}{%= format_currency(balance_row["range3"], currency) %}{%= format_currency(balance_row["range4"], currency) %}{%= format_currency(balance_row["range5"], currency) %}{%= format_currency(flt(balance_row["outstanding"]), currency) %}
+
+ {% } %} + {% } %} + +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+ +
\ No newline at end of file From 1c6dc80b7082fdbd72a91cd23a627e4bad11dbc2 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 27 Mar 2026 12:57:23 +0530 Subject: [PATCH 16/49] feat: add print format for accounts payable report (cherry picked from commit 2bf9d4179744eb53970410d8f9bc70158c453f62) --- .../accounts_payable_standard/__init__.py | 0 .../accounts_payable_standard.json | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 erpnext/accounts/print_format/accounts_payable_standard/__init__.py create mode 100644 erpnext/accounts/print_format/accounts_payable_standard/accounts_payable_standard.json diff --git a/erpnext/accounts/print_format/accounts_payable_standard/__init__.py b/erpnext/accounts/print_format/accounts_payable_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/accounts_payable_standard/accounts_payable_standard.json b/erpnext/accounts/print_format/accounts_payable_standard/accounts_payable_standard.json new file mode 100644 index 00000000000..ac895ba2b33 --- /dev/null +++ b/erpnext/accounts/print_format/accounts_payable_standard/accounts_payable_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-27 12:52:58.345285", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n
\n\n
\n\n \n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n \n
\n
\n
\n {%= __(\"Supplier\") %}:\n {%= (filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Report Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \n
\n \n \n \n \n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n \n \n \n \n\n \n {% for(var i=0, l=data.length; i\n \n\n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n \n \n \n {% } %}\n \n
{%= __(\"Date\") %}{%= __(\"Reference\") %}{%= __(\"Remarks\") %}{%= __(\"Age (Days)\") %}{%= __(\"Invoiced Amount\") %}{%= __(\"Outstanding Amount\") %}
{%= frappe.datetime.str_to_user(data[i][\"posting_date\"]) %}\n {% if(i == data.length - 1) { %}\n {%= __(\"Total\") %}\n {% } else { %}\n {%= data[i][\"voucher_no\"] %}\n {% } %}\n \n {% if(data[i][\"remarks\"] && data[i][\"remarks\"] != \"No Remarks\") { %}\n {%= data[i][\"remarks\"] %}\n {% } %}\n {%= data[i][\"age\"] %}{%= format_currency(data[i][\"invoiced\"], data[i][\"currency\"]) %}{%= format_currency(data[i][\"outstanding\"], data[i][\"currency\"]) %}
\n
\n\n  \n\n {% if(filters.show_future_payments) { %}\n {%\n var balance_row = data.slice(-1).pop();\n var start = report.columns.findIndex(e => e.fieldname == 'age');\n var currency = data[data.length - 1][\"currency\"];\n\n var ranges = [\n report.columns[start].label,\n report.columns[start+1].label,\n report.columns[start+2].label,\n report.columns[start+3].label,\n report.columns[start+4].label,\n report.columns[start+5].label\n ];\n %}\n\n {% if(balance_row) { %}\n
\n \n \n \n \n {% for(var i = 0; i < ranges.length; i++) { %}\n \n {% } %}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
{%= __(ranges[i]) %}{%= __(\"Total\") %}
{%= __(\"Total Outstanding\") %}{%= format_number(balance_row[\"age\"], null, 2) %}{%= format_currency(balance_row[\"range1\"], currency) %}{%= format_currency(balance_row[\"range2\"], currency) %}{%= format_currency(balance_row[\"range3\"], currency) %}{%= format_currency(balance_row[\"range4\"], currency) %}{%= format_currency(balance_row[\"range5\"], currency) %}{%= format_currency(flt(balance_row[\"outstanding\"]), currency) %}
\n
\n {% } %}\n {% } %}\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-27 16:02:44.654828", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounts Payable Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Accounts Payable", + "show_section_headings": 0, + "standard": "Yes" +} From 16bc28bd70ef91dc6146552968e494c430ccc2e3 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sun, 12 Apr 2026 13:07:41 +0530 Subject: [PATCH 17/49] fix: minor changes in print template (cherry picked from commit 915fcc0166217bdf84344495fab0df4d08c945e1) --- .../accounts_payable/accounts_payable.html | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.html b/erpnext/accounts/report/accounts_payable/accounts_payable.html index 46b40017034..a1b03dad5a8 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.html +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.html @@ -78,6 +78,10 @@ font-weight: 500; } + .report-subtitle { + margin: 10px 0 14px; + } + @media print { @page { size: A4; @@ -92,31 +96,34 @@
-
{%= __(report.report_name) %}
- -
-
-
- {%= __("Supplier") %}: - {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %} + {% if (subtitle && subtitle.trim()) { %} +
+ {{ subtitle }} +
+ {% } else { %} +
+
+
+ {%= __("Supplier") %}: + {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %} +
+
+ +
+
+ {%= __("Report Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+ {% } %} -
-
- {%= __("Report Date") %}: - {%= frappe.datetime.str_to_user(filters.report_date) %} -
-
-
- -
From 059372add58c9782b84cd9666738dbdd7dcec8a3 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Thu, 26 Mar 2026 22:24:56 +0530 Subject: [PATCH 18/49] fix: improve design and refactor ar print template (cherry picked from commit ffc59ebc9c6e9da933a68641b5f94302c59d23a9) --- .../accounts_receivable.html | 480 ++++++++---------- 1 file changed, 203 insertions(+), 277 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index 0109b957c1e..b7626ded0dc 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -1,291 +1,217 @@ - + + +
+ +
+ + +
+
+ {%= __(report.report_name) %} +
+
+ + +
+
+
+ {%= __("Customer") %}: + {%= + (filters.party.length && filters.party.join(", ")) || "All Parties" + %} +
+
+ +
+
+ {%= __("Report Date") %}: + {%= frappe.datetime.str_to_user(filters.report_date) %} +
+
+
+ + +
+
- - - - - - - - + + + + {% if(filters.show_remarks) { %} + + {% } %} + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + {% for(var i=0, l=data.length; i + + + + + + + {% } %} +
{%= __(" ") %}{%= __(range1) %}{%= __(range2) %}{%= __(range3) %}{%= __(range4) %}{%= __(range5) %}{%= __(range6) %}{%= __("Total") %}{%= __("Date") %}{%= __("Reference") %} + {% if(i != data.length - 1 && data[i]["remarks"] && data[i]["remarks"] != "No Remarks") { %} + {%= data[i]["remarks"] %} + {% } %} + {%= __("Age (Days)") %}{%= __("Invoiced Amount") %}{%= __("Outstanding Amount") %}
{%= __("Total Outstanding") %} - {%= format_number(balance_row["age"], null, 2) %} - - {%= format_currency(balance_row["range1"], data[data.length-1]["currency"]) %} - - {%= format_currency(balance_row["range2"], data[data.length-1]["currency"]) %} - - {%= format_currency(balance_row["range3"], data[data.length-1]["currency"]) %} - - {%= format_currency(balance_row["range4"], data[data.length-1]["currency"]) %} - - {%= format_currency(balance_row["range5"], data[data.length-1]["currency"]) %} - - {%= format_currency(flt(balance_row["outstanding"]), data[data.length-1]["currency"]) %} -
{%= __("Future Payments") %} - {%= format_currency(flt(balance_row[("future_amount")]), data[data.length-1]["currency"]) %} -
{%= frappe.datetime.str_to_user(data[i]["posting_date"]) %} + {% if(i == data.length - 1) { %} + {%= __("Total") %} + {% } else { %} + {%= data[i]["voucher_no"] %} + {% } %} + {%= data[i]["age"] %}{%= format_currency(data[i]["invoiced"], data[i]["currency"]) %}{%= format_currency(data[i]["outstanding"], data[i]["currency"]) %}
+
+ +   + + {% if(filters.show_future_payments) { %} + {% + var balance_row = data.slice(-1).pop(); + var start = report.columns.findIndex(e => e.fieldname == 'age'); + var currency = data[data.length - 1]["currency"]; + + var ranges = [ + report.columns[start].label, + report.columns[start+1].label, + report.columns[start+2].label, + report.columns[start+3].label, + report.columns[start+4].label, + report.columns[start+5].label + ]; + %} + + {% if(balance_row) { %} +
+ + + + + {% for(var i = 0; i < ranges.length; i++) { %} + + {% } %} + + + + + + + + + + + + + + + +
{%= __(ranges[i]) %}{%= __("Total") %}
{%= __("Total Outstanding") %}{%= format_number(balance_row["age"], null, 2) %}{%= format_currency(balance_row["range1"], currency) %}{%= format_currency(balance_row["range2"], currency) %}{%= format_currency(balance_row["range3"], currency) %}{%= format_currency(balance_row["range4"], currency) %}{%= format_currency(balance_row["range5"], currency) %}{%= format_currency(flt(balance_row["outstanding"]), currency) %}
+
{% } %} {% } %} - - - - {% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %} - - - {% if(report.report_name === "Accounts Receivable" && filters.show_sales_person) { %} - - - {% } else { %} - - {% } %} - {% if(!filters.show_future_payments) { %} - - {% } %} - - {% if(!filters.show_future_payments) { %} - - - {% } %} - - {% if(filters.show_future_payments) { %} - {% if(report.report_name === "Accounts Receivable") { %} - - {% } %} - - - - {% } %} - {% } else { %} - - - - - - {% } %} - - -
- {% if subtitle %} - {{ subtitle }} -
- {% endif %} -
- - {% for(var i=0, l=data.length; i - {% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %} - {% if(data[i]["party"]) { %} - - - +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

- {% if(report.report_name === "Accounts Receivable" && filters.show_sales_person) { %} - - {% } %} - - {% if(!filters.show_future_payments) { %} - - {% } %} - - - - {% if(!filters.show_future_payments) { %} - - - {% } %} - - - {% if(filters.show_future_payments) { %} - {% if(report.report_name === "Accounts Receivable") { %} - - {% } %} - - - - {% } %} - {% } else { %} - - {% if(!filters.show_future_payments) { %} - - {% } %} - {% if(report.report_name === "Accounts Receivable" && filters.show_sales_person) { %} - - {% } %} - - - - - {% if(!filters.show_future_payments) { %} - - - {% } %} - - - {% if(filters.show_future_payments) { %} - {% if(report.report_name === "Accounts Receivable") { %} - - {% } %} - - - - {% } %} - {% } %} - {% } else { %} - {% if(data[i]["party"]|| " ") { %} - {% if(!data[i]["is_total_row"]) { %} - - {% } else { %} - - {% } %} - - - - - {% } %} - {% } %} - - {% } %} - -
{%= __("Date") %}{%= __("Age (Days)") %}{%= __("Reference") %}{%= __("Sales Person") %}{%= __("Reference") %}{%= (filters.party) ? __("Remarks"): __("Party") %}{%= __("Invoiced Amount") %}{%= __("Paid Amount") %}{%= report.report_name === "Accounts Receivable" ? __('Credit Note') : __('Debit Note') %}{%= __("Outstanding Amount") %}{%= __("Customer LPO No.") %}{%= __("Future Payment Ref") %}{%= __("Future Payment Amount") %}{%= __("Remaining Balance") %}{%= (filters.party) ? __("Remarks"): __("Party") %}{%= __("Total Invoiced Amount") %}{%= __("Total Paid Amount") %}{%= report.report_name === "Accounts Receivable Summary" ? __('Credit Note Amount') : __('Debit Note Amount') %}{%= __("Total Outstanding Amount") %}
{%= frappe.datetime.str_to_user(data[i]["posting_date"]) %}{%= data[i]["age"] %} - {% if(!filters.show_future_payments) { %} - {%= data[i]["voucher_type"] %} -
- {% } %} - {%= data[i]["voucher_no"] %} -
{%= data[i]["sales_person"] %} - {% if(!filters.party?.length) { %} - {%= data[i]["party"] %} - {% if(data[i]["customer_name"] && data[i]["customer_name"] != data[i]["party"]) { %} -
{%= data[i]["customer_name"] %} - {% } else if(data[i]["supplier_name"] != data[i]["party"]) { %} -
{%= data[i]["supplier_name"] %} - {% } %} - {% } %} -
- {% if data[i]["remarks"] %} - {%= __("Remarks") %}: - {%= data[i]["remarks"] %} - {% } %} -
-
- {%= format_currency(data[i]["invoiced"], data[i]["currency"]) %} - {%= format_currency(data[i]["paid"], data[i]["currency"]) %} - {%= format_currency(data[i]["credit_note"], data[i]["currency"]) %} - {%= format_currency(data[i]["outstanding"], data[i]["currency"]) %} - {%= data[i]["po_no"] %}{%= data[i]["future_ref"] %}{%= format_currency(data[i]["future_amount"], data[i]["currency"]) %}{%= format_currency(data[i]["remaining_balance"], data[i]["currency"]) %}{%= __("Total") %} - {%= format_currency(data[i]["invoiced"], data[i]["currency"] ) %} - {%= format_currency(data[i]["paid"], data[i]["currency"]) %}{%= format_currency(data[i]["credit_note"], data[i]["currency"]) %} - {%= format_currency(data[i]["outstanding"], data[i]["currency"]) %} - {%= data[i]["po_no"] %}{%= data[i]["future_ref"] %}{%= format_currency(data[i]["future_amount"], data[i]["currency"]) %}{%= format_currency(data[i]["remaining_balance"], data[i]["currency"]) %} - {% if(!filters.party?.length) { %} - {%= data[i]["party"] %} - {% if(data[i]["customer_name"] && data[i]["customer_name"] != data[i]["party"]) { %} -
{%= data[i]["customer_name"] %} - {% } else if(data[i]["supplier_name"] != data[i]["party"]) { %} -
{%= data[i]["supplier_name"] %} - {% } %} - {% } %} -
{%= __("Remarks") %}: - {%= data[i]["remarks"] %} -
{%= __("Total") %}{%= format_currency(data[i]["invoiced"], data[i]["currency"]) %}{%= format_currency(data[i]["paid"], data[i]["currency"]) %}{%= format_currency(data[i]["credit_note"], data[i]["currency"]) %}{%= format_currency(data[i]["outstanding"], data[i]["currency"]) %}
-

{%= __("Printed on {0}", [frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())]) %}

+
\ No newline at end of file From 4e7f2eeaa027ca3bf14d1dc77586e0b3d3585547 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Thu, 26 Mar 2026 22:25:31 +0530 Subject: [PATCH 19/49] feat: introduce print format for Accounts Receivable report (cherry picked from commit e6a32a9d0207bc83f2244c0c0ab926e7b14ccd12) --- .../accounts_receivable_standard/__init__.py | 0 .../accounts_receivable_standard.json | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 erpnext/accounts/print_format/accounts_receivable_standard/__init__.py create mode 100644 erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json diff --git a/erpnext/accounts/print_format/accounts_receivable_standard/__init__.py b/erpnext/accounts/print_format/accounts_receivable_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json b/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json new file mode 100644 index 00000000000..f37be0fb4c7 --- /dev/null +++ b/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-26 21:59:39.241833", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n
\n\n
\n\n \n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n \n
\n
\n
\n {%= __(\"Customer\") %}:\n {%=\n (filters.party.length && filters.party.join(\", \")) || \"All Parties\"\n %}\n
\n
\n\n
\n
\n {%= __(\"Report Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \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\n\t\t\t\t\t{% if(filters.show_remarks) { %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% } %}\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\n\n\t\t\t\n\t\t\t\t{% for(var i=0, l=data.length; i\n\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{% } %}\n\t\t\t\n\t\t
{%= __(\"Date\") %}{%= __(\"Reference\") %}\n\t\t\t\t\t\t\t{% if(i != data.length - 1 && data[i][\"remarks\"] && data[i][\"remarks\"] != \"No Remarks\") { %}\n\t\t\t\t\t\t\t\t{%= data[i][\"remarks\"] %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t{%= __(\"Age (Days)\") %}{%= __(\"Invoiced Amount\") %}{%= __(\"Outstanding Amount\") %}
{%= frappe.datetime.str_to_user(data[i][\"posting_date\"]) %}\n\t\t\t\t\t\t\t{% if(i == data.length - 1) { %}\n\t\t\t\t\t\t\t\t{%= __(\"Total\") %}\n\t\t\t\t\t\t\t{% } else { %}\n\t\t\t\t\t\t\t\t{%= data[i][\"voucher_no\"] %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t{%= data[i][\"age\"] %}{%= format_currency(data[i][\"invoiced\"], data[i][\"currency\"]) %}{%= format_currency(data[i][\"outstanding\"], data[i][\"currency\"]) %}
\n\t
\n\n\t \n\n\t{% if(filters.show_future_payments) { %}\n\t\t{% \n\t\t\tvar balance_row = data.slice(-1).pop();\n\t\t\tvar start = report.columns.findIndex(e => e.fieldname == 'age');\n\t\t\tvar currency = data[data.length - 1][\"currency\"];\n\n\t\t\tvar ranges = [\n\t\t\t\treport.columns[start].label,\n\t\t\t\treport.columns[start+1].label,\n\t\t\t\treport.columns[start+2].label,\n\t\t\t\treport.columns[start+3].label,\n\t\t\t\treport.columns[start+4].label,\n\t\t\t\treport.columns[start+5].label\n\t\t\t];\n\t\t%}\n\n\t\t{% if(balance_row) { %}\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% for(var i = 0; i < ranges.length; i++) { %}\n\t\t\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\n\t\t\t\t\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\t\n\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
{%= __(ranges[i]) %}{%= __(\"Total\") %}
{%= __(\"Total Outstanding\") %}{%= format_number(balance_row[\"age\"], null, 2) %}{%= format_currency(balance_row[\"range1\"], currency) %}{%= format_currency(balance_row[\"range2\"], currency) %}{%= format_currency(balance_row[\"range3\"], currency) %}{%= format_currency(balance_row[\"range4\"], currency) %}{%= format_currency(balance_row[\"range5\"], currency) %}{%= format_currency(flt(balance_row[\"outstanding\"]), currency) %}
\n\t\t
\n\t\t{% } %}\n\t{% } %}\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-26 21:59:39.241833", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounts Receivable Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "Accounts Receivable", + "show_section_headings": 0, + "standard": "Yes" +} From 09b19f7a2ad6d0d6a925536f687bd921e60bfccb Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 27 Mar 2026 01:02:35 +0530 Subject: [PATCH 20/49] fix: minor bug fixes for ar print template (cherry picked from commit 4228885f1ea1ad8346584c8f45c37b46c5a1392a) --- .../accounts_receivable_standard.json | 4 ++-- .../accounts_receivable.html | 17 +++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json b/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json index f37be0fb4c7..fc68bdad7d0 100644 --- a/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json +++ b/erpnext/accounts/print_format/accounts_receivable_standard/accounts_receivable_standard.json @@ -8,14 +8,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n
\n\n
\n\n \n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n \n
\n
\n
\n {%= __(\"Customer\") %}:\n {%=\n (filters.party.length && filters.party.join(\", \")) || \"All Parties\"\n %}\n
\n
\n\n
\n
\n {%= __(\"Report Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \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\n\t\t\t\t\t{% if(filters.show_remarks) { %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% } %}\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\n\n\t\t\t\n\t\t\t\t{% for(var i=0, l=data.length; i\n\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{% } %}\n\t\t\t\n\t\t
{%= __(\"Date\") %}{%= __(\"Reference\") %}\n\t\t\t\t\t\t\t{% if(i != data.length - 1 && data[i][\"remarks\"] && data[i][\"remarks\"] != \"No Remarks\") { %}\n\t\t\t\t\t\t\t\t{%= data[i][\"remarks\"] %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t{%= __(\"Age (Days)\") %}{%= __(\"Invoiced Amount\") %}{%= __(\"Outstanding Amount\") %}
{%= frappe.datetime.str_to_user(data[i][\"posting_date\"]) %}\n\t\t\t\t\t\t\t{% if(i == data.length - 1) { %}\n\t\t\t\t\t\t\t\t{%= __(\"Total\") %}\n\t\t\t\t\t\t\t{% } else { %}\n\t\t\t\t\t\t\t\t{%= data[i][\"voucher_no\"] %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t{%= data[i][\"age\"] %}{%= format_currency(data[i][\"invoiced\"], data[i][\"currency\"]) %}{%= format_currency(data[i][\"outstanding\"], data[i][\"currency\"]) %}
\n\t
\n\n\t \n\n\t{% if(filters.show_future_payments) { %}\n\t\t{% \n\t\t\tvar balance_row = data.slice(-1).pop();\n\t\t\tvar start = report.columns.findIndex(e => e.fieldname == 'age');\n\t\t\tvar currency = data[data.length - 1][\"currency\"];\n\n\t\t\tvar ranges = [\n\t\t\t\treport.columns[start].label,\n\t\t\t\treport.columns[start+1].label,\n\t\t\t\treport.columns[start+2].label,\n\t\t\t\treport.columns[start+3].label,\n\t\t\t\treport.columns[start+4].label,\n\t\t\t\treport.columns[start+5].label\n\t\t\t];\n\t\t%}\n\n\t\t{% if(balance_row) { %}\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% for(var i = 0; i < ranges.length; i++) { %}\n\t\t\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\n\t\t\t\t\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\t\n\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
{%= __(ranges[i]) %}{%= __(\"Total\") %}
{%= __(\"Total Outstanding\") %}{%= format_number(balance_row[\"age\"], null, 2) %}{%= format_currency(balance_row[\"range1\"], currency) %}{%= format_currency(balance_row[\"range2\"], currency) %}{%= format_currency(balance_row[\"range3\"], currency) %}{%= format_currency(balance_row[\"range4\"], currency) %}{%= format_currency(balance_row[\"range5\"], currency) %}{%= format_currency(flt(balance_row[\"outstanding\"]), currency) %}
\n\t\t
\n\t\t{% } %}\n\t{% } %}\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "html": "\n\n
\n\n
\n\n \n
\n
\n {%= __(report.report_name) %}\n
\n
\n\n \n
\n
\n
\n {%= __(\"Customer\") %}:\n {%= (filters.party.length && filters.party.join(\", \")) || __(\"All Parties\") %}\n
\n
\n\n
\n
\n {%= __(\"Report Date\") %}:\n {%= frappe.datetime.str_to_user(filters.report_date) %}\n
\n
\n
\n\n \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\n\t\t\t\t\t{% if(filters.show_remarks) { %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% } %}\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\n\n\t\t\t\n\t\t\t\t{% for(var i=0, l=data.length; i\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% if(filters.show_remarks) { %}\n\t\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{% } %}\n\t\t\t\n\t\t
{%= __(\"Date\") %}{%= __(\"Reference\") %}{%= __(\"Remarks\") %}{%= __(\"Age (Days)\") %}{%= __(\"Invoiced Amount\") %}{%= __(\"Outstanding Amount\") %}
{%= frappe.datetime.str_to_user(data[i][\"posting_date\"]) %}\n\t\t\t\t\t\t\t{% if(i == data.length - 1) { %}\n\t\t\t\t\t\t\t\t{%= __(\"Total\") %}\n\t\t\t\t\t\t\t{% } else { %}\n\t\t\t\t\t\t\t\t{%= data[i][\"voucher_no\"] %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if(data[i][\"remarks\"] && data[i][\"remarks\"] != \"No Remarks\") { %}\n\t\t\t\t\t\t\t\t\t{%= data[i][\"remarks\"] %}\n\t\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\t{%= data[i][\"age\"] %}{%= format_currency(data[i][\"invoiced\"], data[i][\"currency\"]) %}{%= format_currency(data[i][\"outstanding\"], data[i][\"currency\"]) %}
\n\t
\n\n\t \n\n\t{% if(filters.show_future_payments) { %}\n\t\t{%\n\t\t\tvar balance_row = data.slice(-1).pop();\n\t\t\tvar start = report.columns.findIndex(e => e.fieldname == 'age');\n\t\t\tvar currency = data[data.length - 1][\"currency\"];\n\n\t\t\tvar ranges = [\n\t\t\t\treport.columns[start].label,\n\t\t\t\treport.columns[start+1].label,\n\t\t\t\treport.columns[start+2].label,\n\t\t\t\treport.columns[start+3].label,\n\t\t\t\treport.columns[start+4].label,\n\t\t\t\treport.columns[start+5].label\n\t\t\t];\n\t\t%}\n\n\t\t{% if(balance_row) { %}\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% for(var i = 0; i < ranges.length; i++) { %}\n\t\t\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\n\t\t\t\t\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\t\n\t\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\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
{%= __(ranges[i]) %}{%= __(\"Total\") %}
{%= __(\"Total Outstanding\") %}{%= format_number(balance_row[\"age\"], null, 2) %}{%= format_currency(balance_row[\"range1\"], currency) %}{%= format_currency(balance_row[\"range2\"], currency) %}{%= format_currency(balance_row[\"range3\"], currency) %}{%= format_currency(balance_row[\"range4\"], currency) %}{%= format_currency(balance_row[\"range5\"], currency) %}{%= format_currency(flt(balance_row[\"outstanding\"]), currency) %}
\n\t\t
\n\t\t{% } %}\n\t{% } %}\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-26 21:59:39.241833", + "modified": "2026-03-27 01:06:20.758336", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Receivable Standard", diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index b7626ded0dc..6000ce73120 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -105,9 +105,7 @@
{%= __("Customer") %}: - {%= - (filters.party.length && filters.party.join(", ")) || "All Parties" - %} + {%= (filters.party.length && filters.party.join(", ")) || __("All Parties") %}
@@ -128,11 +126,7 @@
{%= __("Reference") %} - {% if(i != data.length - 1 && data[i]["remarks"] && data[i]["remarks"] != "No Remarks") { %} - {%= data[i]["remarks"] %} - {% } %} - {%= __("Remarks") %}{%= __("Age (Days)") %} + {% if(data[i]["remarks"] && data[i]["remarks"] != "No Remarks") { %} + {%= data[i]["remarks"] %} + {% } %} + {%= data[i]["age"] %} {%= format_currency(data[i]["invoiced"], data[i]["currency"]) %} {%= format_currency(data[i]["outstanding"], data[i]["currency"]) %}
From 04893ae0e3e9c5fe791dad1a03a4390ddb36d016 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 24 Mar 2026 13:16:15 +0530 Subject: [PATCH 22/49] refactor: clean and standardize print template for general ledger report (cherry picked from commit 3ba36212b01b516b23094d3e267aa8397be181dd) --- .../report/general_ledger/general_ledger.html | 333 ++++++++++-------- 1 file changed, 194 insertions(+), 139 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index a3fb35ed576..4d744c4da55 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -1,51 +1,84 @@ - -
-
-
-
- - {%= __("STATEMENT OF ACCOUNTS") %}
- {% if (filters.party_name) { %} -
{%= filters.party_name %} - {% } else if (filters.party && filters.party.length) { %} -
{%= filters.party %} - {% } else if (filters.account) { %} -
{%= filters.account %} - {% } else { %} -
{%= __("All Parties ") %} - {% } %} -
-
-
- - {%= __("{0} to {1}", [frappe.datetime.str_to_user(filters.from_date), frappe.datetime.str_to_user(filters.to_date)]) %}

-
-
-
-
- {% if subtitle %} - {{ subtitle }} -
- {% endif %} -
-
- - - - - {% if(filters.show_remarks) { %} - - {% } %} - - - - - - + +
+ +
+ + +
+ {%= __("STATEMENT OF ACCOUNTS") %} +
+ + +
+ {% if (filters.party_name) { %} + {%= filters.party_name %} + {% } else if (filters.party && filters.party.length) { %} + {%= filters.party %} + {% } else if (filters.account) { %} + {%= filters.account %} + {% } else { %} + {%= __("All Parties") %} + {% } %} +
+ + +
+ {%= __("{0} to {1}", [ + frappe.datetime.str_to_user(filters.from_date), + frappe.datetime.str_to_user(filters.to_date) + ]) %} +
+ +
+ + +
+ {% if subtitle %} + {{ subtitle }} + {% endif %} + +
+ + +
{%= __("Date").toLocaleUpperCase() %}{%= __("Particulars").toLocaleUpperCase() %}{%= __("Remarks").toLocaleUpperCase() %}{%= __("Debit").toLocaleUpperCase() %}{%= __("Credit").toLocaleUpperCase() %}{%= __("Balance").toLocaleUpperCase() %}
+ + + + + + {% if(filters.show_remarks) { %} + + {% } %} + + + + + + + + {% for(var i=0, l=data.length; i - {% if(data[i].posting_date) { %} - - - {% if(filters.show_remarks) { %} - + {% var row = data[i]; %} + + + + + + + - - {% } else { %} - - - {% if(filters.show_remarks) { %} {% } %} - - + + + {% if(filters.show_remarks) { %} + {% } %} - {% if(i == l-1) { %} - - {% } else { %} - + + + + + + + + + + - {% endfor%} - -
{%= __("Date").toLocaleUpperCase() %}{%= __("Particulars").toLocaleUpperCase() %}{%= __("Remarks").toLocaleUpperCase() %}{%= __("Debit").toLocaleUpperCase() %}{%= __("Credit").toLocaleUpperCase() %}{%= __("Balance").toLocaleUpperCase() %}
- {%= frappe.datetime.str_to_user(data[i].posting_date) %} - - {%= data[i].voucher_type %} {%= data[i].voucher_no %} - {% if(!(filters.party || filters.account)) { %} - {%= data[i].party || data[i].account %} - {% } %}
- {% if(data[i].bill_no) { %} - {%= __("Supplier Invoice No") %}: {%= data[i].bill_no %} - {% } %} -
- {% if(data[i].remarks != "No Remarks" && data[i].remarks != "") { %} - {%= __("Remarks") %}: {%= data[i].remarks %}
- {% } %} -
+ {% if(row.posting_date) { %} + {%= frappe.datetime.str_to_user(row.posting_date) %} + {% } else if(i == 0) { %} + {%= frappe.datetime.str_to_user(filters.from_date) %} {% } %} - - {% if data[i].debit != 0 %} - {%= format_currency(data[i].debit, filters.presentation_currency) %} + + {% if(row.posting_date) { %} + {%= row.voucher_type %} {%= row.voucher_no %} + {% if(!(filters.party || filters.account)) { %} + {%= row.party || row.account %} + {% } %}
+ + {% if(row.bill_no) { %} + {%= __("Supplier Invoice No") %}: {%= row.bill_no %} {% } %} -
- {% if data[i].credit != 0 %} - {%= format_currency(data[i].credit, filters.presentation_currency) %} - {% } %} - - {% if(i == 0) { %} - {%= frappe.datetime.str_to_user(filters.from_date) %} - {% } %} - + + {% } else { %} {% if(i == l-2) { %} {%= __("Total") %} + {% } else if(i == l-1) { %} + {%= __("Closing [Opening + Total] ") %} {% } else { %} - {% if(i == l-1) { %} - {%= __("Closing [Opening + Total] ") %} - {% } else { %} - {%= frappe.format(data[i].account, {fieldtype: "Link"}) || " " %} - {% } %} - {% } %} - - {% if(i != 0){ %} - {% if(i != l-1){ %} - {%= data[i].account && format_currency(data[i].debit, filters.presentation_currency) %} - {% } %} + {%= frappe.format(row.account, {fieldtype: "Link"}) || " " %} {% } %} - - {% if(i != 0){ %} - {% if(i != l-1){ %} - {%= data[i].account && format_currency(data[i].credit, filters.presentation_currency) %} - {% } %} + {% } %} + + {% if(row.posting_date && row.remarks != "No Remarks" && row.remarks != "") { %} + {%= row.remarks %} {% } %} - {%= format_currency(data[i].balance, filters.presentation_currency) %} - {% if(data[i].balance < 0){ %}Cr{% } %} - {% if(data[i].balance > 0){ %}Dr{% } %} - - {% if(i != l-2) { %} - {%= format_currency(data[i].balance, filters.presentation_currency) %} - {% } %} - + {% if(row.posting_date) { %} + {% if(row.debit != 0) { %} + {%= format_currency(row.debit, filters.presentation_currency) %} + {% } %} + {% } else if(i != 0 && i != l-1) { %} + {%= row.account && format_currency(row.debit, filters.presentation_currency) %} {% } %} + + {% if(row.posting_date) { %} + {% if(row.credit != 0) { %} + {%= format_currency(row.credit, filters.presentation_currency) %} + {% } %} + {% } else if(i != 0 && i != l-1) { %} + {%= row.account && format_currency(row.credit, filters.presentation_currency) %} + {% } %} + + {% if(i == l-1) { %} + {%= format_currency(row.balance, filters.presentation_currency) %} + {% if(row.balance < 0){ %}Cr{% } %} + {% if(row.balance > 0){ %}Dr{% } %} + {% } else if(i != l-2) { %} + {%= format_currency(row.balance, filters.presentation_currency) %} + {% } %} +
-

{%= __("Printed on {0}", [frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())]) %}

-
+ {% endfor %} + +
+ +

+ {%= __("Printed on {0}", [ + frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string()) + ]) %} +

+
\ No newline at end of file From 040b31d3a702396e0ee6ba0563333e3e352f6637 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 24 Mar 2026 15:55:45 +0530 Subject: [PATCH 23/49] fix: improve filter details render logic to avoid showing duplicate information (cherry picked from commit 9660debe28e0c1fccefe9073b135459cd158268f) --- .../general_ledger_standard/__init__.py | 0 .../general_ledger_standard.json | 33 ++ .../report/general_ledger/general_ledger.html | 368 ++++++++++-------- 3 files changed, 228 insertions(+), 173 deletions(-) create mode 100644 erpnext/accounts/print_format/general_ledger_standard/__init__.py create mode 100644 erpnext/accounts/print_format/general_ledger_standard/general_ledger_standard.json diff --git a/erpnext/accounts/print_format/general_ledger_standard/__init__.py b/erpnext/accounts/print_format/general_ledger_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/general_ledger_standard/general_ledger_standard.json b/erpnext/accounts/print_format/general_ledger_standard/general_ledger_standard.json new file mode 100644 index 00000000000..da4fe92a006 --- /dev/null +++ b/erpnext/accounts/print_format/general_ledger_standard/general_ledger_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-03-25 00:31:49.971580", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(\"STATEMENT OF ACCOUNTS\") %}\n
\n
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Customer\") %}:\n\t\t\t\t\t{%= \n\t\t\t\t\t\t(filters.party.length && filters.party.join(\", \")) || filters.party_name || \"All Parties\"\n\t\t\t\t\t%}\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Statement Period\") %}:\n\t\t\t\t\t{%= __(\"{0} to {1}\", [\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.from_date),\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.to_date)\n\t\t\t\t\t]) %}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n {% } %}\n\n
\n \n \n \n \n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n \n \n \n \n\n \n {% for(var i=0, l=data.length; i\n\n \n\n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n\n \n\n \n\n \n {% endfor %}\n \n
{%= __(\"Date\") %}{%= __(\"Voucher Details\") %}{%= __(\"Remarks\") %}{%= __(\"Debit\") %}{%= __(\"Credit\") %}{%= __(\"Balance\") %}
\n {% if(row.posting_date) { %}\n {%= frappe.datetime.str_to_user(row.posting_date) %}\n {% } else if(i == 0) { %}\n {%= frappe.datetime.str_to_user(filters.from_date) %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {%= row.voucher_type %} {%= row.voucher_no %}\n\n {% if(!(filters.party || filters.account)) { %}\n
\n {%= row.party || row.account %}\n
\n {% } %}\n\n {% if(row.bill_no) { %}\n
\n {%= __(\"Supplier Invoice No\") %}: {%= row.bill_no %}\n
\n {% } %}\n\n {% } else { %}\n {% if(i == l-2) { %}\n {%= __(\"Total\") %}\n {% } else if(i == l-1) { %}\n {%= __(\"Closing [Opening + Total] \") %}\n {% } else { %}\n {%= frappe.format(row.account, {fieldtype: \"Link\"}) || \" \" %}\n {% } %}\n {% } %}\n
\n {% if(row.posting_date && row.remarks && row.remarks != \"No Remarks\") { %}\n {%= row.remarks %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {% if(row.debit != 0) { %}\n {%= format_currency(row.debit, filters.presentation_currency) %}\n {% } %}\n {% } else if(i != 0 && i != l-1) { %}\n {%= row.account && format_currency(row.debit, filters.presentation_currency) %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {% if(row.credit != 0) { %}\n {%= format_currency(row.credit, filters.presentation_currency) %}\n {% } %}\n {% } else if(i != 0 && i != l-1) { %}\n {%= row.account && format_currency(row.credit, filters.presentation_currency) %}\n {% } %}\n \n {% if(i == l-1) { %}\n {%= format_currency(row.balance, filters.presentation_currency) %}\n {% if(row.balance < 0){ %} Cr{% } %}\n {% if(row.balance > 0){ %} Dr{% } %}\n {% } else { %}\n {%= format_currency(row.balance, filters.presentation_currency) %}\n {% } %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-03-26 12:02:00.022093", + "modified_by": "Administrator", + "module": "Accounts", + "name": "General Ledger Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "chrome", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "Report", + "print_format_type": "JS", + "raw_printing": 0, + "report": "General Ledger", + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 4d744c4da55..cb3fdddac73 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -1,68 +1,95 @@ \n\n
\n\n
\n\n
\n
\n {%= __(\"STATEMENT OF ACCOUNTS\") %}\n
\n
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Customer\") %}:\n\t\t\t\t\t{%= \n\t\t\t\t\t\t(filters.party.length && filters.party.join(\", \")) || filters.party_name || \"All Parties\"\n\t\t\t\t\t%}\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Statement Period\") %}:\n\t\t\t\t\t{%= __(\"{0} to {1}\", [\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.from_date),\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.to_date)\n\t\t\t\t\t]) %}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n {% } %}\n\n
\n \n \n \n \n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n \n \n \n \n\n \n {% for(var i=0, l=data.length; i\n\n \n\n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n\n \n\n \n\n \n {% endfor %}\n \n
{%= __(\"Date\") %}{%= __(\"Voucher Details\") %}{%= __(\"Remarks\") %}{%= __(\"Debit\") %}{%= __(\"Credit\") %}{%= __(\"Balance\") %}
\n {% if(row.posting_date) { %}\n {%= frappe.datetime.str_to_user(row.posting_date) %}\n {% } else if(i == 0) { %}\n {%= frappe.datetime.str_to_user(filters.from_date) %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {%= row.voucher_type %} {%= row.voucher_no %}\n\n {% if(!(filters.party || filters.account)) { %}\n
\n {%= row.party || row.account %}\n
\n {% } %}\n\n {% if(row.bill_no) { %}\n
\n {%= __(\"Supplier Invoice No\") %}: {%= row.bill_no %}\n
\n {% } %}\n\n {% } else { %}\n {% if(i == l-2) { %}\n {%= __(\"Total\") %}\n {% } else if(i == l-1) { %}\n {%= __(\"Closing [Opening + Total] \") %}\n {% } else { %}\n {%= frappe.format(row.account, {fieldtype: \"Link\"}) || \" \" %}\n {% } %}\n {% } %}\n
\n {% if(row.posting_date && row.remarks && row.remarks != \"No Remarks\") { %}\n {%= row.remarks %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {% if(row.debit != 0) { %}\n {%= format_currency(row.debit, filters.presentation_currency) %}\n {% } %}\n {% } else if(i != 0 && i != l-1) { %}\n {%= row.account && format_currency(row.debit, filters.presentation_currency) %}\n {% } %}\n \n {% if(row.posting_date) { %}\n {% if(row.credit != 0) { %}\n {%= format_currency(row.credit, filters.presentation_currency) %}\n {% } %}\n {% } else if(i != 0 && i != l-1) { %}\n {%= row.account && format_currency(row.credit, filters.presentation_currency) %}\n {% } %}\n \n {% if(i == l-1) { %}\n {%= format_currency(row.balance, filters.presentation_currency) %}\n {% if(row.balance < 0){ %} Cr{% } %}\n {% if(row.balance > 0){ %} Dr{% } %}\n {% } else { %}\n {%= format_currency(row.balance, filters.presentation_currency) %}\n {% } %}\n
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", + "html": "\n\n
\n\n
\n\n
\n
\n {%= __(\"Statement Of Accounts\") %}\n
\n
\n\n {% if (subtitle && subtitle.trim()) { %}\n
\n {{ subtitle }}\n
\n {% } else { %}\n
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Customer\") %}:\n\t\t\t\t\t{%=\n\t\t\t\t\t\t(filters.party.length && filters.party.join(\", \")) || filters.party_name || \"All Parties\"\n\t\t\t\t\t%}\n\t\t\t\t
\n\t\t\t
\n\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{%= __(\"Statement Period\") %}:\n\t\t\t\t\t{%= __(\"{0} to {1}\", [\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.from_date),\n\t\t\t\t\t\tfrappe.datetime.str_to_user(filters.to_date)\n\t\t\t\t\t]) %}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n {% } %}\n\n
\n \n \n \n \n \n\n {% if(filters.show_remarks) { %}\n \n {% } %}\n\n \n \n \n \n \n\n \n\t\t\t\t{% for(var i=0, l=data.length; i\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% if(filters.show_remarks) { %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t{% } %}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t{% } %}\n\t\t\t\n
{%= __(\"Date\") %}{%= __(\"Voucher Details\") %}{%= __(\"Remarks\") %}{%= __(\"Debit\") %}{%= __(\"Credit\") %}{%= __(\"Balance\") %}
\n\t\t\t\t\t\t\t{% if(is_entry) { %}\n\t\t\t\t\t\t\t\t{%= frappe.datetime.str_to_user(row.posting_date) %}\n\t\t\t\t\t\t\t{% } else if(i == 0) { %}\n\t\t\t\t\t\t\t\t{%= frappe.datetime.str_to_user(filters.from_date) %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{% if(is_entry) { %}\n\n\t\t\t\t\t\t\t\t{%= row.voucher_type %} {%= row.voucher_no %}\n\n\t\t\t\t\t\t\t\t{% if(!(filters.party || filters.account)) { %}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{%= row.party || row.account %}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{% } %}\n\n\t\t\t\t\t\t\t\t{% if(row.bill_no) { %}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t{%= __(\"Supplier Invoice No\") %}: {%= row.bill_no %}\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t{% } %}\n\n\t\t\t\t\t\t\t{% } else { %}\n\n\t\t\t\t\t\t\t\t{% if(is_second_last) { %}\n\t\t\t\t\t\t\t\t\t{%= __(\"Total\") %}\n\t\t\t\t\t\t\t\t{% } else if(is_last) { %}\n\t\t\t\t\t\t\t\t\t{%= __(\"Closing [Opening + Total] \") %}\n\t\t\t\t\t\t\t\t{% } else { %}\n\t\t\t\t\t\t\t\t\t{%= frappe.format(row.account, {fieldtype: \"Link\"}) || \" \" %}\n\t\t\t\t\t\t\t\t{% } %}\n\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{% if(is_entry && row.remarks && row.remarks != \"No Remarks\") { %}\n\t\t\t\t\t\t\t\t{%= row.remarks %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{% if(is_entry) { %}\n\t\t\t\t\t\t\t\t{% if(row.debit != 0) { %}\n\t\t\t\t\t\t\t\t\t{%= format_currency(row.debit, filters.presentation_currency) %}\n\t\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\t{% } else if(i != 0 && !is_last) { %}\n\t\t\t\t\t\t\t\t{%= row.account && format_currency(row.debit, filters.presentation_currency) %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{% if(is_entry) { %}\n\t\t\t\t\t\t\t\t{% if(row.credit != 0) { %}\n\t\t\t\t\t\t\t\t\t{%= format_currency(row.credit, filters.presentation_currency) %}\n\t\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\t{% } else if(i != 0 && !is_last) { %}\n\t\t\t\t\t\t\t\t{%= row.account && format_currency(row.credit, filters.presentation_currency) %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{% if(is_last) { %}\n\t\t\t\t\t\t\t\t{%= format_currency(row.balance, filters.presentation_currency) %}\n\t\t\t\t\t\t\t\t{% if(row.balance < 0) { %} Cr{% } %}\n\t\t\t\t\t\t\t\t{% if(row.balance > 0) { %} Dr{% } %}\n\t\t\t\t\t\t\t{% } else { %}\n\t\t\t\t\t\t\t\t{%= format_currency(row.balance, filters.presentation_currency) %}\n\t\t\t\t\t\t\t{% } %}\n\t\t\t\t\t\t
\n
\n\n

\n {%= __(\"Printed on {0}\", [\n frappe.datetime.str_to_user(frappe.datetime.get_datetime_as_string())\n ]) %}\n

\n\n
", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-26 12:02:00.022093", + "modified": "2026-03-26 17:07:36.264246", "modified_by": "Administrator", "module": "Accounts", "name": "General Ledger Standard", diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index cb3fdddac73..c620986bc2c 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -11,7 +11,7 @@ } .title-letter-spacing { - font-size: 14px; + font-size: 15px; font-weight: 600; color: #171717; } @@ -117,7 +117,7 @@
- {%= __("STATEMENT OF ACCOUNTS") %} + {%= __("Statement Of Accounts") %}
@@ -156,7 +156,7 @@ {%= __("Voucher Details") %} {% if(filters.show_remarks) { %} - {%= __("Remarks") %} + {%= __("Remarks") %} {% } %} {%= __("Debit") %} @@ -166,86 +166,93 @@ - {% for(var i=0, l=data.length; i + {% for(var i=0, l=data.length; i - {% if(row.posting_date) { %} - {%= frappe.datetime.str_to_user(row.posting_date) %} - {% } else if(i == 0) { %} - {%= frappe.datetime.str_to_user(filters.from_date) %} - {% } %} - + - - {% if(row.posting_date) { %} - {%= row.voucher_type %} {%= row.voucher_no %} + + {% if(is_entry) { %} + {%= frappe.datetime.str_to_user(row.posting_date) %} + {% } else if(i == 0) { %} + {%= frappe.datetime.str_to_user(filters.from_date) %} + {% } %} + - {% if(!(filters.party || filters.account)) { %} -
- {%= row.party || row.account %} -
- {% } %} + + {% if(is_entry) { %} - {% if(row.bill_no) { %} -
- {%= __("Supplier Invoice No") %}: {%= row.bill_no %} -
- {% } %} + {%= row.voucher_type %} {%= row.voucher_no %} - {% } else { %} - {% if(i == l-2) { %} - {%= __("Total") %} - {% } else if(i == l-1) { %} - {%= __("Closing [Opening + Total] ") %} - {% } else { %} - {%= frappe.format(row.account, {fieldtype: "Link"}) || " " %} - {% } %} - {% } %} - + {% if(!(filters.party || filters.account)) { %} +
+ {%= row.party || row.account %} +
+ {% } %} - {% if(filters.show_remarks) { %} - - {% if(row.posting_date && row.remarks && row.remarks != "No Remarks") { %} - {%= row.remarks %} - {% } %} - - {% } %} + {% if(row.bill_no) { %} +
+ {%= __("Supplier Invoice No") %}: {%= row.bill_no %} +
+ {% } %} - - {% if(row.posting_date) { %} - {% if(row.debit != 0) { %} - {%= format_currency(row.debit, filters.presentation_currency) %} - {% } %} - {% } else if(i != 0 && i != l-1) { %} - {%= row.account && format_currency(row.debit, filters.presentation_currency) %} - {% } %} - + {% } else { %} - - {% if(row.posting_date) { %} - {% if(row.credit != 0) { %} - {%= format_currency(row.credit, filters.presentation_currency) %} - {% } %} - {% } else if(i != 0 && i != l-1) { %} - {%= row.account && format_currency(row.credit, filters.presentation_currency) %} - {% } %} - + {% if(is_second_last) { %} + {%= __("Total") %} + {% } else if(is_last) { %} + {%= __("Closing [Opening + Total] ") %} + {% } else { %} + {%= frappe.format(row.account, {fieldtype: "Link"}) || " " %} + {% } %} - - {% if(i == l-1) { %} - {%= format_currency(row.balance, filters.presentation_currency) %} - {% if(row.balance < 0){ %} Cr{% } %} - {% if(row.balance > 0){ %} Dr{% } %} - {% } else { %} - {%= format_currency(row.balance, filters.presentation_currency) %} - {% } %} - + {% } %} + - - {% endfor %} - + {% if(filters.show_remarks) { %} + + {% if(is_entry && row.remarks && row.remarks != "No Remarks") { %} + {%= row.remarks %} + {% } %} + + {% } %} + + + {% if(is_entry) { %} + {% if(row.debit != 0) { %} + {%= format_currency(row.debit, filters.presentation_currency) %} + {% } %} + {% } else if(i != 0 && !is_last) { %} + {%= row.account && format_currency(row.debit, filters.presentation_currency) %} + {% } %} + + + + {% if(is_entry) { %} + {% if(row.credit != 0) { %} + {%= format_currency(row.credit, filters.presentation_currency) %} + {% } %} + {% } else if(i != 0 && !is_last) { %} + {%= row.account && format_currency(row.credit, filters.presentation_currency) %} + {% } %} + + + + {% if(is_last) { %} + {%= format_currency(row.balance, filters.presentation_currency) %} + {% if(row.balance < 0) { %} Cr{% } %} + {% if(row.balance > 0) { %} Dr{% } %} + {% } else { %} + {%= format_currency(row.balance, filters.presentation_currency) %} + {% } %} + + + + {% } %} + From caa524f661cd3c240f20c61b7ea8dfa0f0fca6b2 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Sat, 11 Apr 2026 23:06:01 +0530 Subject: [PATCH 25/49] fix: changes to gl print template (cherry picked from commit e8d08df0448ee4eca2070192cc7a9f7ee79fc1be) --- erpnext/accounts/report/general_ledger/general_ledger.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index c620986bc2c..925469e92c8 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -91,6 +91,10 @@ font-weight: 500; } + .report-subtitle { + margin: 10px 0 14px; + } + @media print { @page { size: A4; @@ -122,7 +126,7 @@ {% if (subtitle && subtitle.trim()) { %} -
+
{{ subtitle }}
{% } else { %} From c4994548c36e865cc1d8d2a9d3986bc2b4ff87e9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 15:03:45 +0000 Subject: [PATCH 26/49] fix(stock): add whole number quantity validation in Stock Reconciliation (backport #54922) (#54925) fix(stock): add whole number quantity validation in Stock Reconciliation (#54922) (cherry picked from commit f9dec730422c912c67e9de25647fc2ff4c8d930b) Co-authored-by: Pandiyan P --- .../stock/doctype/stock_reconciliation/stock_reconciliation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index 8d3b574fe50..d61c4086e1d 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -83,6 +83,7 @@ class StockReconciliation(StockController): self.set_total_qty_and_amount() self.validate_putaway_capacity() self.validate_inventory_dimension() + self.validate_uom_is_integer("stock_uom", "qty") if self._action == "submit": self.validate_reserved_stock() From 596c2571f6e56ced85da3ad0577137618943e376 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 15:24:51 +0000 Subject: [PATCH 27/49] fix: add warehouse vaildation for repack entry (backport #54866) (#54901) fix: add warehouse vaildation for repack entry (#54866) (cherry picked from commit bc07b2d3e585e2b86d974dea940676a1255da133) Co-authored-by: Pandiyan P --- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index d8fa53210da..33301f152fe 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -852,7 +852,7 @@ class StockEntry(StockController, SubcontractingInwardController): else: frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx)) - if self.purpose == "Manufacture": + if self.purpose in ["Manufacture", "Repack"]: if d.is_finished_item or d.type or d.is_legacy_scrap_item: d.s_warehouse = None if not d.t_warehouse: From 1c44c60dbdba6cd4a8d5c03fe231e45af0b1acc1 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 13 May 2026 13:16:00 +0530 Subject: [PATCH 28/49] fix: posting date and time (cherry picked from commit fb6c05f186c91b117eb9e783e8df5607dc4f09b3) --- erpnext/stock/serial_batch_bundle.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 4a47144ecf1..8687157699f 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -13,6 +13,7 @@ from erpnext.stock.deprecated_serial_batch import ( DeprecatedBatchNoValuation, DeprecatedSerialNoValuation, ) +from erpnext.stock.utils import get_combine_datetime from erpnext.stock.valuation import round_off_if_near_zero CONSUMED_SERIAL_NO_STOCK_ENTRY_PURPOSES = ( @@ -1069,6 +1070,10 @@ class SerialBatchCreation: self.__dict__.update(item_details) def set_other_details(self): + if not self.get("posting_datetime"): + if self.get("posting_date") and self.get("posting_time"): + self.posting_datetime = get_combine_datetime(self.posting_date, self.posting_time) + if not self.get("posting_datetime"): self.posting_datetime = now() self.__dict__["posting_datetime"] = self.posting_datetime From f4e66914c6ee9835935b60ee766a1cf936f0b5a2 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 13 May 2026 14:05:55 +0530 Subject: [PATCH 29/49] chore: fixed test case (cherry picked from commit c740f77a6fe7f53c89034f1b2b35c82c67310d96) --- erpnext/stock/serial_batch_bundle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 8687157699f..42e4df2d502 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -13,7 +13,6 @@ from erpnext.stock.deprecated_serial_batch import ( DeprecatedBatchNoValuation, DeprecatedSerialNoValuation, ) -from erpnext.stock.utils import get_combine_datetime from erpnext.stock.valuation import round_off_if_near_zero CONSUMED_SERIAL_NO_STOCK_ENTRY_PURPOSES = ( @@ -1070,6 +1069,7 @@ class SerialBatchCreation: self.__dict__.update(item_details) def set_other_details(self): + from erpnext.stock.utils import get_combine_datetime if not self.get("posting_datetime"): if self.get("posting_date") and self.get("posting_time"): self.posting_datetime = get_combine_datetime(self.posting_date, self.posting_time) From 21ada7799cdfff258856384dddfd604db7eab0a6 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 13 May 2026 18:50:09 +0530 Subject: [PATCH 30/49] chore: fix linter issue (cherry picked from commit 3c993377aaa7fb9cf3349565553515d1d7e0b735) --- erpnext/stock/serial_batch_bundle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 42e4df2d502..633867dcc79 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -1070,6 +1070,7 @@ class SerialBatchCreation: def set_other_details(self): from erpnext.stock.utils import get_combine_datetime + if not self.get("posting_datetime"): if self.get("posting_date") and self.get("posting_time"): self.posting_datetime = get_combine_datetime(self.posting_date, self.posting_time) From 3c571a1691707fcad2fb0da595568ed9a4bfaf46 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 14:47:35 +0530 Subject: [PATCH 31/49] fix: status not changing for dropshipped POs and SOs (backport #54934) (#54937) fix: status not changing for dropshipped POs and SOs (#54934) * fix: status not changing for dropshipped POs and SOs * test: change test case to accomodate new flow (cherry picked from commit 78a79120ea99379aab0b64ed46d281ee58abac5f) Co-authored-by: Mihir Kandoi --- .../doctype/purchase_order/purchase_order.py | 13 ++++++++++--- .../purchase_order_item.json | 3 +-- .../selling/doctype/sales_order/sales_order.py | 18 ++++++------------ .../doctype/sales_order/test_sales_order.py | 7 ++++++- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 5a4d1db2a6c..ebd7c03bb52 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -491,7 +491,6 @@ class PurchaseOrder(BuyingController): self.update_status_updater_if_from_pp() if self.has_drop_ship_item(): - self.update_delivered_qty_in_sales_order() self.set_received_qty_to_zero_for_drop_ship_items() self.update_receiving_percentage() @@ -623,9 +622,17 @@ class PurchaseOrder(BuyingController): ) ) - item.received_qty += d.get("qty_change") + qty_change = item.received_qty + d.get("qty_change") + item.db_set("received_qty", qty_change, update_modified=True) + self.add_comment( + "Label", + _("updated delivered quantity for item {0} to {1}").format( + frappe.bold(item.item_code), frappe.bold(qty_change) + ), + ) self.update_receiving_percentage() - self.save() + self.set_status(update=True) + self.update_delivered_qty_in_sales_order() def is_against_so(self): return any(d.sales_order for d in self.items if d.sales_order) diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json index 7770b3b572d..daeb262ba7c 100644 --- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json +++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -622,7 +622,6 @@ "width": "100px" }, { - "allow_on_submit": 1, "depends_on": "received_qty", "fieldname": "received_qty", "fieldtype": "Float", @@ -952,7 +951,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-05-08 20:40:10.683023", + "modified": "2026-05-14 12:16:16.192936", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Item", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 4b38369d048..74262ab0873 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -684,18 +684,12 @@ class SalesOrder(SellingController): for item in self.items: if item.delivered_by_supplier: - item_delivered_qty = frappe.db.sql( - """select sum(qty) - from `tabPurchase Order Item` poi, `tabPurchase Order` po - where poi.sales_order_item = %s - and poi.item_code = %s - and poi.parent = po.name - and po.docstatus = 1 - and po.status = 'Delivered'""", - (item.name, item.item_code), - ) - - item_delivered_qty = item_delivered_qty[0][0] if item_delivered_qty else 0 + item_delivered_qty = frappe.get_all( + "Purchase Order Item", + {"sales_order_item": item.name, "docstatus": 1}, + [{"SUM": "received_qty", "AS": "received_qty"}], + pluck="received_qty", + )[0] item.db_set("delivered_qty", flt(item_delivered_qty), update_modified=False) delivered_qty += min(item.delivered_qty, item.qty) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index d74f849facd..c7585df93fd 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -1224,9 +1224,14 @@ class TestSalesOrder(ERPNextTestSuite): self.assertEqual(abs(flt(reserved_qty)), 0) # test per_delivered status - update_status("Delivered", po.name) + self.assertEqual(po.status, "To Receive and Bill") + self.assertEqual(so.status, "To Deliver and Bill") + po.update_dropship_received_qty([{"name": po.items[0].name, "qty_change": 2}]) self.assertEqual(flt(frappe.db.get_value("Sales Order", so.name, "per_delivered"), 2), 100.00) po.load_from_db() + so.reload() + self.assertEqual(po.status, "To Bill") + self.assertEqual(so.status, "To Bill") # test after closing so so.db_set("status", "Closed") From b1e356fd97dd4585d153d96a0dea9edfd24a9210 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 15 May 2026 10:26:20 +0530 Subject: [PATCH 32/49] refactor: flag to disable opening balance calculation (cherry picked from commit 28a2230d0221088ea424b71e2a783c622fbfc405) --- .../report/general_ledger/general_ledger.js | 6 ++++++ .../report/general_ledger/general_ledger.py | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index 1f66b2768a6..7ebaf84d9d2 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -177,10 +177,16 @@ frappe.query_reports["General Ledger"] = { fieldtype: "Check", default: 1, }, + { + fieldname: "disable_opening_balance_calculation", + label: __("Disable Opening Balance Calculation"), + fieldtype: "Check", + }, { fieldname: "show_opening_entries", label: __("Show Opening Entries"), fieldtype: "Check", + depends_on: "eval: !doc.disable_opening_balance_calculation", }, { fieldname: "include_default_book_entries", diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index ecbee216775..837b5ef9041 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -283,7 +283,15 @@ def get_conditions(filters): if filters.get("party"): conditions.append("party in %(party)s") - if not ( + if filters.get("disable_opening_balance_calculation"): + if not ignore_is_opening: + conditions.append("(posting_date >=%(from_date)s or is_opening = 'Yes')") + else: + conditions.append("posting_date >=%(from_date)s") + + # opening balance calculation is done only if filtered on account/party + # so from_date filter is not applied + elif not ( filters.get("account") or filters.get("party") or filters.get("categorize_by") in ["Categorize by Account", "Categorize by Party"] @@ -553,7 +561,11 @@ def get_accountwise_gle(filters, accounting_dimensions, gl_entries, gle_map): gle.remarks = _(gle.remarks) gle.party_type = _(gle.party_type) - if gle.posting_date < from_date or (cstr(gle.is_opening) == "Yes" and not show_opening_entries): + if gle.posting_date < from_date or ( + cstr(gle.is_opening) == "Yes" + and not show_opening_entries + and not filters.disable_opening_balance_calculation + ): if not group_by_voucher_consolidated: update_value_in_dict(gle_map[group_by_value].totals, "opening", gle, True) update_value_in_dict(gle_map[group_by_value].totals, "closing", gle, True) From 48b09eb52ebf38e17297707c2bf9ce679fa19e36 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 10:33:33 +0000 Subject: [PATCH 33/49] fix(payment_entry): fix paid/received amount calculation for multi-currency accounts (backport #54963) (#54970) Co-authored-by: diptanilsaha --- .../doctype/payment_entry/payment_entry.js | 104 ++++++++---------- .../doctype/payment_entry/payment_entry.json | 4 +- 2 files changed, 45 insertions(+), 63 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index f1e816a9cbe..cf15139b712 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -710,31 +710,12 @@ frappe.ui.form.on("Payment Entry", { if (!frm.doc.paid_from_account_currency || !frm.doc.company) return; let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; - if (frm.doc.paid_from_account_currency == company_currency) { - frm.set_value("source_exchange_rate", 1); - } else if (frm.doc.paid_from) { - if (["Internal Transfer", "Pay"].includes(frm.doc.payment_type)) { - let company_currency = frappe.get_doc(":Company", frm.doc.company)?.default_currency; - frappe.call({ - method: "erpnext.setup.utils.get_exchange_rate", - args: { - from_currency: frm.doc.paid_from_account_currency, - to_currency: company_currency, - transaction_date: frm.doc.posting_date, - }, - callback: function (r, rt) { - frm.set_value("source_exchange_rate", r.message); - }, - }); - } else { - frm.events.set_current_exchange_rate( - frm, - "source_exchange_rate", - frm.doc.paid_from_account_currency, - company_currency - ); - } - } + frm.events.set_current_exchange_rate( + frm, + "source_exchange_rate", + frm.doc.paid_from_account_currency, + company_currency + ); }, paid_to_account_currency: function (frm) { @@ -766,49 +747,24 @@ frappe.ui.form.on("Payment Entry", { posting_date: function (frm) { frm.events.paid_from_account_currency(frm); + frm.events.paid_to_account_currency(frm); }, source_exchange_rate: function (frm) { - let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; - if (frm.doc.paid_amount) { - frm.set_value("base_paid_amount", flt(frm.doc.paid_amount) * flt(frm.doc.source_exchange_rate)); - // target exchange rate should always be same as source if both account currencies is same - if (frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency) { - frm.set_value("target_exchange_rate", frm.doc.source_exchange_rate); - frm.set_value("base_received_amount", frm.doc.base_paid_amount); - } else if (company_currency == frm.doc.paid_to_account_currency) { - frm.set_value("received_amount", frm.doc.base_paid_amount); - frm.set_value("base_received_amount", frm.doc.base_paid_amount); - } - - // set_unallocated_amount is called by below method, - // no need trigger separately - frm.events.set_total_allocated_amount(frm); - } - - // Make read only if Accounts Settings doesn't allow stale rates - frm.set_df_property("source_exchange_rate", "read_only", erpnext.stale_rate_allowed() ? 0 : 1); - }, - - target_exchange_rate: function (frm) { frm.set_paid_amount_based_on_received_amount = true; let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; - if (frm.doc.received_amount) { - frm.set_value( - "base_received_amount", - flt(frm.doc.received_amount) * flt(frm.doc.target_exchange_rate) - ); + if (frm.doc.base_received_amount && frm.doc.source_exchange_rate) { + frm.set_value("base_paid_amount", frm.doc.base_received_amount); - if ( - !frm.doc.source_exchange_rate && - frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency - ) { - frm.set_value("source_exchange_rate", frm.doc.target_exchange_rate); - frm.set_value("base_paid_amount", frm.doc.base_received_amount); - } else if (company_currency == frm.doc.paid_from_account_currency) { - frm.set_value("paid_amount", frm.doc.base_received_amount); - frm.set_value("base_paid_amount", frm.doc.base_received_amount); + // target exchange rate should always be same as source if both account currencies is same + if (frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency) { + frm.set_value("target_exchange_rate", frm.doc.source_exchange_rate); + } else { + frm.set_value( + "paid_amount", + flt(frm.doc.base_paid_amount) / flt(frm.doc.source_exchange_rate) + ); } // set_unallocated_amount is called by below method, @@ -817,6 +773,32 @@ frappe.ui.form.on("Payment Entry", { } frm.set_paid_amount_based_on_received_amount = false; + // Make read only if Accounts Settings doesn't allow stale rates + frm.set_df_property("source_exchange_rate", "read_only", erpnext.stale_rate_allowed() ? 0 : 1); + }, + + target_exchange_rate: function (frm) { + let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; + + if (frm.doc.base_paid_amount && frm.doc.target_exchange_rate) { + frm.set_value("base_received_amount", frm.doc.base_paid_amount); + if ( + !frm.doc.source_exchange_rate && + frm.doc.paid_from_account_currency == frm.doc.paid_to_account_currency + ) { + frm.set_value("source_exchange_rate", frm.doc.target_exchange_rate); + } else { + frm.set_value( + "received_amount", + flt(frm.doc.base_received_amount) / flt(frm.doc.target_exchange_rate) + ); + } + + // set_unallocated_amount is called by below method, + // no need trigger separately + frm.events.set_total_allocated_amount(frm); + } + // Make read only if Accounts Settings doesn't allow stale rates frm.set_df_property("target_exchange_rate", "read_only", erpnext.stale_rate_allowed() ? 0 : 1); }, diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 5500e1b3e07..6ac5f909bf5 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -322,7 +322,7 @@ "reqd": 1 }, { - "depends_on": "doc.received_amount", + "depends_on": "eval:doc.received_amount;", "fieldname": "base_received_amount", "fieldtype": "Currency", "label": "Received Amount (Company Currency)", @@ -795,7 +795,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-03-09 17:15:30.453920", + "modified": "2026-05-15 13:31:01.166010", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", From 2c78b6c36a6b53fe4386642cd0eebdc553172c43 Mon Sep 17 00:00:00 2001 From: Ejaaz Khan Date: Wed, 29 Apr 2026 21:35:11 +0530 Subject: [PATCH 34/49] refactor: remove dead print format (cherry picked from commit c933c2bd533f64619d5880a9474dce18cb3ccdec) --- .../sales_invoice_print/__init__.py | 0 .../sales_invoice_print.html | 161 ------------------ .../sales_invoice_print.json | 32 ---- 3 files changed, 193 deletions(-) delete mode 100644 erpnext/accounts/print_format/sales_invoice_print/__init__.py delete mode 100644 erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html delete mode 100644 erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.json diff --git a/erpnext/accounts/print_format/sales_invoice_print/__init__.py b/erpnext/accounts/print_format/sales_invoice_print/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html b/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html deleted file mode 100644 index 2204e3559b1..00000000000 --- a/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html +++ /dev/null @@ -1,161 +0,0 @@ -{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%} - {% if letter_head and not no_letterhead %} -
{{ letter_head }}
- {% endif %} - {% if print_heading_template %} - {{ frappe.render_template(print_heading_template, {"doc":doc}) }} - {% else %} - {% endif %} - {%- if doc.meta.is_submittable and doc.docstatus==2-%} -
-

{{ _("CANCELLED") }}

-
- {%- endif -%} -{%- endmacro -%} -{% for page in layout %} -
-
- {{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }} -
- - - {% if print_settings.repeat_header_footer %} - - {% endif %} - -
-
-
{{ doc.customer }}
-
- {{ doc.address_display }} -
-
- {{ _("Contact: ")+doc.contact_display if doc.contact_display else '' }} -
-
- {{ _("Mobile: ")+doc.contact_mobile if doc.contact_mobile else '' }} -
-
-
-
-
-
-
{{ doc.name }}
-
-
-
-
{{ frappe.utils.format_date(doc.posting_date) }}
-
-
-
-
{{ frappe.utils.format_date(doc.due_date) }}
-
-
-
- -
- - - - - - - - - - - - - - - - - - {% for item in doc.items %} - - - - - - - - {% endfor %} -
{{ _("Sr") }}{{ _("Details") }}{{ _("Qty") }}{{ _("Rate") }}{{ _("Amount") }}
{{ loop.index }} - {{ item.item_code }}: {{ item.item_name }} - {% if (item.description != item.item_name) %} -
{{ item.description }} - {% endif %} -
- {{ item.get_formatted("qty", 0) }} - {{ item.get_formatted("uom", 0) }} - {{ item.get_formatted("net_rate", doc) }}{{ item.get_formatted("net_amount", doc) }}
- -
- -
-
- - {{ doc.in_words }} -
-
- - {{ doc.status }} -
-
-
-
-
{{ _("Sub Total") }}
-
{{ doc.get_formatted("net_total", doc) }}
-
-
- {% for d in doc.taxes %} - {% if d.tax_amount %} -
-
{{ _(d.description) }}
-
{{ d.get_formatted("tax_amount") }}
-
- {% endif %} - {% endfor %} -
-
-
{{ _("Total") }}
-
{{ doc.get_formatted("grand_total", doc) }}
-
-
- -
-
- - -
-
-
-
-
{{ doc.terms if doc.terms else '' }}
-
-
-
-
-{% endfor %} diff --git a/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.json b/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.json deleted file mode 100644 index d4acf5fb36e..00000000000 --- a/erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "absolute_value": 0, - "align_labels_right": 0, - "creation": "2025-01-22 16:23:51.012200", - "css": "", - "custom_format": 0, - "default_print_language": "en", - "disabled": 0, - "doc_type": "Sales Invoice", - "docstatus": 0, - "doctype": "Print Format", - "font": "", - "font_size": 14, - "idx": 0, - "line_breaks": 0, - "margin_bottom": 0.0, - "margin_left": 0.0, - "margin_right": 0.0, - "margin_top": 0.0, - "modified": "2025-01-22 16:23:51.012200", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Sales Invoice Print", - "owner": "Administrator", - "page_number": "Hide", - "print_format_builder": 0, - "print_format_builder_beta": 0, - "print_format_type": "Jinja", - "raw_printing": 0, - "show_section_headings": 0, - "standard": "Yes" -} \ No newline at end of file From 5e5b5cfa0cb9f11f33a959c0a334240133fed50d Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 16 May 2026 11:52:23 +0000 Subject: [PATCH 35/49] fix(stock): ignore fetching warehouse account for asset items (backport #54403) (#54961) * fix(stock): ignore fetching warehouse account for asset items (cherry picked from commit 6fe08428c13ee7839d640f347851cb8668d50607) * test(stock): add test to create pr for asset item without checking the stock account (cherry picked from commit 8cf4402823525e9053fe99f1ab8d50b1890871cb) --------- Co-authored-by: Sudharsanan11 --- erpnext/assets/doctype/asset/test_asset.py | 4 +- erpnext/controllers/stock_controller.py | 11 +- .../purchase_receipt/test_purchase_receipt.py | 141 ++++++++++++++++++ 3 files changed, 149 insertions(+), 7 deletions(-) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 852a28f9948..424bf9bac87 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -1977,7 +1977,7 @@ def create_asset_category(enable_cwip=1): asset_category.insert() -def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0): +def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_asset=0, asset_category=None): meta = frappe.get_meta("Asset") naming_series = meta.get_field("naming_series").options.splitlines()[0] or "ACC-ASS-.YYYY.-" try: @@ -1987,7 +1987,7 @@ def create_fixed_asset_item(item_code=None, auto_create_assets=1, is_grouped_ass "item_code": item_code or "Macbook Pro", "item_name": "Macbook Pro", "description": "Macbook Pro Retina Display", - "asset_category": "Computers", + "asset_category": asset_category or "Computers", "item_group": "All Item Groups", "stock_uom": "Nos", "is_stock_item": 0, diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 5e883a6695c..7e3f00774fe 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -269,14 +269,15 @@ class StockController(AccountsController): ) is_asset_pr = any(d.get("is_fixed_asset") for d in self.get("items")) - - if ( + need_inventory_map = (self.get_stock_items() or self.get("packed_items")) and ( cint(erpnext.is_perpetual_inventory_enabled(self.company)) - or provisional_accounting_for_non_stock_items - or is_asset_pr - ): + ) + + inventory_account_map = frappe._dict() + if need_inventory_map: inventory_account_map = self.get_inventory_account_map() + if need_inventory_map or provisional_accounting_for_non_stock_items or is_asset_pr: if self.docstatus == 1: if not gl_entries: gl_entries = ( diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 6cb75bc5312..66e228d7e90 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -5487,6 +5487,147 @@ class TestPurchaseReceipt(ERPNextTestSuite): "Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", original_value ) + def test_purchase_receipt_gl_entries_for_asset_item(self): + from erpnext.assets.doctype.asset.test_asset import create_fixed_asset_item + + # Create a Company without Stock Accounts Linked. + company = frappe.get_doc( + { + "doctype": "Company", + "company_name": "Asset Company", + "country": "India", + "default_currency": "INR", + } + ).insert() + + stock_accounts = ( + company.default_inventory_account, + company.stock_adjustment_account, + company.stock_received_but_not_billed, + ) + + company.update( + {"stock_in_hand_account": "", "stock_adjustment_account": "", "stock_received_but_not_billed": ""} + ).save() + + for account in stock_accounts: + frappe.db.delete("Account", account) + + asset_category = create_asset_category_for_pr_test() + asset_item = create_fixed_asset_item( + item_code="Test Fixed Asset Item for PR GL Test", asset_category=asset_category.name + ) + arnb_account = frappe.db.get_value("Company", company.name, "asset_received_but_not_billed") + + # Purchase Receipt should be able to create even without any stock accounts linked to company + pr = make_purchase_receipt( + item_code=asset_item.name, warehouse="Stores - AC", qty=1, rate=10000, company=company.name + ) + + gl_entries = get_gl_entries("Purchase Receipt", pr.name) + + self.assertTrue(gl_entries) + gl_accounts = [d.account for d in gl_entries] + + # The fixed asset account set on the item row must be debited + asset_expense_account = pr.items[0].expense_account + self.assertIn(asset_expense_account, gl_accounts) + + # Asset Received But Not Billed must be credited + self.assertIn(arnb_account, gl_accounts) + + # No Stock-type account should appear — the inventory account map is not + # needed and must not be consulted for an asset-only receipt + for entry in gl_entries: + account_type = frappe.db.get_value("Account", entry.account, "account_type") + self.assertNotEqual(account_type, "Stock") + + pr.cancel() + + def test_purchase_receipt_gl_entries_with_mixed_asset_and_stock_items(self): + from erpnext.assets.doctype.asset.test_asset import create_fixed_asset_item + + company = frappe.get_doc( + { + "doctype": "Company", + "company_name": "Asset Company", + "country": "India", + "default_currency": "INR", + } + ).insert() + + asset_category = create_asset_category_for_pr_test() + asset_item = create_fixed_asset_item( + item_code="Test Fixed Asset Item for PR GL Test", asset_category=asset_category.name + ) + arnb_account = frappe.db.get_value("Company", company.name, "asset_received_but_not_billed") + + pr = make_purchase_receipt( + item_code=asset_item.name, + qty=1, + rate=10000, + warehouse="Stores - AC", + do_not_save=True, + company=company.name, + ) + pr.append( + "items", + { + "item_code": "_Test Item", + "warehouse": "Stores - AC", + "qty": 5, + "received_qty": 5, + "rejected_qty": 0, + "rate": 50, + "uom": "_Test UOM", + "stock_uom": "_Test UOM", + "conversion_factor": 1.0, + "cost_center": frappe.get_cached_value("Company", pr.company, "cost_center"), + }, + ) + pr.insert() + pr.submit() + + gl_entries = get_gl_entries("Purchase Receipt", pr.name) + self.assertTrue(gl_entries) + + gl_accounts = [d.account for d in gl_entries] + self.assertIn(arnb_account, gl_accounts) + + # The fixed asset account set on the item row must be debited + asset_expense_account = pr.items[0].expense_account + self.assertIn(asset_expense_account, gl_accounts) + + # Asset Received But Not Billed must be credited + self.assertIn(asset_category.accounts[0].fixed_asset_account, gl_accounts) + + # Stock Accounts should be used for Stock Items + self.assertIn(company.stock_received_but_not_billed, gl_accounts) + self.assertIn(company.default_inventory_account, gl_accounts) + pr.cancel() + + +def create_asset_category_for_pr_test(): + category_name = "Test Asset Category for PR" + + asset_category = frappe.get_doc( + { + "doctype": "Asset Category", + "asset_category_name": category_name, + "enable_cwip_accounting": 0, + "depreciation_method": "Straight Line", + "total_number_of_depreciations": 12, + "frequency_of_depreciation": 1, + "accounts": [ + { + "company_name": "Asset Company", + "fixed_asset_account": "Electronic Equipment - AC", + } + ], + } + ).insert() + return asset_category + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier From 6bce78c66dafb881642c36cde73c8d6a2c00db9b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 16 May 2026 20:48:28 +0530 Subject: [PATCH 36/49] fix: incoming rate for legacy serial no (backport #54962) (#54978) fix: incoming rate for legacy serial no (cherry picked from commit 2773b7c0022bbad0e872d05289fdfedeac0a79f7) Co-authored-by: Rohit Waghchaure --- erpnext/stock/deprecated_serial_batch.py | 11 ++++++++++- .../stock_reposting_settings.json | 17 +++++++++++++++-- .../stock_reposting_settings.py | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/deprecated_serial_batch.py b/erpnext/stock/deprecated_serial_batch.py index 210898e2df3..ba0ccbaf88e 100644 --- a/erpnext/stock/deprecated_serial_batch.py +++ b/erpnext/stock/deprecated_serial_batch.py @@ -48,9 +48,18 @@ class DeprecatedSerialNoValuation: if not posting_datetime and self.sle.posting_date: posting_datetime = get_combine_datetime(self.sle.posting_date, self.sle.posting_time) + do_not_fetch_rate = frappe.db.get_single_value( + "Stock Reposting Settings", "do_not_fetch_incoming_rate_from_serial_no" + ) + for serial_no in serial_nos: sn_details = frappe.db.get_value("Serial No", serial_no, ["purchase_rate", "company"], as_dict=1) - if sn_details and sn_details.purchase_rate and sn_details.company == self.sle.company: + if ( + sn_details + and sn_details.purchase_rate + and sn_details.company == self.sle.company + and (not frappe.flags.through_repost_item_valuation or not do_not_fetch_rate) + ): self.serial_no_incoming_rate[serial_no] += flt(sn_details.purchase_rate) incoming_values += self.serial_no_incoming_rate[serial_no] continue diff --git a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json index ccca2fc9819..ed48522d770 100644 --- a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json +++ b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -1,5 +1,6 @@ { "actions": [], + "allow_bulk_edit": 1, "allow_rename": 1, "beta": 1, "creation": "2021-10-01 10:56:30.814787", @@ -13,6 +14,8 @@ "end_time", "limits_dont_apply_on", "item_based_reposting", + "column_break_mavd", + "do_not_fetch_incoming_rate_from_serial_no", "section_break_dxuf", "enable_parallel_reposting", "no_of_parallel_reposting", @@ -99,13 +102,23 @@ "fieldname": "enable_separate_reposting_for_gl", "fieldtype": "Check", "label": "Enable Separate Reposting for GL" + }, + { + "fieldname": "column_break_mavd", + "fieldtype": "Column Break" + }, + { + "default": "0", + "description": "For legacy serial nos, do not fetch incoming rate from serial no and calculate it based on the inward transaction", + "fieldname": "do_not_fetch_incoming_rate_from_serial_no", + "fieldtype": "Check", + "label": "Do not fetch incoming rate from Serial No" } ], - "hide_toolbar": 0, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-03-16 13:28:20.978007", + "modified": "2026-05-15 12:59:34.392491", "modified_by": "Administrator", "module": "Stock", "name": "Stock Reposting Settings", diff --git a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py index 40f9f1f6d69..8976d260ff9 100644 --- a/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py +++ b/erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py @@ -16,6 +16,7 @@ class StockRepostingSettings(Document): if TYPE_CHECKING: from frappe.types import DF + do_not_fetch_incoming_rate_from_serial_no: DF.Check enable_parallel_reposting: DF.Check enable_separate_reposting_for_gl: DF.Check end_time: DF.Time | None From 098579ffbcc768d9ab14678bc22e0359d989537a Mon Sep 17 00:00:00 2001 From: MochaMind Date: Mon, 18 May 2026 01:13:32 +0530 Subject: [PATCH 37/49] chore: update POT file (#54990) --- erpnext/locale/main.pot | 1533 ++++++++++++++++++++++++--------------- 1 file changed, 945 insertions(+), 588 deletions(-) diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index d1c1858cd23..209ae9ed859 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-05-10 10:00+0000\n" -"PO-Revision-Date: 2026-05-10 10:00+0000\n" +"POT-Creation-Date: 2026-05-17 10:04+0000\n" +"PO-Revision-Date: 2026-05-17 10:04+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -94,15 +94,15 @@ msgstr "" msgid " Summary" msgstr "" -#: erpnext/stock/doctype/item/item.py:257 +#: erpnext/stock/doctype/item/item.py:266 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "" -#: erpnext/stock/doctype/item/item.py:259 +#: erpnext/stock/doctype/item/item.py:268 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:334 +#: erpnext/stock/doctype/item/item.py:367 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "" @@ -301,7 +301,7 @@ msgstr "" msgid "'From Date' must be after 'To Date'" msgstr "" -#: erpnext/stock/doctype/item/item.py:417 +#: erpnext/stock/doctype/item/item.py:450 msgid "'Has Serial No' can not be 'Yes' for non-stock item" msgstr "" @@ -660,6 +660,16 @@ msgstr "" msgid "
{0}
" msgstr "" +#. Content of the 'Stock Levels HTML' (HTML) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "
" +msgstr "" + +#. Content of the 'uom_help_html' (HTML) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "
Define alternate units for this item. Eg: 1 Box = 12 Nos, set conversion factor as 12. (Will also apply for variants) Learn more →
" +msgstr "" + #. Content of the 'settings' (HTML) field in DocType 'Cheque Print Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json msgid "" @@ -1028,7 +1038,7 @@ msgstr "" msgid "A logical Warehouse against which stock entries are made." msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1473 +#: erpnext/stock/serial_batch_bundle.py:1479 msgid "A naming series conflict occurred while creating serial numbers. Please change the naming series for the item {0}." msgstr "" @@ -1040,6 +1050,18 @@ msgstr "" msgid "A new fiscal year has been automatically created." msgstr "" +#. Description of the 'Inspection Required before Delivery' (Check) field in +#. DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "A quality inspection must be completed before generating a Delivery Note for this item." +msgstr "" + +#. Description of the 'Inspection Required before Purchase' (Check) field in +#. DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "A quality inspection must be completed before generating a Purchase Receipt for this item." +msgstr "" + #: erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py:96 msgid "A template with tax category {0} already exists. Only one template is allowed with each tax category" msgstr "" @@ -1216,7 +1238,7 @@ msgstr "" msgid "According to CEFACT/ICG/2010/IC013 or CEFACT/ICG/2010/IC010" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1083 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1082 msgid "According to the BOM {0}, the Item '{1}' is missing in the stock entry." msgstr "" @@ -1455,6 +1477,30 @@ msgstr "" msgid "Account not Found" msgstr "" +#. Description of the 'Purchase Expense Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account to record additional purchase expenses like freight or customs for this item" +msgstr "" + +#. Description of the 'Default COGS Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account where cost of goods sold will be posted when this item is sold" +msgstr "" + +#. Description of the 'Default Income Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account where revenue from selling this item will be credited" +msgstr "" + +#. Description of the 'Default Expense Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account where the cost of this item will be debited on purchase" +msgstr "" + #: erpnext/accounts/doctype/account/account.py:427 msgid "Account with child nodes cannot be converted to ledger" msgstr "" @@ -1853,8 +1899,8 @@ msgstr "" msgid "Accounting Entry for Asset" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2059 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2079 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2058 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2078 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1862,7 +1908,7 @@ msgstr "" msgid "Accounting Entry for Landed Cost Voucher for SCR {0}" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:854 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:847 msgid "Accounting Entry for Service" msgstr "" @@ -1875,16 +1921,16 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1239 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1475 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1497 -#: erpnext/controllers/stock_controller.py:732 -#: erpnext/controllers/stock_controller.py:749 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:947 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2004 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2018 +#: erpnext/controllers/stock_controller.py:733 +#: erpnext/controllers/stock_controller.py:750 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:940 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2003 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2017 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:777 msgid "Accounting Entry for Stock" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:751 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:744 msgid "Accounting Entry for {0}" msgstr "" @@ -2180,12 +2226,6 @@ msgstr "" msgid "Action If Quality Inspection Is Rejected" msgstr "" -#. Label of the maintain_same_rate_action (Select) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Action If Same Rate is Not Maintained" -msgstr "" - #: erpnext/quality_management/doctype/quality_review/quality_review_list.js:7 msgid "Action Initialised" msgstr "" @@ -2244,6 +2284,12 @@ msgstr "" msgid "Action if Same Rate is Not Maintained Throughout Internal Transaction" msgstr "" +#. Label of the maintain_same_rate_action (Select) field in DocType 'Buying +#. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Action if same rate is not maintained" +msgstr "" + #. Label of the maintain_same_rate_action (Select) field in DocType 'Selling #. Settings' #: erpnext/selling/doctype/selling_settings/selling_settings.json @@ -2265,7 +2311,7 @@ msgstr "" #. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType #. 'Stock Settings' -#: erpnext/stock/doctype/item/item.js:413 +#: erpnext/stock/doctype/item/item.js:419 #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Activate Serial / Batch No for Item" msgstr "" @@ -2511,7 +2557,7 @@ msgstr "" msgid "Actual qty in stock" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1545 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1527 #: erpnext/public/js/controllers/accounts.js:197 msgid "Actual type tax cannot be included in Item rate in row {0}" msgstr "" @@ -2520,12 +2566,12 @@ msgstr "" msgid "Ad-hoc Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:682 +#: erpnext/stock/doctype/item/item.js:688 #: erpnext/stock/doctype/price_list/price_list.js:8 msgid "Add / Edit Prices" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.js:208 +#: erpnext/accounts/report/general_ledger/general_ledger.js:214 msgid "Add Columns in Transaction Currency" msgstr "" @@ -2668,7 +2714,7 @@ msgstr "" msgid "Add Serial / Batch No (Rejected Qty)" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:26 +#: erpnext/public/js/utils/naming_series.js:26 msgid "Add Series Prefix" msgstr "" @@ -2896,7 +2942,7 @@ msgstr "" msgid "Additional Discount Amount (Company Currency)" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:850 +#: erpnext/controllers/taxes_and_totals.py:833 msgid "Additional Discount Amount ({discount_amount}) cannot exceed the total before such discount ({total_before_discount})" msgstr "" @@ -3182,7 +3228,7 @@ msgstr "" msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:676 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:669 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3295,7 +3341,7 @@ msgstr "" msgid "Advance amount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:987 +#: erpnext/controllers/taxes_and_totals.py:970 msgid "Advance amount cannot be greater than {0} {1}" msgstr "" @@ -3361,7 +3407,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:42 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:95 -#: erpnext/accounts/report/general_ledger/general_ledger.py:750 +#: erpnext/accounts/report/general_ledger/general_ledger.py:767 msgid "Against Account" msgstr "" @@ -3479,7 +3525,7 @@ msgstr "" #. Label of the against_voucher (Dynamic Link) field in DocType 'GL Entry' #: erpnext/accounts/doctype/gl_entry/gl_entry.json -#: erpnext/accounts/report/general_ledger/general_ledger.py:783 +#: erpnext/accounts/report/general_ledger/general_ledger.py:800 msgid "Against Voucher" msgstr "" @@ -3503,7 +3549,7 @@ msgstr "" #: erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json -#: erpnext/accounts/report/general_ledger/general_ledger.py:781 +#: erpnext/accounts/report/general_ledger/general_ledger.py:798 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:183 msgid "Against Voucher Type" msgstr "" @@ -3516,7 +3562,8 @@ msgid "Age" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:154 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:133 +#: 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:1276 msgid "Age (Days)" msgstr "" @@ -3529,8 +3576,10 @@ msgstr "" #. Accounts' #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_payable/accounts_payable.js:66 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:119 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:21 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:95 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:119 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:21 msgid "Ageing Based On" msgstr "" @@ -3713,8 +3762,11 @@ msgstr "" msgid "All Lead (Open)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.html:68 -msgid "All Parties " +#: erpnext/accounts/report/accounts_payable/accounts_payable.html:114 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:113 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:115 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:113 +msgid "All Parties" msgstr "" #. Option for the 'Send To' (Select) field in DocType 'SMS Center' @@ -3778,7 +3830,7 @@ msgstr "" msgid "All items are already requested" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1498 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1491 msgid "All items have already been Invoiced/Returned" msgstr "" @@ -3786,7 +3838,7 @@ msgstr "" msgid "All items have already been received" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3340 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3339 msgid "All items have already been transferred for this Work Order." msgstr "" @@ -3835,7 +3887,7 @@ msgstr "" msgid "Allocate Advances Automatically (FIFO)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:935 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:917 msgid "Allocate Payment Amount" msgstr "" @@ -3845,7 +3897,7 @@ msgstr "" msgid "Allocate Payment Based On Payment Terms" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1735 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1717 msgid "Allocate Payment Request" msgstr "" @@ -3871,7 +3923,7 @@ msgstr "" #. Payment Entries' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json #: erpnext/accounts/doctype/bank_transaction_payments/bank_transaction_payments.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1726 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1708 #: erpnext/accounts/doctype/payment_reconciliation_allocation/payment_reconciliation_allocation.json #: erpnext/accounts/doctype/process_payment_reconciliation_log_allocations/process_payment_reconciliation_log_allocations.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json @@ -3992,15 +4044,15 @@ msgstr "" msgid "Allow Internal Transfers at Arm's Length Price" msgstr "" -#. Label of the allow_multiple_items (Check) field in DocType 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Allow Item To Be Added Multiple Times in a Transaction" -msgstr "" - #: erpnext/controllers/selling_controller.py:858 msgid "Allow Item to Be Added Multiple Times in a Transaction" msgstr "" +#. Label of the allow_multiple_items (Check) field in DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Allow Item to be added multiple times in a transaction" +msgstr "" + #. Label of the allow_lead_duplication_based_on_emails (Check) field in DocType #. 'CRM Settings' #: erpnext/crm/doctype/crm_settings/crm_settings.json @@ -4029,12 +4081,6 @@ msgstr "" msgid "Allow Negative Stock for Batch" msgstr "" -#. Label of the allow_negative_rates_for_items (Check) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Allow Negative rates for Items" -msgstr "" - #. Label of the allow_or_restrict (Select) field in DocType 'Accounting #. Dimension Filter' #: erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json @@ -4242,8 +4288,11 @@ msgstr "" msgid "Allow multiple Sales Orders against a customer's Purchase Order" msgstr "" +#. Label of the allow_negative_rates_for_items (Check) field in DocType 'Buying +#. Settings' #. Label of the allow_negative_rates_for_items (Check) field in DocType #. 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Allow negative rates for Items" msgstr "" @@ -4260,6 +4309,26 @@ msgstr "" msgid "Allow same Item to be added multiple times in a transaction" msgstr "" +#. Description of the 'Allow Negative Stock' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Allow stock to go below zero for this item, even if negative stock is disabled in Stock Settings." +msgstr "" + +#. Description of the 'Allow Alternative Item' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Allow substituting this item with an alternative from the Item Alternative list when stock is unavailable." +msgstr "" + +#. Description of the 'Allow Purchase' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Allow this item to be used in purchase transactions." +msgstr "" + +#. Description of the 'Allow Sales' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Allow this item to be used in sales transactions." +msgstr "" + #. Label of the allow_to_edit_stock_uom_qty_for_purchase (Check) field in #. DocType 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -4315,7 +4384,7 @@ msgstr "" msgid "Allowed primary roles are 'Customer' and 'Supplier'. Please select one of these roles only." msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:81 +#: erpnext/public/js/utils/naming_series.js:81 msgid "Allowed special characters are '/' and '-'" msgstr "" @@ -5240,6 +5309,8 @@ msgstr "" msgid "As On Date" msgstr "" +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:123 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:123 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.js:15 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js:15 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js:15 @@ -5260,7 +5331,7 @@ msgstr "" msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "" -#: erpnext/stock/doctype/item/item.py:1019 +#: erpnext/stock/doctype/item/item.py:1089 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "" @@ -5410,7 +5481,7 @@ msgstr "" msgid "Asset Category Name" msgstr "" -#: erpnext/stock/doctype/item/item.py:326 +#: erpnext/stock/doctype/item/item.py:359 msgid "Asset Category is mandatory for Fixed Asset item" msgstr "" @@ -5810,7 +5881,7 @@ msgstr "" msgid "Asset {0} must be submitted" msgstr "" -#: erpnext/controllers/buying_controller.py:1051 +#: erpnext/controllers/buying_controller.py:1041 msgid "Asset {assets_link} created for {item_code}" msgstr "" @@ -5848,11 +5919,11 @@ msgstr "" msgid "Assets Setup" msgstr "" -#: erpnext/controllers/buying_controller.py:1069 +#: erpnext/controllers/buying_controller.py:1059 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "" -#: erpnext/controllers/buying_controller.py:1056 +#: erpnext/controllers/buying_controller.py:1046 msgid "Assets {assets_link} created for {item_code}" msgstr "" @@ -5925,7 +5996,7 @@ msgstr "" msgid "At least one row is required for a financial report template" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:884 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:883 msgid "At least one warehouse is mandatory" msgstr "" @@ -5957,7 +6028,7 @@ msgstr "" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:680 +#: erpnext/controllers/stock_controller.py:681 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 "" @@ -6021,7 +6092,11 @@ msgstr "" msgid "Attribute Value" msgstr "" -#: erpnext/stock/doctype/item/item.py:955 +#: erpnext/stock/doctype/item/item.py:879 +msgid "Attribute Value {0} is not valid for the selected attribute {1}." +msgstr "" + +#: erpnext/stock/doctype/item/item.py:1025 msgid "Attribute table is mandatory" msgstr "" @@ -6029,11 +6104,19 @@ msgstr "" msgid "Attribute value: {0} must appear only once" msgstr "" -#: erpnext/stock/doctype/item/item.py:959 +#: erpnext/stock/doctype/item/item.py:873 +msgid "Attribute {0} is disabled." +msgstr "" + +#: erpnext/stock/doctype/item/item.py:861 +msgid "Attribute {0} is not valid for the selected template." +msgstr "" + +#: erpnext/stock/doctype/item/item.py:1029 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "" -#: erpnext/stock/doctype/item/item.py:887 +#: erpnext/stock/doctype/item/item.py:957 msgid "Attributes" msgstr "" @@ -6086,35 +6169,18 @@ msgstr "" msgid "Authorized Value" msgstr "" -#. Label of the auto_create_assets (Check) field in DocType 'Item' -#: erpnext/stock/doctype/item/item.json -msgid "Auto Create Assets on Purchase" -msgstr "" - #. Label of the auto_exchange_rate_revaluation (Check) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json msgid "Auto Create Exchange Rate Revaluation" msgstr "" -#. Label of the auto_create_purchase_receipt (Check) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Auto Create Purchase Receipt" -msgstr "" - #. Label of the auto_create_serial_and_batch_bundle_for_outward (Check) field #. in DocType 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Auto Create Serial and Batch Bundle For Outward" msgstr "" -#. Label of the auto_create_subcontracting_order (Check) field in DocType -#. 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Auto Create Subcontracting Order" -msgstr "" - #. Label of the auto_created (Check) field in DocType 'Fiscal Year' #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json msgid "Auto Created" @@ -6233,6 +6299,23 @@ msgstr "" msgid "Auto close Opportunity Replied after the no. of days mentioned above" msgstr "" +#. Label of the auto_create_purchase_receipt (Check) field in DocType 'Buying +#. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Auto create Purchase Receipt" +msgstr "" + +#. Label of the auto_create_subcontracting_order (Check) field in DocType +#. 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Auto create Subcontracting Order" +msgstr "" + +#. Label of the auto_create_assets (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Auto create assets on purchase" +msgstr "" + #. Description of the 'Enable Automatic Party Matching' (Check) field in #. DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -6438,7 +6521,7 @@ msgstr "" msgid "Available for use date is required" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1047 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1046 msgid "Available quantity is {0}, you need {1}" msgstr "" @@ -6538,7 +6621,7 @@ msgid "BIN Qty" msgstr "" #. Label of the bom (Link) field in DocType 'Purchase Invoice Item' -#. Option for the 'Backflush Raw Materials of Subcontract Based On' (Select) +#. Option for the 'Backflush raw materials of subcontract based on' (Select) #. field in DocType 'Buying Settings' #. Label of the bom (Link) field in DocType 'Purchase Order Item' #. Name of a DocType @@ -6817,7 +6900,7 @@ msgstr "" msgid "BOM Website Operation" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2451 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2450 msgid "BOM and Finished Good Quantity is mandatory for Disassembly" msgstr "" @@ -6908,11 +6991,11 @@ msgstr "" #. Label of the backflush_raw_materials_of_subcontract_based_on (Select) field #. in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Backflush Raw Materials of Subcontract Based On" +msgid "Backflush raw materials of subcontract based on" msgstr "" #: erpnext/accounts/report/account_balance/account_balance.py:36 -#: erpnext/accounts/report/general_ledger/general_ledger.html:94 +#: erpnext/accounts/report/general_ledger/general_ledger.html:168 #: erpnext/accounts/report/purchase_register/purchase_register.py:242 #: erpnext/accounts/report/sales_register/sales_register.py:278 #: erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py:71 @@ -6923,7 +7006,7 @@ msgstr "" msgid "Balance (Dr - Cr)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:702 +#: erpnext/accounts/report/general_ledger/general_ledger.py:719 msgid "Balance ({0})" msgstr "" @@ -7348,11 +7431,11 @@ msgstr "" msgid "Barcode Type" msgstr "" -#: erpnext/stock/doctype/item/item.py:494 +#: erpnext/stock/doctype/item/item.py:527 msgid "Barcode {0} already used in Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:509 +#: erpnext/stock/doctype/item/item.py:542 msgid "Barcode {0} is not a valid {1} code" msgstr "" @@ -7696,6 +7779,17 @@ msgstr "" msgid "Batch not created for item {} since it does not have a batch series." msgstr "" +#. Description of the 'Automatically Create New Batch' (Check) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Batch number will be auto-created in format AAAA.00001 if not specified in transactions. Leave blank to always enter batch numbers manually." +msgstr "" + +#. Description of the 'Has Expiry Date' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Batch number will be created based on expiry date. Expiry dates can be set in the Batch master." +msgstr "" + #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:384 msgid "Batch {0} and Warehouse" msgstr "" @@ -7704,12 +7798,12 @@ msgstr "" msgid "Batch {0} is not available in warehouse {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3524 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3523 #: 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:3530 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3529 msgid "Batch {0} of Item {1} is disabled." msgstr "" @@ -7770,7 +7864,7 @@ msgstr "" #. Label of the bill_for_rejected_quantity_in_purchase_invoice (Check) field in #. DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Bill for Rejected Quantity in Purchase Invoice" +msgid "Bill for rejected quantity in Purchase Invoice" msgstr "" #. Label of a Card Break in the Manufacturing Workspace @@ -8107,8 +8201,11 @@ msgstr "" msgid "Blanket Order Rate" msgstr "" +#. Label of the blanket_order_section (Section Break) field in DocType 'Buying +#. Settings' #. Label of the blanket_orders_section (Section Break) field in DocType #. 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Blanket Orders" msgstr "" @@ -8611,7 +8708,7 @@ msgstr "" msgid "Buying must be checked, if Applicable For is selected as {0}" msgstr "" -#: erpnext/buying/doctype/buying_settings/buying_settings.js:13 +#: erpnext/buying/doctype/buying_settings/buying_settings.js:62 msgid "By default, the Supplier Name is set as per the Supplier Name entered. If you want Suppliers to be named by a Naming Series choose the 'Naming Series' option." msgstr "" @@ -8972,7 +9069,7 @@ msgstr "" msgid "Can only make payment against unbilled {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1517 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1499 #: erpnext/controllers/accounts_controller.py:3193 #: erpnext/public/js/controllers/accounts.js:103 msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'" @@ -9028,9 +9125,9 @@ msgstr "" msgid "Cannot Create Return" msgstr "" -#: erpnext/stock/doctype/item/item.py:649 -#: erpnext/stock/doctype/item/item.py:662 -#: erpnext/stock/doctype/item/item.py:676 +#: erpnext/stock/doctype/item/item.py:682 +#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:709 msgid "Cannot Merge" msgstr "" @@ -9058,7 +9155,7 @@ msgstr "" msgid "Cannot apply TDS against multiple parties in one entry" msgstr "" -#: erpnext/stock/doctype/item/item.py:329 +#: erpnext/stock/doctype/item/item.py:362 msgid "Cannot be a fixed asset item as Stock Ledger is created." msgstr "" @@ -9094,7 +9191,7 @@ 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:1158 +#: erpnext/controllers/buying_controller.py:1148 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" @@ -9102,7 +9199,7 @@ msgstr "" msgid "Cannot cancel transaction for Completed Work Order." msgstr "" -#: erpnext/stock/doctype/item/item.py:907 +#: erpnext/stock/doctype/item/item.py:977 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "" @@ -9114,7 +9211,7 @@ msgstr "" msgid "Cannot change Service Stop Date for item in row {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:898 +#: erpnext/stock/doctype/item/item.py:968 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "" @@ -9142,11 +9239,11 @@ msgstr "" msgid "Cannot covert to Group because Account Type is selected." msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1028 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1021 msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1919 +#: erpnext/selling/doctype/sales_order/sales_order.py:1913 #: erpnext/stock/doctype/pick_list/pick_list.py:255 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 "" @@ -9172,7 +9269,7 @@ msgstr "" msgid "Cannot deduct when category is for 'Valuation' or 'Valuation and Total'" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1832 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1814 msgid "Cannot delete Exchange Gain/Loss row" msgstr "" @@ -9209,7 +9306,7 @@ msgstr "" msgid "Cannot disassemble more than produced quantity." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:927 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:926 msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "" @@ -9217,8 +9314,8 @@ msgstr "" msgid "Cannot enable Item-wise Inventory Account, as there are existing Stock Ledger Entries for the company {0} with Warehouse-wise Inventory Account. Please cancel the stock transactions first and try again." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:787 -#: erpnext/selling/doctype/sales_order/sales_order.py:810 +#: erpnext/selling/doctype/sales_order/sales_order.py:781 +#: erpnext/selling/doctype/sales_order/sales_order.py:804 msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "" @@ -9262,7 +9359,7 @@ msgstr "" msgid "Cannot reduce quantity than ordered or purchased quantity" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1530 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1512 #: erpnext/controllers/accounts_controller.py:3208 #: erpnext/public/js/controllers/accounts.js:120 msgid "Cannot refer row number greater than or equal to current row number for this Charge type" @@ -9280,8 +9377,8 @@ msgstr "" msgid "Cannot select a Group type Customer Group. Please select a non-group Customer Group." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1523 -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1701 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1505 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1683 #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1827 #: erpnext/controllers/accounts_controller.py:3198 #: erpnext/public/js/controllers/accounts.js:112 @@ -9297,7 +9394,7 @@ msgstr "" msgid "Cannot set authorization on basis of Discount for {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:740 +#: erpnext/stock/doctype/item/item.py:773 msgid "Cannot set multiple Item Defaults for a company." msgstr "" @@ -9715,7 +9812,7 @@ msgstr "" msgid "Changes in {0}" msgstr "" -#: erpnext/stock/doctype/item/item.js:379 +#: erpnext/stock/doctype/item/item.js:385 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "" @@ -9934,7 +10031,6 @@ msgid "Cheque/Reference No" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:134 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:113 msgid "Cheques Required" msgstr "" @@ -10170,7 +10266,7 @@ msgstr "" msgid "Closing (Dr)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:397 +#: erpnext/accounts/report/general_ledger/general_ledger.py:405 msgid "Closing (Opening + Total)" msgstr "" @@ -10226,7 +10322,7 @@ msgstr "" msgid "Closing Text" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.html:141 +#: erpnext/accounts/report/general_ledger/general_ledger.html:211 msgid "Closing [Opening + Total] " msgstr "" @@ -10632,9 +10728,11 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:8 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.js:8 #: erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.js:8 +#: erpnext/accounts/report/balance_sheet/balance_sheet.html:128 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:8 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.js:7 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.js:72 +#: erpnext/accounts/report/cash_flow/cash_flow.html:128 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:8 #: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:8 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:8 @@ -10659,6 +10757,7 @@ msgstr "" #: erpnext/accounts/report/pos_register/pos_register.js:8 #: erpnext/accounts/report/pos_register/pos_register.py:107 #: erpnext/accounts/report/pos_register/pos_register.py:223 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html:128 #: erpnext/accounts/report/profitability_analysis/profitability_analysis.js:8 #: erpnext/accounts/report/purchase_register/purchase_register.js:33 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js:7 @@ -10668,6 +10767,7 @@ msgstr "" #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:8 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.js:8 #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.js:8 +#: erpnext/accounts/report/trial_balance/trial_balance.html:133 #: erpnext/accounts/report/trial_balance/trial_balance.js:8 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.js:8 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.js:8 @@ -10861,7 +10961,7 @@ msgstr "" msgid "Company Abbreviation" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:101 +#: erpnext/public/js/utils/naming_series.js:101 msgid "Company Abbreviation (requires ERPNext to be installed)" msgstr "" @@ -11305,18 +11405,20 @@ msgstr "" msgid "Configure Product Assembly" msgstr "" +#. Label of the configure (Button) field in DocType 'Buying Settings' #. Label of the configure (Button) field in DocType 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Configure Series" msgstr "" -#. Description of the 'Action If Same Rate is Not Maintained' (Select) field in +#. Description of the 'Action if same rate is not maintained' (Select) field in #. DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Configure the action to stop the transaction or just warn if the same rate is not maintained." msgstr "" -#: erpnext/buying/doctype/buying_settings/buying_settings.js:20 +#: erpnext/buying/doctype/buying_settings/buying_settings.js:69 msgid "Configure the default Price List when creating a new Purchase transaction. Item prices will be fetched from this Price List." msgstr "" @@ -11489,7 +11591,7 @@ msgstr "" msgid "Consumed" msgstr "" -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:62 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:62 msgid "Consumed Amount" msgstr "" @@ -11536,7 +11638,7 @@ msgstr "" #: erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py:59 #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:146 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:61 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:61 #: erpnext/subcontracting/doctype/subcontracting_inward_order_received_item/subcontracting_inward_order_received_item.json #: erpnext/subcontracting/doctype/subcontracting_order_supplied_item/subcontracting_order_supplied_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json @@ -11886,7 +11988,7 @@ msgstr "" msgid "Conversion Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:412 +#: erpnext/stock/doctype/item/item.py:445 msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "" @@ -12147,7 +12249,7 @@ msgstr "" #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:204 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:98 #: erpnext/accounts/report/general_ledger/general_ledger.js:154 -#: erpnext/accounts/report/general_ledger/general_ledger.py:776 +#: erpnext/accounts/report/general_ledger/general_ledger.py:793 #: erpnext/accounts/report/gross_profit/gross_profit.js:68 #: erpnext/accounts/report/gross_profit/gross_profit.py:395 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:305 @@ -12238,7 +12340,7 @@ msgid "Cost Center is a part of Cost Center Allocation, hence cannot be converte msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1440 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:913 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:906 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "" @@ -12293,6 +12395,18 @@ msgstr "" msgid "Cost and Freight" msgstr "" +#. Description of the 'Default Buying Cost Center' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Cost center used for tracking purchase expenses for this item" +msgstr "" + +#. Description of the 'Default Selling Cost Center' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Cost center used for tracking sales revenue for this item" +msgstr "" + #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:41 msgid "Cost of Delivered Items" msgstr "" @@ -12854,12 +12968,12 @@ msgstr "" msgid "Create Users" msgstr "" -#: erpnext/stock/doctype/item/item.js:978 +#: erpnext/stock/doctype/item/item.js:984 msgid "Create Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:792 -#: erpnext/stock/doctype/item/item.js:836 +#: erpnext/stock/doctype/item/item.js:798 +#: erpnext/stock/doctype/item/item.js:842 msgid "Create Variants" msgstr "" @@ -12878,8 +12992,8 @@ msgstr "" msgid "Create Workstation" msgstr "" -#: erpnext/stock/doctype/item/item.js:819 -#: erpnext/stock/doctype/item/item.js:971 +#: erpnext/stock/doctype/item/item.js:825 +#: erpnext/stock/doctype/item/item.js:977 msgid "Create a variant with the template image." msgstr "" @@ -12927,6 +13041,17 @@ msgstr "" msgid "Creates a User account for this employee using the Preferred, Company, or Personal email." msgstr "" +#. Description of the 'Create Grouped Asset' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Creates a single grouped asset instead of individual assets when purchased in bulk." +msgstr "" + +#. Description of the 'Standard Selling Rate' (Currency) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +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 msgid "Creating Accounts..." msgstr "" @@ -13030,7 +13155,7 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:88 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:146 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:431 -#: erpnext/accounts/report/general_ledger/general_ledger.html:93 +#: erpnext/accounts/report/general_ledger/general_ledger.html:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:241 #: erpnext/accounts/report/sales_register/sales_register.py:277 #: erpnext/accounts/report/trial_balance/trial_balance.py:530 @@ -13039,11 +13164,11 @@ msgstr "" msgid "Credit" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:720 +#: erpnext/accounts/report/general_ledger/general_ledger.py:737 msgid "Credit (Transaction)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:695 +#: erpnext/accounts/report/general_ledger/general_ledger.py:712 msgid "Credit ({0})" msgstr "" @@ -13115,7 +13240,6 @@ msgstr "" #. Label of the credit_limits (Table) field in DocType 'Customer Group' #. Label of the section_credit_limit (Section Break) field in DocType 'Supplier #. Group' -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:36 #: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.py:65 @@ -13172,7 +13296,6 @@ 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.html:147 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1270 #: erpnext/controllers/sales_and_purchase_return.py:453 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:303 @@ -13183,7 +13306,7 @@ msgid "Credit Note" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:203 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:162 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:137 msgid "Credit Note Amount" msgstr "" @@ -13533,7 +13656,7 @@ msgstr "" msgid "Current Serial No" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:222 +#: erpnext/public/js/utils/naming_series.js:223 msgid "Current Series" msgstr "" @@ -13689,8 +13812,12 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/sales_invoice_reference/sales_invoice_reference.json #: erpnext/accounts/doctype/tax_rule/tax_rule.json +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:114 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:112 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:134 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:38 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:29 +#: erpnext/accounts/report/general_ledger/general_ledger.html:136 #: erpnext/accounts/report/gross_profit/gross_profit.py:416 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:37 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js:22 @@ -13728,7 +13855,7 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1199 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/sales_order/sales_order_calendar.js:19 -#: erpnext/selling/doctype/selling_settings/selling_settings.js:64 +#: erpnext/selling/doctype/selling_settings/selling_settings.js:48 #: erpnext/selling/doctype/sms_center/sms_center.json #: erpnext/selling/page/point_of_sale/pos_item_cart.js:320 #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.js:16 @@ -14032,7 +14159,6 @@ msgid "Customer LPO" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:185 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:152 msgid "Customer LPO No." msgstr "" @@ -14502,7 +14628,7 @@ msgstr "" msgid "Day Of Week" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:94 +#: erpnext/public/js/utils/naming_series.js:94 msgid "Day of month" msgstr "" @@ -14599,7 +14725,7 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:81 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:139 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:424 -#: erpnext/accounts/report/general_ledger/general_ledger.html:92 +#: erpnext/accounts/report/general_ledger/general_ledger.html:166 #: erpnext/accounts/report/purchase_register/purchase_register.py:240 #: erpnext/accounts/report/sales_register/sales_register.py:276 #: erpnext/accounts/report/trial_balance/trial_balance.py:523 @@ -14608,11 +14734,11 @@ msgstr "" msgid "Debit" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:713 +#: erpnext/accounts/report/general_ledger/general_ledger.py:730 msgid "Debit (Transaction)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:688 +#: erpnext/accounts/report/general_ledger/general_ledger.py:705 msgid "Debit ({0})" msgstr "" @@ -14664,7 +14790,6 @@ 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.html:147 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1273 #: erpnext/controllers/sales_and_purchase_return.py:457 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:304 @@ -14674,7 +14799,7 @@ msgid "Debit Note" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:205 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:162 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:137 msgid "Debit Note Amount" msgstr "" @@ -14865,7 +14990,7 @@ msgstr "" msgid "Default BOM" msgstr "" -#: erpnext/stock/doctype/item/item.py:455 +#: erpnext/stock/doctype/item/item.py:488 msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" @@ -15222,15 +15347,15 @@ msgstr "" msgid "Default Unit of Measure" msgstr "" -#: erpnext/stock/doctype/item/item.py:1302 +#: erpnext/stock/doctype/item/item.py:1372 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "" -#: erpnext/stock/doctype/item/item.py:1285 +#: erpnext/stock/doctype/item/item.py:1355 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "" -#: erpnext/stock/doctype/item/item.py:933 +#: erpnext/stock/doctype/item/item.py:1003 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "" @@ -15271,6 +15396,12 @@ msgstr "" msgid "Default account will be automatically updated in POS Invoice when this mode is selected." msgstr "" +#. Description of the 'Default Price List' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Default price list for buying or selling this item" +msgstr "" + #. Description of a DocType #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Default settings for your stock-related transactions" @@ -15517,7 +15648,7 @@ msgstr "" msgid "Delivered" msgstr "" -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:64 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:64 msgid "Delivered Amount" msgstr "" @@ -15567,8 +15698,8 @@ msgstr "" #: erpnext/selling/report/sales_order_analysis/sales_order_analysis.py:262 #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:63 #: erpnext/stock/report/reserved_stock/reserved_stock.py:131 -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:63 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_secondary_item/subcontracting_inward_order_secondary_item.json msgid "Delivered Qty" @@ -15579,11 +15710,11 @@ msgstr "" msgid "Delivered Qty (in Stock UOM)" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:842 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:620 msgid "Delivered Qty cannot be increased by more than {0} for item {1}" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:834 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:613 msgid "Delivered Qty cannot be reduced by more than {0} for item {1}" msgstr "" @@ -15672,7 +15803,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:245 #: 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:68 +#: erpnext/selling/doctype/selling_settings/selling_settings.js:52 #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_stop/delivery_stop.json @@ -16145,7 +16276,7 @@ msgstr "" msgid "Difference Account must be a Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:987 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:988 msgid "Difference Account must be a Asset/Liability type account, since this Stock Reconciliation is an Opening Entry" msgstr "" @@ -16309,10 +16440,8 @@ msgstr "" msgid "Disable In Words" msgstr "" -#. Label of the disable_last_purchase_rate (Check) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Disable Last Purchase Rate" +#: erpnext/accounts/report/general_ledger/general_ledger.js:182 +msgid "Disable Opening Balance Calculation" msgstr "" #. Label of the disable_rounded_total (Check) field in DocType 'POS Profile' @@ -16354,6 +16483,12 @@ msgstr "" msgid "Disable Transaction Threshold" msgstr "" +#. Label of the disable_last_purchase_rate (Check) field in DocType 'Buying +#. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Disable last purchase rate" +msgstr "" + #. Description of the 'Disabled' (Check) field in DocType 'Financial Report #. Template' #: erpnext/accounts/doctype/financial_report_template/financial_report_template.json @@ -16368,6 +16503,11 @@ msgstr "" msgid "Disabled Warehouse {0} cannot be used for this transaction." msgstr "" +#. Description of the 'Disabled' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Disabled items cannot be selected in any transaction." +msgstr "" + #: erpnext/controllers/accounts_controller.py:903 msgid "Disabled pricing rules since this {} is an internal transfer" msgstr "" @@ -16400,7 +16540,7 @@ msgstr "" msgid "Disassemble Order" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2393 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2392 msgid "Disassemble Qty cannot be less than or equal to 0." msgstr "" @@ -16925,6 +17065,12 @@ msgstr "" msgid "Do Not Use Batchwise Valuation" msgstr "" +#. Label of the do_not_fetch_incoming_rate_from_serial_no (Check) field in +#. DocType 'Stock Reposting Settings' +#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json +msgid "Do not fetch incoming rate from Serial No" +msgstr "" + #. Description of the 'Hide Currency Symbol' (Select) field in DocType 'Global #. Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json @@ -17009,9 +17155,12 @@ msgstr "" msgid "Document Count" msgstr "" +#. Label of the document_naming_tab (Tab Break) field in DocType 'Buying +#. Settings' #. Label of the default_naming_tab (Tab Break) field in DocType 'Selling #. Settings' -#: erpnext/public/js/utils/naming_series_dialog.js:7 +#: erpnext/buying/doctype/buying_settings/buying_settings.json +#: erpnext/public/js/utils/naming_series.js:7 #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Document Naming" msgstr "" @@ -17029,6 +17178,10 @@ msgstr "" msgid "Document Type already used as a dimension" msgstr "" +#: erpnext/setup/install.py:198 +msgid "Documentation" +msgstr "" + #. Description of the 'Reconciliation Queue Size' (Int) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -17321,7 +17474,7 @@ msgstr "" msgid "Duplicate Sales Invoices found" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1476 +#: erpnext/stock/serial_batch_bundle.py:1482 msgid "Duplicate Serial Number Error" msgstr "" @@ -17436,8 +17589,13 @@ msgstr "" msgid "ERPNext User ID" msgstr "" -#. Option for the 'Update frequency of Project' (Select) field in DocType -#. 'Buying Settings' +#. Description of the 'Maintain Stock' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "ERPNext will make a stock ledger entry for each transaction of this item. Keep unchecked for non-stock or service items." +msgstr "" + +#. Option for the 'How often should project be updated of Total Purchase Cost +#. ?' (Select) field in DocType 'Buying Settings' #. Option for the 'How often should sales data be updated in Company/Project?' #. (Select) field in DocType 'Selling Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json @@ -17656,7 +17814,7 @@ msgstr "" msgid "Email Sent to Supplier {0}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:433 +#: erpnext/setup/doctype/employee/employee.py:434 msgid "Email is required to create a user" msgstr "" @@ -17846,7 +18004,7 @@ msgstr "" msgid "Employee cannot report to himself." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:567 +#: erpnext/setup/doctype/employee/employee.py:568 msgid "Employee is required" msgstr "" @@ -17854,7 +18012,7 @@ msgstr "" msgid "Employee is required while issuing Asset {0}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:430 +#: erpnext/setup/doctype/employee/employee.py:431 msgid "Employee {0} already has a linked user" msgstr "" @@ -17867,7 +18025,7 @@ msgstr "" msgid "Employee {0} is currently working on another workstation. Please assign another employee." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:592 +#: erpnext/setup/doctype/employee/employee.py:593 msgid "Employee {0} not found" msgstr "" @@ -17910,7 +18068,7 @@ msgstr "" msgid "Enable Auto Email" msgstr "" -#: erpnext/stock/doctype/item/item.py:1094 +#: erpnext/stock/doctype/item/item.py:1164 msgid "Enable Auto Re-Order" msgstr "" @@ -18072,6 +18230,34 @@ msgstr "" msgid "Enable discount accounting for selling" msgstr "" +#. Description of the 'Delivered by Supplier (Drop Ship)' (Check) field in +#. DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Enable for drop shipping - supplier delivers directly to the customer without passing through your warehouse." +msgstr "" + +#. Description of the 'Include Item In Manufacturing' (Check) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Enable for raw material items used in BOM. Uncheck for additional services like 'washing' used in manufacturing." +msgstr "" + +#. Description of the 'Is Subcontracted Item' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Enable if a vendor manufactures this item for you. You can choose to provide them raw materials using the default BOM." +msgstr "" + +#. Description of the 'Is Fixed Asset' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Enable if this item is a company asset like machinery or furniture." +msgstr "" + +#. Description of the 'Is Customer Provided Item' (Check) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Enable if this item is provided by a customer and received via Stock Entry." +msgstr "" + #. Description of the 'Consider Rejected Warehouses' (Check) field in DocType #. 'Pick List' #: erpnext/stock/doctype/pick_list/pick_list.json @@ -18189,9 +18375,12 @@ msgid "End Transit" msgstr "" #: erpnext/accounts/doctype/financial_report_template/financial_report_engine.py:235 +#: erpnext/accounts/report/balance_sheet/balance_sheet.html:147 +#: erpnext/accounts/report/cash_flow/cash_flow.html:147 #: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:80 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:64 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:25 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html:147 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:89 #: erpnext/public/js/financial_statements.js:430 msgid "End Year" @@ -18288,7 +18477,7 @@ msgstr "" msgid "Enter amount to be redeemed." msgstr "" -#: erpnext/stock/doctype/item/item.js:1140 +#: erpnext/stock/doctype/item/item.js:1146 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "" @@ -18320,6 +18509,11 @@ msgstr "" msgid "Enter the Bank Guarantee Number before submitting." msgstr "" +#. Description of the 'Ref Code' (Data) field in DocType 'Item Customer Detail' +#: erpnext/stock/doctype/item_customer_detail/item_customer_detail.json +msgid "Enter the Item Code that this customer uses at their end. This will be shown in Sales Orders for the customer's reference." +msgstr "" + #: erpnext/manufacturing/doctype/routing/routing.js:93 msgid "" "Enter the Operation, the table will fetch the Operation details like Hourly Rate, Workstation automatically.\n" @@ -18335,7 +18529,7 @@ msgstr "" msgid "Enter the name of the bank or lending institution before submitting." msgstr "" -#: erpnext/stock/doctype/item/item.js:1166 +#: erpnext/stock/doctype/item/item.js:1172 msgid "Enter the opening stock units." msgstr "" @@ -18445,7 +18639,7 @@ msgid "" "\t\t\t\t\tPlease correct the dates accordingly." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:987 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:969 msgid "Error: {0} is mandatory field" msgstr "" @@ -18491,7 +18685,7 @@ msgstr "" msgid "Example URL" msgstr "" -#: erpnext/stock/doctype/item/item.py:1025 +#: erpnext/stock/doctype/item/item.py:1095 msgid "Example of a linked document: {0}" msgstr "" @@ -18517,7 +18711,7 @@ msgstr "" msgid "Exception Budget Approver Role" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:934 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:933 msgid "Excess Disassembly" msgstr "" @@ -18869,7 +19063,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/controllers/stock_controller.py:946 +#: erpnext/controllers/stock_controller.py:947 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -18917,7 +19111,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/controllers/stock_controller.py:926 +#: erpnext/controllers/stock_controller.py:927 msgid "Expense Account Missing" msgstr "" @@ -18942,6 +19136,11 @@ msgstr "" msgid "Expense account is mandatory for item {0}" msgstr "" +#. Description of the 'Enable Deferred Revenue' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Expense for this item will be recognized over a period of months. Eg: prepaid insurance or annual software license" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:81 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:140 msgid "Expenses" @@ -19676,7 +19875,7 @@ msgstr "" msgid "Finished Goods based Operating Cost" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1770 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1769 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" @@ -19771,7 +19970,7 @@ msgstr "" msgid "Fiscal Year" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:100 +#: erpnext/public/js/utils/naming_series.js:100 msgid "Fiscal Year (requires ERPNext to be installed)" msgstr "" @@ -19835,7 +20034,7 @@ msgstr "" msgid "Fixed Asset Defaults" msgstr "" -#: erpnext/stock/doctype/item/item.py:323 +#: erpnext/stock/doctype/item/item.py:356 msgid "Fixed Asset Item must be a non-stock item." msgstr "" @@ -19985,7 +20184,7 @@ msgstr "" msgid "For Item" msgstr "" -#: erpnext/controllers/stock_controller.py:1605 +#: erpnext/controllers/stock_controller.py:1606 msgid "For Item {0} cannot be received more than {1} qty against the {2} {3}" msgstr "" @@ -20016,7 +20215,7 @@ msgstr "" msgid "For Production" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:901 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:900 msgid "For Quantity (Manufactured Qty) is mandatory" msgstr "" @@ -20092,6 +20291,12 @@ msgstr "" msgid "For item {0}, rate must be a positive number. To Allow negative rates, enable {1} in {2}" msgstr "" +#. Description of the 'Do not fetch incoming rate from Serial No' (Check) field +#. in DocType 'Stock Reposting Settings' +#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json +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 msgid "For operation {0} at row {1}, please add raw materials or set a BOM against it." msgstr "" @@ -20113,7 +20318,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:1802 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1801 msgid "For quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -20122,7 +20327,7 @@ msgstr "" msgid "For reference" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1552 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1534 #: erpnext/public/js/controllers/accounts.js:204 msgid "For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included" msgstr "" @@ -20146,7 +20351,7 @@ 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:1072 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1071 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." msgstr "" @@ -20155,7 +20360,7 @@ msgctxt "Clear payment terms template and/or payment schedule when due date is c msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "" -#: erpnext/controllers/stock_controller.py:447 +#: erpnext/controllers/stock_controller.py:448 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" @@ -20725,20 +20930,17 @@ 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.html:155 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1285 #: 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.html:154 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1284 msgid "Future Payment Ref" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:123 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:102 msgid "Future Payments" msgstr "" @@ -20762,7 +20964,7 @@ msgstr "" #. Name of a DocType #: erpnext/accounts/doctype/gl_entry/gl_entry.json -#: erpnext/accounts/report/general_ledger/general_ledger.py:673 +#: erpnext/accounts/report/general_ledger/general_ledger.py:690 msgid "GL Entry" msgstr "" @@ -21261,7 +21463,7 @@ msgstr "" msgid "Goods Transferred" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2320 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2319 msgid "Goods are already received against the outward entry {0}" msgstr "" @@ -21447,7 +21649,7 @@ msgstr "" msgid "Grant Commission" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:906 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:888 msgid "Greater Than Amount" msgstr "" @@ -22082,10 +22284,10 @@ msgstr "" msgid "How many units of the final product this BOM makes." msgstr "" -#. Description of the 'Update frequency of Project' (Select) field in DocType -#. 'Buying Settings' +#. Label of the project_update_frequency (Select) field in DocType 'Buying +#. Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "How often should Project be updated of Total Purchase Cost ?" +msgid "How often should project be updated of Total Purchase Cost ?" msgstr "" #. Label of the sales_update_frequency (Select) field in DocType 'Selling @@ -22237,7 +22439,7 @@ msgstr "" msgid "If blank, parent Warehouse Account or company default will be considered in transactions" msgstr "" -#. Description of the 'Bill for Rejected Quantity in Purchase Invoice' (Check) +#. Description of the 'Bill for rejected quantity in Purchase Invoice' (Check) #. field in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "If checked, Rejected Quantity will be included while making Purchase Invoice from Purchase Receipt." @@ -22352,6 +22554,11 @@ msgstr "" msgid "If enabled, ledger entries will be posted for change amount in POS transactions" msgstr "" +#. Description of the 'Grant Commission' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "If enabled, sales from this item will be included in Sales Person and Sales Partner commission calculations" +msgstr "" + #. Description of the 'Allow delivery of overproduced quantity' (Check) field #. in DocType 'Selling Settings' #: erpnext/selling/doctype/selling_settings/selling_settings.json @@ -22406,7 +22613,7 @@ msgstr "" msgid "If enabled, the system will allow users to edit the raw materials and their quantities in the Work Order. The system will not reset the quantities as per the BOM, if the user has changed them." msgstr "" -#. Description of the 'Set Valuation Rate for Rejected Materials' (Check) field +#. Description of the 'Set valuation rate for rejected Materials' (Check) field #. in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "If enabled, the system will generate an accounting entry for materials rejected in the Purchase Receipt." @@ -22574,11 +22781,11 @@ msgstr "" msgid "If this item has variants, then it cannot be selected in sales orders etc." msgstr "" -#: erpnext/buying/doctype/buying_settings/buying_settings.js:27 +#: erpnext/buying/doctype/buying_settings/buying_settings.js:76 msgid "If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice or Receipt without creating a Purchase Order first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Order' checkbox in the Supplier master." msgstr "" -#: erpnext/buying/doctype/buying_settings/buying_settings.js:34 +#: erpnext/buying/doctype/buying_settings/buying_settings.js:83 msgid "If this option is configured 'Yes', ERPNext will prevent you from creating a Purchase Invoice without creating a Purchase Receipt first. This configuration can be overridden for a particular supplier by enabling the 'Allow Purchase Invoice Creation Without Purchase Receipt' checkbox in the Supplier master." msgstr "" @@ -22604,7 +22811,7 @@ msgstr "" msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "" -#: erpnext/stock/doctype/item/item.js:1152 +#: erpnext/stock/doctype/item/item.js:1158 msgid "If you are maintaining stock of this Item in your Inventory, ERPNext will make a stock ledger entry for each transaction of this item." msgstr "" @@ -22690,7 +22897,7 @@ msgstr "" #. Label of the ignore_exchange_rate_revaluation_journals (Check) field in #. DocType 'Process Statement Of Accounts' #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json -#: erpnext/accounts/report/general_ledger/general_ledger.js:218 +#: erpnext/accounts/report/general_ledger/general_ledger.js:224 msgid "Ignore Exchange Rate Revaluation and Gain / Loss Journals" msgstr "" @@ -22742,7 +22949,7 @@ msgstr "" #. Of Accounts' #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:120 -#: erpnext/accounts/report/general_ledger/general_ledger.js:223 +#: erpnext/accounts/report/general_ledger/general_ledger.js:229 msgid "Ignore System Generated Credit / Debit Notes" msgstr "" @@ -22785,7 +22992,7 @@ msgstr "" msgid "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports" msgstr "" -#: erpnext/stock/doctype/item/item.py:245 +#: erpnext/stock/doctype/item/item.py:254 msgid "Image in the description has been removed. To disable this behavior, uncheck \"{0}\" in {1}." msgstr "" @@ -23041,7 +23248,7 @@ msgstr "" msgid "In the case of multi-tier program, Customers will be auto assigned to the concerned tier as per their spent" msgstr "" -#: erpnext/stock/doctype/item/item.js:1185 +#: erpnext/stock/doctype/item/item.js:1191 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "" @@ -23122,7 +23329,7 @@ msgstr "" #: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:131 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:85 #: erpnext/accounts/report/custom_financial_statement/custom_financial_statement.js:29 -#: erpnext/accounts/report/general_ledger/general_ledger.js:187 +#: erpnext/accounts/report/general_ledger/general_ledger.js:193 #: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js:46 #: erpnext/accounts/report/trial_balance/trial_balance.js:105 msgid "Include Default FB Entries" @@ -23306,6 +23513,11 @@ msgstr "" msgid "Income Account" msgstr "" +#. Description of the 'Enable Deferred Expense' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront." +msgstr "" + #. Label of a number card in the Invoicing Workspace #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Bills" @@ -23368,7 +23580,7 @@ msgstr "" msgid "Incorrect Batch Consumed" msgstr "" -#: erpnext/stock/doctype/item/item.py:551 +#: erpnext/stock/doctype/item/item.py:584 msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "" @@ -23376,7 +23588,7 @@ msgstr "" msgid "Incorrect Company" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1079 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1078 msgid "Incorrect Component Quantity" msgstr "" @@ -23578,14 +23790,14 @@ msgstr "" msgid "Inspected By" msgstr "" -#: erpnext/controllers/stock_controller.py:1499 +#: erpnext/controllers/stock_controller.py:1500 #: erpnext/manufacturing/doctype/job_card/job_card.py:832 msgid "Inspection Rejected" msgstr "" #. Label of the inspection_required (Check) field in DocType 'Stock Entry' -#: erpnext/controllers/stock_controller.py:1469 -#: erpnext/controllers/stock_controller.py:1471 +#: erpnext/controllers/stock_controller.py:1470 +#: erpnext/controllers/stock_controller.py:1472 #: erpnext/stock/doctype/stock_entry/stock_entry.json msgid "Inspection Required" msgstr "" @@ -23602,7 +23814,7 @@ msgstr "" msgid "Inspection Required before Purchase" msgstr "" -#: erpnext/controllers/stock_controller.py:1484 +#: erpnext/controllers/stock_controller.py:1485 #: erpnext/manufacturing/doctype/job_card/job_card.py:813 msgid "Inspection Submission" msgstr "" @@ -23684,8 +23896,8 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:145 #: erpnext/stock/doctype/pick_list/pick_list.py:163 #: erpnext/stock/doctype/pick_list/pick_list.py:1090 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1051 -#: erpnext/stock/serial_batch_bundle.py:1219 erpnext/stock/stock_ledger.py:1747 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1050 +#: erpnext/stock/serial_batch_bundle.py:1225 erpnext/stock/stock_ledger.py:1747 #: erpnext/stock/stock_ledger.py:2225 msgid "Insufficient Stock" msgstr "" @@ -23905,7 +24117,7 @@ msgstr "" msgid "Internal Work History" msgstr "" -#: erpnext/controllers/stock_controller.py:1566 +#: erpnext/controllers/stock_controller.py:1567 msgid "Internal transfers can only be done in company's default currency" msgstr "" @@ -23993,7 +24205,7 @@ msgstr "" msgid "Invalid Discount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:857 +#: erpnext/controllers/taxes_and_totals.py:840 msgid "Invalid Discount Amount" msgstr "" @@ -24019,7 +24231,7 @@ msgstr "" msgid "Invalid Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1440 +#: erpnext/stock/doctype/item/item.py:1510 msgid "Invalid Item Defaults" msgstr "" @@ -24105,12 +24317,12 @@ msgstr "" msgid "Invalid Selling Price" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1845 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1844 msgid "Invalid Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1113 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1135 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1112 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1134 msgid "Invalid Source and Target Warehouse" msgstr "" @@ -24147,7 +24359,7 @@ msgstr "" msgid "Invalid lost reason {0}, please create a new lost reason" msgstr "" -#: erpnext/stock/doctype/item/item.py:427 +#: erpnext/stock/doctype/item/item.py:460 msgid "Invalid naming series (. missing) for {0}" msgstr "" @@ -24391,7 +24603,8 @@ msgid "Invoice can't be made for zero billing hour" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:171 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:144 +#: 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:1267 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:164 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:194 @@ -24814,12 +25027,12 @@ msgstr "" #. Label of the po_required (Select) field in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Is Purchase Order Required for Purchase Invoice & Receipt Creation?" +msgid "Is Purchase Order required for Purchase Invoice & Receipt creation?" msgstr "" #. Label of the pr_required (Select) field in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Is Purchase Receipt Required for Purchase Invoice Creation?" +msgid "Is Purchase Receipt required for Purchase Invoice creation?" msgstr "" #. Label of the is_debit_note (Check) field in DocType 'Sales Invoice' @@ -25087,7 +25300,7 @@ msgstr "" msgid "Issuing Date" msgstr "" -#: erpnext/stock/doctype/item/item.py:608 +#: erpnext/stock/doctype/item/item.py:641 msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "" @@ -25149,7 +25362,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:1266 +#: erpnext/controllers/taxes_and_totals.py:1249 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/manufacturing/doctype/bom/bom.js:1085 #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:109 @@ -25195,6 +25408,7 @@ msgstr "" #: erpnext/stock/report/item_prices/item_prices.py:50 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:88 #: erpnext/stock/report/item_variant_details/item_variant_details.js:10 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:57 #: erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py:53 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.js:24 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:82 @@ -25210,7 +25424,6 @@ msgstr "" #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:51 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:28 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:8 -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:57 #: erpnext/stock/report/total_stock_summary/total_stock_summary.py:21 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.js:40 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py:97 @@ -25283,6 +25496,11 @@ msgstr "" msgid "Item Attribute Values" msgstr "" +#. Label of the section_break_zlmj (Section Break) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Item Attributes" +msgstr "" + #. Name of a report #: erpnext/stock/report/item_balance/item_balance.json msgid "Item Balance (Simple)" @@ -25972,6 +26190,7 @@ msgstr "" #: erpnext/stock/report/item_price_stock/item_price_stock.py:24 #: erpnext/stock/report/item_prices/item_prices.py:51 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:143 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:58 #: erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py:54 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:131 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:440 @@ -25982,7 +26201,6 @@ msgstr "" #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:110 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:31 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:32 -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:58 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py:98 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_service_item/subcontracting_inward_order_service_item.json @@ -26043,6 +26261,10 @@ msgstr "" msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "" +#: erpnext/stock/doctype/item/item.py:186 +msgid "Item Price created at rate {0}" +msgstr "" + #: erpnext/stock/get_item_details.py:1115 msgid "Item Price updated for {0} in Price List {1}" msgstr "" @@ -26104,7 +26326,9 @@ msgstr "" msgid "Item Shortage Report" msgstr "" +#. Label of the supplier_items (Table) field in DocType 'Item' #. Name of a DocType +#: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_supplier/item_supplier.json msgid "Item Supplier" msgstr "" @@ -26220,7 +26444,7 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:193 +#: erpnext/stock/doctype/item/item.js:209 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -26228,15 +26452,15 @@ msgstr "" msgid "Item Variant Settings" msgstr "" -#: erpnext/stock/doctype/item/item.js:1001 +#: erpnext/stock/doctype/item/item.js:1007 msgid "Item Variant {0} already exists with same attributes" msgstr "" -#: erpnext/stock/doctype/item/item.py:803 +#: erpnext/stock/doctype/item/item.py:836 msgid "Item Variants updated" msgstr "" -#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:86 +#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:87 msgid "Item Warehouse based reposting has been enabled." msgstr "" @@ -26275,6 +26499,15 @@ msgstr "" msgid "Item Weight Details" msgstr "" +#. Label of a Link in the Buying Workspace +#. Name of a report +#. Label of a Workspace Sidebar Item +#: erpnext/buying/workspace/buying/buying.json +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.json +#: erpnext/workspace_sidebar/buying.json +msgid "Item Wise Consumption" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json msgid "Item Wise Tax Detail" @@ -26304,7 +26537,7 @@ msgstr "" msgid "Item Wise Tax Details" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:573 +#: erpnext/controllers/taxes_and_totals.py:556 msgid "Item Wise Tax Details do not match with Taxes and Charges at the following rows:" msgstr "" @@ -26324,11 +26557,11 @@ msgstr "" msgid "Item and Warranty Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3503 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3502 msgid "Item for row {0} does not match Material Request" msgstr "" -#: erpnext/stock/doctype/item/item.py:820 +#: erpnext/stock/doctype/item/item.py:890 msgid "Item has variants." msgstr "" @@ -26358,7 +26591,7 @@ msgstr "" msgid "Item qty can not be updated as raw materials are already processed." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1250 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1249 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "" @@ -26377,10 +26610,14 @@ msgstr "" msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "" -#: erpnext/stock/doctype/item/item.py:977 +#: erpnext/stock/doctype/item/item.py:1047 msgid "Item variant {0} exists with same attributes" msgstr "" +#: erpnext/buying/doctype/purchase_order/purchase_order.py:587 +msgid "Item with name {0} not found in the Purchase Order" +msgstr "" + #: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:99 msgid "Item {0} added multiple times under the same parent item {1} at rows {2} and {3}" msgstr "" @@ -26394,7 +26631,7 @@ msgid "Item {0} cannot be ordered more than {1} against Blanket Order {2}." msgstr "" #: erpnext/assets/doctype/asset/asset.py:343 -#: erpnext/stock/doctype/item/item.py:654 +#: erpnext/stock/doctype/item/item.py:687 msgid "Item {0} does not exist" msgstr "" @@ -26402,7 +26639,7 @@ msgstr "" msgid "Item {0} does not exist in the system or has expired" msgstr "" -#: erpnext/controllers/stock_controller.py:561 +#: erpnext/controllers/stock_controller.py:562 msgid "Item {0} does not exist." msgstr "" @@ -26418,15 +26655,15 @@ msgstr "" msgid "Item {0} has been disabled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:794 +#: erpnext/selling/doctype/sales_order/sales_order.py:788 msgid "Item {0} has no Serial No. Only serialized items can have delivery based on Serial No" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:826 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:606 msgid "Item {0} has no changes in delivered quantity. Please unselect the row if you do not wish to update its quantity." msgstr "" -#: erpnext/stock/doctype/item/item.py:1156 +#: erpnext/stock/doctype/item/item.py:1226 msgid "Item {0} has reached its end of life on {1}" msgstr "" @@ -26438,19 +26675,23 @@ msgstr "" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1176 +#: erpnext/stock/doctype/item/item.py:1246 msgid "Item {0} is cancelled" msgstr "" -#: erpnext/stock/doctype/item/item.py:1160 +#: erpnext/stock/doctype/item/item.py:1230 msgid "Item {0} is disabled" msgstr "" +#: erpnext/buying/doctype/purchase_order/purchase_order.py:592 +msgid "Item {0} is not a drop ship item. Only drop ship items can have Delivered Qty updated." +msgstr "" + #: erpnext/selling/doctype/installation_note/installation_note.py:79 msgid "Item {0} is not a serialized Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1168 +#: erpnext/stock/doctype/item/item.py:1238 msgid "Item {0} is not a stock Item" msgstr "" @@ -26458,7 +26699,11 @@ msgstr "" msgid "Item {0} is not a subcontracted item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2232 +#: erpnext/stock/doctype/item/item.py:853 +msgid "Item {0} is not a template item." +msgstr "" + +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2231 msgid "Item {0} is not active or end of life has been reached" msgstr "" @@ -26478,7 +26723,7 @@ msgstr "" msgid "Item {0} must be a non-stock item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1583 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1582 msgid "Item {0} not found in 'Raw Materials Supplied' table in {1} {2}" msgstr "" @@ -26494,7 +26739,7 @@ msgstr "" msgid "Item {0}: {1} qty produced. " msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1451 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1452 msgid "Item {} does not exist." msgstr "" @@ -26604,7 +26849,7 @@ msgstr "" msgid "Items not found." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1246 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1245 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "" @@ -27504,7 +27749,7 @@ msgstr "" msgid "Length (cm)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:911 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:893 msgid "Less Than Amount" msgstr "" @@ -27645,7 +27890,7 @@ msgstr "" msgid "Linked Location" msgstr "" -#: erpnext/stock/doctype/item/item.py:1029 +#: erpnext/stock/doctype/item/item.py:1099 msgid "Linked with submitted documents" msgstr "" @@ -28040,11 +28285,6 @@ msgstr "" msgid "Maintain Same Rate Throughout Internal Transaction" msgstr "" -#. Label of the maintain_same_rate (Check) field in DocType 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Maintain Same Rate Throughout the Purchase Cycle" -msgstr "" - #. Label of the is_stock_item (Check) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "Maintain Stock" @@ -28056,6 +28296,11 @@ msgstr "" msgid "Maintain same rate throughout sales cycle" msgstr "" +#. Label of the maintain_same_rate (Check) field in DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Maintain same rate throughout the purchase cycle" +msgstr "" + #. Group in Asset's connections #. Label of a Card Break in the Assets Workspace #. Option for the 'Status' (Select) field in DocType 'Workstation' @@ -28275,7 +28520,7 @@ msgstr "" msgid "Make Difference Entry" msgstr "" -#: erpnext/stock/doctype/item/item.js:690 +#: erpnext/stock/doctype/item/item.js:696 msgid "Make Lead Time" msgstr "" @@ -28334,11 +28579,11 @@ msgstr "" msgid "Make project from a template." msgstr "" -#: erpnext/stock/doctype/item/item.js:798 +#: erpnext/stock/doctype/item/item.js:804 msgid "Make {0} Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:800 +#: erpnext/stock/doctype/item/item.js:806 msgid "Make {0} Variants" msgstr "" @@ -28421,8 +28666,8 @@ msgstr "" #. Depreciation Schedule' #. Option for the 'Depreciation Method' (Select) field in DocType 'Asset #. Finance Book' -#. Option for the 'Update frequency of Project' (Select) field in DocType -#. 'Buying Settings' +#. Option for the 'How often should project be updated of Total Purchase Cost +#. ?' (Select) field in DocType 'Buying Settings' #. Option for the '% Complete Method' (Select) field in DocType 'Project' #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json @@ -28481,8 +28726,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:1327 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1343 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1326 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1342 #: 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 @@ -28631,7 +28876,7 @@ msgstr "" msgid "Manufacturing Manager" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2590 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2589 msgid "Manufacturing Quantity is mandatory" msgstr "" @@ -28861,7 +29106,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:114 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1328 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1327 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "" @@ -28932,6 +29177,7 @@ msgstr "" #. Service Item' #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json +#: erpnext/buying/doctype/buying_settings/buying_settings.js:45 #: erpnext/buying/doctype/purchase_order/purchase_order.js:528 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:361 @@ -29038,11 +29284,11 @@ msgstr "" msgid "Material Request Type" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1125 +#: erpnext/selling/doctype/sales_order/sales_order.py:1119 msgid "Material Request already created for the ordered quantity" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1865 +#: erpnext/selling/doctype/sales_order/sales_order.py:1859 msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" @@ -29157,7 +29403,7 @@ msgstr "" msgid "Material Transferred for Manufacturing" msgstr "" -#. Option for the 'Backflush Raw Materials of Subcontract Based On' (Select) +#. Option for the 'Backflush raw materials of subcontract based on' (Select) #. field in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Material Transferred for Subcontract" @@ -29281,11 +29527,11 @@ msgstr "" msgid "Maximum Producible Items" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4109 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4108 msgid "Maximum Samples - {0} can be retained for Batch {1} and Item {2}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4100 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4099 msgid "Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}." msgstr "" @@ -29302,6 +29548,12 @@ msgstr "" msgid "Maximum Value" msgstr "" +#. Description of the 'Max Discount (%)' (Float) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +#, python-format +msgid "Maximum discount % allowed when selling this item. Eg: if set to 20%, a discount greater than 20% cannot be applied in sales transactions." +msgstr "" + #: erpnext/controllers/selling_controller.py:278 msgid "Maximum discount for Item {0} is {1}%" msgstr "" @@ -29627,7 +29879,7 @@ msgstr "" msgid "Min Qty should be greater than Recurse Over Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:952 +#: erpnext/stock/doctype/item/item.js:958 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "" @@ -29683,7 +29935,14 @@ msgstr "" #. Description of the 'Minimum Order Qty' (Float) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json -msgid "Minimum quantity should be as per Stock UOM" +msgid "" +"Minimum quantity should be as per Stock UOM\n" +"\n" +msgstr "" + +#. Description of the 'Safety Stock' (Float) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Minimum stock level to maintain as a buffer. Used to calculate recommended reorder level: Reorder Level = Safety Stock + (Average Daily Consumption × Lead Time)." msgstr "" #. Label of the minute (Text Editor) field in DocType 'Quality Meeting Minutes' @@ -29703,11 +29962,11 @@ msgstr "" msgid "Miscellaneous Expenses" msgstr "" -#: erpnext/controllers/buying_controller.py:723 +#: erpnext/controllers/buying_controller.py:713 msgid "Mismatch" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1452 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1453 msgid "Missing" msgstr "" @@ -29741,7 +30000,7 @@ msgstr "" msgid "Missing Finance Book" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1780 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1779 msgid "Missing Finished Good" msgstr "" @@ -29749,11 +30008,11 @@ msgstr "" msgid "Missing Formula" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1086 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1085 msgid "Missing Item" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:567 +#: erpnext/setup/doctype/employee/employee.py:568 msgid "Missing Parameter" msgstr "" @@ -30041,7 +30300,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:217 +#: erpnext/stock/doctype/item/item.js:233 msgid "Multiple Variants" msgstr "" @@ -30053,7 +30312,7 @@ msgstr "" msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1787 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1786 msgid "Multiple items cannot be marked as finished item" msgstr "" @@ -30132,27 +30391,20 @@ msgstr "" msgid "Naming Series Prefix" msgstr "" -#. Label of the supplier_and_price_defaults_section (Tab Break) field in -#. DocType 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Naming Series and Price Defaults" -msgstr "" - -#: erpnext/selling/doctype/selling_settings/selling_settings.js:38 -msgid "Naming Series for {0}" -msgstr "" - #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:95 msgid "Naming Series is mandatory" msgstr "" +#. Label of the naming_series_details (Small Text) field in DocType 'Buying +#. Settings' #. Label of the naming_series_details (Small Text) field in DocType 'Selling #. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Naming Series options" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:196 +#: erpnext/public/js/utils/naming_series.js:196 msgid "Naming Series updated" msgstr "" @@ -30200,16 +30452,16 @@ msgstr "" msgid "Negative Batch Report" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:624 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:625 msgid "Negative Quantity is not allowed" msgstr "" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1608 -#: erpnext/stock/serial_batch_bundle.py:1542 +#: erpnext/stock/serial_batch_bundle.py:1548 msgid "Negative Stock Error" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:629 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:630 msgid "Negative Valuation Rate is not allowed" msgstr "" @@ -30815,7 +31067,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1574 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1634 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1648 -#: erpnext/stock/doctype/item/item.py:1401 +#: erpnext/stock/doctype/item/item.py:1471 msgid "No Permission" msgstr "" @@ -30873,12 +31125,12 @@ msgstr "" msgid "No Work Orders were created" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:843 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:836 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:929 msgid "No accounting entries for the following warehouses" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:800 +#: erpnext/selling/doctype/sales_order/sales_order.py:794 msgid "No active BOM found for item {0}. Delivery by Serial No cannot be ensured" msgstr "" @@ -30963,7 +31215,7 @@ msgstr "" msgid "No more children on Right" msgstr "" -#: erpnext/selling/doctype/selling_settings/selling_settings.js:56 +#: erpnext/public/js/utils/naming_series.js:385 msgid "No naming series defined" msgstr "" @@ -31121,7 +31373,7 @@ msgstr "" msgid "No stock available for this batch." msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:806 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:807 msgid "No stock ledger entries were created. Please set the quantity or valuation rate for the items properly and try again." msgstr "" @@ -31195,7 +31447,7 @@ msgstr "" msgid "Non-phantom BOM cannot be created for non-stock item {0}." msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:558 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:559 msgid "None of the items have any change in quantity or value." msgstr "" @@ -31288,7 +31540,7 @@ msgstr "" msgid "Not authorized to edit frozen Account {0}" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:301 +#: erpnext/public/js/utils/naming_series.js:326 msgid "Not configured" msgstr "" @@ -31334,7 +31586,7 @@ msgstr "" msgid "Note: This Cost Center is a Group. Cannot make accounting entries against groups." msgstr "" -#: erpnext/stock/doctype/item/item.py:645 +#: erpnext/stock/doctype/item/item.py:678 msgid "Note: To merge the items, create a separate Stock Reconciliation for the old item {0}" msgstr "" @@ -31792,7 +32044,7 @@ msgstr "" 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:1342 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1341 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "" @@ -31936,7 +32188,7 @@ msgstr "" msgid "Open a new ticket" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:395 +#: erpnext/accounts/report/general_ledger/general_ledger.py:403 #: erpnext/public/js/stock_analytics.js:97 msgid "Opening" msgstr "" @@ -32094,11 +32346,19 @@ msgstr "" #. Label of the opening_stock (Float) field in DocType 'Item' #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' -#: erpnext/stock/doctype/item/item.json erpnext/stock/doctype/item/item.py:318 +#: erpnext/stock/doctype/item/item.json erpnext/stock/doctype/item/item.py:335 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Opening Stock" msgstr "" +#: erpnext/stock/doctype/item/item.py:340 +msgid "Opening Stock entry created with zero valuation rate: {0}" +msgstr "" + +#: erpnext/stock/doctype/item/item.py:348 +msgid "Opening Stock entry created: {0}" +msgstr "" + #. Label of the opening_time (Time) field in DocType 'Issue' #: erpnext/support/doctype/issue/issue.json msgid "Opening Time" @@ -32448,7 +32708,7 @@ msgstr "" msgid "Optional. Used with Financial Report Template" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:83 +#: erpnext/public/js/utils/naming_series.js:83 msgid "Optionally, set the number of digits in the series using dot (.) followed by hashes (#). For example, '.####' means that the series will have four digits. Default is five digits." msgstr "" @@ -32585,7 +32845,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:972 +#: erpnext/selling/doctype/sales_order/sales_order.py:966 #: erpnext/setup/doctype/company/company_dashboard.py:23 msgid "Orders" msgstr "" @@ -32792,7 +33052,7 @@ msgstr "" #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/discounted_invoice/discounted_invoice.json #: erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:903 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:885 #: erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.js:300 @@ -32800,7 +33060,8 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:182 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:149 +#: 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:1274 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:289 @@ -32845,7 +33106,7 @@ msgstr "" msgid "Over Billing Allowance (%)" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1355 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1348 msgid "Over Billing Allowance exceeded for Purchase Receipt Item {0} ({1}) by {2}%" msgstr "" @@ -32863,7 +33124,7 @@ msgstr "" msgid "Over Picking Allowance" msgstr "" -#: erpnext/controllers/stock_controller.py:1736 +#: erpnext/controllers/stock_controller.py:1737 msgid "Over Receipt" msgstr "" @@ -33100,7 +33361,6 @@ msgstr "" #: erpnext/accounts/doctype/pos_settings/pos_settings.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/pos_register/pos_register.py:174 -#: erpnext/selling/doctype/selling_settings/selling_settings.js:70 #: erpnext/workspace_sidebar/selling.json msgid "POS Invoice" msgstr "" @@ -33359,7 +33619,7 @@ msgstr "" msgid "Packed Items" msgstr "" -#: erpnext/controllers/stock_controller.py:1570 +#: erpnext/controllers/stock_controller.py:1571 msgid "Packed Items cannot be transferred internally" msgstr "" @@ -33437,7 +33697,6 @@ 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.html:146 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:165 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:201 @@ -33797,10 +34056,6 @@ msgstr "" msgid "Partially Used" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.html:88 -msgid "Particulars" -msgstr "" - #. Option for the 'Billing Status' (Select) field in DocType 'Sales Order' #. Option for the 'Status' (Select) field in DocType 'Purchase Receipt' #: erpnext/selling/doctype/sales_order/sales_order.json @@ -33896,8 +34151,6 @@ msgstr "" #: erpnext/accounts/doctype/unreconcile_payment_entries/unreconcile_payment_entries.json #: 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.html:142 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:65 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1204 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:82 @@ -33905,7 +34158,7 @@ msgstr "" #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:49 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:240 #: erpnext/accounts/report/general_ledger/general_ledger.js:74 -#: erpnext/accounts/report/general_ledger/general_ledger.py:752 +#: erpnext/accounts/report/general_ledger/general_ledger.py:769 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:51 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:161 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js:46 @@ -34019,7 +34272,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/report/general_ledger/general_ledger.js:111 -#: erpnext/accounts/report/general_ledger/general_ledger.py:761 +#: erpnext/accounts/report/general_ledger/general_ledger.py:778 #: erpnext/crm/doctype/contract/contract.json #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/report/address_and_contacts/address_and_contacts.js:22 @@ -34089,7 +34342,7 @@ msgstr "" #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:231 #: erpnext/accounts/report/general_ledger/general_ledger.js:65 -#: erpnext/accounts/report/general_ledger/general_ledger.py:751 +#: erpnext/accounts/report/general_ledger/general_ledger.py:768 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:41 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:157 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js:35 @@ -34361,7 +34614,6 @@ msgstr "" #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:32 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:8 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/selling/doctype/selling_settings/selling_settings.js:69 #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Payment Entry" @@ -34605,7 +34857,7 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1726 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1708 #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_order/payment_order.js:19 #: erpnext/accounts/doctype/payment_order/payment_order.json @@ -34740,7 +34992,6 @@ 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/accounts/report/accounts_receivable/accounts_receivable.html:31 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json @@ -35062,6 +35313,18 @@ msgstr "" msgid "Percentage Allocation should be equal to 100%" msgstr "" +#. Description of the 'Over Billing Allowance (%)' (Float) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Percentage by which over-billing is allowed against a Sales/Purchase Order for this item. If not set, value from Accounts Settings will be used." +msgstr "" + +#. Description of the 'Over Delivery/Receipt Allowance (%)' (Float) field in +#. DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Percentage by which over-delivery or over-receipt is allowed against a Sales/Purchase Order for this item. If not set, value from Stock Settings will be used." +msgstr "" + #. Description of the 'Blanket Order Allowance (%)' (Float) field in DocType #. 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json @@ -35085,6 +35348,9 @@ msgstr "" msgid "Perception Analysis" msgstr "" +#: erpnext/accounts/report/balance_sheet/balance_sheet.html:138 +#: erpnext/accounts/report/cash_flow/cash_flow.html:138 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html:138 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:60 msgid "Period Based On" msgstr "" @@ -35684,7 +35950,7 @@ msgstr "" msgid "Please Set Supplier Group in Buying Settings." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1897 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1879 msgid "Please Specify Account" msgstr "" @@ -35712,7 +35978,7 @@ msgstr "" msgid "Please add a Temporary Opening account in Chart of Accounts" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:170 +#: erpnext/public/js/utils/naming_series.js:170 msgid "Please add at least one naming series." msgstr "" @@ -35736,7 +36002,7 @@ msgstr "" msgid "Please add {1} role to user {0}." msgstr "" -#: erpnext/controllers/stock_controller.py:1747 +#: erpnext/controllers/stock_controller.py:1748 msgid "Please adjust the qty or edit {0} to proceed." msgstr "" @@ -35839,7 +36105,7 @@ msgstr "" msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:673 +#: erpnext/stock/doctype/item/item.py:706 msgid "Please delete Product Bundle {0}, before merging {1} into {2}" msgstr "" @@ -35908,11 +36174,11 @@ msgstr "" msgid "Please enter Approving Role or Approving User" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:679 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:680 msgid "Please enter Batch No" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:972 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:973 msgid "Please enter Cost Center" msgstr "" @@ -35924,7 +36190,7 @@ msgstr "" msgid "Please enter Employee Id of this sales person" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:981 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:982 msgid "Please enter Expense Account" msgstr "" @@ -35969,7 +36235,7 @@ msgstr "" msgid "Please enter Root Type for account- {0}" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:681 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:682 msgid "Please enter Serial No" msgstr "" @@ -36046,7 +36312,7 @@ msgstr "" msgid "Please enter the phone number first" msgstr "" -#: erpnext/controllers/buying_controller.py:1206 +#: erpnext/controllers/buying_controller.py:1196 msgid "Please enter the {schedule_date}." msgstr "" @@ -36106,7 +36372,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone." msgstr "" -#: erpnext/stock/doctype/item/item.js:703 +#: erpnext/stock/doctype/item/item.js:709 msgid "Please mention 'Weight UOM' along with Weight." msgstr "" @@ -36156,12 +36422,12 @@ msgstr "" msgid "Please select Template Type to download template" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:863 +#: erpnext/controllers/taxes_and_totals.py:846 #: erpnext/public/js/controllers/taxes_and_totals.js:813 msgid "Please select Apply Discount On" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1783 +#: erpnext/selling/doctype/sales_order/sales_order.py:1777 msgid "Please select BOM against item {0}" msgstr "" @@ -36169,7 +36435,7 @@ msgstr "" msgid "Please select BOM for Item in Row {0}" msgstr "" -#: erpnext/controllers/buying_controller.py:657 +#: erpnext/controllers/buying_controller.py:647 msgid "Please select BOM in BOM field for Item {item_code}." msgstr "" @@ -36181,7 +36447,7 @@ msgstr "" msgid "Please select Category first" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1508 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1490 #: erpnext/public/js/controllers/accounts.js:94 #: erpnext/public/js/controllers/accounts.js:145 msgid "Please select Charge Type first" @@ -36253,11 +36519,11 @@ msgstr "" msgid "Please select Price List" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1785 +#: erpnext/selling/doctype/sales_order/sales_order.py:1779 msgid "Please select Qty against item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:339 +#: erpnext/stock/doctype/item/item.py:372 msgid "Please select Sample Retention Warehouse in Stock Settings first" msgstr "" @@ -36273,7 +36539,7 @@ msgstr "" msgid "Please select Stock Asset Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1706 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1705 msgid "Please select Subcontracting Order instead of Purchase Order {0}" msgstr "" @@ -36363,7 +36629,7 @@ msgstr "" msgid "Please select a supplier for fetching payments." msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:165 +#: erpnext/public/js/utils/naming_series.js:165 msgid "Please select a transaction." msgstr "" @@ -36387,7 +36653,7 @@ msgstr "" msgid "Please select at least one filter: Item Code, Batch, or Serial No." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:818 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:580 msgid "Please select at least one item to update delivered quantity." msgstr "" @@ -36457,7 +36723,7 @@ msgstr "" msgid "Please select the Multiple Tier Program type for more than one collection rules." msgstr "" -#: erpnext/stock/doctype/item/item.js:365 +#: erpnext/stock/doctype/item/item.js:371 msgid "Please select the Warehouse first" msgstr "" @@ -36486,7 +36752,7 @@ msgstr "" msgid "Please select weekly off day" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1226 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1208 #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:616 msgid "Please select {0} first" msgstr "" @@ -36626,7 +36892,7 @@ msgstr "" msgid "Please set an Address on the Company '%s'" msgstr "" -#: erpnext/controllers/stock_controller.py:921 +#: erpnext/controllers/stock_controller.py:922 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -36670,7 +36936,7 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/controllers/stock_controller.py:780 +#: erpnext/controllers/stock_controller.py:781 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "" @@ -36789,7 +37055,7 @@ msgstr "" msgid "Please specify at least one attribute in the Attributes table" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:619 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:620 msgid "Please specify either Quantity or Valuation Rate or both" msgstr "" @@ -36948,7 +37214,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json #: erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:890 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:872 #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json #: erpnext/accounts/doctype/payment_order/payment_order.json @@ -36973,7 +37239,7 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:65 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:66 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:151 -#: erpnext/accounts/report/general_ledger/general_ledger.py:679 +#: erpnext/accounts/report/general_ledger/general_ledger.py:696 #: erpnext/accounts/report/gross_profit/gross_profit.py:300 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:181 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:200 @@ -37088,7 +37354,7 @@ msgstr "" msgid "Posting Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2540 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2539 msgid "Posting date and posting time is mandatory" msgstr "" @@ -37238,6 +37504,12 @@ msgstr "" msgid "Prevents the automatic reservation of stock quantities from sales orders when processing sales returns." msgstr "" +#. Description of the 'Disable last purchase rate' (Check) field in DocType +#. 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Prevents the system from automatically using the rate from the last purchase transaction when creating new purchase orders or transactions." +msgstr "" + #. Label of the preview (Button) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:267 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -37517,7 +37789,9 @@ msgstr "" msgid "Price per Unit (Stock UOM)" msgstr "" +#. Label of the pricing_tab (Tab Break) field in DocType 'Buying Settings' #. Label of the item_price_tab (Tab Break) field in DocType 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/doctype/supplier/supplier_dashboard.py:13 #: erpnext/selling/doctype/customer/customer_dashboard.py:27 #: erpnext/selling/doctype/selling_settings/selling_settings.json @@ -37750,10 +38024,8 @@ msgid "Print taxes with zero amount" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:383 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:291 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:46 #: erpnext/accounts/report/financial_statements.html:85 -#: erpnext/accounts/report/general_ledger/general_ledger.html:180 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.html:127 msgid "Printed on {0}" msgstr "" @@ -38715,6 +38987,12 @@ msgstr "" msgid "Provisional Profit / Loss (Credit)" msgstr "" +#. Description of the 'Default Provisional Account (Service)' (Link) field in +#. DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Provisional liability account used for service items before invoice is received" +msgstr "" + #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Psi/1000 Feet" @@ -38868,6 +39146,7 @@ msgstr "" #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:53 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_repair_purchase_invoice/asset_repair_purchase_invoice.json +#: erpnext/buying/doctype/buying_settings/buying_settings.js:48 #: erpnext/buying/doctype/purchase_order/purchase_order.js:417 #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:63 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation_list.js:21 @@ -38904,6 +39183,12 @@ msgstr "" msgid "Purchase Invoice Item" msgstr "" +#. Label of the purchase_invoice_settings_section (Section Break) field in +#. DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Purchase Invoice Settings" +msgstr "" + #. Name of a report #. Label of a Link in the Financial Reports Workspace #. Label of a Link in the Buying Workspace @@ -38955,6 +39240,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:237 #: erpnext/accounts/report/purchase_register/purchase_register.py:216 +#: erpnext/buying/doctype/buying_settings/buying_settings.js:47 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:39 @@ -38964,7 +39250,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:939 +#: erpnext/controllers/buying_controller.py:929 #: 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 @@ -39086,7 +39372,7 @@ msgstr "" msgid "Purchase Order {0} is not submitted" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:890 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:948 msgid "Purchase Orders" msgstr "" @@ -39149,6 +39435,7 @@ msgstr "" #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js:22 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:21 #: erpnext/assets/doctype/asset/asset.json +#: erpnext/buying/doctype/buying_settings/buying_settings.js:49 #: erpnext/buying/doctype/purchase_order/purchase_order.js:384 #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:69 #: erpnext/setup/doctype/authorization_rule/authorization_rule.json @@ -39163,7 +39450,7 @@ msgstr "" msgid "Purchase Receipt" msgstr "" -#. Description of the 'Auto Create Purchase Receipt' (Check) field in DocType +#. Description of the 'Auto create Purchase Receipt' (Check) field in DocType #. 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Purchase Receipt (Draft) will be auto-created on submission of Subcontracting Receipt." @@ -40001,7 +40288,7 @@ msgstr "" msgid "Quality Review Objective" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:866 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:832 msgid "Quantities updated successfully." msgstr "" @@ -40311,7 +40598,7 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.js:1191 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json -#: erpnext/selling/doctype/selling_settings/selling_settings.js:65 +#: erpnext/selling/doctype/selling_settings/selling_settings.js:49 #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/workspace_sidebar/selling.json @@ -40892,8 +41179,8 @@ msgstr "" msgid "Raw SQL" msgstr "" -#. Description of the 'Validate Consumed Qty (as per BOM)' (Check) field in -#. DocType 'Buying Settings' +#. Description of the 'Validate consumed quantity (as per BOM)' (Check) field +#. in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Raw materials consumed qty will be validated based on FG BOM required qty" msgstr "" @@ -41742,7 +42029,6 @@ 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.html:156 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1286 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:178 msgid "Remaining Balance" @@ -41793,14 +42079,11 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/print_format/payment_receipt_voucher/payment_receipt_voucher.html:11 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:142 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:204 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:275 +#: 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:1318 -#: erpnext/accounts/report/general_ledger/general_ledger.html:90 -#: erpnext/accounts/report/general_ledger/general_ledger.html:116 -#: erpnext/accounts/report/general_ledger/general_ledger.py:794 +#: erpnext/accounts/report/general_ledger/general_ledger.html:163 +#: erpnext/accounts/report/general_ledger/general_ledger.py:811 #: 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:296 #: erpnext/accounts/report/sales_register/sales_register.py:335 @@ -41839,7 +42122,7 @@ msgstr "" msgid "Remove item if charges is not applicable to that item" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:565 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:566 msgid "Removed items with no change in quantity or value." msgstr "" @@ -41975,6 +42258,8 @@ msgid "" msgstr "" #. Label of the report_date (Date) field in DocType 'Quality Inspection' +#: erpnext/accounts/report/accounts_payable/accounts_payable.html:120 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:121 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:75 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Report Date" @@ -42242,6 +42527,7 @@ msgstr "" #. Quotation Item' #. Label of a Link in the Buying Workspace #. Label of a Workspace Sidebar Item +#: erpnext/buying/doctype/buying_settings/buying_settings.js:46 #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:327 @@ -42519,7 +42805,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/controllers/stock_controller.py:1328 +#: erpnext/controllers/stock_controller.py:1329 msgid "Reserved Batch Conflict" msgstr "" @@ -42623,7 +42909,7 @@ msgstr "" msgid "Reserved Stock for Sub-assembly" msgstr "" -#: erpnext/controllers/buying_controller.py:666 +#: erpnext/controllers/buying_controller.py:656 msgid "Reserved Warehouse is mandatory for the Item {item_code} in Raw Materials supplied." msgstr "" @@ -43124,6 +43410,12 @@ msgstr "" msgid "Revenue" msgstr "" +#. Description of the 'Deferred Revenue Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Revenue received in advance (e.g. annual subscription) is held here and recognized gradually over time" +msgstr "" + #. Label of the reversal_of (Link) field in DocType 'Journal Entry' #: erpnext/accounts/doctype/journal_entry/journal_entry.json msgid "Reversal Of" @@ -43278,10 +43570,7 @@ msgstr "" #. Label of the role_to_override_stop_action (Link) field in DocType 'Accounts #. Settings' -#. Label of the role_to_override_stop_action (Link) field in DocType 'Buying -#. Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Role Allowed to Override Stop Action" msgstr "" @@ -43296,8 +43585,11 @@ msgstr "" msgid "Role allowed to bypass period restrictions." msgstr "" +#. Label of the role_to_override_stop_action (Link) field in DocType 'Buying +#. Settings' #. Label of the role_to_override_stop_action (Link) field in DocType 'Selling #. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Role allowed to override stop action" msgstr "" @@ -43500,8 +43792,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/controllers/stock_controller.py:792 -#: erpnext/controllers/stock_controller.py:807 +#: erpnext/controllers/stock_controller.py:793 +#: erpnext/controllers/stock_controller.py:808 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -43528,11 +43820,11 @@ msgstr "" msgid "Row # {0}: Cannot return more than {1} for Item {2}" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:187 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:188 msgid "Row # {0}: Please add Serial and Batch Bundle for Item {1}" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:206 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:207 msgid "Row # {0}: Please enter quantity for Item {1} as it is not zero." msgstr "" @@ -43558,7 +43850,7 @@ msgstr "" msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "" -#: erpnext/stock/doctype/item/item.py:532 +#: erpnext/stock/doctype/item/item.py:565 msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "" @@ -43763,7 +44055,7 @@ msgstr "" msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/controllers/stock_controller.py:923 +#: erpnext/controllers/stock_controller.py:924 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" @@ -43823,7 +44115,7 @@ msgstr "" msgid "Row #{0}: Item added" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1637 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1636 msgid "Row #{0}: Item {1} cannot be transferred more than {2} against {3} {4}" msgstr "" @@ -43851,7 +44143,7 @@ msgstr "" msgid "Row #{0}: Item {1} is not a Customer Provided Item." msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:762 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:763 msgid "Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it." msgstr "" @@ -43900,7 +44192,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:963 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 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 "" @@ -43925,7 +44217,7 @@ msgstr "" msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "" -#: erpnext/stock/doctype/item/item.py:539 +#: erpnext/stock/doctype/item/item.py:572 msgid "Row #{0}: Please set reorder quantity" msgstr "" @@ -43951,15 +44243,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:1465 +#: erpnext/controllers/stock_controller.py:1466 msgid "Row #{0}: Quality Inspection is required for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1480 +#: erpnext/controllers/stock_controller.py:1481 msgid "Row #{0}: Quality Inspection {1} is not submitted for the item: {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1495 +#: erpnext/controllers/stock_controller.py:1496 msgid "Row #{0}: Quality Inspection {1} was rejected for item {2}" msgstr "" @@ -43990,11 +44282,11 @@ msgstr "" msgid "Row #{0}: Rate must be same as {1}: {2} ({3} / {4})" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1258 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1240 msgid "Row #{0}: Reference Document Type must be one of Purchase Order, Purchase Invoice or Journal Entry" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1244 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1226 msgid "Row #{0}: Reference Document Type must be one of Sales Order, Sales Invoice, Journal Entry or Dunning" msgstr "" @@ -44038,7 +44330,7 @@ msgstr "" msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." msgstr "" -#: erpnext/controllers/stock_controller.py:307 +#: erpnext/controllers/stock_controller.py:308 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -44086,11 +44378,11 @@ msgstr "" 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:1110 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1109 msgid "Row #{0}: Source and Target Warehouse cannot be the same for Material Transfer" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1132 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1131 msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer" msgstr "" @@ -44143,11 +44435,11 @@ 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:320 +#: erpnext/controllers/stock_controller.py:321 msgid "Row #{0}: The batch {1} has already expired." msgstr "" -#: erpnext/stock/doctype/item/item.py:548 +#: erpnext/stock/doctype/item/item.py:581 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "" @@ -44175,7 +44467,7 @@ msgstr "" msgid "Row #{0}: Work Order exists against full or partial quantity of Item {1}" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:100 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:101 msgid "Row #{0}: You cannot use the inventory dimension '{1}' in Stock Reconciliation to modify the quantity or valuation rate. Stock reconciliation with inventory dimensions is intended solely for performing opening entries." msgstr "" @@ -44211,23 +44503,23 @@ msgstr "" msgid "Row #{idx}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor." msgstr "" -#: erpnext/controllers/buying_controller.py:597 +#: erpnext/controllers/buying_controller.py:587 msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "" -#: erpnext/controllers/buying_controller.py:1081 +#: erpnext/controllers/buying_controller.py:1071 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:720 +#: erpnext/controllers/buying_controller.py:710 msgid "Row #{idx}: Received Qty must be equal to Accepted + Rejected Qty for Item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:733 +#: erpnext/controllers/buying_controller.py:723 msgid "Row #{idx}: {field_label} can not be negative for item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:686 +#: erpnext/controllers/buying_controller.py:676 msgid "Row #{idx}: {field_label} is mandatory." msgstr "" @@ -44235,7 +44527,7 @@ msgstr "" msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "" -#: erpnext/controllers/buying_controller.py:1198 +#: erpnext/controllers/buying_controller.py:1188 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "" @@ -44300,7 +44592,7 @@ msgstr "" msgid "Row #{}: {} {} does not exist." msgstr "" -#: erpnext/stock/doctype/item/item.py:1433 +#: erpnext/stock/doctype/item/item.py:1503 msgid "Row #{}: {} {} doesn't belong to Company {}. Please select valid {}." msgstr "" @@ -44316,7 +44608,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:1661 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1660 msgid "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" msgstr "" @@ -44348,7 +44640,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:1322 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1321 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "" @@ -44407,7 +44699,7 @@ msgid "Row {0}: Either Delivery Note Item or Packed Item reference is mandatory. msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1022 -#: erpnext/controllers/taxes_and_totals.py:1395 +#: erpnext/controllers/taxes_and_totals.py:1378 msgid "Row {0}: Exchange Rate is mandatory" msgstr "" @@ -44448,7 +44740,7 @@ msgstr "" msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1561 +#: erpnext/controllers/stock_controller.py:1562 msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "" @@ -44572,7 +44864,7 @@ msgstr "" msgid "Row {0}: Quantity cannot be negative." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1037 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1036 msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})" msgstr "" @@ -44584,11 +44876,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:1674 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1673 msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1552 +#: erpnext/controllers/stock_controller.py:1553 msgid "Row {0}: Target Warehouse is mandatory for internal transfers" msgstr "" @@ -44612,7 +44904,7 @@ 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:3598 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3597 msgid "Row {0}: Transferred quantity cannot be greater than the requested quantity." msgstr "" @@ -44665,7 +44957,7 @@ msgstr "" msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "" -#: erpnext/controllers/buying_controller.py:1063 +#: erpnext/controllers/buying_controller.py:1053 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "" @@ -44719,7 +45011,7 @@ msgstr "" msgid "Rule Description" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:54 +#: erpnext/public/js/utils/naming_series.js:54 msgid "Rules for configuring series" msgstr "" @@ -44806,7 +45098,6 @@ msgid "SO Total Qty" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:26 -#: erpnext/accounts/report/general_ledger/general_ledger.html:60 msgid "STATEMENT OF ACCOUNTS" msgstr "" @@ -44987,7 +45278,7 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation_list.js:22 #: erpnext/selling/doctype/sales_order/sales_order.js:1077 #: erpnext/selling/doctype/sales_order/sales_order_list.js:75 -#: erpnext/selling/doctype/selling_settings/selling_settings.js:67 +#: erpnext/selling/doctype/selling_settings/selling_settings.js:51 #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/setup/workspace/home/home.json @@ -45161,7 +45452,7 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation_dashboard.py:11 #: erpnext/selling/doctype/quotation/quotation_list.js:16 #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/selling/doctype/selling_settings/selling_settings.js:66 +#: erpnext/selling/doctype/selling_settings/selling_settings.js:50 #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py:59 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:13 #: erpnext/selling/report/sales_order_analysis/sales_order_analysis.js:41 @@ -45285,8 +45576,8 @@ msgstr "" 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:1819 -#: erpnext/selling/doctype/sales_order/sales_order.py:1832 +#: erpnext/selling/doctype/sales_order/sales_order.py:1813 +#: erpnext/selling/doctype/sales_order/sales_order.py:1826 msgid "Sales Order {0} is not available for production" msgstr "" @@ -45460,7 +45751,6 @@ msgstr "" #. Label of a Workspace Sidebar Item #: 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.html:137 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:136 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1304 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:120 @@ -45694,7 +45984,7 @@ msgstr "" msgid "Same Item" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:601 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:602 msgid "Same item and warehouse combination already entered." msgstr "" @@ -45731,7 +46021,7 @@ msgstr "" msgid "Sample Size" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4091 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4090 msgid "Sample quantity {0} cannot be more than received quantity {1}" msgstr "" @@ -46098,7 +46388,7 @@ msgstr "" msgid "Select Alternative Items for Sales Order" msgstr "" -#: erpnext/stock/doctype/item/item.js:814 +#: erpnext/stock/doctype/item/item.js:820 msgid "Select Attribute Values" msgstr "" @@ -46322,7 +46612,7 @@ msgstr "" msgid "Select a company" msgstr "" -#: erpnext/stock/doctype/item/item.js:1147 +#: erpnext/stock/doctype/item/item.js:1153 msgid "Select an Item Group." msgstr "" @@ -46338,7 +46628,7 @@ msgstr "" msgid "Select an item from each set to be used in the Sales Order." msgstr "" -#: erpnext/stock/doctype/item/item.js:828 +#: erpnext/stock/doctype/item/item.js:834 msgid "Select at least one value from each of the attributes." msgstr "" @@ -46792,7 +47082,7 @@ msgstr "" msgid "Serial No Reserved" msgstr "" -#: erpnext/stock/doctype/item/item.py:445 +#: erpnext/stock/doctype/item/item.py:478 msgid "Serial No Series Overlap" msgstr "" @@ -47165,7 +47455,7 @@ msgstr "" #: erpnext/projects/doctype/project/project.json #: erpnext/projects/doctype/project_update/project_update.json #: erpnext/projects/doctype/timesheet/timesheet.json -#: erpnext/public/js/utils/naming_series_dialog.js:34 +#: erpnext/public/js/utils/naming_series.js:34 #: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/installation_note/installation_note.json #: erpnext/selling/doctype/quotation/quotation.json @@ -47563,12 +47853,6 @@ msgstr "" msgid "Set Valuation Rate Based on Source Warehouse" msgstr "" -#. Label of the set_valuation_rate_for_rejected_materials (Check) field in -#. DocType 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Set Valuation Rate for Rejected Materials" -msgstr "" - #: erpnext/selling/doctype/sales_order/sales_order.js:264 msgid "Set Warehouse" msgstr "" @@ -47661,6 +47945,12 @@ msgstr "" msgid "Set this value to 0 to disable the feature." msgstr "" +#. Label of the set_valuation_rate_for_rejected_materials (Check) field in +#. DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Set valuation rate for rejected Materials" +msgstr "" + #: erpnext/assets/doctype/asset/asset.py:898 msgid "Set {0} in asset category {1} for company {2}" msgstr "" @@ -48155,7 +48445,7 @@ msgstr "" msgid "Show Barcode Field in Stock Transactions" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.js:193 +#: erpnext/accounts/report/general_ledger/general_ledger.js:199 msgid "Show Cancelled Entries" msgstr "" @@ -48163,7 +48453,7 @@ msgstr "" msgid "Show Completed" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.js:203 +#: erpnext/accounts/report/general_ledger/general_ledger.js:209 msgid "Show Credit / Debit in Company Currency" msgstr "" @@ -48246,7 +48536,7 @@ msgstr "" #. Label of the show_net_values_in_party_account (Check) field in DocType #. 'Process Statement Of Accounts' #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json -#: erpnext/accounts/report/general_ledger/general_ledger.js:198 +#: erpnext/accounts/report/general_ledger/general_ledger.js:204 msgid "Show Net Values in Party Account" msgstr "" @@ -48254,7 +48544,7 @@ msgstr "" msgid "Show Open" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.js:182 +#: erpnext/accounts/report/general_ledger/general_ledger.js:187 msgid "Show Opening Entries" msgstr "" @@ -48267,11 +48557,6 @@ msgstr "" msgid "Show Operations" msgstr "" -#. Label of the show_pay_button (Check) field in DocType 'Buying Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Show Pay Button in Purchase Order Portal" -msgstr "" - #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js:40 msgid "Show Payment Details" msgstr "" @@ -48287,7 +48572,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_payable/accounts_payable.js:136 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:173 -#: erpnext/accounts/report/general_ledger/general_ledger.js:213 +#: erpnext/accounts/report/general_ledger/general_ledger.js:219 msgid "Show Remarks" msgstr "" @@ -48314,7 +48599,7 @@ msgstr "" msgid "Show Variant Attributes" msgstr "" -#: erpnext/stock/doctype/item/item.js:185 +#: erpnext/stock/doctype/item/item.js:201 msgid "Show Variants" msgstr "" @@ -48354,6 +48639,11 @@ msgstr "" msgid "Show only the Immediate Upcoming Term" msgstr "" +#. Label of the show_pay_button (Check) field in DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Show pay button in Purchase Order portal" +msgstr "" + #: erpnext/stock/utils.py:567 msgid "Show pending entries" msgstr "" @@ -48479,7 +48769,7 @@ msgstr "" msgid "Single Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:210 +#: erpnext/stock/doctype/item/item.js:226 msgid "Single Variant" msgstr "" @@ -48630,11 +48920,11 @@ msgstr "" msgid "Source Stock Entry (Manufacture)" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:915 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:914 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:2373 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2372 msgid "Source Stock Entry {0} has no finished goods quantity" msgstr "" @@ -48700,7 +48990,7 @@ msgstr "" msgid "Source and Target Location cannot be same" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:881 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:880 msgid "Source and target warehouse cannot be same for row {0}" msgstr "" @@ -48714,8 +49004,8 @@ msgid "Source of Funds (Liabilities)" msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.py:847 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:864 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:871 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:863 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:870 msgid "Source warehouse is mandatory for row {0}" msgstr "" @@ -48871,8 +49161,8 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:493 -#: erpnext/stock/doctype/item/item.py:267 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2504 +#: erpnext/stock/doctype/item/item.py:276 erpnext/tests/utils.py:283 +#: erpnext/tests/utils.py:2518 msgid "Standard Selling" msgstr "" @@ -48950,9 +49240,12 @@ msgid "Start Timer" msgstr "" #: erpnext/accounts/doctype/financial_report_template/financial_report_engine.py:234 +#: erpnext/accounts/report/balance_sheet/balance_sheet.html:144 +#: erpnext/accounts/report/cash_flow/cash_flow.html:144 #: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:56 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:56 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:17 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html:144 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:81 #: erpnext/public/js/financial_statements.js:422 msgid "Start Year" @@ -49001,6 +49294,14 @@ msgstr "" msgid "Starting position from top edge" msgstr "" +#: erpnext/accounts/report/general_ledger/general_ledger.html:124 +msgid "Statement Of Accounts" +msgstr "" + +#: erpnext/accounts/report/general_ledger/general_ledger.html:145 +msgid "Statement Period" +msgstr "" + #. Label of the status_details (Section Break) field in DocType 'Service Level #. Agreement' #: erpnext/support/doctype/service_level_agreement/service_level_agreement.json @@ -49110,7 +49411,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/quotation_item/quotation_item.json -#: erpnext/stock/doctype/item/item.js:132 +#: erpnext/stock/doctype/item/item.js:148 #: erpnext/stock/doctype/warehouse/warehouse.js:62 #: erpnext/stock/report/stock_balance/stock_balance.json #: erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py:107 @@ -49166,7 +49467,7 @@ msgstr "" msgid "Stock Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1005 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1004 msgid "Stock Entries already created for Work Order {0}: {1}" msgstr "" @@ -49268,7 +49569,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:142 +#: erpnext/stock/doctype/item/item.js:158 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -49310,11 +49611,16 @@ msgstr "" msgid "Stock Ledgers won’t be reposted." msgstr "" -#: erpnext/stock/doctype/batch/batch.js:81 -#: erpnext/stock/doctype/item/item.js:667 +#. Label of the stock_levels_section (Section Break) field in DocType 'Item' +#: erpnext/stock/doctype/batch/batch.js:81 erpnext/stock/doctype/item/item.json msgid "Stock Levels" msgstr "" +#. Label of the stock_levels_html (HTML) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Stock Levels HTML" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:160 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:273 msgid "Stock Liabilities" @@ -49380,7 +49686,7 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:152 +#: erpnext/stock/doctype/item/item.js:168 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -49432,7 +49738,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json -#: erpnext/stock/doctype/item/item.py:636 +#: erpnext/stock/doctype/item/item.py:669 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -49444,7 +49750,7 @@ msgstr "" msgid "Stock Reconciliation Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:636 +#: erpnext/stock/doctype/item/item.py:669 msgid "Stock Reconciliations" msgstr "" @@ -49482,7 +49788,7 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.js:170 #: erpnext/stock/doctype/pick_list/pick_list.js:175 #: erpnext/stock/doctype/stock_entry/stock_entry_dashboard.py:12 -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:739 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:740 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:674 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1237 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1644 @@ -49577,7 +49883,7 @@ msgstr "" #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/item/item.js:414 +#: erpnext/stock/doctype/item/item.js:420 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:675 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -49804,6 +50110,12 @@ msgstr "" msgid "Stock Value by Item Group" msgstr "" +#. Description of the 'Default Inventory Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Stock account where inventory value for this item will be tracked" +msgstr "" + #. Name of a report #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.json msgid "Stock and Account Value Comparison" @@ -49888,7 +50200,7 @@ msgstr "" #: erpnext/setup/doctype/company/company.py:384 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:537 -#: erpnext/stock/doctype/item/item.py:304 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:313 erpnext/tests/utils.py:248 msgid "Stores" msgstr "" @@ -50192,7 +50504,7 @@ msgstr "" msgid "Subcontracting Order" msgstr "" -#. Description of the 'Auto Create Subcontracting Order' (Check) field in +#. Description of the 'Auto create Subcontracting Order' (Check) field in #. DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Subcontracting Order (Draft) will be auto-created on submission of Purchase Order." @@ -50218,7 +50530,7 @@ msgstr "" msgid "Subcontracting Order Supplied Item" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:927 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:985 msgid "Subcontracting Order {0} created." msgstr "" @@ -50307,7 +50619,7 @@ msgstr "" msgid "Subdivision" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:923 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:981 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1116 msgid "Submit Action Failed" msgstr "" @@ -50482,7 +50794,7 @@ msgstr "" msgid "Successfully Set Supplier" msgstr "" -#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:391 msgid "Successfully changed Stock UOM, please redefine conversion factors for new UOM." msgstr "" @@ -50620,6 +50932,9 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/supplier_item/supplier_item.json #: erpnext/accounts/doctype/tax_rule/tax_rule.json +#: erpnext/accounts/report/accounts_payable/accounts_payable.html:113 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:112 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:134 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:60 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js:34 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:189 @@ -50628,6 +50943,7 @@ msgstr "" #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:29 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:37 #: erpnext/assets/doctype/asset/asset.json +#: erpnext/buying/doctype/buying_settings/buying_settings.js:44 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:185 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:270 @@ -50669,8 +50985,8 @@ msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json #: erpnext/stock/doctype/shipment/shipment.json #: erpnext/stock/doctype/stock_entry/stock_entry.json +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.js:8 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:524 -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.js:8 #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/subscription.json @@ -50718,6 +51034,12 @@ msgstr "" msgid "Supplier Contact" msgstr "" +#. Label of the supplier_defaults_section (Section Break) field in DocType +#. 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Supplier Defaults" +msgstr "" + #. Label of the supplier_delivery_note (Data) field in DocType 'Purchase #. Receipt' #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -50811,8 +51133,8 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html:58 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/report/general_ledger/general_ledger.html:110 -#: erpnext/accounts/report/general_ledger/general_ledger.py:789 +#: erpnext/accounts/report/general_ledger/general_ledger.html:202 +#: erpnext/accounts/report/general_ledger/general_ledger.py:806 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:226 msgid "Supplier Invoice No" msgstr "" @@ -50826,11 +51148,6 @@ msgstr "" msgid "Supplier Item" msgstr "" -#. Label of the supplier_items (Table) field in DocType 'Item' -#: erpnext/stock/doctype/item/item.json -msgid "Supplier Items" -msgstr "" - #. Label of the lead_time_days (Int) field in DocType 'Supplier Quotation Item' #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json msgid "Supplier Lead Time (days)" @@ -51097,19 +51414,10 @@ msgstr "" msgid "Supplier {0} not found in {1}" msgstr "" -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:67 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:67 msgid "Supplier(s)" msgstr "" -#. Label of a Link in the Buying Workspace -#. Name of a report -#. Label of a Workspace Sidebar Item -#: erpnext/buying/workspace/buying/buying.json -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.json -#: erpnext/workspace_sidebar/buying.json -msgid "Supplier-Wise Sales Analytics" -msgstr "" - #. Label of the suppliers (Table) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json msgid "Suppliers" @@ -51171,7 +51479,7 @@ msgstr "" msgid "Support Tickets" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:89 +#: erpnext/public/js/utils/naming_series.js:89 msgid "Supported Variables:" msgstr "" @@ -51427,8 +51735,8 @@ msgid "Target Warehouse {0} must be same as Delivery Warehouse {1} in the Subcon msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.py:853 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:860 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:875 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:859 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:874 msgid "Target warehouse is mandatory for row {0}" msgstr "" @@ -51667,10 +51975,6 @@ msgstr "" msgid "Tax Id" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:19 -msgid "Tax Id: " -msgstr "" - #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:32 msgid "Tax Id: {0}" msgstr "" @@ -51901,7 +52205,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:239 -#: erpnext/controllers/taxes_and_totals.py:1266 +#: erpnext/controllers/taxes_and_totals.py:1249 msgid "Taxable Amount" msgstr "" @@ -52060,7 +52364,7 @@ msgstr "" msgid "Taxes and Charges Deducted (Company Currency)" msgstr "" -#: erpnext/stock/doctype/item/item.py:371 +#: erpnext/stock/doctype/item/item.py:404 msgid "Taxes row #{0}: {1} cannot be smaller than {2}" msgstr "" @@ -52442,7 +52746,7 @@ msgstr "" msgid "The BOM which will be replaced" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1539 +#: erpnext/stock/serial_batch_bundle.py:1545 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 "" @@ -52486,7 +52790,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:2825 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2824 msgid "The Process Loss Qty has reset as per job cards Process Loss Qty" msgstr "" @@ -52502,7 +52806,7 @@ msgstr "" 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:1842 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1841 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 "" @@ -52524,7 +52828,7 @@ msgstr "" msgid "The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document." msgstr "" -#: erpnext/controllers/stock_controller.py:1317 +#: erpnext/controllers/stock_controller.py:1318 msgid "The batch {0} is already reserved in {1} {2}. So, cannot proceed with the {3} {4}, which is created against the {5} {6}." msgstr "" @@ -52610,7 +52914,7 @@ msgstr "" msgid "The following cancelled repost entries exist for {0}:

{1}

Kindly delete these entries before continuing." msgstr "" -#: erpnext/stock/doctype/item/item.py:874 +#: erpnext/stock/doctype/item/item.py:944 msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "" @@ -52651,15 +52955,15 @@ msgstr "" msgid "The holiday on {0} is not between From Date and To Date" msgstr "" -#: erpnext/controllers/buying_controller.py:1265 +#: erpnext/controllers/buying_controller.py:1255 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "" -#: erpnext/stock/doctype/item/item.py:638 +#: erpnext/stock/doctype/item/item.py:671 msgid "The items {0} and {1} are present in the following {2} :" msgstr "" -#: erpnext/controllers/buying_controller.py:1258 +#: erpnext/controllers/buying_controller.py:1248 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "" @@ -52741,6 +53045,11 @@ msgstr "" msgid "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units." msgstr "" +#. Description of the 'Last Purchase Rate' (Float) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "The rate at which this item was last purchased via a Purchase Invoice. Auto-updated by the system." +msgstr "" + #: erpnext/public/js/utils.js:967 msgid "The reserved stock will be released when you update items. Are you certain you wish to proceed?" msgstr "" @@ -52798,7 +53107,7 @@ msgstr "" 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 "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:733 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:734 msgid "The stock has been reserved for the following Items and Warehouses, un-reserve the same to {0} the Stock Reconciliation:

{1}" msgstr "" @@ -52812,11 +53121,11 @@ msgstr "" msgid "The system will create a Sales Invoice or a POS Invoice from the POS interface based on this setting. For high-volume transactions, it is recommended to use POS Invoice." msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1028 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1029 msgid "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1039 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1040 msgid "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage" msgstr "" @@ -52884,7 +53193,7 @@ msgstr "" msgid "The {0} contains Unit Price Items." msgstr "" -#: erpnext/stock/doctype/item/item.py:442 +#: erpnext/stock/doctype/item/item.py:475 msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error." msgstr "" @@ -52928,7 +53237,7 @@ msgstr "" msgid "There are no slots available on this date" msgstr "" -#: erpnext/stock/doctype/item/item.js:1171 +#: erpnext/stock/doctype/item/item.js:1177 msgid "There are two options to maintain valuation of stock. FIFO (first in - first out) and Moving Average. To understand this topic in detail please visit
Item Valuation, FIFO and Moving Average." msgstr "" @@ -52960,7 +53269,7 @@ msgstr "" msgid "There is no batch found against the {0}: {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1779 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1778 msgid "There must be atleast 1 Finished Good in this Stock Entry" msgstr "" @@ -52991,11 +53300,11 @@ msgstr "" msgid "This Account has '0' balance in either Base Currency or Account Currency" msgstr "" -#: erpnext/stock/doctype/item/item.js:178 +#: erpnext/stock/doctype/item/item.js:194 msgid "This Item is a Template and cannot be used in transactions.
All fields present in the 'Copy Fields to Variant' table in Item Variant Settings will be copied to its variant items." msgstr "" -#: erpnext/stock/doctype/item/item.js:237 +#: erpnext/stock/doctype/item/item.js:251 msgid "This Item is a Variant of {0} (Template)." msgstr "" @@ -53003,11 +53312,11 @@ msgstr "" msgid "This Month's Summary" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:936 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:994 msgid "This Purchase Order has been fully subcontracted." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:2083 +#: erpnext/selling/doctype/sales_order/sales_order.py:2077 msgid "This Sales Order has been fully subcontracted." msgstr "" @@ -53136,7 +53445,7 @@ msgstr "" msgid "This is enabled by default. If you want to plan materials for sub-assemblies of the Item you're manufacturing leave this enabled. If you plan and manufacture the sub-assemblies separately, you can disable this checkbox." msgstr "" -#: erpnext/stock/doctype/item/item.js:1159 +#: erpnext/stock/doctype/item/item.js:1165 msgid "This is for raw material Items that'll be used to create finished goods. If the Item is an additional service like 'washing' that'll be used in the BOM, keep this unchecked." msgstr "" @@ -53212,6 +53521,11 @@ msgstr "" msgid "This section allows the user to set the Body and Closing text of the Dunning Letter for the Dunning Type based on language, which can be used in Print." msgstr "" +#. Description of the 'Default Supplier' (Link) field in DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "This supplier will be auto-selected in new purchase transactions" +msgstr "" + #: erpnext/stock/doctype/delivery_note/delivery_note.js:502 msgid "This table is used to set details about the 'Item', 'Qty', 'Basic Rate', etc." msgstr "" @@ -53736,7 +54050,7 @@ msgstr "" msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" -#: erpnext/stock/doctype/item/item.py:660 +#: erpnext/stock/doctype/item/item.py:693 msgid "To merge, following properties must be same for both items" msgstr "" @@ -53767,7 +54081,7 @@ msgstr "" #: erpnext/accounts/doctype/financial_report_template/financial_report_engine.py:748 #: erpnext/accounts/report/financial_statements.py:621 -#: erpnext/accounts/report/general_ledger/general_ledger.py:310 +#: erpnext/accounts/report/general_ledger/general_ledger.py:318 #: erpnext/accounts/report/trial_balance/trial_balance.py:310 msgid "To use a different finance book, please uncheck 'Include Default FB Entries'" msgstr "" @@ -53802,7 +54116,11 @@ msgstr "" msgid "Tonne-Force(Metric)" msgstr "" +#: erpnext/accounts/report/balance_sheet/balance_sheet.html:8 +#: erpnext/accounts/report/cash_flow/cash_flow.html:8 #: erpnext/accounts/report/financial_statements.html:6 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.html:8 +#: erpnext/accounts/report/trial_balance/trial_balance.html:8 msgid "Too many columns. Export the report and print it using a spreadsheet application." msgstr "" @@ -53913,7 +54231,7 @@ msgstr "" #: erpnext/selling/page/sales_funnel/sales_funnel.py:167 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:66 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:66 #: erpnext/templates/includes/order/order_taxes.html:54 msgid "Total Amount" msgstr "" @@ -54160,7 +54478,8 @@ msgid "Total Interest" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:199 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:160 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:135 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:135 msgid "Total Invoiced Amount" msgstr "" @@ -54278,17 +54597,20 @@ msgstr "" #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool_dashboard.html:9 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:100 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:79 +#: erpnext/accounts/report/accounts_payable/accounts_payable.html:206 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:204 msgid "Total Outstanding" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:208 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:163 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:138 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:138 msgid "Total Outstanding Amount" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:200 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:161 +#: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.html:136 +#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.html:136 msgid "Total Paid Amount" msgstr "" @@ -54304,7 +54626,7 @@ msgstr "" msgid "Total Payments" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:728 +#: erpnext/selling/doctype/sales_order/sales_order.py:722 msgid "Total Picked Quantity {0} is more than ordered qty {1}. You can set the Over Picking Allowance in Stock Settings." msgstr "" @@ -54336,7 +54658,7 @@ msgstr "" #. Label of the total_qty (Float) field in DocType 'Serial and Batch Bundle' #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:65 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:65 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py:139 msgid "Total Qty" msgstr "" @@ -54683,11 +55005,21 @@ msgstr "" msgid "Track Service Level Agreement" msgstr "" +#. Description of the 'Has Serial No' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Track each unit with a unique serial number for warranty and return tracking. Cannot be changed after a stock transaction exists." +msgstr "" + #. Description of a DocType #: erpnext/accounts/doctype/cost_center/cost_center.json msgid "Track separate Income and Expense for product verticals or divisions." msgstr "" +#. Description of the 'Has Batch No' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Track this item in batches. Cannot be changed after a stock transaction exists." +msgstr "" + #. Label of the tracking_status (Select) field in DocType 'Shipment' #: erpnext/stock/doctype/shipment/shipment.json msgid "Tracking Status" @@ -54712,7 +55044,7 @@ msgstr "" #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/manufacturing/doctype/workstation/workstation_dashboard.py:10 -#: erpnext/public/js/utils/naming_series_dialog.js:218 +#: erpnext/public/js/utils/naming_series.js:219 #: erpnext/selling/doctype/selling_settings/selling_settings.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json @@ -55232,6 +55564,7 @@ msgstr "" #. Label of the stock_uom (Link) field in DocType 'Bin' #. Label of the uom (Link) field in DocType 'Delivery Note Item' #. Label of the uom (Link) field in DocType 'Delivery Stop' +#. Label of the uom_tab (Tab Break) field in DocType 'Item' #. Label of the uom (Link) field in DocType 'Item Barcode' #. Label of the uom (Link) field in DocType 'Item Price' #. Label of the uom (Link) field in DocType 'Material Request Item' @@ -55288,6 +55621,7 @@ msgstr "" #: erpnext/setup/doctype/uom/uom.json erpnext/stock/doctype/bin/bin.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/delivery_stop/delivery_stop.json +#: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_barcode/item_barcode.json #: erpnext/stock/doctype/item_price/item_price.json #: erpnext/stock/doctype/material_request_item/material_request_item.json @@ -55301,11 +55635,11 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:101 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:87 #: erpnext/stock/report/item_prices/item_prices.py:55 +#: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:60 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:94 #: erpnext/stock/report/stock_ageing/stock_ageing.py:184 #: erpnext/stock/report/stock_analytics/stock_analytics.py:59 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:134 -#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:60 #: erpnext/subcontracting/doctype/subcontracting_inward_order_service_item/subcontracting_inward_order_service_item.json #: erpnext/templates/emails/reorder_item.html:11 #: erpnext/templates/includes/rfq/rfq_items.html:17 @@ -55322,6 +55656,12 @@ msgstr "" msgid "UOM Conversion Detail" msgstr "" +#. Label of the uom_conversion_details_column (Column Break) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "UOM Conversion Details" +msgstr "" + #. Label of the conversion_factor (Float) field in DocType 'POS Invoice Item' #. Label of the conversion_factor (Float) field in DocType 'Purchase Invoice #. Item' @@ -55371,7 +55711,7 @@ msgstr "" msgid "UOM Name" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:4013 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:4012 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "" @@ -55379,11 +55719,6 @@ msgstr "" msgid "UOM {0} not found in Item {1}" msgstr "" -#. Label of the uoms (Table) field in DocType 'Item' -#: erpnext/stock/doctype/item/item.json -msgid "UOMs" -msgstr "" - #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "UPC" @@ -55556,16 +55891,10 @@ msgstr "" msgid "Unit of Measure (UOM)" msgstr "" -#: erpnext/stock/doctype/item/item.py:403 +#: erpnext/stock/doctype/item/item.py:436 msgid "Unit of Measure {0} has been entered more than once in Conversion Factor Table" msgstr "" -#. Label of the unit_of_measure_conversion (Section Break) field in DocType -#. 'Item' -#: erpnext/stock/doctype/item/item.json -msgid "Units of Measure" -msgstr "" - #: erpnext/public/js/call_popup/call_popup.js:110 msgid "Unknown Caller" msgstr "" @@ -55735,7 +56064,7 @@ msgstr "" msgid "Unsecured Loans" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1730 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1712 msgid "Unset Matched Payment Request" msgstr "" @@ -55752,10 +56081,6 @@ msgstr "" msgid "Unsupported Feature" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:24 -msgid "Until" -msgstr "" - #. Option for the 'Status' (Select) field in DocType 'Appointment' #: erpnext/crm/doctype/appointment/appointment.json msgid "Unverified" @@ -55954,12 +56279,6 @@ msgstr "" msgid "Update Type" msgstr "" -#. Label of the project_update_frequency (Select) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Update frequency of Project" -msgstr "" - #. Label of the update_latest_price_in_all_boms (Button) field in DocType 'BOM #. Update Tool' #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.json @@ -56000,7 +56319,7 @@ msgstr "" msgid "Updating Costing and Billing fields against this Project..." msgstr "" -#: erpnext/stock/doctype/item/item.py:1417 +#: erpnext/stock/doctype/item/item.py:1487 msgid "Updating Variants..." msgstr "" @@ -56216,6 +56535,17 @@ msgstr "" msgid "Used for Production Plan" msgstr "" +#. Description of the 'Purchase Expense Contra Account' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Used to balance the books when recording extra purchase costs like freight or customs" +msgstr "" + +#. Description of the 'Opening Stock' (Float) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Used to create an opening Stock Entry with the Valuation Rate when the item is saved" +msgstr "" + #. Description of the 'Account Category' (Link) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json msgid "Used with Financial Report Template" @@ -56428,12 +56758,6 @@ msgstr "" msgid "Validate Components and Quantities Per BOM" msgstr "" -#. Label of the validate_consumed_qty (Check) field in DocType 'Buying -#. Settings' -#: erpnext/buying/doctype/buying_settings/buying_settings.json -msgid "Validate Consumed Qty (as per BOM)" -msgstr "" - #. Label of the validate_material_transfer_warehouses (Check) field in DocType #. 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -56457,6 +56781,12 @@ msgstr "" msgid "Validate Stock on Save" msgstr "" +#. Label of the validate_consumed_qty (Check) field in DocType 'Buying +#. Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Validate consumed quantity (as per BOM)" +msgstr "" + #. Label of the validate_selling_price (Check) field in DocType 'Selling #. Settings' #: erpnext/selling/doctype/selling_settings/selling_settings.json @@ -56563,11 +56893,11 @@ msgstr "" msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" -#: erpnext/stock/doctype/item/item.py:288 +#: erpnext/stock/doctype/item/item.py:297 msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:785 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:786 msgid "Valuation Rate required for Item {0} at row {1}" msgstr "" @@ -56577,7 +56907,7 @@ msgstr "" msgid "Valuation and Total" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1005 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1006 msgid "Valuation rate for customer provided items has been set to zero." msgstr "" @@ -56715,13 +57045,13 @@ msgstr "" msgid "Variance ({})" msgstr "" -#: erpnext/stock/doctype/item/item.js:225 +#: erpnext/stock/doctype/item/item.js:241 #: erpnext/stock/doctype/item/item_list.js:22 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" msgstr "" -#: erpnext/stock/doctype/item/item.py:889 +#: erpnext/stock/doctype/item/item.py:959 msgid "Variant Attribute Error" msgstr "" @@ -56740,11 +57070,11 @@ msgstr "" msgid "Variant Based On" msgstr "" -#: erpnext/stock/doctype/item/item.py:917 +#: erpnext/stock/doctype/item/item.py:987 msgid "Variant Based On cannot be changed" msgstr "" -#: erpnext/stock/doctype/item/item.js:201 +#: erpnext/stock/doctype/item/item.js:217 msgid "Variant Details Report" msgstr "" @@ -56758,7 +57088,7 @@ msgstr "" msgid "Variant Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:887 +#: erpnext/stock/doctype/item/item.py:957 msgid "Variant Items" msgstr "" @@ -56769,7 +57099,7 @@ msgstr "" msgid "Variant Of" msgstr "" -#: erpnext/stock/doctype/item/item.js:851 +#: erpnext/stock/doctype/item/item.js:857 msgid "Variant creation has been queued." msgstr "" @@ -57065,6 +57395,10 @@ msgstr "" msgid "Voucher Detail Reference" msgstr "" +#: erpnext/accounts/report/general_ledger/general_ledger.html:160 +msgid "Voucher Details" +msgstr "" + #. Label of the voucher_no (Dynamic Link) field in DocType 'Advance Payment #. Ledger Entry' #. Label of the voucher_no (Dynamic Link) field in DocType 'GL Entry' @@ -57097,7 +57431,7 @@ msgstr "" #: 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 -#: erpnext/accounts/report/general_ledger/general_ledger.py:744 +#: erpnext/accounts/report/general_ledger/general_ledger.py:761 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.js:41 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:33 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:65 @@ -57137,7 +57471,7 @@ msgstr "" #. Label of the voucher_subtype (Small Text) field in DocType 'GL Entry' #: erpnext/accounts/doctype/gl_entry/gl_entry.json -#: erpnext/accounts/report/general_ledger/general_ledger.py:738 +#: erpnext/accounts/report/general_ledger/general_ledger.py:755 msgid "Voucher Subtype" msgstr "" @@ -57168,7 +57502,7 @@ msgstr "" #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1248 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:212 -#: erpnext/accounts/report/general_ledger/general_ledger.py:736 +#: erpnext/accounts/report/general_ledger/general_ledger.py:753 #: 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:158 @@ -57403,7 +57737,7 @@ msgstr "" msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:820 +#: erpnext/controllers/stock_controller.py:821 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 "" @@ -57450,7 +57784,7 @@ msgstr "" #. (Select) field in DocType 'Budget' #. Option for the 'Action if Accumulative Monthly Budget Exceeded on Cumulative #. Expense' (Select) field in DocType 'Budget' -#. Option for the 'Action If Same Rate is Not Maintained' (Select) field in +#. Option for the 'Action if same rate is not maintained' (Select) field in #. DocType 'Buying Settings' #. Option for the 'Action if same rate is not maintained throughout sales #. cycle' (Select) field in DocType 'Selling Settings' @@ -57506,6 +57840,12 @@ msgstr "" msgid "Warn or stop if Item rate is changed in Delivery Notes and Sales Invoices generated from a Sales Order." msgstr "" +#. Description of the 'Maintain same rate throughout the purchase cycle' +#. (Check) field in DocType 'Buying Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json +msgid "Warn or stop if Item rate is changed in Purchase Invoice or Purchase Receipt generated from a Purchase Order." +msgstr "" + #: erpnext/projects/doctype/timesheet_detail/timesheet_detail.py:134 msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "" @@ -57667,7 +58007,7 @@ msgstr "" msgid "Website:" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:95 +#: erpnext/public/js/utils/naming_series.js:95 msgid "Week of the year" msgstr "" @@ -57801,7 +58141,7 @@ msgstr "" msgid "When checked, the system will use the posting datetime of the document for naming the document instead of the creation datetime of the document." msgstr "" -#: erpnext/stock/doctype/item/item.js:1178 +#: erpnext/stock/doctype/item/item.js:1184 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "" @@ -57815,6 +58155,12 @@ msgstr "" 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 "" +#. Description of the 'Deferred Expense Account' (Link) field in DocType 'Item +#. Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "When you pay for something upfront (like annual insurance), the cost is held here and recognized gradually over time" +msgstr "" + #: erpnext/accounts/doctype/account/account.py:380 msgid "While creating account for Child Company {0}, parent account {1} found as a ledger account." msgstr "" @@ -57851,7 +58197,6 @@ msgstr "" msgid "Width of amount in word" msgstr "" -#. Description of the 'UOMs' (Table) field in DocType 'Item' #. Description of the 'Taxes' (Table) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "Will also apply for variants" @@ -58000,7 +58345,7 @@ msgstr "" msgid "Work Order Item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:918 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:917 msgid "Work Order Mismatch" msgstr "" @@ -58062,11 +58407,11 @@ msgstr "" msgid "Work Order {0} created" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2389 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2388 msgid "Work Order {0} has no produced qty" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:955 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:954 msgid "Work Order {0}: Job Card not found for the operation {1}" msgstr "" @@ -58379,11 +58724,11 @@ msgstr "" msgid "Year Start Date" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:92 +#: erpnext/public/js/utils/naming_series.js:92 msgid "Year in 2 digits" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:91 +#: erpnext/public/js/utils/naming_series.js:91 msgid "Year in 4 digits" msgstr "" @@ -58432,7 +58777,7 @@ msgstr "" msgid "You can also set default CWIP account in Company {}" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:87 +#: erpnext/public/js/utils/naming_series.js:87 msgid "You can also use variables in the series name by putting them between (.) dots" msgstr "" @@ -58565,6 +58910,10 @@ msgstr "" msgid "You don't have permission to update Company details. Please contact your System Manager." msgstr "" +#: erpnext/buying/doctype/purchase_order/purchase_order.py:599 +msgid "You don't have permission to update Received Qty DocField for item {0}" +msgstr "" + #: erpnext/controllers/accounts_controller.py:4406 msgid "You don't have permission to update this document. Please contact your System Manager." msgstr "" @@ -58593,7 +58942,7 @@ msgstr "" msgid "You have entered a duplicate Delivery Note on Row" msgstr "" -#: erpnext/stock/doctype/item/item.py:1093 +#: erpnext/stock/doctype/item/item.py:1163 msgid "You have to enable auto re-order in Stock Settings to maintain re-order levels." msgstr "" @@ -58664,8 +59013,11 @@ msgstr "" msgid "Zero quantity" msgstr "" +#. Label of the zero_quantity_line_items_section (Section Break) field in +#. DocType 'Buying Settings' #. Label of the section_break_zero_qty (Section Break) field in DocType #. 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Zero-Quantity Line Items" msgstr "" @@ -58771,7 +59123,7 @@ msgstr "" msgid "fieldname" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:97 +#: erpnext/public/js/utils/naming_series.js:97 msgid "fieldname on the document e.g." msgstr "" @@ -58967,6 +59319,10 @@ msgstr "" msgid "unique e.g. SAVE20 To be used to get discount" msgstr "" +#: erpnext/buying/doctype/purchase_order/purchase_order.py:629 +msgid "updated delivered quantity for item {0} to {1}" +msgstr "" + #: erpnext/accounts/report/budget_variance_report/budget_variance_report.js:9 msgid "variance" msgstr "" @@ -59025,7 +59381,8 @@ msgstr "" msgid "{0} Digest" msgstr "" -#: erpnext/public/js/utils/naming_series_dialog.js:247 +#: erpnext/public/js/utils/naming_series.js:263 +#: erpnext/public/js/utils/naming_series.js:403 msgid "{0} Naming Series" msgstr "" @@ -59045,7 +59402,7 @@ msgstr "" msgid "{0} Request for {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:342 +#: erpnext/stock/doctype/item/item.py:375 msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "" @@ -59150,7 +59507,7 @@ msgid "{0} entered twice in Item Tax" msgstr "" #: erpnext/setup/doctype/item_group/item_group.py:48 -#: erpnext/stock/doctype/item/item.py:473 +#: erpnext/stock/doctype/item/item.py:506 msgid "{0} entered twice {1} in Item Taxes" msgstr "" @@ -59318,11 +59675,11 @@ msgstr "" msgid "{0} payment entries can not be filtered by {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1739 +#: erpnext/controllers/stock_controller.py:1740 msgid "{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}." msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:723 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:724 msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "" @@ -59359,7 +59716,7 @@ msgstr "" msgid "{0} valid serial nos for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:856 +#: erpnext/stock/doctype/item/item.js:862 msgid "{0} variants created." msgstr "" @@ -59524,7 +59881,7 @@ msgstr "" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "" -#: erpnext/controllers/stock_controller.py:952 +#: erpnext/controllers/stock_controller.py:953 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "" @@ -59610,27 +59967,27 @@ msgstr "" msgid "{0}: {1} is a group account." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:993 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:975 msgid "{0}: {1} must be less than {2}" msgstr "" -#: erpnext/controllers/buying_controller.py:1040 +#: erpnext/controllers/buying_controller.py:1030 msgid "{count} Assets created for {item_code}" msgstr "" -#: erpnext/controllers/buying_controller.py:938 +#: erpnext/controllers/buying_controller.py:928 msgid "{doctype} {name} is cancelled or closed." msgstr "" -#: erpnext/controllers/buying_controller.py:649 +#: erpnext/controllers/buying_controller.py:639 msgid "{field_label} is mandatory for sub-contracted {doctype}." msgstr "" -#: erpnext/controllers/stock_controller.py:2146 +#: erpnext/controllers/stock_controller.py:2147 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "" -#: erpnext/controllers/buying_controller.py:746 +#: erpnext/controllers/buying_controller.py:736 msgid "{ref_doctype} {ref_name} is {status}." msgstr "" From 10b409005d5ec1e6f6ea917880a627c2cbd897dd Mon Sep 17 00:00:00 2001 From: sokumon Date: Mon, 18 May 2026 10:09:28 +0530 Subject: [PATCH 38/49] fix: remove parent page (cherry picked from commit e13bd9eaa6cf5bbd07068162e289586982652883) --- .../workspace/financial_reports/financial_reports.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/workspace/financial_reports/financial_reports.json b/erpnext/accounts/workspace/financial_reports/financial_reports.json index 3211845f5ea..5ce20bed642 100644 --- a/erpnext/accounts/workspace/financial_reports/financial_reports.json +++ b/erpnext/accounts/workspace/financial_reports/financial_reports.json @@ -14,7 +14,7 @@ "for_user": "", "hide_custom": 0, "icon": "table", - "idx": 0, + "idx": 1, "indicator_color": "", "is_hidden": 0, "label": "Financial Reports", @@ -266,13 +266,13 @@ "type": "Link" } ], - "modified": "2025-12-24 12:49:25.266357", + "modified": "2026-05-18 09:49:45.138296", "modified_by": "Administrator", "module": "Accounts", "name": "Financial Reports", "number_cards": [], "owner": "Administrator", - "parent_page": "Accounting", + "parent_page": "", "public": 1, "quick_lists": [], "restrict_to_domain": "", From c967792ccb7415a84259731c52864109d90dd7bc Mon Sep 17 00:00:00 2001 From: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com> Date: Mon, 18 May 2026 11:40:40 +0530 Subject: [PATCH 39/49] fix: toast message for item price insert (#55009) (cherry picked from commit ae9c632e3941149ca1aaa7132471359ee2403a56) --- erpnext/stock/get_item_details.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index abf392478c2..5ec61576783 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -1129,7 +1129,7 @@ def insert_item_price(ctx: ItemDetailsCtx): ) item_price.insert() frappe.msgprint( - _("Item Price Added for {0} in Price List {1}").format( + _("Item Price added for {0} in Price List - {1}").format( get_link_to_form("Item", ctx.item_code), ctx.price_list ), alert=True, @@ -1153,9 +1153,10 @@ def insert_item_price(ctx: ItemDetailsCtx): ) item_price.insert() frappe.msgprint( - _("Item Price added for {0} in Price List {1}").format( + _("Item Price added for {0} in Price List - {1}").format( get_link_to_form("Item", ctx.item_code), ctx.price_list - ) + ), + alert=True, ) From 414319daebc207021f0ef3bf500ded3ecd99dcc3 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 18 May 2026 10:26:29 +0530 Subject: [PATCH 40/49] fix: remove sql procedure method from AR report (cherry picked from commit 63a7142b9b9ffaa3c469ff324f0cc0a53a92fcd4) # Conflicts: # erpnext/accounts/doctype/accounts_settings/accounts_settings.json # erpnext/accounts/doctype/accounts_settings/accounts_settings.py # erpnext/patches.txt --- .../accounts_settings/accounts_settings.js | 10 - .../accounts_settings/accounts_settings.json | 12 +- .../accounts_settings/accounts_settings.py | 9 +- .../accounts_receivable.py | 194 ------------------ erpnext/patches.txt | 1 + ...clear_procedures_from_receivable_report.py | 12 ++ 6 files changed, 16 insertions(+), 222 deletions(-) create mode 100644 erpnext/patches/v16_0/clear_procedures_from_receivable_report.py diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.js b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js index 2fda643640b..586db2d1566 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.js +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js @@ -38,16 +38,6 @@ frappe.ui.form.on("Accounts Settings", { add_taxes_from_item_tax_template(frm) { toggle_tax_settings(frm, "add_taxes_from_item_tax_template"); }, - - drop_ar_procedures: function (frm) { - frm.call({ - doc: frm.doc, - method: "drop_ar_sql_procedures", - callback: function (r) { - frappe.show_alert(__("Procedures dropped"), 5); - }, - }); - }, }); function toggle_tax_settings(frm, field_name) { diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 7d0b80c8283..9256138ba63 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -96,7 +96,6 @@ "receivable_payable_fetch_method", "default_ageing_range", "column_break_ntmi", - "drop_ar_procedures", "legacy_section", "ignore_is_opening_check_for_reporting", "tab_break_dpet", @@ -523,7 +522,7 @@ "fieldname": "receivable_payable_fetch_method", "fieldtype": "Select", "label": "Data Fetch Method", - "options": "Buffered Cursor\nUnBuffered Cursor\nRaw SQL" + "options": "Buffered Cursor\nUnBuffered Cursor" }, { "fieldname": "accounts_receivable_payable_tuning_section", @@ -592,13 +591,6 @@ "fieldname": "column_break_ntmi", "fieldtype": "Column Break" }, - { - "depends_on": "eval:doc.receivable_payable_fetch_method == \"Raw SQL\"", - "description": "Drops existing SQL Procedures and Function setup by Accounts Receivable report", - "fieldname": "drop_ar_procedures", - "fieldtype": "Button", - "label": "Drop Procedures" - }, { "default": "0", "fieldname": "fetch_valuation_rate_for_internal_transaction", @@ -725,7 +717,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-04-13 15:30:28.729627", + "modified": "2026-05-18 12:16:33.679345", "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 fa36f1de183..c2255de5495 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -89,7 +89,7 @@ class AccountsSettings(Document): make_payment_via_journal_entry: DF.Check merge_similar_account_heads: DF.Check over_billing_allowance: DF.Currency - receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"] + receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor"] receivable_payable_remarks_length: DF.Int reconciliation_queue_size: DF.Int repost_allowed_types: DF.Table[RepostAllowedTypes] @@ -209,13 +209,6 @@ class AccountsSettings(Document): set_allow_on_submit_for_dimension_fields(doctypes) - @frappe.whitelist() - def drop_ar_sql_procedures(self): - from erpnext.accounts.report.accounts_receivable.accounts_receivable import InitSQLProceduresForAR - - frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.init_procedure_name}") - frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.allocate_procedure_name}") - def toggle_accounting_dimension_sections(hide): accounting_dimension_doctypes = frappe.get_hooks("accounting_dimension_doctypes") diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 4ca1bdcfffb..0cd34e030d6 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -131,8 +131,6 @@ class ReceivablePayableReport: self.fetch_ple_in_buffered_cursor() elif self.ple_fetch_method == "UnBuffered Cursor": self.fetch_ple_in_unbuffered_cursor() - elif self.ple_fetch_method == "Raw SQL": - self.fetch_ple_in_sql_procedures() # Build delivery note map against all sales invoices self.build_delivery_note_map() @@ -323,81 +321,6 @@ class ReceivablePayableReport: row.paid -= amount row.paid_in_account_currency -= amount_in_account_currency - def fetch_ple_in_sql_procedures(self): - self.proc = InitSQLProceduresForAR() - - build_balance = f""" - begin not atomic - declare done boolean default false; - declare rec1 row type of `{self.proc._row_def_table_name}`; - declare ple cursor for {self.ple_query.get_sql()}; - declare continue handler for not found set done = true; - - open ple; - fetch ple into rec1; - while not done do - call {self.proc.init_procedure_name}(rec1); - fetch ple into rec1; - end while; - close ple; - - set done = false; - open ple; - fetch ple into rec1; - while not done do - call {self.proc.allocate_procedure_name}(rec1); - fetch ple into rec1; - end while; - close ple; - end; - """ - frappe.db.sql(build_balance) - - balances = frappe.db.sql( - f"""select - name, - voucher_type, - voucher_no, - party, - party_account `account`, - posting_date, - account_currency, - cost_center, - project, - sum(invoiced) `invoiced`, - sum(paid) `paid`, - sum(credit_note) `credit_note`, - sum(invoiced) - sum(paid) - sum(credit_note) `outstanding`, - sum(invoiced_in_account_currency) `invoiced_in_account_currency`, - sum(paid_in_account_currency) `paid_in_account_currency`, - sum(credit_note_in_account_currency) `credit_note_in_account_currency`, - sum(invoiced_in_account_currency) - sum(paid_in_account_currency) - sum(credit_note_in_account_currency) `outstanding_in_account_currency` - from `{self.proc._voucher_balance_name}` group by name order by posting_date;""", - as_dict=True, - ) - for x in balances: - if self.filters.get("ignore_accounts"): - key = (x.voucher_type, x.voucher_no, x.party) - else: - key = (x.account, x.voucher_type, x.voucher_no, x.party) - - _d = self.build_voucher_dict(x) - for field in [ - "invoiced", - "paid", - "credit_note", - "outstanding", - "invoiced_in_account_currency", - "paid_in_account_currency", - "credit_note_in_account_currency", - "outstanding_in_account_currency", - "cost_center", - "project", - ]: - _d[field] = x.get(field) - - self.voucher_balance[key] = _d - def update_sub_total_row(self, row, party): total_row = self.total_row_map.get(party) @@ -1400,120 +1323,3 @@ def get_party_group_with_children(party, party_groups): frappe.throw(_("{0}: {1} does not exist").format(group_dtype, d)) return list(set(all_party_groups)) - - -class InitSQLProceduresForAR: - """ - Initialize SQL Procedures, Functions and Temporary tables to build Receivable / Payable report - """ - - _varchar_type = get_definition("Data") - _currency_type = get_definition("Currency") - # Temporary Tables - _voucher_balance_name = "_ar_voucher_balance" - _voucher_balance_definition = f""" - create temporary table `{_voucher_balance_name}`( - name {_varchar_type}, - voucher_type {_varchar_type}, - voucher_no {_varchar_type}, - party {_varchar_type}, - party_account {_varchar_type}, - posting_date date, - account_currency {_varchar_type}, - cost_center {_varchar_type}, - project {_varchar_type}, - invoiced {_currency_type}, - paid {_currency_type}, - credit_note {_currency_type}, - invoiced_in_account_currency {_currency_type}, - paid_in_account_currency {_currency_type}, - credit_note_in_account_currency {_currency_type}) engine=memory; - """ - - _row_def_table_name = "_ar_ple_row" - _row_def_table_definition = f""" - create temporary table `{_row_def_table_name}`( - name {_varchar_type}, - account {_varchar_type}, - voucher_type {_varchar_type}, - voucher_no {_varchar_type}, - against_voucher_type {_varchar_type}, - against_voucher_no {_varchar_type}, - party_type {_varchar_type}, - cost_center {_varchar_type}, - project {_varchar_type}, - party {_varchar_type}, - posting_date date, - due_date date, - account_currency {_varchar_type}, - amount {_currency_type}, - amount_in_account_currency {_currency_type}) engine=memory; - """ - - # Procedures - init_procedure_name = "ar_init_tmp_table" - init_procedure_sql = f""" - create procedure ar_init_tmp_table(in ple row type of `{_row_def_table_name}`) - begin - if not exists (select name from `{_voucher_balance_name}` where name = sha1(concat_ws(',', ple.account, ple.against_voucher_type, ple.against_voucher_no, ple.party))) - then - insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.against_voucher_type, ple.against_voucher_no, ple.party)), ple.voucher_type, ple.voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency, ple.cost_center, ple.project, 0, 0, 0, 0, 0, 0); - end if; - end; - """ - - allocate_procedure_name = "ar_allocate_to_tmp_table" - allocate_procedure_sql = f""" - create procedure ar_allocate_to_tmp_table(in ple row type of `{_row_def_table_name}`) - begin - declare invoiced {_currency_type} default 0; - declare invoiced_in_account_currency {_currency_type} default 0; - declare paid {_currency_type} default 0; - declare paid_in_account_currency {_currency_type} default 0; - declare credit_note {_currency_type} default 0; - declare credit_note_in_account_currency {_currency_type} default 0; - - - if ple.amount > 0 then - if (ple.voucher_type in ("Journal Entry", "Payment Entry") and (ple.voucher_no != ple.against_voucher_no)) then - set paid = -1 * ple.amount; - set paid_in_account_currency = -1 * ple.amount_in_account_currency; - else - set invoiced = ple.amount; - set invoiced_in_account_currency = ple.amount_in_account_currency; - end if; - else - - if ple.voucher_type in ("Sales Invoice", "Purchase Invoice") then - if (ple.voucher_no = ple.against_voucher_no) then - set paid = -1 * ple.amount; - set paid_in_account_currency = -1 * ple.amount_in_account_currency; - else - set credit_note = -1 * ple.amount; - set credit_note_in_account_currency = -1 * ple.amount_in_account_currency; - end if; - else - set paid = -1 * ple.amount; - set paid_in_account_currency = -1 * ple.amount_in_account_currency; - end if; - - end if; - - insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.voucher_type, ple.voucher_no, ple.party)), ple.against_voucher_type, ple.against_voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency,'', '', invoiced, paid, 0, invoiced_in_account_currency, paid_in_account_currency, 0); - end; - """ - - def __init__(self): - existing_procedures = frappe.db.get_routines() - - if self.init_procedure_name not in existing_procedures: - frappe.db.sql(self.init_procedure_sql) - - if self.allocate_procedure_name not in existing_procedures: - frappe.db.sql(self.allocate_procedure_sql) - - frappe.db.sql(f"drop table if exists `{self._voucher_balance_name}`") - frappe.db.sql(self._voucher_balance_definition) - - frappe.db.sql(f"drop table if exists `{self._row_def_table_name}`") - frappe.db.sql(self._row_def_table_definition) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index d2f6b7b6c67..e2c7734ff7e 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -481,3 +481,4 @@ erpnext.patches.v16_0.scr_inv_dimension erpnext.patches.v16_0.packed_item_inv_dimen erpnext.patches.v16_0.fix_titles erpnext.patches.v16_0.set_not_applicable_on_german_item_tax_templates +erpnext.patches.v16_0.clear_procedures_from_receivable_report diff --git a/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py b/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py new file mode 100644 index 00000000000..5eaf0f14fc8 --- /dev/null +++ b/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py @@ -0,0 +1,12 @@ +import frappe + + +def execute(): + if frappe.db.get_single_value("Accounts Settings", "receivable_payable_fetch_method") == "Raw SQL": + frappe.db.set_single_value( + "Accounts Settings", "receivable_payable_fetch_method", "UnBuffered Cursor" + ) + + frappe.db.sql("drop function if exists ar_genkey") + frappe.db.sql("drop procedure if exists ar_init_tmp_table") + frappe.db.sql("drop procedure if exists ar_allocate_to_tmp_table") From 9857cc64d679221e8cf365e19500b31320eeecec Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 17:55:05 +0000 Subject: [PATCH 41/49] fix: prevent duplicate task execution and timestamp error in transaction deletion (backport #55021) (#55025) Co-authored-by: Nabin Hait fix: prevent duplicate task execution and timestamp error in transaction deletion (#55021) --- erpnext/setup/doctype/company/company.py | 1 - .../test_transaction_deletion_record.py | 1 - .../transaction_deletion_record.py | 9 +++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index e4e9c24aeaf..dcd6da347c9 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -1085,7 +1085,6 @@ def create_transaction_deletion_request(company): tdr.reload() tdr.submit() - tdr.start_deletion_tasks() frappe.msgprint( _("Transaction Deletion Document {0} has been triggered for company {1}").format( diff --git a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py index 5c716279b89..23683c3d6bb 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/test_transaction_deletion_record.py @@ -396,7 +396,6 @@ def create_and_submit_transaction_deletion_doc(company): tdr.process_in_single_transaction = True tdr.submit() - tdr.start_deletion_tasks() return tdr diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index a76c37e2fee..e77316eb957 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -736,10 +736,11 @@ class TransactionDeletionRecord(Document): self.enqueue_task(task="Clear Notifications") return - company_obj = frappe.get_doc("Company", self.company) - company_obj.total_monthly_sales = 0 - company_obj.sales_monthly_history = None - company_obj.save() + frappe.db.set_value( + "Company", + self.company, + {"total_monthly_sales": 0, "sales_monthly_history": None}, + ) self.db_set("reset_company_default_values_status", "Completed") self.enqueue_task(task="Clear Notifications") From 88706192d758c328c22d0907e3646e2fe2394209 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 09:44:48 +0530 Subject: [PATCH 42/49] fix(stock): update buying amount calculation in gross profit report (backport #55020) (#55024) Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com> fix(stock): update buying amount calculation in gross profit report (#55020) --- .../report/gross_profit/gross_profit.py | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index dfba16a77eb..71af2b9d211 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -812,19 +812,11 @@ class GrossProfitGenerator: return self.calculate_buying_amount_from_sle( row, my_sle, parenttype, parent, row.item_row, item_code ) - elif self.delivery_notes.get((row.parent, row.item_code), None): - # check if Invoice has delivery notes - dn = self.delivery_notes.get((row.parent, row.item_code)) - parenttype, parent, item_row, dn_warehouse = ( - "Delivery Note", - dn["delivery_note"], - dn["item_row"], - dn["warehouse"], - ) - my_sle = self.get_stock_ledger_entries(item_code, dn_warehouse) - return self.calculate_buying_amount_from_sle( - row, my_sle, parenttype, parent, item_row, item_code - ) + elif row.item_row and self.delivery_notes.get(row.item_row): + dn = self.delivery_notes[row.item_row] + if flt(dn.total_qty): + return flt(row.qty) * flt(dn.total_incoming_value) / flt(dn.total_qty) + return flt(row.qty) * self.get_average_buying_rate(row, item_code) elif row.sales_order and row.so_detail: incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code) if incoming_amount: @@ -1076,25 +1068,29 @@ class GrossProfitGenerator: def get_delivery_notes(self): self.delivery_notes = frappe._dict({}) if self.si_list: + from frappe.query_builder.functions import Sum + invoices = [x.parent for x in self.si_list] dni = qb.DocType("Delivery Note Item") delivery_notes = ( qb.from_(dni) .select( - dni.against_sales_invoice.as_("sales_invoice"), - dni.item_code, - dni.warehouse, - dni.parent.as_("delivery_note"), - dni.name.as_("item_row"), + dni.si_detail, + Sum(dni.stock_qty * dni.incoming_rate).as_("total_incoming_value"), + Sum(dni.stock_qty).as_("total_qty"), ) - .where((dni.docstatus == 1) & (dni.against_sales_invoice.isin(invoices))) - .groupby(dni.against_sales_invoice, dni.item_code) - .orderby(dni.creation, order=Order.desc) + .where( + (dni.docstatus == 1) + & (dni.against_sales_invoice.isin(invoices)) + & (dni.si_detail.isnotnull()) + & (dni.si_detail != "") + ) + .groupby(dni.si_detail) .run(as_dict=True) ) for entry in delivery_notes: - self.delivery_notes[(entry.sales_invoice, entry.item_code)] = entry + self.delivery_notes[entry.si_detail] = entry def group_items_by_invoice(self): """ From 42f6cb40d17f8a6879b56c61a539a32e6a9f78b2 Mon Sep 17 00:00:00 2001 From: ervishnucs Date: Wed, 6 May 2026 17:08:27 +0530 Subject: [PATCH 43/49] fix: normalize date comparison to avoid datatype mismatch (cherry picked from commit 01e382b1068db6940e142bec0dcebb70eb4e0f59) --- erpnext/accounts/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 9cc7aca9fc1..120d6bb2c96 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -677,7 +677,7 @@ def validate_due_date_with_template(posting_date, due_date, bill_date, template_ if not default_due_date: return - if default_due_date != posting_date and getdate(due_date) > getdate(default_due_date): + if getdate(default_due_date) != getdate(posting_date) and getdate(due_date) > getdate(default_due_date): if frappe.get_single_value("Accounts Settings", "credit_controller") in frappe.get_roles(): party_type = "supplier" if doctype == "Purchase Invoice" else "customer" From 0b3344bad9863220bfe57dbaf86f078e33e32e19 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 19 May 2026 13:23:32 +0530 Subject: [PATCH 44/49] fix: stock balance showing incorrect value because of incorrect SLE (cherry picked from commit 94b95d6c2f9f6f8262ced0018d26d979aa17844c) --- erpnext/stock/stock_ledger.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index cfad2e98cc6..2fe966d1202 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -2433,7 +2433,9 @@ def get_stock_value_difference( ) if voucher_detail_no: - query = query.where(table.voucher_detail_no != voucher_detail_no) + query = query.where( + (table.voucher_detail_no != voucher_detail_no) | (table.voucher_detail_no.isnull()) + ) elif voucher_no: query = query.where(table.voucher_no != voucher_no) From 0df959191013f638c2a6b9fa29b067602986c046 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 19 May 2026 16:12:25 +0530 Subject: [PATCH 45/49] fix(patch): drop dead procedures first before other changes (cherry picked from commit 61d24ba55f33e0d12f9956bc3311bc6c6740249d) --- .../v16_0/clear_procedures_from_receivable_report.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py b/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py index 5eaf0f14fc8..c362d4ef605 100644 --- a/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py +++ b/erpnext/patches/v16_0/clear_procedures_from_receivable_report.py @@ -2,11 +2,11 @@ import frappe def execute(): + frappe.db.sql("drop function if exists ar_genkey") + frappe.db.sql("drop procedure if exists ar_init_tmp_table") + frappe.db.sql("drop procedure if exists ar_allocate_to_tmp_table") + if frappe.db.get_single_value("Accounts Settings", "receivable_payable_fetch_method") == "Raw SQL": frappe.db.set_single_value( "Accounts Settings", "receivable_payable_fetch_method", "UnBuffered Cursor" ) - - frappe.db.sql("drop function if exists ar_genkey") - frappe.db.sql("drop procedure if exists ar_init_tmp_table") - frappe.db.sql("drop procedure if exists ar_allocate_to_tmp_table") From 4015c2b9a4095f23726e588dd1610be5ee0cc3b9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 11:29:17 +0000 Subject: [PATCH 46/49] fix: validate company region in uae vat 201 (backport #54899) (#55055) Co-authored-by: Ravibharathi <131471282+ravibharathi656@users.noreply.github.com> fix: validate company region in uae vat 201 (#54899) --- .../regional/report/uae_vat_201/test_uae_vat_201.py | 8 ++++++++ erpnext/regional/report/uae_vat_201/uae_vat_201.js | 7 +++++++ erpnext/regional/report/uae_vat_201/uae_vat_201.py | 12 ++++++++++++ 3 files changed, 27 insertions(+) diff --git a/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py index fd4c69e8f8a..9b892491868 100644 --- a/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py +++ b/erpnext/regional/report/uae_vat_201/test_uae_vat_201.py @@ -6,6 +6,7 @@ import erpnext from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.regional.report.uae_vat_201.uae_vat_201 import ( + execute, get_exempt_total, get_standard_rated_expenses_tax, get_standard_rated_expenses_total, @@ -32,6 +33,13 @@ class TestUaeVat201(ERPNextTestSuite): make_item("_Test UAE VAT Zero Rated Item", properties={"is_zero_rated": 1, "is_exempt": 0}) make_item("_Test UAE VAT Exempt Item", properties={"is_zero_rated": 0, "is_exempt": 1}) + def test_validate_company_region(self): + self.assertRaises( + frappe.exceptions.ValidationError, + execute, + {"company": "_Test Company"}, + ) + def test_uae_vat_201_report(self): make_sales_invoices() create_purchase_invoices() diff --git a/erpnext/regional/report/uae_vat_201/uae_vat_201.js b/erpnext/regional/report/uae_vat_201/uae_vat_201.js index 49060fdf66a..e62d3395f20 100644 --- a/erpnext/regional/report/uae_vat_201/uae_vat_201.js +++ b/erpnext/regional/report/uae_vat_201/uae_vat_201.js @@ -10,6 +10,13 @@ frappe.query_reports["UAE VAT 201"] = { options: "Company", reqd: 1, default: frappe.defaults.get_user_default("Company"), + get_query: function () { + return { + filters: { + country: "United Arab Emirates", + }, + }; + }, }, { fieldname: "from_date", diff --git a/erpnext/regional/report/uae_vat_201/uae_vat_201.py b/erpnext/regional/report/uae_vat_201/uae_vat_201.py index fa4b2dc6693..4942bc4801f 100644 --- a/erpnext/regional/report/uae_vat_201/uae_vat_201.py +++ b/erpnext/regional/report/uae_vat_201/uae_vat_201.py @@ -5,13 +5,25 @@ import frappe from frappe import _ +from erpnext import get_region + def execute(filters=None): + validate_company_region(filters) columns = get_columns() data, emirates, amounts_by_emirate = get_data(filters) return columns, data +def validate_company_region(filters): + if filters.get("company") and get_region(filters.get("company")) != "United Arab Emirates": + frappe.throw( + _( + "The company {0} is not in United Arab Emirates. UAE VAT 201 report is only available for companies in United Arab Emirates." + ).format(frappe.bold(filters.get("company"))) + ) + + def get_columns(): """Creates a list of dictionaries that are used to generate column headers of the data table.""" return [ From 68a5eae3ffa0976bd80f558417f8a0876f028a8e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 23:34:44 +0530 Subject: [PATCH 47/49] fix: warn when accounting dimension fieldname conflicts with existing fields (backport #55036) (#55062) Co-authored-by: Nabin Hait fix: warn when accounting dimension fieldname conflicts with existing fields (#55036) --- .../accounting_dimension.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 549449cce42..6dac47c085b 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -43,6 +43,7 @@ class AccountingDimension(Document): def validate(self): self.validate_doctype() validate_column_name(self.fieldname) + self.validate_fieldname_conflict() self.validate_dimension_defaults() def validate_doctype(self): @@ -74,6 +75,27 @@ class AccountingDimension(Document): message += _("Please create a new Accounting Dimension if required.") frappe.throw(message) + def validate_fieldname_conflict(self): + conflicting_doctypes = [] + for doctype in get_doctypes_with_dimensions(): + meta = frappe.get_meta(doctype, cached=False) + if any(f.fieldname == self.fieldname for f in meta.get("fields")): + conflicting_doctypes.append(doctype) + + if conflicting_doctypes: + frappe.msgprint( + _( + "Fieldname {0} already exists in the following doctypes: {1}. " + "A separate dimension field will not be added to these doctypes. " + "GL Entries will use the value of the existing field as the dimension value." + ).format( + frappe.bold(self.fieldname), + ", ".join(frappe.bold(d) for d in conflicting_doctypes), + ), + title=_("Fieldname Conflict"), + indicator="orange", + ) + def validate_dimension_defaults(self): companies = [] for default in self.get("dimension_defaults"): From f272d32f80a0672199570aafc211d802a2329805 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 00:37:14 +0530 Subject: [PATCH 48/49] fix: handle None delivery_date when sorting MPS data (backport #55028) (#55059) Co-authored-by: Nabin Hait fix: handle None delivery_date when sorting MPS data (#55028) --- .../master_production_schedule/master_production_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py b/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py index 9698bd8eb49..d541c5e19ea 100644 --- a/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py +++ b/erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.py @@ -292,7 +292,7 @@ class MasterProductionSchedule(Document): return item_wise_data def add_mps_data(self, data): - data = frappe._dict(sorted(data.items(), key=lambda x: x[0][1])) + data = frappe._dict(sorted(data.items(), key=lambda x: x[0][1] or "")) for key in data: row = data[key] From 1941c3b136f3d328ebcbe821fe2507d36e24f25b Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 00:37:32 +0530 Subject: [PATCH 49/49] fix: use route_options for Credit Note and Debit Note sidebar links (backport #55026) (#55063) Co-authored-by: Nabin Hait fix: use route_options for Credit Note and Debit Note sidebar links (#55026) --- erpnext/workspace_sidebar/invoicing.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/workspace_sidebar/invoicing.json b/erpnext/workspace_sidebar/invoicing.json index 0c4a5a8c369..b6ff0c790e2 100644 --- a/erpnext/workspace_sidebar/invoicing.json +++ b/erpnext/workspace_sidebar/invoicing.json @@ -80,14 +80,13 @@ { "child": 1, "collapsible": 1, - "filters": "[[\"Sales Invoice\",\"is_return\",\"=\",1]]", "icon": "", "indent": 0, "keep_closed": 0, "label": "Credit Note", "link_to": "Sales Invoice", "link_type": "DocType", - "route_options": "", + "route_options": "{\"is_return\": 1}", "show_arrow": 0, "type": "Link" }, @@ -139,12 +138,12 @@ { "child": 1, "collapsible": 1, - "filters": "[[\"Purchase Invoice\",\"is_return\",\"=\",1]]", "indent": 0, "keep_closed": 0, "label": "Debit Note", "link_to": "Purchase Invoice", "link_type": "DocType", + "route_options": "{\"is_return\": 1}", "show_arrow": 0, "type": "Link" },