From 10be8f19e211fd7fa5b420dcee9d0f62b065d817 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 14:32:08 +0000 Subject: [PATCH 01/78] fix(asset): handle partial asset sales by splitting remaining quantity (backport #51363) (#52394) * fix(asset): handle partial asset sales by splitting remaining quantity (cherry picked from commit 9a2710b9d7f82e17f83303b2b382f11912f8fae3) * fix: refactor older testcases (cherry picked from commit a88fe2ecab9d35ab4a483c63f4df3f6aa8eefc2c) * test: validate asset partial sales (cherry picked from commit 9eeccb765d715d4858dbb75c53d0a01bffcd1f56) # Conflicts: # erpnext/assets/doctype/asset/test_asset.py * fix(asset): skip purchase document validation while splitting existing asset (cherry picked from commit e7e656779299f9e339ffdd440d3e964762c1a03d) * fix(asset): handle same asset being sold in multiple line items in sales invoice (cherry picked from commit 23b094f151ab606f52142ff2789ad80fb97b574c) * test: validate asset split for auto created asset from purchase voucher (cherry picked from commit 4adeaedfde19abe617e63c22a2bfd4dcc34b621b) # Conflicts: # erpnext/assets/doctype/asset/test_asset.py * fix: use new_asset instead of asset_doc when checking values after splitting (cherry picked from commit ca97f340923fb53cf1c078bc349cbdc170f5c8bc) * fix: remove the redundant purchase receipt submit (cherry picked from commit eeb6d0e9bf1e6a2d202996bf80a5a37194fc9a18) * chore: fix conflict --------- Co-authored-by: Navin-S-R --- .../doctype/sales_invoice/sales_invoice.py | 48 +++++++ erpnext/assets/doctype/asset/asset.js | 81 ++++++++--- erpnext/assets/doctype/asset/asset.py | 8 +- erpnext/assets/doctype/asset/test_asset.py | 130 +++++++++++++++++- .../doctype/asset_repair/test_asset_repair.py | 4 +- 5 files changed, 249 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index a87ad06564e..b6261cc5707 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -33,6 +33,7 @@ from erpnext.accounts.utils import ( get_account_currency, update_voucher_outstanding, ) +from erpnext.assets.doctype.asset.asset import split_asset from erpnext.assets.doctype.asset.depreciation import ( depreciate_asset, get_gl_entries_on_asset_disposal, @@ -480,6 +481,8 @@ class SalesInvoice(SellingController): self.update_stock_reservation_entries() self.update_stock_ledger() + self.split_asset_based_on_sale_qty() + self.process_asset_depreciation() # this sequence because outstanding may get -ve @@ -1402,6 +1405,51 @@ class SalesInvoice(SellingController): ): throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) + def split_asset_based_on_sale_qty(self): + asset_qty_map = self.get_asset_qty() + for asset, qty in asset_qty_map.items(): + if qty["actual_qty"] < qty["sale_qty"]: + frappe.throw( + _( + "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." + ).format(asset, qty["actual_qty"]) + ) + + remaining_qty = qty["actual_qty"] - qty["sale_qty"] + if remaining_qty > 0: + split_asset(asset, remaining_qty) + + def get_asset_qty(self): + asset_qty_map = {} + + assets = {row.asset for row in self.items if row.is_fixed_asset and row.asset} + if not assets or self.is_return: + return asset_qty_map + + asset_actual_qty = dict( + frappe.db.get_all( + "Asset", + {"name": ["in", list(assets)]}, + ["name", "asset_quantity"], + as_list=True, + ) + ) + for row in self.items: + if row.is_fixed_asset and row.asset: + actual_qty = asset_actual_qty.get(row.asset) + if row.asset in asset_qty_map.keys(): + asset_qty_map[row.asset]["sale_qty"] += flt(row.qty) + else: + asset_qty_map.setdefault( + row.asset, + { + "sale_qty": flt(row.qty), + "actual_qty": flt(actual_qty), + }, + ) + + return asset_qty_map + def process_asset_depreciation(self): if (self.is_return and self.docstatus == 2) or (not self.is_return and self.docstatus == 1): self.depreciate_asset_on_sale() diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 1397b23f39b..28add7cb35d 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -111,7 +111,7 @@ frappe.ui.form.on("Asset", { frm.add_custom_button( __("Sell Asset"), function () { - frm.trigger("make_sales_invoice"); + frm.trigger("sell_asset"); }, __("Manage") ); @@ -523,22 +523,6 @@ frappe.ui.form.on("Asset", { } }, - make_sales_invoice: function (frm) { - frappe.call({ - args: { - asset: frm.doc.name, - item_code: frm.doc.item_code, - company: frm.doc.company, - serial_no: frm.doc.serial_no, - }, - method: "erpnext.assets.doctype.asset.asset.make_sales_invoice", - callback: function (r) { - var doclist = frappe.model.sync(r.message); - frappe.set_route("Form", doclist[0].doctype, doclist[0].name); - }, - }); - }, - create_asset_maintenance: function (frm) { frappe.call({ args: { @@ -587,6 +571,69 @@ frappe.ui.form.on("Asset", { }); }, + sell_asset: function (frm) { + const make_sales_invoice = (sell_qty) => { + frappe.call({ + method: "erpnext.assets.doctype.asset.asset.make_sales_invoice", + args: { + asset: frm.doc.name, + item_code: frm.doc.item_code, + company: frm.doc.company, + serial_no: frm.doc.serial_no, + sell_qty: sell_qty, + }, + callback: function (r) { + var doclist = frappe.model.sync(r.message); + frappe.set_route("Form", doclist[0].doctype, doclist[0].name); + }, + }); + }; + + let dialog = new frappe.ui.Dialog({ + title: __("Sell Asset"), + fields: [ + { + fieldname: "sell_qty", + fieldtype: "Int", + label: __("Sell Qty"), + reqd: 1, + }, + ], + }); + + dialog.set_primary_action(__("Sell"), function () { + const dialog_data = dialog.get_values(); + const sell_qty = cint(dialog_data.sell_qty); + const asset_qty = cint(frm.doc.asset_quantity); + + if (sell_qty <= 0) { + frappe.throw(__("Sell quantity must be greater than zero")); + } + + if (sell_qty > asset_qty) { + frappe.throw(__("Sell quantity cannot exceed the asset quantity")); + } + + if (sell_qty < asset_qty) { + frappe.confirm( + __( + "The sell quantity is less than the total asset quantity. The remaining quantity will be split into a new asset. This action cannot be undone.

Do you want to continue?" + ), + () => { + make_sales_invoice(sell_qty); + dialog.hide(); + } + ); + return; + } + + make_sales_invoice(sell_qty); + dialog.hide(); + }); + + dialog.show(); + }, + split_asset: function (frm) { const title = __("Split Asset"); diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 722f8d12146..42c8e9f9dfa 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -484,6 +484,9 @@ class Asset(AccountsController): frappe.throw(_("Available-for-use Date should be after purchase date")) def validate_linked_purchase_documents(self): + if self.flags.is_split_asset: + return + for fieldname, doctype in [ ("purchase_receipt", "Purchase Receipt"), ("purchase_invoice", "Purchase Invoice"), @@ -1085,7 +1088,7 @@ def get_asset_naming_series(): @frappe.whitelist() -def make_sales_invoice(asset, item_code, company, serial_no=None, posting_date=None): +def make_sales_invoice(asset, item_code, company, sell_qty, serial_no=None): asset_doc = frappe.get_doc("Asset", asset) si = frappe.new_doc("Sales Invoice") si.company = company @@ -1100,7 +1103,7 @@ def make_sales_invoice(asset, item_code, company, serial_no=None, posting_date=N "income_account": disposal_account, "serial_no": serial_no, "cost_center": depreciation_cost_center, - "qty": 1, + "qty": sell_qty, }, ) @@ -1380,6 +1383,7 @@ def process_asset_split(existing_asset, split_qty, splitted_asset=None, is_new_a scaling_factor = flt(split_qty) / flt(existing_asset.asset_quantity) new_asset = frappe.copy_doc(existing_asset) if is_new_asset else splitted_asset asset_doc = new_asset if is_new_asset else existing_asset + asset_doc.flags.is_split_asset = True set_split_asset_values(asset_doc, scaling_factor, split_qty, existing_asset, is_new_asset) log_asset_activity(existing_asset, asset_doc, splitted_asset, is_new_asset) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index c7c8579a707..6733a7f89e3 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -330,7 +330,9 @@ class TestAsset(AssetSetup): post_depreciation_entries(date=add_months(purchase_date, 2)) - si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company") + si = make_sales_invoice( + asset=asset.name, item_code="Macbook Pro", company="_Test Company", sell_qty=asset.asset_quantity + ) si.customer = "_Test Customer" si.due_date = date si.get("items")[0].rate = 25000 @@ -458,7 +460,9 @@ class TestAsset(AssetSetup): post_depreciation_entries(date="2021-01-01") - si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company") + si = make_sales_invoice( + asset=asset.name, item_code="Macbook Pro", company="_Test Company", sell_qty=asset.asset_quantity + ) si.customer = "_Test Customer" si.due_date = nowdate() si.get("items")[0].rate = 25000 @@ -698,6 +702,128 @@ class TestAsset(AssetSetup): frappe.db.set_value("Asset Category Account", name, "capital_work_in_progress_account", cwip_acc) frappe.db.get_value("Company", "_Test Company", "capital_work_in_progress_account", cwip_acc) + def test_partial_asset_sale(self): + date = nowdate() + purchase_date = add_months(get_first_day(date), -2) + depreciation_start_date = add_months(get_last_day(date), -2) + + # create an asset + asset = create_asset( + item_code="Macbook Pro", + is_existing_asset=1, + calculate_depreciation=1, + available_for_use_date=purchase_date, + purchase_date=purchase_date, + depreciation_start_date=depreciation_start_date, + net_purchase_amount=1000000.0, + purchase_amount=1000000.0, + asset_quantity=10, + total_number_of_depreciations=12, + frequency_of_depreciation=1, + submit=1, + ) + asset_depr_schedule_before_sale = get_asset_depr_schedule_doc(asset.name, "Active") + post_depreciation_entries(date) + asset.reload() + + # check asset values before sale + self.assertEqual(asset.asset_quantity, 10) + self.assertEqual(asset.net_purchase_amount, 1000000) + self.assertEqual(asset.status, "Partially Depreciated") + self.assertEqual( + asset_depr_schedule_before_sale.depreciation_schedule[0].get("depreciation_amount"), 83333.33 + ) + + # make a partial sales against the asset + si = make_sales_invoice( + asset=asset.name, item_code="Macbook Pro", company="_Test Company", sell_qty=5 + ) + si.customer = "_Test Customer" + si.due_date = date + si.get("items")[0].rate = 25000 + si.insert() + si.submit() + + asset.reload() + asset_depr_schedule_after_sale = get_asset_depr_schedule_doc(asset.name, "Active") + + # check asset values after sales + self.assertEqual(asset.asset_quantity, 5) + self.assertEqual(asset.net_purchase_amount, 500000) + self.assertEqual(asset.status, "Sold") + self.assertEqual( + asset_depr_schedule_after_sale.depreciation_schedule[0].get("depreciation_amount"), 41666.66 + ) + + def test_asset_splitting_for_non_existing_asset(self): + date = nowdate() + purchase_date = add_months(get_first_day(date), -2) + depreciation_start_date = add_months(get_last_day(date), -2) + + asset_qty = 10 + asset_rate = 100000.0 + asset_item = "Macbook Pro" + asset_location = "Test Location" + + frappe.db.set_value("Item", asset_item, "is_grouped_asset", 1) + + # Inward asset via Purchase Receipt + pr = make_purchase_receipt( + item_code="Macbook Pro", + posting_date=purchase_date, + qty=asset_qty, + rate=asset_rate, + location=asset_location, + supplier="_Test Supplier", + ) + + asset = frappe.db.get_value("Asset", {"purchase_receipt": pr.name, "docstatus": 0}, "name") + asset_doc = frappe.get_doc("Asset", asset) + asset_doc.calculate_depreciation = 1 + asset_doc.available_for_use_date = purchase_date + asset_doc.location = asset_location + asset_doc.append( + "finance_books", + { + "expected_value_after_useful_life": 0, + "depreciation_method": "Straight Line", + "total_number_of_depreciations": 12, + "frequency_of_depreciation": 1, + "depreciation_start_date": depreciation_start_date, + }, + ) + asset_doc.submit() + + # check asset values before splitting + asset_depr_schedule_before_splitting = get_asset_depr_schedule_doc(asset_doc.name, "Active") + self.assertEqual(asset_doc.asset_quantity, 10) + self.assertEqual(asset_doc.net_purchase_amount, 1000000) + self.assertEqual( + asset_depr_schedule_before_splitting.depreciation_schedule[0].get("depreciation_amount"), 83333.33 + ) + + # initate asset split + new_asset = split_asset(asset_doc.name, 5) + asset_doc.reload() + asset_depr_schedule_after_sale = get_asset_depr_schedule_doc(asset_doc.name, "Active") + new_asset_depr_schedule = get_asset_depr_schedule_doc(new_asset.name, "Active") + + # check asset values after splitting + self.assertEqual(asset_doc.asset_quantity, 5) + self.assertEqual(asset_doc.net_purchase_amount, 500000) + self.assertEqual( + asset_depr_schedule_after_sale.depreciation_schedule[0].get("depreciation_amount"), 41666.66 + ) + + # check new asset values after splitting + self.assertEqual(new_asset.asset_quantity, 5) + self.assertEqual(new_asset.net_purchase_amount, 500000) + self.assertEqual( + new_asset_depr_schedule.depreciation_schedule[0].get("depreciation_amount"), 41666.66 + ) + + frappe.db.set_value("Item", asset_item, "is_grouped_asset", 0) + class TestDepreciationMethods(AssetSetup): def test_schedule_for_straight_line_method(self): diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py index 15ceb51648b..d085a4c6e4b 100644 --- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py +++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py @@ -51,7 +51,9 @@ class TestAssetRepair(IntegrationTestCase): submit=1, ) - si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company") + si = make_sales_invoice( + asset=asset.name, item_code="Macbook Pro", company="_Test Company", sell_qty=asset.asset_quantity + ) si.customer = "_Test Customer" si.due_date = date si.get("items")[0].rate = 25000 From 66d1b7c837977a64898edc34909fb1ff998723a9 Mon Sep 17 00:00:00 2001 From: Markus Lobedann Date: Tue, 17 Feb 2026 12:46:30 +0100 Subject: [PATCH 02/78] fix: bug with comparison regarding `None` values and empty string In their default state, the fields can be `None`. When a user enters something and deletes it afterwards, the fields contain an empty string. This fixes the comparison. (cherry picked from commit 3fd5a0f1005f30219787f862786c31954935ac21) --- .../stock/doctype/quality_inspection/quality_inspection.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py index f461fd54869..67fc49acb8a 100644 --- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py +++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py @@ -278,7 +278,9 @@ class QualityInspection(Document): def set_status_based_on_acceptance_values(self, reading): if not cint(reading.numeric): - result = reading.get("reading_value") == reading.get("value") + reading_value = reading.get("reading_value") or "" + value = reading.get("value") or "" + result = reading_value == value else: # numeric readings result = self.min_max_criteria_passed(reading) From b15db05ef87fc2248d6e4f2e0cb018151aeceef4 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 17 Feb 2026 21:07:30 +0530 Subject: [PATCH 03/78] fix: setup fails to set abbr to departments (cherry picked from commit debe868950fe7b433533e3ebdb129bef13e9c94e) --- erpnext/setup/doctype/department/department.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/department/department.py b/erpnext/setup/doctype/department/department.py index 56db548ed57..648bc95c886 100644 --- a/erpnext/setup/doctype/department/department.py +++ b/erpnext/setup/doctype/department/department.py @@ -32,8 +32,7 @@ class Department(NestedSet): nsm_parent_field = "parent_department" def autoname(self): - root = get_root_of("Department") - if root and self.department_name != root: + if self.company: self.name = get_abbreviated_name(self.department_name, self.company) else: self.name = self.department_name From 893683a512e0e00ad420b1ccf3ff0c5c7598b909 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 23:07:41 +0530 Subject: [PATCH 04/78] fix: user permission on reports (backport #52709) (#52757) * fix: user permission on reports (#52709) (cherry picked from commit c6a292f6a9b156faec7ccf2d20133769be13b80c) # Conflicts: # erpnext/accounts/report/purchase_register/purchase_register.py # erpnext/accounts/report/sales_register/sales_register.py * chore: resolve conflict --------- Co-authored-by: Diptanil Saha --- .../financial_report_engine.py | 4 +-- .../customer_ledger_summary.py | 8 +++--- .../accounts/report/financial_statements.py | 17 ++++++------- .../report/general_ledger/general_ledger.py | 6 ++--- .../item_wise_purchase_register.py | 10 +++----- .../item_wise_sales_register.py | 25 +++++++++---------- .../purchase_register/purchase_register.py | 14 +++++------ .../report/sales_register/sales_register.py | 14 +++++------ .../daily_timesheet_summary.py | 2 +- erpnext/projects/utils.py | 2 +- 10 files changed, 44 insertions(+), 58 deletions(-) diff --git a/erpnext/accounts/doctype/financial_report_template/financial_report_engine.py b/erpnext/accounts/doctype/financial_report_template/financial_report_engine.py index 216a9034be4..b5bd3a00a9f 100644 --- a/erpnext/accounts/doctype/financial_report_template/financial_report_engine.py +++ b/erpnext/accounts/doctype/financial_report_template/financial_report_engine.py @@ -15,7 +15,7 @@ from frappe.database.operator_map import OPERATOR_MAP from frappe.query_builder import Case from frappe.query_builder.functions import Sum from frappe.utils import cstr, date_diff, flt, getdate -from pypika.terms import LiteralValue +from pypika.terms import Bracket, LiteralValue from erpnext import get_company_currency from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( @@ -732,7 +732,7 @@ class FinancialQueryBuilder: user_conditions = build_match_conditions(doctype) if user_conditions: - query = query.where(LiteralValue(user_conditions)) + query = query.where(Bracket(LiteralValue(user_conditions))) return query.run(as_dict=True) diff --git a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py index 1259430834e..85ff9b8da65 100644 --- a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py +++ b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py @@ -8,7 +8,7 @@ from frappe.query_builder import Criterion, Tuple from frappe.query_builder.functions import IfNull from frappe.utils import getdate, nowdate from frappe.utils.nestedset import get_descendants_of -from pypika.terms import LiteralValue +from pypika.terms import Bracket, LiteralValue from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( get_accounting_dimensions, @@ -84,10 +84,8 @@ class PartyLedgerSummaryReport: from frappe.desk.reportview import build_match_conditions - match_conditions = build_match_conditions(party_type) - - if match_conditions: - query = query.where(LiteralValue(match_conditions)) + if match_conditions := build_match_conditions(party_type): + query = query.where(Bracket(LiteralValue(match_conditions))) party_details = query.run(as_dict=True) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index 4fe98ae9d97..469726a1b78 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -11,7 +11,7 @@ import frappe from frappe import _ from frappe.query_builder.functions import Max, Min, Sum from frappe.utils import add_days, add_months, cint, cstr, flt, formatdate, get_first_day, getdate -from pypika.terms import ExistsCriterion +from pypika.terms import Bracket, ExistsCriterion, LiteralValue from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( get_accounting_dimensions, @@ -564,18 +564,15 @@ def get_accounting_entries( account_filter_query = get_account_filter_query(root_lft, root_rgt, root_type, gl_entry) query = query.where(ExistsCriterion(account_filter_query)) + if group_by_account: + query = query.groupby("account") + from frappe.desk.reportview import build_match_conditions - query, params = query.walk() - match_conditions = build_match_conditions(doctype) + if match_conditions := build_match_conditions(doctype): + query = query.where(Bracket(LiteralValue(match_conditions))) - if match_conditions: - query += "and" + match_conditions - - if group_by_account: - query += " GROUP BY `account`" - - return frappe.db.sql(query, params, as_dict=True) + return query.run(as_dict=True) def get_account_filter_query(root_lft, root_rgt, root_type, gl_entry): diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index fa4b4760c42..06c305563d8 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -324,10 +324,8 @@ def get_conditions(filters): from frappe.desk.reportview import build_match_conditions - match_conditions = build_match_conditions("GL Entry") - - if match_conditions: - conditions.append(match_conditions) + if match_conditions := build_match_conditions("GL Entry"): + conditions.append(f"({match_conditions})") accounting_dimensions = get_accounting_dimensions(as_list=False) diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py index bcaf64b0574..7166e5da691 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py +++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py @@ -5,6 +5,7 @@ import frappe from frappe import _ from frappe.utils import flt +from pypika.terms import Bracket, LiteralValue import erpnext from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import ( @@ -361,15 +362,12 @@ def get_items(filters, additional_table_columns): from frappe.desk.reportview import build_match_conditions - query, params = query.walk() - match_conditions = build_match_conditions(doctype) - - if match_conditions: - query += " and " + match_conditions + if match_conditions := build_match_conditions(doctype): + query = query.where(Bracket(LiteralValue(match_conditions))) query = apply_order_by_conditions(doctype, query, filters) - return frappe.db.sql(query, params, as_dict=True) + return query.run(as_dict=True) def get_aii_accounts(): diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index db73972bfb8..d77eb56525f 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -8,6 +8,7 @@ from frappe.query_builder import functions as fn from frappe.utils import flt from frappe.utils.nestedset import get_descendants_of from frappe.utils.xlsxutils import handle_html +from pypika.terms import Bracket, LiteralValue, Order from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments from erpnext.accounts.report.utils import get_values_for_columns @@ -390,20 +391,21 @@ def apply_conditions(query, si, sii, sip, filters, additional_conditions=None): def apply_order_by_conditions(doctype, query, filters): - invoice = f"`tab{doctype}`" - invoice_item = f"`tab{doctype} Item`" + invoice = frappe.qb.DocType(doctype) + invoice_item = frappe.qb.DocType(f"{doctype} Item") if not filters.get("group_by"): - query += f" order by {invoice}.posting_date desc, {invoice_item}.item_group desc" + query = query.orderby(invoice.posting_date, order=Order.desc) + query = query.orderby(invoice_item.item_group, order=Order.desc) elif filters.get("group_by") == "Invoice": - query += f" order by {invoice_item}.parent desc" + query = query.orderby(invoice_item.parent, order=Order.desc) elif filters.get("group_by") == "Item": - query += f" order by {invoice_item}.item_code" + query = query.orderby(invoice_item.item_code) elif filters.get("group_by") == "Item Group": - query += f" order by {invoice_item}.item_group" + query = query.orderby(invoice_item.item_group) elif filters.get("group_by") in ("Customer", "Customer Group", "Territory", "Supplier"): filter_field = frappe.scrub(filters.get("group_by")) - query += f" order by {filter_field} desc" + query = query.orderby(filter_field, order=Order.desc) return query @@ -481,15 +483,12 @@ def get_items(filters, additional_query_columns, additional_conditions=None): from frappe.desk.reportview import build_match_conditions - query, params = query.walk() - match_conditions = build_match_conditions(doctype) - - if match_conditions: - query += " and " + match_conditions + if match_conditions := build_match_conditions(doctype): + query = query.where(Bracket(LiteralValue(match_conditions))) query = apply_order_by_conditions(doctype, query, filters) - return frappe.db.sql(query, params, as_dict=True) + return query.run(as_dict=True) def get_delivery_notes_against_sales_order(item_list): diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index 026aecce036..2ec8931b63d 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -6,7 +6,7 @@ import frappe from frappe import _, msgprint from frappe.query_builder.custom import ConstantColumn from frappe.utils import flt, getdate -from pypika import Order +from pypika.terms import Bracket, LiteralValue, Order from erpnext.accounts.party import get_party_account from erpnext.accounts.report.utils import ( @@ -422,15 +422,13 @@ def get_invoices(filters, additional_query_columns): from frappe.desk.reportview import build_match_conditions - query, params = query.walk() - match_conditions = build_match_conditions("Purchase Invoice") + if match_conditions := build_match_conditions("Purchase Invoice"): + query = query.where(Bracket(LiteralValue(match_conditions))) - if match_conditions: - query += " and " + match_conditions + query = query.orderby("posting_date", order=Order.desc) + query = query.orderby("name", order=Order.desc) - query += " order by posting_date desc, name desc" - - return frappe.db.sql(query, params, as_dict=True) + return query.run(as_dict=True) def get_conditions(filters, query, doctype): diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py index e55f217682d..5aebcc9e2f4 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -7,7 +7,7 @@ from frappe import _, msgprint from frappe.model.meta import get_field_precision from frappe.query_builder.custom import ConstantColumn from frappe.utils import flt, getdate -from pypika import Order +from pypika.terms import Bracket, LiteralValue, Order from erpnext.accounts.party import get_party_account from erpnext.accounts.report.utils import ( @@ -458,15 +458,13 @@ def get_invoices(filters, additional_query_columns): from frappe.desk.reportview import build_match_conditions - query, params = query.walk() - match_conditions = build_match_conditions("Sales Invoice") + if match_conditions := build_match_conditions("Sales Invoice"): + query = query.where(Bracket(LiteralValue(match_conditions))) - if match_conditions: - query += " and " + match_conditions + query = query.orderby("posting_date", order=Order.desc) + query = query.orderby("name", order=Order.desc) - query += " order by posting_date desc, name desc" - - return frappe.db.sql(query, params, as_dict=True) + return query.run(as_dict=True) def get_conditions(filters, query, doctype): diff --git a/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py b/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py index b31a063c6af..726dd4bac53 100644 --- a/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py +++ b/erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py @@ -60,6 +60,6 @@ def get_conditions(filters): match_conditions = build_match_conditions("Timesheet") if match_conditions: - conditions += " and %s" % match_conditions + conditions += " and (%s)" % match_conditions return conditions diff --git a/erpnext/projects/utils.py b/erpnext/projects/utils.py index 5046d015cb6..b4d79d27d28 100644 --- a/erpnext/projects/utils.py +++ b/erpnext/projects/utils.py @@ -15,7 +15,7 @@ def query_task(doctype, txt, searchfield, start, page_len, filters): search_string = "%%%s%%" % txt order_by_string = "%s%%" % txt match_conditions = build_match_conditions("Task") - match_conditions = ("and" + match_conditions) if match_conditions else "" + match_conditions = (f"and ({match_conditions})") if match_conditions else "" return frappe.db.sql( """select name, subject from `tabTask` From 81845992a65597f64db961a75e1f47dc570ca0ad Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 4 Feb 2026 16:54:51 +0530 Subject: [PATCH 05/78] fix: enfore permission on make_payment_request (cherry picked from commit b755ca12ca2afd3e5587b81fd280820a298fbec5) --- erpnext/accounts/doctype/payment_request/payment_request.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 7d21a4ba41a..0b119512f7b 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -535,10 +535,12 @@ class PaymentRequest(Document): row_number += TO_SKIP_NEW_ROW -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def make_payment_request(**args): """Make payment request""" + frappe.has_permission(doctype="Payment Request", ptype="write", throw=True) + args = frappe._dict(args) if args.dt not in ALLOWED_DOCTYPES_FOR_PAYMENT_REQUEST: frappe.throw(_("Payment Requests cannot be created against: {0}").format(frappe.bold(args.dt))) From a5c83dd11ec27030bd29e62a3210afbe89ad090a Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 16 Feb 2026 13:19:10 +0530 Subject: [PATCH 06/78] fix: better permissions on make payment request (cherry picked from commit f36962fc5842361872caccc13ec56567a5c1e203) --- .../accounts/doctype/payment_request/payment_request.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 0b119512f7b..fd28dab5a29 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -539,8 +539,6 @@ class PaymentRequest(Document): def make_payment_request(**args): """Make payment request""" - frappe.has_permission(doctype="Payment Request", ptype="write", throw=True) - args = frappe._dict(args) if args.dt not in ALLOWED_DOCTYPES_FOR_PAYMENT_REQUEST: frappe.throw(_("Payment Requests cannot be created against: {0}").format(frappe.bold(args.dt))) @@ -548,6 +546,9 @@ def make_payment_request(**args): if args.dn and not isinstance(args.dn, str): frappe.throw(_("Invalid parameter. 'dn' should be of type str")) + frappe.has_permission("Payment Request", "create", throw=True) + frappe.has_permission(args.dt, "read", args.dn, throw=True) + ref_doc = args.ref_doc or frappe.get_doc(args.dt, args.dn) if not args.get("company"): args.company = ref_doc.company @@ -821,7 +822,7 @@ def get_print_format_list(ref_doctype): return {"print_format": print_format_list} -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def resend_payment_email(docname): return frappe.get_doc("Payment Request", docname).send_email() From 131e279a0cd1668bd61934771ea63fd066580b93 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 12 Feb 2026 00:35:27 +0530 Subject: [PATCH 07/78] fix(manufacturing): set pick list purpose while creating it from work order (cherry picked from commit 23ccc2a8c5318e2faeed48413b5a5418c060ffc3) --- erpnext/manufacturing/doctype/work_order/work_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 912131e2825..78576f0a2c0 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -2677,6 +2677,7 @@ def create_pick_list(source_name, target_doc=None, for_qty=None): target_doc, ) + doc.purpose = "Material Transfer for Manufacture" doc.for_qty = for_qty doc.set_item_locations() From d7b61b945f07902a542597f12e813e9c55dc0991 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 04:11:04 +0000 Subject: [PATCH 08/78] fix: addresses portal (backport #52712) (#52786) * fix: addresses portal (cherry picked from commit e317ab14795bcb474e08f835403dfeb71150c0f8) # Conflicts: # erpnext/patches.txt * chore: resolve conflicts --------- Co-authored-by: Mihir Kandoi --- erpnext/hooks.py | 2 +- erpnext/patches.txt | 1 + erpnext/patches/v16_0/add_portal_redirects.py | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v16_0/add_portal_redirects.py diff --git a/erpnext/hooks.py b/erpnext/hooks.py index bdbe2292139..e90362431a3 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -270,7 +270,7 @@ standard_portal_menu_items = [ "role": "Customer", }, {"title": "Issues", "route": "/issues", "reference_doctype": "Issue", "role": "Customer"}, - {"title": "Addresses", "route": "/addresses", "reference_doctype": "Address"}, + {"title": "Addresses", "route": "/addresses", "reference_doctype": "Address", "role": "Customer"}, { "title": "Timesheets", "route": "/timesheets", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index e6d090dac21..0af71507b9d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -465,3 +465,4 @@ erpnext.patches.v16_0.migrate_transaction_deletion_task_flags_to_status # 2 erpnext.patches.v16_0.update_company_custom_field_in_bin erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v15_0.delete_quotation_lost_record_detail +erpnext.patches.v16_0.add_portal_redirects diff --git a/erpnext/patches/v16_0/add_portal_redirects.py b/erpnext/patches/v16_0/add_portal_redirects.py new file mode 100644 index 00000000000..3a3e553d2ea --- /dev/null +++ b/erpnext/patches/v16_0/add_portal_redirects.py @@ -0,0 +1,14 @@ +import frappe + + +def execute(): + if frappe.db.exists("Portal Menu Item", {"route": "/addresses", "reference_doctype": "Address"}) and ( + doc := frappe.get_doc("Portal Menu Item", {"route": "/addresses", "reference_doctype": "Address"}) + ): + doc.role = "Customer" + doc.save() + + website_settings = frappe.get_single("Website Settings") + website_settings.append("route_redirects", {"source": "addresses", "target": "address/list"}) + website_settings.append("route_redirects", {"source": "projects", "target": "project"}) + website_settings.save() From f6a1ea804a6a4d61df43f2b9b75178c4cc3b8234 Mon Sep 17 00:00:00 2001 From: Thomas antony <77287334+thomasantony12@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:48:15 +0530 Subject: [PATCH 09/78] fix: Add handling for Sales Invoice Item quantity field Add handling for Sales Invoice Item quantity field (cherry picked from commit edfcaee99b19906191e2c1c7db44ce11966f1833) --- .../doctype/serial_and_batch_bundle/serial_and_batch_bundle.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index f1b16da4b3e..5472a8c6bc4 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -1028,6 +1028,8 @@ class SerialandBatchBundle(Document): qty_field = "consumed_qty" elif row.get("doctype") == "Stock Entry Detail": qty_field = "transfer_qty" + elif row.get("doctype") == "Sales Invoice Item": + qty_field = "stock_qty" return qty_field From 2d864bb599f44b325f2d4a00f3ea836a36f0db87 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 19 Feb 2026 04:45:20 +0530 Subject: [PATCH 10/78] fix: add purchase invoice as well (cherry picked from commit 1fc2eddf6f6d1630bbef04a36277e38f68dd4592) --- .../doctype/serial_and_batch_bundle/serial_and_batch_bundle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index 5472a8c6bc4..b8350af3bc2 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -1028,7 +1028,7 @@ class SerialandBatchBundle(Document): qty_field = "consumed_qty" elif row.get("doctype") == "Stock Entry Detail": qty_field = "transfer_qty" - elif row.get("doctype") == "Sales Invoice Item": + elif row.get("doctype") in ["Sales Invoice Item", "Purchase Invoice Item"]: qty_field = "stock_qty" return qty_field From a499b7e0469f4ce807228b80e7309a49b5202b37 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 19 Feb 2026 10:18:26 +0530 Subject: [PATCH 11/78] fix: reservation based on field should be read only in SRE (cherry picked from commit 21452b4c6efa8659801d888b5b1445750789a8c1) --- .../stock_reservation_entry/stock_reservation_entry.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json index 795e7eebf35..a959cc4c14e 100644 --- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json +++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -265,7 +265,6 @@ "label": "Serial and Batch Reservation" }, { - "allow_on_submit": 1, "default": "Qty", "depends_on": "eval: parent.has_serial_no || parent.has_batch_no", "fieldname": "reservation_based_on", @@ -273,7 +272,7 @@ "label": "Reservation Based On", "no_copy": 1, "options": "Qty\nSerial and Batch", - "read_only_depends_on": "eval: (doc.delivered_qty > 0 || doc.from_voucher_type == \"Pick List\")" + "read_only": 1 }, { "fieldname": "column_break_7dxj", @@ -343,11 +342,11 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-11-10 16:09:10.380024", + "modified": "2026-02-19 10:17:28.695394", "modified_by": "Administrator", "module": "Stock", "name": "Stock Reservation Entry", - "naming_rule": "Expression (old style)", + "naming_rule": "Expression", "owner": "Administrator", "permissions": [ { From c5bc92d50ee1a3e81d9e1ade8adc6c4f1ee5a4b8 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 19 Feb 2026 10:13:14 +0530 Subject: [PATCH 12/78] fix: unable to submit subcontracting order if created from material request (cherry picked from commit 37323480dd026fd5745b75f48d38ad57d692b32e) --- .../doctype/purchase_order/purchase_order.py | 3 +++ erpnext/controllers/status_updater.py | 9 +-------- .../material_request/material_request_list.js | 4 ++-- .../subcontracting_order.py | 19 ------------------- 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 75f552fe195..1f945da1682 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -191,6 +191,9 @@ class PurchaseOrder(BuyingController): self.set_has_unit_price_items() self.flags.allow_zero_qty = self.has_unit_price_items + if self.is_subcontracted: + self.status_updater[0]["source_field"] = "fg_item_qty" + def validate(self): super().validate() diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index b16c95722a6..4ec5e739143 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -119,7 +119,7 @@ status_map = { ["Pending", "eval:self.status != 'Stopped' and self.per_ordered == 0 and self.docstatus == 1"], [ "Ordered", - "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type in ['Purchase', 'Manufacture']", + "eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type in ['Purchase', 'Manufacture', 'Subcontracting']", ], [ "Transferred", @@ -511,13 +511,6 @@ class StatusUpdater(Document): if d.doctype != args["source_dt"]: continue - if ( - d.get("material_request") - and frappe.db.get_value("Material Request", d.material_request, "material_request_type") - == "Subcontracting" - ): - args.update({"source_field": "fg_item_qty"}) - self._update_modified(args, update_modified) # updates qty in the child table diff --git a/erpnext/stock/doctype/material_request/material_request_list.js b/erpnext/stock/doctype/material_request/material_request_list.js index d6e36dd21e6..f885318e1f7 100644 --- a/erpnext/stock/doctype/material_request/material_request_list.js +++ b/erpnext/stock/doctype/material_request/material_request_list.js @@ -26,7 +26,7 @@ frappe.listview_settings["Material Request"] = { ) { return [__("Partially Received"), "yellow", "per_ordered,<,100"]; } else if (doc.docstatus == 1 && flt(doc.per_ordered, precision) < 100) { - return [__("Partially ordered"), "yellow", "per_ordered,<,100"]; + return [__("Partially Ordered"), "yellow", "per_ordered,<,100"]; } else if (doc.docstatus == 1 && flt(doc.per_ordered, precision) == 100) { if ( doc.material_request_type == "Purchase" && @@ -36,7 +36,7 @@ frappe.listview_settings["Material Request"] = { return [__("Partially Received"), "yellow", "per_received,<,100"]; } else if (doc.material_request_type == "Purchase" && flt(doc.per_received, precision) == 100) { return [__("Received"), "green", "per_received,=,100"]; - } else if (["Purchase", "Manufacture"].includes(doc.material_request_type)) { + } else if (["Purchase", "Manufacture", "Subcontracting"].includes(doc.material_request_type)) { return [__("Ordered"), "green", "per_ordered,=,100"]; } else if (doc.material_request_type == "Material Transfer") { return [__("Transferred"), "green", "per_ordered,=,100"]; diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py index 8eb369d120f..1e05afa2fbf 100644 --- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py +++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py @@ -88,23 +88,6 @@ class SubcontractingOrder(SubcontractingController): transaction_date: DF.Date # end: auto-generated types - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.status_updater = [ - { - "source_dt": "Subcontracting Order Item", - "target_dt": "Material Request Item", - "join_field": "material_request_item", - "target_field": "ordered_qty", - "target_parent_dt": "Material Request", - "target_parent_field": "per_ordered", - "target_ref_field": "stock_qty", - "source_field": "qty", - "percent_join_field": "material_request", - } - ] - def onload(self): self.set_onload( "over_transfer_allowance", @@ -139,13 +122,11 @@ class SubcontractingOrder(SubcontractingController): self.reset_default_field_value("set_warehouse", "items", "warehouse") def on_submit(self): - self.update_prevdoc_status() self.update_status() self.update_subcontracted_quantity_in_po() self.reserve_raw_materials() def on_cancel(self): - self.update_prevdoc_status() self.update_status() self.update_subcontracted_quantity_in_po(cancel=True) From 77da3306b5c9897ab387676bfe2a3a4019aceec1 Mon Sep 17 00:00:00 2001 From: Marc Ramser Date: Thu, 19 Feb 2026 09:25:38 +0100 Subject: [PATCH 13/78] fix(Purchase Receipt): copy project from first row when adding items Adds `items_add` method to copy expense_account, cost_center and project from first row to newly added items, matching Purchase Invoice behavior. (cherry picked from commit 21423676c9e615317c71ea74e3f1df47b1d40752) --- .../stock/doctype/purchase_receipt/purchase_receipt.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index 81c1b147697..933cd0051e7 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -365,6 +365,15 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend apply_putaway_rule() { if (this.frm.doc.apply_putaway_rule) erpnext.apply_putaway_rule(this.frm); } + + items_add(doc, cdt, cdn) { + const row = frappe.get_doc(cdt, cdn); + this.frm.script_manager.copy_from_first_row("items", row, [ + "expense_account", + "cost_center", + "project", + ]); + } }; // for backward compatibility: combine new and previous states From bccca6f58e3bc8c46985cd22666c0a72727a74c6 Mon Sep 17 00:00:00 2001 From: Nishka Gosalia Date: Thu, 19 Feb 2026 17:16:06 +0530 Subject: [PATCH 14/78] fix: permission issue for quotation item during update item (cherry picked from commit 58b8af0fa8424a82a20a7009686245ea663dacd1) --- erpnext/controllers/accounts_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 25959c651cf..7c9b0cee0dd 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4122,7 +4122,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil child_item.idx = len(parent.items) + 1 child_item.insert() else: - child_item.save() + parent.save() parent.reload() parent.flags.ignore_validate_update_after_submit = True From 715dbc00931b547915e1f944f1dc004c0197050f Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 19 Feb 2026 20:27:54 +0530 Subject: [PATCH 15/78] fix: ignore permissions instead of saving parent (cherry picked from commit 6342e9a3e297269880d2dfd8a98767d5898504ee) --- erpnext/controllers/accounts_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7c9b0cee0dd..4db5d4d4947 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4122,7 +4122,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil child_item.idx = len(parent.items) + 1 child_item.insert() else: - parent.save() + child.save(ignore_permissions=True) parent.reload() parent.flags.ignore_validate_update_after_submit = True From 0c4b9ea9ca779d5467e179a78b96ba2854278041 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 19 Feb 2026 20:28:33 +0530 Subject: [PATCH 16/78] fix: typo (cherry picked from commit 732c98b72f3bb4cedd55a76b645c4de5609a3b10) --- erpnext/controllers/accounts_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 4db5d4d4947..9d81a6318c0 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4122,7 +4122,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil child_item.idx = len(parent.items) + 1 child_item.insert() else: - child.save(ignore_permissions=True) + child_item.save(ignore_permissions=True) parent.reload() parent.flags.ignore_validate_update_after_submit = True From dbe2a87a8463195bf02a5a14b0a266fae9c0cb4d Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 20 Feb 2026 10:14:30 +0530 Subject: [PATCH 17/78] fix: sensible insufficient stock message in pick list (cherry picked from commit 1352dc79bb2128ea0dd4122bd7205e481e89cabc) --- erpnext/stock/doctype/pick_list/pick_list.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index d9b1d29e5aa..4d7f4586d6b 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -1006,12 +1006,11 @@ def validate_picked_materials(item_code, required_qty, locations, picked_item_de if remaining_qty > 0: if picked_item_details: frappe.msgprint( - _("{0} units of Item {1} is picked in another Pick List.").format( - remaining_qty, get_link_to_form("Item", item_code) - ), + _( + "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." + ).format(remaining_qty, get_link_to_form("Item", item_code)), title=_("Already Picked"), ) - else: frappe.msgprint( _("{0} units of Item {1} is not available in any of the warehouses.").format( From 3355c60c799a9dfc0a2da0a975a1bbaab4a5781f Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 20 Feb 2026 14:21:26 +0530 Subject: [PATCH 18/78] fix: update items fetches wrong item code (cherry picked from commit ba96d37c11ea06906f9177229a32e152c48ff390) --- erpnext/public/js/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 578846f0937..455107ef201 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -667,7 +667,7 @@ erpnext.utils.update_child_items = function (opts) { filters: filters, }; }, - onchange: function () { + change: function () { const me = this; frm.call({ From b56c444f185c2459ff91a7bda757f96a03e894f1 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 20 Feb 2026 16:40:32 +0530 Subject: [PATCH 19/78] fix: inconsistent label name between parent and child (cherry picked from commit d6e1ca0f101480ea8d4e78f63af4b39d134b88c9) --- .../selling/doctype/sales_order_item/sales_order_item.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index d57bb04d13f..312b882a7df 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -531,7 +531,7 @@ "depends_on": "eval:doc.delivered_by_supplier!=1", "fieldname": "warehouse", "fieldtype": "Link", - "label": "Delivery Warehouse", + "label": "Source Warehouse", "oldfieldname": "reserved_warehouse", "oldfieldtype": "Link", "options": "Warehouse", @@ -1016,7 +1016,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2025-10-13 10:57:43.378448", + "modified": "2026-02-20 16:39:00.200328", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", From cfad7e17f12e0df8d050cf7f9af3dd6ec7657eba Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sat, 21 Feb 2026 12:08:37 +0530 Subject: [PATCH 20/78] fix: remove supplier invoice date/posting date validation (cherry picked from commit 7cff0ba6266297092a4c678aa5d1fc40877d61df) --- erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 801820fbdb5..2d6d9fd8c51 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -1745,10 +1745,6 @@ class PurchaseInvoice(BuyingController): project_doc.db_update() def validate_supplier_invoice(self): - if self.bill_date: - if getdate(self.bill_date) > getdate(self.posting_date): - frappe.throw(_("Supplier Invoice Date cannot be greater than Posting Date")) - if self.bill_no: if cint(frappe.get_single_value("Accounts Settings", "check_supplier_invoice_uniqueness")): fiscal_year = get_fiscal_year(self.posting_date, company=self.company, as_dict=True) From 82170dfd0766715267366fa473db12d934eb09d4 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 21 Feb 2026 01:58:14 +0530 Subject: [PATCH 21/78] refactor: `Fiscal Year` DocType cleanup (cherry picked from commit 74ac28fc70d9a4efdfa4083e2d8656ae95dbd0e1) --- .../doctype/fiscal_year/fiscal_year.py | 71 ++++--------------- 1 file changed, 14 insertions(+), 57 deletions(-) diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py index e4f935e91fb..18faa5e6bae 100644 --- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py +++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py @@ -33,24 +33,6 @@ class FiscalYear(Document): self.validate_dates() self.validate_overlap() - if not self.is_new(): - year_start_end_dates = frappe.db.sql( - """select year_start_date, year_end_date - from `tabFiscal Year` where name=%s""", - (self.name), - ) - - if year_start_end_dates: - if ( - getdate(self.year_start_date) != year_start_end_dates[0][0] - or getdate(self.year_end_date) != year_start_end_dates[0][1] - ): - frappe.throw( - _( - "Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved." - ) - ) - def validate_dates(self): self.validate_from_to_dates("year_start_date", "year_end_date") if self.is_short_year: @@ -66,28 +48,20 @@ class FiscalYear(Document): frappe.exceptions.InvalidDates, ) - def on_update(self): - check_duplicate_fiscal_year(self) - frappe.cache().delete_value("fiscal_years") - - def on_trash(self): - frappe.cache().delete_value("fiscal_years") - def validate_overlap(self): - existing_fiscal_years = frappe.db.sql( - """select name from `tabFiscal Year` - where ( - (%(year_start_date)s between year_start_date and year_end_date) - or (%(year_end_date)s between year_start_date and year_end_date) - or (year_start_date between %(year_start_date)s and %(year_end_date)s) - or (year_end_date between %(year_start_date)s and %(year_end_date)s) - ) and name!=%(name)s""", - { - "year_start_date": self.year_start_date, - "year_end_date": self.year_end_date, - "name": self.name or "No Name", - }, - as_dict=True, + fy = frappe.qb.DocType("Fiscal Year") + + name = self.name or self.year + + existing_fiscal_years = ( + frappe.qb.from_(fy) + .select(fy.name) + .where( + (fy.year_start_date <= self.year_end_date) + & (fy.year_end_date >= self.year_start_date) + & (fy.name != name) + ) + .run(as_dict=True) ) if existing_fiscal_years: @@ -110,28 +84,11 @@ class FiscalYear(Document): frappe.throw( _( "Year start date or end date is overlapping with {0}. To avoid please set company" - ).format(existing.name), + ).format(frappe.get_desk_link("Fiscal Year", existing.name, open_in_new_tab=True)), frappe.NameError, ) -@frappe.whitelist() -def check_duplicate_fiscal_year(doc): - year_start_end_dates = frappe.db.sql( - """select name, year_start_date, year_end_date from `tabFiscal Year` where name!=%s""", - (doc.name), - ) - for fiscal_year, ysd, yed in year_start_end_dates: - if (getdate(doc.year_start_date) == ysd and getdate(doc.year_end_date) == yed) and ( - not frappe.in_test - ): - frappe.throw( - _( - "Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}" - ).format(fiscal_year) - ) - - @frappe.whitelist() def auto_create_fiscal_year(): for d in frappe.db.sql( From 54bed643562179891467cb74ff634d7784292d4f Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 21 Feb 2026 02:02:03 +0530 Subject: [PATCH 22/78] fix(`fiscal_year_company`): made `company` field mandatory (cherry picked from commit 94fb7e11b4713886dc6400fb8631dd7539ab2fd0) --- .../doctype/fiscal_year_company/fiscal_year_company.json | 8 +++++--- .../doctype/fiscal_year_company/fiscal_year_company.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.json b/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.json index ef1d9b0016e..60379bc1546 100644 --- a/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.json +++ b/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.json @@ -15,20 +15,22 @@ "ignore_user_permissions": 1, "in_list_view": 1, "label": "Company", - "options": "Company" + "options": "Company", + "reqd": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-03-27 13:09:44.659251", + "modified": "2026-02-20 23:02:26.193606", "modified_by": "Administrator", "module": "Accounts", "name": "Fiscal Year Company", "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/accounts/doctype/fiscal_year_company/fiscal_year_company.py b/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.py index 9447120d326..b68069bca27 100644 --- a/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.py +++ b/erpnext/accounts/doctype/fiscal_year_company/fiscal_year_company.py @@ -14,7 +14,7 @@ class FiscalYearCompany(Document): if TYPE_CHECKING: from frappe.types import DF - company: DF.Link | None + company: DF.Link parent: DF.Data parentfield: DF.Data parenttype: DF.Data From 92c2c7bf826ee1cfe58011ddcdadf259b0f6c153 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 21 Feb 2026 02:42:53 +0530 Subject: [PATCH 23/78] fix(`fiscal_year`): `Fiscal Year` auto-generation and notification (cherry picked from commit 4c76786ce44eb5f3813964092ac8211336c9c9eb) --- .../doctype/fiscal_year/fiscal_year.py | 26 ++++++++--- .../notification_for_new_fiscal_year.html | 44 ++++++++++++++++++- .../notification_for_new_fiscal_year.json | 9 ++-- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py index 18faa5e6bae..38f3a91c8fe 100644 --- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py +++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py @@ -4,7 +4,7 @@ import frappe from dateutil.relativedelta import relativedelta -from frappe import _ +from frappe import _, cint from frappe.model.document import Document from frappe.utils import add_days, add_years, cstr, getdate @@ -89,15 +89,25 @@ class FiscalYear(Document): ) -@frappe.whitelist() def auto_create_fiscal_year(): - for d in frappe.db.sql( - """select name from `tabFiscal Year` where year_end_date = date_add(current_date, interval 3 day)""" - ): + fy = frappe.qb.DocType("Fiscal Year") + + # Skipped auto-creating Short Year, as it has very rare use case. + # Reference: https://www.irs.gov/businesses/small-businesses-self-employed/tax-years (US) + follow_up_date = add_days(getdate(), days=3) + fiscal_year = ( + frappe.qb.from_(fy) + .select(fy.name) + .where((fy.year_end_date == follow_up_date) & (fy.is_short_year == 0)) + .run() + ) + + for d in fiscal_year: try: current_fy = frappe.get_doc("Fiscal Year", d[0]) - new_fy = frappe.copy_doc(current_fy, ignore_no_copy=False) + new_fy = frappe.new_doc("Fiscal Year") + new_fy.disabled = cint(current_fy.disabled) new_fy.year_start_date = add_days(current_fy.year_end_date, 1) new_fy.year_end_date = add_years(current_fy.year_end_date, 1) @@ -105,6 +115,10 @@ def auto_create_fiscal_year(): start_year = cstr(new_fy.year_start_date.year) end_year = cstr(new_fy.year_end_date.year) new_fy.year = start_year if start_year == end_year else (start_year + "-" + end_year) + + for row in current_fy.companies: + new_fy.append("companies", {"company": row.company}) + new_fy.auto_created = 1 new_fy.insert(ignore_permissions=True) diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html index 0c4a46241d9..542070ab6f2 100644 --- a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html +++ b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html @@ -1,3 +1,43 @@ -

{{ _("Fiscal Year") }}

+

{{ _("New Fiscal Year - {0}").format(doc.name) }}

-

{{ _("New fiscal year created :- ") }} {{ doc.name }}

+

{{ _("A new fiscal year has been automatically created.") }}

+ +

{{ _("Fiscal Year Details") }}

+ + + + + + + + + + + + + + + {% if doc.companies|length > 0 %} + + + + + {% for idx in range(1, doc.companies|length) %} + + + + {% endfor %} + {% endif %} +
{{ _("Year Name") }}{{ doc.name }}
{{ _("Start Date") }}{{ frappe.format_value(doc.year_start_date) }}
{{ _("End Date") }}{{ frappe.format_value(doc.year_end_date) }}
+ {% if doc.companies|length < 2 %} + {{ _("Company") }} + {% else %} + {{ _("Companies") }} + {% endif %} + {{ doc.companies[0].company }}
{{ doc.companies[idx].company }}
+ +{% if doc.disabled %} +

{{ _("The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status.") }}

+{% endif %} + +

{{ _("Please review the {0} configuration and complete any required financial setup activities.").format(frappe.utils.get_link_to_form("Fiscal Year", doc.name, frappe.bold("Fiscal Year"))) }}

\ No newline at end of file diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json index f605ad3ba67..b1016a43c37 100644 --- a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json +++ b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json @@ -1,7 +1,8 @@ { "attach_print": 0, "channel": "Email", - "condition": "doc.auto_created", + "condition": "doc.auto_created == 1", + "condition_type": "Python", "creation": "2018-04-25 14:19:05.440361", "days_in_advance": 0, "docstatus": 0, @@ -11,8 +12,10 @@ "event": "New", "idx": 0, "is_standard": 1, + "message": "

{{ _(\"New Fiscal Year - {0}\").format(doc.name) }}

\n\n

{{ _(\"A new fiscal year has been automatically created.\") }}

\n\n

{{ _(\"Fiscal Year Details\") }}

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n {% if doc.companies|length > 0 %}\n \n \n \n \n {% for idx in range(1, doc.companies|length) %}\n \n \n \n {% endfor %}\n {% endif %}\n
{{ _(\"Year Name\") }}{{ doc.name }}
{{ _(\"Start Date\") }}{{ frappe.format_value(doc.year_start_date) }}
{{ _(\"End Date\") }}{{ frappe.format_value(doc.year_end_date) }}
\n {% if doc.companies|length < 2 %}\n {{ _(\"Company\") }}\n {% else %}\n {{ _(\"Companies\") }}\n {% endif %}\n {{ doc.companies[0].company }}
{{ doc.companies[idx].company }}
\n\n{% if doc.disabled %}\n

{{ _(\"The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status.\") }}

\n{% endif %}\n\n

{{ _(\"Please review the {0} configuration and complete any required financial setup activities.\").format(frappe.utils.get_link_to_form(\"Fiscal Year\", doc.name, frappe.bold(\"Fiscal Year\"))) }}

", "message_type": "HTML", - "modified": "2023-11-17 08:54:51.532104", + "minutes_offset": 0, + "modified": "2026-02-21 12:14:54.736795", "modified_by": "Administrator", "module": "Accounts", "name": "Notification for new fiscal year", @@ -27,5 +30,5 @@ ], "send_system_notification": 0, "send_to_all_assignees": 0, - "subject": "Notification for new fiscal year {{ doc.name }}" + "subject": "{{ _(\"New Fiscal Year {0} - Review Required\").format(doc.name) }}" } From 2c5bdefd1367c45016025a72daada40d4bc4cba2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Sat, 21 Feb 2026 15:43:47 +0100 Subject: [PATCH 24/78] feat(Journal Entry Account): add Bank Transaction as Reference Type (backport #52760) (#52816) * feat: add Bank Transaction as Reference Type to Journal Entry Account (#52760) * feat: add Bank Transaction as Reference Type to Journal Entry Account * fix: take care of existing property setters * fix: cancelling Bank Transactions should still be possible * fix: handle blank options in patch * fix: hide Reference Due Date for Bank Transaction (cherry picked from commit 387fb1b2022d14e15da9501f96c5324da72f0c59) # Conflicts: # erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json * chore: resolve conflicts --------- Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com> --- .../bank_transaction/bank_transaction.py | 2 ++ .../journal_entry_account.json | 6 ++-- .../journal_entry_account.py | 1 + erpnext/patches.txt | 1 + ..._transaction_as_journal_entry_reference.py | 33 +++++++++++++++++++ 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 erpnext/patches/v15_0/add_bank_transaction_as_journal_entry_reference.py diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py index f850749fe4f..44f449ac788 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py @@ -139,6 +139,8 @@ class BankTransaction(Document): self.set_status() def on_cancel(self): + self.ignore_linked_doctypes = ["GL Entry"] + for payment_entry in self.payment_entries: self.delink_payment_entry(payment_entry) diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json index 675bfcf86c8..d027a38e08d 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -185,7 +185,7 @@ "fieldtype": "Select", "label": "Reference Type", "no_copy": 1, - "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance\nExchange Rate Revaluation\nInvoice Discounting\nFees\nFull and Final Statement\nPayment Entry", + "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nLoan\nPayroll Entry\nEmployee Advance\nExchange Rate Revaluation\nInvoice Discounting\nFees\nFull and Final Statement\nPayment Entry\nBank Transaction", "search_index": 1 }, { @@ -198,7 +198,7 @@ "search_index": 1 }, { - "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan', 'Employee Advance'])", + "depends_on": "eval:doc.reference_type&&!in_list(doc.reference_type, ['Expense Claim', 'Asset', 'Employee Loan', 'Employee Advance', 'Bank Transaction'])", "fieldname": "reference_due_date", "fieldtype": "Date", "label": "Reference Due Date", @@ -294,7 +294,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2025-11-27 12:23:33.157655", + "modified": "2026-02-19 17:01:22.642454", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry Account", diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.py b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.py index d26224103c0..d73412f8a20 100644 --- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.py +++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.py @@ -55,6 +55,7 @@ class JournalEntryAccount(Document): "Fees", "Full and Final Statement", "Payment Entry", + "Bank Transaction", ] user_remark: DF.SmallText | None # end: auto-generated types diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 0af71507b9d..1a488324212 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -412,6 +412,7 @@ erpnext.patches.v15_0.rename_group_by_to_categorize_by execute:frappe.db.set_single_value("Accounts Settings", "receivable_payable_fetch_method", "Buffered Cursor") erpnext.patches.v14_0.set_update_price_list_based_on erpnext.patches.v15_0.update_journal_entry_type +erpnext.patches.v15_0.add_bank_transaction_as_journal_entry_reference erpnext.patches.v15_0.set_grand_total_to_default_mop execute:frappe.db.set_single_value("Accounts Settings", "use_legacy_budget_controller", False) erpnext.patches.v15_0.set_cancelled_status_to_cancelled_pos_invoice diff --git a/erpnext/patches/v15_0/add_bank_transaction_as_journal_entry_reference.py b/erpnext/patches/v15_0/add_bank_transaction_as_journal_entry_reference.py new file mode 100644 index 00000000000..cfac2ab3858 --- /dev/null +++ b/erpnext/patches/v15_0/add_bank_transaction_as_journal_entry_reference.py @@ -0,0 +1,33 @@ +import frappe + + +def execute(): + """Append Bank Transaction in custom reference_type options.""" + new_reference_type = "Bank Transaction" + property_setters = frappe.get_all( + "Property Setter", + filters={ + "doc_type": "Journal Entry Account", + "field_name": "reference_type", + "property": "options", + }, + pluck="name", + ) + + for property_setter in property_setters: + existing_value = frappe.db.get_value("Property Setter", property_setter, "value") or "" + + raw_options = [option.strip() for option in existing_value.split("\n")] + # Preserve a single leading blank (for the empty select option) but drop spurious trailing blanks + options = raw_options[:1] + [o for o in raw_options[1:] if o] + + if new_reference_type in options: + continue + + options.append(new_reference_type) + frappe.db.set_value( + "Property Setter", + property_setter, + "value", + "\n".join(options), + ) From 843c0d4acfd2b76ec9d84823e640264aa405c9d0 Mon Sep 17 00:00:00 2001 From: MochaMind Date: Sun, 22 Feb 2026 17:49:38 +0530 Subject: [PATCH 25/78] chore: update POT file (#52858) --- erpnext/locale/main.pot | 1653 ++++++++++++++++++++++++++++++--------- 1 file changed, 1280 insertions(+), 373 deletions(-) diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index 77c3cdac6aa..af2482560fe 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-02-15 09:44+0000\n" -"PO-Revision-Date: 2026-02-15 09:44+0000\n" +"POT-Creation-Date: 2026-02-22 09:43+0000\n" +"PO-Revision-Date: 2026-02-22 09:43+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -16,10 +16,14 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.16.0\n" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1469 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1475 msgid "" "\n" -"\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}. Please add a stock quantity of {3} to proceed with this entry." +"\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}{3}.\n" +"\t\t\tPlease add a stock quantity of {4} to proceed with this entry.\n" +"\t\t\tIf it is not possible to make an adjustment entry, please enable 'Allow Negative Stock for Batch' in Stock Settings to proceed.\n" +"\t\t\tHowever, enabling this setting may lead to negative stock in the system.\n" +"\t\t\tSo please ensure the stock levels are adjusted as soon as possible to maintain the correct valuation rate." msgstr "" #. Label of the column_break_32 (Column Break) field in DocType 'Email Digest' @@ -31,7 +35,7 @@ msgstr "" msgid " Address" msgstr "" -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:605 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:604 msgid " Amount" msgstr "" @@ -58,7 +62,7 @@ msgstr "" msgid " Item" msgstr "" -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:153 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:151 #: erpnext/selling/report/sales_analytics/sales_analytics.py:128 msgid " Name" msgstr "" @@ -68,7 +72,7 @@ msgstr "" msgid " Phantom Item" msgstr "" -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:596 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:595 msgid " Rate" msgstr "" @@ -168,8 +172,8 @@ msgstr "" msgid "% Occupied" msgstr "" -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:277 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:329 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:278 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:330 msgid "% Of Grand Total" msgstr "" @@ -323,7 +327,7 @@ msgstr "" msgid "'Update Stock' can not be checked because items are not delivered via {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:412 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:413 msgid "'Update Stock' cannot be checked for fixed asset sale" msgstr "" @@ -597,7 +601,7 @@ msgstr "" msgid "<0" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:534 +#: erpnext/assets/doctype/asset/asset.py:537 msgid "Cannot create asset.

You're trying to create {0} asset(s) from {2} {3}.
However, only {1} item(s) were purchased and {4} asset(s) already exist against {5}." msgstr "" @@ -910,11 +914,11 @@ msgstr "" msgid "Your Shortcuts" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1005 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1008 msgid "Grand Total: {0}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1006 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1009 msgid "Outstanding Amount: {0}" msgstr "" @@ -1031,6 +1035,10 @@ msgstr "" msgid "A new appointment has been created for you with {0}" msgstr "" +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:3 +msgid "A new fiscal year has been automatically created." +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 "" @@ -1081,12 +1089,22 @@ msgstr "" msgid "AMC Expiry Date" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "AP Summary" +msgstr "" + #. Label of the api_details_section (Section Break) field in DocType 'Currency #. Exchange Settings' #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json msgid "API Details" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "AR Summary" +msgstr "" + #. Label of the awb_number (Data) field in DocType 'Shipment' #: erpnext/stock/doctype/shipment/shipment.json msgid "AWB Number" @@ -1208,9 +1226,11 @@ msgstr "" #. Label of the account_category (Link) field in DocType 'Account' #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:167 #: erpnext/accounts/doctype/account_category/account_category.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Account Category" msgstr "" @@ -1313,7 +1333,7 @@ msgstr "" msgid "Account Manager" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1006 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1009 #: erpnext/controllers/accounts_controller.py:2380 msgid "Account Missing" msgstr "" @@ -1327,7 +1347,7 @@ msgstr "" #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:409 -#: erpnext/accounts/report/financial_statements.py:681 +#: erpnext/accounts/report/financial_statements.py:678 #: erpnext/accounts/report/trial_balance/trial_balance.py:480 msgid "Account Name" msgstr "" @@ -1340,7 +1360,7 @@ msgstr "" #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:133 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:416 -#: erpnext/accounts/report/financial_statements.py:688 +#: erpnext/accounts/report/financial_statements.py:685 #: erpnext/accounts/report/trial_balance/trial_balance.py:487 msgid "Account Number" msgstr "" @@ -1430,7 +1450,7 @@ msgstr "" msgid "Account is not set for the dashboard chart {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:898 +#: erpnext/assets/doctype/asset/asset.py:901 msgid "Account not Found" msgstr "" @@ -1562,6 +1582,7 @@ msgstr "" #. Label of the section_break_10 (Section Break) field in DocType 'Shipping #. Rule' #. Label of the accounting_tab (Tab Break) field in DocType 'Supplier' +#. Label of a Desktop Icon #. Label of the accounting_tab (Tab Break) field in DocType 'Customer' #. Label of a Card Break in the Home Workspace #. Label of the accounting (Tab Break) field in DocType 'Item' @@ -1572,6 +1593,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json #: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/desktop_icon/accounting.json #: erpnext/selling/doctype/customer/customer.json #: erpnext/setup/setup_wizard/data/industry_type.txt:1 #: erpnext/setup/workspace/home/home.json erpnext/stock/doctype/item/item.json @@ -1626,11 +1648,14 @@ msgstr "" #. Label of the accounting_dimension (Link) field in DocType 'Allowed #. Dimension' #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json #: erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json #: erpnext/accounts/report/profitability_analysis/profitability_analysis.js:32 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/budget.json msgid "Accounting Dimension" msgstr "" @@ -1821,8 +1846,8 @@ msgstr "" msgid "Accounting Entries" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:932 -#: erpnext/assets/doctype/asset/asset.py:947 +#: erpnext/assets/doctype/asset/asset.py:935 +#: erpnext/assets/doctype/asset/asset.py:950 #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:562 msgid "Accounting Entry for Asset" msgstr "" @@ -1883,8 +1908,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_period/accounting_period.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounting Period" msgstr "" @@ -1956,12 +1983,16 @@ msgstr "" #. Option for the 'Write Off Based On' (Select) field in DocType 'Journal #. Entry' #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:154 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:256 #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:113 #: erpnext/buying/doctype/supplier/supplier.js:104 +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Accounts Payable" msgstr "" @@ -1976,6 +2007,7 @@ msgstr "" #. Option for the 'Report' (Select) field in DocType 'Process Statement Of #. Accounts' #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:12 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:12 #: erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -1983,6 +2015,9 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.json #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:136 #: erpnext/selling/doctype/customer/customer.js:162 +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Accounts Receivable" msgstr "" @@ -2025,12 +2060,22 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a shortcut in the ERPNext Settings Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +#: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Accounts Settings" msgstr "" +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar +#: erpnext/desktop_icon/accounts_setup.json +#: erpnext/workspace_sidebar/accounts_setup.json +msgid "Accounts Setup" +msgstr "" + #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1319 msgid "Accounts table cannot be blank." msgstr "" @@ -2236,8 +2281,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/doctype/activity_cost/activity_cost.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Activity Cost" msgstr "" @@ -2255,6 +2302,7 @@ msgstr "" #. Label of the activity_type (Data) field in DocType 'Activity Type' #. Label of the activity_type (Link) field in DocType 'Timesheet Detail' #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/sales_invoice_timesheet/sales_invoice_timesheet.json #: erpnext/projects/doctype/activity_cost/activity_cost.json #: erpnext/projects/doctype/activity_type/activity_type.json @@ -2263,6 +2311,7 @@ msgstr "" #: erpnext/projects/workspace/projects/projects.json #: erpnext/public/js/projects/timer.js:9 #: erpnext/templates/pages/timelog_info.html:25 +#: erpnext/workspace_sidebar/projects.json msgid "Activity Type" msgstr "" @@ -3000,8 +3049,10 @@ msgstr "" #. Label of a Link in the Financial Reports Workspace #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/selling/report/address_and_contacts/address_and_contacts.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Address And Contacts" msgstr "" @@ -3267,7 +3318,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:39 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:91 -#: erpnext/accounts/report/general_ledger/general_ledger.py:752 +#: erpnext/accounts/report/general_ledger/general_ledger.py:750 msgid "Against Account" msgstr "" @@ -3282,7 +3333,7 @@ msgstr "" msgid "Against Blanket Order" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1099 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1102 msgid "Against Customer Order {0}" msgstr "" @@ -3385,7 +3436,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:785 +#: erpnext/accounts/report/general_ledger/general_ledger.py:783 msgid "Against Voucher" msgstr "" @@ -3409,7 +3460,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:783 +#: erpnext/accounts/report/general_ledger/general_ledger.py:781 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:183 msgid "Against Voucher Type" msgstr "" @@ -3680,7 +3731,7 @@ msgstr "" msgid "All communications including and above this shall be moved into the new Issue" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:969 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:965 msgid "All items are already requested" msgstr "" @@ -3700,11 +3751,11 @@ msgstr "" msgid "All items in this document already have a linked Quality Inspection." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1238 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1241 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1249 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1252 msgid "All linked Sales Orders must be subcontracted." msgstr "" @@ -4448,8 +4499,8 @@ msgstr "" #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:45 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:79 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:44 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:267 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:319 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:268 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:320 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:201 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:111 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:44 @@ -4733,7 +4784,7 @@ msgstr "" msgid "Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:755 +#: erpnext/accounts/doctype/payment_request/payment_request.py:758 msgid "Another Payment Request is already processed" msgstr "" @@ -5007,12 +5058,16 @@ msgid "Apply to Document" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/appointment/appointment.json +#: erpnext/workspace_sidebar/crm.json msgid "Appointment" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Appointment Booking Settings" msgstr "" @@ -5162,7 +5217,7 @@ msgstr "" msgid "As there are reserved stock, you cannot disable {0}." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1089 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1085 msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}." msgstr "" @@ -5196,6 +5251,7 @@ msgstr "" #. Label of the asset (Link) field in DocType 'Asset Value Adjustment' #. Label of a Link in the Assets Workspace #. Label of the asset (Link) field in DocType 'Serial No' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json @@ -5217,6 +5273,7 @@ msgstr "" #: erpnext/assets/workspace/assets/assets.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:192 #: erpnext/stock/doctype/serial_no/serial_no.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset" msgstr "" @@ -5228,18 +5285,22 @@ msgstr "" #. Name of a DocType #. Name of a report #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_activity/asset_activity.json #: erpnext/assets/report/asset_activity/asset_activity.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Activity" msgstr "" #. Group in Asset's connections #. Name of a DocType #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Capitalization" msgstr "" @@ -5267,6 +5328,7 @@ msgstr "" #. Label of a Link in the Assets Workspace #. Label of the asset_category (Link) field in DocType 'Item' #. Label of the asset_category (Link) field in DocType 'Purchase Receipt Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.js:36 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:197 @@ -5281,6 +5343,7 @@ msgstr "" #: erpnext/assets/workspace/assets/assets.json #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Category" msgstr "" @@ -5305,8 +5368,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Depreciation Ledger" msgstr "" @@ -5338,8 +5403,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Depreciations and Balances" msgstr "" @@ -5374,18 +5441,22 @@ msgstr "" #. Log' #. Name of a report #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_maintenance/asset_maintenance.json #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.json #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log_calendar.js:18 #: erpnext/assets/report/asset_maintenance/asset_maintenance.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Maintenance" msgstr "" #. Name of a DocType #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Maintenance Log" msgstr "" @@ -5396,16 +5467,20 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_maintenance_team/asset_maintenance_team.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Maintenance Team" msgstr "" #. Name of a DocType #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_movement/asset_movement.json #: erpnext/assets/workspace/assets/assets.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:203 +#: erpnext/workspace_sidebar/assets.json msgid "Asset Movement" msgstr "" @@ -5414,7 +5489,7 @@ msgstr "" msgid "Asset Movement Item" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1178 +#: erpnext/assets/doctype/asset/asset.py:1181 msgid "Asset Movement record {0} created" msgstr "" @@ -5475,10 +5550,12 @@ msgstr "" #. Option for the 'Type of Transaction' (Select) field in DocType 'Serial and #. Batch Bundle' #. Label of the asset_repair (Link) field in DocType 'Stock Entry' +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_repair/asset_repair.json #: erpnext/assets/workspace/assets/assets.json #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json #: erpnext/stock/doctype/stock_entry/stock_entry.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Repair" msgstr "" @@ -5530,8 +5607,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Assets Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/workspace/assets/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Asset Value Adjustment" msgstr "" @@ -5549,7 +5628,7 @@ msgstr "" msgid "Asset cancelled" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:727 +#: erpnext/assets/doctype/asset/asset.py:730 msgid "Asset cannot be cancelled, as it is already {0}" msgstr "" @@ -5565,7 +5644,7 @@ msgstr "" msgid "Asset created" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1418 +#: erpnext/assets/doctype/asset/asset.py:1422 msgid "Asset created after being split from Asset {0}" msgstr "" @@ -5593,7 +5672,7 @@ msgstr "" msgid "Asset restored after Asset Capitalization {0} was cancelled" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1473 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 msgid "Asset returned" msgstr "" @@ -5605,8 +5684,8 @@ msgstr "" msgid "Asset scrapped via Journal Entry {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1473 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1476 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 msgid "Asset sold" msgstr "" @@ -5618,7 +5697,7 @@ msgstr "" msgid "Asset transferred to Location {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1427 +#: erpnext/assets/doctype/asset/asset.py:1431 msgid "Asset updated after being split into Asset {0}" msgstr "" @@ -5671,7 +5750,7 @@ msgstr "" msgid "Asset {0} must be submitted" msgstr "" -#: erpnext/controllers/buying_controller.py:1013 +#: erpnext/controllers/buying_controller.py:1030 msgid "Asset {assets_link} created for {item_code}" msgstr "" @@ -5692,20 +5771,23 @@ msgstr "" #. Label of the assets (Table) field in DocType 'Asset Movement' #. Name of a Workspace #. Label of a Card Break in the Assets Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/finance_book/finance_book_dashboard.py:9 #: erpnext/accounts/report/balance_sheet/balance_sheet.py:249 #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json #: erpnext/assets/doctype/asset_movement/asset_movement.json -#: erpnext/assets/workspace/assets/assets.json +#: erpnext/assets/workspace/assets/assets.json erpnext/desktop_icon/assets.json +#: erpnext/workspace_sidebar/assets.json msgid "Assets" msgstr "" -#: erpnext/controllers/buying_controller.py:1031 +#: erpnext/controllers/buying_controller.py:1048 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "" -#: erpnext/controllers/buying_controller.py:1018 +#: erpnext/controllers/buying_controller.py:1035 msgid "Assets {assets_link} created for {item_code}" msgstr "" @@ -5737,7 +5819,7 @@ msgstr "" msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} in the warehouse {4}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1355 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1358 msgid "At Row {0}: In Serial and Batch Bundle {1} must have docstatus as 1 and not 0" msgstr "" @@ -5745,7 +5827,7 @@ msgstr "" msgid "At least one account with exchange gain or loss is required" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1284 +#: erpnext/assets/doctype/asset/asset.py:1287 msgid "At least one asset has to be selected." msgstr "" @@ -5758,7 +5840,7 @@ msgid "At least one item should be entered with negative quantity in return docu msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:530 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:542 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:545 msgid "At least one mode of payment is required for POS invoice." msgstr "" @@ -5794,7 +5876,7 @@ msgstr "" msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1117 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1120 msgid "At row {0}: Batch No is mandatory for Item {1}" msgstr "" @@ -5802,11 +5884,11 @@ msgstr "" msgid "At row {0}: Parent Row No cannot be set for item {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1102 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1105 msgid "At row {0}: Qty is mandatory for the batch {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1109 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1112 msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" @@ -6264,8 +6346,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Available Stock for Packing Items" msgstr "" @@ -6392,6 +6476,7 @@ msgstr "" #. Label of the bom (Link) field in DocType 'Subcontracting Inward Order Item' #. Label of the bom (Link) field in DocType 'Subcontracting Order Item' #. Label of the bom (Link) field in DocType 'Subcontracting Receipt Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -6415,6 +6500,7 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:525 #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM" msgstr "" @@ -6431,8 +6517,10 @@ msgid "BOM 2" msgstr "" #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:4 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Comparison Tool" msgstr "" @@ -6443,8 +6531,10 @@ msgstr "" #. Label of the bom_creator (Link) field in DocType 'BOM' #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Creator" msgstr "" @@ -6552,8 +6642,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Operations Time" msgstr "" @@ -6572,8 +6664,10 @@ msgstr "" #. Label of a Link in the Manufacturing Workspace #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/report/bom_search/bom_search.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Search" msgstr "" @@ -6584,9 +6678,11 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/bom_stock_report/bom_stock_report.html:1 #: erpnext/manufacturing/report/bom_stock_report/bom_stock_report.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Stock Report" msgstr "" @@ -6615,8 +6711,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "BOM Update Tool" msgstr "" @@ -6758,7 +6856,7 @@ msgstr "" msgid "Balance (Dr - Cr)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:704 +#: erpnext/accounts/report/general_ledger/general_ledger.py:702 msgid "Balance ({0})" msgstr "" @@ -6798,6 +6896,7 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace #. Label of the column_break_16 (Column Break) field in DocType 'Email Digest' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/financial_report_template/financial_report_template.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json @@ -6805,6 +6904,7 @@ msgstr "" #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/public/js/financial_statements.js:311 #: erpnext/setup/doctype/email_digest/email_digest.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Balance Sheet" msgstr "" @@ -6865,6 +6965,7 @@ msgstr "" #. Label of the bank (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace #. Option for the 'Salary Mode' (Select) field in DocType 'Employee' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/bank/bank.json #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -6878,6 +6979,7 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:99 #: erpnext/setup/doctype/employee/employee.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank" msgstr "" @@ -6903,6 +7005,7 @@ msgstr "" #. Label of the bank_account (Link) field in DocType 'Payment Order Reference' #. Label of the bank_account (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account/bank_account.json #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json @@ -6917,6 +7020,7 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:16 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:16 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank Account" msgstr "" @@ -6947,16 +7051,20 @@ msgid "Bank Account No" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Subtype" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_type/bank_account_type.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Type" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:379 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:381 msgid "Bank Account {} in Bank Transaction {} is not matching with Bank Account {}" msgstr "" @@ -6985,8 +7093,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank Clearance" msgstr "" @@ -7027,7 +7137,9 @@ msgid "Bank Entry" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json +#: erpnext/workspace_sidebar/banking.json msgid "Bank Guarantee" msgstr "" @@ -7055,6 +7167,11 @@ msgstr "" msgid "Bank Overdraft Account" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/banking.json +msgid "Bank Reconciliation" +msgstr "" + #. Name of a report #. Label of a Link in the Invoicing Workspace #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:1 @@ -7080,7 +7197,10 @@ msgid "Bank Statement balance as per General Ledger" msgstr "" #. Name of a DocType +#. Option for the 'Reference Type' (Select) field in DocType 'Journal Entry +#. Account' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json +#: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js:32 msgid "Bank Transaction" msgstr "" @@ -7109,7 +7229,7 @@ msgstr "" msgid "Bank Transaction {0} added as Payment Entry" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:150 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:152 msgid "Bank Transaction {0} is already fully reconciled" msgstr "" @@ -7146,9 +7266,13 @@ msgstr "" #. Label of the banking_section (Section Break) field in DocType 'Accounts #. Settings' #. Label of a Card Break in the Invoicing Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/desktop_icon/banking.json #: erpnext/setup/setup_wizard/data/industry_type.txt:8 +#: erpnext/workspace_sidebar/banking.json msgid "Banking" msgstr "" @@ -7351,8 +7475,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Batch Item Expiry Status" msgstr "" @@ -7380,6 +7506,7 @@ msgstr "" #. Label of the batch_no (Link) field in DocType 'Subcontracting Receipt Item' #. Label of the batch_no (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -7407,6 +7534,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.js:64 #: erpnext/stock/report/available_batch_report/available_batch_report.py:51 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.js:68 +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:33 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:81 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:160 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.js:19 @@ -7414,14 +7542,15 @@ msgstr "" #: erpnext/stock/report/stock_ledger/stock_ledger.js:77 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json +#: erpnext/workspace_sidebar/stock.json msgid "Batch No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1120 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1123 msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3262 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3285 msgid "Batch No {0} does not exists" msgstr "" @@ -7429,7 +7558,7 @@ msgstr "" msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:437 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:438 msgid "Batch No {0} is not present in the original {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -7444,7 +7573,7 @@ msgstr "" msgid "Batch Nos" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1853 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1876 msgid "Batch Nos are created successfully" msgstr "" @@ -7521,8 +7650,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Batch-Wise Balance History" msgstr "" @@ -7874,11 +8005,13 @@ msgstr "" #. Label of the blanket_order (Link) field in DocType 'Quotation Item' #. Label of the blanket_order (Link) field in DocType 'Sales Order Item' #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Blanket Order" msgstr "" @@ -8145,6 +8278,9 @@ msgstr "" #. Settings' #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cost_center/cost_center.js:45 @@ -8157,6 +8293,7 @@ msgstr "" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:334 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:448 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budget.json msgid "Budget" msgstr "" @@ -8224,6 +8361,11 @@ msgstr "" msgid "Budget Start Date" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/budget.json +msgid "Budget Variance" +msgstr "" + #. Name of a report #. Label of a Link in the Invoicing Workspace #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:77 @@ -8337,19 +8479,22 @@ msgstr "" #. Group in Subscription's connections #. Name of a Workspace #. Label of a Card Break in the Buying Workspace +#. Label of a Desktop Icon #. Group in Incoterm's connections #. Label of the buying (Check) field in DocType 'Terms and Conditions' #. Label of the buying (Check) field in DocType 'Item Price' #. Label of the buying (Check) field in DocType 'Price List' +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json #: erpnext/accounts/doctype/subscription/subscription.json -#: erpnext/buying/workspace/buying/buying.json +#: erpnext/buying/workspace/buying/buying.json erpnext/desktop_icon/buying.json #: erpnext/setup/doctype/incoterm/incoterm.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/item_price/item_price.json #: erpnext/stock/doctype/price_list/price_list.json +#: erpnext/workspace_sidebar/buying.json msgid "Buying" msgstr "" @@ -8373,9 +8518,11 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace #. Label of a shortcut in the ERPNext Settings Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Buying Settings" msgstr "" @@ -8408,6 +8555,11 @@ msgstr "" msgid "CC To" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/accounts_setup.json +msgid "COA Importer" +msgstr "" + #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "CODE-39" @@ -8423,8 +8575,11 @@ msgid "COGS Debit" msgstr "" #. Name of a Workspace +#. Label of a Desktop Icon #. Label of a Card Break in the Home Workspace -#: erpnext/crm/workspace/crm/crm.json erpnext/setup/workspace/home/home.json +#. Title of a Workspace Sidebar +#: erpnext/crm/workspace/crm/crm.json erpnext/desktop_icon/crm.json +#: erpnext/setup/workspace/home/home.json erpnext/workspace_sidebar/crm.json msgid "CRM" msgstr "" @@ -8434,7 +8589,10 @@ msgid "CRM Note" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/crm_settings/crm_settings.json +#: erpnext/workspace_sidebar/crm.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "CRM Settings" msgstr "" @@ -8647,8 +8805,9 @@ msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/campaign_efficiency/campaign_efficiency.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Campaign Efficiency" msgstr "" @@ -8844,7 +9003,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:1122 +#: erpnext/controllers/buying_controller.py:1139 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" @@ -8856,10 +9015,6 @@ msgstr "" msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:49 -msgid "Cannot change Fiscal Year Start Date and Fiscal Year End Date once the Fiscal Year is saved." -msgstr "" - #: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py:73 msgid "Cannot change Reference Document Type." msgstr "" @@ -9205,9 +9360,11 @@ msgstr "" #. Template' #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/financial_report_template/financial_report_template.json #: erpnext/accounts/report/cash_flow/cash_flow.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Cash Flow" msgstr "" @@ -9326,7 +9483,7 @@ msgstr "" msgid "Category-wise Asset Value" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:294 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:297 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:130 msgid "Caution" msgstr "" @@ -9431,7 +9588,7 @@ msgstr "" msgid "Change in Stock Value" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1025 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 msgid "Change the account type to Receivable or select a different account." msgstr "" @@ -9512,6 +9669,7 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Label of the section_break_28 (Section Break) field in DocType 'Company' #. Label of a Link in the Home Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.js:69 #: erpnext/accounts/doctype/account/account_tree.js:5 #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:52 @@ -9520,6 +9678,8 @@ msgstr "" #: erpnext/setup/doctype/company/company.js:123 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/home/home.json +#: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Chart of Accounts" msgstr "" @@ -9533,9 +9693,11 @@ msgid "Chart of Accounts Importer" msgstr "" #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account_tree.js:196 #: erpnext/accounts/doctype/cost_center/cost_center.js:41 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Chart of Cost Centers" msgstr "" @@ -9892,7 +10054,7 @@ msgstr "" msgid "Closing (Dr)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:399 +#: erpnext/accounts/report/general_ledger/general_ledger.py:397 msgid "Closing (Opening + Total)" msgstr "" @@ -9921,7 +10083,7 @@ msgstr "" #: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.json #: erpnext/accounts/doctype/financial_report_row/financial_report_row.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:232 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:230 msgid "Closing Balance" msgstr "" @@ -10108,6 +10270,7 @@ msgstr "" #. Health Monitor' #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/ledger_health_monitor/ledger_health_monitor.json +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:26 msgid "Companies" msgstr "" @@ -10262,6 +10425,7 @@ msgstr "" #. Label of the company (Link) field in DocType 'Subcontracting Receipt' #. Label of the company (Link) field in DocType 'Issue' #. Label of the company (Link) field in DocType 'Warranty Claim' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js:8 #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:12 @@ -10329,6 +10493,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:24 #: erpnext/accounts/report/account_balance/account_balance.js:8 #: erpnext/accounts/report/accounts_payable/accounts_payable.js:8 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:8 @@ -10355,9 +10520,9 @@ msgstr "" #: erpnext/accounts/report/gross_profit/gross_profit.js:8 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.js:8 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js:40 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:224 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:225 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js:28 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:269 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:270 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:8 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js:8 #: erpnext/accounts/report/pos_register/pos_register.js:8 @@ -10459,7 +10624,7 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/supplier_number_at_customer/supplier_number_at_customer.json #: erpnext/selling/page/point_of_sale/pos_controller.js:72 -#: erpnext/selling/page/sales_funnel/sales_funnel.js:33 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:36 #: erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.js:16 #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.js:8 #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js:8 @@ -10527,6 +10692,7 @@ msgstr "" #: erpnext/stock/report/item_shortage_report/item_shortage_report.js:8 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:137 #: erpnext/stock/report/landed_cost_report/landed_cost_report.js:8 +#: erpnext/stock/report/negative_batch_report/negative_batch_report.js:8 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.js:8 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:115 #: erpnext/stock/report/reserved_stock/reserved_stock.js:8 @@ -10555,6 +10721,7 @@ msgstr "" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Company" msgstr "" @@ -10719,7 +10886,7 @@ msgstr "" msgid "Company and Posting Date is mandatory" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2532 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2580 msgid "Company currencies of both the companies should match for Inter Company Transactions." msgstr "" @@ -11083,12 +11250,17 @@ msgstr "" msgid "Consolidated Financial Statement" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "Consolidated Report" +msgstr "" + #. Label of the consolidated_invoice (Link) field in DocType 'POS Invoice' #. Label of the consolidated_invoice (Link) field in DocType 'POS Invoice Merge #. Log' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:555 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:558 msgid "Consolidated Sales Invoice" msgstr "" @@ -11363,7 +11535,9 @@ msgid "Contra Entry" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/contract/contract.json +#: erpnext/workspace_sidebar/crm.json msgid "Contract" msgstr "" @@ -11708,6 +11882,7 @@ msgstr "" #. Item' #. Label of the cost_center (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json #: erpnext/accounts/doctype/budget/budget.json @@ -11752,10 +11927,10 @@ 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:153 -#: erpnext/accounts/report/general_ledger/general_ledger.py:778 +#: erpnext/accounts/report/general_ledger/general_ledger.py:776 #: 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:297 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:298 #: erpnext/accounts/report/purchase_register/purchase_register.js:46 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:29 #: erpnext/accounts/report/sales_register/sales_register.js:52 @@ -11793,13 +11968,16 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json +#: erpnext/workspace_sidebar/budget.json msgid "Cost Center" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/budget.json msgid "Cost Center Allocation" msgstr "" @@ -11867,7 +12045,7 @@ msgstr "" msgid "Cost Center {} is a group cost center and group cost centers cannot be used in transactions" msgstr "" -#: erpnext/accounts/report/financial_statements.py:661 +#: erpnext/accounts/report/financial_statements.py:658 msgid "Cost Center: {0} does not exist" msgstr "" @@ -12037,12 +12215,14 @@ msgstr "" #. Label of the coupon_code (Link) field in DocType 'Quotation' #. Label of the coupon_code (Link) field in DocType 'Sales Order' #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/coupon_code/coupon_code.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Coupon Code" msgstr "" @@ -12434,11 +12614,11 @@ msgstr "" msgid "Credit" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:722 +#: erpnext/accounts/report/general_ledger/general_ledger.py:720 msgid "Credit (Transaction)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:697 +#: erpnext/accounts/report/general_ledger/general_ledger.py:695 msgid "Credit ({0})" msgstr "" @@ -12563,6 +12743,7 @@ msgstr "" #. Option for the 'Journal Entry Type' (Select) field in DocType 'Journal Entry #. Template' #. Label of the credit_note (Link) field in DocType 'Stock Entry' +#. Label of a Workspace Sidebar Item #: 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 @@ -12572,6 +12753,7 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/install_fixtures.py:303 #: erpnext/stock/doctype/delivery_note/delivery_note.js:89 #: erpnext/stock/doctype/stock_entry/stock_entry.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Credit Note" msgstr "" @@ -12584,7 +12766,7 @@ msgstr "" #. Option for the 'Status' (Select) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:274 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:275 msgid "Credit Note Issued" msgstr "" @@ -12732,16 +12914,21 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/doctype/currency_exchange/currency_exchange.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Currency Exchange" msgstr "" #. Label of the currency_exchange_section (Section Break) field in DocType #. 'Accounts Settings' #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json +#: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Currency Exchange Settings" msgstr "" @@ -12979,8 +13166,10 @@ msgstr "" #. Option for the 'Report Type' (Select) field in DocType 'Financial Report #. Template' #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/financial_report_template/financial_report_template.json #: erpnext/accounts/report/custom_financial_statement/custom_financial_statement.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Custom Financial Statement" msgstr "" @@ -13059,6 +13248,7 @@ msgstr "" #. Label of the customer (Link) field in DocType 'Warranty Claim' #. Label of a field in the issues Web Form #. Label of the customer (Link) field in DocType 'Call Log' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json #: erpnext/accounts/doctype/coupon_code/coupon_code.json #: erpnext/accounts/doctype/discounted_invoice/discounted_invoice.json @@ -13080,7 +13270,7 @@ msgstr "" #: 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 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:213 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:214 #: erpnext/accounts/report/pos_register/pos_register.js:44 #: erpnext/accounts/report/pos_register/pos_register.py:120 #: erpnext/accounts/report/pos_register/pos_register.py:181 @@ -13166,6 +13356,10 @@ msgstr "" #: erpnext/support/report/issue_summary/issue_summary.py:34 #: erpnext/support/web_form/issues/issues.json #: erpnext/telephony/doctype/call_log/call_log.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/home.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/selling.json +#: erpnext/workspace_sidebar/subscription.json msgid "Customer" msgstr "" @@ -13191,8 +13385,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Customer Acquisition and Loyalty" msgstr "" @@ -13220,7 +13416,9 @@ msgid "Customer Address" msgstr "" #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Customer Addresses And Contacts" msgstr "" @@ -13253,9 +13451,12 @@ msgstr "" #. Label of a Link in the Financial Reports Workspace #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/selling.json msgid "Customer Credit Balance" msgstr "" @@ -13329,6 +13530,7 @@ msgstr "" #. Option for the 'Entity Type' (Select) field in DocType 'Service Level #. Agreement' #. Label of the customer_group (Link) field in DocType 'Warranty Claim' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/customer_group_item/customer_group_item.json #: erpnext/accounts/doctype/loyalty_program/loyalty_program.json #: erpnext/accounts/doctype/pos_customer_group/pos_customer_group.json @@ -13344,9 +13546,9 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:85 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:185 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:56 -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:165 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:163 #: erpnext/accounts/report/gross_profit/gross_profit.py:423 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:200 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:201 #: erpnext/accounts/report/sales_register/sales_register.js:27 #: erpnext/accounts/report/sales_register/sales_register.py:202 #: erpnext/crm/doctype/opportunity/opportunity.json @@ -13371,6 +13573,7 @@ msgstr "" #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:42 #: erpnext/support/doctype/service_level_agreement/service_level_agreement.json #: erpnext/support/doctype/warranty_claim/warranty_claim.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/selling.json msgid "Customer Group" msgstr "" @@ -13412,6 +13615,11 @@ msgstr "" msgid "Customer LPO No." msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "Customer Ledger" +msgstr "" + #. Name of a report #. Label of a Link in the Financial Reports Workspace #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.json @@ -13456,7 +13664,7 @@ msgstr "" #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:92 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:35 #: erpnext/accounts/report/gross_profit/gross_profit.py:430 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:220 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:221 #: erpnext/accounts/report/sales_register/sales_register.py:193 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/crm/doctype/opportunity/opportunity.json @@ -13614,7 +13822,7 @@ msgstr "" msgid "Customer required for 'Customerwise Discount'" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1142 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1145 #: erpnext/selling/doctype/sales_order/sales_order.py:432 #: erpnext/stock/doctype/delivery_note/delivery_note.py:432 msgid "Customer {0} does not belong to project {1}" @@ -13686,8 +13894,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/customers_without_any_sales_transactions/customers_without_any_sales_transactions.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Customers Without Any Sales Transactions" msgstr "" @@ -13741,8 +13951,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Daily Timesheet Summary" msgstr "" @@ -13971,11 +14183,11 @@ msgstr "" msgid "Debit" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:715 +#: erpnext/accounts/report/general_ledger/general_ledger.py:713 msgid "Debit (Transaction)" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:690 +#: erpnext/accounts/report/general_ledger/general_ledger.py:688 msgid "Debit ({0})" msgstr "" @@ -14023,6 +14235,7 @@ msgstr "" #. Option for the 'Entry Type' (Select) field in DocType 'Journal Entry' #. Option for the 'Journal Entry Type' (Select) field in DocType 'Journal Entry #. Template' +#. Label of a Workspace Sidebar Item #: 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 @@ -14031,6 +14244,7 @@ msgstr "" #: erpnext/controllers/sales_and_purchase_return.py:457 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:304 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:45 +#: erpnext/workspace_sidebar/invoicing.json msgid "Debit Note" msgstr "" @@ -14054,13 +14268,13 @@ msgstr "" #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1010 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1021 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1013 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1024 #: erpnext/controllers/accounts_controller.py:2360 msgid "Debit To" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1006 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1009 msgid "Debit To is required" msgstr "" @@ -14156,6 +14370,11 @@ msgstr "" msgid "Deductee Details" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/taxes.json +msgid "Deduction Certificate" +msgstr "" + #. Label of the deductions_or_loss_section (Section Break) field in DocType #. 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -14754,8 +14973,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Delayed Tasks Summary" msgstr "" @@ -14981,6 +15202,7 @@ msgstr "" #. Inspection' #. Label of the delivery_note (Link) field in DocType 'Shipment Delivery Note' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:129 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:332 @@ -14988,7 +15210,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js:22 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:21 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:283 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:284 #: erpnext/accounts/report/sales_register/sales_register.py:245 #: erpnext/selling/doctype/sales_order/sales_order.js:1042 #: erpnext/selling/doctype/sales_order/sales_order_list.js:81 @@ -15002,6 +15224,7 @@ msgstr "" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/shipment_delivery_note/shipment_delivery_note.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Delivery Note" msgstr "" @@ -15034,13 +15257,15 @@ msgstr "" #. Label of a Link in the Selling Workspace #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/report/delivery_note_trends/delivery_note_trends.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Delivery Note Trends" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1403 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1406 msgid "Delivery Note {0} is not submitted" msgstr "" @@ -15068,7 +15293,10 @@ msgid "Delivery Schedule Item" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/delivery_settings/delivery_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/stock.json msgid "Delivery Settings" msgstr "" @@ -15097,10 +15325,12 @@ msgstr "" #. Label of the delivery_trip (Link) field in DocType 'Delivery Note' #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/delivery_note/delivery_note.js:280 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Delivery Trip" msgstr "" @@ -15113,10 +15343,8 @@ msgstr "" msgid "Delivery User" msgstr "" -#. Label of the warehouse (Link) field in DocType 'Sales Order Item' #. Label of the delivery_warehouse (Link) field in DocType 'Subcontracting #. Inward Order Item' -#: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json msgid "Delivery Warehouse" msgstr "" @@ -15279,7 +15507,7 @@ msgstr "" msgid "Depreciation Entry Posting Status" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1252 +#: erpnext/assets/doctype/asset/asset.py:1255 msgid "Depreciation Entry against asset {0}" msgstr "" @@ -15322,7 +15550,7 @@ msgstr "" msgid "Depreciation Posting Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:834 +#: erpnext/assets/doctype/asset/asset.js:881 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" @@ -15330,7 +15558,7 @@ msgstr "" msgid "Depreciation Row {0}: Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:712 +#: erpnext/assets/doctype/asset/asset.py:715 msgid "Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}" msgstr "" @@ -15345,10 +15573,12 @@ msgstr "" #. Label of the depreciation_schedule (Table) field in DocType 'Asset Shift #. Allocation' #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json #: erpnext/assets/doctype/asset_shift_allocation/asset_shift_allocation.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json +#: erpnext/workspace_sidebar/assets.json msgid "Depreciation Schedule" msgstr "" @@ -15569,7 +15799,7 @@ msgstr "" msgid "Direct Income" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:357 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:358 msgid "Direct return is not allowed for Timesheet." msgstr "" @@ -16232,7 +16462,7 @@ msgstr "" msgid "Do not update variants on save" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:872 +#: erpnext/assets/doctype/asset/asset.js:919 msgid "Do you really want to restore this scrapped asset?" msgstr "" @@ -16299,6 +16529,10 @@ msgstr "" msgid "Document Count" msgstr "" +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:78 +msgid "Document No" +msgstr "" + #. Label of the document_type (Link) field in DocType 'Subscription Invoice' #: erpnext/accounts/doctype/subscription_invoice/subscription_invoice.json msgid "Document Type " @@ -16392,15 +16626,19 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/downtime_analysis/downtime_analysis.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Downtime Analysis" msgstr "" #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/downtime_entry/downtime_entry.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Downtime Entry" msgstr "" @@ -16410,7 +16648,7 @@ msgstr "" msgid "Downtime Reason" msgstr "" -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:248 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:246 msgid "Dr/Cr" msgstr "" @@ -16500,8 +16738,10 @@ msgid "Due to stock closing entry {0}, you cannot repost item valuation before { msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:156 +#: erpnext/workspace_sidebar/banking.json msgid "Dunning" msgstr "" @@ -16541,8 +16781,10 @@ msgstr "" #. Label of the dunning_type (Link) field in DocType 'Dunning' #. Name of a DocType #. Label of the dunning_type (Data) field in DocType 'Dunning Type' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/dunning_type/dunning_type.json +#: erpnext/workspace_sidebar/banking.json msgid "Dunning Type" msgstr "" @@ -16688,8 +16930,17 @@ msgstr "" msgid "EMU of current" msgstr "" +#. Label of a Desktop Icon +#: erpnext/desktop_icon/erpnext.json +msgid "ERPNext" +msgstr "" + +#. Label of a Desktop Icon #. Name of a Workspace +#. Title of a Workspace Sidebar +#: erpnext/desktop_icon/erpnext_settings.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "ERPNext Settings" msgstr "" @@ -16864,7 +17115,9 @@ msgid "Email Address must be unique, it is already used in {0}" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/email_campaign/email_campaign.json +#: erpnext/workspace_sidebar/crm.json msgid "Email Campaign" msgstr "" @@ -17469,7 +17722,7 @@ msgstr "" msgid "Enter customer's phone number" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:843 +#: erpnext/assets/doctype/asset/asset.js:890 msgid "Enter date to scrap asset" msgstr "" @@ -17589,7 +17842,7 @@ msgstr "" msgid "Error getting details for {0}: {1}" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:310 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:312 msgid "Error in party matching for Bank Transaction {0}" msgstr "" @@ -18053,7 +18306,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/account_balance/account_balance.js:46 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:245 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:246 #: erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json #: erpnext/assets/doctype/asset_repair_purchase_invoice/asset_repair_purchase_invoice.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -18248,6 +18501,11 @@ msgstr "" msgid "FIFO/LIFO Queue" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/accounts_setup.json +msgid "FX Revaluation" +msgstr "" + #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Fahrenheit" @@ -18338,6 +18596,11 @@ msgstr "" msgid "Feedback By" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/quality.json +msgid "Feedback Template" +msgstr "" + #. Option for the 'Reference Type' (Select) field in DocType 'Journal Entry #. Account' #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -18545,6 +18808,7 @@ msgstr "" #. Label of the finance_book (Link) field in DocType 'Asset Finance Book' #. Label of the finance_book (Link) field in DocType 'Asset Shift Allocation' #. Label of the finance_book (Link) field in DocType 'Asset Value Adjustment' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/finance_book/finance_book.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -18575,6 +18839,7 @@ msgstr "" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:48 #: erpnext/public/js/financial_statements.js:373 +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "" @@ -18612,7 +18877,9 @@ msgid "Financial Report Row" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/financial_report_template/financial_report_template.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Financial Report Template" msgstr "" @@ -18625,7 +18892,14 @@ msgid "Financial Report Template {0} not found" msgstr "" #. Name of a Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/desktop_icon/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Financial Reports" msgstr "" @@ -18844,15 +19118,18 @@ msgstr "" #. Name of a report #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/support/report/first_response_time_for_issues/first_response_time_for_issues.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "First Response Time for Issues" msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/first_response_time_for_opportunity/first_response_time_for_opportunity.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "First Response Time for Opportunity" msgstr "" @@ -18869,11 +19146,11 @@ msgstr "" #. Certificate' #. Label of the fiscal_year (Link) field in DocType 'Target Detail' #. Label of the fiscal_year (Data) field in DocType 'Stock Ledger Entry' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json -#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:1 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:18 #: erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.js:16 #: erpnext/accounts/report/profitability_analysis/profitability_analysis.js:38 @@ -18890,6 +19167,7 @@ msgstr "" #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js:15 #: erpnext/setup/doctype/target_detail/target_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Fiscal Year" msgstr "" @@ -18898,12 +19176,12 @@ msgstr "" msgid "Fiscal Year Company" msgstr "" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:65 -msgid "Fiscal Year End Date should be one year after Fiscal Year Start Date" +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:5 +msgid "Fiscal Year Details" msgstr "" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:129 -msgid "Fiscal Year Start Date and Fiscal Year End Date are already set in Fiscal Year {0}" +#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:47 +msgid "Fiscal Year End Date should be one year after Fiscal Year Start Date" msgstr "" #: erpnext/controllers/trends.py:53 @@ -18942,7 +19220,7 @@ msgstr "" #. Capitalization Asset Item' #. Label of the fixed_asset_account (Link) field in DocType 'Asset Category #. Account' -#: erpnext/assets/doctype/asset/asset.py:894 +#: erpnext/assets/doctype/asset/asset.py:897 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/doctype/asset_category_account/asset_category_account.json msgid "Fixed Asset Account" @@ -18958,7 +19236,9 @@ msgid "Fixed Asset Item must be a non-stock item." msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.json +#: erpnext/workspace_sidebar/assets.json msgid "Fixed Asset Register" msgstr "" @@ -19302,6 +19582,11 @@ msgstr "" msgid "Forecast Qty" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/manufacturing.json +msgid "Forecasting" +msgstr "" + #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:280 #: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:281 #: erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py:88 @@ -19888,7 +20173,7 @@ msgstr "" #. Name of a DocType #: erpnext/accounts/doctype/gl_entry/gl_entry.json -#: erpnext/accounts/report/general_ledger/general_ledger.py:675 +#: erpnext/accounts/report/general_ledger/general_ledger.py:673 msgid "GL Entry" msgstr "" @@ -19993,11 +20278,15 @@ msgstr "" #. Accounts' #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.js:92 #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/general_ledger/general_ledger.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "General Ledger" msgstr "" @@ -20358,8 +20647,10 @@ msgstr "" #. Name of a DocType #. Label of a shortcut in the ERPNext Settings Workspace +#. Label of a Workspace Sidebar Item #: erpnext/setup/doctype/global_defaults/global_defaults.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Global Defaults" msgstr "" @@ -20621,11 +20912,13 @@ msgstr "" #. Label of a Link in the Financial Reports Workspace #. Label of the gross_profit (Currency) field in DocType 'Quotation Item' #. Label of the gross_profit (Currency) field in DocType 'Sales Order Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/gross_profit/gross_profit.json #: erpnext/accounts/report/gross_profit/gross_profit.py:375 #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Gross Profit" msgstr "" @@ -21491,7 +21784,7 @@ msgstr "" #. Description of the 'Allow Negative Stock for Batch' (Check) field in DocType #. 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json -msgid "If enabled, the system will allow negative stock entries for the batch, but this could calculate the valuation rate incorrectly, so avoid using this option." +msgid "If enabled, the system will allow negative stock entries for the batch. But, this may lead to incorrect valuation rates, so it is recommended to avoid using this option. The system will permit negative stock only when it is caused by backdated entries and will validate and block negative stock in all other cases." msgstr "" #. Description of the 'Allow UOM with Conversion Rate Defined in Item' (Check) @@ -21700,7 +21993,7 @@ msgstr "" msgid "If you need to reconcile particular transactions against each other, then please select accordingly. If not, all the transactions will be allocated in FIFO order." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1094 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1090 msgid "If you still want to proceed, please disable 'Skip Available Sub Assembly Items' checkbox." msgstr "" @@ -22138,9 +22431,11 @@ msgstr "" #. Label of a Link in the CRM Workspace #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/workspace/crm/crm.json #: erpnext/selling/report/inactive_customers/inactive_customers.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/crm.json msgid "Inactive Customers" msgstr "" @@ -22342,7 +22637,7 @@ msgstr "" msgid "Included Fee" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:325 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:327 msgid "Included fee is bigger than the withdrawal itself." msgstr "" @@ -22366,9 +22661,9 @@ msgstr "" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:236 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:438 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:439 #: erpnext/accounts/report/account_balance/account_balance.js:27 -#: erpnext/accounts/report/financial_statements.py:776 +#: erpnext/accounts/report/financial_statements.py:773 #: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:180 #: erpnext/accounts/report/profitability_analysis/profitability_analysis.py:192 msgid "Income" @@ -22388,7 +22683,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json #: erpnext/accounts/report/account_balance/account_balance.js:53 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js:77 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:290 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:291 msgid "Income Account" msgstr "" @@ -22757,7 +23052,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:462 #: erpnext/stock/doctype/pick_list/pick_list.py:134 #: erpnext/stock/doctype/pick_list/pick_list.py:152 -#: erpnext/stock/doctype/pick_list/pick_list.py:1020 +#: erpnext/stock/doctype/pick_list/pick_list.py:1019 #: erpnext/stock/doctype/stock_entry/stock_entry.py:957 #: erpnext/stock/serial_batch_bundle.py:1197 erpnext/stock/stock_ledger.py:1710 #: erpnext/stock/stock_ledger.py:2170 @@ -23001,8 +23296,8 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:380 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:388 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1026 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1019 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1029 #: erpnext/assets/doctype/asset_category/asset_category.py:69 #: erpnext/assets/doctype/asset_category/asset_category.py:97 #: erpnext/controllers/accounts_controller.py:3204 @@ -23011,7 +23306,7 @@ msgid "Invalid Account" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:400 -#: erpnext/accounts/doctype/payment_request/payment_request.py:876 +#: erpnext/accounts/doctype/payment_request/payment_request.py:879 msgid "Invalid Allocated Amount" msgstr "" @@ -23047,7 +23342,7 @@ msgstr "" msgid "Invalid Company Field" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2307 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2355 msgid "Invalid Company for Inter Company Transaction." msgstr "" @@ -23077,8 +23372,8 @@ msgstr "" msgid "Invalid Document Type" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:323 -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:328 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:325 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:330 msgid "Invalid Formula" msgstr "" @@ -23087,7 +23382,7 @@ msgid "Invalid Group By" msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:499 -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:957 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:953 msgid "Invalid Item" msgstr "" @@ -23100,7 +23395,7 @@ msgstr "" msgid "Invalid Ledger Entries" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:558 +#: erpnext/assets/doctype/asset/asset.py:561 msgid "Invalid Net Purchase Amount" msgstr "" @@ -23167,8 +23462,8 @@ msgstr "" msgid "Invalid Sales Invoices" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:649 -#: erpnext/assets/doctype/asset/asset.py:677 +#: erpnext/assets/doctype/asset/asset.py:652 +#: erpnext/assets/doctype/asset/asset.py:680 msgid "Invalid Schedule" msgstr "" @@ -23194,7 +23489,7 @@ msgstr "" msgid "Invalid Warehouse" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:396 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:398 msgid "Invalid amount in accounting entries of {} {} for Account {}: {}" msgstr "" @@ -23245,7 +23540,7 @@ msgstr "" msgid "Invalid {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2305 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2353 msgid "Invalid {0} for Inter Company Transaction." msgstr "" @@ -23266,9 +23561,11 @@ msgid "Inventory Account Currency" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/patches/v15_0/refactor_closing_stock_balance.py:43 #: erpnext/stock/doctype/inventory_dimension/inventory_dimension.json #: erpnext/stock/doctype/inventory_dimension/inventory_dimension.py:176 +#: erpnext/workspace_sidebar/stock.json msgid "Inventory Dimension" msgstr "" @@ -23310,8 +23607,8 @@ msgstr "" #: erpnext/accounts/doctype/discounted_invoice/discounted_invoice.json #: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json #: erpnext/accounts/doctype/subscription_invoice/subscription_invoice.json -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:169 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:186 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:170 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:187 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:97 msgid "Invoice" msgstr "" @@ -23447,7 +23744,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:144 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1217 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:164 -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:196 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:194 msgid "Invoiced Amount" msgstr "" @@ -23465,7 +23762,7 @@ msgstr "" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2356 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2404 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:62 msgid "Invoices" @@ -23478,7 +23775,10 @@ msgid "Invoices and Payments have been Fetched and Allocated" msgstr "" #. Name of a Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/desktop_icon/invoicing.json erpnext/workspace_sidebar/invoicing.json msgid "Invoicing" msgstr "" @@ -23500,6 +23800,11 @@ msgstr "" msgid "Inward" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/subcontracting.json +msgid "Inward Order" +msgstr "" + #. Label of the is_account_payable (Check) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json @@ -24033,6 +24338,7 @@ msgstr "" #. Label of the complaint (Text Editor) field in DocType 'Warranty Claim' #. Title of the issues Web Form #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset/asset_list.js:22 @@ -24044,6 +24350,7 @@ msgstr "" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/web_form/issues/issues.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "Issue" msgstr "" @@ -24068,12 +24375,14 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/support/doctype/issue_priority/issue_priority.json #: erpnext/support/report/issue_analytics/issue_analytics.js:63 #: erpnext/support/report/issue_analytics/issue_analytics.py:70 #: erpnext/support/report/issue_summary/issue_summary.js:51 #: erpnext/support/report/issue_summary/issue_summary.py:67 #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "Issue Priority" msgstr "" @@ -24090,11 +24399,13 @@ msgstr "" #. Label of the issue_type (Link) field in DocType 'Issue' #. Name of a DocType #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/support/doctype/issue/issue.json #: erpnext/support/doctype/issue_type/issue_type.json #: erpnext/support/report/issue_analytics/issue_analytics.py:59 #: erpnext/support/report/issue_summary/issue_summary.py:56 #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "Issue Type" msgstr "" @@ -24178,6 +24489,7 @@ msgstr "" #. Label of the item_code (Link) field in DocType 'Pick List Item' #. Label of the item_code (Link) field in DocType 'Putaway Rule' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -24268,7 +24580,11 @@ msgstr "" #: erpnext/templates/form_grid/stock_entry_grid.html:8 #: erpnext/templates/generators/bom.html:19 #: erpnext/templates/pages/material_request_info.html:42 -#: erpnext/templates/pages/order.html:94 +#: erpnext/templates/pages/order.html:94 erpnext/workspace_sidebar/buying.json +#: erpnext/workspace_sidebar/home.json +#: erpnext/workspace_sidebar/manufacturing.json +#: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json +#: erpnext/workspace_sidebar/subscription.json msgid "Item" msgstr "" @@ -24294,8 +24610,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/item_alternative/item_alternative.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Alternative" msgstr "" @@ -24303,10 +24621,12 @@ msgstr "" #. Name of a DocType #. Label of the item_attribute (Link) field in DocType 'Item Variant' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_attribute/item_attribute.json #: erpnext/stock/doctype/item_variant/item_variant.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Attribute" msgstr "" @@ -24439,8 +24759,8 @@ msgstr "" #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:68 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:37 #: erpnext/accounts/report/gross_profit/gross_profit.py:312 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:142 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:159 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:143 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:160 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:37 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json @@ -24545,6 +24865,8 @@ msgstr "" #: erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py:175 #: erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py:115 #: erpnext/stock/report/item_price_stock/item_price_stock.py:18 +#: erpnext/stock/report/negative_batch_report/negative_batch_report.js:15 +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:40 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:125 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.js:8 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:433 @@ -24680,6 +25002,7 @@ msgstr "" #. Label of the item_group (Data) field in DocType 'Stock Entry Detail' #. Label of the item_group (Link) field in DocType 'Stock Reconciliation Item' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/pos_item_group/pos_item_group.json #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -24693,9 +25016,9 @@ msgstr "" #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js:21 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:28 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js:28 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:156 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:157 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js:65 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:173 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:174 #: erpnext/accounts/report/purchase_register/purchase_register.js:58 #: erpnext/accounts/report/sales_register/sales_register.js:70 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -24759,6 +25082,7 @@ msgstr "" #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.js:33 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py:99 #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json msgid "Item Group" msgstr "" @@ -24803,8 +25127,10 @@ msgstr "" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Item Lead Time" msgstr "" @@ -24918,8 +25244,8 @@ msgstr "" #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:71 #: erpnext/accounts/report/gross_profit/gross_profit.py:319 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:33 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:148 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:165 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:149 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:166 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:71 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json @@ -25038,11 +25364,13 @@ msgstr "" #. Label of a Link in the Selling Workspace #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/workspace/buying/buying.json #: erpnext/selling/doctype/selling_settings/selling_settings.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/doctype/item_price/item_price.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json msgid "Item Price" msgstr "" @@ -25057,8 +25385,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/item_price_stock/item_price_stock.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Price Stock" msgstr "" @@ -25124,8 +25454,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/item_shortage_report/item_shortage_report.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Shortage Report" msgstr "" @@ -25196,6 +25528,7 @@ msgstr "" #. Label of the item_tax_template (Link) field in DocType 'Item Tax' #. Label of the item_tax_template (Link) field in DocType 'Purchase Receipt #. Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/item_tax_template/item_tax_template.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -25208,6 +25541,7 @@ msgstr "" #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +#: erpnext/workspace_sidebar/taxes.json msgid "Item Tax Template" msgstr "" @@ -25238,16 +25572,21 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/item_variant_details/item_variant_details.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Variant Details" 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:151 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/stock.json msgid "Item Variant Settings" msgstr "" @@ -25473,7 +25812,7 @@ msgstr "" msgid "Item {0} is not a stock Item" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:956 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:952 msgid "Item {0} is not a subcontracted item" msgstr "" @@ -25505,7 +25844,7 @@ msgstr "" msgid "Item {0} not found." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:321 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:324 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "" @@ -25524,28 +25863,41 @@ msgstr "" #. Name of a report #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Item-wise Purchase History" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Item-wise Purchase Register" msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Item-wise Sales History" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.json +#: erpnext/workspace_sidebar/selling.json msgid "Item-wise Sales Register" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "Item-wise sales Register" +msgstr "" + #: erpnext/stock/get_item_details.py:718 msgid "Item/Item Code required to get Item Tax Template." msgstr "" @@ -25555,7 +25907,9 @@ msgid "Item: {0} does not exist in the system" msgstr "" #. Label of a Card Break in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/selling.json msgid "Items & Pricing" msgstr "" @@ -25573,10 +25927,17 @@ msgstr "" msgid "Items Required" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/subcontracting.json +msgid "Items To Be Received" +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/items_to_be_requested/items_to_be_requested.json +#: erpnext/workspace_sidebar/buying.json msgid "Items To Be Requested" msgstr "" @@ -25642,8 +26003,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Itemwise Recommended Reorder Level" msgstr "" @@ -25670,6 +26033,7 @@ msgstr "" #. Label of the job_card (Link) field in DocType 'Stock Entry' #. Label of the job_card (Link) field in DocType 'Subcontracting Order Item' #. Label of the job_card (Link) field in DocType 'Subcontracting Receipt Item' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/job_card/job_card.json @@ -25685,6 +26049,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Job Card" msgstr "" @@ -25718,8 +26083,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/job_card_summary/job_card_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Job Card Summary" msgstr "" @@ -25853,6 +26220,7 @@ msgstr "" #. Group in Asset's connections #. Label of the journal_entry (Link) field in DocType 'Asset Value Adjustment' #. Label of the journal_entry (Link) field in DocType 'Depreciation Schedule' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json @@ -25865,6 +26233,8 @@ msgstr "" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json #: erpnext/templates/form_grid/bank_reconciliation_grid.html:3 +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Journal Entry" msgstr "" @@ -25875,8 +26245,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Journal Entry Template" msgstr "" @@ -26093,10 +26465,12 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:646 #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:88 #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Landed Cost Voucher" msgstr "" @@ -26244,6 +26618,7 @@ msgstr "" #. Label of the lead (Link) field in DocType 'Prospect Lead' #. Label of a Link in the Home Workspace #. Label of the lead (Link) field in DocType 'Issue' +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/crm_settings/crm_settings.json #: erpnext/crm/doctype/email_campaign/email_campaign.json #: erpnext/crm/doctype/lead/lead.json @@ -26253,7 +26628,7 @@ msgstr "" #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.js:8 #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py:28 #: erpnext/public/js/communication.js:25 erpnext/setup/workspace/home/home.json -#: erpnext/support/doctype/issue/issue.json +#: erpnext/support/doctype/issue/issue.json erpnext/workspace_sidebar/crm.json msgid "Lead" msgstr "" @@ -26273,8 +26648,9 @@ msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/lead_details/lead_details.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Lead Details" msgstr "" @@ -26295,8 +26671,9 @@ msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/lead_owner_efficiency/lead_owner_efficiency.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Lead Owner Efficiency" msgstr "" @@ -26305,7 +26682,8 @@ msgid "Lead Owner cannot be same as the Lead Email Address" msgstr "" #. Label of a Link in the CRM Workspace -#: erpnext/crm/workspace/crm/crm.json +#. Label of a Workspace Sidebar Item +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Lead Source" msgstr "" @@ -26421,7 +26799,9 @@ msgid "Ledger Type" msgstr "" #. Label of a Card Break in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Ledgers" msgstr "" @@ -26827,8 +27207,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Loyalty Point Entry" msgstr "" @@ -26876,6 +27258,7 @@ msgstr "" #. Label of the loyalty_program (Link) field in DocType 'Sales Invoice' #. Label of the loyalty_program (Link) field in DocType 'Customer' #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json #: erpnext/accounts/doctype/loyalty_program/loyalty_program.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -26884,6 +27267,7 @@ msgstr "" #: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/page/point_of_sale/pos_item_cart.js:952 #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Loyalty Program" msgstr "" @@ -27016,6 +27400,7 @@ msgstr "" #. Option for the 'Type of Transaction' (Select) field in DocType 'Serial and #. Batch Bundle' #. Label of a Card Break in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/workspace/assets/assets.json #: erpnext/manufacturing/doctype/workstation/workstation.json @@ -27024,6 +27409,7 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/install_fixtures.py:299 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/assets.json erpnext/workspace_sidebar/crm.json msgid "Maintenance" msgstr "" @@ -27067,6 +27453,7 @@ msgstr "" #. Label of the maintenance_schedule (Link) field in DocType 'Maintenance #. Visit' #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:162 #: erpnext/crm/workspace/crm/crm.json #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json @@ -27074,6 +27461,7 @@ msgstr "" #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json #: erpnext/selling/doctype/sales_order/sales_order.js:1114 #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/support.json msgid "Maintenance Schedule" msgstr "" @@ -27174,12 +27562,14 @@ msgstr "" #. Label of a Link in the CRM Workspace #. Name of a DocType #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/workspace/crm/crm.json #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:87 #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json #: erpnext/selling/doctype/sales_order/sales_order.js:1107 #: erpnext/support/doctype/warranty_claim/warranty_claim.js:47 #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/support.json msgid "Maintenance Visit" msgstr "" @@ -27327,7 +27717,7 @@ msgstr "" msgid "Mandatory Accounting Dimension" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1833 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 msgid "Mandatory Field" msgstr "" @@ -27515,6 +27905,7 @@ msgstr "" msgid "Manufacturers used in Items" msgstr "" +#. Label of a Desktop Icon #. Label of the work_order_details_section (Section Break) field in DocType #. 'Production Plan Sub Assembly Item' #. Name of a Workspace @@ -27524,7 +27915,9 @@ msgstr "" #. Label of the manufacturing (Tab Break) field in DocType 'Item' #. Label of the section_break_wuqi (Section Break) field in DocType 'Item Lead #. Time' +#. Title of a Workspace Sidebar #: erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py:30 +#: erpnext/desktop_icon/manufacturing.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:29 @@ -27534,6 +27927,7 @@ msgstr "" #: erpnext/stock/doctype/item_lead_time/item_lead_time.json #: erpnext/stock/doctype/material_request/material_request_dashboard.py:18 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order_dashboard.py:13 +#: erpnext/workspace_sidebar/manufacturing.json msgid "Manufacturing" msgstr "" @@ -27583,8 +27977,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Manufacturing Settings" msgstr "" @@ -27766,8 +28162,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Master Production Schedule" msgstr "" @@ -27820,6 +28218,11 @@ msgstr "" msgid "Material Issue" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/manufacturing.json +msgid "Material Planning" +msgstr "" + #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:77 @@ -27857,6 +28260,7 @@ msgstr "" #. Item' #. Label of the material_request (Link) field in DocType 'Subcontracting Order #. Service Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/purchase_order/purchase_order.js:540 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -27890,6 +28294,7 @@ msgstr "" #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_order_service_item/subcontracting_order_service_item.json +#: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/stock.json msgid "Material Request" msgstr "" @@ -28091,6 +28496,11 @@ msgstr "" msgid "Material to Supplier" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/subcontracting.json +msgid "Materials To Be Transferred" +msgstr "" + #: erpnext/controllers/subcontracting_controller.py:1570 msgid "Materials are already received against the {0} {1}" msgstr "" @@ -28334,7 +28744,7 @@ msgid "Messages greater than 160 characters will be split into multiple messages msgstr "" #: erpnext/setup/install.py:127 -msgid "Messaging CRM Campagin" +msgid "Messaging CRM Campaign" msgstr "" #. Name of a UOM @@ -28619,13 +29029,13 @@ msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:97 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:200 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:597 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2373 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2979 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2421 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3027 #: erpnext/assets/doctype/asset_category/asset_category.py:116 msgid "Missing Account" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:429 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:430 msgid "Missing Asset" msgstr "" @@ -28650,7 +29060,7 @@ msgstr "" msgid "Missing Finished Good" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:308 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:310 msgid "Missing Formula" msgstr "" @@ -28690,8 +29100,8 @@ msgstr "" msgid "Mobile: " msgstr "" -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:210 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:240 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:211 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:241 #: erpnext/accounts/report/purchase_register/purchase_register.py:201 #: erpnext/accounts/report/sales_register/sales_register.py:224 msgid "Mode Of Payment" @@ -28719,6 +29129,7 @@ msgstr "" #. Label of the mode_of_payment (Link) field in DocType 'Purchase Invoice' #. Label of the mode_of_payment (Link) field in DocType 'Sales Invoice Payment' #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json @@ -28743,6 +29154,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.js:40 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/selling/page/point_of_sale/pos_controller.js:33 +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Mode of Payment" msgstr "" @@ -28819,9 +29231,11 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:69 #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/selling.json msgid "Monthly Distribution" msgstr "" @@ -28919,7 +29333,7 @@ msgstr "" msgid "Multiple Loyalty Programs found for Customer {}. Please select manually." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1193 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1196 msgid "Multiple POS Opening Entry" msgstr "" @@ -29034,7 +29448,7 @@ msgstr "" msgid "Naming Series and Price Defaults" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:95 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:96 msgid "Naming Series is mandatory" msgstr "" @@ -29077,11 +29491,16 @@ msgstr "" msgid "Needs Analysis" msgstr "" +#. Name of a report +#: erpnext/stock/report/negative_batch_report/negative_batch_report.json +msgid "Negative Batch Report" +msgstr "" + #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:623 msgid "Negative Quantity is not allowed" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1478 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1492 #: erpnext/stock/serial_batch_bundle.py:1520 msgid "Negative Stock Error" msgstr "" @@ -29241,7 +29660,7 @@ msgstr "" msgid "Net Purchase Amount is mandatory" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:553 +#: erpnext/assets/doctype/asset/asset.py:556 msgid "Net Purchase Amount should be equal to purchase amount of one single Asset." msgstr "" @@ -29475,6 +29894,10 @@ msgstr "" msgid "New Expenses" msgstr "" +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:1 +msgid "New Fiscal Year - {0}" +msgstr "" + #. Label of the income (Check) field in DocType 'Email Digest' #: erpnext/setup/doctype/email_digest/email_digest.json msgid "New Income" @@ -29565,10 +29988,6 @@ msgstr "" msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}" msgstr "" -#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:3 -msgid "New fiscal year created :- " -msgstr "" - #. Description of the 'Generate New Invoices Past Due Date' (Check) field in #. DocType 'Subscription' #: erpnext/accounts/doctype/subscription/subscription.json @@ -29632,7 +30051,7 @@ msgstr "" msgid "No Answer" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2478 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2526 msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "" @@ -29696,7 +30115,7 @@ msgstr "" msgid "No Permission" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:794 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:786 msgid "No Purchase Orders were created" msgstr "" @@ -29706,7 +30125,7 @@ msgid "No Records for these settings." msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:337 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1104 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1107 msgid "No Remarks" msgstr "" @@ -29726,7 +30145,7 @@ msgstr "" msgid "No Summary" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2462 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2510 msgid "No Supplier found for Inter Company Transactions which represents company {0}" msgstr "" @@ -29750,7 +30169,7 @@ msgstr "" msgid "No Unreconciled Payments found for this party" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:791 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:783 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:249 msgid "No Work Orders were created" msgstr "" @@ -29780,7 +30199,7 @@ msgstr "" msgid "No contacts with email IDs found." msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:134 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:137 msgid "No data for this period" msgstr "" @@ -29829,7 +30248,7 @@ msgstr "" msgid "No matches occurred via auto reconciliation" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1038 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1034 msgid "No material request created" msgstr "" @@ -29911,7 +30330,7 @@ msgstr "" msgid "No open Material Requests found for the given criteria." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1187 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1190 msgid "No open POS Opening Entry found for POS Profile {0}." msgstr "" @@ -29996,7 +30415,7 @@ msgstr "" msgid "No values" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2526 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2574 msgid "No {0} found for Inter Company Transactions." msgstr "" @@ -30020,8 +30439,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/non_conformance/non_conformance.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Non Conformance" msgstr "" @@ -30629,7 +31050,7 @@ msgstr "" msgid "Only leaf nodes are allowed in transaction" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:340 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:342 msgid "Only one of Deposit or Withdrawal should be non-zero when applying an Excluded Fee." msgstr "" @@ -30781,13 +31202,15 @@ msgstr "" msgid "Open a new ticket" msgstr "" -#: erpnext/accounts/report/general_ledger/general_ledger.py:397 +#: erpnext/accounts/report/general_ledger/general_ledger.py:395 #: erpnext/public/js/stock_analytics.js:97 msgid "Opening" msgstr "" #. Group in POS Profile's connections +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_profile/pos_profile.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Opening & Closing" msgstr "" @@ -30828,7 +31251,7 @@ msgstr "" #. Option for the 'Balance Type' (Select) field in DocType 'Financial Report #. Row' #: erpnext/accounts/doctype/financial_report_row/financial_report_row.json -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:189 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:187 msgid "Opening Balance" msgstr "" @@ -30895,8 +31318,13 @@ msgstr "" msgid "Opening Invoice Item" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/accounts_setup.json +msgid "Opening Invoice Tool" +msgstr "" + #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1646 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1942 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1990 msgid "Opening Invoice has rounding adjustment of {0}.

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

Or, '{3}' can be enabled to not post any rounding adjustment." msgstr "" @@ -31136,15 +31564,15 @@ msgstr "" msgid "Opportunities" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:49 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:52 msgid "Opportunities by Campaign" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:50 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:53 msgid "Opportunities by Medium" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:48 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:51 msgid "Opportunities by Source" msgstr "" @@ -31156,6 +31584,7 @@ msgstr "" #. Name of a DocType #. Label of the opportunity (Link) field in DocType 'Prospect Opportunity' #. Label of the opportunity (Link) field in DocType 'Quotation' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:381 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -31169,6 +31598,7 @@ msgstr "" #: erpnext/public/js/communication.js:35 #: erpnext/selling/doctype/quotation/quotation.js:155 #: erpnext/selling/doctype/quotation/quotation.json +#: erpnext/workspace_sidebar/crm.json msgid "Opportunity" msgstr "" @@ -31231,7 +31661,8 @@ msgid "Opportunity Source" msgstr "" #. Label of a Link in the CRM Workspace -#: erpnext/crm/workspace/crm/crm.json +#. Label of a Workspace Sidebar Item +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Opportunity Summary by Sales Stage" msgstr "" @@ -31468,16 +31899,20 @@ msgstr "" #. Label of a Card Break in the Buying Workspace #. Label of a Card Break in the Selling Workspace #. Label of a Card Break in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Other Reports" msgstr "" #. Label of the other_settings_section (Section Break) field in DocType #. 'Manufacturing Settings' +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Other Settings" msgstr "" @@ -31557,7 +31992,7 @@ msgstr "" msgid "Out of stock" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1200 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1203 #: erpnext/selling/page/point_of_sale/pos_controller.js:208 msgid "Outdated POS Opening Entry" msgstr "" @@ -31650,6 +32085,11 @@ msgstr "" msgid "Outward" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/subcontracting.json +msgid "Outward Order" +msgstr "" + #. Label of the over_billing_allowance (Currency) field in DocType 'Accounts #. Settings' #. Label of the over_billing_allowance (Float) field in DocType 'Item' @@ -31720,7 +32160,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:281 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:282 #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.json #: erpnext/assets/doctype/asset_maintenance_task/asset_maintenance_task.json #: erpnext/projects/doctype/task/task.json @@ -31839,6 +32279,11 @@ msgstr "" msgid "PO Supplied Item" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/selling.json +msgid "POS" +msgstr "" + #. Label of the invoice_fields (Table) field in DocType 'POS Settings' #: erpnext/accounts/doctype/pos_settings/pos_settings.json msgid "POS Additional Fields" @@ -31854,11 +32299,13 @@ msgstr "" #. Label of the pos_closing_entry (Data) field in DocType 'POS Opening Entry' #. Label of the pos_closing_entry (Link) field in DocType 'Sales Invoice' #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.json #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "POS Closing Entry" msgstr "" @@ -31895,11 +32342,13 @@ msgstr "" #. Option for the 'Invoice Type Created via POS Screen' (Select) field in #. DocType 'POS Settings' #. Label of the pos_invoice (Link) field in DocType 'Sales Invoice Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_invoice_reference/pos_invoice_reference.json #: 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/workspace_sidebar/selling.json msgid "POS Invoice" msgstr "" @@ -31912,7 +32361,9 @@ msgid "POS Invoice Item" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.json +#: erpnext/workspace_sidebar/selling.json msgid "POS Invoice Merge Log" msgstr "" @@ -31962,13 +32413,15 @@ msgstr "" #. Label of the pos_opening_entry (Link) field in DocType 'POS Closing Entry' #. Name of a DocType #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "POS Opening Entry" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1201 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 msgid "POS Opening Entry - {0} is outdated. Please close the POS and create a new POS Opening Entry." msgstr "" @@ -31989,7 +32442,7 @@ msgstr "" msgid "POS Opening Entry Exists" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1186 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1189 msgid "POS Opening Entry Missing" msgstr "" @@ -32011,6 +32464,7 @@ msgstr "" #. Label of the pos_profile (Link) field in DocType 'POS Opening Entry' #. Name of a DocType #. Label of the pos_profile (Link) field in DocType 'Sales Invoice' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.json @@ -32020,10 +32474,11 @@ msgstr "" #: erpnext/accounts/report/pos_register/pos_register.py:117 #: erpnext/accounts/report/pos_register/pos_register.py:188 #: erpnext/selling/page/point_of_sale/pos_controller.js:80 +#: erpnext/workspace_sidebar/selling.json msgid "POS Profile" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1194 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1197 msgid "POS Profile - {0} has multiple open POS Opening Entries. Please close or cancel the existing entries before proceeding." msgstr "" @@ -32041,11 +32496,11 @@ msgstr "" msgid "POS Profile doesn't match {}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1154 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1157 msgid "POS Profile is mandatory to mark this invoice as POS Transaction." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1383 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1386 msgid "POS Profile required to make POS Entry" msgstr "" @@ -32083,8 +32538,11 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_settings/pos_settings.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/selling.json msgid "POS Settings" msgstr "" @@ -32172,9 +32630,11 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/delivery_note/delivery_note.js:296 #: erpnext/stock/doctype/packing_slip/packing_slip.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Packing Slip" msgstr "" @@ -32206,7 +32666,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:287 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:288 msgid "Paid" msgstr "" @@ -32227,7 +32687,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:146 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1218 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:165 -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:203 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:201 #: erpnext/accounts/report/pos_register/pos_register.py:209 #: erpnext/selling/page/point_of_sale/pos_payment.js:691 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:56 @@ -32275,7 +32735,7 @@ msgid "Paid To Account Type" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:327 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1150 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1153 msgid "Paid amount + Write Off Amount can not be greater than Grand Total" msgstr "" @@ -32487,7 +32947,7 @@ msgstr "" msgid "Partial Material Transferred" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1173 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1176 msgid "Partial Payment in POS Transactions are not allowed." msgstr "" @@ -32540,6 +33000,7 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/quotation/quotation_list.js:32 #: erpnext/stock/doctype/material_request/material_request.json +#: erpnext/stock/doctype/material_request/material_request_list.js:29 msgid "Partially Ordered" msgstr "" @@ -32583,10 +33044,6 @@ msgstr "" msgid "Partially Used" msgstr "" -#: erpnext/stock/doctype/material_request/material_request_list.js:29 -msgid "Partially ordered" -msgstr "" - #: erpnext/accounts/report/general_ledger/general_ledger.html:88 msgid "Particulars" msgstr "" @@ -32697,7 +33154,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:147 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:228 #: erpnext/accounts/report/general_ledger/general_ledger.js:74 -#: erpnext/accounts/report/general_ledger/general_ledger.py:754 +#: erpnext/accounts/report/general_ledger/general_ledger.py:752 #: 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 @@ -32802,7 +33259,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:110 -#: erpnext/accounts/report/general_ledger/general_ledger.py:763 +#: erpnext/accounts/report/general_ledger/general_ledger.py:761 #: 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 @@ -32871,7 +33328,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:141 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:219 #: erpnext/accounts/report/general_ledger/general_ledger.js:65 -#: erpnext/accounts/report/general_ledger/general_ledger.py:753 +#: erpnext/accounts/report/general_ledger/general_ledger.py:751 #: 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 @@ -33009,14 +33466,16 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:39 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1164 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:203 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:204 #: erpnext/accounts/report/purchase_register/purchase_register.py:194 #: erpnext/accounts/report/purchase_register/purchase_register.py:235 msgid "Payable Account" msgstr "" #. Label of the payables (Check) field in DocType 'Email Digest' +#. Label of a Workspace Sidebar Item #: erpnext/setup/doctype/email_digest/email_digest.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Payables" msgstr "" @@ -33130,6 +33589,7 @@ msgstr "" #. Option for the 'Payment Order Type' (Select) field in DocType 'Payment #. Order' #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance_detail/bank_clearance_detail.json #: erpnext/accounts/doctype/bank_transaction_payments/bank_transaction_payments.json #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -33140,6 +33600,8 @@ msgstr "" #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:29 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:8 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Payment Entry" msgstr "" @@ -33162,7 +33624,7 @@ msgid "Payment Entry has been modified after you pulled it. Please pull it again msgstr "" #: erpnext/accounts/doctype/payment_request/payment_request.py:131 -#: erpnext/accounts/doctype/payment_request/payment_request.py:556 +#: erpnext/accounts/doctype/payment_request/payment_request.py:559 msgid "Payment Entry is already created" msgstr "" @@ -33251,10 +33713,13 @@ msgstr "" #. Label of the payment_order (Link) field in DocType 'Payment Entry' #. Name of a DocType #. Label of the payment_order (Link) field in DocType 'Payment Request' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_order/payment_order.json #: erpnext/accounts/doctype/payment_request/payment_request.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Payment Order" msgstr "" @@ -33285,8 +33750,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Payment Period Based On Invoice Date" msgstr "" @@ -33304,11 +33771,18 @@ msgstr "" msgid "Payment Received" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/payments.json +msgid "Payment Reconciliaition" +msgstr "" + #. Name of a DocType #. Label of the payment_reconciliation (Table) field in DocType 'POS Closing #. Entry' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Payment Reconciliation" msgstr "" @@ -33357,6 +33831,7 @@ msgstr "" #. Label of the payment_request (Link) field in DocType 'Payment Order #. Reference' #. 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:1723 #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json @@ -33368,6 +33843,8 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:139 #: erpnext/buying/doctype/purchase_order/purchase_order.js:429 #: erpnext/selling/doctype/sales_order/sales_order.js:1152 +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Payment Request" msgstr "" @@ -33383,11 +33860,11 @@ msgstr "" msgid "Payment Request Type" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:629 +#: erpnext/accounts/doctype/payment_request/payment_request.py:632 msgid "Payment Request for {0}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:571 +#: erpnext/accounts/doctype/payment_request/payment_request.py:574 msgid "Payment Request is already created" msgstr "" @@ -33436,6 +33913,7 @@ msgstr "" #. Label of the payment_term (Link) field in DocType 'Payment Terms Template #. Detail' #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json @@ -33445,6 +33923,7 @@ msgstr "" #: erpnext/accounts/report/gross_profit/gross_profit.py:449 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:30 +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" msgstr "" @@ -33596,6 +34075,9 @@ msgstr "" #. Label of the payments_tab (Tab Break) field in DocType 'Sales Invoice' #. Label of a Card Break in the Invoicing Workspace #. Option for the 'Hold Type' (Select) field in DocType 'Supplier' +#. Label of a Desktop Icon +#. Label of a Workspace Sidebar Item +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.js:286 @@ -33607,8 +34089,11 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/buying/doctype/supplier/supplier_dashboard.py:12 +#: erpnext/desktop_icon/payments.json #: erpnext/selling/doctype/customer/customer_dashboard.py:21 #: erpnext/selling/page/point_of_sale/pos_past_order_summary.js:19 +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Payments" msgstr "" @@ -33699,8 +34184,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Pending SO Items For Purchase Request" msgstr "" @@ -33830,9 +34317,11 @@ msgstr "" #. Balance' #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Period Closing Voucher" msgstr "" @@ -34036,6 +34525,7 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sales_order/sales_order.js:1022 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 #: erpnext/stock/doctype/material_request/material_request.js:156 @@ -34043,6 +34533,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Pick List" msgstr "" @@ -34211,8 +34702,10 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json +#: erpnext/workspace_sidebar/banking.json msgid "Plaid Settings" msgstr "" @@ -34350,9 +34843,11 @@ msgstr "" #. Name of a DocType #. Label of the plant_floor (Link) field in DocType 'Workstation' +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/plant_floor/plant_floor.json #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/public/js/plant_floor_visual/visual_plant.js:53 +#: erpnext/workspace_sidebar/manufacturing.json msgid "Plant Floor" msgstr "" @@ -34369,7 +34864,7 @@ msgstr "" msgid "Please Select a Company" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:111 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:114 msgid "Please Select a Company." msgstr "" @@ -34448,7 +34943,7 @@ msgstr "" msgid "Please attach CSV file" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3116 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3164 msgid "Please cancel and amend the Payment Entry" msgstr "" @@ -34547,7 +35042,7 @@ msgstr "" msgid "Please disable workflow temporarily for Journal Entry {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:557 +#: erpnext/assets/doctype/asset/asset.py:560 msgid "Please do not book expense of multiple assets against one single Asset." msgstr "" @@ -34587,11 +35082,11 @@ msgstr "" msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1010 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1013 msgid "Please ensure {} account is a Balance Sheet account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1020 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1023 msgid "Please ensure {} account {} is a Receivable account." msgstr "" @@ -34600,7 +35095,7 @@ msgid "Please enter Difference Account or set default Stock Adjustment msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:554 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1285 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1288 msgid "Please enter Account for Change Amount" msgstr "" @@ -34690,7 +35185,7 @@ msgid "Please enter Warehouse and Date" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:662 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1281 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1284 msgid "Please enter Write Off Account" msgstr "" @@ -34750,7 +35245,7 @@ msgstr "" msgid "Please enter the phone number first" msgstr "" -#: erpnext/controllers/buying_controller.py:1170 +#: erpnext/controllers/buying_controller.py:1187 msgid "Please enter the {schedule_date}." msgstr "" @@ -34839,6 +35334,10 @@ msgstr "" msgid "Please refresh or reset the Plaid linking of the Bank {}." msgstr "" +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:43 +msgid "Please review the {0} configuration and complete any required financial setup activities." +msgstr "" + #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:12 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:28 msgid "Please save before proceeding." @@ -34916,12 +35415,12 @@ msgid "Please select Existing Company for creating Chart of Accounts" msgstr "" #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:210 -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:299 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:280 msgid "Please select Finished Good Item for Service Item {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:669 -#: erpnext/assets/doctype/asset/asset.js:684 +#: erpnext/assets/doctype/asset/asset.js:716 +#: erpnext/assets/doctype/asset/asset.js:731 msgid "Please select Item Code first" msgstr "" @@ -34986,7 +35485,7 @@ msgid "Please select a BOM" msgstr "" #: erpnext/accounts/party.py:429 -#: erpnext/stock/doctype/pick_list/pick_list.py:1618 +#: erpnext/stock/doctype/pick_list/pick_list.py:1617 msgid "Please select a Company" msgstr "" @@ -35006,7 +35505,7 @@ msgstr "" msgid "Please select a Delivery Note" msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:171 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:152 msgid "Please select a Subcontracting Purchase Order." msgstr "" @@ -35059,11 +35558,11 @@ msgstr "" msgid "Please select a supplier for fetching payments." msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:160 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:141 msgid "Please select a valid Purchase Order that has Service Items." msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:157 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:138 msgid "Please select a valid Purchase Order that is configured for Subcontracting." msgstr "" @@ -35193,7 +35692,7 @@ msgstr "" msgid "Please set Account" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1833 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 msgid "Please set Account for Change Amount" msgstr "" @@ -35324,19 +35823,19 @@ msgstr "" msgid "Please set both the Tax ID and Fiscal Code on Company {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2370 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2418 msgid "Please set default Cash or Bank account in Mode of Payment {0}" msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:94 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:197 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2976 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3024 msgid "Please set default Cash or Bank account in Mode of Payment {}" msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:96 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:199 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2978 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3026 msgid "Please set default Cash or Bank account in Mode of Payments {}" msgstr "" @@ -35373,7 +35872,7 @@ msgstr "" msgid "Please set one of the following:" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:640 +#: erpnext/assets/doctype/asset/asset.py:643 msgid "Please set opening number of booked depreciations" msgstr "" @@ -35651,10 +36150,10 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:61 #: 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:681 +#: erpnext/accounts/report/general_ledger/general_ledger.py:679 #: erpnext/accounts/report/gross_profit/gross_profit.py:300 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:175 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:192 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:176 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:193 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:143 #: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:94 #: erpnext/accounts/report/pos_register/pos_register.py:172 @@ -35720,6 +36219,7 @@ msgstr "" #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/stock_closing_balance/stock_closing_balance.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:27 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:506 msgid "Posting Datetime" msgstr "" @@ -35923,6 +36423,10 @@ msgstr "" msgid "Previous Financial Year is not closed" msgstr "" +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:54 +msgid "Previous Qty" +msgstr "" + #. Label of the previous_work_experience (Section Break) field in DocType #. 'Employee' #: erpnext/setup/doctype/employee/employee.json @@ -35981,6 +36485,7 @@ msgstr "" #. Name of a DocType #. Label of the buying_price_list (Link) field in DocType 'Purchase Receipt' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -36002,6 +36507,7 @@ msgstr "" #: erpnext/stock/doctype/price_list/price_list.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/selling.json msgid "Price List" msgstr "" @@ -36191,12 +36697,14 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a Link in the Selling Workspace #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/coupon_code/coupon_code.json #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/pricing_rule_detail/pricing_rule_detail.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json msgid "Pricing Rule" msgstr "" @@ -36583,7 +37091,11 @@ msgid "Process Owner Full Name" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json +#: erpnext/workspace_sidebar/banking.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Process Payment Reconciliation" msgstr "" @@ -36663,8 +37175,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/procurement_tracker/procurement_tracker.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Procurement Tracker" msgstr "" @@ -36722,6 +37236,7 @@ msgstr "" #. Label of a Link in the Selling Workspace #. Label of the product_bundle (Link) field in DocType 'Purchase Receipt Item' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/workspace/buying/buying.json @@ -36731,6 +37246,7 @@ msgstr "" #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json msgid "Product Bundle" msgstr "" @@ -36796,8 +37312,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/production_analytics/production_analytics.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Production Analytics" msgstr "" @@ -36830,6 +37348,7 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Label of the production_plan (Data) field in DocType 'Subcontracting Order' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/work_order/work_order.json @@ -36838,6 +37357,7 @@ msgstr "" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Production Plan" msgstr "" @@ -36910,8 +37430,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/production_planning_report/production_planning_report.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Production Planning Report" msgstr "" @@ -36933,11 +37455,13 @@ msgstr "" #. Closing Voucher Detail' #. Label of a chart in the Financial Reports Workspace #. Label of a chart in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/financial_statements.js:327 +#: erpnext/workspace_sidebar/financial_reports.json msgid "Profit and Loss" msgstr "" @@ -36965,14 +37489,18 @@ msgid "Profit for the year" msgstr "" #. Label of a Card Break in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Profitability" msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/profitability_analysis/profitability_analysis.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Profitability Analysis" msgstr "" @@ -37008,6 +37536,11 @@ msgstr "" msgid "Project Name" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/projects.json +msgid "Project Profitability" +msgstr "" + #: erpnext/templates/pages/projects.html:112 msgid "Project Progress:" msgstr "" @@ -37023,7 +37556,9 @@ msgid "Project Status" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/projects/report/project_summary/project_summary.json +#: erpnext/workspace_sidebar/projects.json msgid "Project Summary" msgstr "" @@ -37033,8 +37568,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/doctype/project_template/project_template.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Project Template" msgstr "" @@ -37048,18 +37585,22 @@ msgstr "" #. Name of a DocType #. Label of the project_type (Data) field in DocType 'Project Type' #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/doctype/project/project.json #: erpnext/projects/doctype/project_template/project_template.json #: erpnext/projects/doctype/project_type/project_type.json #: erpnext/projects/report/project_summary/project_summary.js:30 #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Project Type" msgstr "" #. Name of a DocType #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/doctype/project_update/project_update.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Project Update" msgstr "" @@ -37090,7 +37631,9 @@ msgid "Project will be accessible on the website to these users" msgstr "" #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Project wise Stock Tracking" msgstr "" @@ -37145,13 +37688,17 @@ msgstr "" msgid "Projected qty" msgstr "" +#. Label of a Desktop Icon #. Name of a Workspace #. Label of a Card Break in the Projects Workspace -#: erpnext/config/projects.py:7 erpnext/projects/doctype/project/project.py:447 +#. Title of a Workspace Sidebar +#: erpnext/config/projects.py:7 erpnext/desktop_icon/projects.json +#: erpnext/projects/doctype/project/project.py:447 #: erpnext/projects/workspace/projects/projects.json #: erpnext/selling/doctype/customer/customer_dashboard.py:26 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:28 #: erpnext/setup/doctype/company/company_dashboard.py:25 +#: erpnext/workspace_sidebar/projects.json msgid "Projects" msgstr "" @@ -37164,8 +37711,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/doctype/projects_settings/projects_settings.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Projects Settings" msgstr "" @@ -37191,10 +37740,12 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Promotional Scheme" msgstr "" @@ -37240,9 +37791,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/lead/lead.js:36 erpnext/crm/doctype/lead/lead.js:62 #: erpnext/crm/doctype/prospect/prospect.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Prospect" msgstr "" @@ -37272,8 +37824,9 @@ msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Prospects Engaged But Not Converted" msgstr "" @@ -37378,8 +37931,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/purchase_analytics/purchase_analytics.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Purchase Analytics" msgstr "" @@ -37451,6 +38006,7 @@ msgstr "" #. Item' #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -37473,6 +38029,8 @@ msgstr "" #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/stock_entry/stock_entry.js:336 +#: erpnext/workspace_sidebar/buying.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" msgstr "" @@ -37496,9 +38054,12 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Purchase Invoice Trends" msgstr "" @@ -37511,7 +38072,7 @@ msgstr "" msgid "Purchase Invoice {0} is already submitted" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1935 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1931 msgid "Purchase Invoices" msgstr "" @@ -37534,11 +38095,12 @@ msgstr "" #. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt #. Item' #. Label of a Link in the Subcontracting Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:145 #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:231 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:232 #: erpnext/accounts/report/purchase_register/purchase_register.py:216 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json @@ -37549,7 +38111,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:901 +#: erpnext/controllers/buying_controller.py:918 #: 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 @@ -37564,6 +38126,8 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/buying.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Purchase Order" msgstr "" @@ -37578,9 +38142,11 @@ msgstr "" #. Name of a report #. Label of a Link in the Buying Workspace #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/buying.json msgid "Purchase Order Analysis" msgstr "" @@ -37644,8 +38210,10 @@ msgstr "" #. Name of a report #. Label of a chart in the Buying Workspace #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/purchase_order_trends/purchase_order_trends.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Purchase Order Trends" msgstr "" @@ -37665,7 +38233,7 @@ msgstr "" msgid "Purchase Order {0} is not submitted" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:879 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:882 msgid "Purchase Orders" msgstr "" @@ -37680,7 +38248,7 @@ msgstr "" msgid "Purchase Orders Items Overdue" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:282 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:285 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "" @@ -37717,12 +38285,13 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:170 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:622 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:632 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js:49 #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:238 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:239 #: erpnext/accounts/report/purchase_register/purchase_register.py:223 #: 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 @@ -37737,6 +38306,7 @@ msgstr "" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:67 +#: erpnext/workspace_sidebar/stock.json msgid "Purchase Receipt" msgstr "" @@ -37787,12 +38357,19 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/workspace/buying/buying.json #: erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Purchase Receipt Trends" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/buying.json +msgid "Purchase Receipt Trends " +msgstr "" + #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:358 msgid "Purchase Receipt doesn't have any Item for which Retain Sample is enabled." msgstr "" @@ -37806,7 +38383,9 @@ msgid "Purchase Receipt {0} is not submitted" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/purchase_register/purchase_register.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Purchase Register" msgstr "" @@ -37815,8 +38394,10 @@ msgid "Purchase Return" msgstr "" #. Label of the purchase_tax_template (Link) field in DocType 'Tax Rule' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:145 +#: erpnext/workspace_sidebar/taxes.json msgid "Purchase Tax Template" msgstr "" @@ -38073,6 +38654,7 @@ msgstr "" #. Label of the qty_after_transaction (Float) field in DocType 'Stock Ledger #. Entry' #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:66 msgid "Qty After Transaction" msgstr "" @@ -38273,13 +38855,17 @@ msgstr "" msgid "Qualified on" msgstr "" +#. Label of a Desktop Icon #. Name of a Workspace #. Label of the quality_tab (Tab Break) field in DocType 'Item' #. Label of the quality_tab (Tab Break) field in DocType 'Stock Settings' +#. Title of a Workspace Sidebar +#: erpnext/desktop_icon/quality.json #: erpnext/quality_management/workspace/quality/quality.json #: erpnext/stock/doctype/batch/batch_dashboard.py:11 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/stock_settings/stock_settings.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality" msgstr "" @@ -38287,9 +38873,11 @@ msgstr "" #. Option for the 'Document Type' (Select) field in DocType 'Quality Meeting #. Minutes' #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_action/quality_action.json #: erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Action" msgstr "" @@ -38302,9 +38890,11 @@ msgstr "" #. Option for the 'Document Type' (Select) field in DocType 'Quality Meeting #. Minutes' #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_feedback/quality_feedback.json #: erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Feedback" msgstr "" @@ -38327,8 +38917,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_goal/quality_goal.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Goal" msgstr "" @@ -38356,6 +38948,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of the quality_inspection (Link) field in DocType 'Subcontracting #. Receipt Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -38370,6 +38963,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json +#: erpnext/workspace_sidebar/quality.json erpnext/workspace_sidebar/stock.json msgid "Quality Inspection" msgstr "" @@ -38405,8 +38999,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Quality Inspection Summary" msgstr "" @@ -38418,6 +39014,7 @@ msgstr "" #. Inspection' #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/operation/operation.json @@ -38425,6 +39022,7 @@ msgstr "" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/quality.json erpnext/workspace_sidebar/stock.json msgid "Quality Inspection Template" msgstr "" @@ -38480,8 +39078,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_meeting/quality_meeting.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Meeting" msgstr "" @@ -38499,9 +39099,11 @@ msgstr "" #. Label of the quality_procedure_name (Data) field in DocType 'Quality #. Procedure' #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_procedure/quality_procedure.json #: erpnext/quality_management/doctype/quality_procedure/quality_procedure_tree.js:10 #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Procedure" msgstr "" @@ -38514,9 +39116,11 @@ msgstr "" #. Minutes' #. Name of a DocType #. Label of a Link in the Quality Workspace +#. Label of a Workspace Sidebar Item #: erpnext/quality_management/doctype/quality_meeting_minutes/quality_meeting_minutes.json #: erpnext/quality_management/doctype/quality_review/quality_review.json #: erpnext/quality_management/workspace/quality/quality.json +#: erpnext/workspace_sidebar/quality.json msgid "Quality Review" msgstr "" @@ -38798,8 +39402,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Quick Stock Balance" msgstr "" @@ -38827,6 +39433,7 @@ msgstr "" #. Label of the prevdoc_docname (Link) field in DocType 'Sales Order Item' #. Label of a Link in the Selling Workspace #. Option for the 'Transaction' (Select) field in DocType 'Authorization Rule' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:300 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:51 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.html:20 @@ -38842,6 +39449,7 @@ msgstr "" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json +#: erpnext/workspace_sidebar/selling.json msgid "Quotation" msgstr "" @@ -38881,8 +39489,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/quotation_trends/quotation_trends.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Quotation Trends" msgstr "" @@ -38996,8 +39606,8 @@ msgstr "" #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html:92 #: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:78 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:260 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:312 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:261 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:313 #: erpnext/accounts/report/share_ledger/share_ledger.py:56 #: erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -39607,7 +40217,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:68 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1162 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:233 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:234 #: erpnext/accounts/report/sales_register/sales_register.py:217 #: erpnext/accounts/report/sales_register/sales_register.py:271 msgid "Receivable Account" @@ -39624,7 +40234,9 @@ msgid "Receivable/Payable Account: {0} doesn't belong to company {1}" msgstr "" #. Label of the invoiced_amount (Check) field in DocType 'Email Digest' +#. Label of a Workspace Sidebar Item #: erpnext/setup/doctype/email_digest/email_digest.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Receivables" msgstr "" @@ -39859,6 +40471,11 @@ msgstr "" msgid "Reconciliation Queue Size" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/banking.json +msgid "Reconciliation Statement" +msgstr "" + #. Label of the reconciliation_takes_effect_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -40141,6 +40758,11 @@ msgstr "" msgid "Regional" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "Registers" +msgstr "" + #. Label of the registration_details (Code) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json msgid "Registration Details" @@ -40313,7 +40935,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 #: 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:796 +#: erpnext/accounts/report/general_ledger/general_ledger.py:794 #: 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 @@ -40547,7 +41169,10 @@ msgid "Reports to" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Repost Accounting Ledger" msgstr "" @@ -40557,7 +41182,10 @@ msgid "Repost Accounting Ledger Items" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json +#: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Repost Accounting Ledger Settings" msgstr "" @@ -40573,7 +41201,9 @@ msgid "Repost Error Log" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json +#: erpnext/workspace_sidebar/stock.json msgid "Repost Item Valuation" msgstr "" @@ -40588,7 +41218,10 @@ msgid "Repost Only Accounting Ledgers" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Repost Payment Ledger" msgstr "" @@ -40729,6 +41362,7 @@ msgstr "" #. Label of the request_for_quotation (Link) field in DocType 'Supplier #. Quotation Item' #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: 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:311 @@ -40739,6 +41373,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:272 #: erpnext/buying/workspace/buying/buying.json #: erpnext/stock/doctype/material_request/material_request.js:202 +#: erpnext/workspace_sidebar/buying.json msgid "Request for Quotation" msgstr "" @@ -40769,13 +41404,17 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/requested_items_to_be_transferred/requested_items_to_be_transferred.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Requested Items To Be Transferred" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.json +#: erpnext/workspace_sidebar/buying.json msgid "Requested Items to Order and Receive" msgstr "" @@ -41401,7 +42040,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:283 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:284 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_note/delivery_note_list.js:16 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -41489,7 +42128,7 @@ msgstr "" msgid "Return Raw Material to Customer" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1476 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 msgid "Return invoice of asset cancelled" msgstr "" @@ -41946,11 +42585,13 @@ msgstr "" #. Label of the routing (Link) field in DocType 'BOM Creator' #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:94 #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/routing/routing.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Routing" msgstr "" @@ -41984,12 +42625,12 @@ msgid "Row #1: Sequence ID must be 1 for Operation {0}." msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:563 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2025 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2073 msgid "Row #{0} (Payment Table): Amount must be negative" msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:561 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2020 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2068 msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "" @@ -41997,11 +42638,11 @@ msgstr "" msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:327 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:329 msgid "Row #{0}: Acceptance Criteria Formula is incorrect." msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:307 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:309 msgid "Row #{0}: Acceptance Criteria Formula is required." msgstr "" @@ -42035,15 +42676,15 @@ msgstr "" msgid "Row #{0}: Amount must be a positive number" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:416 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:417 msgid "Row #{0}: Asset {1} cannot be sold, it is already {2}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:421 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:422 msgid "Row #{0}: Asset {1} is already sold" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:330 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:333 msgid "Row #{0}: BOM is not specified for subcontracting item {0}" msgstr "" @@ -42182,11 +42823,11 @@ msgstr "" msgid "Row #{0}: Dates overlapping with other row in group {1}" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:354 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:357 msgid "Row #{0}: Default BOM not found for FG Item {1}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:676 +#: erpnext/assets/doctype/asset/asset.py:679 msgid "Row #{0}: Depreciation Start Date is required" msgstr "" @@ -42206,17 +42847,17 @@ msgstr "" msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:359 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:362 #: erpnext/selling/doctype/sales_order/sales_order.py:301 msgid "Row #{0}: Finished Good Item Qty can not be zero" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:341 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:344 #: erpnext/selling/doctype/sales_order/sales_order.py:281 msgid "Row #{0}: Finished Good Item is not specified for service item {1}" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:348 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:351 #: erpnext/selling/doctype/sales_order/sales_order.py:288 msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item" msgstr "" @@ -42242,7 +42883,7 @@ msgstr "" msgid "Row #{0}: For {1}, you can select reference document only if account gets debited" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:659 +#: erpnext/assets/doctype/asset/asset.py:662 msgid "Row #{0}: Frequency of Depreciation must be greater than zero" msgstr "" @@ -42315,11 +42956,11 @@ msgstr "" msgid "Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:670 +#: erpnext/assets/doctype/asset/asset.py:673 msgid "Row #{0}: Next Depreciation Date cannot be before Available-for-use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:665 +#: erpnext/assets/doctype/asset/asset.py:668 msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date" msgstr "" @@ -42331,7 +42972,7 @@ msgstr "" msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:633 +#: erpnext/assets/doctype/asset/asset.py:636 msgid "Row #{0}: Opening Accumulated Depreciation must be less than or equal to {1}" msgstr "" @@ -42344,11 +42985,11 @@ msgstr "" msgid "Row #{0}: Overconsumption of Customer Provided Item {1} against Work Order {2} is not allowed in the Subcontracting Inward process." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1053 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1049 msgid "Row #{0}: Please select Item Code in Assembly Items" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1056 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1052 msgid "Row #{0}: Please select the BOM No in Assembly Items" msgstr "" @@ -42356,7 +42997,7 @@ msgstr "" msgid "Row #{0}: Please select the Finished Good Item against which this Customer Provided Item will be used." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1050 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1046 msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "" @@ -42437,7 +43078,7 @@ msgstr "" msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:424 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:425 msgid "Row #{0}: Return Against is required for returning asset" msgstr "" @@ -42497,7 +43138,7 @@ msgstr "" msgid "Row #{0}: Set Supplier for item {1}" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1060 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1056 msgid "Row #{0}: Since 'Track Semi Finished Goods' is enabled, the BOM {1} cannot be used for Sub Assembly Items" msgstr "" @@ -42566,7 +43207,7 @@ msgstr "" msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1267 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1270 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "" @@ -42586,11 +43227,11 @@ msgstr "" msgid "Row #{0}: Timings conflicts with row {1}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:646 +#: erpnext/assets/doctype/asset/asset.py:649 msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:655 +#: erpnext/assets/doctype/asset/asset.py:658 msgid "Row #{0}: Total Number of Depreciations must be greater than zero" msgstr "" @@ -42606,7 +43247,7 @@ msgstr "" 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 "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:428 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:429 msgid "Row #{0}: You must select an Asset for Item {1}." msgstr "" @@ -42614,7 +43255,7 @@ msgstr "" msgid "Row #{0}: {1} can not be negative for item {2}" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:320 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:322 msgid "Row #{0}: {1} is not a valid reading field. Please refer to the field description." msgstr "" @@ -42638,7 +43279,7 @@ msgstr "" msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "" -#: erpnext/controllers/buying_controller.py:1043 +#: erpnext/controllers/buying_controller.py:1060 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "" @@ -42658,7 +43299,7 @@ msgstr "" msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "" -#: erpnext/controllers/buying_controller.py:1162 +#: erpnext/controllers/buying_controller.py:1179 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "" @@ -42826,11 +43467,11 @@ msgstr "" msgid "Row {0}: Exchange Rate is mandatory" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:604 +#: erpnext/assets/doctype/asset/asset.py:607 msgid "Row {0}: Expected Value After Useful Life cannot be negative" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:607 +#: erpnext/assets/doctype/asset/asset.py:610 msgid "Row {0}: Expected Value After Useful Life must be less than Net Purchase Amount" msgstr "" @@ -42983,7 +43624,7 @@ msgstr "" msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:881 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:884 msgid "Row {0}: Sales Invoice {1} is already created for {2}" msgstr "" @@ -43060,7 +43701,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:1025 +#: erpnext/controllers/buying_controller.py:1042 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "" @@ -43182,7 +43823,9 @@ msgid "SLA will be applied on every {0}" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sms_center/sms_center.json +#: erpnext/workspace_sidebar/crm.json msgid "SMS Center" msgstr "" @@ -43278,8 +43921,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/sales_analytics/sales_analytics.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/selling.json msgid "Sales Analytics" msgstr "" @@ -43303,9 +43948,11 @@ msgstr "" #. Schedule' #. Name of a DocType #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json #: erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Sales Forecast" msgstr "" @@ -43316,10 +43963,12 @@ msgstr "" #. Label of a Link in the CRM Workspace #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/workspace/crm/crm.json #: erpnext/selling/page/sales_funnel/sales_funnel.js:7 -#: erpnext/selling/page/sales_funnel/sales_funnel.js:46 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:49 #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/selling.json msgid "Sales Funnel" msgstr "" @@ -43351,6 +44000,7 @@ msgstr "" #. Label of a shortcut in the Home Workspace #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/loyalty_point_entry_redemption/loyalty_point_entry_redemption.json #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json @@ -43374,6 +44024,8 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.js:347 #: erpnext/stock/doctype/delivery_note/delivery_note_list.js:67 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json +#: erpnext/workspace_sidebar/home.json erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Invoice" msgstr "" @@ -43423,9 +44075,12 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Invoice Trends" msgstr "" @@ -43466,15 +44121,15 @@ msgstr "" msgid "Sales Monthly History" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:150 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:153 msgid "Sales Opportunities by Campaign" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:152 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:155 msgid "Sales Opportunities by Medium" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:148 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:151 msgid "Sales Opportunities by Source" msgstr "" @@ -43492,6 +44147,8 @@ msgstr "" #. Label of the sales_order (Link) field in DocType 'Production Plan Item' #. Label of the sales_order (Link) field in DocType 'Production Plan Sales #. Order' +#. Label of the sales_order (Link) field in DocType 'Production Plan Sub +#. Assembly Item' #. Label of the sales_order (Link) field in DocType 'Work Order' #. Label of the sales_order (Link) field in DocType 'Project' #. Label of the sales_order (Link) field in DocType 'Delivery Schedule Item' @@ -43504,11 +44161,12 @@ msgstr "" #. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation #. Entry' #. Label of a Link in the Subcontracting Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:278 #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:276 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:277 #: erpnext/accounts/report/sales_register/sales_register.py:238 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -43522,6 +44180,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json +#: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/doctype/work_order/work_order_calendar.js:32 #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py:155 @@ -43550,15 +44209,19 @@ msgstr "" #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:30 #: erpnext/stock/report/delayed_order_report/delayed_order_report.py:74 #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/selling.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Sales Order" msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/sales_order_analysis/sales_order_analysis.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Order Analysis" msgstr "" @@ -43576,6 +44239,8 @@ msgstr "" #. Label of the sales_order_item (Data) field in DocType 'Production Plan Item' #. Label of the sales_order_item (Data) field in DocType 'Production Plan Item #. Reference' +#. Label of the sales_order_item (Data) field in DocType 'Production Plan Sub +#. Assembly Item' #. Label of the sales_order_item (Data) field in DocType 'Work Order' #. Label of the sales_order_item (Data) field in DocType 'Delivery Schedule #. Item' @@ -43594,6 +44259,7 @@ msgstr "" #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json #: erpnext/manufacturing/doctype/production_plan_item_reference/production_plan_item_reference.json +#: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:336 @@ -43633,8 +44299,10 @@ msgstr "" #. Name of a report #. Label of a chart in the Selling Workspace #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/sales_order_trends/sales_order_trends.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Order Trends" msgstr "" @@ -43646,7 +44314,7 @@ msgstr "" msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1397 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1400 msgid "Sales Order {0} is not submitted" msgstr "" @@ -43704,6 +44372,7 @@ msgstr "" #. Label of a Link in the Selling Workspace #. Name of a DocType #. Label of the sales_partner (Link) field in DocType 'Delivery Note' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -43724,6 +44393,7 @@ msgstr "" #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/sales_partner/sales_partner.json #: erpnext/stock/doctype/delivery_note/delivery_note.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Partner" msgstr "" @@ -43754,7 +44424,9 @@ msgid "Sales Partner Target" msgstr "" #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Partner Target Variance Based On Item Group" msgstr "" @@ -43777,16 +44449,21 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/sales_partners_commission/sales_partners_commission.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Partners Commission" msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Sales Payment Summary" msgstr "" @@ -43804,6 +44481,7 @@ msgstr "" #. Label of the sales_person (Link) field in DocType 'Sales Team' #. Label of a Link in the Selling Workspace #. Name of a DocType +#. 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 @@ -43825,6 +44503,7 @@ msgstr "" #: erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py:116 #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/sales_person/sales_person.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/selling.json msgid "Sales Person" msgstr "" @@ -43844,8 +44523,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/sales_person_target_variance_based_on_item_group/sales_person_target_variance_based_on_item_group.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Person Target Variance Based On Item Group" msgstr "" @@ -43857,23 +44538,28 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Person-wise Transaction Summary" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:47 +#. Label of a Workspace Sidebar Item +#: erpnext/selling/page/sales_funnel/sales_funnel.js:50 +#: erpnext/workspace_sidebar/crm.json msgid "Sales Pipeline" msgstr "" #. Name of a report #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.json -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Sales Pipeline Analytics" msgstr "" -#: erpnext/selling/page/sales_funnel/sales_funnel.js:154 +#: erpnext/selling/page/sales_funnel/sales_funnel.js:157 msgid "Sales Pipeline by Stage" msgstr "" @@ -43882,7 +44568,10 @@ msgid "Sales Price List" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/sales_register/sales_register.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/selling.json msgid "Sales Register" msgstr "" @@ -43898,11 +44587,12 @@ msgstr "" #. Label of the sales_stage (Link) field in DocType 'Opportunity' #. Name of a DocType #. Label of a Link in the CRM Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/doctype/sales_stage/sales_stage.json #: erpnext/crm/report/lost_opportunity/lost_opportunity.py:51 #: erpnext/crm/report/sales_pipeline_analytics/sales_pipeline_analytics.py:70 -#: erpnext/crm/workspace/crm/crm.json +#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json msgid "Sales Stage" msgstr "" @@ -43911,8 +44601,10 @@ msgid "Sales Summary" msgstr "" #. Label of the sales_tax_template (Link) field in DocType 'Tax Rule' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:133 +#: erpnext/workspace_sidebar/taxes.json msgid "Sales Tax Template" msgstr "" @@ -44722,7 +45414,7 @@ msgstr "" msgid "Select the customer or supplier." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:846 +#: erpnext/assets/doctype/asset/asset.js:893 msgid "Select the date" msgstr "" @@ -44758,7 +45450,7 @@ msgstr "" msgid "Selected POS Opening Entry should be open." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2521 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2569 msgid "Selected Price List should have buying and selling fields checked." msgstr "" @@ -44789,20 +45481,39 @@ msgstr "" msgid "Self delivery" msgstr "" +#: erpnext/assets/doctype/asset/asset.js:604 #: erpnext/stock/doctype/batch/batch_dashboard.py:9 #: erpnext/stock/doctype/item/item_dashboard.py:20 msgid "Sell" msgstr "" #: erpnext/assets/doctype/asset/asset.js:112 +#: erpnext/assets/doctype/asset/asset.js:593 msgid "Sell Asset" msgstr "" +#: erpnext/assets/doctype/asset/asset.js:598 +msgid "Sell Qty" +msgstr "" + +#: erpnext/assets/doctype/asset/asset.js:614 +msgid "Sell quantity cannot exceed the asset quantity" +msgstr "" + +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1413 +msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." +msgstr "" + +#: erpnext/assets/doctype/asset/asset.js:610 +msgid "Sell quantity must be greater than zero" +msgstr "" + #. Label of the selling (Check) field in DocType 'Pricing Rule' #. Label of the selling (Check) field in DocType 'Promotional Scheme' #. Option for the 'Shipping Rule Type' (Select) field in DocType 'Shipping #. Rule' #. Group in Subscription's connections +#. Label of a Desktop Icon #. Option for the 'Order Type' (Select) field in DocType 'Blanket Order' #. Name of a Workspace #. Label of a Card Break in the Selling Workspace @@ -44810,16 +45521,19 @@ msgstr "" #. Label of the selling (Check) field in DocType 'Terms and Conditions' #. Label of the selling (Check) field in DocType 'Item Price' #. Label of the selling (Check) field in DocType 'Price List' +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json #: erpnext/accounts/doctype/subscription/subscription.json +#: erpnext/desktop_icon/selling.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/incoterm/incoterm.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/item_price/item_price.json #: erpnext/stock/doctype/price_list/price_list.json +#: erpnext/workspace_sidebar/selling.json msgid "Selling" msgstr "" @@ -44839,10 +45553,12 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Selling Workspace #. Label of a shortcut in the ERPNext Settings Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/selling_settings/selling_settings.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json #: erpnext/stock/doctype/stock_settings/stock_settings.py:222 +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Selling Settings" msgstr "" @@ -45012,6 +45728,7 @@ msgstr "" #. Supplied Item' #. Label of the serial_no (Link) field in DocType 'Warranty Claim' #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -45031,7 +45748,7 @@ msgstr "" #: erpnext/stock/doctype/packed_item/packed_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:159 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:160 #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -45050,6 +45767,7 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial No" msgstr "" @@ -45073,8 +45791,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial No Ledger" msgstr "" @@ -45082,7 +45802,7 @@ msgstr "" msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2516 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2539 msgid "Serial No Reserved" msgstr "" @@ -45099,15 +45819,19 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/serial_no_status/serial_no_status.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial No Status" msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/serial_no_warranty_expiry/serial_no_warranty_expiry.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial No Warranty Expiry" msgstr "" @@ -45128,12 +45852,14 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial No and Batch Traceability" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1112 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1115 msgid "Serial No is mandatory" msgstr "" @@ -45162,11 +45888,11 @@ msgstr "" msgid "Serial No {0} does not exist" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3256 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3279 msgid "Serial No {0} does not exists" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:358 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:359 msgid "Serial No {0} is already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -45178,7 +45904,7 @@ msgstr "" msgid "Serial No {0} is already assigned to customer {1}. Can only be returned against the customer {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:430 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:431 msgid "Serial No {0} is not present in the {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -45202,7 +45928,7 @@ msgstr "" #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:190 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:50 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:159 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:160 msgid "Serial Nos" msgstr "" @@ -45216,7 +45942,7 @@ msgstr "" msgid "Serial Nos and Batches" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1802 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1825 msgid "Serial Nos are created successfully" msgstr "" @@ -45224,7 +45950,7 @@ msgstr "" msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:364 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:365 msgid "Serial Nos {0} are already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -45273,6 +45999,7 @@ msgstr "" #. DocType 'Stock Settings' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Subcontracting #. Receipt Item' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -45295,14 +46022,15 @@ msgstr "" #: erpnext/stock/report/stock_ledger/stock_ledger.py:344 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:177 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json +#: erpnext/workspace_sidebar/stock.json msgid "Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2024 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2047 msgid "Serial and Batch Bundle created" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2096 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2119 msgid "Serial and Batch Bundle updated" msgstr "" @@ -45561,7 +46289,7 @@ msgid "Service Item {0} is disabled." msgstr "" #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.py:67 -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:183 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:164 msgid "Service Item {0} must be a non-stock item." msgstr "" @@ -45581,9 +46309,11 @@ msgstr "" #. Name of a DocType #. Label of a Card Break in the Support Workspace #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/support/doctype/issue/issue.json #: erpnext/support/doctype/service_level_agreement/service_level_agreement.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "Service Level Agreement" msgstr "" @@ -45931,15 +46661,15 @@ msgstr "" msgid "Set this if the customer is a Public Administration company." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:893 +#: erpnext/assets/doctype/asset/asset.py:896 msgid "Set {0} in asset category {1} for company {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1226 +#: erpnext/assets/doctype/asset/asset.py:1229 msgid "Set {0} in asset category {1} or company {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1223 +#: erpnext/assets/doctype/asset/asset.py:1226 msgid "Set {0} in company {1}" msgstr "" @@ -46036,32 +46766,42 @@ msgstr "" #. Label of the share_balance (Table) field in DocType 'Shareholder' #. Name of a report #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_balance/share_balance.json #: erpnext/accounts/doctype/shareholder/shareholder.js:21 #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/share_management.json msgid "Share Balance" msgstr "" #. Name of a report #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.js:27 #: erpnext/accounts/report/share_ledger/share_ledger.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/share_management.json msgid "Share Ledger" msgstr "" #. Label of a Card Break in the Invoicing Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/desktop_icon/share_management.json +#: erpnext/workspace_sidebar/share_management.json msgid "Share Management" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/report/share_ledger/share_ledger.py:59 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/share_management.json msgid "Share Transfer" msgstr "" @@ -46078,12 +46818,14 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.js:16 #: erpnext/accounts/report/share_balance/share_balance.py:57 #: erpnext/accounts/report/share_ledger/share_ledger.js:16 #: erpnext/accounts/report/share_ledger/share_ledger.py:51 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/share_management.json msgid "Shareholder" msgstr "" @@ -46247,6 +46989,7 @@ msgstr "" #. Label of the shipping_rule (Link) field in DocType 'Delivery Note' #. Label of the shipping_rule (Link) field in DocType 'Purchase Receipt' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -46259,6 +47002,7 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json msgid "Shipping Rule" msgstr "" @@ -46846,6 +47590,7 @@ msgstr "" #. Label of the source_warehouse (Link) field in DocType 'Work Order' #. Label of the source_warehouse (Link) field in DocType 'Work Order Item' #. Label of the source_warehouse (Link) field in DocType 'Work Order Operation' +#. Label of the warehouse (Link) field in DocType 'Sales Order Item' #. Label of the from_warehouse (Link) field in DocType 'Material Request Item' #. Label of the s_warehouse (Link) field in DocType 'Stock Entry Detail' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -46861,6 +47606,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:126 #: erpnext/public/js/utils/sales_common.js:564 +#: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/stock/dashboard/item_dashboard.js:227 #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.js:699 @@ -46944,7 +47690,7 @@ msgstr "" msgid "Spending for Account {0} ({1}) between {2} and {3} has already exceeded the new allocated budget. Spent: {4}, Budget: {5}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:607 +#: erpnext/assets/doctype/asset/asset.js:654 #: erpnext/stock/doctype/batch/batch.js:91 #: erpnext/stock/doctype/batch/batch.js:183 #: erpnext/support/doctype/issue/issue.js:114 @@ -46952,7 +47698,7 @@ msgid "Split" msgstr "" #: erpnext/assets/doctype/asset/asset.js:120 -#: erpnext/assets/doctype/asset/asset.js:591 +#: erpnext/assets/doctype/asset/asset.js:638 msgid "Split Asset" msgstr "" @@ -46975,11 +47721,11 @@ msgstr "" msgid "Split Issue" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:597 +#: erpnext/assets/doctype/asset/asset.js:644 msgid "Split Qty" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1365 +#: erpnext/assets/doctype/asset/asset.py:1368 msgid "Split Quantity must be less than Asset Quantity" msgstr "" @@ -47228,17 +47974,21 @@ msgid "Statutory info and other general information about your Supplier" msgstr "" #. Option for the 'Account Type' (Select) field in DocType 'Account' +#. Label of a Desktop Icon #. Group in Incoterm's connections #. Label of a Card Break in the Home Workspace #. Name of a Workspace +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/item_tax_template/item_tax_template_dashboard.py:11 #: erpnext/accounts/report/account_balance/account_balance.js:57 +#: erpnext/desktop_icon/stock.json #: erpnext/manufacturing/doctype/bom/bom_dashboard.py:14 #: erpnext/setup/doctype/incoterm/incoterm.json #: erpnext/setup/workspace/home/home.json #: erpnext/stock/doctype/material_request/material_request_dashboard.py:17 #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock" msgstr "" @@ -47261,17 +48011,21 @@ msgstr "" #. Closing Balance' #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/stock_closing_balance/stock_closing_balance.json #: erpnext/stock/report/stock_ageing/stock_ageing.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Ageing" msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/public/js/stock_analytics.js:7 #: erpnext/stock/report/stock_analytics/stock_analytics.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Analytics" msgstr "" @@ -47292,12 +48046,14 @@ msgstr "" #. Label of the stock_balance (Button) field in DocType 'Quotation Item' #. Name of a report #. 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:90 #: erpnext/stock/doctype/warehouse/warehouse.js:61 #: erpnext/stock/report/stock_balance/stock_balance.json #: erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py:107 #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Balance" msgstr "" @@ -47364,6 +48120,7 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json @@ -47373,6 +48130,9 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/manufacturing.json +#: erpnext/workspace_sidebar/stock.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Stock Entry" msgstr "" @@ -47403,7 +48163,7 @@ msgstr "" msgid "Stock Entry Type" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1437 +#: erpnext/stock/doctype/pick_list/pick_list.py:1436 msgid "Stock Entry has been already created against this Pick List" msgstr "" @@ -47443,6 +48203,7 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. 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:100 @@ -47450,6 +48211,7 @@ msgstr "" #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:35 +#: erpnext/workspace_sidebar/stock.json msgid "Stock Ledger" msgstr "" @@ -47554,9 +48316,11 @@ 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:110 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Projected Qty" msgstr "" @@ -47565,8 +48329,8 @@ msgstr "" #. Label of the stock_qty (Float) field in DocType 'BOM Item' #. Label of the stock_qty (Float) field in DocType 'Delivery Schedule Item' #. Label of the stock_qty (Float) field in DocType 'Material Request Item' -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:251 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:303 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:252 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:304 #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json #: erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json @@ -47601,10 +48365,12 @@ msgstr "" #. Name of a DocType #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' #. 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/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Reconciliation" msgstr "" @@ -47623,7 +48389,10 @@ msgid "Stock Reports" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Reposting Settings" msgstr "" @@ -47680,7 +48449,7 @@ msgstr "" msgid "Stock Reservation Entries Created" msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:430 +#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:411 msgid "Stock Reservation Entries created" msgstr "" @@ -47739,12 +48508,15 @@ msgstr "" #. Label of a shortcut in the ERPNext Settings Workspace #. Name of a DocType #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/selling_settings/selling_settings.py:94 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json #: 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 +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/stock.json msgid "Stock Settings" msgstr "" @@ -47815,8 +48587,8 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:253 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:305 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:254 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:306 #: erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json @@ -47978,11 +48750,11 @@ msgstr "" msgid "Stock cannot be updated against Purchase Receipt {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1225 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1228 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1294 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1297 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "" @@ -48154,9 +48926,11 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Subcontracting Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontract Order Summary" msgstr "" @@ -48208,25 +48982,31 @@ msgstr "" msgid "Subcontracted Raw Materials To Be Transferred" msgstr "" +#. Label of a Desktop Icon #. Option for the 'Type' (Select) field in DocType 'Material Request Plan Item' #. Label of the subcontracting_section (Section Break) field in DocType #. 'Production Plan Sub Assembly Item' #. Label of a Card Break in the Manufacturing Workspace #. Option for the 'Purpose' (Select) field in DocType 'Material Request' #. Name of a Workspace +#. Title of a Workspace Sidebar +#: erpnext/desktop_icon/subcontracting.json #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:10 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting" msgstr "" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting BOM" msgstr "" @@ -48242,11 +49022,13 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #. Label of a Link in the Subcontracting Workspace +#. Label of a Workspace Sidebar Item #: erpnext/setup/setup_wizard/operations/install_fixtures.py:132 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:158 #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Delivery" msgstr "" @@ -48320,6 +49102,7 @@ msgstr "" #. Receipt Item' #. Label of the subcontracting_order (Link) field in DocType 'Subcontracting #. Receipt Supplied Item' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:399 #: erpnext/controllers/subcontracting_controller.py:1167 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -48329,6 +49112,7 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:140 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Order" msgstr "" @@ -48358,7 +49142,7 @@ msgstr "" msgid "Subcontracting Order Supplied Item" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:916 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:919 msgid "Subcontracting Order {0} created." msgstr "" @@ -48390,6 +49174,7 @@ msgstr "" #. Inspection' #. Name of a DocType #. Label of a Link in the Subcontracting Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json @@ -48398,6 +49183,7 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:643 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/workspace/subcontracting/subcontracting.json +#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Receipt" msgstr "" @@ -48440,7 +49226,7 @@ msgstr "" msgid "Subdivision" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:912 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:915 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1047 msgid "Submit Action Failed" msgstr "" @@ -48478,6 +49264,9 @@ msgstr "" #. Label of the subscription (Link) field in DocType 'Sales Invoice' #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_subscription/process_subscription.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py:26 @@ -48486,9 +49275,11 @@ msgstr "" #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py:16 +#: erpnext/desktop_icon/subscription.json #: erpnext/selling/doctype/quotation/quotation_dashboard.py:12 #: erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py:25 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py:34 +#: erpnext/workspace_sidebar/subscription.json msgid "Subscription" msgstr "" @@ -48523,8 +49314,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_plan/subscription_plan.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/subscription.json msgid "Subscription Plan" msgstr "" @@ -48564,8 +49357,11 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_settings/subscription_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/erpnext_settings.json +#: erpnext/workspace_sidebar/subscription.json msgid "Subscription Settings" msgstr "" @@ -48745,6 +49541,7 @@ msgstr "" #. Option for the 'Delivery to' (Select) field in DocType 'Shipment' #. Label of the delivery_supplier (Link) field in DocType 'Shipment' #. Label of the supplier (Link) field in DocType 'Stock Entry' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json #: erpnext/accounts/doctype/payment_order/payment_order.js:112 #: erpnext/accounts/doctype/payment_order/payment_order.json @@ -48756,7 +49553,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: 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:183 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:184 #: erpnext/accounts/report/purchase_register/purchase_register.js:21 #: erpnext/accounts/report/purchase_register/purchase_register.py:171 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:29 @@ -48805,6 +49602,9 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: 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 msgid "Supplier" msgstr "" @@ -48838,7 +49638,9 @@ msgid "Supplier Address Details" msgstr "" #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Addresses And Contacts" msgstr "" @@ -48877,6 +49679,7 @@ msgstr "" #. Label of the supplier_group (Link) field in DocType 'Import Supplier #. Invoice' #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -48886,7 +49689,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:91 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1261 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:198 -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:180 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:178 #: erpnext/accounts/report/purchase_register/purchase_register.js:27 #: erpnext/accounts/report/purchase_register/purchase_register.py:186 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:55 @@ -48900,6 +49703,7 @@ msgstr "" #: erpnext/regional/report/irs_1099/irs_1099.js:26 #: erpnext/regional/report/irs_1099/irs_1099.py:70 #: erpnext/setup/doctype/supplier_group/supplier_group.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Group" msgstr "" @@ -48933,22 +49737,18 @@ msgstr "" msgid "Supplier Invoice Date" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1750 -msgid "Supplier Invoice Date cannot be greater than Posting Date" -msgstr "" - #. Label of the bill_no (Data) field in DocType 'Payment Entry Reference' #. Label of the bill_no (Data) field in DocType 'Purchase Invoice' #: 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:791 +#: erpnext/accounts/report/general_ledger/general_ledger.py:789 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:139 msgid "Supplier Invoice No" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1777 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1773 msgid "Supplier Invoice No exists in Purchase Invoice {0}" msgstr "" @@ -48967,6 +49767,11 @@ msgstr "" msgid "Supplier Lead Time (days)" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/financial_reports.json +msgid "Supplier Ledger" +msgstr "" + #. Name of a report #. Label of a Link in the Financial Reports Workspace #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.json @@ -48988,7 +49793,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1178 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 -#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:190 +#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:191 #: erpnext/accounts/report/purchase_register/purchase_register.py:177 #: erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py:35 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:73 @@ -49066,6 +49871,7 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace #. Label of the supplier_quotation (Link) field in DocType 'Quotation' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:565 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json @@ -49078,14 +49884,17 @@ msgstr "" #: erpnext/crm/doctype/opportunity/opportunity.js:81 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/stock/doctype/material_request/material_request.js:208 +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation" msgstr "" #. Name of a report #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:154 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation Comparison" msgstr "" @@ -49117,15 +49926,19 @@ msgstr "" #. Name of a DocType #. Label of a Card Break in the Buying Workspace #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Scorecard" msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/supplier_scorecard_criteria/supplier_scorecard_criteria.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Scorecard Criteria" msgstr "" @@ -49156,15 +49969,19 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Scorecard Standing" msgstr "" #. Name of a DocType #. Label of a Link in the Buying Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.json #: erpnext/buying/workspace/buying/buying.json +#: erpnext/workspace_sidebar/buying.json msgid "Supplier Scorecard Variable" msgstr "" @@ -49215,8 +50032,10 @@ 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 "" @@ -49235,11 +50054,15 @@ msgstr "" msgid "Supply" msgstr "" +#. Label of a Desktop Icon #. Name of a Workspace +#. Title of a Workspace Sidebar +#: erpnext/desktop_icon/support.json #: erpnext/selling/doctype/customer/customer_dashboard.py:23 #: erpnext/setup/doctype/company/company_dashboard.py:24 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:298 #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/support.json msgid "Support" msgstr "" @@ -49260,8 +50083,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/support/doctype/support_settings/support_settings.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/erpnext_settings.json msgid "Support Settings" msgstr "" @@ -49345,7 +50170,9 @@ msgid "System will notify to increase or decrease quantity or amount " msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.json +#: erpnext/workspace_sidebar/taxes.json msgid "TDS Computation Summary" msgstr "" @@ -49735,6 +50562,7 @@ msgstr "" #. Label of the tax_category (Link) field in DocType 'Delivery Note' #. Label of the tax_category (Link) field in DocType 'Item Tax' #. Label of the tax_category (Link) field in DocType 'Purchase Receipt' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/custom/address.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -49754,6 +50582,7 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +#: erpnext/workspace_sidebar/taxes.json msgid "Tax Category" msgstr "" @@ -49851,8 +50680,10 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/workspace_sidebar/taxes.json msgid "Tax Rule" msgstr "" @@ -49866,6 +50697,11 @@ msgstr "" msgid "Tax Settings" msgstr "" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/selling.json +msgid "Tax Template" +msgstr "" + #: erpnext/accounts/doctype/tax_rule/tax_rule.py:83 msgid "Tax Template is mandatory." msgstr "" @@ -49900,6 +50736,7 @@ msgstr "" #. Label of the tax_withholding_category (Link) field in DocType 'Lower #. Deduction Certificate' #. Label of the tax_withholding_category (Link) field in DocType 'Customer' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -49910,11 +50747,14 @@ msgstr "" #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/selling/doctype/customer/customer.json +#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Category" msgstr "" #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.json +#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Details" msgstr "" @@ -49962,6 +50802,7 @@ msgstr "" #. Rate' #. Label of the tax_withholding_group (Link) field in DocType 'Supplier' #. Label of the tax_withholding_group (Link) field in DocType 'Customer' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -49971,6 +50812,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json +#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Group" msgstr "" @@ -50036,18 +50878,21 @@ msgstr "" #. Label of the taxes (Table) field in DocType 'POS Closing Entry' #. Label of the sb_1 (Section Break) field in DocType 'Subscription' +#. Label of a Desktop Icon #. Label of the taxes_section (Section Break) field in DocType 'Sales Order' #. Label of the taxes (Table) field in DocType 'Item Group' #. Label of the taxes (Table) field in DocType 'Item' +#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html:60 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:12 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:26 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:42 +#: erpnext/desktop_icon/taxes.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/item_group/item_group.json -#: erpnext/stock/doctype/item/item.json +#: erpnext/stock/doctype/item/item.json erpnext/workspace_sidebar/taxes.json msgid "Taxes" msgstr "" @@ -50323,7 +51168,9 @@ msgid "Terms & Conditions" msgstr "" #. Label of the tc_name (Link) field in DocType 'Supplier Quotation' +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +#: erpnext/workspace_sidebar/selling.json msgid "Terms Template" msgstr "" @@ -50352,6 +51199,7 @@ msgstr "" #. Name of a DocType #. Label of the terms (Text Editor) field in DocType 'Terms and Conditions' #. Label of the terms (Text Editor) field in DocType 'Purchase Receipt' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -50367,6 +51215,7 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +#: erpnext/workspace_sidebar/accounts_setup.json msgid "Terms and Conditions" msgstr "" @@ -50432,6 +51281,7 @@ msgstr "" #. Option for the 'Entity Type' (Select) field in DocType 'Service Level #. Agreement' #. Label of the territory (Link) field in DocType 'Warranty Claim' +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -50443,11 +51293,11 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:97 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:182 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:68 -#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:171 +#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:169 #: erpnext/accounts/report/gross_profit/gross_profit.py:436 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js:8 #: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:21 -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:251 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:252 #: erpnext/accounts/report/sales_register/sales_register.py:209 #: erpnext/crm/doctype/lead/lead.json #: erpnext/crm/doctype/opportunity/opportunity.json @@ -50484,6 +51334,7 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/support/doctype/service_level_agreement/service_level_agreement.json #: erpnext/support/doctype/warranty_claim/warranty_claim.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/selling.json msgid "Territory" msgstr "" @@ -50504,8 +51355,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Selling Workspace +#. Label of a Workspace Sidebar Item #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.json #: erpnext/selling/workspace/selling/selling.json +#: erpnext/workspace_sidebar/selling.json msgid "Territory Target Variance Based On Item Group" msgstr "" @@ -50560,7 +51413,7 @@ msgstr "" msgid "The Document Type {0} must have a Status field to configure Service Level Agreement" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:335 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:337 msgid "The Excluded Fee is bigger than the Deposit it is deducted from." msgstr "" @@ -50576,7 +51429,7 @@ msgstr "" msgid "The Loyalty Program isn't valid for the selected company" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:978 +#: erpnext/accounts/doctype/payment_request/payment_request.py:981 msgid "The Payment Request {0} is already paid, cannot process payment twice" msgstr "" @@ -50600,7 +51453,7 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2513 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2536 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" @@ -50618,7 +51471,7 @@ msgstr "" msgid "The account head under Liability or Equity, in which Profit/Loss will be booked" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:873 +#: erpnext/accounts/doctype/payment_request/payment_request.py:876 msgid "The allocated amount is greater than the outstanding amount of Payment Request {0}" msgstr "" @@ -50675,6 +51528,10 @@ msgstr "" msgid "The fields From Shareholder and To Shareholder cannot be blank" msgstr "" +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:40 +msgid "The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status." +msgstr "" + #: erpnext/accounts/doctype/share_transfer/share_transfer.py:240 msgid "The folio numbers are not matching" msgstr "" @@ -50728,7 +51585,7 @@ msgstr "" msgid "The holiday on {0} is not between From Date and To Date" msgstr "" -#: erpnext/controllers/buying_controller.py:1229 +#: erpnext/controllers/buying_controller.py:1246 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "" @@ -50736,7 +51593,7 @@ msgstr "" msgid "The items {0} and {1} are present in the following {2} :" msgstr "" -#: erpnext/controllers/buying_controller.py:1222 +#: erpnext/controllers/buying_controller.py:1239 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "" @@ -50842,12 +51699,16 @@ msgstr "" msgid "The selected item cannot have Batch" msgstr "" +#: erpnext/assets/doctype/asset/asset.js:619 +msgid "The sell quantity is less than the total asset quantity. The remaining quantity will be split into a new asset. This action cannot be undone.

Do you want to continue?" +msgstr "" + #: erpnext/accounts/doctype/share_transfer/share_transfer.py:194 msgid "The seller and the buyer cannot be the same" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:176 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:188 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:177 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:189 msgid "The serial and batch bundle {0} not linked to {1} {2}" msgstr "" @@ -50973,7 +51834,7 @@ msgstr "" msgid "Then Pricing Rules are filtered out based on Customer, Customer Group, Territory, Supplier, Supplier Type, Campaign, Sales Partner etc." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:722 +#: erpnext/assets/doctype/asset/asset.py:725 msgid "There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset." msgstr "" @@ -51072,7 +51933,7 @@ msgstr "" msgid "This Month's Summary" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:925 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:928 msgid "This Purchase Order has been fully subcontracted." msgstr "" @@ -51233,7 +52094,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1453 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1501 msgid "This schedule was created when Asset {0} was restored due to Sales Invoice {1} cancellation." msgstr "" @@ -51245,7 +52106,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was restored." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1449 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1497 msgid "This schedule was created when Asset {0} was returned through Sales Invoice {1}." msgstr "" @@ -51253,11 +52114,11 @@ msgstr "" msgid "This schedule was created when Asset {0} was scrapped." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1499 +#: erpnext/assets/doctype/asset/asset.py:1503 msgid "This schedule was created when Asset {0} was {1} into new Asset {2}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1425 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1473 msgid "This schedule was created when Asset {0} was {1} through Sales Invoice {2}." msgstr "" @@ -51435,19 +52296,23 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1066 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py:26 #: erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py:59 #: erpnext/projects/workspace/projects/projects.json #: erpnext/templates/pages/projects.html:65 +#: erpnext/workspace_sidebar/projects.json msgid "Timesheet" msgstr "" #. Name of a report #. Label of a Link in the Projects Workspace +#. Label of a Workspace Sidebar Item #: erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.json #: erpnext/projects/workspace/projects/projects.json +#: erpnext/workspace_sidebar/projects.json msgid "Timesheet Billing Summary" msgstr "" @@ -51463,7 +52328,7 @@ msgstr "" msgid "Timesheet for tasks." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:890 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:893 msgid "Timesheet {0} cannot be invoiced in its current state" msgstr "" @@ -51757,11 +52622,11 @@ msgstr "" msgid "To be Delivered to Customer" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:554 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:557 msgid "To cancel a {} you need to cancel the POS Closing Entry {}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:567 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:570 msgid "To cancel this Sales Invoice you need to cancel the POS Closing Entry {}." msgstr "" @@ -51818,7 +52683,7 @@ msgid "To use a different finance book, please uncheck 'Include Default FB Asset msgstr "" #: erpnext/accounts/doctype/financial_report_template/financial_report_engine.py:705 -#: erpnext/accounts/report/financial_statements.py:624 +#: erpnext/accounts/report/financial_statements.py:621 #: erpnext/accounts/report/general_ledger/general_ledger.py:310 #: erpnext/accounts/report/trial_balance/trial_balance.py:310 msgid "To use a different finance book, please uncheck 'Include Default FB Entries'" @@ -51861,6 +52726,7 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #. Label of the tools (Column Break) field in DocType 'Email Digest' #. Label of a Card Break in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:599 #: erpnext/buying/doctype/purchase_order/purchase_order.js:675 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:61 @@ -51872,6 +52738,8 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/manufacturing.json +#: erpnext/workspace_sidebar/stock.json msgid "Tools" msgstr "" @@ -52325,7 +53193,7 @@ msgstr "" msgid "Total Order Value" msgstr "" -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:622 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:621 msgid "Total Other Charges" msgstr "" @@ -52495,7 +53363,7 @@ msgstr "" msgid "Total Tasks" msgstr "" -#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:615 +#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:614 #: erpnext/accounts/report/purchase_register/purchase_register.py:263 msgid "Total Tax" msgstr "" @@ -52677,7 +53545,7 @@ msgid "Total hours: {0}" msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:569 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:538 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:541 msgid "Total payments amount can't be greater than {}" msgstr "" @@ -52857,6 +53725,10 @@ msgstr "" msgid "Transaction Name" msgstr "" +#: erpnext/stock/report/negative_batch_report/negative_batch_report.py:60 +msgid "Transaction Qty" +msgstr "" + #. Label of the transaction_settings_section (Tab Break) field in DocType #. 'Buying Settings' #. Label of the sales_transactions_settings_section (Section Break) field in @@ -52932,7 +53804,7 @@ msgstr "" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1158 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1161 msgid "Transactions using Sales Invoice in POS are disabled." msgstr "" @@ -53105,8 +53977,12 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/trial_balance/trial_balance.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Trial Balance" msgstr "" @@ -53117,8 +53993,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Financial Reports Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "Trial Balance for Party" msgstr "" @@ -53214,8 +54092,10 @@ msgstr "" #. Label of a Link in the Financial Reports Workspace #. Name of a report +#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/regional/report/uae_vat_201/uae_vat_201.json +#: erpnext/workspace_sidebar/financial_reports.json msgid "UAE VAT 201" msgstr "" @@ -53373,6 +54253,7 @@ msgstr "" #. Item' #. Label of the conversion_factor (Float) field in DocType 'Pick List Item' #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -53386,6 +54267,7 @@ msgstr "" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "UOM Conversion Factor" msgstr "" @@ -53557,8 +54439,10 @@ msgstr "" #. Label of a Link in the Home Workspace #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Unit of Measure (UOM)" msgstr "" @@ -53604,7 +54488,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:278 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:279 #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/doctype/subscription/subscription_list.js:12 msgid "Unpaid" @@ -53658,7 +54542,11 @@ msgid "Unrealized Profit/Loss account for intra-company transfers" msgstr "" #. Name of a DocType +#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json +#: erpnext/workspace_sidebar/banking.json +#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Unreconcile Payment" msgstr "" @@ -55050,7 +55938,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:209 #: erpnext/accounts/report/general_ledger/general_ledger.js:49 -#: erpnext/accounts/report/general_ledger/general_ledger.py:746 +#: erpnext/accounts/report/general_ledger/general_ledger.py:744 #: 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 @@ -55078,7 +55966,7 @@ msgstr "" msgid "Voucher No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1338 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1341 msgid "Voucher No is mandatory" msgstr "" @@ -55090,7 +55978,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:740 +#: erpnext/accounts/report/general_ledger/general_ledger.py:738 msgid "Voucher Subtype" msgstr "" @@ -55121,7 +56009,7 @@ msgstr "" #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1198 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:200 -#: erpnext/accounts/report/general_ledger/general_ledger.py:738 +#: erpnext/accounts/report/general_ledger/general_ledger.py:736 #: 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 @@ -55152,7 +56040,7 @@ msgstr "" msgid "Voucher Type" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:198 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:200 msgid "Voucher {0} is over-allocated by {1}" msgstr "" @@ -55276,8 +56164,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace +#. Label of a Workspace Sidebar Item #: erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.json #: erpnext/stock/workspace/stock/stock.json +#: erpnext/workspace_sidebar/stock.json msgid "Warehouse Wise Stock Balance" msgstr "" @@ -55320,7 +56210,7 @@ msgstr "" msgid "Warehouse not found against the account {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1215 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1218 #: erpnext/stock/doctype/delivery_note/delivery_note.py:440 msgid "Warehouse required for stock Item {0}" msgstr "" @@ -55506,10 +56396,12 @@ msgstr "" #. Label of a Link in the CRM Workspace #. Name of a DocType #. Label of a Link in the Support Workspace +#. Label of a Workspace Sidebar Item #: erpnext/crm/workspace/crm/crm.json #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:103 #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/workspace/support/support.json +#: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/support.json msgid "Warranty Claim" msgstr "" @@ -55880,6 +56772,7 @@ msgstr "" #. Entry' #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.js:217 #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/job_card/job_card.json @@ -55905,6 +56798,7 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:512 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:142 #: erpnext/templates/pages/material_request_info.html:45 +#: erpnext/workspace_sidebar/manufacturing.json msgid "Work Order" msgstr "" @@ -55918,8 +56812,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Work Order Consumed Materials" msgstr "" @@ -55952,8 +56848,10 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/report/work_order_summary/work_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Work Order Summary" msgstr "" @@ -56052,6 +56950,7 @@ msgstr "" #. Label of a Link in the Manufacturing Workspace #. Label of the manufacturing_section (Section Break) field in DocType 'Item #. Lead Time' +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json #: erpnext/manufacturing/doctype/bom_website_operation/bom_website_operation.json #: erpnext/manufacturing/doctype/job_card/job_card.json @@ -56067,6 +56966,7 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json #: erpnext/templates/generators/bom.html:70 +#: erpnext/workspace_sidebar/manufacturing.json msgid "Workstation" msgstr "" @@ -56113,12 +57013,14 @@ msgstr "" #. Name of a DocType #. Label of the workstation_type (Data) field in DocType 'Workstation Type' #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/doctype/workstation_type/workstation_type.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/workspace_sidebar/manufacturing.json msgid "Workstation Type" msgstr "" @@ -56276,6 +57178,7 @@ msgstr "" #. Label of the year (Data) field in DocType 'Fiscal Year' #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json +#: erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.html:9 msgid "Year Name" msgstr "" @@ -56289,7 +57192,7 @@ msgstr "" msgid "Year of Passing" msgstr "" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:111 +#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:85 msgid "Year start date or end date is overlapping with {0}. To avoid please set company" msgstr "" @@ -56329,7 +57232,7 @@ msgstr "" msgid "You can also set default CWIP account in Company {}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1013 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "" @@ -56366,7 +57269,7 @@ msgstr "" msgid "You can't make any changes to Job Card since Work Order is closed." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:219 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:220 msgid "You can't process the serial number {0} as it has already been used in the SABB {1}. {2} if you want to inward same serial number multiple times then enabled 'Allow existing Serial No to be Manufactured/Received again' in the {3}" msgstr "" @@ -56406,7 +57309,7 @@ msgstr "" msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:157 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:158 msgid "You cannot outward following {0} as either they are Delivered, Inactive or located in a different warehouse." msgstr "" @@ -56574,6 +57477,10 @@ msgstr "" msgid "as a percentage of finished item quantity" msgstr "" +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1473 +msgid "as of {0}" +msgstr "" + #: erpnext/www/book_appointment/index.html:43 msgid "at" msgstr "" @@ -56591,7 +57498,7 @@ msgid "cannot be greater than 100" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:334 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1101 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1104 msgid "dated {0}" msgstr "" @@ -56769,7 +57676,7 @@ msgstr "" msgid "received from" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1427 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 msgid "returned" msgstr "" @@ -56804,7 +57711,7 @@ msgstr "" msgid "sandbox" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1427 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 msgid "sold" msgstr "" @@ -56831,7 +57738,7 @@ msgstr "" msgid "to" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3118 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3166 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "" @@ -56979,9 +57886,9 @@ msgstr "" msgid "{0} cannot be zero" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:920 -#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1036 -#: erpnext/stock/doctype/pick_list/pick_list.py:1259 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:916 +#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1032 +#: erpnext/stock/doctype/pick_list/pick_list.py:1258 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:322 msgid "{0} created" msgstr "" @@ -56994,7 +57901,7 @@ msgstr "" msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:291 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:294 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "" @@ -57066,11 +57973,11 @@ msgstr "" msgid "{0} is blocked so this transaction cannot proceed" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:498 +#: erpnext/assets/doctype/asset/asset.py:501 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1130 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1133 msgid "{0} is mandatory for Item {1}" msgstr "" @@ -57143,7 +58050,7 @@ msgstr "" msgid "{0} must be negative in return document" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2318 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2366 msgid "{0} not allowed to transact with {1}. Please change the Company or add the Company in the 'Allowed To Transact With'-Section in the Customer record." msgstr "" @@ -57167,12 +58074,12 @@ msgstr "" msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1017 +#: erpnext/stock/doctype/pick_list/pick_list.py:1016 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:1009 -msgid "{0} units of Item {1} is picked in another Pick List." +msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "" #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:145 @@ -57254,7 +58161,7 @@ msgstr "" msgid "{0} {1} has already been partly paid. Please use the 'Get Outstanding Invoice' or the 'Get Outstanding Orders' button to get the latest outstanding amounts." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:431 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:434 #: erpnext/selling/doctype/sales_order/sales_order.py:596 #: erpnext/stock/doctype/material_request/material_request.py:247 msgid "{0} {1} has been modified. Please refresh." @@ -57451,11 +58358,11 @@ msgstr "" msgid "{0}: {1} must be less than {2}" msgstr "" -#: erpnext/controllers/buying_controller.py:1002 +#: erpnext/controllers/buying_controller.py:1019 msgid "{count} Assets created for {item_code}" msgstr "" -#: erpnext/controllers/buying_controller.py:900 +#: erpnext/controllers/buying_controller.py:917 msgid "{doctype} {name} is cancelled or closed." msgstr "" @@ -57475,7 +58382,7 @@ msgstr "" msgid "{}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2084 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2132 msgid "{} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {}" msgstr "" @@ -57496,7 +58403,7 @@ msgstr "" msgid "{} {} is already linked with {} {}" msgstr "" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:388 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:390 msgid "{} {} is not affecting bank account {}" msgstr "" From 61d339cfa72aeeeddb0a313a609a6678e04159f7 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 19 Feb 2026 12:59:11 +0530 Subject: [PATCH 26/78] fix(manufacturing): update status for work order before calculating planned qty (cherry picked from commit 4d40c84a3131c1a6845f52f2a33ddd22828a2a0a) --- erpnext/manufacturing/doctype/work_order/work_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 78576f0a2c0..aa7047d7633 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -2506,8 +2506,8 @@ def close_work_order(work_order, status): ) ) - work_order.on_close_or_cancel() work_order.update_status(status) + work_order.on_close_or_cancel() frappe.msgprint(_("Work Order has been {0}").format(status)) work_order.notify_update() return work_order.status From d9d76fceeb69912742d55ab9d8e48683ee1900c6 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Mon, 23 Feb 2026 02:32:40 +0530 Subject: [PATCH 27/78] test(manufacturing): add test to validate the planned qty (cherry picked from commit cfbdfcf5156c323a4bc2f4f0d465893340869474) --- .../doctype/work_order/test_work_order.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index 571e43a3d30..08f5e2eaf56 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -598,6 +598,33 @@ class TestWorkOrder(IntegrationTestCase): work_order1.cancel() work_order.cancel() + def test_planned_qty_updates_after_closing_work_order(self): + item_code = "_Test FG Item" + fg_warehouse = "_Test Warehouse 1 - _TC" + + planned_before = ( + frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": fg_warehouse}, "planned_qty") + or 0 + ) + + wo = make_wo_order_test_record(item=item_code, fg_warehouse=fg_warehouse, qty=10) + + planned_after_submit = ( + frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": fg_warehouse}, "planned_qty") + or 0 + ) + self.assertEqual(planned_after_submit, planned_before + 10) + + close_work_order(wo.name, "Closed") + + self.assertEqual(frappe.db.get_value("Work Order", wo.name, "status"), "Closed") + + planned_after_close = ( + frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": fg_warehouse}, "planned_qty") + or 0 + ) + self.assertEqual(planned_after_close, planned_before) + def test_work_order_with_non_transfer_item(self): frappe.db.set_single_value("Manufacturing Settings", "backflush_raw_materials_based_on", "BOM") From 91e9867fb172c35173f635b31fe04f55d4bde0d5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 3 Feb 2026 22:42:02 +0530 Subject: [PATCH 28/78] refactor: Cleanup buying module forms (cherry picked from commit f3ea1863aeff6d2bf47d675ffa1a37ef6b4fc093) # Conflicts: # erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json --- .../purchase_invoice/purchase_invoice.json | 66 +++++++++++++------ .../doctype/purchase_order/purchase_order.js | 21 ------ .../purchase_order/purchase_order.json | 66 +++++++++++-------- erpnext/public/js/controllers/transaction.js | 24 ++++--- .../purchase_receipt/purchase_receipt.json | 51 ++++++++------ .../purchase_receipt_item.json | 5 +- 6 files changed, 131 insertions(+), 102 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 21cda420f5a..c02acf7b5b8 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -8,12 +8,12 @@ "email_append_to": 1, "engine": "InnoDB", "field_order": [ - "company", "title", "naming_series", "supplier", "supplier_name", "tax_id", + "company", "column_break_6", "posting_date", "posting_time", @@ -85,20 +85,24 @@ "taxes_and_charges_added", "taxes_and_charges_deducted", "total_taxes_and_charges", - "section_break_49", + "totals_section", + "grand_total", + "disable_rounded_total", + "rounding_adjustment", + "column_break8", + "use_company_roundoff_cost_center", + "in_words", + "rounded_total", + "base_totals_section", "base_grand_total", "base_rounding_adjustment", - "base_rounded_total", + "column_break_hcca", "base_in_words", - "column_break8", - "grand_total", - "rounding_adjustment", - "use_company_roundoff_cost_center", - "rounded_total", - "in_words", + "base_rounded_total", + "section_break_ttrv", "total_advance", + "column_break_peap", "outstanding_amount", - "disable_rounded_total", "section_tax_withholding_entry", "tax_withholding_group", "ignore_tax_withholding_threshold", @@ -883,15 +887,10 @@ "options": "currency", "print_hide": 1 }, - { - "fieldname": "section_break_49", - "fieldtype": "Section Break", - "label": "Totals" - }, { "fieldname": "base_grand_total", "fieldtype": "Currency", - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -902,7 +901,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounding_adjustment", "fieldtype": "Currency", - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -912,7 +911,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounded_total", "fieldtype": "Currency", - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -921,7 +920,7 @@ { "fieldname": "base_in_words", "fieldtype": "Data", - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -1626,8 +1625,7 @@ "hidden": 1, "label": "Item Wise Tax Details", "no_copy": 1, - "options": "Item Wise Tax Detail", - "print_hide": 1 + "options": "Item Wise Tax Detail" }, { "collapsible": 1, @@ -1662,6 +1660,28 @@ "fieldname": "override_tax_withholding_entries", "fieldtype": "Check", "label": "Edit Tax Withholding Entries" + }, + { + "fieldname": "column_break_hcca", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_ttrv", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_peap", + "fieldtype": "Column Break" + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)" + }, + { + "fieldname": "totals_section", + "fieldtype": "Section Break", + "label": "Totals" } ], "grid_page_length": 50, @@ -1669,7 +1689,11 @@ "idx": 204, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2026-02-05 20:45:16.964500", +======= + "modified": "2026-02-04 16:32:19.664287", +>>>>>>> f3ea1863ae (refactor: Cleanup buying module forms) "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 12b0a8c301c..073312a8450 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -461,27 +461,6 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends ( } } - get_items_from_open_material_requests() { - erpnext.utils.map_current_doc({ - method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order_based_on_supplier", - args: { - supplier: this.frm.doc.supplier, - }, - source_doctype: "Material Request", - source_name: this.frm.doc.supplier, - target: this.frm, - setters: { - company: this.frm.doc.company, - }, - get_query_filters: { - docstatus: ["!=", 2], - supplier: this.frm.doc.supplier, - }, - get_query_method: - "erpnext.stock.doctype.material_request.material_request.get_material_requests_based_on_supplier", - }); - } - validate() { set_schedule_date(this.frm); } diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 25a31ea698d..f528e07391d 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -9,23 +9,20 @@ "engine": "InnoDB", "field_order": [ "supplier_section", - "company", "title", "naming_series", + "supplier", + "supplier_name", "order_confirmation_no", "order_confirmation_date", - "get_items_from_open_material_requests", - "mps", "column_break_7", "transaction_date", "schedule_date", "column_break1", - "supplier", + "company", "is_subcontracted", - "supplier_name", "has_unit_price_items", "supplier_warehouse", - "amended_from", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -79,16 +76,19 @@ "taxes_and_charges_deducted", "total_taxes_and_charges", "totals_section", + "grand_total", + "disable_rounded_total", + "rounding_adjustment", + "column_break4", + "in_words", + "rounded_total", + "base_totals_section", "base_grand_total", "base_rounding_adjustment", + "column_break_jkoz", "base_in_words", "base_rounded_total", - "column_break4", - "grand_total", - "rounding_adjustment", - "rounded_total", - "disable_rounded_total", - "in_words", + "section_break_tnkm", "advance_paid", "discount_section", "apply_discount_on", @@ -154,11 +154,13 @@ "auto_repeat", "update_auto_repeat_reference", "additional_info_section", - "is_internal_supplier", + "party_account_currency", "represents_company", "ref_sq", + "amended_from", "column_break_74", - "party_account_currency", + "mps", + "is_internal_supplier", "inter_company_order_reference", "is_old_subcontracting_flow", "connections_tab" @@ -206,13 +208,6 @@ "reqd": 1, "search_index": 1 }, - { - "depends_on": "eval:doc.supplier && doc.docstatus===0 && (!(doc.items && doc.items.length) || (doc.items.length==1 && !doc.items[0].item_code))", - "description": "Fetch items based on Default Supplier.", - "fieldname": "get_items_from_open_material_requests", - "fieldtype": "Button", - "label": "Get Items from Open Material Requests" - }, { "bold": 1, "fetch_from": "supplier.supplier_name", @@ -773,7 +768,7 @@ { "fieldname": "base_grand_total", "fieldtype": "Currency", - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "no_copy": 1, "oldfieldname": "grand_total", "oldfieldtype": "Currency", @@ -785,7 +780,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounding_adjustment", "fieldtype": "Currency", - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -794,7 +789,7 @@ { "fieldname": "base_in_words", "fieldtype": "Data", - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -804,7 +799,7 @@ { "fieldname": "base_rounded_total", "fieldtype": "Currency", - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -862,7 +857,7 @@ { "fieldname": "advance_paid", "fieldtype": "Currency", - "label": "Advance Paid", + "label": "Advance Paid (Company Currency)", "no_copy": 1, "options": "party_account_currency", "print_hide": 1, @@ -1301,8 +1296,21 @@ "hidden": 1, "label": "Item Wise Tax Details", "no_copy": 1, - "options": "Item Wise Tax Detail", - "print_hide": 1 + "options": "Item Wise Tax Detail" + }, + { + "fieldname": "column_break_jkoz", + "fieldtype": "Column Break" + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)", + "options": "Company:company:default_currency" + }, + { + "fieldname": "section_break_tnkm", + "fieldtype": "Section Break" } ], "grid_page_length": 50, @@ -1310,7 +1318,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-02-03 14:44:55.192192", + "modified": "2026-02-04 13:01:36.628472", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index d4a4577d8a0..f7a53709f79 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1733,13 +1733,11 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe this.frm.set_currency_labels( [ + "advance_paid", "base_total", "base_net_total", "base_total_taxes_and_charges", "base_discount_amount", - "base_grand_total", - "base_rounded_total", - "base_in_words", "base_taxes_and_charges_added", "base_taxes_and_charges_deducted", "total_amount_to_pay", @@ -1750,7 +1748,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe "base_raw_material_cost", "base_total_cost", "base_scrap_material_cost", - "base_rounding_adjustment", + "base_totals_section", ], company_currency ); @@ -1761,19 +1759,16 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe "net_total", "total_taxes_and_charges", "discount_amount", - "grand_total", "taxes_and_charges_added", "taxes_and_charges_deducted", "tax_withholding_net_total", - "rounded_total", - "in_words", "paid_amount", "write_off_amount", "operating_cost", "scrap_material_cost", - "rounding_adjustment", "raw_material_cost", "total_cost", + "totals_section", ], this.frm.doc.currency ); @@ -1827,6 +1822,19 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe this.frm.doc.price_list_currency != company_currency ); + let taxes_fields = [ + "total_taxes_and_charges", + "taxes_and_charges_deducted", + "taxes_and_charges_added", + "base_taxes_and_charges_added", + "base_taxes_and_charges_deducted", + "base_total_taxes_and_charges", + ]; + + taxes_fields.forEach((field) => { + this.frm.toggle_display(field, this.frm.doc[field] !== 0 || this.frm.doc.docstatus !== 1); + }); + let show = cint(this.frm.doc.discount_amount) || (this.frm.doc.taxes || []).filter(function (d) { diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 1e93e50b10d..b16dc1b32e1 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -77,17 +77,19 @@ "taxes_and_charges_added", "taxes_and_charges_deducted", "total_taxes_and_charges", - "section_break_46", + "totals_section", + "grand_total", + "disable_rounded_total", + "rounding_adjustment", + "column_break_50", + "in_words", + "rounded_total", + "base_totals_section", "base_grand_total", "base_rounding_adjustment", - "base_rounded_total", + "column_break_ugyv", "base_in_words", - "column_break_50", - "grand_total", - "rounding_adjustment", - "rounded_total", - "in_words", - "disable_rounded_total", + "base_rounded_total", "section_break_42", "apply_discount_on", "base_discount_amount", @@ -772,15 +774,10 @@ "options": "currency", "print_hide": 1 }, - { - "fieldname": "section_break_46", - "fieldtype": "Section Break", - "label": "Totals" - }, { "fieldname": "base_grand_total", "fieldtype": "Currency", - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -791,7 +788,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounding_adjustment", "fieldtype": "Currency", - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -800,7 +797,7 @@ { "fieldname": "base_in_words", "fieldtype": "Data", - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -810,7 +807,7 @@ { "fieldname": "base_rounded_total", "fieldtype": "Currency", - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -1282,8 +1279,22 @@ "hidden": 1, "label": "Item Wise Tax Details", "no_copy": 1, - "options": "Item Wise Tax Detail", - "print_hide": 1 + "options": "Item Wise Tax Detail" + }, + { + "fieldname": "totals_section", + "fieldtype": "Section Break", + "label": "Totals" + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)", + "options": "Company:company:default_currency" + }, + { + "fieldname": "column_break_ugyv", + "fieldtype": "Column Break" } ], "grid_page_length": 50, @@ -1291,7 +1302,7 @@ "idx": 261, "is_submittable": 1, "links": [], - "modified": "2026-01-29 21:24:30.652933", + "modified": "2026-02-04 14:36:41.087460", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index 70ca56e286f..a01a4841e49 100644 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -146,7 +146,7 @@ }, { "bold": 1, - "columns": 3, + "columns": 2, "fieldname": "item_code", "fieldtype": "Link", "in_global_search": 1, @@ -436,7 +436,6 @@ "columns": 2, "fieldname": "net_amount", "fieldtype": "Currency", - "in_list_view": 1, "label": "Net Amount", "options": "currency", "print_hide": 1, @@ -1141,7 +1140,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2025-10-21 10:39:32.659933", + "modified": "2026-02-04 14:42:10.646809", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", From 24fbd8add971ade6711b7866651a4340bfd86367 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 5 Feb 2026 13:47:57 +0530 Subject: [PATCH 29/78] refactor: form cleanup for master doctypes related to stock module (cherry picked from commit 6c49d5dc7d21eccfbd46f5ec3f18f94fd89334e5) --- erpnext/stock/doctype/bin/bin.json | 39 ++++++++-- erpnext/stock/doctype/item/item.json | 71 +++++++++++++------ erpnext/stock/doctype/warehouse/warehouse.js | 34 +++++---- .../stock/doctype/warehouse/warehouse.json | 19 +++-- 4 files changed, 121 insertions(+), 42 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.json b/erpnext/stock/doctype/bin/bin.json index b0668896597..0fb4d8d6790 100644 --- a/erpnext/stock/doctype/bin/bin.json +++ b/erpnext/stock/doctype/bin/bin.json @@ -5,20 +5,25 @@ "doctype": "DocType", "engine": "InnoDB", "field_order": [ + "item_and_warehouse_section", "item_code", "column_break_yreo", "warehouse", - "section_break_stag", + "available__future_inventory_section", "actual_qty", "planned_qty", + "column_break_sbzf", "indented_qty", "ordered_qty", - "projected_qty", - "column_break_xn5j", + "reserved_inventory_section", "reserved_qty", "reserved_qty_for_production", + "column_break_qwho", "reserved_qty_for_sub_contract", "reserved_qty_for_production_plan", + "section_break_stag", + "projected_qty", + "column_break_xn5j", "reserved_stock", "section_break_pmrs", "stock_uom", @@ -189,13 +194,36 @@ "fieldtype": "Float", "label": "Reserved Stock", "read_only": 1 + }, + { + "fieldname": "item_and_warehouse_section", + "fieldtype": "Section Break", + "label": "Item and Warehouse" + }, + { + "fieldname": "available__future_inventory_section", + "fieldtype": "Section Break", + "label": "Available / Future Inventory" + }, + { + "fieldname": "column_break_sbzf", + "fieldtype": "Column Break" + }, + { + "fieldname": "reserved_inventory_section", + "fieldtype": "Section Break", + "label": "Reserved Inventory" + }, + { + "fieldname": "column_break_qwho", + "fieldtype": "Column Break" } ], "hide_toolbar": 1, "idx": 1, "in_create": 1, "links": [], - "modified": "2026-02-01 08:11:46.824913", + "modified": "2026-02-05 17:34:44.541175", "modified_by": "Administrator", "module": "Stock", "name": "Bin", @@ -244,5 +272,6 @@ "search_fields": "item_code,warehouse", "sort_field": "creation", "sort_order": "ASC", - "states": [] + "states": [], + "title_field": "item_code" } diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 6b0ebcedfaf..820bf4b2730 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -3,7 +3,7 @@ "allow_import": 1, "allow_rename": 1, "autoname": "field:item_code", - "creation": "2013-05-03 10:45:46", + "creation": "2026-02-02 14:41:23.105228", "description": "A Product or a Service that is bought, sold or kept in stock.", "doctype": "DocType", "document_type": "Setup", @@ -16,9 +16,6 @@ "item_name", "item_group", "stock_uom", - "opening_stock", - "valuation_rate", - "standard_rate", "column_break0", "disabled", "allow_alternative_item", @@ -29,6 +26,10 @@ "is_grouped_asset", "asset_category", "asset_naming_series", + "section_break_gjns", + "opening_stock", + "column_break_ixrh", + "standard_rate", "section_break_znra", "over_delivery_receipt_allowance", "column_break_wugd", @@ -41,11 +42,14 @@ "uoms", "dashboard_tab", "inventory_section", + "inventory_valuation_section", + "valuation_method", + "column_break_cqdk", + "valuation_rate", "inventory_settings_section", "shelf_life_in_days", "end_of_life", "default_material_request_type", - "valuation_method", "column_break1", "warranty_period", "weight_per_unit", @@ -114,19 +118,21 @@ "sales_tax_withholding_category", "quality_tab", "inspection_required_before_purchase", - "quality_inspection_template", "inspection_required_before_delivery", + "column_break_pxjh", + "quality_inspection_template", "manufacturing", "include_item_in_manufacturing", "is_sub_contracted_item", "default_bom", "column_break_74", - "customer_code", - "default_item_manufacturer", - "default_manufacturer_part_no", + "production_capacity", "total_projected_qty", - "capacity_in_days_section", - "production_capacity" + "section_break_xili", + "customer_code", + "column_break_vipt", + "default_manufacturer_part_no", + "default_item_manufacturer" ], "fields": [ { @@ -188,6 +194,7 @@ "fieldname": "stock_uom", "fieldtype": "Link", "ignore_user_permissions": 1, + "in_list_view": 1, "label": "Default Unit of Measure", "oldfieldname": "stock_uom", "oldfieldtype": "Link", @@ -218,6 +225,7 @@ "depends_on": "eval:!doc.is_fixed_asset", "fieldname": "is_stock_item", "fieldtype": "Check", + "in_list_view": 1, "label": "Maintain Stock", "oldfieldname": "is_stock_item", "oldfieldtype": "Select" @@ -889,16 +897,10 @@ "fieldtype": "Column Break" }, { - "collapsible": 1, "fieldname": "deferred_accounting_section", "fieldtype": "Section Break", "label": "Deferred Accounting" }, - { - "fieldname": "capacity_in_days_section", - "fieldtype": "Section Break", - "label": "Capacity (In Days)" - }, { "fieldname": "production_capacity", "fieldtype": "Int", @@ -931,10 +933,10 @@ "fieldtype": "Section Break" }, { + "depends_on": "is_purchase_item", "fieldname": "purchase_tax_withholding_category", "fieldtype": "Link", "label": "Purchase Tax Withholding Category", - "depends_on": "is_purchase_item", "options": "Tax Withholding Category" }, { @@ -942,11 +944,40 @@ "fieldtype": "Column Break" }, { + "depends_on": "is_sales_item", "fieldname": "sales_tax_withholding_category", "fieldtype": "Link", "label": "Sales Tax Withholding Category", - "depends_on": "is_sales_item", "options": "Tax Withholding Category" + }, + { + "fieldname": "column_break_cqdk", + "fieldtype": "Column Break" + }, + { + "fieldname": "inventory_valuation_section", + "fieldtype": "Section Break", + "label": "Inventory Valuation" + }, + { + "fieldname": "section_break_gjns", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_ixrh", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_pxjh", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_xili", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_vipt", + "fieldtype": "Column Break" } ], "icon": "fa fa-tag", @@ -954,7 +985,7 @@ "image_field": "image", "links": [], "make_attachments_public": 1, - "modified": "2025-12-15 20:08:35.634046", + "modified": "2026-02-05 17:20:35.605734", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js index 562f45b08cc..33906e2e9c2 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.js +++ b/erpnext/stock/doctype/warehouse/warehouse.js @@ -58,12 +58,16 @@ frappe.ui.form.on("Warehouse", { } if ("Stock Balance" in frappe.boot.user.all_reports) { - frm.add_custom_button(__("Stock Balance"), function () { - frappe.set_route("query-report", "Stock Balance", { - warehouse: frm.doc.name, - company: frm.doc.company, - }); - }); + frm.add_custom_button( + __("Stock Balance"), + function () { + frappe.set_route("query-report", "Stock Balance", { + warehouse: frm.doc.name, + company: frm.doc.company, + }); + }, + __("View") + ); } } else { frappe.contacts.clear_address_and_contact(frm); @@ -74,13 +78,17 @@ frappe.ui.form.on("Warehouse", { frm.doc.__onload?.account && "General Ledger" in frappe.boot.user.all_reports ) { - frm.add_custom_button(__("General Ledger", null, "Warehouse"), function () { - frappe.route_options = { - account: frm.doc.__onload.account, - company: frm.doc.company, - }; - frappe.set_route("query-report", "General Ledger"); - }); + frm.add_custom_button( + __("General Ledger", null, "Warehouse"), + function () { + frappe.route_options = { + account: frm.doc.__onload.account, + company: frm.doc.company, + }; + frappe.set_route("query-report", "General Ledger"); + }, + __("View") + ); } frm.toggle_enable(["is_group", "company"], false); diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json index 9b673be581e..6a75c5ea760 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -12,12 +12,14 @@ "disabled", "warehouse_name", "column_break_3", - "is_group", - "parent_warehouse", + "company", "is_rejected_warehouse", "column_break_4", "account", - "company", + "section_break_ujhu", + "parent_warehouse", + "is_group", + "column_break_qhdh", "customer", "address_and_contact", "address_html", @@ -94,6 +96,7 @@ "description": "If blank, parent Warehouse Account or company default will be considered in transactions", "fieldname": "account", "fieldtype": "Link", + "in_list_view": 1, "label": "Account", "options": "Account" }, @@ -268,6 +271,14 @@ "fieldtype": "Link", "label": "Customer", "options": "Customer" + }, + { + "fieldname": "section_break_ujhu", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_qhdh", + "fieldtype": "Column Break" } ], "grid_page_length": 50, @@ -275,7 +286,7 @@ "idx": 1, "is_tree": 1, "links": [], - "modified": "2025-09-05 14:47:17.140099", + "modified": "2026-02-05 18:17:11.035097", "modified_by": "Administrator", "module": "Stock", "name": "Warehouse", From 575fd4988bd4b5d0d3067924c277b1288f1a66f5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 6 Feb 2026 17:10:54 +0530 Subject: [PATCH 30/78] refactor: form cleanup for stock and manufacturing doctypes (cherry picked from commit bf20ecca60a8cea9c0b5d90d94919e3c469af3e2) # Conflicts: # erpnext/buying/doctype/purchase_order/purchase_order.json --- .../purchase_order/purchase_order.json | 7 ++ erpnext/manufacturing/doctype/bom/bom.json | 69 ++++++++++---- .../doctype/job_card/job_card.js | 14 --- .../doctype/job_card/job_card.json | 68 ++++++------- .../doctype/job_card/job_card.py | 2 - .../doctype/work_order/work_order.json | 95 +++++++++++++------ .../doctype/work_order/work_order.py | 16 +++- .../doctype/workstation/workstation.py | 6 +- .../stock/doctype/pick_list/pick_list.json | 60 +++++++++--- .../doctype/pick_list/pick_list_dashboard.py | 16 +++- .../stock/doctype/stock_entry/stock_entry.js | 19 +++- .../doctype/stock_entry/stock_entry.json | 74 ++++++++++----- 12 files changed, 299 insertions(+), 147 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 25a31ea698d..9ae92f9dea2 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -20,7 +20,10 @@ "transaction_date", "schedule_date", "column_break1", +<<<<<<< HEAD "supplier", +======= +>>>>>>> bf20ecca60 (refactor: form cleanup for stock and manufacturing doctypes) "is_subcontracted", "supplier_name", "has_unit_price_items", @@ -1310,7 +1313,11 @@ "idx": 105, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2026-02-03 14:44:55.192192", +======= + "modified": "2026-02-06 17:07:24.249692", +>>>>>>> bf20ecca60 (refactor: form cleanup for stock and manufacturing doctypes) "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json index a3c4515bc9e..491920a0f29 100644 --- a/erpnext/manufacturing/doctype/bom/bom.json +++ b/erpnext/manufacturing/doctype/bom/bom.json @@ -7,9 +7,8 @@ "engine": "InnoDB", "field_order": [ "production_item_tab", - "item", "company", - "uom", + "item", "quantity", "cb0", "is_active", @@ -17,8 +16,6 @@ "allow_alternative_item", "set_rate_of_sub_assembly_item_based_on_bom", "is_phantom_bom", - "project", - "image", "currency_detail", "rm_cost_as_per", "buying_price_list", @@ -33,11 +30,9 @@ "column_break_23", "transfer_material_against", "routing", - "fg_based_operating_cost", - "column_break_joxb", - "default_source_warehouse", - "default_target_warehouse", "fg_based_section_section", + "fg_based_operating_cost", + "column_break_omye", "operating_cost_per_bom_quantity", "operations_section", "operations", @@ -61,15 +56,25 @@ "column_break_26", "total_cost", "base_total_cost", - "more_info_tab", - "item_name", - "column_break_27", - "description", - "has_variants", + "quality_inspection_tab", "quality_inspection_section_break", "inspection_required", "column_break_dxp7", "quality_inspection_template", + "more_info_tab", + "production_item_info_section", + "item_name", + "uom", + "image", + "column_break_27", + "description", + "has_variants", + "default_warehouse_section", + "default_source_warehouse", + "column_break_inep", + "default_target_warehouse", + "section_break_ouuf", + "project", "section_break0", "exploded_items", "website_section", @@ -451,7 +456,8 @@ "allow_on_submit": 1, "fieldname": "route", "fieldtype": "Small Text", - "label": "Route" + "label": "Route", + "read_only": 1 }, { "allow_on_submit": 1, @@ -651,15 +657,11 @@ { "default": "0", "depends_on": "with_operations", - "description": "Users can consume raw materials and add semi-finished goods or final finished goods against the operation using job cards.", + "description": "Users can make manufacture entry against Job Cards", "fieldname": "track_semi_finished_goods", "fieldtype": "Check", "label": "Track Semi Finished Goods" }, - { - "fieldname": "column_break_joxb", - "fieldtype": "Column Break" - }, { "fieldname": "default_source_warehouse", "fieldtype": "Link", @@ -677,6 +679,33 @@ "fieldname": "is_phantom_bom", "fieldtype": "Check", "label": "Is Phantom BOM" + }, + { + "fieldname": "default_warehouse_section", + "fieldtype": "Section Break", + "label": "Default Warehouse" + }, + { + "fieldname": "column_break_inep", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_omye", + "fieldtype": "Column Break" + }, + { + "fieldname": "production_item_info_section", + "fieldtype": "Section Break", + "label": "Production Item Info" + }, + { + "fieldname": "section_break_ouuf", + "fieldtype": "Section Break" + }, + { + "fieldname": "quality_inspection_tab", + "fieldtype": "Tab Break", + "label": "Quality Inspection" } ], "icon": "fa fa-sitemap", @@ -684,7 +713,7 @@ "image_field": "image", "is_submittable": 1, "links": [], - "modified": "2025-11-19 16:17:15.925156", + "modified": "2026-02-06 17:23:15.255301", "modified_by": "Administrator", "module": "Manufacturing", "name": "BOM", diff --git a/erpnext/manufacturing/doctype/job_card/job_card.js b/erpnext/manufacturing/doctype/job_card/job_card.js index e59b0337fa2..b392a2aa02b 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.js +++ b/erpnext/manufacturing/doctype/job_card/job_card.js @@ -627,16 +627,6 @@ frappe.ui.form.on("Job Card", { } }, - validate: function (frm) { - if ((!frm.doc.time_logs || !frm.doc.time_logs.length) && frm.doc.started_time) { - frm.trigger("reset_timer"); - } - }, - - reset_timer: function (frm) { - frm.set_value("started_time", ""); - }, - make_dashboard: function (frm) { if (frm.doc.__islocal) return; var section = ""; @@ -791,10 +781,6 @@ frappe.ui.form.on("Job Card Time Log", { frm.events.set_total_completed_qty(frm); }, - to_time: function (frm) { - frm.set_value("started_time", ""); - }, - time_in_mins(frm, cdt, cdn) { let d = locals[cdt][cdn]; if (d.time_in_mins) { diff --git a/erpnext/manufacturing/doctype/job_card/job_card.json b/erpnext/manufacturing/doctype/job_card/job_card.json index 6488a54308a..6b34eb7711a 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.json +++ b/erpnext/manufacturing/doctype/job_card/job_card.json @@ -6,15 +6,15 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ + "company", "naming_series", "work_order", "employee", - "is_subcontracted", "column_break_4", "posting_date", - "company", "project", "bom_no", + "is_subcontracted", "semi_finished_good__finished_good_section", "finished_good", "production_item", @@ -70,22 +70,24 @@ "more_information", "item_name", "requested_qty", - "status", - "operation_row_id", "is_paused", "track_semi_finished_goods", "column_break_20", + "remarks", + "section_break_dfoc", + "status", + "operation_row_id", + "amended_from", + "column_break_xhzg", "operation_row_number", "operation_id", "sequence_id", - "remarks", - "serial_and_batch_bundle", - "batch_no", + "section_break_jcmx", "serial_no", + "serial_and_batch_bundle", + "column_break_swqr", "barcode", - "started_time", - "current_time", - "amended_from", + "batch_no", "connections_tab" ], "fields": [ @@ -210,7 +212,7 @@ "collapsible": 1, "fieldname": "more_information", "fieldtype": "Tab Break", - "label": "More Information" + "label": "More Info" }, { "fieldname": "operation_id", @@ -259,16 +261,6 @@ "options": "Open\nWork In Progress\nMaterial Transferred\nOn Hold\nSubmitted\nCancelled\nCompleted", "read_only": 1 }, - { - "allow_on_submit": 1, - "fieldname": "started_time", - "fieldtype": "Datetime", - "hidden": 1, - "label": "Started Time", - "no_copy": 1, - "print_hide": 1, - "read_only": 1 - }, { "fieldname": "amended_from", "fieldtype": "Link", @@ -315,16 +307,7 @@ "fetch_if_empty": 1, "fieldname": "item_name", "fieldtype": "Read Only", - "label": "Item Name" - }, - { - "allow_on_submit": 1, - "fieldname": "current_time", - "fieldtype": "Int", - "hidden": 1, - "label": "Current Time", - "no_copy": 1, - "print_hide": 1, + "label": "Item Name", "read_only": 1 }, { @@ -466,7 +449,8 @@ "label": "Serial and Batch Bundle", "no_copy": 1, "options": "Serial and Batch Bundle", - "print_hide": 1 + "print_hide": 1, + "read_only": 1 }, { "depends_on": "process_loss_qty", @@ -621,12 +605,30 @@ "fieldname": "track_semi_finished_goods", "fieldtype": "Check", "label": "Track Semi Finished Goods" + }, + { + "fieldname": "section_break_jcmx", + "fieldtype": "Section Break", + "label": "Serial / Batch" + }, + { + "fieldname": "column_break_swqr", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_dfoc", + "fieldtype": "Section Break", + "label": "Status and Reference" + }, + { + "fieldname": "column_break_xhzg", + "fieldtype": "Column Break" } ], "grid_page_length": 50, "is_submittable": 1, "links": [], - "modified": "2025-12-22 14:20:07.817118", + "modified": "2026-02-06 18:27:03.178783", "modified_by": "Administrator", "module": "Manufacturing", "name": "Job Card", diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index f46db6e6d3a..46209c88117 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -82,7 +82,6 @@ class JobCard(Document): batch_no: DF.Link | None bom_no: DF.Link | None company: DF.Link - current_time: DF.Int employee: DF.TableMultiSelect[JobCardTimeLog] expected_end_date: DF.Datetime | None expected_start_date: DF.Datetime | None @@ -118,7 +117,6 @@ class JobCard(Document): serial_no: DF.SmallText | None skip_material_transfer: DF.Check source_warehouse: DF.Link | None - started_time: DF.Datetime | None status: DF.Literal[ "Open", "Work In Progress", diff --git a/erpnext/manufacturing/doctype/work_order/work_order.json b/erpnext/manufacturing/doctype/work_order/work_order.json index 29266ddb25b..4365a501ae3 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.json +++ b/erpnext/manufacturing/doctype/work_order/work_order.json @@ -8,29 +8,23 @@ "engine": "InnoDB", "field_order": [ "item", - "naming_series", - "status", - "production_item", - "item_name", - "image", - "bom_no", - "mps", - "subcontracting_inward_order", - "subcontracting_inward_order_item", - "sales_order", - "column_break1", "company", + "naming_series", + "production_item", + "bom_no", + "column_break1", "qty", - "project", + "sales_order", "track_semi_finished_goods", "reserve_stock", - "column_break_agjv", + "section_break_vrpa", "max_producible_qty", "material_transferred_for_manufacturing", "additional_transferred_qty", + "column_break_ezmq", "produced_qty", - "disassembled_qty", "process_loss_qty", + "disassembled_qty", "warehouses", "source_warehouse", "wip_warehouse", @@ -65,22 +59,34 @@ "column_break_24", "corrective_operation_cost", "total_operating_cost", + "more_info", + "production_item_info_section", + "image", + "item_name", + "stock_uom", + "column_break2", + "description", "serial_no_and_batch_for_finished_good_section", "has_serial_no", "has_batch_no", "column_break_18", "batch_size", - "more_info", - "description", - "stock_uom", - "column_break2", - "material_request", - "material_request_item", - "sales_order_item", + "reference_section", + "project", + "subcontracting_inward_order", "production_plan", - "production_plan_item", + "mps", + "material_request", + "column_break_xbhk", + "material_request_item", + "subcontracting_inward_order_item", + "sales_order_item", "production_plan_sub_assembly_item", + "production_plan_item", "product_bundle_item", + "section_break_ynih", + "status", + "column_break_cvuw", "amended_from", "connections_tab" ], @@ -149,6 +155,7 @@ { "fieldname": "bom_no", "fieldtype": "Link", + "in_list_view": 1, "label": "BOM No", "oldfieldname": "bom_no", "oldfieldtype": "Link", @@ -198,6 +205,7 @@ "default": "1.0", "fieldname": "qty", "fieldtype": "Float", + "in_list_view": 1, "label": "Qty To Manufacture", "oldfieldname": "qty", "oldfieldtype": "Currency", @@ -431,7 +439,8 @@ "fieldname": "material_request", "fieldtype": "Link", "label": "Material Request", - "options": "Material Request" + "options": "Material Request", + "read_only": 1 }, { "fieldname": "material_request_item", @@ -516,7 +525,7 @@ }, { "collapsible": 1, - "depends_on": "eval:!doc.__islocal", + "depends_on": "eval:!doc.__islocal && doc.track_semi_finished_goods === 0 && (doc.has_serial_no === 1 || doc.has_batch_no === 1)", "fieldname": "serial_no_and_batch_for_finished_good_section", "fieldtype": "Section Break", "label": "Finished Good Serial / Batch" @@ -624,10 +633,8 @@ "read_only": 1 }, { - "fieldname": "column_break_agjv", - "fieldtype": "Column Break" - }, - { + "default": "0", + "depends_on": "eval:doc.docstatus==1 && doc.skip_transfer==0", "fieldname": "additional_transferred_qty", "fieldtype": "Float", "label": "Additional Transferred Qty", @@ -659,6 +666,36 @@ "no_copy": 1, "non_negative": 1, "read_only": 1 + }, + { + "fieldname": "section_break_vrpa", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_ezmq", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_ynih", + "fieldtype": "Section Break" + }, + { + "fieldname": "reference_section", + "fieldtype": "Section Break", + "label": "Reference" + }, + { + "fieldname": "column_break_cvuw", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_xbhk", + "fieldtype": "Column Break" + }, + { + "fieldname": "production_item_info_section", + "fieldtype": "Section Break", + "label": "Production Item Info" } ], "grid_page_length": 50, @@ -667,7 +704,7 @@ "image_field": "image", "is_submittable": 1, "links": [], - "modified": "2025-10-12 14:24:57.699749", + "modified": "2026-02-06 17:53:11.295600", "modified_by": "Administrator", "module": "Manufacturing", "name": "Work Order", diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index aa7047d7633..8a78e0ce896 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -869,6 +869,9 @@ class WorkOrder(Document): ).run() def create_serial_no_batch_no(self): + if self.track_semi_finished_goods: + return + if not (self.has_serial_no or self.has_batch_no): return @@ -2351,7 +2354,11 @@ def set_work_order_ops(name): @frappe.whitelist() def make_stock_entry( - work_order_id, purpose, qty=None, target_warehouse=None, is_additional_transfer_entry=False + work_order_id: str, + purpose: str, + qty: float | None = None, + target_warehouse: str | None = None, + is_additional_transfer_entry: bool = False, ): work_order = frappe.get_doc("Work Order", work_order_id) if not frappe.db.get_value("Warehouse", work_order.wip_warehouse, "is_group"): @@ -2373,9 +2380,6 @@ def make_stock_entry( qty if qty is not None else (flt(work_order.qty) - flt(work_order.produced_qty)) ) - if work_order.bom_no: - stock_entry.inspection_required = frappe.db.get_value("BOM", work_order.bom_no, "inspection_required") - if purpose == "Material Transfer for Manufacture": stock_entry.to_warehouse = wip_warehouse stock_entry.project = work_order.project @@ -2387,6 +2391,10 @@ def make_stock_entry( ) stock_entry.to_warehouse = work_order.fg_warehouse stock_entry.project = work_order.project + if work_order.bom_no: + stock_entry.inspection_required = frappe.db.get_value( + "BOM", work_order.bom_no, "inspection_required" + ) if purpose == "Disassemble": stock_entry.from_warehouse = work_order.fg_warehouse diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py index 1f4621f1a34..f9427049f15 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation.py +++ b/erpnext/manufacturing/doctype/workstation/workstation.py @@ -233,7 +233,7 @@ class Workstation(Document): @frappe.whitelist() -def get_job_cards(workstation, job_card=None): +def get_job_cards(workstation: str): if frappe.has_permission("Job Card", "read"): jc_data = frappe.get_all( "Job Card", @@ -264,6 +264,7 @@ def get_job_cards(workstation, job_card=None): "status": ["not in", ["Completed", "Stopped"]], }, order_by="expected_start_date, expected_end_date", + limit=10, ) job_cards = [row.name for row in jc_data] @@ -517,7 +518,7 @@ def get_color_map(): @frappe.whitelist() -def update_job_card(job_card, method, **kwargs): +def update_job_card(job_card: str, method: str, **kwargs): if isinstance(kwargs, dict): kwargs = frappe._dict(kwargs) @@ -527,7 +528,6 @@ def update_job_card(job_card, method, **kwargs): if kwargs.qty and isinstance(kwargs.qty, str): kwargs.qty = flt(kwargs.qty) - print(method) doc = frappe.get_doc("Job Card", job_card) doc.run_method(method, **kwargs) diff --git a/erpnext/stock/doctype/pick_list/pick_list.json b/erpnext/stock/doctype/pick_list/pick_list.json index 4b46f4ecd82..9ee1b7a1922 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.json +++ b/erpnext/stock/doctype/pick_list/pick_list.json @@ -6,19 +6,18 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "naming_series", "company", + "naming_series", "purpose", "customer", - "customer_name", - "work_order", - "material_request", - "for_qty", "column_break_4", + "for_qty", "parent_warehouse", "consider_rejected_warehouses", "get_item_locations", + "section_break_cfiw", "pick_manually", + "column_break_nwpf", "ignore_pricing_rule", "section_break_6", "scan_barcode", @@ -27,14 +26,21 @@ "prompt_qty", "section_break_15", "locations", - "amended_from", + "other_info_tab", "print_settings_section", "group_same_items", "status_section", - "status", - "column_break_qyam", + "per_delivered", "delivery_status", - "per_delivered" + "column_break_refl", + "status", + "reference_section", + "work_order", + "customer_name", + "column_break_feoy", + "material_request", + "amended_from", + "connections_tab" ], "fields": [ { @@ -213,11 +219,9 @@ "label": "Ignore Pricing Rule" }, { - "collapsible": 1, "fieldname": "status_section", "fieldtype": "Section Break", - "label": "Status", - "print_hide": 1 + "label": "Status" }, { "fieldname": "delivery_status", @@ -240,13 +244,41 @@ "read_only": 1 }, { - "fieldname": "column_break_qyam", + "fieldname": "section_break_cfiw", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_nwpf", "fieldtype": "Column Break" + }, + { + "fieldname": "other_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "column_break_refl", + "fieldtype": "Column Break" + }, + { + "fieldname": "reference_section", + "fieldtype": "Section Break", + "label": "Reference" + }, + { + "fieldname": "column_break_feoy", + "fieldtype": "Column Break" + }, + { + "fieldname": "connections_tab", + "fieldtype": "Tab Break", + "label": "Connections", + "show_dashboard": 1 } ], "is_submittable": 1, "links": [], - "modified": "2025-10-03 18:36:52.282355", + "modified": "2026-02-06 18:14:18.361039", "modified_by": "Administrator", "module": "Stock", "name": "Pick List", diff --git a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py index 8900385c265..b6159d2d70c 100644 --- a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py +++ b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py @@ -1,3 +1,6 @@ +from frappe import _ + + def get_data(): return { "fieldname": "pick_list", @@ -9,6 +12,17 @@ def get_data(): "Sales Order": ["locations", "sales_order"], }, "transactions": [ - {"items": ["Stock Entry", "Sales Order", "Delivery Note", "Stock Reservation Entry"]}, + { + "label": _("Sales"), + "items": ["Sales Order", "Delivery Note"], + }, + { + "label": _("Manufacturing"), + "items": ["Stock Entry"], + }, + { + "label": _("Reference"), + "items": ["Stock Reservation Entry"], + }, ], } diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 6155d2e5f77..94b396e996a 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -156,7 +156,6 @@ frappe.ui.form.on("Stock Entry", { }; }); - frm.add_fetch("bom_no", "inspection_required", "inspection_required"); erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype); frappe.db.get_single_value("Stock Settings", "disable_serial_no_and_batch_selector").then((value) => { @@ -245,6 +244,7 @@ frappe.ui.form.on("Stock Entry", { refresh: function (frm) { frm.trigger("get_items_from_transit_entry"); + frm.trigger("toggle_warehouse_fields"); if (!frm.doc.docstatus && !frm.doc.subcontracting_inward_order) { frm.trigger("validate_purpose_consumption"); @@ -534,6 +534,7 @@ frappe.ui.form.on("Stock Entry", { frm.remove_custom_button("Bill of Materials", "Get Items From"); frm.events.show_bom_custom_button(frm); frm.trigger("add_to_transit"); + frm.trigger("toggle_warehouse_fields"); frm.fields_dict.items.grid.update_docfield_property( "basic_rate", @@ -542,6 +543,22 @@ frappe.ui.form.on("Stock Entry", { ); }, + toggle_warehouse_fields(frm) { + frm.fields_dict["items"].grid.update_docfield_property( + "s_warehouse", + "in_list_view", + !["Material Receipt", "Receive from Customer"].includes(frm.doc.purpose) + ); + + frm.fields_dict["items"].grid.update_docfield_property( + "t_warehouse", + "in_list_view", + !["Material Issue"].includes(frm.doc.purpose) + ); + + frm.fields_dict["items"].grid.reset_grid(); + }, + purpose: function (frm) { frm.trigger("validate_purpose_consumption"); frm.fields_dict.items.grid.refresh(); diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json index 23c393bbca9..7f889b04610 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.json +++ b/erpnext/stock/doctype/stock_entry/stock_entry.json @@ -8,30 +8,22 @@ "engine": "InnoDB", "field_order": [ "stock_entry_details_tab", + "company", "naming_series", "stock_entry_type", - "outgoing_stock_entry", "purpose", - "add_to_transit", - "work_order", - "job_card", - "purchase_order", - "subcontracting_order", - "subcontracting_inward_order", - "delivery_note_no", - "sales_invoice_no", - "pick_list", - "purchase_receipt_no", - "asset_repair", "col2", - "company", + "set_posting_time", "posting_date", "posting_time", - "column_break_eaoa", - "set_posting_time", - "inspection_required", + "reference_section", + "add_to_transit", "apply_putaway_rule", - "is_additional_transfer_entry", + "inspection_required", + "column_break_jabv", + "work_order", + "subcontracting_order", + "outgoing_stock_entry", "bom_info_section", "from_bom", "use_multi_level_bom", @@ -78,6 +70,17 @@ "select_print_heading", "print_settings_col_break", "letter_head", + "reference_details_section", + "delivery_note_no", + "sales_invoice_no", + "job_card", + "pick_list", + "column_break_qpvo", + "asset_repair", + "purchase_receipt_no", + "purchase_order", + "subcontracting_inward_order", + "is_additional_transfer_entry", "more_info", "is_opening", "remarks", @@ -168,7 +171,8 @@ "fieldname": "subcontracting_order", "fieldtype": "Link", "label": "Subcontracting Order", - "options": "Subcontracting Order" + "options": "Subcontracting Order", + "read_only": 1 }, { "depends_on": "eval:doc.purpose==\"Sales Return\"", @@ -180,6 +184,7 @@ "oldfieldtype": "Link", "options": "Delivery Note", "print_hide": 1, + "read_only": 1, "search_index": 1 }, { @@ -189,7 +194,8 @@ "label": "Sales Invoice No", "no_copy": 1, "options": "Sales Invoice", - "print_hide": 1 + "print_hide": 1, + "read_only": 1 }, { "depends_on": "eval:doc.purpose==\"Purchase Return\"", @@ -201,6 +207,7 @@ "oldfieldtype": "Link", "options": "Purchase Receipt", "print_hide": 1, + "read_only": 1, "search_index": 1 }, { @@ -240,13 +247,14 @@ }, { "default": "0", + "depends_on": "eval: doc.purpose === \"Manufacture\"", "fieldname": "inspection_required", "fieldtype": "Check", "label": "Inspection Required" }, { "default": "0", - "depends_on": "eval:in_list([\"Material Issue\", \"Material Transfer\", \"Manufacture\", \"Repack\", \"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\", \"Disassemble\"], doc.purpose)", + "depends_on": "eval:in_list([\"Material Issue\", \"Manufacture\", \"Repack\", \"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\", \"Disassemble\"], doc.purpose)", "fieldname": "from_bom", "fieldtype": "Check", "label": "From BOM", @@ -623,6 +631,7 @@ }, { "collapsible": 1, + "depends_on": "eval:in_list([\"Material Issue\", \"Manufacture\", \"Repack\", \"Send to Subcontractor\", \"Material Transfer for Manufacture\", \"Material Consumption for Manufacture\", \"Disassemble\"], doc.purpose)", "fieldname": "bom_info_section", "fieldtype": "Section Break", "label": "BOM Info" @@ -677,10 +686,6 @@ "fieldtype": "Section Break", "label": "Items" }, - { - "fieldname": "column_break_eaoa", - "fieldtype": "Column Break" - }, { "depends_on": "eval:doc.asset_repair", "fieldname": "asset_repair", @@ -704,9 +709,9 @@ }, { "default": "0", - "depends_on": "eval:doc.purpose == \"Material Transfer for Manufacture\"", "fieldname": "is_additional_transfer_entry", "fieldtype": "Check", + "hidden": 1, "label": "Is Additional Transfer Entry", "read_only": 1 }, @@ -717,6 +722,23 @@ "label": "Subcontracting Inward Order", "options": "Subcontracting Inward Order", "read_only": 1 + }, + { + "fieldname": "reference_section", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_jabv", + "fieldtype": "Column Break" + }, + { + "fieldname": "reference_details_section", + "fieldtype": "Section Break", + "label": "Reference" + }, + { + "fieldname": "column_break_qpvo", + "fieldtype": "Column Break" } ], "grid_page_length": 50, @@ -725,7 +747,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-10-13 15:09:23.905118", + "modified": "2026-02-06 19:26:59.518312", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry", From 3eb838a6a27922b5e1af10bf2b518d35860163ea Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 8 Feb 2026 20:36:24 +0530 Subject: [PATCH 31/78] refactor: supplier form cleanup (cherry picked from commit bd521d908991dd83f7a00b72708a95ec39c61219) # Conflicts: # erpnext/buying/doctype/supplier/supplier.json --- erpnext/buying/doctype/supplier/supplier.js | 14 ++-- erpnext/buying/doctype/supplier/supplier.json | 65 ++++++++++++++----- erpnext/buying/doctype/supplier/supplier.py | 2 - 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js index fb4ef867ade..3f5d8dbca04 100644 --- a/erpnext/buying/doctype/supplier/supplier.js +++ b/erpnext/buying/doctype/supplier/supplier.js @@ -73,6 +73,12 @@ frappe.ui.form.on("Supplier", { }; }, + supplier_group(frm) { + if (frm.doc.supplier_group) { + frm.trigger("get_supplier_group_details"); + } + }, + refresh: function (frm) { if (frappe.defaults.get_default("supp_master_name") != "Naming Series") { frm.toggle_display("naming_series", false); @@ -111,14 +117,6 @@ frappe.ui.form.on("Supplier", { __("View") ); - frm.add_custom_button( - __("Get Supplier Group Details"), - function () { - frm.trigger("get_supplier_group_details"); - }, - __("Actions") - ); - if ( cint(frappe.defaults.get_default("enable_common_party_accounting")) && frappe.model.can_create("Party Link") diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 78b797d4c2b..7af2652472e 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -11,8 +11,14 @@ "engine": "InnoDB", "field_order": [ "naming_series", +<<<<<<< HEAD "supplier_name", "country", +======= + "supplier_type", + "supplier_name", + "gender", +>>>>>>> bd521d9089 (refactor: supplier form cleanup) "column_break0", "supplier_group", "supplier_type", @@ -23,24 +29,12 @@ "default_bank_account", "column_break_10", "default_price_list", - "internal_supplier_section", - "is_internal_supplier", - "represents_company", - "column_break_16", - "companies", "column_break2", "supplier_details", "column_break_30", "website", "language", "customer_numbers", - "dashboard_tab", - "tax_tab", - "tax_id", - "tax_category", - "column_break_27", - "tax_withholding_category", - "tax_withholding_group", "contact_and_address_tab", "address_contacts", "address_html", @@ -54,19 +48,35 @@ "supplier_primary_contact", "mobile_no", "email_id", + "tax_tab", + "tax_id", + "tax_category", + "column_break_27", + "tax_withholding_category", + "tax_withholding_group", "accounting_tab", "payment_terms", "default_accounts_section", "accounts", + "internal_supplier_section", + "is_internal_supplier", + "represents_company", + "column_break_16", + "companies", "settings_tab", "allow_purchase_invoice_creation_without_purchase_order", "allow_purchase_invoice_creation_without_purchase_receipt", "column_break_54", "is_frozen", +<<<<<<< HEAD "disabled", +======= + "rfq_and_purchase_order_settings_section", +>>>>>>> bd521d9089 (refactor: supplier form cleanup) "warn_rfqs", - "warn_pos", "prevent_rfqs", + "column_break_oxjw", + "warn_pos", "prevent_pos", "block_supplier_section", "on_hold", @@ -75,7 +85,11 @@ "release_date", "portal_users_tab", "portal_users", +<<<<<<< HEAD "column_break_1mqv" +======= + "dashboard_tab" +>>>>>>> bd521d9089 (refactor: supplier form cleanup) ], "fields": [ { @@ -398,7 +412,7 @@ { "fieldname": "dashboard_tab", "fieldtype": "Tab Break", - "label": "Dashboard", + "label": "Connections", "show_dashboard": 1 }, { @@ -430,7 +444,7 @@ "collapsible": 1, "fieldname": "internal_supplier_section", "fieldtype": "Section Break", - "label": "Internal Supplier" + "label": "Internal Supplier Accounting" }, { "fieldname": "column_break_16", @@ -488,6 +502,25 @@ "fieldtype": "Link", "label": "Tax Withholding Group", "options": "Tax Withholding Group" +<<<<<<< HEAD +======= + }, + { + "depends_on": "eval:doc.supplier_type == 'Individual'", + "fieldname": "gender", + "fieldtype": "Link", + "label": "Gender", + "options": "Gender" + }, + { + "fieldname": "rfq_and_purchase_order_settings_section", + "fieldtype": "Section Break", + "label": "RFQ and Purchase Order Settings" + }, + { + "fieldname": "column_break_oxjw", + "fieldtype": "Column Break" +>>>>>>> bd521d9089 (refactor: supplier form cleanup) } ], "grid_page_length": 50, @@ -501,7 +534,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-06 12:58:01.398824", + "modified": "2026-02-08 20:28:01.101808", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index 543b3726089..cce408b264d 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -161,8 +161,6 @@ class Supplier(TransactionBase): if doc.payment_terms: self.payment_terms = doc.payment_terms - self.save() - def validate_internal_supplier(self): if not self.is_internal_supplier: self.represents_company = "" From 5e31eb3d7715734772faa8a65a0d59a0dcc56547 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Feb 2026 10:58:12 +0530 Subject: [PATCH 32/78] chore: fix conflicts --- .../accounts/doctype/purchase_invoice/purchase_invoice.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index c02acf7b5b8..e51af9ae11c 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1689,11 +1689,7 @@ "idx": 204, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-02-05 20:45:16.964500", -======= - "modified": "2026-02-04 16:32:19.664287", ->>>>>>> f3ea1863ae (refactor: Cleanup buying module forms) + "modified": "2026-02-05 21:45:16.964500", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", From 7a680e6070e8620bbfc1448806fa8ec1b3b97599 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Feb 2026 11:05:07 +0530 Subject: [PATCH 33/78] chore: fix conflicts Refactored supplier form by reorganizing field order and removing unnecessary fields. --- erpnext/buying/doctype/supplier/supplier.json | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 7af2652472e..37fabcf2607 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -11,16 +11,12 @@ "engine": "InnoDB", "field_order": [ "naming_series", -<<<<<<< HEAD - "supplier_name", - "country", -======= "supplier_type", "supplier_name", "gender", ->>>>>>> bd521d9089 (refactor: supplier form cleanup) "column_break0", "supplier_group", + "country", "supplier_type", "is_transporter", "image", @@ -68,11 +64,8 @@ "allow_purchase_invoice_creation_without_purchase_receipt", "column_break_54", "is_frozen", -<<<<<<< HEAD "disabled", -======= "rfq_and_purchase_order_settings_section", ->>>>>>> bd521d9089 (refactor: supplier form cleanup) "warn_rfqs", "prevent_rfqs", "column_break_oxjw", @@ -85,11 +78,7 @@ "release_date", "portal_users_tab", "portal_users", -<<<<<<< HEAD - "column_break_1mqv" -======= "dashboard_tab" ->>>>>>> bd521d9089 (refactor: supplier form cleanup) ], "fields": [ { @@ -502,8 +491,6 @@ "fieldtype": "Link", "label": "Tax Withholding Group", "options": "Tax Withholding Group" -<<<<<<< HEAD -======= }, { "depends_on": "eval:doc.supplier_type == 'Individual'", @@ -520,7 +507,6 @@ { "fieldname": "column_break_oxjw", "fieldtype": "Column Break" ->>>>>>> bd521d9089 (refactor: supplier form cleanup) } ], "grid_page_length": 50, @@ -534,7 +520,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-08 20:28:01.101808", + "modified": "2026-02-08 21:28:01.101808", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", From 9a2eb91eec67e8cda610f25a341a841068f4ee5e Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Feb 2026 11:24:13 +0530 Subject: [PATCH 34/78] fix: supplier_type appears multiple times --- erpnext/buying/doctype/supplier/supplier.json | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 37fabcf2607..c020779b3d7 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -11,7 +11,6 @@ "engine": "InnoDB", "field_order": [ "naming_series", - "supplier_type", "supplier_name", "gender", "column_break0", From 8cd12e37cd19e455d20e22bbf892eecd51eaccfb Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Feb 2026 11:26:31 +0530 Subject: [PATCH 35/78] chore: fix conflicts --- erpnext/buying/doctype/supplier/supplier.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index c020779b3d7..94b3c8fe952 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -11,12 +11,12 @@ "engine": "InnoDB", "field_order": [ "naming_series", + "supplier_type", "supplier_name", "gender", "column_break0", "supplier_group", "country", - "supplier_type", "is_transporter", "image", "defaults_section", From 4b0d2558d70ec7cfacca751ac5223821c5c55047 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 23 Feb 2026 11:30:53 +0530 Subject: [PATCH 36/78] chore: fix conflicts Refactor purchase order JSON structure by cleaning up field order and removing unnecessary fields. --- .../purchase_order/purchase_order.json | 73 ++++++++++--------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 9ae92f9dea2..f528e07391d 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -9,26 +9,20 @@ "engine": "InnoDB", "field_order": [ "supplier_section", - "company", "title", "naming_series", + "supplier", + "supplier_name", "order_confirmation_no", "order_confirmation_date", - "get_items_from_open_material_requests", - "mps", "column_break_7", "transaction_date", "schedule_date", "column_break1", -<<<<<<< HEAD - "supplier", -======= ->>>>>>> bf20ecca60 (refactor: form cleanup for stock and manufacturing doctypes) + "company", "is_subcontracted", - "supplier_name", "has_unit_price_items", "supplier_warehouse", - "amended_from", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -82,16 +76,19 @@ "taxes_and_charges_deducted", "total_taxes_and_charges", "totals_section", + "grand_total", + "disable_rounded_total", + "rounding_adjustment", + "column_break4", + "in_words", + "rounded_total", + "base_totals_section", "base_grand_total", "base_rounding_adjustment", + "column_break_jkoz", "base_in_words", "base_rounded_total", - "column_break4", - "grand_total", - "rounding_adjustment", - "rounded_total", - "disable_rounded_total", - "in_words", + "section_break_tnkm", "advance_paid", "discount_section", "apply_discount_on", @@ -157,11 +154,13 @@ "auto_repeat", "update_auto_repeat_reference", "additional_info_section", - "is_internal_supplier", + "party_account_currency", "represents_company", "ref_sq", + "amended_from", "column_break_74", - "party_account_currency", + "mps", + "is_internal_supplier", "inter_company_order_reference", "is_old_subcontracting_flow", "connections_tab" @@ -209,13 +208,6 @@ "reqd": 1, "search_index": 1 }, - { - "depends_on": "eval:doc.supplier && doc.docstatus===0 && (!(doc.items && doc.items.length) || (doc.items.length==1 && !doc.items[0].item_code))", - "description": "Fetch items based on Default Supplier.", - "fieldname": "get_items_from_open_material_requests", - "fieldtype": "Button", - "label": "Get Items from Open Material Requests" - }, { "bold": 1, "fetch_from": "supplier.supplier_name", @@ -776,7 +768,7 @@ { "fieldname": "base_grand_total", "fieldtype": "Currency", - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "no_copy": 1, "oldfieldname": "grand_total", "oldfieldtype": "Currency", @@ -788,7 +780,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounding_adjustment", "fieldtype": "Currency", - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -797,7 +789,7 @@ { "fieldname": "base_in_words", "fieldtype": "Data", - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -807,7 +799,7 @@ { "fieldname": "base_rounded_total", "fieldtype": "Currency", - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -865,7 +857,7 @@ { "fieldname": "advance_paid", "fieldtype": "Currency", - "label": "Advance Paid", + "label": "Advance Paid (Company Currency)", "no_copy": 1, "options": "party_account_currency", "print_hide": 1, @@ -1304,8 +1296,21 @@ "hidden": 1, "label": "Item Wise Tax Details", "no_copy": 1, - "options": "Item Wise Tax Detail", - "print_hide": 1 + "options": "Item Wise Tax Detail" + }, + { + "fieldname": "column_break_jkoz", + "fieldtype": "Column Break" + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)", + "options": "Company:company:default_currency" + }, + { + "fieldname": "section_break_tnkm", + "fieldtype": "Section Break" } ], "grid_page_length": 50, @@ -1313,11 +1318,7 @@ "idx": 105, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-02-03 14:44:55.192192", -======= - "modified": "2026-02-06 17:07:24.249692", ->>>>>>> bf20ecca60 (refactor: form cleanup for stock and manufacturing doctypes) + "modified": "2026-02-04 13:01:36.628472", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", From d1c142cce85513dcfb8b2a300e3649c39a562c7e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 6 Feb 2026 16:24:53 +0530 Subject: [PATCH 37/78] refactor: form cleanup for sales order (cherry picked from commit 93d1716eb53d5a2817a80407cdc4a26674fd9148) --- .../doctype/sales_order/sales_order.json | 107 ++++++++++-------- 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 609b093bae3..c94fe377512 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -13,16 +13,14 @@ "column_break0", "company", "naming_series", - "order_type", + "customer", + "customer_name", "column_break_7", + "order_type", "transaction_date", "delivery_date", "column_break1", - "customer", - "customer_name", "tax_id", - "po_no", - "po_date", "skip_delivery_note", "has_unit_price_items", "is_subcontracted", @@ -70,19 +68,22 @@ "base_total_taxes_and_charges", "column_break_46", "total_taxes_and_charges", - "totals", - "base_grand_total", - "base_rounding_adjustment", - "base_rounded_total", - "base_in_words", - "column_break3", + "totals_section", "grand_total", - "rounding_adjustment", - "rounded_total", "in_words", - "advance_paid", "disable_rounded_total", - "section_break_48", + "column_break_nuxg", + "rounded_total", + "rounding_adjustment", + "base_totals_section", + "base_grand_total", + "base_in_words", + "column_break_bgfw", + "base_rounded_total", + "base_rounding_adjustment", + "section_break_efew", + "advance_paid", + "additional_discount_section", "apply_discount_on", "base_discount_amount", "coupon_code", @@ -162,6 +163,8 @@ "language", "additional_info_section", "is_internal_customer", + "po_no", + "po_date", "represents_company", "column_break_yvzv", "utm_source", @@ -842,14 +845,6 @@ "print_hide": 1, "read_only": 1 }, - { - "collapsible": 1, - "fieldname": "section_break_48", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Additional Discount" - }, { "fieldname": "coupon_code", "fieldtype": "Link", @@ -873,7 +868,7 @@ "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Additional Discount Amount (Company Currency)", + "label": "Additional Discount Amount", "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1 @@ -901,22 +896,12 @@ "options": "currency", "print_hide": 1 }, - { - "fieldname": "totals", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Totals", - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "print_hide": 1 - }, { "fieldname": "base_grand_total", "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -930,7 +915,7 @@ "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -942,7 +927,7 @@ "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -956,7 +941,7 @@ "fieldtype": "Data", "hide_days": 1, "hide_seconds": 1, - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -964,15 +949,6 @@ "read_only": 1, "width": "200px" }, - { - "fieldname": "column_break3", - "fieldtype": "Column Break", - "hide_days": 1, - "hide_seconds": 1, - "oldfieldtype": "Column Break", - "print_hide": 1, - "width": "50%" - }, { "fieldname": "grand_total", "fieldtype": "Currency", @@ -1706,6 +1682,41 @@ "no_copy": 1, "options": "Item Wise Tax Detail", "print_hide": 1 + }, + { + "fieldname": "totals_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Totals", + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "print_hide": 1 + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)" + }, + { + "fieldname": "column_break_nuxg", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_bgfw", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_efew", + "fieldtype": "Section Break" + }, + { + "collapsible": 1, + "fieldname": "additional_discount_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Additional Discount" } ], "grid_page_length": 50, @@ -1713,7 +1724,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-02-06 11:06:16.092658", + "modified": "2026-02-06 15:35:47.502692", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From 90e61abff44da5ac94903a123ab65c770a236626 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 23 Feb 2026 12:31:04 +0530 Subject: [PATCH 38/78] fix: use stock qty instead of qty when updating transferred qty in WO (cherry picked from commit 8e14249335af066ee8d4fd38d81a448f2dcc9f7a) --- erpnext/manufacturing/doctype/work_order/work_order.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 8a78e0ce896..f61247a9564 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -1543,6 +1543,7 @@ class WorkOrder(Document): "operation": item.operation or operation, "item_code": item.item_code, "item_name": item.item_name, + "stock_uom": item.stock_uom, "description": item.description, "allow_alternative_item": item.allow_alternative_item, "required_qty": item.qty, @@ -1580,7 +1581,7 @@ class WorkOrder(Document): .select( ste_child.item_code, ste_child.original_item, - fn.Sum(ste_child.qty).as_("qty"), + fn.Sum(ste_child.transfer_qty).as_("qty"), ) .where( (ste.docstatus == 1) @@ -1653,7 +1654,7 @@ class WorkOrder(Document): .select( ste_child.item_code, ste_child.original_item, - fn.Sum(ste_child.qty).as_("qty"), + fn.Sum(ste_child.transfer_qty).as_("qty"), ) .where( (ste.docstatus == 1) @@ -2163,7 +2164,7 @@ def get_consumed_qty(work_order, item_code): frappe.qb.from_(stock_entry) .inner_join(stock_entry_detail) .on(stock_entry_detail.parent == stock_entry.name) - .select(fn.Sum(stock_entry_detail.qty).as_("qty")) + .select(fn.Sum(stock_entry_detail.transfer_qty).as_("qty")) .where( (stock_entry.work_order == work_order) & (stock_entry.purpose.isin(["Manufacture", "Material Consumption for Manufacture"])) From d0c2cc848c11d2800ed6bf3cf892263ca2904595 Mon Sep 17 00:00:00 2001 From: mahsem <137205921+mahsem@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:34:30 +0100 Subject: [PATCH 39/78] fix: typo (cherry picked from commit 2b72aab6711e1ac45fd8b61270678479b553381e) --- erpnext/workspace_sidebar/payments.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/workspace_sidebar/payments.json b/erpnext/workspace_sidebar/payments.json index faaf3b589c2..4f3fc47dc77 100644 --- a/erpnext/workspace_sidebar/payments.json +++ b/erpnext/workspace_sidebar/payments.json @@ -78,7 +78,7 @@ "collapsible": 1, "indent": 0, "keep_closed": 0, - "label": "Payment Reconciliaition", + "label": "Payment Reconciliation", "link_to": "Payment Reconciliation", "link_type": "DocType", "show_arrow": 0, From c4ba3c9c4b788b0e009e4bf3dab9208f90ec8d2e Mon Sep 17 00:00:00 2001 From: Pandiyan37 Date: Mon, 23 Feb 2026 13:25:18 +0530 Subject: [PATCH 40/78] fix(work_order): update returned qty (cherry picked from commit b7f45e6963c9fd9d62549fdff0af00547ae83d33) --- erpnext/manufacturing/doctype/work_order/work_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index f61247a9564..394dee15e7a 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -557,7 +557,7 @@ class WorkOrder(Document): if status != self.status: self.db_set("status", status) - self.update_required_items() + self.update_required_items() return status or self.status From 74a3965a12b61761739c96d12f103959fd0b6e87 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Mon, 23 Feb 2026 15:44:59 +0530 Subject: [PATCH 41/78] fix: update modified timestamp in json --- erpnext/workspace_sidebar/payments.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/workspace_sidebar/payments.json b/erpnext/workspace_sidebar/payments.json index 4f3fc47dc77..587eb6aef20 100644 --- a/erpnext/workspace_sidebar/payments.json +++ b/erpnext/workspace_sidebar/payments.json @@ -195,7 +195,7 @@ "type": "Link" } ], - "modified": "2026-01-26 21:25:37.877020", + "modified": "2026-02-23 15:38:05.061694", "modified_by": "Administrator", "module": "Accounts", "name": "Payments", From e6f7a7e979fffd5c24b1be4076a393efdf84c1ef Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 10:21:06 +0000 Subject: [PATCH 42/78] fix: avoid duplicate taxes and charges rows in payment entry (backport #52178) (#52319) Co-authored-by: Dharanidharan S fix: avoid duplicate taxes and charges rows in payment entry (#52178) --- .../doctype/payment_entry/payment_entry.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index c3743c6e1f0..15ec96a5e9c 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1450,16 +1450,15 @@ frappe.ui.form.on("Payment Entry", { callback: function (r) { if (!r.exc && r.message) { // set taxes table - if (r.message) { - for (let tax of r.message) { - if (tax.charge_type === "On Net Total") { - tax.charge_type = "On Paid Amount"; - } - frm.add_child("taxes", tax); + let taxes = r.message; + taxes.forEach((tax) => { + if (tax.charge_type === "On Net Total") { + tax.charge_type = "On Paid Amount"; } - frm.events.apply_taxes(frm); - frm.events.set_unallocated_amount(frm); - } + }); + frm.set_value("taxes", taxes); + frm.events.apply_taxes(frm); + frm.events.set_unallocated_amount(frm); } }, }); From 84373550721bf7ef2ebb5cbf5f7f9e1810b9a691 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:54:54 +0530 Subject: [PATCH 43/78] Merge pull request #52876 from frappe/mergify/bp/version-16-hotfix/pr-52399 refactor: Better organizing of the fields in various doctypes (backport #52399) --- .../accounts_settings/accounts_settings.json | 55 ++++++- .../accounts_settings/accounts_settings.py | 70 +++++++++ .../doctype/sales_invoice/sales_invoice.json | 144 ++++++++++-------- erpnext/buying/doctype/supplier/supplier.json | 8 +- erpnext/buying/doctype/supplier/supplier.py | 1 + .../selling/doctype/customer/customer.json | 139 +++++++++-------- erpnext/selling/doctype/customer/customer.py | 1 - .../selling_settings/selling_settings.json | 10 +- .../selling_settings/selling_settings.py | 20 +++ 9 files changed, 308 insertions(+), 140 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 0c7d78b4cfc..874da99bdbf 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -20,6 +20,10 @@ "enable_common_party_accounting", "allow_multi_currency_invoices_against_single_party_account", "confirm_before_resetting_posting_date", + "analytics_section", + "enable_accounting_dimensions", + "column_break_vtnr", + "enable_discounts_and_margin", "journals_section", "merge_similar_account_heads", "deferred_accounting_settings_section", @@ -51,12 +55,16 @@ "allow_pegged_currencies_exchange_rates", "column_break_yuug", "stale_days", + "payments_tab", "section_break_jpd0", "auto_reconcile_payments", "auto_reconciliation_job_trigger", "reconciliation_queue_size", "column_break_resa", "exchange_gain_loss_posting_date", + "payment_options_section", + "enable_loyalty_point_program", + "column_break_ctam", "invoicing_settings_tab", "accounts_transactions_settings_section", "over_billing_allowance", @@ -281,7 +289,7 @@ }, { "default": "0", - "description": "Learn about Common Party", + "description": "Learn about Common Party", "fieldname": "enable_common_party_accounting", "fieldtype": "Check", "label": "Enable Common Party Accounting" @@ -637,6 +645,49 @@ "fieldname": "budget_section", "fieldtype": "Section Break", "label": "Budget" + }, + { + "fieldname": "analytics_section", + "fieldtype": "Section Break", + "label": "Analytical Accounting" + }, + { + "fieldname": "column_break_vtnr", + "fieldtype": "Column Break" + }, + { + "default": "0", + "description": "Apply discounts and margins on products", + "fieldname": "enable_discounts_and_margin", + "fieldtype": "Check", + "label": "Enable Discounts and Margin" + }, + { + "fieldname": "payments_tab", + "fieldtype": "Tab Break", + "label": "Payments" + }, + { + "fieldname": "payment_options_section", + "fieldtype": "Section Break", + "label": "Payment Options" + }, + { + "default": "0", + "fieldname": "enable_loyalty_point_program", + "fieldtype": "Check", + "label": "Enable Loyalty Point Program" + }, + { + "fieldname": "column_break_ctam", + "fieldtype": "Column Break" + }, + { + "default": "0", + "description": "Enable cost center, projects and other custom accounting dimensions", + "fieldname": "enable_accounting_dimensions", + "fieldtype": "Check", + "label": "Enable Accounting Dimensions" } ], "grid_page_length": 50, @@ -646,7 +697,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-11 18:30:45.968531", + "modified": "2026-02-04 17:15:38.609327", "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 dbe86f6d7b2..e75b8ad1710 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -12,6 +12,28 @@ from frappe.utils import cint from erpnext.accounts.utils import sync_auto_reconcile_config +SELLING_DOCTYPES = [ + "Sales Invoice", + "Sales Order", + "Delivery Note", + "Quotation", + "Sales Invoice Item", + "Sales Order Item", + "Delivery Note Item", + "Quotation Item", + "POS Invoice", + "POS Invoice Item", +] + +BUYING_DOCTYPES = [ + "Purchase Invoice", + "Purchase Order", + "Purchase Receipt", + "Purchase Invoice Item", + "Purchase Order Item", + "Purchase Receipt Item", +] + class AccountsSettings(Document): # begin: auto-generated types @@ -43,9 +65,12 @@ class AccountsSettings(Document): default_ageing_range: DF.Data | None delete_linked_ledger_entries: DF.Check determine_address_tax_category_from: DF.Literal["Billing Address", "Shipping Address"] + enable_accounting_dimensions: DF.Check enable_common_party_accounting: DF.Check + enable_discounts_and_margin: DF.Check enable_fuzzy_matching: DF.Check enable_immutable_ledger: DF.Check + enable_loyalty_point_program: DF.Check enable_party_matching: DF.Check exchange_gain_loss_posting_date: DF.Literal["Invoice", "Payment", "Reconciliation Date"] fetch_valuation_rate_for_internal_transaction: DF.Check @@ -98,6 +123,18 @@ class AccountsSettings(Document): if old_doc.show_payment_schedule_in_print != self.show_payment_schedule_in_print: self.enable_payment_schedule_in_print() + if old_doc.enable_accounting_dimensions != self.enable_accounting_dimensions: + toggle_accounting_dimension_sections(not self.enable_accounting_dimensions) + clear_cache = True + + if old_doc.enable_discounts_and_margin != self.enable_discounts_and_margin: + toggle_sales_discount_section(not self.enable_discounts_and_margin) + clear_cache = True + + if old_doc.enable_loyalty_point_program != self.enable_loyalty_point_program: + toggle_loyalty_point_program_section(not self.enable_loyalty_point_program) + clear_cache = True + if clear_cache: frappe.clear_cache() @@ -154,3 +191,36 @@ class AccountsSettings(Document): 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") + for doctype in accounting_dimension_doctypes: + create_property_setter_for_hiding_field(doctype, "accounting_dimensions_section", hide) + + +def toggle_sales_discount_section(hide): + for doctype in SELLING_DOCTYPES + BUYING_DOCTYPES: + meta = frappe.get_meta(doctype) + if meta.has_field("additional_discount_section"): + create_property_setter_for_hiding_field(doctype, "additional_discount_section", hide) + if meta.has_field("discount_and_margin"): + create_property_setter_for_hiding_field(doctype, "discount_and_margin", hide) + + +def toggle_loyalty_point_program_section(hide): + for doctype in SELLING_DOCTYPES: + meta = frappe.get_meta(doctype) + if meta.has_field("loyalty_points_redemption"): + create_property_setter_for_hiding_field(doctype, "loyalty_points_redemption", hide) + + +def create_property_setter_for_hiding_field(doctype, field_name, hide): + make_property_setter( + doctype, + field_name, + "hidden", + hide, + "Check", + validate_fields_for_doctype=False, + ) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index b668e13e36c..e92aab3232d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -77,34 +77,36 @@ "base_total_taxes_and_charges", "column_break_47", "total_taxes_and_charges", - "totals", - "base_grand_total", - "base_rounding_adjustment", - "base_rounded_total", - "base_in_words", - "column_break5", + "totals_section", "grand_total", "rounding_adjustment", - "use_company_roundoff_cost_center", - "rounded_total", "in_words", + "column_break5", + "rounded_total", + "disable_rounded_total", "total_advance", "outstanding_amount", - "disable_rounded_total", + "use_company_roundoff_cost_center", + "base_totals_section", + "base_grand_total", + "base_rounding_adjustment", + "base_in_words", + "column_break_xjag", + "base_rounded_total", "section_tax_withholding_entry", "tax_withholding_group", "ignore_tax_withholding_threshold", "override_tax_withholding_entries", "tax_withholding_entries", - "section_break_49", + "additional_discount_section", "apply_discount_on", "base_discount_amount", "coupon_code", - "is_cash_or_non_trade_discount", - "additional_discount_account", "column_break_51", "additional_discount_percentage", "discount_amount", + "is_cash_or_non_trade_discount", + "additional_discount_account", "sec_tax_breakup", "other_charges_calculation", "item_wise_tax_details", @@ -194,13 +196,13 @@ "column_break8", "unrealized_profit_loss_account", "against_income_account", - "sales_team_section_break", + "commission_section", "sales_partner", "amount_eligible_for_commission", "column_break10", "commission_rate", "total_commission", - "section_break2", + "sales_team_section", "sales_team", "edit_printing_settings", "letter_head", @@ -217,8 +219,7 @@ "update_auto_repeat_reference", "more_information", "status", - "inter_company_invoice_reference", - "represents_company", + "remarks", "customer_group", "column_break_imbx", "utm_source", @@ -227,8 +228,9 @@ "utm_content", "col_break23", "is_internal_customer", + "represents_company", + "inter_company_invoice_reference", "is_discounted", - "remarks", "connections_tab" ], "fields": [ @@ -794,7 +796,8 @@ "hide_seconds": 1, "label": "Time Sheets", "options": "Sales Invoice Timesheet", - "print_hide": 1 + "print_hide": 1, + "read_only": 1 }, { "default": "0", @@ -1073,14 +1076,6 @@ "no_copy": 1, "options": "Cost Center" }, - { - "collapsible": 1, - "fieldname": "section_break_49", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Additional Discount" - }, { "default": "Grand Total", "fieldname": "apply_discount_on", @@ -1125,22 +1120,12 @@ "options": "currency", "print_hide": 1 }, - { - "fieldname": "totals", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Totals", - "oldfieldtype": "Section Break", - "options": "fa fa-money", - "print_hide": 1 - }, { "fieldname": "base_grand_total", "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Grand Total (Company Currency)", + "label": "Grand Total (Company Currency", "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -1154,9 +1139,8 @@ "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, - "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1 }, @@ -1166,10 +1150,9 @@ "fieldtype": "Currency", "hide_days": 1, "hide_seconds": 1, - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1 }, @@ -1179,7 +1162,7 @@ "fieldtype": "Small Text", "hide_days": 1, "hide_seconds": 1, - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -1272,7 +1255,6 @@ "read_only": 1 }, { - "collapsible": 1, "collapsible_depends_on": "advances", "fieldname": "advances_section", "fieldtype": "Section Break", @@ -1706,10 +1688,10 @@ "read_only": 1 }, { - "allow_on_submit": 1, "default": "No", "fieldname": "is_opening", "fieldtype": "Select", + "hidden": 1, "hide_days": 1, "hide_seconds": 1, "label": "Is Opening Entry", @@ -1738,18 +1720,6 @@ "oldfieldtype": "Text", "print_hide": 1 }, - { - "collapsible": 1, - "collapsible_depends_on": "sales_partner", - "fieldname": "sales_team_section_break", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Commission", - "oldfieldtype": "Section Break", - "options": "fa fa-group", - "print_hide": 1 - }, { "fieldname": "sales_partner", "fieldtype": "Link", @@ -1793,16 +1763,6 @@ "options": "Company:company:default_currency", "print_hide": 1 }, - { - "collapsible": 1, - "collapsible_depends_on": "sales_team", - "fieldname": "section_break2", - "fieldtype": "Section Break", - "hide_days": 1, - "hide_seconds": 1, - "label": "Sales Team", - "print_hide": 1 - }, { "allow_on_submit": 1, "fieldname": "sales_team", @@ -2293,6 +2253,56 @@ "fieldname": "override_tax_withholding_entries", "fieldtype": "Check", "label": "Edit Tax Withholding Entries" + }, + { + "fieldname": "totals_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Totals", + "oldfieldtype": "Section Break", + "options": "fa fa-money", + "print_hide": 1 + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)", + "options": "Company:company:default_currency" + }, + { + "fieldname": "column_break_xjag", + "fieldtype": "Column Break" + }, + { + "collapsible": 1, + "fieldname": "additional_discount_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Additional Discount" + }, + { + "collapsible": 1, + "collapsible_depends_on": "sales_team", + "fieldname": "sales_team_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Sales Team", + "print_hide": 1 + }, + { + "collapsible": 1, + "collapsible_depends_on": "sales_partner", + "fieldname": "commission_section", + "fieldtype": "Section Break", + "hide_days": 1, + "hide_seconds": 1, + "label": "Commission", + "oldfieldtype": "Section Break", + "options": "fa fa-group", + "print_hide": 1 } ], "grid_page_length": 50, @@ -2306,7 +2316,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-02-06 20:43:44.732805", + "modified": "2026-02-15 20:43:44.732805", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 94b3c8fe952..43dbbdd7b96 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -62,9 +62,9 @@ "allow_purchase_invoice_creation_without_purchase_order", "allow_purchase_invoice_creation_without_purchase_receipt", "column_break_54", - "is_frozen", "disabled", "rfq_and_purchase_order_settings_section", + "is_frozen", "warn_rfqs", "prevent_rfqs", "column_break_oxjw", @@ -471,10 +471,6 @@ "label": "Supplier Portal Users", "options": "Portal User" }, - { - "fieldname": "column_break_1mqv", - "fieldtype": "Column Break" - }, { "fieldname": "column_break_mglr", "fieldtype": "Column Break" @@ -519,7 +515,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-08 21:28:01.101808", + "modified": "2026-02-10 21:28:01.101808", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py index cce408b264d..6a7332411d0 100644 --- a/erpnext/buying/doctype/supplier/supplier.py +++ b/erpnext/buying/doctype/supplier/supplier.py @@ -49,6 +49,7 @@ class Supplier(TransactionBase): default_price_list: DF.Link | None disabled: DF.Check email_id: DF.ReadOnly | None + gender: DF.Link | None hold_type: DF.Literal["", "All", "Invoices", "Payments"] image: DF.AttachImage | None is_frozen: DF.Check diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index babd09a5591..360f5861d7b 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -12,38 +12,18 @@ "field_order": [ "basic_info", "naming_series", - "salutation", - "customer_name", "customer_type", - "customer_group", - "column_break0", - "territory", + "customer_name", "gender", - "lead_name", - "opportunity_name", - "prospect_name", - "account_manager", + "column_break0", + "customer_group", + "territory", "image", "defaults_tab", "default_currency", "default_bank_account", "column_break_14", "default_price_list", - "internal_customer_section", - "is_internal_customer", - "represents_company", - "column_break_70", - "companies", - "more_info", - "market_segment", - "industry", - "customer_pos_id", - "website", - "language", - "column_break_45", - "customer_details", - "supplier_numbers", - "dashboard_tab", "contact_and_address_tab", "address_contacts", "address_html", @@ -67,16 +47,22 @@ "tax_withholding_category", "tax_withholding_group", "accounting_tab", + "default_receivable_accounts", + "accounts", "credit_limit_section", "payment_terms", "credit_limits", - "default_receivable_accounts", - "accounts", + "internal_customer_section", + "is_internal_customer", + "represents_company", + "column_break_70", + "companies", "loyalty_points_tab", "loyalty_program", "column_break_54", "loyalty_program_tier", "sales_team_tab", + "account_manager", "sales_team", "sales_team_section", "default_sales_partner", @@ -86,10 +72,27 @@ "so_required", "dn_required", "column_break_53", - "is_frozen", "disabled", + "is_frozen", "portal_users_tab", - "portal_users" + "portal_users", + "more_info_tab", + "references_section", + "lead_name", + "opportunity_name", + "column_break_wlbg", + "prospect_name", + "section_break_objq", + "market_segment", + "industry", + "website", + "language", + "customer_pos_id", + "column_break_hdmn", + "customer_details", + "supplier_numbers_section", + "supplier_numbers", + "connections_tab" ], "fields": [ { @@ -106,13 +109,6 @@ "options": "CUST-.YYYY.-", "set_only_once": 1 }, - { - "depends_on": "eval:doc.customer_type!='Company'", - "fieldname": "salutation", - "fieldtype": "Link", - "label": "Salutation", - "options": "Salutation" - }, { "bold": 1, "fieldname": "customer_name", @@ -126,7 +122,7 @@ "search_index": 1 }, { - "depends_on": "eval:doc.customer_type != 'Company'", + "depends_on": "eval:doc.customer_type == 'Individual'", "fieldname": "gender", "fieldtype": "Link", "label": "Gender", @@ -151,12 +147,13 @@ { "fieldname": "lead_name", "fieldtype": "Link", - "label": "From Lead", + "label": "Lead", "no_copy": 1, "oldfieldname": "lead_name", "oldfieldtype": "Link", "options": "Lead", "print_hide": 1, + "read_only": 1, "report_hide": 1 }, { @@ -363,15 +360,6 @@ "label": "Default Payment Terms Template", "options": "Payment Terms Template" }, - { - "collapsible": 1, - "collapsible_depends_on": "customer_details", - "fieldname": "more_info", - "fieldtype": "Section Break", - "label": "More Information", - "oldfieldtype": "Section Break", - "options": "fa fa-file-text" - }, { "description": "Additional information regarding the customer.", "fieldname": "customer_details", @@ -380,10 +368,6 @@ "oldfieldname": "customer_details", "oldfieldtype": "Code" }, - { - "fieldname": "column_break_45", - "fieldtype": "Column Break" - }, { "fieldname": "market_segment", "fieldtype": "Link", @@ -449,7 +433,7 @@ { "fieldname": "customer_pos_id", "fieldtype": "Data", - "label": "Customer POS id", + "label": "Customer POS ID", "no_copy": 1, "print_hide": 1, "read_only": 1, @@ -482,10 +466,11 @@ { "fieldname": "opportunity_name", "fieldtype": "Link", - "label": "From Opportunity", + "label": "Opportunity", "no_copy": 1, "options": "Opportunity", - "print_hide": 1 + "print_hide": 1, + "read_only": 1 }, { "fieldname": "contact_and_address_tab", @@ -519,12 +504,6 @@ "fieldname": "column_break_21", "fieldtype": "Column Break" }, - { - "fieldname": "dashboard_tab", - "fieldtype": "Tab Break", - "label": "Dashboard", - "show_dashboard": 1 - }, { "fieldname": "column_break_53", "fieldtype": "Column Break" @@ -554,7 +533,7 @@ "collapsible_depends_on": "is_internal_customer", "fieldname": "internal_customer_section", "fieldtype": "Section Break", - "label": "Internal Customer" + "label": "Internal Customer Accounting" }, { "fieldname": "column_break_70", @@ -582,10 +561,11 @@ { "fieldname": "prospect_name", "fieldtype": "Link", - "label": "From Prospect", + "label": "Prospect", "no_copy": 1, "options": "Prospect", - "print_hide": 1 + "print_hide": 1, + "read_only": 1 }, { "fetch_from": "customer_primary_contact.first_name", @@ -613,6 +593,39 @@ "fieldtype": "Link", "label": "Tax Withholding Group", "options": "Tax Withholding Group" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "references_section", + "fieldtype": "Section Break", + "label": "References" + }, + { + "fieldname": "column_break_wlbg", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_objq", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_hdmn", + "fieldtype": "Column Break" + }, + { + "fieldname": "connections_tab", + "fieldtype": "Tab Break", + "label": "Connections", + "show_dashboard": 1 + }, + { + "fieldname": "supplier_numbers_section", + "fieldtype": "Section Break", + "label": "Supplier Numbers" } ], "icon": "fa fa-user", @@ -626,7 +639,7 @@ "link_fieldname": "party" } ], - "modified": "2026-01-21 17:23:42.151114", + "modified": "2026-02-02 15:39:55.920831", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 4845b5ea038..596f06d758c 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -87,7 +87,6 @@ class Customer(TransactionBase): prospect_name: DF.Link | None represents_company: DF.Link | None sales_team: DF.Table[SalesTeam] - salutation: DF.Link | None so_required: DF.Check supplier_numbers: DF.Table[SupplierNumberAtCustomer] tax_category: DF.Link | None diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index c98bba45b6d..9fe14ae2a98 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -29,6 +29,7 @@ "dn_required", "sales_update_frequency", "blanket_order_allowance", + "enable_tracking_sales_commissions", "column_break_5", "allow_multiple_items", "allow_against_multiple_purchase_orders", @@ -297,6 +298,13 @@ "fieldname": "set_zero_rate_for_expired_batch", "fieldtype": "Check", "label": "Set Incoming Rate as Zero for Expired Batch" + }, + { + "default": "0", + "description": "Manage sales partner's and sales team's commissions", + "fieldname": "enable_tracking_sales_commissions", + "fieldtype": "Check", + "label": "Enable tracking sales commissions" } ], "grid_page_length": 50, @@ -306,7 +314,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-23 00:04:33.105916", + "modified": "2026-02-04 16:16:57.618127", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py index 239230de895..775b5844c3e 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.py +++ b/erpnext/selling/doctype/selling_settings/selling_settings.py @@ -37,6 +37,7 @@ class SellingSettings(Document): editable_price_list_rate: DF.Check enable_cutoff_date_on_bulk_delivery_note_creation: DF.Check enable_discount_accounting: DF.Check + enable_tracking_sales_commissions: DF.Check fallback_to_default_price_list: DF.Check hide_tax_id: DF.Check maintain_same_rate_action: DF.Literal["Stop", "Warn"] @@ -57,6 +58,8 @@ class SellingSettings(Document): self.toggle_discount_accounting_fields() def validate(self): + old_doc = self.get_doc_before_save() + for key in [ "cust_master_name", "customer_group", @@ -78,6 +81,9 @@ class SellingSettings(Document): self.validate_fallback_to_default_price_list() + if old_doc.enable_tracking_sales_commissions != self.enable_tracking_sales_commissions: + toggle_tracking_sales_commissions_section(not self.enable_tracking_sales_commissions) + def validate_fallback_to_default_price_list(self): if ( self.fallback_to_default_price_list @@ -175,3 +181,17 @@ class SellingSettings(Document): "Code", validate_fields_for_doctype=False, ) + + +def toggle_tracking_sales_commissions_section(hide): + from erpnext.accounts.doctype.accounts_settings.accounts_settings import ( + SELLING_DOCTYPES, + create_property_setter_for_hiding_field, + ) + + for doctype in SELLING_DOCTYPES: + meta = frappe.get_meta(doctype) + if meta.has_field("commission_section"): + create_property_setter_for_hiding_field(doctype, "commission_section", hide) + if meta.has_field("sales_team_section"): + create_property_setter_for_hiding_field(doctype, "sales_team_section", hide) From 9ff924e8317a221a6c29ff90e652ca85ba84343b Mon Sep 17 00:00:00 2001 From: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:58:13 +0530 Subject: [PATCH 44/78] fix(manufacturing): remove delete query of job card & batch and serial no (#52840) * fix(manufacturing): remove delete query of batch and serial no * fix(manufacturing): remove delete query of job card * fix: remove delete function call for work order (cherry picked from commit 8b2a9710190a108022da0375ecf19f99504a4ba8) --- .../manufacturing/doctype/routing/test_routing.py | 1 - .../manufacturing/doctype/work_order/work_order.py | 13 ------------- 2 files changed, 14 deletions(-) diff --git a/erpnext/manufacturing/doctype/routing/test_routing.py b/erpnext/manufacturing/doctype/routing/test_routing.py index 27dcade6195..4c6e8df5752 100644 --- a/erpnext/manufacturing/doctype/routing/test_routing.py +++ b/erpnext/manufacturing/doctype/routing/test_routing.py @@ -56,7 +56,6 @@ class TestRouting(IntegrationTestCase): self.assertEqual(job_card_doc.total_completed_qty, 10) wo_doc.cancel() - wo_doc.delete() def test_update_bom_operation_time(self): """Update cost shouldn't update routing times.""" diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 394dee15e7a..b442f5becfc 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -780,7 +780,6 @@ class WorkOrder(Document): self.db_set("status", "Cancelled") self.on_close_or_cancel() - self.delete_job_card() def on_close_or_cancel(self): if self.production_plan and frappe.db.exists( @@ -794,7 +793,6 @@ class WorkOrder(Document): self.update_planned_qty() self.update_ordered_qty() self.update_reserved_qty_for_production() - self.delete_auto_created_batch_and_serial_no() if self.reserve_stock: self.update_stock_reservation() @@ -926,13 +924,6 @@ class WorkOrder(Document): ) ) - def delete_auto_created_batch_and_serial_no(self): - for row in frappe.get_all("Serial No", filters={"work_order": self.name}): - frappe.delete_doc("Serial No", row.name) - - for row in frappe.get_all("Batch", filters={"reference_name": self.name}): - frappe.delete_doc("Batch", row.name) - def make_serial_nos(self, args): item_details = frappe.get_cached_value( "Item", self.production_item, ["serial_no_series", "item_name", "description"], as_dict=1 @@ -1384,10 +1375,6 @@ class WorkOrder(Document): if self.actual_start_date and self.actual_end_date: self.lead_time = flt(time_diff_in_hours(self.actual_end_date, self.actual_start_date) * 60) - def delete_job_card(self): - for d in frappe.get_all("Job Card", ["name"], {"work_order": self.name}): - frappe.delete_doc("Job Card", d.name) - def validate_production_item(self): if frappe.get_cached_value("Item", self.production_item, "has_variants"): frappe.throw(_("Work Order cannot be raised against a Item Template"), ItemHasVariantError) From 2b9af6a641e9d1b5c3c8db37177ee93e712c2475 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Sat, 1 Nov 2025 17:32:52 +0530 Subject: [PATCH 45/78] chore: Removing unused import (cherry picked from commit 87c59f471cac0a49fed5d7d6b21db6eb5f3d2eae) --- erpnext/accounts/party.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 61a4a976a19..749ddd819ec 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -7,18 +7,16 @@ from frappe import _, msgprint, qb, scrub from frappe.contacts.doctype.address.address import get_company_address, get_default_address from frappe.core.doctype.user_permission.user_permission import get_permitted_documents from frappe.model.utils import get_fetch_values -from frappe.query_builder.functions import Abs, Count, Date, Sum +from frappe.query_builder.functions import Abs, Date, Sum from frappe.utils import ( add_days, add_months, - add_years, cint, cstr, date_diff, flt, formatdate, get_last_day, - get_timestamp, getdate, nowdate, ) From f701407e23e3c7b450596e6809d60223eb4d4053 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Sat, 1 Nov 2025 17:55:09 +0530 Subject: [PATCH 46/78] feat: retrieve employee basic contact information (cherry picked from commit 4ad1474e32da7e729ab07cd35fc3bc2070fa7ee3) --- erpnext/setup/doctype/employee/employee.py | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index 13b80b25251..9fdef62e657 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -429,3 +429,28 @@ def has_upload_permission(doc, ptype="read", user=None): if get_doc_permissions(doc, user=user, ptype=ptype).get(ptype): return True return doc.user_id == user + + +@frappe.whitelist() +def get_contact_details(employee: str) -> dict: + """ + Returns basic contact details for the given employee. + + - employee_name as contact_display + - prefered_email as contact_email + - cell_number as contact_mobile + - designation as contact_designation + - department as contact_department + + :param employee: Employee docname + """ + doc: Employee = frappe.get_doc("Employee", employee) + doc.check_permission() + + return { + "contact_display": doc.get("employee_name"), + "contact_email": doc.get("prefered_email"), + "contact_mobile": doc.get("cell_number"), + "contact_designation": doc.get("designation"), + "contact_department": doc.get("department"), + } From 94f9f8b30a4c432a2785301c442338cdb9fc70a4 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Sat, 1 Nov 2025 19:18:23 +0530 Subject: [PATCH 47/78] feat: retrieve employee contact details (cherry picked from commit a41297d8410eb4bd821689b77756d964aeaed280) --- erpnext/public/js/utils/party.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index a2e4dbf1da1..2b03435ef24 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -315,6 +315,16 @@ erpnext.utils.get_contact_details = function (frm) { } }; +erpnext.utils.get_employee_contact_details = async function (employee) { + if (!employee) return; + + const response = await frappe.xcall("erpnext.setup.doctype.employee.employee.get_contact_details", { + employee, + }); + + return response?.message; +}; + erpnext.utils.validate_mandatory = function (frm, label, value, trigger_on) { if (!value) { frm.doc[trigger_on] = ""; From 123b7191fc75ae1a05ffee7d4a83cf9a035a50ad Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Sat, 1 Nov 2025 20:18:52 +0530 Subject: [PATCH 48/78] refactor: fetch employee contact details in realtime (cherry picked from commit 2ea6508fa5e61442d7789f3502c4b609f695af1f) --- .../doctype/payment_entry/payment_entry.js | 4 ++ erpnext/public/js/utils/party.js | 64 +++++++++++-------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 15ec96a5e9c..f1e816a9cbe 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -512,12 +512,16 @@ frappe.ui.form.on("Payment Entry", { frm.set_value("contact_email", ""); frm.set_value("contact_person", ""); } + if (frm.doc.payment_type && frm.doc.party_type && frm.doc.party && frm.doc.company) { if (!frm.doc.posting_date) { frappe.msgprint(__("Please select Posting Date before selecting Party")); frm.set_value("party", ""); return; } + + erpnext.utils.get_employee_contact_details(frm); + frm.set_party_account_based_on_party = true; let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 2b03435ef24..09cff0bd423 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -294,37 +294,49 @@ erpnext.utils.set_taxes = function (frm, triggered_from_field) { erpnext.utils.get_contact_details = function (frm) { if (frm.updating_party_details) return; - if (frm.doc["contact_person"]) { - frappe.call({ - method: "frappe.contacts.doctype.contact.contact.get_contact_details", - args: { contact: frm.doc.contact_person }, - callback: function (r) { - if (r.message) frm.set_value(r.message); - }, - }); - } else { - frm.set_value({ - contact_person: "", - contact_display: "", - contact_email: "", - contact_mobile: "", - contact_phone: "", - contact_designation: "", - contact_department: "", - }); + if (!frm.doc.contact_person) { + reset_contact_fields(frm); + return; } -}; -erpnext.utils.get_employee_contact_details = async function (employee) { - if (!employee) return; - - const response = await frappe.xcall("erpnext.setup.doctype.employee.employee.get_contact_details", { - employee, + frappe.call({ + method: "frappe.contacts.doctype.contact.contact.get_contact_details", + args: { contact: frm.doc.contact_person }, + callback: function (r) { + if (r.message) frm.set_value(r.message); + }, }); - - return response?.message; }; +erpnext.utils.get_employee_contact_details = function (frm) { + if (frm.updating_party_details || frm.doc.party_type !== "Employee") return; + + if (!frm.doc.party) { + reset_contact_fields(frm); + return; + } + + frappe.call({ + method: "erpnext.setup.doctype.employee.employee.get_contact_details", + args: { employee: frm.doc.party }, + callback: function (r) { + if (r.message) frm.set_value(r.message); + }, + }); +}; + +function reset_contact_fields(frm) { + frm.set_value({ + contact_person: "", + contact_display: "", + contact_email: "", + contact_mobile: "", + contact_phone: "", + contact_designation: "", + contact_department: "", + }); +} + erpnext.utils.validate_mandatory = function (frm, label, value, trigger_on) { if (!value) { frm.doc[trigger_on] = ""; From 0f8f8c2066df76084b58cdcbe5474d216f44080f Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Sun, 2 Nov 2025 19:32:34 +0530 Subject: [PATCH 49/78] refactor: add validation for missing employee parameter (cherry picked from commit b8e06b9636d55abbaa84c74acdf6b74a3e040cac) --- erpnext/setup/doctype/employee/employee.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index 9fdef62e657..b6c23b677aa 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -444,6 +444,9 @@ def get_contact_details(employee: str) -> dict: :param employee: Employee docname """ + if not employee: + frappe.throw(msg=_("Employee is required"), title=_("Missing Parameter")) + doc: Employee = frappe.get_doc("Employee", employee) doc.check_permission() From 116361c1dc983d563f3e491140d4775cdfd7136c Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Thu, 18 Dec 2025 18:41:31 +0530 Subject: [PATCH 50/78] fix: get employee email with priority if preferred is not set (cherry picked from commit 7b89c12470993803327edf51f57176362db93602) --- erpnext/setup/doctype/employee/employee.py | 48 +++++++++++++++------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index b6c23b677aa..ce8f3510bd2 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -435,25 +435,43 @@ def has_upload_permission(doc, ptype="read", user=None): def get_contact_details(employee: str) -> dict: """ Returns basic contact details for the given employee. - - - employee_name as contact_display - - prefered_email as contact_email - - cell_number as contact_mobile - - designation as contact_designation - - department as contact_department - - :param employee: Employee docname """ if not employee: frappe.throw(msg=_("Employee is required"), title=_("Missing Parameter")) - doc: Employee = frappe.get_doc("Employee", employee) - doc.check_permission() + frappe.has_permission("Employee", "read", employee, throw=True) + + contact_data = frappe.db.get_value( + "Employee", + employee, + [ + "employee_name", + "prefered_email", + "company_email", + "personal_email", + "user_id", + "cell_number", + "designation", + "department", + ], + as_dict=True, + ) + + if not contact_data: + frappe.throw(msg=_("Employee {0} not found").format(employee), title=_("Not Found")) + + # Email with priority + employee_email = ( + contact_data.get("prefered_email") + or contact_data.get("company_email") + or contact_data.get("personal_email") + or contact_data.get("user_id") + ) return { - "contact_display": doc.get("employee_name"), - "contact_email": doc.get("prefered_email"), - "contact_mobile": doc.get("cell_number"), - "contact_designation": doc.get("designation"), - "contact_department": doc.get("department"), + "contact_display": contact_data.get("employee_name"), + "contact_email": employee_email, + "contact_mobile": contact_data.get("cell_number"), + "contact_designation": contact_data.get("designation"), + "contact_department": contact_data.get("department"), } From 63975c8c00f2748e6cb086ccee444c73774faf59 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Thu, 18 Dec 2025 18:48:09 +0530 Subject: [PATCH 51/78] refactor: use common method to get employee contacts (cherry picked from commit ec1eb6d22201bea85030529aefba7ae21cdf4ed3) --- erpnext/accounts/party.py | 14 ++------------ erpnext/setup/doctype/employee/employee.py | 7 ++++++- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 749ddd819ec..46a9a942fea 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -296,19 +296,9 @@ def complete_contact_details(party_details): contact_details = frappe._dict() if party_details.party_type == "Employee": - contact_details = frappe.db.get_value( - "Employee", - party_details.party, - [ - "employee_name as contact_display", - "prefered_email as contact_email", - "cell_number as contact_mobile", - "designation as contact_designation", - "department as contact_department", - ], - as_dict=True, - ) + from erpnext.setup.doctype.employee.employee import get_contact_details as get_employee_contact + contact_details = get_employee_contact(party_details.party) contact_details.update({"contact_person": None, "contact_phone": None}) elif party_details.contact_person: contact_details = frappe.db.get_value( diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index ce8f3510bd2..85ae46a3a6a 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -6,7 +6,6 @@ from frappe.model.naming import set_name_by_naming_series from frappe.permissions import ( add_user_permission, get_doc_permissions, - has_permission, remove_user_permission, ) from frappe.utils import cstr, getdate, today, validate_email_address @@ -435,6 +434,12 @@ def has_upload_permission(doc, ptype="read", user=None): def get_contact_details(employee: str) -> dict: """ Returns basic contact details for the given employee. + + Email is selected based on the following priority: + 1. Prefered Email + 2. Company Email + 3. Personal Email + 4. User ID """ if not employee: frappe.throw(msg=_("Employee is required"), title=_("Missing Parameter")) From 5c9f9517d67fc1ec938734d85d36f48da488d583 Mon Sep 17 00:00:00 2001 From: Abdeali Chharchhoda Date: Fri, 19 Dec 2025 11:39:02 +0530 Subject: [PATCH 52/78] refactor: method to get employee contact without permission check (cherry picked from commit 58cdb9503b1e44804aa57b49babd3de9d0668a9d) --- erpnext/accounts/party.py | 2 +- erpnext/setup/doctype/employee/employee.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 46a9a942fea..9cc7aca9fc1 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -296,7 +296,7 @@ def complete_contact_details(party_details): contact_details = frappe._dict() if party_details.party_type == "Employee": - from erpnext.setup.doctype.employee.employee import get_contact_details as get_employee_contact + from erpnext.setup.doctype.employee.employee import _get_contact_details as get_employee_contact contact_details = get_employee_contact(party_details.party) contact_details.update({"contact_person": None, "contact_phone": None}) diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index 85ae46a3a6a..9b4759b360a 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -446,6 +446,10 @@ def get_contact_details(employee: str) -> dict: frappe.has_permission("Employee", "read", employee, throw=True) + return _get_contact_details(employee) + + +def _get_contact_details(employee: str) -> dict: contact_data = frappe.db.get_value( "Employee", employee, From 746b5d96de47d441a5642ef90ae58498c1aa256b Mon Sep 17 00:00:00 2001 From: ervishnucs Date: Thu, 19 Feb 2026 18:39:54 +0530 Subject: [PATCH 53/78] fix: check gl account of an associated bank account in bank transaction (cherry picked from commit 8fe0bf4ba3c50d406990751d7f3d290fbd61544e) --- .../accounts/doctype/bank_transaction/bank_transaction.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py index 44f449ac788..020a692e38f 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py @@ -375,11 +375,12 @@ def get_clearance_details(transaction, payment_entry, bt_allocations, gl_entries ("unallocated_amount", "bank_account"), as_dict=True, ) + bt_bank_account = frappe.db.get_value("Bank Account", bt.bank_account, "account") - if bt.bank_account != gl_bank_account: + if bt_bank_account != gl_bank_account: frappe.throw( _("Bank Account {} in Bank Transaction {} is not matching with Bank Account {}").format( - bt.bank_account, payment_entry.payment_entry, gl_bank_account + bt_bank_account, payment_entry.payment_entry, gl_bank_account ) ) From 6e1a8083a5db36137dc597dc1e00ee2e4a6b8132 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 23 Feb 2026 14:52:23 +0530 Subject: [PATCH 54/78] fix: standalone sales invoice return should not fallback to item master for valuation rate (cherry picked from commit a85a0aef5247b8fa0317c0071a379be084f8044e) --- .../sales_invoice_item.json | 3 +- .../report/gross_profit/test_gross_profit.py | 1 + erpnext/controllers/selling_controller.py | 55 +++++++++++-------- erpnext/stock/stock_ledger.py | 24 ++++---- erpnext/stock/utils.py | 3 +- 5 files changed, 46 insertions(+), 40 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json index 28a2256e2ec..c90e1ff42d2 100644 --- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json +++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json @@ -843,6 +843,7 @@ "fieldtype": "Currency", "label": "Incoming Rate (Costing)", "no_copy": 1, + "non_negative": 1, "options": "Company:company:default_currency", "print_hide": 1 }, @@ -1009,7 +1010,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2026-02-15 21:08:57.341638", + "modified": "2026-02-23 14:37:14.853941", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice Item", diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index 159c1086018..bf52e127544 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -444,6 +444,7 @@ class TestGrossProfit(IntegrationTestCase): qty=-1, rate=100, posting_date=nowdate(), do_not_save=True, do_not_submit=True ) sinv.is_return = 1 + sinv.items[0].allow_zero_valuation_rate = 1 sinv = sinv.save().submit() filters = frappe._dict( diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 0f883eeb50f..6db30b41a8a 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -498,10 +498,34 @@ class SellingController(StockController): sales_order.update_reserved_qty(so_item_rows) def set_incoming_rate(self): + def reset_incoming_rate(): + old_item = next( + ( + item + for item in (old_doc.get("items") + (old_doc.get("packed_items") or [])) + if item.name == d.name + ), + None, + ) + if old_item: + old_qty = flt(old_item.get("stock_qty") or old_item.get("actual_qty") or old_item.get("qty")) + if ( + old_item.item_code != d.item_code + or old_item.warehouse != d.warehouse + or old_qty != qty + or old_item.serial_no != d.serial_no + or get_serial_nos(old_item.serial_and_batch_bundle) + != get_serial_nos(d.serial_and_batch_bundle) + or old_item.batch_no != d.batch_no + or get_batch_nos(old_item.serial_and_batch_bundle) + != get_batch_nos(d.serial_and_batch_bundle) + ): + d.incoming_rate = 0 + if self.doctype not in ("Delivery Note", "Sales Invoice"): return - from erpnext.stock.serial_batch_bundle import get_batch_nos + from erpnext.stock.serial_batch_bundle import get_batch_nos, get_serial_nos allow_at_arms_length_price = frappe.get_cached_value( "Stock Settings", None, "allow_internal_transfer_at_arms_length_price" @@ -510,6 +534,8 @@ class SellingController(StockController): "Selling Settings", "set_zero_rate_for_expired_batch" ) + is_standalone = self.is_return and not self.return_against + old_doc = self.get_doc_before_save() items = self.get("items") + (self.get("packed_items") or []) for d in items: @@ -541,27 +567,7 @@ class SellingController(StockController): qty = flt(d.get("stock_qty") or d.get("actual_qty") or d.get("qty")) if old_doc: - old_item = next( - ( - item - for item in (old_doc.get("items") + (old_doc.get("packed_items") or [])) - if item.name == d.name - ), - None, - ) - if old_item: - old_qty = flt( - old_item.get("stock_qty") or old_item.get("actual_qty") or old_item.get("qty") - ) - if ( - old_item.item_code != d.item_code - or old_item.warehouse != d.warehouse - or old_qty != qty - or old_item.batch_no != d.batch_no - or get_batch_nos(old_item.serial_and_batch_bundle) - != get_batch_nos(d.serial_and_batch_bundle) - ): - d.incoming_rate = 0 + reset_incoming_rate() if ( not d.incoming_rate @@ -583,11 +589,12 @@ class SellingController(StockController): "voucher_type": self.doctype, "voucher_no": self.name, "voucher_detail_no": d.name, - "allow_zero_valuation": d.get("allow_zero_valuation"), + "allow_zero_valuation": d.get("allow_zero_valuation_rate"), "batch_no": d.batch_no, "serial_no": d.serial_no, }, - raise_error_if_no_rate=False, + raise_error_if_no_rate=is_standalone, + fallbacks=not is_standalone, ) if ( diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 39cfbf5c516..4bbd476edfd 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1910,6 +1910,7 @@ def get_valuation_rate( allow_zero_rate=False, currency=None, company=None, + fallbacks=True, raise_error_if_no_rate=True, batch_no=None, serial_and_batch_bundle=None, @@ -1970,23 +1971,20 @@ def get_valuation_rate( ): return flt(last_valuation_rate[0][0]) - # If negative stock allowed, and item delivered without any incoming entry, - # system does not found any SLE, then take valuation rate from Item - valuation_rate = frappe.db.get_value("Item", item_code, "valuation_rate") - - if not valuation_rate: - # try Item Standard rate - valuation_rate = frappe.db.get_value("Item", item_code, "standard_rate") - - if not valuation_rate: - # try in price list - valuation_rate = frappe.db.get_value( + if fallbacks: + # If negative stock allowed, and item delivered without any incoming entry, + # system does not found any SLE, then take valuation rate from Item + if rate := ( + frappe.db.get_value("Item", item_code, "valuation_rate") + or frappe.db.get_value("Item", item_code, "standard_rate") + or frappe.db.get_value( "Item Price", dict(item_code=item_code, buying=1, currency=currency), "price_list_rate" ) + ): + return flt(rate) if ( not allow_zero_rate - and not valuation_rate and raise_error_if_no_rate and cint(erpnext.is_perpetual_inventory_enabled(company)) ): @@ -2016,8 +2014,6 @@ def get_valuation_rate( frappe.throw(msg=msg, title=_("Valuation Rate Missing")) - return valuation_rate - def update_qty_in_future_sle(args, allow_negative_stock=False): """Recalculate Qty after Transaction in future SLEs based on current SLE.""" diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py index 7a60dcb64fc..b4f25e22e04 100644 --- a/erpnext/stock/utils.py +++ b/erpnext/stock/utils.py @@ -237,7 +237,7 @@ def _create_bin(item_code, warehouse): @frappe.whitelist() -def get_incoming_rate(args, raise_error_if_no_rate=True): +def get_incoming_rate(args, raise_error_if_no_rate=True, fallbacks: bool = True): """Get Incoming Rate based on valuation method""" from erpnext.stock.stock_ledger import get_previous_sle, get_valuation_rate @@ -325,6 +325,7 @@ def get_incoming_rate(args, raise_error_if_no_rate=True): args.get("allow_zero_valuation"), currency=erpnext.get_company_currency(args.get("company")), company=args.get("company"), + fallbacks=fallbacks, raise_error_if_no_rate=raise_error_if_no_rate, ) From b67d42ee58d8d2f95832d8ffc8d10e876241ee36 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 23 Feb 2026 17:50:24 +0530 Subject: [PATCH 55/78] fix: link field displays incorrect value when empty (cherry picked from commit db00860662a37b846a32cab5c97dca2d8974c165) --- erpnext/public/js/utils.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 455107ef201..3d3b86a15c5 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -1073,12 +1073,14 @@ frappe.form.link_formatters["Project"] = function (value, doc, df) { * @returns {string} - The link value with the added title. */ function add_link_title(value, doc, df, title_field) { - if (doc && value && doc[title_field] && doc[title_field] !== value && doc[df.fieldname] === value) { - return value + ": " + doc[title_field]; - } else if (!value && doc.doctype && doc[title_field] && doc.doctype == df.parent) { - return doc[title_field]; - } else { - return value; + if (value && doc[title_field]) { + if (doc[title_field] !== value && doc[df.fieldname] === value) { + return value + ": " + doc[title_field]; + } else if (doc.doctype == df.parent) { + return doc[title_field]; + } else { + return value; + } } } From 785773b0ac084c7b76c6d2bbe67195653d97e82d Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Mon, 23 Feb 2026 17:43:08 +0530 Subject: [PATCH 56/78] fix: material request on receive notification condition (cherry picked from commit 96aa37eff5386ce81438bfcd42e4f09939bafac2) --- .../material_request_receipt_notification.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.json b/erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.json index 6ef2ea30418..d39354df5fc 100644 --- a/erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.json +++ b/erpnext/manufacturing/notification/material_request_receipt_notification/material_request_receipt_notification.json @@ -2,6 +2,7 @@ "attach_print": 0, "channel": "Email", "condition": "doc.status == \"Received\" or doc.status == \"Partially Received\"", + "condition_type": "Python", "creation": "2019-04-29 11:53:23.981418", "days_in_advance": 0, "docstatus": 0, @@ -11,16 +12,18 @@ "event": "Value Change", "idx": 0, "is_standard": 1, + "message": "

{{ _(\"Material Request Type\") }}: {{ doc.material_request_type }}
\n{{ _(\"Company\") }}: {{ doc.company }}

\n\n

{{ _(\"Order Summary\") }}

\n\n\n \n \n \n \n {% for item in doc.items %}\n {% if frappe.utils.flt(item.received_qty, 2) > 0.0 %}\n \n \n \n \n {% endif %}\n {% endfor %}\n
{{ _(\"Item Name\") }}{{ _(\"Received Quantity\") }}
{{ item.item_code }}{{ frappe.utils.flt(item.received_qty, 2) }}
\n", "message_type": "HTML", "method": "", - "modified": "2023-11-17 08:53:29.525296", + "minutes_offset": 0, + "modified": "2026-02-23 17:41:43.982194", "modified_by": "Administrator", "module": "Manufacturing", "name": "Material Request Receipt Notification", "owner": "Administrator", "recipients": [ { - "receiver_by_document_field": "requested_by" + "receiver_by_document_field": "owner" } ], "send_system_notification": 0, From e8c5d5710d0d38a001b3d7f1aa9733b82eeaab21 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Mon, 23 Feb 2026 17:43:36 +0530 Subject: [PATCH 57/78] fix: fiscal year notification subject (cherry picked from commit 3e87059939e6f294f9872fc09b548607cc462fa7) --- .../notification_for_new_fiscal_year.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json index b1016a43c37..be9f2179eed 100644 --- a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json +++ b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json @@ -15,7 +15,7 @@ "message": "

{{ _(\"New Fiscal Year - {0}\").format(doc.name) }}

\n\n

{{ _(\"A new fiscal year has been automatically created.\") }}

\n\n

{{ _(\"Fiscal Year Details\") }}

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n {% if doc.companies|length > 0 %}\n \n \n \n \n {% for idx in range(1, doc.companies|length) %}\n \n \n \n {% endfor %}\n {% endif %}\n
{{ _(\"Year Name\") }}{{ doc.name }}
{{ _(\"Start Date\") }}{{ frappe.format_value(doc.year_start_date) }}
{{ _(\"End Date\") }}{{ frappe.format_value(doc.year_end_date) }}
\n {% if doc.companies|length < 2 %}\n {{ _(\"Company\") }}\n {% else %}\n {{ _(\"Companies\") }}\n {% endif %}\n {{ doc.companies[0].company }}
{{ doc.companies[idx].company }}
\n\n{% if doc.disabled %}\n

{{ _(\"The fiscal year has been automatically created in a Disabled state to maintain consistency with the previous fiscal year's status.\") }}

\n{% endif %}\n\n

{{ _(\"Please review the {0} configuration and complete any required financial setup activities.\").format(frappe.utils.get_link_to_form(\"Fiscal Year\", doc.name, frappe.bold(\"Fiscal Year\"))) }}

", "message_type": "HTML", "minutes_offset": 0, - "modified": "2026-02-21 12:14:54.736795", + "modified": "2026-02-23 17:37:03.755394", "modified_by": "Administrator", "module": "Accounts", "name": "Notification for new fiscal year", @@ -30,5 +30,5 @@ ], "send_system_notification": 0, "send_to_all_assignees": 0, - "subject": "{{ _(\"New Fiscal Year {0} - Review Required\").format(doc.name) }}" + "subject": "New Fiscal Year {{ doc.name }} - Review Required" } From 237e4583e2f49bc112739afdf8504cbd4a572aa7 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Mon, 23 Feb 2026 17:20:54 +0530 Subject: [PATCH 58/78] fix: populate doctypes to be ignored table in validate (cherry picked from commit 60d2f2d30463a71a7cfd8ae9783cc4f227b7cb1f) --- .../transaction_deletion_record/transaction_deletion_record.py | 2 ++ 1 file changed, 2 insertions(+) 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 245befce842..a76c37e2fee 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -165,6 +165,8 @@ class TransactionDeletionRecord(Document): def validate(self): frappe.only_for("System Manager") + if not self.doctypes_to_be_ignored: + self.populate_doctypes_to_be_ignored_table() self.validate_to_delete_list() def validate_to_delete_list(self): From fb8f085885f45aae149d6671fddd0f8e17cff415 Mon Sep 17 00:00:00 2001 From: Imesha Sudasingha Date: Mon, 23 Feb 2026 20:42:08 +0530 Subject: [PATCH 59/78] Merge pull request #52544 from one-highflyer/fix/improve-reserved-serial-no-error-message fix(stock): improve error message when serial no is reserved via SRE (cherry picked from commit 71248ff40bbeb399378a0797f268f45b224f08ae) --- .../serial_and_batch_bundle.py | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index b8350af3bc2..012503a3d9c 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -300,10 +300,20 @@ class SerialandBatchBundle(Document): for serial_no in serial_nos: if not serial_no_warehouse.get(serial_no) or serial_no_warehouse.get(serial_no) != self.warehouse: - self.throw_error_message( - f"Serial No {bold(serial_no)} is not present in the warehouse {bold(self.warehouse)}.", - SerialNoWarehouseError, - ) + reservation = get_serial_no_reservation(self.item_code, serial_no, self.warehouse) + if reservation: + self.throw_error_message( + f"Serial No {bold(serial_no)} is in warehouse {bold(self.warehouse)}" + f" but is reserved for {reservation.voucher_type} {bold(reservation.voucher_no)}" + f" via {get_link_to_form('Stock Reservation Entry', reservation.name)}." + f" Please use an unreserved serial number or cancel the reservation.", + SerialNoWarehouseError, + ) + else: + self.throw_error_message( + f"Serial No {bold(serial_no)} is not present in the warehouse {bold(self.warehouse)}.", + SerialNoWarehouseError, + ) def validate_serial_nos_duplicate(self): # Don't inward same serial number multiple times @@ -2586,6 +2596,32 @@ def get_reserved_serial_nos_for_sre(kwargs) -> list: return query.run(as_dict=True) +def get_serial_no_reservation(item_code: str, serial_no: str, warehouse: str) -> _dict | None: + """Returns the Stock Reservation Entry that has reserved the given serial number, if any.""" + + sre = frappe.qb.DocType("Stock Reservation Entry") + sb_entry = frappe.qb.DocType("Serial and Batch Entry") + result = ( + frappe.qb.from_(sre) + .inner_join(sb_entry) + .on(sre.name == sb_entry.parent) + .select(sre.name, sre.voucher_type, sre.voucher_no) + .where( + (sre.docstatus == 1) + & (sre.item_code == item_code) + & (sre.warehouse == warehouse) + & (sre.status.notin(["Delivered", "Cancelled", "Closed"])) + & (sre.reservation_based_on == "Serial and Batch") + & (sb_entry.serial_no == serial_no) + & (sb_entry.qty != sb_entry.delivered_qty) + ) + .limit(1) + .run(as_dict=True) + ) + + return result[0] if result else None + + def get_reserved_batches_for_pos(kwargs) -> dict: """Returns a dict of `Batch No` followed by the `Qty` reserved in POS Invoices.""" From 780b626ae50c94a93456d04feb1c140c4121867e Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Mon, 23 Feb 2026 17:58:47 +0530 Subject: [PATCH 60/78] fix: skip empty dimension values in exchange gain loss (cherry picked from commit 7df9d951c6784f623f0ac00f8ffb5a7eba1ff3c1) --- erpnext/accounts/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 0514aa455bc..cf6a7c12326 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -500,7 +500,8 @@ def _build_dimensions_dict_for_exc_gain_loss( dimensions_dict = frappe._dict() if entry and active_dimensions: for dim in active_dimensions: - dimensions_dict[dim.fieldname] = entry.get(dim.fieldname) + if entry_dimension := entry.get(dim.fieldname): + dimensions_dict[dim.fieldname] = entry_dimension return dimensions_dict From 217709836bf1d84c4c72bba5be251ffb6f7e1864 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:28:34 +0530 Subject: [PATCH 61/78] fix: sales and purchase modules forms clean-up (backport #52875) (#52911) * fix: sales and purchase modules forms clean-up (cherry picked from commit 0e356dc2e3a2154e3b9f62555d43872a372f2a03) # Conflicts: # erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json # erpnext/accounts/doctype/sales_invoice/sales_invoice.json # erpnext/buying/doctype/purchase_order/purchase_order.json # erpnext/selling/doctype/sales_order/sales_order.json # erpnext/stock/doctype/delivery_note/delivery_note.json * chore: fix conflicts * chore: fix conflicts Removed unnecessary fields and updated the modified date. * chore: fix conflicts * chore: fix conflicts * chore: fix conflicts Removed UTM Analytics section and column break from delivery note JSON configuration. Updated the modified timestamp. --------- Co-authored-by: Rohit Waghchaure --- .../purchase_invoice/purchase_invoice.json | 12 ++--- .../doctype/sales_invoice/sales_invoice.json | 24 ++++++--- .../purchase_order/purchase_order.json | 10 ++-- .../doctype/sales_order/sales_order.json | 6 +-- .../doctype/delivery_note/delivery_note.json | 52 ++++++++++++------- .../purchase_receipt/purchase_receipt.json | 10 ++-- 6 files changed, 68 insertions(+), 46 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index e51af9ae11c..f5da645b4b6 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -86,18 +86,18 @@ "taxes_and_charges_deducted", "total_taxes_and_charges", "totals_section", + "use_company_roundoff_cost_center", "grand_total", + "in_words", + "column_break8", "disable_rounded_total", "rounding_adjustment", - "column_break8", - "use_company_roundoff_cost_center", - "in_words", "rounded_total", "base_totals_section", "base_grand_total", - "base_rounding_adjustment", - "column_break_hcca", "base_in_words", + "column_break_hcca", + "base_rounding_adjustment", "base_rounded_total", "section_break_ttrv", "total_advance", @@ -1689,7 +1689,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2026-02-05 21:45:16.964500", + "modified": "2026-02-23 14:23:57.269770", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index e92aab3232d..bfe52e8c7b1 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -78,21 +78,23 @@ "column_break_47", "total_taxes_and_charges", "totals_section", + "use_company_roundoff_cost_center", "grand_total", - "rounding_adjustment", "in_words", "column_break5", - "rounded_total", "disable_rounded_total", - "total_advance", - "outstanding_amount", - "use_company_roundoff_cost_center", + "rounding_adjustment", + "rounded_total", "base_totals_section", "base_grand_total", - "base_rounding_adjustment", "base_in_words", "column_break_xjag", + "base_rounding_adjustment", "base_rounded_total", + "section_break_vacb", + "total_advance", + "column_break_rdks", + "outstanding_amount", "section_tax_withholding_entry", "tax_withholding_group", "ignore_tax_withholding_threshold", @@ -2303,6 +2305,14 @@ "oldfieldtype": "Section Break", "options": "fa fa-group", "print_hide": 1 + }, + { + "fieldname": "section_break_vacb", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_rdks", + "fieldtype": "Column Break" } ], "grid_page_length": 50, @@ -2316,7 +2326,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-02-15 20:43:44.732805", + "modified": "2026-02-23 14:29:00.301842", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index f528e07391d..3dd4d927255 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -77,16 +77,16 @@ "total_taxes_and_charges", "totals_section", "grand_total", + "in_words", + "column_break4", "disable_rounded_total", "rounding_adjustment", - "column_break4", - "in_words", "rounded_total", "base_totals_section", "base_grand_total", - "base_rounding_adjustment", - "column_break_jkoz", "base_in_words", + "column_break_jkoz", + "base_rounding_adjustment", "base_rounded_total", "section_break_tnkm", "advance_paid", @@ -1318,7 +1318,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-02-04 13:01:36.628472", + "modified": "2026-02-23 14:22:33.323946", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index c94fe377512..4238e3438a3 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -73,14 +73,14 @@ "in_words", "disable_rounded_total", "column_break_nuxg", - "rounded_total", "rounding_adjustment", + "rounded_total", "base_totals_section", "base_grand_total", "base_in_words", "column_break_bgfw", - "base_rounded_total", "base_rounding_adjustment", + "base_rounded_total", "section_break_efew", "advance_paid", "additional_discount_section", @@ -1724,7 +1724,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-02-06 15:35:47.502692", + "modified": "2026-02-23 14:25:56.665392", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 9abe8c8c409..3b2215fdae7 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -66,17 +66,19 @@ "base_total_taxes_and_charges", "column_break_47", "total_taxes_and_charges", - "totals", - "base_grand_total", - "base_rounding_adjustment", - "base_rounded_total", - "base_in_words", - "column_break3", + "totals_section", "grand_total", + "in_words", + "column_break3", + "disable_rounded_total", "rounding_adjustment", "rounded_total", - "in_words", - "disable_rounded_total", + "base_totals_section", + "base_grand_total", + "base_in_words", + "column_break_ydwe", + "base_rounding_adjustment", + "base_rounded_total", "section_break_49", "apply_discount_on", "base_discount_amount", @@ -750,17 +752,10 @@ "options": "currency", "print_hide": 1 }, - { - "fieldname": "totals", - "fieldtype": "Section Break", - "label": "Totals", - "oldfieldtype": "Section Break", - "options": "fa fa-money" - }, { "fieldname": "base_grand_total", "fieldtype": "Currency", - "label": "Grand Total (Company Currency)", + "label": "Grand Total", "oldfieldname": "grand_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -773,7 +768,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounding_adjustment", "fieldtype": "Currency", - "label": "Rounding Adjustment (Company Currency)", + "label": "Rounding Adjustment", "no_copy": 1, "options": "Company:company:default_currency", "print_hide": 1, @@ -783,7 +778,7 @@ "depends_on": "eval:!doc.disable_rounded_total", "fieldname": "base_rounded_total", "fieldtype": "Currency", - "label": "Rounded Total (Company Currency)", + "label": "Rounded Total", "oldfieldname": "rounded_total", "oldfieldtype": "Currency", "options": "Company:company:default_currency", @@ -796,7 +791,7 @@ "description": "In Words will be visible once you save the Delivery Note.", "fieldname": "base_in_words", "fieldtype": "Data", - "label": "In Words (Company Currency)", + "label": "In Words", "length": 240, "oldfieldname": "in_words", "oldfieldtype": "Data", @@ -1428,13 +1423,30 @@ "no_copy": 1, "options": "Item Wise Tax Detail", "print_hide": 1 + }, + { + "fieldname": "totals_section", + "fieldtype": "Section Break", + "label": "Totals", + "oldfieldtype": "Section Break", + "options": "fa fa-money" + }, + { + "fieldname": "base_totals_section", + "fieldtype": "Section Break", + "label": "Totals (Company Currency)", + "options": "Company:company:default_currency" + }, + { + "fieldname": "column_break_ydwe", + "fieldtype": "Column Break" } ], "icon": "fa fa-truck", "idx": 146, "is_submittable": 1, "links": [], - "modified": "2026-02-03 12:27:19.055918", + "modified": "2026-02-23 23:05:39.097097", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index b16dc1b32e1..e13837b5f10 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -79,16 +79,16 @@ "total_taxes_and_charges", "totals_section", "grand_total", + "in_words", + "column_break_50", "disable_rounded_total", "rounding_adjustment", - "column_break_50", - "in_words", "rounded_total", "base_totals_section", "base_grand_total", - "base_rounding_adjustment", - "column_break_ugyv", "base_in_words", + "column_break_ugyv", + "base_rounding_adjustment", "base_rounded_total", "section_break_42", "apply_discount_on", @@ -1302,7 +1302,7 @@ "idx": 261, "is_submittable": 1, "links": [], - "modified": "2026-02-04 14:36:41.087460", + "modified": "2026-02-23 16:56:41.075091", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", From 3a0f90c433363ca5beea32fbd2b86302f74925ce Mon Sep 17 00:00:00 2001 From: Sowmya <106989392+SowmyaArunachalam@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:47:48 +0530 Subject: [PATCH 62/78] fix(sales-order): update quotation status while cancelling sales order (#52822) * fix(sales-order): update quotation status while cancelling sales order * test: validate quotation status * chore: remove submit (cherry picked from commit d638f3e03396fab37c0f9b7e8e8e3cb31a4274f0) --- .../doctype/quotation/test_quotation.py | 25 +++++++++++++++++++ .../doctype/sales_order/sales_order.py | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index eaaa2eb9748..49f921d9865 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -1001,6 +1001,31 @@ class TestQuotation(IntegrationTestCase): so1.submit() self.assertRaises(frappe.ValidationError, so2.submit) + def test_quotation_status(self): + quotation = make_quotation() + + so1 = make_sales_order(quotation.name) + so1.delivery_date = nowdate() + so1.submit() + quotation.reload() + self.assertEqual(quotation.status, "Ordered") + so1.cancel() + + quotation.reload() + self.assertEqual(quotation.status, "Open") + + so2 = make_sales_order(quotation.name) + so2.delivery_date = nowdate() + so2.items[0].qty = 1 + so2.submit() + quotation.reload() + self.assertEqual(quotation.status, "Partially Ordered") + + so2.cancel() + + quotation.reload() + self.assertEqual(quotation.status, "Open") + def enable_calculate_bundle_price(enable=1): selling_settings = frappe.get_doc("Selling Settings") diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 876b11459b4..9d39c38505d 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -530,7 +530,7 @@ class SalesOrder(SellingController): "Unreconcile Payment Entries", ) super().on_cancel() - + super().update_prevdoc_status() # Cannot cancel closed SO if self.status == "Closed": frappe.throw(_("Closed order cannot be cancelled. Unclose to cancel.")) From 13d153c196c7e1cbd066c4bcbedd8b137116edef Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Tue, 3 Feb 2026 16:26:35 +0530 Subject: [PATCH 63/78] fix: unhide book_advance_payments_in_separate_party_account check field in Payment Entry doctype (cherry picked from commit 5793322c301a1201fc77863b36f587afa6680d9c) --- erpnext/accounts/doctype/payment_entry/payment_entry.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 2a2494127f4..1adf6a5866e 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -701,7 +701,6 @@ "fetch_from": "company.book_advance_payments_in_separate_party_account", "fieldname": "book_advance_payments_in_separate_party_account", "fieldtype": "Check", - "hidden": 1, "label": "Book Advance Payments in Separate Party Account", "no_copy": 1, "read_only": 1 @@ -793,7 +792,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2025-12-18 13:56:40.206038", + "modified": "2026-02-03 16:08:49.800381", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", From 858119f907f736ac3127a3cd448e2a8951fd5431 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 20 Feb 2026 20:59:03 +0530 Subject: [PATCH 64/78] feat: module onboarding (cherry picked from commit 792a1a7ab7b8030a71beb02039848bf8347dea34) --- .../accounting_onboarding.json | 41 ++++++++++ .../chart_of_accounts/chart_of_accounts.json | 20 +++++ .../create_payment_entry.json | 21 +++++ .../create_sales_invoice.json | 20 +++++ .../review_accounts_settings.json | 21 +++++ .../setup_sales_taxes/setup_sales_taxes.json | 22 ++++++ .../view_balance_sheet.json | 23 ++++++ .../asset_onboarding/asset_onboarding.json | 44 +++++++++++ .../create_asset_category.json | 20 +++++ .../create_asset_item/create_asset_item.json | 21 +++++ .../create_asset_location.json | 20 +++++ .../create_existing_asset.json | 21 +++++ .../learn_asset/learn_asset.json | 20 +++++ .../view_balance_sheet.json | 23 ++++++ .../purchase_order/purchase_order.json | 76 ++++++++++++++++++ .../supplier_form_tour.json | 42 ++++++++++ .../buying_onboarding/buying_onboarding.json | 41 ++++++++++ .../create_item/create_item.json | 20 +++++ .../create_purchase_invoice.json | 20 +++++ .../create_purchase_order.json | 21 +++++ .../create_supplier/create_supplier.json | 22 ++++++ .../review_buying_settings.json | 21 +++++ .../setup_company/setup_company.json | 21 +++++ .../view_purchase_order_analysis.json | 23 ++++++ .../manufacturing_onboarding.json | 44 +++++++++++ .../create_bill_of_materials.json | 20 +++++ .../create_finished_goods.json | 21 +++++ .../create_operations/create_operations.json | 20 +++++ .../create_raw_materials.json | 21 +++++ .../create_work_order/create_work_order.json | 20 +++++ .../review_manufacturing_settings.json | 20 +++++ .../view_work_order_summary_report.json | 23 ++++++ .../projects_onboarding.json | 35 +++++++++ .../create_project/create_project.json | 20 +++++ .../create_tasks/create_tasks.json | 20 +++++ .../create_timesheet/create_timesheet.json | 20 +++++ .../view_project_summary.json | 23 ++++++ .../customer_form_tour.json | 42 ++++++++++ .../form_tour/sales_order/sales_order.json | 77 +++++++++++++++++++ .../selling_onboarding.json | 41 ++++++++++ .../stock_onboarding/stock_onboarding.json | 44 +++++++++++ .../create_customer/create_customer.json | 21 +++++ .../create_delivery_note.json | 20 +++++ .../create_item/create_item.json | 20 +++++ .../create_sales_invoice.json | 20 +++++ .../create_sales_order.json | 21 +++++ .../review_selling_settings.json | 20 +++++ .../setup_company/setup_company.json | 21 +++++ .../view_sales_order_analysis.json | 23 ++++++ .../view_stock_balance_report.json | 23 ++++++ .../stock_onboarding/stock_onboarding.json | 44 +++++++++++ .../create_delivery_note.json | 20 +++++ .../create_item/create_item.json | 20 +++++ .../create_purchase_receipt.json | 20 +++++ .../create_transfer_entry.json | 21 +++++ .../review_stock_settings.json | 20 +++++ .../setup_warehouse/setup_warehouse.json | 20 +++++ .../view_stock_balance_report.json | 23 ++++++ .../subcontracting_onboarding.json | 47 +++++++++++ .../create_bill_of_materials.json | 20 +++++ .../create_raw_materials.json | 21 +++++ .../create_service_item.json | 21 +++++ .../create_subcontracted_item.json | 21 +++++ .../create_subcontracting_order.json | 20 +++++ .../create_subcontracting_po.json | 21 +++++ .../learn_subcontracting.json | 20 +++++ erpnext/workspace_sidebar/accounts_setup.json | 14 +++- erpnext/workspace_sidebar/assets.json | 14 +++- erpnext/workspace_sidebar/buying.json | 3 +- .../workspace_sidebar/financial_reports.json | 3 +- erpnext/workspace_sidebar/invoicing.json | 17 +++- erpnext/workspace_sidebar/manufacturing.json | 3 +- erpnext/workspace_sidebar/payments.json | 3 +- erpnext/workspace_sidebar/projects.json | 14 +--- erpnext/workspace_sidebar/selling.json | 3 +- erpnext/workspace_sidebar/stock.json | 3 +- erpnext/workspace_sidebar/subcontracting.json | 36 ++++++++- erpnext/workspace_sidebar/taxes.json | 3 +- 78 files changed, 1815 insertions(+), 24 deletions(-) create mode 100644 erpnext/accounts/module_onboarding/accounting_onboarding/accounting_onboarding.json create mode 100644 erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json create mode 100644 erpnext/accounts/onboarding_step/create_payment_entry/create_payment_entry.json create mode 100644 erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json create mode 100644 erpnext/accounts/onboarding_step/review_accounts_settings/review_accounts_settings.json create mode 100644 erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json create mode 100644 erpnext/accounts/onboarding_step/view_balance_sheet/view_balance_sheet.json create mode 100644 erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json create mode 100644 erpnext/assets/onboarding_step/create_asset_category/create_asset_category.json create mode 100644 erpnext/assets/onboarding_step/create_asset_item/create_asset_item.json create mode 100644 erpnext/assets/onboarding_step/create_asset_location/create_asset_location.json create mode 100644 erpnext/assets/onboarding_step/create_existing_asset/create_existing_asset.json create mode 100644 erpnext/assets/onboarding_step/learn_asset/learn_asset.json create mode 100644 erpnext/assets/onboarding_step/view_balance_sheet/view_balance_sheet.json create mode 100644 erpnext/buying/form_tour/purchase_order/purchase_order.json create mode 100644 erpnext/buying/form_tour/supplier_form_tour/supplier_form_tour.json create mode 100644 erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json create mode 100644 erpnext/buying/onboarding_step/create_item/create_item.json create mode 100644 erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json create mode 100644 erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json create mode 100644 erpnext/buying/onboarding_step/create_supplier/create_supplier.json create mode 100644 erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json create mode 100644 erpnext/buying/onboarding_step/setup_company/setup_company.json create mode 100644 erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json create mode 100644 erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json create mode 100644 erpnext/manufacturing/onboarding_step/create_bill_of_materials/create_bill_of_materials.json create mode 100644 erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json create mode 100644 erpnext/manufacturing/onboarding_step/create_operations/create_operations.json create mode 100644 erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json create mode 100644 erpnext/manufacturing/onboarding_step/create_work_order/create_work_order.json create mode 100644 erpnext/manufacturing/onboarding_step/review_manufacturing_settings/review_manufacturing_settings.json create mode 100644 erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json create mode 100644 erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json create mode 100644 erpnext/projects/onboarding_step/create_project/create_project.json create mode 100644 erpnext/projects/onboarding_step/create_tasks/create_tasks.json create mode 100644 erpnext/projects/onboarding_step/create_timesheet/create_timesheet.json create mode 100644 erpnext/projects/onboarding_step/view_project_summary/view_project_summary.json create mode 100644 erpnext/selling/form_tour/customer_form_tour/customer_form_tour.json create mode 100644 erpnext/selling/form_tour/sales_order/sales_order.json create mode 100644 erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json create mode 100644 erpnext/selling/module_onboarding/stock_onboarding/stock_onboarding.json create mode 100644 erpnext/selling/onboarding_step/create_customer/create_customer.json create mode 100644 erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json create mode 100644 erpnext/selling/onboarding_step/create_item/create_item.json create mode 100644 erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json create mode 100644 erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json create mode 100644 erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json create mode 100644 erpnext/selling/onboarding_step/setup_company/setup_company.json create mode 100644 erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json create mode 100644 erpnext/selling/onboarding_step/view_stock_balance_report/view_stock_balance_report.json create mode 100644 erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json create mode 100644 erpnext/stock/onboarding_step/create_delivery_note/create_delivery_note.json create mode 100644 erpnext/stock/onboarding_step/create_item/create_item.json create mode 100644 erpnext/stock/onboarding_step/create_purchase_receipt/create_purchase_receipt.json create mode 100644 erpnext/stock/onboarding_step/create_transfer_entry/create_transfer_entry.json create mode 100644 erpnext/stock/onboarding_step/review_stock_settings/review_stock_settings.json create mode 100644 erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json create mode 100644 erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json create mode 100644 erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json create mode 100644 erpnext/subcontracting/onboarding_step/create_bill_of_materials/create_bill_of_materials.json create mode 100644 erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json create mode 100644 erpnext/subcontracting/onboarding_step/create_service_item/create_service_item.json create mode 100644 erpnext/subcontracting/onboarding_step/create_subcontracted_item/create_subcontracted_item.json create mode 100644 erpnext/subcontracting/onboarding_step/create_subcontracting_order/create_subcontracting_order.json create mode 100644 erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json create mode 100644 erpnext/subcontracting/onboarding_step/learn_subcontracting/learn_subcontracting.json diff --git a/erpnext/accounts/module_onboarding/accounting_onboarding/accounting_onboarding.json b/erpnext/accounts/module_onboarding/accounting_onboarding/accounting_onboarding.json new file mode 100644 index 00000000000..2893787e93b --- /dev/null +++ b/erpnext/accounts/module_onboarding/accounting_onboarding/accounting_onboarding.json @@ -0,0 +1,41 @@ +{ + "allow_roles": [ + { + "role": "Accounts Manager" + }, + { + "role": "Accounts User" + } + ], + "creation": "2026-02-22 18:26:42.015787", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 4, + "is_complete": 0, + "modified": "2026-02-23 22:51:34.267812", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounting Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Chart of Accounts" + }, + { + "step": "Setup Sales taxes" + }, + { + "step": "Create Sales Invoice" + }, + { + "step": "Create Payment Entry" + }, + { + "step": "View Balance Sheet" + }, + { + "step": "Review Accounts Settings" + } + ], + "title": "Accounting Onboarding" +} diff --git a/erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json b/erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json new file mode 100644 index 00000000000..b9759eb336b --- /dev/null +++ b/erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json @@ -0,0 +1,20 @@ +{ + "action": "Go to Page", + "action_label": "Configure Chart of Accounts", + "creation": "2026-02-22 18:28:15.401383", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:45.540780", + "modified_by": "Administrator", + "name": "Chart of Accounts", + "owner": "Administrator", + "path": "Tree/Account", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Chart of Accounts", + "validate_action": 1 +} diff --git a/erpnext/accounts/onboarding_step/create_payment_entry/create_payment_entry.json b/erpnext/accounts/onboarding_step/create_payment_entry/create_payment_entry.json new file mode 100644 index 00000000000..4bc723ab71a --- /dev/null +++ b/erpnext/accounts/onboarding_step/create_payment_entry/create_payment_entry.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Payment Entry", + "creation": "2026-02-23 19:22:12.005360", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:19:56.482245", + "modified_by": "Administrator", + "name": "Create Payment Entry", + "owner": "Administrator", + "reference_document": "Payment Entry", + "route_options": "{\n \"payment_type\": \"Receive\",\n \"party_type\": \"Customer\"\n}", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Payment Entry", + "validate_action": 1 +} diff --git a/erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json b/erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json new file mode 100644 index 00000000000..d00db0e71f9 --- /dev/null +++ b/erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Sales Invoice", + "creation": "2026-02-20 13:42:38.439574", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 2, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.931428", + "modified_by": "Administrator", + "name": "Create Sales Invoice", + "owner": "Administrator", + "reference_document": "Sales Invoice", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Sales Invoice", + "validate_action": 1 +} diff --git a/erpnext/accounts/onboarding_step/review_accounts_settings/review_accounts_settings.json b/erpnext/accounts/onboarding_step/review_accounts_settings/review_accounts_settings.json new file mode 100644 index 00000000000..cfadb487dee --- /dev/null +++ b/erpnext/accounts/onboarding_step/review_accounts_settings/review_accounts_settings.json @@ -0,0 +1,21 @@ +{ + "action": "Update Settings", + "action_label": "Review Accounts Settings", + "creation": "2026-02-23 19:27:06.055104", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.855407", + "modified_by": "Administrator", + "name": "Review Accounts Settings", + "owner": "Administrator", + "path": "desk/accounts-settings", + "reference_document": "Accounts Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Accounts Settings", + "validate_action": 0 +} diff --git a/erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json b/erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json new file mode 100644 index 00000000000..8e5ea84098f --- /dev/null +++ b/erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json @@ -0,0 +1,22 @@ +{ + "action": "Go to Page", + "action_label": "Setup Sales Taxes", + "creation": "2026-02-22 18:30:18.750391", + "docstatus": 0, + "doctype": "Onboarding Step", + "form_tour": "", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:42.373227", + "modified_by": "Administrator", + "name": "Setup Sales taxes", + "owner": "Administrator", + "path": "/desk/sales-taxes-and-charges-template", + "reference_document": "Sales Taxes and Charges Template", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Sales taxes", + "validate_action": 1 +} diff --git a/erpnext/accounts/onboarding_step/view_balance_sheet/view_balance_sheet.json b/erpnext/accounts/onboarding_step/view_balance_sheet/view_balance_sheet.json new file mode 100644 index 00000000000..e81c0ab2bf4 --- /dev/null +++ b/erpnext/accounts/onboarding_step/view_balance_sheet/view_balance_sheet.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Balance Sheet", + "creation": "2026-02-23 19:22:57.651194", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:39.178107", + "modified_by": "Administrator", + "name": "View Balance Sheet", + "owner": "Administrator", + "reference_report": "Balance Sheet", + "report_description": "View Balance Sheet", + "report_reference_doctype": "GL Entry", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Balance Sheet", + "validate_action": 1 +} diff --git a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json new file mode 100644 index 00000000000..fe4bac23091 --- /dev/null +++ b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json @@ -0,0 +1,44 @@ +{ + "allow_roles": [ + { + "role": "Accounts Manager" + }, + { + "role": "Accounts User" + }, + { + "role": "Quality Manager" + } + ], + "creation": "2026-02-23 20:56:50.917521", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-23 22:51:11.027665", + "modified_by": "Administrator", + "module": "Assets", + "name": "Asset Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Learn Asset" + }, + { + "step": "Create Asset Category" + }, + { + "step": "Create Asset Item" + }, + { + "step": "Create Asset Location" + }, + { + "step": "Create Existing Asset" + }, + { + "step": "View Balance Sheet" + } + ], + "title": "Assets Setup!" +} diff --git a/erpnext/assets/onboarding_step/create_asset_category/create_asset_category.json b/erpnext/assets/onboarding_step/create_asset_category/create_asset_category.json new file mode 100644 index 00000000000..adfa7f8555d --- /dev/null +++ b/erpnext/assets/onboarding_step/create_asset_category/create_asset_category.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Asset Category", + "creation": "2026-02-23 20:50:50.211884", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:50:50.211884", + "modified_by": "Administrator", + "name": "Create Asset Category", + "owner": "Administrator", + "reference_document": "Asset Category", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Asset Category", + "validate_action": 1 +} diff --git a/erpnext/assets/onboarding_step/create_asset_item/create_asset_item.json b/erpnext/assets/onboarding_step/create_asset_item/create_asset_item.json new file mode 100644 index 00000000000..91757b67001 --- /dev/null +++ b/erpnext/assets/onboarding_step/create_asset_item/create_asset_item.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Asset Item", + "creation": "2026-02-23 20:52:40.135614", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:31:53.211343", + "modified_by": "Administrator", + "name": "Create Asset Item", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"is_fixed_asset\": 1,\n \"is_stock_item\": 0\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Asset Item", + "validate_action": 1 +} diff --git a/erpnext/assets/onboarding_step/create_asset_location/create_asset_location.json b/erpnext/assets/onboarding_step/create_asset_location/create_asset_location.json new file mode 100644 index 00000000000..015a0ff325a --- /dev/null +++ b/erpnext/assets/onboarding_step/create_asset_location/create_asset_location.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Asset Location", + "creation": "2026-02-23 20:53:07.450876", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:53:07.450876", + "modified_by": "Administrator", + "name": "Create Asset Location", + "owner": "Administrator", + "reference_document": "Location", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Asset Location", + "validate_action": 1 +} diff --git a/erpnext/assets/onboarding_step/create_existing_asset/create_existing_asset.json b/erpnext/assets/onboarding_step/create_existing_asset/create_existing_asset.json new file mode 100644 index 00000000000..8d6eb30ba53 --- /dev/null +++ b/erpnext/assets/onboarding_step/create_existing_asset/create_existing_asset.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Existing Asset", + "creation": "2026-02-23 20:54:25.961869", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 3, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:31:48.789836", + "modified_by": "Administrator", + "name": "Create Existing Asset", + "owner": "Administrator", + "reference_document": "Asset", + "route_options": "{\n \"asset_type\": \"Existing Asset\"\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Existing Asset", + "validate_action": 1 +} diff --git a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json new file mode 100644 index 00000000000..54377ef0ac2 --- /dev/null +++ b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json @@ -0,0 +1,20 @@ +{ + "action": "View Docs", + "action_label": "Learn Asset", + "creation": "2026-02-23 21:00:47.254648", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:25.734547", + "modified_by": "Administrator", + "name": "Learn Asset", + "owner": "Administrator", + "path": "https://docs.frappe.io/erpnext/assets/setup/asset-category", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Learn Asset", + "validate_action": 1 +} diff --git a/erpnext/assets/onboarding_step/view_balance_sheet/view_balance_sheet.json b/erpnext/assets/onboarding_step/view_balance_sheet/view_balance_sheet.json new file mode 100644 index 00000000000..e81c0ab2bf4 --- /dev/null +++ b/erpnext/assets/onboarding_step/view_balance_sheet/view_balance_sheet.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Balance Sheet", + "creation": "2026-02-23 19:22:57.651194", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:39.178107", + "modified_by": "Administrator", + "name": "View Balance Sheet", + "owner": "Administrator", + "reference_report": "Balance Sheet", + "report_description": "View Balance Sheet", + "report_reference_doctype": "GL Entry", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Balance Sheet", + "validate_action": 1 +} diff --git a/erpnext/buying/form_tour/purchase_order/purchase_order.json b/erpnext/buying/form_tour/purchase_order/purchase_order.json new file mode 100644 index 00000000000..9b9cf1d899c --- /dev/null +++ b/erpnext/buying/form_tour/purchase_order/purchase_order.json @@ -0,0 +1,76 @@ +{ + "creation": "2026-02-22 17:08:01.825015", + "docstatus": 0, + "doctype": "Form Tour", + "first_document": 0, + "idx": 0, + "include_name_field": 0, + "is_standard": 1, + "list_name": "List", + "modified": "2026-02-22 18:25:11.421464", + "modified_by": "Administrator", + "module": "Buying", + "name": "Purchase Order", + "new_document_form": 0, + "owner": "Administrator", + "reference_doctype": "Purchase Order", + "report_name": "", + "save_on_complete": 1, + "steps": [ + { + "description": "Select a Supplier", + "fieldname": "supplier", + "fieldtype": "Link", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Supplier", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Right", + "title": "Supplier", + "ui_tour": 0 + }, + { + "description": "Set the \"Required By\" date for the materials. This sets the \"Required By\" date for all the items.\n", + "fieldname": "schedule_date", + "fieldtype": "Date", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Required By", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Top Right", + "title": "Required By", + "ui_tour": 0 + }, + { + "description": "Items to be purchased can be added here.", + "fieldname": "items", + "fieldtype": "Table", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Items", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Bottom", + "title": "Items Table", + "ui_tour": 0 + } + ], + "title": "Purchase Order", + "track_steps": 0, + "ui_tour": 0, + "view_name": "Workspaces" +} diff --git a/erpnext/buying/form_tour/supplier_form_tour/supplier_form_tour.json b/erpnext/buying/form_tour/supplier_form_tour/supplier_form_tour.json new file mode 100644 index 00000000000..05916bc73c7 --- /dev/null +++ b/erpnext/buying/form_tour/supplier_form_tour/supplier_form_tour.json @@ -0,0 +1,42 @@ +{ + "creation": "2026-02-22 16:46:17.299107", + "docstatus": 0, + "doctype": "Form Tour", + "first_document": 0, + "idx": 0, + "include_name_field": 0, + "is_standard": 1, + "list_name": "List", + "modified": "2026-02-22 16:46:17.299107", + "modified_by": "Administrator", + "module": "Buying", + "name": "Supplier Form Tour", + "new_document_form": 0, + "owner": "Administrator", + "reference_doctype": "Supplier", + "report_name": "", + "save_on_complete": 1, + "steps": [ + { + "description": "Enter the Full Name of the Supplier", + "fieldname": "supplier_name", + "fieldtype": "Data", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Supplier Name", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Left", + "title": "Full Name", + "ui_tour": 0 + } + ], + "title": "Supplier Form Tour", + "track_steps": 0, + "ui_tour": 0, + "view_name": "Workspaces" +} diff --git a/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json new file mode 100644 index 00000000000..080cadf8163 --- /dev/null +++ b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json @@ -0,0 +1,41 @@ +{ + "allow_roles": [ + { + "role": "Purchase Manager" + }, + { + "role": "Purchase User" + } + ], + "creation": "2026-02-19 10:53:58.761773", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-23 22:51:40.644920", + "modified_by": "Administrator", + "module": "Buying", + "name": "Buying Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Create Supplier" + }, + { + "step": "Create Item" + }, + { + "step": "Create Purchase Order" + }, + { + "step": "Create Purchase Invoice" + }, + { + "step": "View Purchase Order Analysis" + }, + { + "step": "Review Buying Settings" + } + ], + "title": "Buying Setup! " +} diff --git a/erpnext/buying/onboarding_step/create_item/create_item.json b/erpnext/buying/onboarding_step/create_item/create_item.json new file mode 100644 index 00000000000..eb917d65b4f --- /dev/null +++ b/erpnext/buying/onboarding_step/create_item/create_item.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Item", + "creation": "2026-02-19 12:38:40.865013", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 7, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:30:37.698459", + "modified_by": "Administrator", + "name": "Create Item", + "owner": "Administrator", + "reference_document": "Item", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Item", + "validate_action": 1 +} diff --git a/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json b/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json new file mode 100644 index 00000000000..8c35d155793 --- /dev/null +++ b/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Purchase Invoice", + "creation": "2026-02-19 12:38:14.868162", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 5, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:26:00.223899", + "modified_by": "Administrator", + "name": "Create Purchase Invoice", + "owner": "Administrator", + "reference_document": "Purchase Invoice", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Purchase Invoice", + "validate_action": 1 +} diff --git a/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json new file mode 100644 index 00000000000..307a7d74546 --- /dev/null +++ b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Purchase Order", + "creation": "2026-02-19 12:13:44.068135", + "docstatus": 0, + "doctype": "Onboarding Step", + "form_tour": "Purchase Order", + "idx": 2, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.891958", + "modified_by": "Administrator", + "name": "Create Purchase Order", + "owner": "Administrator", + "reference_document": "Purchase Order", + "show_form_tour": 1, + "show_full_form": 1, + "title": "Create Purchase Order", + "validate_action": 1 +} diff --git a/erpnext/buying/onboarding_step/create_supplier/create_supplier.json b/erpnext/buying/onboarding_step/create_supplier/create_supplier.json new file mode 100644 index 00000000000..580fefedf16 --- /dev/null +++ b/erpnext/buying/onboarding_step/create_supplier/create_supplier.json @@ -0,0 +1,22 @@ +{ + "action": "Create Entry", + "action_label": "Create supplier", + "creation": "2026-02-19 10:53:56.936107", + "description": "", + "docstatus": 0, + "doctype": "Onboarding Step", + "form_tour": "Supplier Form Tour", + "idx": 2, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.903633", + "modified_by": "Administrator", + "name": "Create Supplier", + "owner": "Administrator", + "reference_document": "Supplier", + "show_form_tour": 1, + "show_full_form": 1, + "title": "Create Supplier", + "validate_action": 1 +} diff --git a/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json new file mode 100644 index 00000000000..c51ed7d7bb6 --- /dev/null +++ b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json @@ -0,0 +1,21 @@ +{ + "action": "Update Settings", + "action_label": "Review Buying Settings", + "creation": "2026-02-23 20:27:23.664752", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.845870", + "modified_by": "Administrator", + "name": "Review Buying Settings", + "owner": "Administrator", + "path": "desk/buying-settings", + "reference_document": "Buying Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Buying Settings", + "validate_action": 0 +} diff --git a/erpnext/buying/onboarding_step/setup_company/setup_company.json b/erpnext/buying/onboarding_step/setup_company/setup_company.json new file mode 100644 index 00000000000..89ae9a52553 --- /dev/null +++ b/erpnext/buying/onboarding_step/setup_company/setup_company.json @@ -0,0 +1,21 @@ +{ + "action": "Go to Page", + "action_label": "Set up company", + "creation": "2026-02-20 11:12:50.373049", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-22 16:44:20.499954", + "modified_by": "Administrator", + "name": "Setup Company", + "owner": "Administrator", + "path": "company", + "reference_document": "Company", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Company", + "validate_action": 1 +} diff --git a/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json b/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json new file mode 100644 index 00000000000..656b5c1fb44 --- /dev/null +++ b/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Purchase Order Analysis", + "creation": "2026-02-23 20:26:29.245112", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:35.794807", + "modified_by": "Administrator", + "name": "View Purchase Order Analysis", + "owner": "Administrator", + "reference_report": "Purchase Order Analysis", + "report_description": "View Purchase Order Analysis", + "report_reference_doctype": "Purchase Order", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Purchase Order Analysis", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json b/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json new file mode 100644 index 00000000000..613b855aee4 --- /dev/null +++ b/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json @@ -0,0 +1,44 @@ +{ + "allow_roles": [ + { + "role": "Manufacturing Manager" + }, + { + "role": "Manufacturing User" + } + ], + "creation": "2026-02-20 13:31:02.066000", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-23 22:51:27.390568", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "Manufacturing Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Create Raw Materials" + }, + { + "step": "Create Finished Goods" + }, + { + "step": "Create Operations" + }, + { + "step": "Create Bill of Materials" + }, + { + "step": "Create Work Order" + }, + { + "step": "View Work Order Summary Report" + }, + { + "step": "Review Manufacturing Settings" + } + ], + "title": "Manufacturing Setup!" +} diff --git a/erpnext/manufacturing/onboarding_step/create_bill_of_materials/create_bill_of_materials.json b/erpnext/manufacturing/onboarding_step/create_bill_of_materials/create_bill_of_materials.json new file mode 100644 index 00000000000..5b0658d1dfe --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/create_bill_of_materials/create_bill_of_materials.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Bill of Materials", + "creation": "2026-02-20 13:31:41.740588", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:38:57.652419", + "modified_by": "Administrator", + "name": "Create Bill of Materials", + "owner": "Administrator", + "reference_document": "BOM", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Bill of Materials", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json b/erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json new file mode 100644 index 00000000000..40a0f5557f3 --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Finished Good", + "creation": "2026-02-23 20:34:23.487974", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 2, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:46:41.661631", + "modified_by": "Administrator", + "name": "Create Finished Goods", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"item_group\": \"Products\"\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Finished Goods", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/onboarding_step/create_operations/create_operations.json b/erpnext/manufacturing/onboarding_step/create_operations/create_operations.json new file mode 100644 index 00000000000..3118781253f --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/create_operations/create_operations.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Operation", + "creation": "2026-02-23 20:37:18.796925", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:46:20.181836", + "modified_by": "Administrator", + "name": "Create Operations", + "owner": "Administrator", + "reference_document": "Operation", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Operations", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json b/erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json new file mode 100644 index 00000000000..79f1fa49830 --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Raw Material", + "creation": "2026-02-23 20:34:00.158852", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:45:51.319162", + "modified_by": "Administrator", + "name": "Create Raw Materials", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"item_group\": \"Raw Material\"\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Raw Materials", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/onboarding_step/create_work_order/create_work_order.json b/erpnext/manufacturing/onboarding_step/create_work_order/create_work_order.json new file mode 100644 index 00000000000..56492a7c030 --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/create_work_order/create_work_order.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Work Order", + "creation": "2026-02-20 13:32:09.873246", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:39:05.143316", + "modified_by": "Administrator", + "name": "Create Work Order", + "owner": "Administrator", + "reference_document": "Work Order", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Work Order", + "validate_action": 1 +} diff --git a/erpnext/manufacturing/onboarding_step/review_manufacturing_settings/review_manufacturing_settings.json b/erpnext/manufacturing/onboarding_step/review_manufacturing_settings/review_manufacturing_settings.json new file mode 100644 index 00000000000..a6663bf9365 --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/review_manufacturing_settings/review_manufacturing_settings.json @@ -0,0 +1,20 @@ +{ + "action": "Update Settings", + "action_label": "Review Manufacturing Settings", + "creation": "2026-02-23 20:40:09.799067", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.834966", + "modified_by": "Administrator", + "name": "Review Manufacturing Settings", + "owner": "Administrator", + "reference_document": "Manufacturing Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Manufacturing Settings", + "validate_action": 0 +} diff --git a/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json b/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json new file mode 100644 index 00000000000..62875c8904f --- /dev/null +++ b/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Work Order Summary", + "creation": "2026-02-20 13:35:44.259865", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:32.658354", + "modified_by": "Administrator", + "name": "View Work Order Summary Report", + "owner": "Administrator", + "reference_report": "Work Order Summary", + "report_description": "Work Order Summary Report", + "report_reference_doctype": "Work Order", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Work Order Summary Report", + "validate_action": 1 +} diff --git a/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json b/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json new file mode 100644 index 00000000000..64cc95e1b2d --- /dev/null +++ b/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json @@ -0,0 +1,35 @@ +{ + "allow_roles": [ + { + "role": "Projects Manager" + }, + { + "role": "Projects User" + } + ], + "creation": "2026-02-23 22:48:31.160647", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-23 22:50:58.003699", + "modified_by": "Administrator", + "module": "Projects", + "name": "Projects Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Create Project" + }, + { + "step": "Create Tasks" + }, + { + "step": "Create Timesheet" + }, + { + "step": "View Project Summary" + } + ], + "title": "Projects Setup!" +} diff --git a/erpnext/projects/onboarding_step/create_project/create_project.json b/erpnext/projects/onboarding_step/create_project/create_project.json new file mode 100644 index 00000000000..45dd6f3b56b --- /dev/null +++ b/erpnext/projects/onboarding_step/create_project/create_project.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Project", + "creation": "2026-02-23 22:45:12.002328", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:45:16.888863", + "modified_by": "Administrator", + "name": "Create Project", + "owner": "Administrator", + "reference_document": "Project", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Project", + "validate_action": 1 +} diff --git a/erpnext/projects/onboarding_step/create_tasks/create_tasks.json b/erpnext/projects/onboarding_step/create_tasks/create_tasks.json new file mode 100644 index 00000000000..a7ac4beb752 --- /dev/null +++ b/erpnext/projects/onboarding_step/create_tasks/create_tasks.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Task", + "creation": "2026-02-23 22:45:36.152388", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:45:44.116610", + "modified_by": "Administrator", + "name": "Create Tasks", + "owner": "Administrator", + "reference_document": "Task", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Tasks", + "validate_action": 1 +} diff --git a/erpnext/projects/onboarding_step/create_timesheet/create_timesheet.json b/erpnext/projects/onboarding_step/create_timesheet/create_timesheet.json new file mode 100644 index 00000000000..b7fc6de2c6f --- /dev/null +++ b/erpnext/projects/onboarding_step/create_timesheet/create_timesheet.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Timesheet", + "creation": "2026-02-23 22:47:00.120262", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:47:00.120262", + "modified_by": "Administrator", + "name": "Create Timesheet", + "owner": "Administrator", + "reference_document": "Timesheet", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Timesheet", + "validate_action": 1 +} diff --git a/erpnext/projects/onboarding_step/view_project_summary/view_project_summary.json b/erpnext/projects/onboarding_step/view_project_summary/view_project_summary.json new file mode 100644 index 00000000000..c41c014c8b4 --- /dev/null +++ b/erpnext/projects/onboarding_step/view_project_summary/view_project_summary.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Project Summary", + "creation": "2026-02-23 22:47:20.530482", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:50:38.294138", + "modified_by": "Administrator", + "name": "View Project Summary", + "owner": "Administrator", + "reference_report": "Project Summary", + "report_description": "View Project Summary", + "report_reference_doctype": "Project", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Project Summary", + "validate_action": 1 +} diff --git a/erpnext/selling/form_tour/customer_form_tour/customer_form_tour.json b/erpnext/selling/form_tour/customer_form_tour/customer_form_tour.json new file mode 100644 index 00000000000..0558837f3e9 --- /dev/null +++ b/erpnext/selling/form_tour/customer_form_tour/customer_form_tour.json @@ -0,0 +1,42 @@ +{ + "creation": "2026-02-21 08:42:14.071639", + "docstatus": 0, + "doctype": "Form Tour", + "first_document": 0, + "idx": 0, + "include_name_field": 0, + "is_standard": 1, + "list_name": "List", + "modified": "2026-02-21 08:42:14.071639", + "modified_by": "Administrator", + "module": "Selling", + "name": "Customer Form Tour", + "new_document_form": 0, + "owner": "Administrator", + "reference_doctype": "Customer", + "report_name": "", + "save_on_complete": 1, + "steps": [ + { + "description": "Enter the Full Name of the Customer", + "fieldname": "customer_name", + "fieldtype": "Data", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Customer Name", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Left", + "title": "Full Name", + "ui_tour": 0 + } + ], + "title": "Customer Form Tour", + "track_steps": 0, + "ui_tour": 0, + "view_name": "Workspaces" +} diff --git a/erpnext/selling/form_tour/sales_order/sales_order.json b/erpnext/selling/form_tour/sales_order/sales_order.json new file mode 100644 index 00000000000..70c8ebd6ba7 --- /dev/null +++ b/erpnext/selling/form_tour/sales_order/sales_order.json @@ -0,0 +1,77 @@ +{ + "creation": "2026-02-22 17:13:52.268911", + "docstatus": 0, + "doctype": "Form Tour", + "first_document": 0, + "idx": 0, + "include_name_field": 0, + "is_standard": 1, + "list_name": "List", + "modified": "2026-02-22 18:24:10.811411", + "modified_by": "Administrator", + "module": "Selling", + "name": "Sales Order", + "new_document_form": 0, + "owner": "Administrator", + "reference_doctype": "Sales Order", + "report_name": "", + "save_on_complete": 1, + "steps": [ + { + "description": "Select a customer.", + "fieldname": "customer", + "fieldtype": "Link", + "has_next_condition": 1, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Customer", + "modal_trigger": 0, + "next_on_click": 0, + "next_step_condition": "customer", + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Right", + "title": "Select Customer", + "ui_tour": 0 + }, + { + "description": "Set the \"Delivery Date\" for the items. This sets the \"Delivery Date\" for all the line items.", + "fieldname": "delivery_date", + "fieldtype": "Date", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Delivery Date", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Top Right", + "title": "Select Delivery Date", + "ui_tour": 0 + }, + { + "description": "You can add items here.", + "fieldname": "items", + "fieldtype": "Table", + "has_next_condition": 0, + "hide_buttons": 0, + "is_table_field": 0, + "label": "Items", + "modal_trigger": 0, + "next_on_click": 0, + "offset_x": 0, + "offset_y": 0, + "popover_element": 0, + "position": "Bottom", + "title": "List of items", + "ui_tour": 0 + } + ], + "title": "Sales Order", + "track_steps": 0, + "ui_tour": 0, + "view_name": "Workspaces" +} diff --git a/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json new file mode 100644 index 00000000000..4fe19815e2c --- /dev/null +++ b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json @@ -0,0 +1,41 @@ +{ + "allow_roles": [ + { + "role": "Sales Manager" + }, + { + "role": "Sales User" + } + ], + "creation": "2026-02-20 13:37:52.144254", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 1, + "is_complete": 0, + "modified": "2026-02-23 22:51:47.297028", + "modified_by": "Administrator", + "module": "Selling", + "name": "Selling Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Create Customer" + }, + { + "step": "Create Item" + }, + { + "step": "Create Sales Order" + }, + { + "step": "Create Sales Invoice" + }, + { + "step": "View Sales Order Analysis" + }, + { + "step": "Review Selling Settings" + } + ], + "title": "Selling Setup!" +} diff --git a/erpnext/selling/module_onboarding/stock_onboarding/stock_onboarding.json b/erpnext/selling/module_onboarding/stock_onboarding/stock_onboarding.json new file mode 100644 index 00000000000..5900d57af5e --- /dev/null +++ b/erpnext/selling/module_onboarding/stock_onboarding/stock_onboarding.json @@ -0,0 +1,44 @@ +{ + "allow_roles": [ + { + "role": "Stock Manager" + }, + { + "role": "Stock User" + } + ], + "creation": "2026-02-20 13:52:55.989409", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-20 13:53:46.461261", + "modified_by": "Administrator", + "module": "Selling", + "name": "Stock Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Setup Warehouse" + }, + { + "step": "Create Item" + }, + { + "step": "Create Purchase Receipt" + }, + { + "step": "Create Delivery Note" + }, + { + "step": "View Stock Balance Report" + }, + { + "step": "View Stock Ledger Report" + }, + { + "step": "Create Stock Entry" + } + ], + "title": "Onboarding for Stock!" +} diff --git a/erpnext/selling/onboarding_step/create_customer/create_customer.json b/erpnext/selling/onboarding_step/create_customer/create_customer.json new file mode 100644 index 00000000000..42c4ff97290 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_customer/create_customer.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Customer", + "creation": "2026-02-20 13:38:17.043231", + "docstatus": 0, + "doctype": "Onboarding Step", + "form_tour": "Customer Form Tour", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 19:27:53.808219", + "modified_by": "Administrator", + "name": "Create Customer", + "owner": "Administrator", + "reference_document": "Customer", + "show_form_tour": 1, + "show_full_form": 1, + "title": "Create Customer", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json b/erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json new file mode 100644 index 00000000000..0357d08ec69 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create delivery note", + "creation": "2026-02-20 13:42:13.571273", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 3, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 17:38:50.095742", + "modified_by": "Administrator", + "name": "Create Delivery Note", + "owner": "Administrator", + "reference_document": "Delivery Note", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Delivery Note", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/create_item/create_item.json b/erpnext/selling/onboarding_step/create_item/create_item.json new file mode 100644 index 00000000000..eb917d65b4f --- /dev/null +++ b/erpnext/selling/onboarding_step/create_item/create_item.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Item", + "creation": "2026-02-19 12:38:40.865013", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 7, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:30:37.698459", + "modified_by": "Administrator", + "name": "Create Item", + "owner": "Administrator", + "reference_document": "Item", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Item", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json b/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json new file mode 100644 index 00000000000..d00db0e71f9 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Sales Invoice", + "creation": "2026-02-20 13:42:38.439574", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 2, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:16:40.931428", + "modified_by": "Administrator", + "name": "Create Sales Invoice", + "owner": "Administrator", + "reference_document": "Sales Invoice", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Sales Invoice", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json b/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json new file mode 100644 index 00000000000..77c81c0cc71 --- /dev/null +++ b/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Sales Order", + "creation": "2026-02-20 13:41:48.164961", + "docstatus": 0, + "doctype": "Onboarding Step", + "form_tour": "Sales Order", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:22:32.252346", + "modified_by": "Administrator", + "name": "Create Sales Order", + "owner": "Administrator", + "reference_document": "Sales Order", + "show_form_tour": 1, + "show_full_form": 1, + "title": "Create Sales Order", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json b/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json new file mode 100644 index 00000000000..f8f86321b4d --- /dev/null +++ b/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json @@ -0,0 +1,20 @@ +{ + "action": "Update Settings", + "action_label": "Review Selling Settings", + "creation": "2026-02-23 20:23:57.678471", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-23 20:41:50.847375", + "modified_by": "Administrator", + "name": "Review Selling Settings", + "owner": "Administrator", + "reference_document": "Selling Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Selling Settings", + "validate_action": 0 +} diff --git a/erpnext/selling/onboarding_step/setup_company/setup_company.json b/erpnext/selling/onboarding_step/setup_company/setup_company.json new file mode 100644 index 00000000000..98c2d9fa693 --- /dev/null +++ b/erpnext/selling/onboarding_step/setup_company/setup_company.json @@ -0,0 +1,21 @@ +{ + "action": "Go to Page", + "action_label": "Setup Company", + "creation": "2026-02-20 11:12:50.373049", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-20 11:37:46.922137", + "modified_by": "Administrator", + "name": "Setup Company", + "owner": "Administrator", + "path": "company", + "reference_document": "Company", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Company", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json b/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json new file mode 100644 index 00000000000..9763e3c18d9 --- /dev/null +++ b/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Sales Order Analysis", + "creation": "2026-02-23 20:23:26.469799", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:22.792553", + "modified_by": "Administrator", + "name": "View Sales Order Analysis", + "owner": "Administrator", + "reference_report": "Sales Order Analysis", + "report_description": "View Sales Order Analysis", + "report_reference_doctype": "Sales Order", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Sales Order Analysis", + "validate_action": 1 +} diff --git a/erpnext/selling/onboarding_step/view_stock_balance_report/view_stock_balance_report.json b/erpnext/selling/onboarding_step/view_stock_balance_report/view_stock_balance_report.json new file mode 100644 index 00000000000..3269a2b5ae2 --- /dev/null +++ b/erpnext/selling/onboarding_step/view_stock_balance_report/view_stock_balance_report.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Stock Balance Report", + "creation": "2026-02-20 13:52:54.499787", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-20 13:52:54.499787", + "modified_by": "Administrator", + "name": "View Stock Balance Report", + "owner": "Administrator", + "reference_report": "Stock Balance", + "report_description": "View Stock Balance Report", + "report_reference_doctype": "Stock Ledger Entry", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Stock Balance Report", + "validate_action": 1 +} diff --git a/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json b/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json new file mode 100644 index 00000000000..dbc838eb83c --- /dev/null +++ b/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json @@ -0,0 +1,44 @@ +{ + "allow_roles": [ + { + "role": "Stock Manager" + }, + { + "role": "Stock User" + } + ], + "creation": "2026-02-20 13:52:55.989409", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-23 22:51:17.460108", + "modified_by": "Administrator", + "module": "Stock", + "name": "Stock Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Setup Warehouse" + }, + { + "step": "Create Item" + }, + { + "step": "Create Purchase Receipt" + }, + { + "step": "Create Transfer Entry" + }, + { + "step": "Create Delivery Note" + }, + { + "step": "View Stock Balance Report" + }, + { + "step": "Review Stock Settings" + } + ], + "title": "Stock Setup!" +} diff --git a/erpnext/stock/onboarding_step/create_delivery_note/create_delivery_note.json b/erpnext/stock/onboarding_step/create_delivery_note/create_delivery_note.json new file mode 100644 index 00000000000..95ea0b623f6 --- /dev/null +++ b/erpnext/stock/onboarding_step/create_delivery_note/create_delivery_note.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Delivery Note", + "creation": "2026-02-20 13:42:13.571273", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 4, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:46:26.502448", + "modified_by": "Administrator", + "name": "Create Delivery Note", + "owner": "Administrator", + "reference_document": "Delivery Note", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Delivery Note", + "validate_action": 1 +} diff --git a/erpnext/stock/onboarding_step/create_item/create_item.json b/erpnext/stock/onboarding_step/create_item/create_item.json new file mode 100644 index 00000000000..eb917d65b4f --- /dev/null +++ b/erpnext/stock/onboarding_step/create_item/create_item.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Item", + "creation": "2026-02-19 12:38:40.865013", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 7, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:30:37.698459", + "modified_by": "Administrator", + "name": "Create Item", + "owner": "Administrator", + "reference_document": "Item", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Item", + "validate_action": 1 +} diff --git a/erpnext/stock/onboarding_step/create_purchase_receipt/create_purchase_receipt.json b/erpnext/stock/onboarding_step/create_purchase_receipt/create_purchase_receipt.json new file mode 100644 index 00000000000..a32643bef18 --- /dev/null +++ b/erpnext/stock/onboarding_step/create_purchase_receipt/create_purchase_receipt.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Purchase Receipt", + "creation": "2026-02-20 11:45:17.070361", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 8, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:46:16.048231", + "modified_by": "Administrator", + "name": "Create Purchase Receipt", + "owner": "Administrator", + "reference_document": "Purchase Receipt", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Purchase Receipt", + "validate_action": 1 +} diff --git a/erpnext/stock/onboarding_step/create_transfer_entry/create_transfer_entry.json b/erpnext/stock/onboarding_step/create_transfer_entry/create_transfer_entry.json new file mode 100644 index 00000000000..75098f55802 --- /dev/null +++ b/erpnext/stock/onboarding_step/create_transfer_entry/create_transfer_entry.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Transfer Entry", + "creation": "2026-02-23 20:46:00.481014", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:27:39.024468", + "modified_by": "Administrator", + "name": "Create Transfer Entry", + "owner": "Administrator", + "reference_document": "Stock Entry", + "route_options": "{\n \"purpose\": \"Material Transfer\",\n \"stock_entry_type\": \"Material Transfer\"\n}", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Transfer Entry", + "validate_action": 1 +} diff --git a/erpnext/stock/onboarding_step/review_stock_settings/review_stock_settings.json b/erpnext/stock/onboarding_step/review_stock_settings/review_stock_settings.json new file mode 100644 index 00000000000..53a01b72170 --- /dev/null +++ b/erpnext/stock/onboarding_step/review_stock_settings/review_stock_settings.json @@ -0,0 +1,20 @@ +{ + "action": "Update Settings", + "action_label": "Review Stock Settings", + "creation": "2026-02-23 20:47:10.585461", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-23 20:47:10.585461", + "modified_by": "Administrator", + "name": "Review Stock Settings", + "owner": "Administrator", + "reference_document": "Stock Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review Stock Settings", + "validate_action": 0 +} diff --git a/erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json b/erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json new file mode 100644 index 00000000000..e40de5cb24c --- /dev/null +++ b/erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json @@ -0,0 +1,20 @@ +{ + "action": "Go to Page", + "action_label": "Create Warehouses", + "creation": "2026-02-20 13:51:56.762299", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 3, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:19.352448", + "modified_by": "Administrator", + "name": "Setup Warehouse", + "owner": "Administrator", + "path": "Tree/Warehouse", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Warehouse", + "validate_action": 1 +} diff --git a/erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json b/erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json new file mode 100644 index 00000000000..a91844b34fc --- /dev/null +++ b/erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json @@ -0,0 +1,23 @@ +{ + "action": "View Report", + "action_label": "View Stock Balance", + "creation": "2026-02-20 13:52:54.499787", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:15.256551", + "modified_by": "Administrator", + "name": "View Stock Balance Report", + "owner": "Administrator", + "reference_report": "Stock Balance", + "report_description": "View Stock Balance Report", + "report_reference_doctype": "Stock Ledger Entry", + "report_type": "Script Report", + "show_form_tour": 0, + "show_full_form": 0, + "title": "View Stock Balance Report", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json b/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json new file mode 100644 index 00000000000..afd9160103b --- /dev/null +++ b/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json @@ -0,0 +1,47 @@ +{ + "allow_roles": [ + { + "role": "Purchase Manager" + }, + { + "role": "Purchase User" + }, + { + "role": "Purchase Master Manager" + } + ], + "creation": "2026-02-23 22:35:59.372486", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 1, + "is_complete": 0, + "modified": "2026-02-23 22:51:04.595547", + "modified_by": "Administrator", + "module": "Subcontracting", + "name": "Subcontracting Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Learn Subcontracting" + }, + { + "step": "Create Service Item" + }, + { + "step": "Create Subcontracted Item" + }, + { + "step": "Create Raw Materials" + }, + { + "step": "Create Bill of Materials" + }, + { + "step": "Create Subcontracting PO" + }, + { + "step": "Create Subcontracting Order" + } + ], + "title": "Subcontracting Setup!" +} diff --git a/erpnext/subcontracting/onboarding_step/create_bill_of_materials/create_bill_of_materials.json b/erpnext/subcontracting/onboarding_step/create_bill_of_materials/create_bill_of_materials.json new file mode 100644 index 00000000000..5b0658d1dfe --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_bill_of_materials/create_bill_of_materials.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Bill of Materials", + "creation": "2026-02-20 13:31:41.740588", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 20:38:57.652419", + "modified_by": "Administrator", + "name": "Create Bill of Materials", + "owner": "Administrator", + "reference_document": "BOM", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Bill of Materials", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json b/erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json new file mode 100644 index 00000000000..79f1fa49830 --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Raw Material", + "creation": "2026-02-23 20:34:00.158852", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:45:51.319162", + "modified_by": "Administrator", + "name": "Create Raw Materials", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"item_group\": \"Raw Material\"\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Raw Materials", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/create_service_item/create_service_item.json b/erpnext/subcontracting/onboarding_step/create_service_item/create_service_item.json new file mode 100644 index 00000000000..3737669dfd1 --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_service_item/create_service_item.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Service Item", + "creation": "2026-02-23 22:29:22.864871", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:31:09.968918", + "modified_by": "Administrator", + "name": "Create Service Item", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"is_stock_item\": 0\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Service Item", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/create_subcontracted_item/create_subcontracted_item.json b/erpnext/subcontracting/onboarding_step/create_subcontracted_item/create_subcontracted_item.json new file mode 100644 index 00000000000..bb91259e2b3 --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_subcontracted_item/create_subcontracted_item.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Subcontracted Item", + "creation": "2026-02-23 22:29:55.407745", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:31:05.640971", + "modified_by": "Administrator", + "name": "Create Subcontracted Item", + "owner": "Administrator", + "reference_document": "Item", + "route_options": "{\n \"is_stock_item\": 1,\n \"is_sub_contracted_item\": 1\n}", + "show_form_tour": 0, + "show_full_form": 1, + "title": "Create Subcontracted Item", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/create_subcontracting_order/create_subcontracting_order.json b/erpnext/subcontracting/onboarding_step/create_subcontracting_order/create_subcontracting_order.json new file mode 100644 index 00000000000..e2421a28901 --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_subcontracting_order/create_subcontracting_order.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Create Subcontracting Order", + "creation": "2026-02-23 22:34:00.983907", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:34:00.983907", + "modified_by": "Administrator", + "name": "Create Subcontracting Order", + "owner": "Administrator", + "reference_document": "Subcontracting Order", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Subcontracting Order", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json b/erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json new file mode 100644 index 00000000000..617b72678be --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json @@ -0,0 +1,21 @@ +{ + "action": "Create Entry", + "action_label": "Create Subcontracting Purchase Order", + "creation": "2026-02-23 22:41:57.634121", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:41:57.634121", + "modified_by": "Administrator", + "name": "Create Subcontracting PO", + "owner": "Administrator", + "reference_document": "Purchase Order", + "route_options": "{\n \"is_subcontracted\": 1\n}", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Create Subcontracting PO", + "validate_action": 1 +} diff --git a/erpnext/subcontracting/onboarding_step/learn_subcontracting/learn_subcontracting.json b/erpnext/subcontracting/onboarding_step/learn_subcontracting/learn_subcontracting.json new file mode 100644 index 00000000000..40099dc6b64 --- /dev/null +++ b/erpnext/subcontracting/onboarding_step/learn_subcontracting/learn_subcontracting.json @@ -0,0 +1,20 @@ +{ + "action": "View Docs", + "action_label": "Learn Subcontracting", + "creation": "2026-02-23 22:28:56.357254", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 22:44:10.161713", + "modified_by": "Administrator", + "name": "Learn Subcontracting", + "owner": "Administrator", + "path": "https://docs.frappe.io/erpnext/user/manual/en/subcontracting", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Learn Subcontracting", + "validate_action": 1 +} diff --git a/erpnext/workspace_sidebar/accounts_setup.json b/erpnext/workspace_sidebar/accounts_setup.json index ab5269b44f9..df28f57238a 100644 --- a/erpnext/workspace_sidebar/accounts_setup.json +++ b/erpnext/workspace_sidebar/accounts_setup.json @@ -160,6 +160,17 @@ "show_arrow": 0, "type": "Link" }, + { + "child": 1, + "collapsible": 1, + "indent": 0, + "keep_closed": 0, + "label": "Sales Taxes", + "link_to": "Sales Taxes and Charges Template", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, { "child": 0, "collapsible": 1, @@ -277,9 +288,10 @@ "type": "Link" } ], - "modified": "2026-01-23 16:43:27.989825", + "modified": "2026-02-23 22:20:51.043478", "modified_by": "Administrator", "module": "Accounts", + "module_onboarding": "Accounting Onboarding", "name": "Accounts Setup", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/assets.json b/erpnext/workspace_sidebar/assets.json index 5f54ce2bd35..75610cf828d 100644 --- a/erpnext/workspace_sidebar/assets.json +++ b/erpnext/workspace_sidebar/assets.json @@ -221,6 +221,17 @@ "show_arrow": 0, "type": "Section Break" }, + { + "child": 1, + "collapsible": 1, + "indent": 0, + "keep_closed": 0, + "label": "Item", + "link_to": "Item", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, { "child": 1, "collapsible": 1, @@ -258,9 +269,10 @@ "url": "" } ], - "modified": "2026-01-10 00:06:13.218453", + "modified": "2026-02-23 20:57:05.930062", "modified_by": "Administrator", "module": "Assets", + "module_onboarding": "Asset Onboarding", "name": "Assets", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/buying.json b/erpnext/workspace_sidebar/buying.json index ec7f6a3ccd4..0aeec49948f 100644 --- a/erpnext/workspace_sidebar/buying.json +++ b/erpnext/workspace_sidebar/buying.json @@ -369,9 +369,10 @@ "type": "Link" } ], - "modified": "2026-01-10 00:06:12.979668", + "modified": "2026-02-20 15:19:47.010810", "modified_by": "Administrator", "module": "Buying", + "module_onboarding": "Buying Onboarding", "name": "Buying", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/financial_reports.json b/erpnext/workspace_sidebar/financial_reports.json index 52cfb4fd9ec..afdfc5d1494 100644 --- a/erpnext/workspace_sidebar/financial_reports.json +++ b/erpnext/workspace_sidebar/financial_reports.json @@ -381,9 +381,10 @@ "type": "Link" } ], - "modified": "2026-01-10 00:06:13.168391", + "modified": "2026-02-22 18:35:48.416287", "modified_by": "Administrator", "module": "Accounts", + "module_onboarding": "Accounting Onboarding", "name": "Financial Reports", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/invoicing.json b/erpnext/workspace_sidebar/invoicing.json index 99a6b367953..0c4a5a8c369 100644 --- a/erpnext/workspace_sidebar/invoicing.json +++ b/erpnext/workspace_sidebar/invoicing.json @@ -219,7 +219,7 @@ "collapsible": 1, "indent": 0, "keep_closed": 0, - "label": "Payment Reconciliation", + "label": "Payment Reconciliaition", "link_to": "Payment Reconciliation", "link_type": "DocType", "show_arrow": 0, @@ -312,11 +312,24 @@ "link_type": "Workspace", "show_arrow": 0, "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "settings", + "indent": 0, + "keep_closed": 0, + "label": "Settings", + "link_to": "Accounts Settings", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" } ], - "modified": "2026-01-26 21:23:15.665712", + "modified": "2026-02-23 19:50:17.815817", "modified_by": "Administrator", "module": "Accounts", + "module_onboarding": "Accounting Onboarding", "name": "Invoicing", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/manufacturing.json b/erpnext/workspace_sidebar/manufacturing.json index 3570184eb5e..422921c162a 100644 --- a/erpnext/workspace_sidebar/manufacturing.json +++ b/erpnext/workspace_sidebar/manufacturing.json @@ -437,9 +437,10 @@ "type": "Link" } ], - "modified": "2026-01-29 16:41:40.416652", + "modified": "2026-02-20 16:45:00.399936", "modified_by": "Administrator", "module": "Manufacturing", + "module_onboarding": "Manufacturing Onboarding", "name": "Manufacturing", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/payments.json b/erpnext/workspace_sidebar/payments.json index 587eb6aef20..f866f93802c 100644 --- a/erpnext/workspace_sidebar/payments.json +++ b/erpnext/workspace_sidebar/payments.json @@ -195,9 +195,10 @@ "type": "Link" } ], - "modified": "2026-02-23 15:38:05.061694", + "modified": "2026-02-23 16:38:05.061694", "modified_by": "Administrator", "module": "Accounts", + "module_onboarding": "Accounting Onboarding", "name": "Payments", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/projects.json b/erpnext/workspace_sidebar/projects.json index ec0960aa32a..18ffb5cff93 100644 --- a/erpnext/workspace_sidebar/projects.json +++ b/erpnext/workspace_sidebar/projects.json @@ -188,17 +188,6 @@ "show_arrow": 0, "type": "Link" }, - { - "child": 1, - "collapsible": 1, - "indent": 0, - "keep_closed": 0, - "label": "Project Profitability", - "link_to": "Project Profitability", - "link_type": "Report", - "show_arrow": 0, - "type": "Link" - }, { "child": 1, "collapsible": 1, @@ -223,9 +212,10 @@ "type": "Link" } ], - "modified": "2026-01-10 00:06:13.151947", + "modified": "2026-02-23 22:49:54.941187", "modified_by": "Administrator", "module": "Projects", + "module_onboarding": "Projects Onboarding", "name": "Projects", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/selling.json b/erpnext/workspace_sidebar/selling.json index 6b5b9707fe7..e844e37f54d 100644 --- a/erpnext/workspace_sidebar/selling.json +++ b/erpnext/workspace_sidebar/selling.json @@ -687,9 +687,10 @@ "type": "Link" } ], - "modified": "2026-02-16 23:48:24.611112", + "modified": "2026-02-20 16:44:44.931581", "modified_by": "Administrator", "module": "Selling", + "module_onboarding": "Selling Onboarding", "name": "Selling", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/stock.json b/erpnext/workspace_sidebar/stock.json index 14c5faa24e8..7e5f086c312 100644 --- a/erpnext/workspace_sidebar/stock.json +++ b/erpnext/workspace_sidebar/stock.json @@ -625,9 +625,10 @@ "type": "Link" } ], - "modified": "2026-01-10 00:06:12.912403", + "modified": "2026-02-20 16:45:15.295668", "modified_by": "Administrator", "module": "Stock", + "module_onboarding": "Stock Onboarding", "name": "Stock", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/subcontracting.json b/erpnext/workspace_sidebar/subcontracting.json index 31618a4a860..e2aa91fcfa6 100644 --- a/erpnext/workspace_sidebar/subcontracting.json +++ b/erpnext/workspace_sidebar/subcontracting.json @@ -136,6 +136,39 @@ "show_arrow": 0, "type": "Link" }, + { + "child": 0, + "collapsible": 1, + "icon": "database", + "indent": 1, + "keep_closed": 0, + "label": "Setup", + "link_type": "DocType", + "show_arrow": 0, + "type": "Section Break" + }, + { + "child": 1, + "collapsible": 1, + "indent": 0, + "keep_closed": 0, + "label": "Item", + "link_to": "Item", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 1, + "collapsible": 1, + "indent": 0, + "keep_closed": 0, + "label": "Bill of Materials", + "link_to": "BOM", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, { "child": 0, "collapsible": 1, @@ -197,9 +230,10 @@ "type": "Link" } ], - "modified": "2026-01-12 13:12:47.927785", + "modified": "2026-02-23 22:40:17.130101", "modified_by": "Administrator", "module": "Buying", + "module_onboarding": "Subcontracting Onboarding", "name": "Subcontracting", "owner": "Administrator", "standard": 1, diff --git a/erpnext/workspace_sidebar/taxes.json b/erpnext/workspace_sidebar/taxes.json index 64b343ca215..f743f15c6c9 100644 --- a/erpnext/workspace_sidebar/taxes.json +++ b/erpnext/workspace_sidebar/taxes.json @@ -148,9 +148,10 @@ "type": "Link" } ], - "modified": "2026-02-01 00:00:00.000000", + "modified": "2026-02-22 18:36:08.105306", "modified_by": "Administrator", "module": "Accounts", + "module_onboarding": "Accounting Onboarding", "name": "Taxes", "owner": "Administrator", "standard": 1, From 0e2e89c355a711438895f27a9ffc4c4a1639b18d Mon Sep 17 00:00:00 2001 From: ljain112 Date: Fri, 23 Jan 2026 20:30:07 +0530 Subject: [PATCH 65/78] fix: prevent precision errors in discount distribution with inclusive tax (cherry picked from commit 20682997661ff64b8beafa187aae6278e7d1b126) --- erpnext/controllers/taxes_and_totals.py | 5 +++ .../tests/test_distributed_discount.py | 38 +++++++++++++++++++ .../public/js/controllers/taxes_and_totals.js | 6 +++ 3 files changed, 49 insertions(+) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 1f5a5c5a63f..9d98eed668d 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -672,6 +672,11 @@ class calculate_taxes_and_totals: else: self.grand_total_diff = 0 + # Apply rounding adjustment to grand_total_for_distributing_discount + # to prevent precision errors during discount distribution + if hasattr(self, "grand_total_for_distributing_discount") and not self.discount_amount_applied: + self.grand_total_for_distributing_discount += self.grand_total_diff + def calculate_totals(self): grand_total_diff = self.grand_total_diff diff --git a/erpnext/controllers/tests/test_distributed_discount.py b/erpnext/controllers/tests/test_distributed_discount.py index ae2381152ec..05db1496da8 100644 --- a/erpnext/controllers/tests/test_distributed_discount.py +++ b/erpnext/controllers/tests/test_distributed_discount.py @@ -59,3 +59,41 @@ class TestTaxesAndTotals(AccountsTestMixin, IntegrationTestCase): self.assertEqual(so.total, 1500) self.assertAlmostEqual(so.net_total, 1272.73, places=2) self.assertEqual(so.grand_total, 1400) + + def test_100_percent_discount_with_inclusive_tax(self): + """Test that 100% discount with inclusive taxes results in zero net_total""" + so = make_sales_order(do_not_save=1) + so.apply_discount_on = "Grand Total" + so.items[0].qty = 2 + so.items[0].rate = 1300 + so.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account VAT - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Account VAT", + "included_in_print_rate": True, + "rate": 9, + }, + ) + so.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Account Service Tax", + "included_in_print_rate": True, + "rate": 9, + }, + ) + so.save() + + # Apply 100% discount + so.discount_amount = 2600 + calculate_taxes_and_totals(so) + + # net_total should be exactly 0, not 0.01 + self.assertEqual(so.net_total, 0) + self.assertEqual(so.grand_total, 0) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 989f7d371d5..daffda5d4be 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -623,6 +623,12 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { } else { me.grand_total_diff = 0; } + + // Apply rounding adjustment to grand_total_for_distributing_discount + // to prevent precision errors during discount distribution + if (me.grand_total_for_distributing_discount && !me.discount_amount_applied) { + me.grand_total_for_distributing_discount += me.grand_total_diff; + } } } } From aac7fc30d5a095a5c925219a5ceda66178ed4499 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 24 Feb 2026 17:00:02 +0530 Subject: [PATCH 66/78] fix: remove form tour for sales and purchase order (cherry picked from commit ed7315d78e706176eedd6ee87fc88bd3c81ece35) --- .../purchase_order/purchase_order.json | 76 ------------------ .../buying_onboarding/buying_onboarding.json | 2 +- .../create_item/create_item.json | 2 +- .../create_purchase_order.json | 6 +- .../review_buying_settings.json | 2 +- .../form_tour/sales_order/sales_order.json | 77 ------------------- .../selling_onboarding.json | 2 +- .../create_customer/create_customer.json | 2 +- .../create_item/create_item.json | 2 +- .../create_sales_invoice.json | 2 +- .../create_sales_order.json | 6 +- .../review_selling_settings.json | 2 +- .../view_sales_order_analysis.json | 2 +- 13 files changed, 15 insertions(+), 168 deletions(-) delete mode 100644 erpnext/buying/form_tour/purchase_order/purchase_order.json delete mode 100644 erpnext/selling/form_tour/sales_order/sales_order.json diff --git a/erpnext/buying/form_tour/purchase_order/purchase_order.json b/erpnext/buying/form_tour/purchase_order/purchase_order.json deleted file mode 100644 index 9b9cf1d899c..00000000000 --- a/erpnext/buying/form_tour/purchase_order/purchase_order.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "creation": "2026-02-22 17:08:01.825015", - "docstatus": 0, - "doctype": "Form Tour", - "first_document": 0, - "idx": 0, - "include_name_field": 0, - "is_standard": 1, - "list_name": "List", - "modified": "2026-02-22 18:25:11.421464", - "modified_by": "Administrator", - "module": "Buying", - "name": "Purchase Order", - "new_document_form": 0, - "owner": "Administrator", - "reference_doctype": "Purchase Order", - "report_name": "", - "save_on_complete": 1, - "steps": [ - { - "description": "Select a Supplier", - "fieldname": "supplier", - "fieldtype": "Link", - "has_next_condition": 0, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Supplier", - "modal_trigger": 0, - "next_on_click": 0, - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Right", - "title": "Supplier", - "ui_tour": 0 - }, - { - "description": "Set the \"Required By\" date for the materials. This sets the \"Required By\" date for all the items.\n", - "fieldname": "schedule_date", - "fieldtype": "Date", - "has_next_condition": 0, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Required By", - "modal_trigger": 0, - "next_on_click": 0, - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Top Right", - "title": "Required By", - "ui_tour": 0 - }, - { - "description": "Items to be purchased can be added here.", - "fieldname": "items", - "fieldtype": "Table", - "has_next_condition": 0, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Items", - "modal_trigger": 0, - "next_on_click": 0, - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Bottom", - "title": "Items Table", - "ui_tour": 0 - } - ], - "title": "Purchase Order", - "track_steps": 0, - "ui_tour": 0, - "view_name": "Workspaces" -} diff --git a/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json index 080cadf8163..96d08fecb1a 100644 --- a/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json +++ b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-23 22:51:40.644920", + "modified": "2026-02-24 16:57:55.172763", "modified_by": "Administrator", "module": "Buying", "name": "Buying Onboarding", diff --git a/erpnext/buying/onboarding_step/create_item/create_item.json b/erpnext/buying/onboarding_step/create_item/create_item.json index eb917d65b4f..f1dc6a0ac91 100644 --- a/erpnext/buying/onboarding_step/create_item/create_item.json +++ b/erpnext/buying/onboarding_step/create_item/create_item.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 20:30:37.698459", + "modified": "2026-02-24 16:57:14.098288", "modified_by": "Administrator", "name": "Create Item", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json index 307a7d74546..c39c5404046 100644 --- a/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json +++ b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json @@ -4,17 +4,17 @@ "creation": "2026-02-19 12:13:44.068135", "docstatus": 0, "doctype": "Onboarding Step", - "form_tour": "Purchase Order", + "form_tour": "", "idx": 2, "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:16:40.891958", + "modified": "2026-02-24 16:57:37.904322", "modified_by": "Administrator", "name": "Create Purchase Order", "owner": "Administrator", "reference_document": "Purchase Order", - "show_form_tour": 1, + "show_form_tour": 0, "show_full_form": 1, "title": "Create Purchase Order", "validate_action": 1 diff --git a/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json index c51ed7d7bb6..2703b14c6f9 100644 --- a/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json +++ b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 1, "is_skipped": 0, - "modified": "2026-02-23 22:16:40.845870", + "modified": "2026-02-24 16:57:14.031766", "modified_by": "Administrator", "name": "Review Buying Settings", "owner": "Administrator", diff --git a/erpnext/selling/form_tour/sales_order/sales_order.json b/erpnext/selling/form_tour/sales_order/sales_order.json deleted file mode 100644 index 70c8ebd6ba7..00000000000 --- a/erpnext/selling/form_tour/sales_order/sales_order.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "creation": "2026-02-22 17:13:52.268911", - "docstatus": 0, - "doctype": "Form Tour", - "first_document": 0, - "idx": 0, - "include_name_field": 0, - "is_standard": 1, - "list_name": "List", - "modified": "2026-02-22 18:24:10.811411", - "modified_by": "Administrator", - "module": "Selling", - "name": "Sales Order", - "new_document_form": 0, - "owner": "Administrator", - "reference_doctype": "Sales Order", - "report_name": "", - "save_on_complete": 1, - "steps": [ - { - "description": "Select a customer.", - "fieldname": "customer", - "fieldtype": "Link", - "has_next_condition": 1, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Customer", - "modal_trigger": 0, - "next_on_click": 0, - "next_step_condition": "customer", - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Right", - "title": "Select Customer", - "ui_tour": 0 - }, - { - "description": "Set the \"Delivery Date\" for the items. This sets the \"Delivery Date\" for all the line items.", - "fieldname": "delivery_date", - "fieldtype": "Date", - "has_next_condition": 0, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Delivery Date", - "modal_trigger": 0, - "next_on_click": 0, - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Top Right", - "title": "Select Delivery Date", - "ui_tour": 0 - }, - { - "description": "You can add items here.", - "fieldname": "items", - "fieldtype": "Table", - "has_next_condition": 0, - "hide_buttons": 0, - "is_table_field": 0, - "label": "Items", - "modal_trigger": 0, - "next_on_click": 0, - "offset_x": 0, - "offset_y": 0, - "popover_element": 0, - "position": "Bottom", - "title": "List of items", - "ui_tour": 0 - } - ], - "title": "Sales Order", - "track_steps": 0, - "ui_tour": 0, - "view_name": "Workspaces" -} diff --git a/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json index 4fe19815e2c..d211ab6abf1 100644 --- a/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json +++ b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 1, "is_complete": 0, - "modified": "2026-02-23 22:51:47.297028", + "modified": "2026-02-24 16:57:50.753045", "modified_by": "Administrator", "module": "Selling", "name": "Selling Onboarding", diff --git a/erpnext/selling/onboarding_step/create_customer/create_customer.json b/erpnext/selling/onboarding_step/create_customer/create_customer.json index 42c4ff97290..142c395e55c 100644 --- a/erpnext/selling/onboarding_step/create_customer/create_customer.json +++ b/erpnext/selling/onboarding_step/create_customer/create_customer.json @@ -9,7 +9,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 19:27:53.808219", + "modified": "2026-02-24 16:57:14.111070", "modified_by": "Administrator", "name": "Create Customer", "owner": "Administrator", diff --git a/erpnext/selling/onboarding_step/create_item/create_item.json b/erpnext/selling/onboarding_step/create_item/create_item.json index eb917d65b4f..f1dc6a0ac91 100644 --- a/erpnext/selling/onboarding_step/create_item/create_item.json +++ b/erpnext/selling/onboarding_step/create_item/create_item.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 20:30:37.698459", + "modified": "2026-02-24 16:57:14.098288", "modified_by": "Administrator", "name": "Create Item", "owner": "Administrator", diff --git a/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json b/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json index d00db0e71f9..6d16e625d21 100644 --- a/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json +++ b/erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:16:40.931428", + "modified": "2026-02-24 16:57:14.087292", "modified_by": "Administrator", "name": "Create Sales Invoice", "owner": "Administrator", diff --git a/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json b/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json index 77c81c0cc71..ed87a015aba 100644 --- a/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json +++ b/erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json @@ -4,17 +4,17 @@ "creation": "2026-02-20 13:41:48.164961", "docstatus": 0, "doctype": "Onboarding Step", - "form_tour": "Sales Order", + "form_tour": "", "idx": 1, "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 20:22:32.252346", + "modified": "2026-02-24 16:57:29.877286", "modified_by": "Administrator", "name": "Create Sales Order", "owner": "Administrator", "reference_document": "Sales Order", - "show_form_tour": 1, + "show_form_tour": 0, "show_full_form": 1, "title": "Create Sales Order", "validate_action": 1 diff --git a/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json b/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json index f8f86321b4d..29aac361bee 100644 --- a/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json +++ b/erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 1, "is_skipped": 0, - "modified": "2026-02-23 20:41:50.847375", + "modified": "2026-02-24 16:57:14.062699", "modified_by": "Administrator", "name": "Review Selling Settings", "owner": "Administrator", diff --git a/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json b/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json index 9763e3c18d9..46a6a56b58e 100644 --- a/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json +++ b/erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:44:22.792553", + "modified": "2026-02-24 16:57:14.075341", "modified_by": "Administrator", "name": "View Sales Order Analysis", "owner": "Administrator", From 27c03fee1c1833a0fee0467875f3aeaa66152bb9 Mon Sep 17 00:00:00 2001 From: Harsh Patadia <142822496+harshp4114@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:06:47 +0530 Subject: [PATCH 67/78] refactor: separate construction of chart related data from `get_columns()` (#52824) * fix: avoid hardcoded column slicing for Profit & Loss chart data * refactor: improve parameter naming and reduce code repetion by using same function get_period_columns() * refactor: improved parameter naming in get_data() and get_chart_data() (cherry picked from commit bdcb2c1512bf013a68275848f13d3711f5c9ff2a) --- .../report/balance_sheet/balance_sheet.py | 15 ++--- .../accounts/report/cash_flow/cash_flow.py | 8 +-- .../consolidated_financial_statement.py | 62 +++++++++++-------- .../profit_and_loss_statement.py | 15 ++--- .../production_analytics.py | 29 ++++----- .../report/stock_analytics/stock_analytics.py | 32 ++++++---- 6 files changed, 92 insertions(+), 69 deletions(-) diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py index 68f4b7800c1..97a903133da 100644 --- a/erpnext/accounts/report/balance_sheet/balance_sheet.py +++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py @@ -102,7 +102,7 @@ def execute(filters=None): filters.periodicity, period_list, filters.accumulated_values, company=filters.company ) - chart = get_chart_data(filters, columns, asset, liability, equity, currency) + chart = get_chart_data(filters, period_list, asset, liability, equity, currency) report_summary, primitive_summary = get_report_summary( period_list, asset, liability, equity, provisional_profit_loss, currency, filters @@ -231,18 +231,19 @@ def get_report_summary( ], (net_asset - net_liability + net_equity) -def get_chart_data(filters, columns, asset, liability, equity, currency): - labels = [d.get("label") for d in columns[4:]] +def get_chart_data(filters, chart_columns, asset, liability, equity, currency): + labels = [col.get("label") for col in chart_columns] asset_data, liability_data, equity_data = [], [], [] - for p in columns[4:]: + for col in chart_columns: + key = col.get("key") or col.get("fieldname") if asset: - asset_data.append(asset[-2].get(p.get("fieldname"))) + asset_data.append(asset[-2].get(key)) if liability: - liability_data.append(liability[-2].get(p.get("fieldname"))) + liability_data.append(liability[-2].get(key)) if equity: - equity_data.append(equity[-2].get(p.get("fieldname"))) + equity_data.append(equity[-2].get(key)) datasets = [] if asset_data: diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py index 02a1f87a8d9..462d34b874f 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.py +++ b/erpnext/accounts/report/cash_flow/cash_flow.py @@ -145,7 +145,7 @@ def execute(filters=None): True, ) - chart = get_chart_data(columns, data, company_currency) + chart = get_chart_data(period_list, data, company_currency) report_summary = get_report_summary(summary_data, company_currency) @@ -417,12 +417,12 @@ def get_report_summary(summary_data, currency): return report_summary -def get_chart_data(columns, data, currency): - labels = [d.get("label") for d in columns[2:]] +def get_chart_data(period_list, data, currency): + labels = [period.get("label") for period in period_list] datasets = [ { "name": section.get("section").replace("'", ""), - "values": [section.get(d.get("fieldname")) for d in columns[2:]], + "values": [section.get(period.get("key")) for period in period_list], } for section in data if section.get("parent_section") is None and section.get("currency") diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py index 4d4eb520933..cee7822286c 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -48,22 +48,25 @@ def execute(filters=None): return columns, data, message, chart fiscal_year = get_fiscal_year_data(filters.get("from_fiscal_year"), filters.get("to_fiscal_year")) - companies_column, companies = get_companies(filters) - columns = get_columns(companies_column, filters) + company_list, companies = get_companies(filters) + company_columns = get_company_columns(company_list, filters) + columns = get_columns(company_columns) if filters.get("report") == "Balance Sheet": data, message, chart, report_summary = get_balance_sheet_data( - fiscal_year, companies, columns, filters + fiscal_year, companies, company_columns, filters ) elif filters.get("report") == "Profit and Loss Statement": - data, message, chart, report_summary = get_profit_loss_data(fiscal_year, companies, columns, filters) + data, message, chart, report_summary = get_profit_loss_data( + fiscal_year, companies, company_columns, filters + ) else: data, report_summary = get_cash_flow_data(fiscal_year, companies, filters) return columns, data, message, chart, report_summary -def get_balance_sheet_data(fiscal_year, companies, columns, filters): +def get_balance_sheet_data(fiscal_year, companies, company_columns, filters): asset = get_data(companies, "Asset", "Debit", fiscal_year, filters=filters) liability = get_data(companies, "Liability", "Credit", fiscal_year, filters=filters) @@ -116,7 +119,7 @@ def get_balance_sheet_data(fiscal_year, companies, columns, filters): True, ) - chart = get_chart_data(filters, columns, asset, liability, equity, company_currency) + chart = get_chart_data(filters, company_columns, asset, liability, equity, company_currency) return data, message, chart, report_summary @@ -164,7 +167,7 @@ def get_root_account_name(root_type, company): return root_account[0][0] -def get_profit_loss_data(fiscal_year, companies, columns, filters): +def get_profit_loss_data(fiscal_year, companies, company_columns, filters): income, expense, net_profit_loss = get_income_expense_data(companies, fiscal_year, filters) company_currency = get_company_currency(filters) @@ -174,7 +177,7 @@ def get_profit_loss_data(fiscal_year, companies, columns, filters): if net_profit_loss: data.append(net_profit_loss) - chart = get_pl_chart_data(filters, columns, income, expense, net_profit_loss, company_currency) + chart = get_pl_chart_data(filters, company_columns, income, expense, net_profit_loss, company_currency) report_summary, primitive_summary = get_pl_summary( companies, "", income, expense, net_profit_loss, company_currency, filters, True @@ -280,7 +283,30 @@ def get_account_type_based_data(account_type, companies, fiscal_year, filters): return data -def get_columns(companies, filters): +def get_company_columns(companies, filters): + company_columns = [] + for company in companies: + apply_currency_formatter = 1 if not filters.presentation_currency else 0 + currency = filters.presentation_currency + if not currency: + currency = erpnext.get_company_currency(company) + + company_columns.append( + { + "fieldname": company, + "label": f"{company} ({currency})", + "fieldtype": "Currency", + "options": "currency", + "width": 150, + "apply_currency_formatter": apply_currency_formatter, + "company_name": company, + } + ) + + return company_columns + + +def get_columns(company_columns): columns = [ { "fieldname": "account", @@ -298,23 +324,7 @@ def get_columns(companies, filters): }, ] - for company in companies: - apply_currency_formatter = 1 if not filters.presentation_currency else 0 - currency = filters.presentation_currency - if not currency: - currency = erpnext.get_company_currency(company) - - columns.append( - { - "fieldname": company, - "label": f"{company} ({currency})", - "fieldtype": "Currency", - "options": "currency", - "width": 150, - "apply_currency_formatter": apply_currency_formatter, - "company_name": company, - } - ) + columns.extend(company_columns) return columns diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py index 9cbdbee6316..74290ec21b4 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py @@ -68,7 +68,7 @@ def execute(filters=None): currency = filters.presentation_currency or frappe.get_cached_value( "Company", filters.company, "default_currency" ) - chart = get_chart_data(filters, columns, income, expense, net_profit_loss, currency) + chart = get_chart_data(filters, period_list, income, expense, net_profit_loss, currency) report_summary, primitive_summary = get_report_summary( period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters @@ -162,18 +162,19 @@ def get_net_profit_loss(income, expense, period_list, company, currency=None, co return net_profit_loss -def get_chart_data(filters, columns, income, expense, net_profit_loss, currency): - labels = [d.get("label") for d in columns[4:]] +def get_chart_data(filters, chart_columns, income, expense, net_profit_loss, currency): + labels = [col.get("label") for col in chart_columns] income_data, expense_data, net_profit = [], [], [] - for p in columns[4:]: + for col in chart_columns: + key = col.get("key") or col.get("fieldname") if income: - income_data.append(income[-2].get(p.get("fieldname"))) + income_data.append(income[-2].get(key)) if expense: - expense_data.append(expense[-2].get(p.get("fieldname"))) + expense_data.append(expense[-2].get(key)) if net_profit_loss: - net_profit.append(net_profit_loss.get(p.get("fieldname"))) + net_profit.append(net_profit_loss.get(key)) datasets = [] if income_data: diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py index 41fd4dd0e82..9da87022e46 100644 --- a/erpnext/manufacturing/report/production_analytics/production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -6,24 +6,25 @@ import frappe from frappe import _, scrub from frappe.utils import getdate, today -from erpnext.stock.report.stock_analytics.stock_analytics import get_period, get_period_date_ranges +from erpnext.stock.report.stock_analytics.stock_analytics import ( + get_period, + get_period_columns, + get_period_date_ranges, +) WORK_ORDER_STATUS_LIST = ["Not Started", "Overdue", "Pending", "Completed", "Closed", "Stopped"] def execute(filters=None): - columns = get_columns(filters) - data, chart = get_data(filters, columns) + period_columns = get_period_columns(filters) + columns = get_columns(period_columns) + data, chart = get_data(filters, period_columns) return columns, data, None, chart -def get_columns(filters): +def get_columns(period_columns): columns = [{"label": _("Status"), "fieldname": "status", "fieldtype": "Data", "width": 140}] - ranges = get_period_date_ranges(filters) - - for _dummy, end_date in ranges: - period = get_period(end_date, filters) - columns.append({"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}) + columns.extend(period_columns) return columns @@ -49,7 +50,7 @@ def get_work_orders(filters): ) -def get_data(filters, columns): +def get_data(filters, period_columns): ranges = build_ranges(filters) period_labels = [scrub(pd) for _fd, _td, pd in ranges] periodic_data = {status: {pd: 0 for pd in period_labels} for status in WORK_ORDER_STATUS_LIST} @@ -84,7 +85,7 @@ def get_data(filters, columns): row[scrub(period)] = periodic_data[status].get(scrub(period), 0) data.append(row) - chart = get_chart_data(periodic_data, columns) + chart = get_chart_data(periodic_data, period_columns) return data, chart @@ -103,9 +104,9 @@ def build_ranges(filters): return ranges -def get_chart_data(periodic_data, columns): - period_labels = [d.get("label") for d in columns[1:]] - period_fieldnames = [d.get("fieldname") for d in columns[1:]] +def get_chart_data(periodic_data, period_columns): + period_labels = [col.get("label") for col in period_columns] + period_fieldnames = [col.get("fieldname") for col in period_columns] datasets = [] for status in WORK_ORDER_STATUS_LIST: diff --git a/erpnext/stock/report/stock_analytics/stock_analytics.py b/erpnext/stock/report/stock_analytics/stock_analytics.py index 36f0f2e5be6..02facc2ff59 100644 --- a/erpnext/stock/report/stock_analytics/stock_analytics.py +++ b/erpnext/stock/report/stock_analytics/stock_analytics.py @@ -16,14 +16,29 @@ from erpnext.stock.utils import is_reposting_item_valuation_in_progress def execute(filters=None): is_reposting_item_valuation_in_progress() filters = frappe._dict(filters or {}) - columns = get_columns(filters) + period_columns = get_period_columns(filters) + columns = get_columns(period_columns) data = get_data(filters) - chart = get_chart_data(columns) + chart = get_chart_data(period_columns) return columns, data, None, chart -def get_columns(filters): +def get_period_columns(filters): + period_columns = [] + ranges = get_period_date_ranges(filters) + + for _dummy, end_date in ranges: + period = get_period(end_date, filters) + + period_columns.append( + {"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120} + ) + + return period_columns + + +def get_columns(period_columns): columns = [ {"label": _("Item"), "options": "Item", "fieldname": "name", "fieldtype": "Link", "width": 140}, { @@ -44,12 +59,7 @@ def get_columns(filters): {"label": _("UOM"), "fieldname": "uom", "fieldtype": "Data", "width": 120}, ] - ranges = get_period_date_ranges(filters) - - for _dummy, end_date in ranges: - period = get_period(end_date, filters) - - columns.append({"label": _(period), "fieldname": scrub(period), "fieldtype": "Float", "width": 120}) + columns.extend(period_columns) return columns @@ -249,8 +259,8 @@ def get_data(filters): return data -def get_chart_data(columns): - labels = [d.get("label") for d in columns[5:]] +def get_chart_data(period_columns): + labels = [col.get("label") for col in period_columns] chart = {"data": {"labels": labels, "datasets": []}} chart["type"] = "line" From 298ea33922700f094e1d7e38249e0f3f2dd0f09a Mon Sep 17 00:00:00 2001 From: Jatin3128 Date: Sat, 6 Dec 2025 20:56:44 +0530 Subject: [PATCH 68/78] feat(payment_request): add option to calculate request amount using payment schedule (cherry picked from commit 60108590b07d89fffe080c457d5c159d0f3be7a6) --- .../doctype/payment_reference/__init__.py | 0 .../payment_reference/payment_reference.json | 90 +++++++++++++++++++ .../payment_reference/payment_reference.py | 28 ++++++ .../payment_request/payment_request.js | 26 ++++++ .../payment_request/payment_request.json | 20 ++++- .../payment_request/payment_request.py | 62 +++++++++++++ .../payment_request/test_payment_request.py | 68 ++++++++++++++ 7 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 erpnext/accounts/doctype/payment_reference/__init__.py create mode 100644 erpnext/accounts/doctype/payment_reference/payment_reference.json create mode 100644 erpnext/accounts/doctype/payment_reference/payment_reference.py diff --git a/erpnext/accounts/doctype/payment_reference/__init__.py b/erpnext/accounts/doctype/payment_reference/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/payment_reference/payment_reference.json b/erpnext/accounts/doctype/payment_reference/payment_reference.json new file mode 100644 index 00000000000..32d947d00dd --- /dev/null +++ b/erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -0,0 +1,90 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-12-02 17:50:08.648006", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "payment_term", + "manually_selected", + "auto_selected", + "section_break_fjhh", + "description", + "section_break_mjlv", + "due_date", + "column_break_qghl", + "amount" + ], + "fields": [ + { + "fieldname": "payment_term", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Payment Term", + "options": "Payment Term" + }, + { + "collapsible": 1, + "fieldname": "section_break_fjhh", + "fieldtype": "Section Break", + "label": "Description" + }, + { + "fieldname": "description", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Description" + }, + { + "fieldname": "section_break_mjlv", + "fieldtype": "Section Break" + }, + { + "fieldname": "due_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Due Date" + }, + { + "fieldname": "column_break_qghl", + "fieldtype": "Column Break" + }, + { + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "precision": "2" + }, + { + "default": "0", + "fieldname": "manually_selected", + "fieldtype": "Check", + "hidden": 1, + "label": "Manually Selected" + }, + { + "default": "1", + "fieldname": "auto_selected", + "fieldtype": "Check", + "hidden": 1, + "label": "Auto Selected" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-12-05 11:26:29.877050", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Payment Reference", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "creation", + "sort_order": "DESC", + "states": [] +} diff --git a/erpnext/accounts/doctype/payment_reference/payment_reference.py b/erpnext/accounts/doctype/payment_reference/payment_reference.py new file mode 100644 index 00000000000..8c67a247dc5 --- /dev/null +++ b/erpnext/accounts/doctype/payment_reference/payment_reference.py @@ -0,0 +1,28 @@ +# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class PaymentReference(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + amount: DF.Currency + auto_selected: DF.Check + description: DF.SmallText | None + due_date: DF.Date | None + manually_selected: DF.Check + parent: DF.Data + parentfield: DF.Data + parenttype: DF.Data + payment_term: DF.Link | None + # end: auto-generated types + + pass diff --git a/erpnext/accounts/doctype/payment_request/payment_request.js b/erpnext/accounts/doctype/payment_request/payment_request.js index 1d4c8d5280d..9696a6bfc2a 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.js +++ b/erpnext/accounts/doctype/payment_request/payment_request.js @@ -105,3 +105,29 @@ frappe.ui.form.on("Payment Request", "is_a_subscription", function (frm) { }); } }); + +frappe.ui.form.on("Payment Request", "calculate_total_amount_by_selected_rows", function (frm) { + if (frm.doc.docstatus !== 0) { + frappe.msgprint(__("Cannot fetch selected rows for submitted Payment Request")); + return; + } + const selected = frm.get_selected()?.payment_reference || []; + if (!selected.length) { + frappe.throw(__("No rows selected")); + } + let total = 0; + selected.forEach((name) => { + const row = frm.doc.payment_reference.find((d) => d.name === name); + if (row) { + row.manually_selected = 1; + + total += row.amount; + } + }); + frm.doc.payment_reference.forEach((row) => { + row.auto_selected = 0; + }); + frm.set_value("grand_total", total); + frm.refresh_field("grand_total"); + frm.save(); +}); diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index 81b879c285d..adff47f4639 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.json +++ b/erpnext/accounts/doctype/payment_request/payment_request.json @@ -19,6 +19,9 @@ "column_break_4", "reference_doctype", "reference_name", + "payment_reference_section", + "payment_reference", + "calculate_total_amount_by_selected_rows", "transaction_details", "grand_total", "currency", @@ -457,6 +460,21 @@ "fieldname": "phone_number", "fieldtype": "Data", "label": "Phone Number" + }, + { + "fieldname": "payment_reference_section", + "fieldtype": "Section Break" + }, + { + "fieldname": "calculate_total_amount_by_selected_rows", + "fieldtype": "Button", + "label": "Calculate Total Amount by Selected Rows" + }, + { + "fieldname": "payment_reference", + "fieldtype": "Table", + "label": "Payment Reference", + "options": "Payment Reference" } ], "grid_page_length": 50, @@ -464,7 +482,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-08-29 11:52:48.555415", + "modified": "2025-12-05 11:27:51.406257", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Request", diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index fd28dab5a29..3437655dff3 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -45,6 +45,7 @@ class PaymentRequest(Document): if TYPE_CHECKING: from frappe.types import DF + from erpnext.accounts.doctype.payment_reference.payment_reference import PaymentReference from erpnext.accounts.doctype.subscription_plan_detail.subscription_plan_detail import ( SubscriptionPlanDetail, ) @@ -78,6 +79,7 @@ class PaymentRequest(Document): payment_gateway: DF.ReadOnly | None payment_gateway_account: DF.Link | None payment_order: DF.Link | None + payment_reference: DF.Table[PaymentReference] payment_request_type: DF.Literal["Outward", "Inward"] payment_url: DF.Data | None phone_number: DF.Data | None @@ -597,6 +599,8 @@ def make_payment_request(**args): "Payment Request", draft_payment_request, "grand_total", grand_total, update_modified=False ) pr = frappe.get_doc("Payment Request", draft_payment_request) + + set_payment_references(pr, ref_doc) else: bank_account = ( get_party_bank_account(args.get("party_type"), args.get("party")) @@ -617,6 +621,8 @@ def make_payment_request(**args): party_account = get_party_account(party_type, ref_doc.get(party_type.lower()), ref_doc.company) party_account_currency = get_account_currency(party_account) + set_payment_references(pr, ref_doc) + pr.update( { "payment_gateway_account": gateway_account.get("name"), @@ -1024,3 +1030,59 @@ def get_irequests_of_payment_request(doc: str | None = None) -> list: }, ) return res + + +def set_payment_references(payment_request, ref_doc): + if not hasattr(ref_doc, "payment_schedule") or not ref_doc.payment_schedule: + return + + existing_refs = get_existing_payment_references(ref_doc.name) + + existing_map = {make_key(r.payment_term, r.due_date, r.amount): r for r in existing_refs} + + payment_request.reference = [] + + for row in ref_doc.payment_schedule: + key = make_key(row.payment_term, row.due_date, row.payment_amount) + + existing = existing_map.get(key) + if existing and (existing.manually_selected or existing.auto_selected): + continue + + payment_request.append( + "payment_reference", + { + "payment_term": row.payment_term, + "description": row.description, + "due_date": row.due_date, + "amount": row.payment_amount, + }, + ) + + +def make_key(payment_term, due_date, amount): + return (payment_term, due_date, flt(amount)) + + +def get_existing_payment_references(reference_name): + PR = frappe.qb.DocType("Payment Request") + PRF = frappe.qb.DocType("Payment Reference") + + result = ( + frappe.qb.from_(PR) + .join(PRF) + .on(PR.name == PRF.parent) + .select( + PRF.payment_term, + PRF.due_date, + PRF.amount, + PRF.manually_selected, + PRF.auto_selected, + PRF.parent, + ) + .where(PR.reference_name == reference_name) + .where(PR.docstatus == 1) + .where(PR.status.isin(["Initiated", "Partially Paid", "Payment Ordered", "Paid"])) + ).run(as_dict=True) + + return result diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py index 1f97b8b5784..1374e64c032 100644 --- a/erpnext/accounts/doctype/payment_request/test_payment_request.py +++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py @@ -851,3 +851,71 @@ class TestPaymentRequest(IntegrationTestCase): pr.load_from_db() self.assertEqual(pr.grand_total, pi.outstanding_amount) + + def test_payment_schedule_row_selection(self): + from frappe.utils import add_days, nowdate + + po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=86) + + po.payment_schedule = [] + + po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 33}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 33}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 2), "payment_amount": 20}) + + po.save() + po.submit() + + pr1 = make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + ) + pr1.payment_reference[0].manually_selected = 1 + pr1.payment_reference[1].auto_selected = 0 + pr1.payment_reference[2].manually_selected = 1 + pr1.grand_total = 53 + pr1.submit() + + pr2 = make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + ) + + self.assertEqual(len(pr2.payment_reference), 1) + self.assertEqual(pr2.payment_reference[0].amount, 33) + + def test_auto_selected_rows_are_not_reused(self): + from frappe.utils import add_days, nowdate + + po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=80) + po.payment_schedule = [] + po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 40}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 10}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 2), "payment_amount": 30}) + po.save() + po.submit() + + pr1 = make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + ) + + pr1.submit() + + with self.assertRaises(frappe.ValidationError): + make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + ) From 751a0812538cf77c0967f4356f9d1275466f8d26 Mon Sep 17 00:00:00 2001 From: Jatin3128 Date: Fri, 16 Jan 2026 05:39:43 +0530 Subject: [PATCH 69/78] feat(payment request): create payment request as per payment schedules (cherry picked from commit e476dff842f7323642b18a3a32eb0c5827375ab7) --- .../payment_reference/payment_reference.json | 24 +-- .../payment_reference/payment_reference.py | 3 +- .../payment_request/payment_request.json | 12 +- .../payment_request/payment_request.py | 188 ++++++++++++++---- .../payment_request/test_payment_request.py | 135 +++++++++---- .../purchase_invoice/purchase_invoice.js | 2 +- .../doctype/sales_invoice/sales_invoice.js | 2 +- .../doctype/purchase_order/purchase_order.js | 2 +- erpnext/public/js/controllers/transaction.js | 99 +++++++++ .../doctype/sales_order/sales_order.js | 2 +- 10 files changed, 363 insertions(+), 106 deletions(-) diff --git a/erpnext/accounts/doctype/payment_reference/payment_reference.json b/erpnext/accounts/doctype/payment_reference/payment_reference.json index 32d947d00dd..a1adb181d35 100644 --- a/erpnext/accounts/doctype/payment_reference/payment_reference.json +++ b/erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -7,8 +7,8 @@ "engine": "InnoDB", "field_order": [ "payment_term", - "manually_selected", - "auto_selected", + "column_break_lnjp", + "payment_schedule", "section_break_fjhh", "description", "section_break_mjlv", @@ -58,25 +58,23 @@ "precision": "2" }, { - "default": "0", - "fieldname": "manually_selected", - "fieldtype": "Check", - "hidden": 1, - "label": "Manually Selected" + "fieldname": "column_break_lnjp", + "fieldtype": "Column Break" }, { - "default": "1", - "fieldname": "auto_selected", - "fieldtype": "Check", - "hidden": 1, - "label": "Auto Selected" + "allow_on_submit": 1, + "fieldname": "payment_schedule", + "fieldtype": "Link", + "label": "Payment Schedule", + "options": "Payment Schedule", + "read_only": 1 } ], "grid_page_length": 50, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-12-05 11:26:29.877050", + "modified": "2026-01-19 02:21:36.455830", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Reference", diff --git a/erpnext/accounts/doctype/payment_reference/payment_reference.py b/erpnext/accounts/doctype/payment_reference/payment_reference.py index 8c67a247dc5..6e1956644c9 100644 --- a/erpnext/accounts/doctype/payment_reference/payment_reference.py +++ b/erpnext/accounts/doctype/payment_reference/payment_reference.py @@ -15,13 +15,12 @@ class PaymentReference(Document): from frappe.types import DF amount: DF.Currency - auto_selected: DF.Check description: DF.SmallText | None due_date: DF.Date | None - manually_selected: DF.Check parent: DF.Data parentfield: DF.Data parenttype: DF.Data + payment_schedule: DF.Link | None payment_term: DF.Link | None # end: auto-generated types diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index adff47f4639..8fcf1f2f41f 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.json +++ b/erpnext/accounts/doctype/payment_request/payment_request.json @@ -21,7 +21,6 @@ "reference_name", "payment_reference_section", "payment_reference", - "calculate_total_amount_by_selected_rows", "transaction_details", "grand_total", "currency", @@ -160,6 +159,7 @@ "label": "Amount", "non_negative": 1, "options": "currency", + "read_only_depends_on": "eval:doc.payment_reference.length>0", "reqd": 1 }, { @@ -465,16 +465,12 @@ "fieldname": "payment_reference_section", "fieldtype": "Section Break" }, - { - "fieldname": "calculate_total_amount_by_selected_rows", - "fieldtype": "Button", - "label": "Calculate Total Amount by Selected Rows" - }, { "fieldname": "payment_reference", "fieldtype": "Table", "label": "Payment Reference", - "options": "Payment Reference" + "options": "Payment Reference", + "read_only": 1 } ], "grid_page_length": 50, @@ -482,7 +478,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-12-05 11:27:51.406257", + "modified": "2026-01-13 12:53:00.963274", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Request", diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 3437655dff3..c95945bf6e2 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -111,15 +111,36 @@ class PaymentRequest(Document): if self.get("__islocal"): self.status = "Draft" self.validate_reference_document() + self.validate_against_payment_reference() self.validate_payment_request_amount() # self.validate_currency() self.validate_subscription_details() + def validate_against_payment_reference(self): + if not self.payment_reference: + return + + expected = sum(flt(r.amount) for r in self.payment_reference) + if flt(expected, self.precision("grand_total")) != flt(self.grand_total): + frappe.throw(_("Grand Total must match sum of Payment References")) + + seen = set() + for r in self.payment_reference: + if not r.payment_schedule: + continue # legacy mode → skip + + if r.payment_schedule in seen: + frappe.throw(_("Duplicate Payment Schedule selected")) + + seen.add(r.payment_schedule) + def validate_reference_document(self): if not self.reference_doctype or not self.reference_name: frappe.throw(_("To create a Payment Request reference document is required")) def validate_payment_request_amount(self): + if self.payment_reference: + return if self.grand_total == 0: frappe.throw( _("{0} cannot be zero").format(self.get_label_from_fieldname("grand_total")), @@ -554,9 +575,63 @@ def make_payment_request(**args): ref_doc = args.ref_doc or frappe.get_doc(args.dt, args.dn) if not args.get("company"): args.company = ref_doc.company + gateway_account = get_gateway_details(args) or frappe._dict() - grand_total = get_amount(ref_doc, gateway_account.get("payment_account")) + # Schedule-based PRs are allowed only if no Payment Entry exists for this document. + # Any existing Payment Entry forces legacy (amount-based) flow. + selected_payment_schedules = json.loads(args.get("schedules")) if args.get("schedules") else [] + + # Backend guard: + # If any Payment Entry exists, schedule-based PRs are not allowed. + if selected_payment_schedules and get_existing_payment_entry(ref_doc.name): + frappe.throw( + _( + "Payment Schedule based Payment Requests cannot be created because a Payment Entry already exists for this document." + ) + ) + + has_payment_entry = bool(get_existing_payment_entry(ref_doc.name)) + + payment_reference = [] + + if selected_payment_schedules: + existing_payment_references = get_existing_payment_references(ref_doc.name) + + if existing_payment_references: + existing_ids = {r["payment_schedule"] for r in existing_payment_references} + selected_ids = {r["name"] for r in selected_payment_schedules} + duplicate_ids = existing_ids & selected_ids + + if duplicate_ids: + duplicate_schedules = [] + for row in selected_payment_schedules: + if row["name"] in duplicate_ids: + existing_ref = next( + (r for r in existing_payment_references if r["payment_schedule"] == row["name"]), + {}, + ) + existing_pr = existing_ref.get("parent") + duplicate_schedules.append( + f"Payment Term: {row.get('payment_term')}, " + f"Due Date: {row.get('due_date')}, " + f"Amount: {row.get('payment_amount')} " + f"(already requested in PR {existing_pr})" + ) + frappe.throw( + _("The following payment schedule(s) already exist:\n{0}").format( + "\n".join(duplicate_schedules) + ) + ) + + payment_reference = set_payment_references(args.get("schedules")) + + # Determine grand_total + if selected_payment_schedules and not has_payment_entry: + grand_total = sum(row.get("payment_amount") for row in selected_payment_schedules) + else: + grand_total = get_amount(ref_doc, gateway_account.get("payment_account")) + if not grand_total: frappe.throw(_("Payment Entry is already created")) @@ -566,7 +641,6 @@ def make_payment_request(**args): loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points)) # sets fields on ref_doc ref_doc.db_update() grand_total = grand_total - loyalty_amount - # fetches existing payment request `grand_total` amount existing_payment_request_amount = get_existing_payment_request_amount(ref_doc) @@ -586,21 +660,20 @@ def make_payment_request(**args): else: # If PR's are processed, cancel all of them. cancel_old_payment_requests(ref_doc.doctype, ref_doc.name) - else: + elif not selected_payment_schedules: grand_total = validate_and_calculate_grand_total(grand_total, existing_payment_request_amount) - draft_payment_request = frappe.db.get_value( "Payment Request", {"reference_doctype": ref_doc.doctype, "reference_name": ref_doc.name, "docstatus": 0}, ) if draft_payment_request: - frappe.db.set_value( - "Payment Request", draft_payment_request, "grand_total", grand_total, update_modified=False - ) pr = frappe.get_doc("Payment Request", draft_payment_request) - set_payment_references(pr, ref_doc) + if selected_payment_schedules: + apply_payment_references(pr, payment_reference) + pr.save() + else: bank_account = ( get_party_bank_account(args.get("party_type"), args.get("party")) @@ -621,8 +694,6 @@ def make_payment_request(**args): party_account = get_party_account(party_type, ref_doc.get(party_type.lower()), ref_doc.company) party_account_currency = get_account_currency(party_account) - set_payment_references(pr, ref_doc) - pr.update( { "payment_gateway_account": gateway_account.get("name"), @@ -657,7 +728,10 @@ def make_payment_request(**args): } ) - # Update dimensions + if selected_payment_schedules: + apply_payment_references(pr, payment_reference) + + # Dimensions pr.update( { "cost_center": ref_doc.get("cost_center"), @@ -686,6 +760,51 @@ def make_payment_request(**args): return pr.as_dict() +def apply_payment_references(pr, payment_reference): + existing_refs = pr.get("payment_reference") or [] + + existing_ids = {r.get("payment_schedule") for r in existing_refs if r.get("payment_schedule")} + new_refs = [r for r in (payment_reference or []) if r.get("payment_schedule") not in existing_ids] + pr.set("payment_reference", existing_refs + new_refs) + pr.set("grand_total", sum(flt(r.get("amount")) for r in pr.get("payment_reference"))) + + +def set_payment_references(payment_schedules): + payment_schedules = json.loads(payment_schedules) if payment_schedules else [] + payment_reference = [] + + for row in payment_schedules: + payment_reference.append( + { + "payment_term": row.get("payment_term"), + "payment_schedule": row.get("name"), + "description": row.get("description"), + "due_date": row.get("due_date"), + "amount": row.get("payment_amount"), + } + ) + + return payment_reference + + +def get_existing_payment_entry(ref_docname): + pe = frappe.qb.DocType("Payment Entry") + per = frappe.qb.DocType("Payment Entry Reference") + + existing_pe = ( + frappe.qb.from_(pe) + .join(per) + .on(per.parent == pe.name) + .select(pe.name) + .where(pe.docstatus < 2) + .where(per.reference_name == ref_docname) + .limit(1) + .run() + ) + + return existing_pe + + def get_amount(ref_doc, payment_account=None): """get amount based on doctype""" grand_total = 0 @@ -1032,36 +1151,20 @@ def get_irequests_of_payment_request(doc: str | None = None) -> list: return res -def set_payment_references(payment_request, ref_doc): +@frappe.whitelist() +def get_available_payment_schedules(reference_doctype, reference_name): + ref_doc = frappe.get_doc(reference_doctype, reference_name) + if not hasattr(ref_doc, "payment_schedule") or not ref_doc.payment_schedule: - return + return [] - existing_refs = get_existing_payment_references(ref_doc.name) + if get_existing_payment_entry(reference_name): + return [] - existing_map = {make_key(r.payment_term, r.due_date, r.amount): r for r in existing_refs} + existing_refs = get_existing_payment_references(reference_name) + existing_ids = {r["payment_schedule"] for r in existing_refs if r.get("payment_schedule")} - payment_request.reference = [] - - for row in ref_doc.payment_schedule: - key = make_key(row.payment_term, row.due_date, row.payment_amount) - - existing = existing_map.get(key) - if existing and (existing.manually_selected or existing.auto_selected): - continue - - payment_request.append( - "payment_reference", - { - "payment_term": row.payment_term, - "description": row.description, - "due_date": row.due_date, - "amount": row.payment_amount, - }, - ) - - -def make_key(payment_term, due_date, amount): - return (payment_term, due_date, flt(amount)) + return [r for r in ref_doc.payment_schedule if r.name not in existing_ids] def get_existing_payment_references(reference_name): @@ -1075,14 +1178,15 @@ def get_existing_payment_references(reference_name): .select( PRF.payment_term, PRF.due_date, - PRF.amount, - PRF.manually_selected, - PRF.auto_selected, + PRF.amount.as_("payment_amount"), + PRF.payment_schedule, PRF.parent, ) .where(PR.reference_name == reference_name) - .where(PR.docstatus == 1) - .where(PR.status.isin(["Initiated", "Partially Paid", "Payment Ordered", "Paid"])) + .where(PR.docstatus < 2) + .where( + PR.status.isin(["Draft", "Requested", "Initiated", "Partially Paid", "Payment Ordered", "Paid"]) + ) ).run(as_dict=True) return result diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py index 1374e64c032..41375d9d9af 100644 --- a/erpnext/accounts/doctype/payment_request/test_payment_request.py +++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py @@ -1,12 +1,14 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import json import re import unittest from unittest.mock import patch import frappe from frappe.tests import IntegrationTestCase +from frappe.utils import add_days, nowdate from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_terms_template @@ -852,64 +854,122 @@ class TestPaymentRequest(IntegrationTestCase): self.assertEqual(pr.grand_total, pi.outstanding_amount) - def test_payment_schedule_row_selection(self): - from frappe.utils import add_days, nowdate - - po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=86) - + def test_payment_request_grand_total_from_selected_schedules(self): + po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=100) po.payment_schedule = [] - po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 33}) - po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 33}) - po.append("payment_schedule", {"due_date": add_days(nowdate(), 2), "payment_amount": 20}) + po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 30}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 30}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 2), "payment_amount": 40}) po.save() po.submit() - pr1 = make_payment_request( - dt="Purchase Order", - dn=po.name, - mute_email=1, - submit_doc=False, - return_doc=True, - ) - pr1.payment_reference[0].manually_selected = 1 - pr1.payment_reference[1].auto_selected = 0 - pr1.payment_reference[2].manually_selected = 1 - pr1.grand_total = 53 - pr1.submit() - - pr2 = make_payment_request( + schedules = json.dumps( + [ + { + "payment_term": row.payment_term, + "name": row.name, + "due_date": row.due_date, + "payment_amount": row.payment_amount, + "description": row.description, + } + for row in [po.payment_schedule[0], po.payment_schedule[2]] + ] + ) + pr = make_payment_request( dt="Purchase Order", dn=po.name, mute_email=1, submit_doc=False, return_doc=True, + schedules=schedules, ) - self.assertEqual(len(pr2.payment_reference), 1) - self.assertEqual(pr2.payment_reference[0].amount, 33) + pr.submit() - def test_auto_selected_rows_are_not_reused(self): + self.assertEqual(pr.grand_total, 70) + self.assertEqual(len(pr.payment_reference), 2) + + def test_draft_pr_reuse_merges_payment_references(self): from frappe.utils import add_days, nowdate - po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=80) + po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=100) po.payment_schedule = [] - po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 40}) - po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 10}) - po.append("payment_schedule", {"due_date": add_days(nowdate(), 2), "payment_amount": 30}) + po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 50}) + po.append("payment_schedule", {"due_date": add_days(nowdate(), 1), "payment_amount": 50}) + po.save() + po.submit() + schedules = json.dumps( + [ + { + "payment_term": row.payment_term, + "name": row.name, + "due_date": row.due_date, + "payment_amount": row.payment_amount, + "description": row.description, + } + for row in [po.payment_schedule[0]] + ] + ) + pr = make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + schedules=schedules, + ) + + pr.save() + schedules = json.dumps( + [ + { + "payment_term": row.payment_term, + "name": row.name, + "due_date": row.due_date, + "payment_amount": row.payment_amount, + "description": row.description, + } + for row in [po.payment_schedule[1]] + ] + ) + # call make_payment_request again → reuse draft + pr_reused = make_payment_request( + dt="Purchase Order", + dn=po.name, + mute_email=1, + submit_doc=False, + return_doc=True, + schedules=schedules, + ) + + self.assertEqual(pr.name, pr_reused.name) + self.assertEqual(pr_reused.grand_total, 100) + self.assertEqual(len(pr_reused.payment_reference), 2) + + def test_schedule_pr_not_allowed_if_payment_entry_exists(self): + po = create_purchase_order(do_not_save=1, currency="INR", qty=1, rate=100) + po.payment_schedule = [] + row = po.append("payment_schedule", {"due_date": nowdate(), "payment_amount": 100}) po.save() po.submit() - pr1 = make_payment_request( - dt="Purchase Order", - dn=po.name, - mute_email=1, - submit_doc=False, - return_doc=True, - ) + # create PE first + pr = make_payment_request(dt="Purchase Order", dn=po.name, mute_email=1, submit_doc=1, return_doc=1) + pr.create_payment_entry() - pr1.submit() + schedules = json.dumps( + [ + { + "name": row.name, + "payment_term": row.payment_term, + "due_date": row.due_date, + "payment_amount": row.payment_amount, + "description": row.description, + } + ] + ) with self.assertRaises(frappe.ValidationError): make_payment_request( @@ -918,4 +978,5 @@ class TestPaymentRequest(IntegrationTestCase): mute_email=1, submit_doc=False, return_doc=True, + schedules=schedules, ) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 0aa6fa85605..ac214fdac43 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -134,7 +134,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying. this.frm.add_custom_button( __("Payment Request"), function () { - me.make_payment_request(); + me.make_payment_request_with_schedule(); }, __("Create") ); diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 6682270b4c9..64728cd1e0a 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -138,7 +138,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends ( this.frm.add_custom_button( __("Payment Request"), function () { - me.make_payment_request(); + me.make_payment_request_with_schedule(); }, __("Create") ); diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 073312a8450..87435f19393 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -428,7 +428,7 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends ( this.frm.add_custom_button( __("Payment Request"), function () { - me.make_payment_request(); + me.make_payment_request_with_schedule(); }, __("Create") ); diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index f7a53709f79..aa02eec7b62 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -450,7 +450,106 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe }, }); } + make_payment_request_with_schedule = async function () { + let frm = this.frm; + const { message: schedules } = await frappe.call({ + method: "erpnext.accounts.doctype.payment_request.payment_request.get_available_payment_schedules", + args: { + reference_doctype: frm.doctype, + reference_name: frm.doc.name, + }, + }); + if (!schedules.length) { + this.make_payment_request(); + return; + } + if (!schedules || !schedules.length) { + frappe.msgprint(__("No pending payment schedules available.")); + return; + } + + const dialog = new frappe.ui.Dialog({ + title: __("Select Payment Schedule"), + fields: [ + { + fieldtype: "Table", + fieldname: "payment_schedules", + label: __("Payment Schedules"), + cannot_add_rows: true, + in_place_edit: false, + data: schedules, + fields: [ + { + fieldtype: "Data", + fieldname: "name", + label: __("Schedule Name"), + read_only: 1, + }, + { + fieldtype: "Data", + fieldname: "payment_term", + label: __("Payment Term"), + in_list_view: 1, + read_only: 1, + }, + { + fieldtype: "Date", + fieldname: "due_date", + label: __("Due Date"), + in_list_view: 1, + read_only: 1, + }, + { + fieldtype: "Currency", + fieldname: "payment_amount", + label: __("Amount"), + in_list_view: 1, + read_only: 1, + }, + ], + }, + ], + primary_action_label: __("Create Payment Request"), + primary_action: async () => { + const values = dialog.get_values(); + const selected = values.payment_schedules.filter((r) => r.__checked); + + if (!selected.length) { + frappe.msgprint(__("Please select at least one schedule.")); + return; + } + console.log(selected); + dialog.hide(); + let me = this; + const payment_request_type = ["Sales Order", "Sales Invoice"].includes(this.frm.doc.doctype) + ? "Inward" + : "Outward"; + const { message: pr_name } = await frappe.call({ + method: "erpnext.accounts.doctype.payment_request.payment_request.make_payment_request", + args: { + dt: me.frm.doc.doctype, + dn: me.frm.doc.name, + recipient_id: me.frm.doc.contact_email, + payment_request_type: payment_request_type, + party_type: payment_request_type == "Outward" ? "Supplier" : "Customer", + party: payment_request_type == "Outward" ? me.frm.doc.supplier : me.frm.doc.customer, + party_name: + payment_request_type == "Outward" + ? me.frm.doc.supplier_name + : me.frm.doc.customer_name, + reference_doctype: frm.doctype, + reference_name: frm.docname, + schedules: selected, + }, + }); + + frappe.set_route("Form", "Payment Request", pr_name.name); + }, + }); + + dialog.show(); + }; onload_post_render() { if ( this.frm.doc.__islocal && diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index c228c45b175..c47ce90a865 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -1150,7 +1150,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex if (flt(doc.per_billed) < 100 + frappe.boot.sysdefaults.over_billing_allowance) { this.frm.add_custom_button( __("Payment Request"), - () => this.make_payment_request(), + () => this.make_payment_request_with_schedule(), __("Create") ); From 6902fd6b3368a5f6e084cae3ca71f1ed6600aebe Mon Sep 17 00:00:00 2001 From: ljain112 Date: Tue, 17 Feb 2026 13:16:41 +0530 Subject: [PATCH 70/78] refactor: use postprocess in mapped_doc to update items in subcontracting controller (cherry picked from commit 1d3d09f48cfbac85d8ac59f7a116086d7a5fa32f) --- .../controllers/subcontracting_controller.py | 160 +++++++++--------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index ebfda036044..5a276d574d4 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -1395,6 +1395,68 @@ def make_rm_stock_entry( if target_doc and target_doc.get("items"): target_doc.items = [] + def post_process(source_doc, target_doc): + target_doc.purpose = "Send to Subcontractor" + + if order_doctype == "Purchase Order": + target_doc.purchase_order = source_doc.name + else: + target_doc.subcontracting_order = source_doc.name + + target_doc.set_stock_entry_type() + + over_transfer_allowance = frappe.get_single_value( + "Buying Settings", "over_transfer_allowance" + ) + for fg_item_code in fg_item_code_list: + for rm_item in rm_items: + if ( + rm_item.get("main_item_code") == fg_item_code + or rm_item.get("item_code") == fg_item_code + ): + rm_item_code = rm_item.get("rm_item_code") + qty = rm_item.get("qty") or max( + rm_item.get("required_qty") - rm_item.get("total_supplied_qty"), 0 + ) + if qty <= 0 and rm_item.get("total_supplied_qty"): + per_transferred = ( + flt( + rm_item.get("total_supplied_qty") / rm_item.get("required_qty"), + frappe.db.get_default("float_precision"), + ) + * 100 + ) + if per_transferred >= 100 + over_transfer_allowance: + continue + + items_dict = { + rm_item_code: { + rm_detail_field: rm_item.get("name"), + "item_name": rm_item.get("item_name") + or item_wh.get(rm_item_code, {}).get("item_name", ""), + "description": item_wh.get(rm_item_code, {}).get("description", ""), + "qty": qty, + "from_warehouse": rm_item.get("warehouse") + or rm_item.get("reserve_warehouse"), + "to_warehouse": source_doc.supplier_warehouse, + "stock_uom": rm_item.get("stock_uom"), + "serial_and_batch_bundle": rm_item.get("serial_and_batch_bundle"), + "main_item_code": fg_item_code, + "allow_alternative_item": item_wh.get(rm_item_code, {}).get( + "allow_alternative_item" + ), + "use_serial_batch_fields": rm_item.get("use_serial_batch_fields"), + "serial_no": rm_item.get("serial_no") + if rm_item.get("use_serial_batch_fields") + else None, + "batch_no": rm_item.get("batch_no") + if rm_item.get("use_serial_batch_fields") + else None, + } + } + + target_doc.add_to_stock_entry_detail(items_dict) + stock_entry = get_mapped_doc( order_doctype, subcontract_order.name, @@ -1415,67 +1477,9 @@ def make_rm_stock_entry( }, target_doc, ignore_child_tables=True, + postprocess=post_process, ) - stock_entry.purpose = "Send to Subcontractor" - - if order_doctype == "Purchase Order": - stock_entry.purchase_order = subcontract_order.name - else: - stock_entry.subcontracting_order = subcontract_order.name - - stock_entry.set_stock_entry_type() - - over_transfer_allowance = frappe.get_single_value("Buying Settings", "over_transfer_allowance") - for fg_item_code in fg_item_code_list: - for rm_item in rm_items: - if ( - rm_item.get("main_item_code") == fg_item_code - or rm_item.get("item_code") == fg_item_code - ): - rm_item_code = rm_item.get("rm_item_code") - qty = rm_item.get("qty") or max( - rm_item.get("required_qty") - rm_item.get("total_supplied_qty"), 0 - ) - if qty <= 0 and rm_item.get("total_supplied_qty"): - per_transferred = ( - flt( - rm_item.get("total_supplied_qty") / rm_item.get("required_qty"), - frappe.db.get_default("float_precision"), - ) - * 100 - ) - if per_transferred >= 100 + over_transfer_allowance: - continue - - items_dict = { - rm_item_code: { - rm_detail_field: rm_item.get("name"), - "item_name": rm_item.get("item_name") - or item_wh.get(rm_item_code, {}).get("item_name", ""), - "description": item_wh.get(rm_item_code, {}).get("description", ""), - "qty": qty, - "from_warehouse": rm_item.get("warehouse") - or rm_item.get("reserve_warehouse"), - "to_warehouse": subcontract_order.supplier_warehouse, - "stock_uom": rm_item.get("stock_uom"), - "serial_and_batch_bundle": rm_item.get("serial_and_batch_bundle"), - "main_item_code": fg_item_code, - "allow_alternative_item": item_wh.get(rm_item_code, {}).get( - "allow_alternative_item" - ), - "use_serial_batch_fields": rm_item.get("use_serial_batch_fields"), - "serial_no": rm_item.get("serial_no") - if rm_item.get("use_serial_batch_fields") - else None, - "batch_no": rm_item.get("batch_no") - if rm_item.get("use_serial_batch_fields") - else None, - } - } - - stock_entry.add_to_stock_entry_detail(items_dict) - if target_doc: return stock_entry else: @@ -1507,6 +1511,8 @@ def add_items_in_ste(ste_doc, row, qty, rm_details, rm_detail_field="sco_rm_deta def make_return_stock_entry_for_subcontract( available_materials, order_doc, rm_details, order_doctype="Subcontracting Order" ): + rm_detail_field = "po_detail" if order_doctype == "Purchase Order" else "sco_rm_detail" + def post_process(source_doc, target_doc): target_doc.purpose = "Material Transfer" @@ -1517,6 +1523,21 @@ def make_return_stock_entry_for_subcontract( target_doc.company = source_doc.company target_doc.is_return = 1 + for _key, value in available_materials.items(): + if not value.qty: + continue + + if item_details := value.get("item_details"): + item_details["serial_and_batch_bundle"] = None + + if value.batch_no: + for batch_no, qty in value.batch_no.items(): + if qty > 0: + add_items_in_ste(target_doc, value, qty, rm_details, rm_detail_field, batch_no) + else: + add_items_in_ste(target_doc, value, value.qty, rm_details, rm_detail_field) + + target_doc.set_stock_entry_type() ste_doc = get_mapped_doc( order_doctype, @@ -1531,27 +1552,6 @@ def make_return_stock_entry_for_subcontract( postprocess=post_process, ) - if order_doctype == "Purchase Order": - rm_detail_field = "po_detail" - else: - rm_detail_field = "sco_rm_detail" - - for _key, value in available_materials.items(): - if not value.qty: - continue - - if item_details := value.get("item_details"): - item_details["serial_and_batch_bundle"] = None - - if value.batch_no: - for batch_no, qty in value.batch_no.items(): - if qty > 0: - add_items_in_ste(ste_doc, value, qty, rm_details, rm_detail_field, batch_no) - else: - add_items_in_ste(ste_doc, value, value.qty, rm_details, rm_detail_field) - - ste_doc.set_stock_entry_type() - return ste_doc From 4adcc1c52167304b26b624291095f1e0512bae04 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 17:33:26 +0530 Subject: [PATCH 71/78] feat: default letterhead and print format (cherry picked from commit 0ea22f9796de62ce3fdee62192bedd32f09d8c5e) --- erpnext/setup/install.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 94706443d6b..d224aa017b0 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -35,6 +35,7 @@ def after_install(): update_roles() make_default_operations() update_pegged_currencies() + set_default_print_formats() create_letter_head() frappe.db.commit() @@ -301,6 +302,31 @@ def update_pegged_currencies(): doc.save() +def set_default_print_formats(): + default_map = { + "Sales Order": "Sales Order with Item Image", + "Sales Invoice": "Sales Invoice with Item Image", + "Delivery Note": "Delivery Note with Item Image", + "Purchase Order": "Purchase Order with Item Image", + "Purchase Invoice": "Purchase Invoice with Item Image", + "POS Invoice": "POS Invoice with Item Image", + } + + for doctype, print_format in default_map.items(): + if frappe.get_meta(doctype).default_print_format: + continue + + frappe.make_property_setter( + { + "doctype": doctype, + "doctype_or_field": "DocType", + "property": "default_print_format", + "value": print_format, + }, + validate_fields_for_doctype=False, + ) + + def create_letter_head(): base_path = frappe.get_app_path("erpnext", "accounts", "letterhead") @@ -318,6 +344,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, + "is_default": 1 if name == "Company Letterhead - Grey" else 0, } ) doc.insert(ignore_permissions=True) From dd41f2ceb75a53ffcdf65e7934397c38b84e0bca Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 18:09:41 +0530 Subject: [PATCH 72/78] fix: add missing property_type (cherry picked from commit fbf5529ddd26c8b65d51e156ce322ad78854b4da) --- erpnext/setup/install.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index d224aa017b0..3337ec63252 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -322,6 +322,7 @@ def set_default_print_formats(): "doctype_or_field": "DocType", "property": "default_print_format", "value": print_format, + "property_type": "Link", }, validate_fields_for_doctype=False, ) From b21acec7116579ece48e2642fd5f9bbaf1bbf7c4 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 18:52:08 +0530 Subject: [PATCH 73/78] test: debugging the issue (cherry picked from commit 570f574758cc14151034cfb1a5a6d9066447930a) --- erpnext/setup/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 3337ec63252..e7740d253df 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -345,7 +345,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, - "is_default": 1 if name == "Company Letterhead - Grey" else 0, + "is_default": 1 if name == "Company Letterhead" else 0, } ) doc.insert(ignore_permissions=True) From 1e64dea6a078c3fe388220017aac3036ea1af114 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Tue, 24 Feb 2026 18:24:09 +0530 Subject: [PATCH 74/78] fix: test cases related to default letterhead change (cherry picked from commit 8a2cb96c2ae3333650e2f805f557c69743b0d6d7) --- .../test_process_statement_of_accounts.py | 11 +++++++++++ erpnext/setup/install.py | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py index 7d5cfb90af8..2d599fee1af 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py @@ -18,8 +18,19 @@ class TestProcessStatementOfAccounts(AccountsTestMixin, IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() + letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") + letterhead.is_default = 0 + letterhead.save() cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) + @classmethod + def tearDownClass(cls): + super().tearDownClass() + letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") + letterhead.is_default = 1 + letterhead.save() + frappe.db.commit() # nosemgrep + def setUp(self): self.create_company() self.create_customer() diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index e7740d253df..726906ac6cb 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -316,6 +316,9 @@ def set_default_print_formats(): if frappe.get_meta(doctype).default_print_format: continue + if not frappe.db.exists("Print Format", print_format): + continue + frappe.make_property_setter( { "doctype": doctype, @@ -345,7 +348,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, - "is_default": 1 if name == "Company Letterhead" else 0, + "is_default": 1 if name == "Company Letterhead - Grey" else 0, } ) doc.insert(ignore_permissions=True) From 222f51b4d02edf5c84fad50c365e9f04de454e21 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 01:39:17 +0530 Subject: [PATCH 75/78] feat: standard print format for Sales Order and Purchase Invoice (cherry picked from commit 371efce88a2b1df2d159e98547be02296590772d) --- .../purchase_invoice_standard/__init__.py | 0 .../purchase_invoice_standard.json | 33 +++++++++++++++++++ .../__init__.py | 0 .../purchase_invoice_with_item_image.json | 33 +++++++++++++++++++ .../purchase_order_with_item_image.json | 4 +-- erpnext/controllers/accounts_controller.py | 4 ++- erpnext/public/js/print.js | 13 +++++++- .../sales_order_standard/__init__.py | 0 .../sales_order_standard.json | 33 +++++++++++++++++++ .../sales_order_with_item_image/__init__.py | 0 .../sales_order_with_item_image.json | 33 +++++++++++++++++++ 11 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 erpnext/accounts/print_format/purchase_invoice_standard/__init__.py create mode 100644 erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json create mode 100644 erpnext/accounts/print_format/purchase_invoice_with_item_image/__init__.py create mode 100644 erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json create mode 100644 erpnext/selling/print_format/sales_order_standard/__init__.py create mode 100644 erpnext/selling/print_format/sales_order_standard/sales_order_standard.json create mode 100644 erpnext/selling/print_format/sales_order_with_item_image/__init__.py create mode 100644 erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json diff --git a/erpnext/accounts/print_format/purchase_invoice_standard/__init__.py b/erpnext/accounts/print_format/purchase_invoice_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json new file mode 100644 index 00000000000..4e4d3d0575f --- /dev/null +++ b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-02-20 18:45:58.615902", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "doc_type": "Purchase Invoice", + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t{{ _(\"Supplier Name\") }}: {{doc.supplier_name }}\n\t\t\t\t\n\t\t\t\t\t{{ _(\"Due Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.due_date) }}\n\t\t\t\t
{{ _(\"Invoice Number\") }}: {{ doc.name }}\n\t\t\t\t\t{{ _(\"Invoice Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.posting_date) }}\n\t\t\t\t
{{ _(\"Supplier Address\") }}:
\n\t\t\t\t\t{% if doc.supplier_address %}\n\t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n\t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n\t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n\t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n\t\t\t\t\t{% endif %}\n\t\t\t\t
{{ _(\"Company Address\") }}:
\n {% if doc.billing_address %}\n {% set billing_address = frappe.db.get_value(\"Address\", doc.billing_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.company }}
\n {{ billing_address.get(\"address_line1\") or \"\" }}
\n {% if billing_address.get(\"address_line2\") %}{{ billing_address.get(\"address_line2\") }}
{% endif %}\n {{ billing_address.get(\"city\") or \"\" }}, {{ billing_address.get(\"state\") or \"\" }} {{ billing_address.get(\"pincode\") or \"\" }}, {{ billing_address.get(\"country\") or \"\" }}
\n {% endif %}\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}{{ item.item_name }}{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t
\n\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t

{{ _(\"Total in words\") }}

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\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\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\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
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 00:46:57.038144", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Purchase Invoice Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "wkhtmltopdf", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "DocType", + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/__init__.py b/erpnext/accounts/print_format/purchase_invoice_with_item_image/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json new file mode 100644 index 00000000000..310a2f1b0cb --- /dev/null +++ b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-02-20 18:47:19.416106", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "doc_type": "Purchase Invoice", + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Supplier Name:
\n\t\t\t\t\t\t
Supplier Address:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Invoice:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Due By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 00:55:47.184575", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Purchase Invoice with Item Image", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "wkhtmltopdf", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "DocType", + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json index 2f4c09b0cb6..df27dbbe479 100644 --- a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json +++ b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Supplier Name:
\n\t\t\t\t\t\t
Supplier Address:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 20:07:51.896474", + "modified": "2026-02-23 01:34:16.965402", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order with Item Image", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 9d81a6318c0..6a75859cdb0 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -4296,7 +4296,7 @@ def get_missing_company_details(doctype, docname): from frappe.contacts.doctype.address.address import get_address_display_list company = frappe.db.get_value(doctype, docname, "company") - if doctype == "Purchase Order": + if doctype in ["Purchase Order", "Purchase Invoice"]: company_address = frappe.db.get_value(doctype, docname, "billing_address") else: company_address = frappe.db.get_value(doctype, docname, "company_address") @@ -4392,6 +4392,8 @@ def update_doc_company_address(current_doctype, docname, company_address, detail address_field_map = { "Purchase Order": ("billing_address", "billing_address_display"), + "Purchase Invoice": ("billing_address", "billing_address_display"), + "Sales Order": ("company_address", "company_address_display"), "Sales Invoice": ("company_address", "company_address_display"), "Delivery Note": ("company_address", "company_address_display"), "POS Invoice": ("company_address", "company_address_display"), diff --git a/erpnext/public/js/print.js b/erpnext/public/js/print.js index 105a580aed6..4f397ef2047 100644 --- a/erpnext/public/js/print.js +++ b/erpnext/public/js/print.js @@ -1,11 +1,22 @@ -const doctype_list = ["Sales Invoice", "Delivery Note", "Purchase Order", "POS Invoice"]; +const doctype_list = [ + "Sales Order", + "Sales Invoice", + "Delivery Note", + "Purchase Order", + "Purchase Invoice", + "POS Invoice", +]; const allowed_print_formats = [ + "Sales Order Standard", + "Sales Order with Item Image", "Sales Invoice Standard", "Sales Invoice with Item Image", "Delivery Note Standard", "Delivery Note with Item Image", "Purchase Order Standard", "Purchase Order with Item Image", + "Purchase Invoice Standard", + "Purchase Invoice with Item Image", "POS Invoice Standard", "POS Invoice with Item Image", ]; diff --git a/erpnext/selling/print_format/sales_order_standard/__init__.py b/erpnext/selling/print_format/sales_order_standard/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json new file mode 100644 index 00000000000..13651985c2e --- /dev/null +++ b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-02-23 01:03:48.196656", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "doc_type": "Sales Order", + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t{{ _(\"Customer Name\") }}: {{doc.customer_name }}\n\t\t\t\t\n\t\t\t\t\t{{ _(\"Dilevery Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.delivery_date) }}\n\t\t\t\t
{{ _(\"Sales Order\") }}: {{ doc.name }}\n\t\t\t\t\t{{ _(\"Posting Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.transaction_date) }}\n\t\t\t\t
{{ _(\"Bill From\") }}:
\n\t\t\t\t\t{% if doc.company_address %}\n {% set company_address = frappe.db.get_value(\"Address\", doc.company_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.company }}
\n {{ company_address.get(\"address_line1\") or \"\" }}
\n {% if company_address.get(\"address_line2\") %}{{ company_address.get(\"address_line2\") }}
{% endif %}\n {{ company_address.get(\"city\") or \"\" }}, {{ company_address.get(\"state\") or \"\" }} {{ company_address.get(\"pincode\") or \"\" }}, {{ company_address.get(\"country\") or \"\" }}
\n {% endif %}\n\t\t\t\t
{{ _(\"Bill To\") }}:
\n\t\t\t\t {% if doc.customer_address %}\n\t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.customer_name }}
\n\t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n\t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n\t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n\t\t\t\t\t{% endif %}\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}{{ item.item_name }}{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t
\n\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t

{{ _(\"Total in words\") }}

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\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\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\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
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 01:06:39.568460", + "modified_by": "Administrator", + "module": "Selling", + "name": "Sales Order Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "wkhtmltopdf", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "DocType", + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/selling/print_format/sales_order_with_item_image/__init__.py b/erpnext/selling/print_format/sales_order_with_item_image/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json new file mode 100644 index 00000000000..d27fa63154d --- /dev/null +++ b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json @@ -0,0 +1,33 @@ +{ + "absolute_value": 0, + "align_labels_right": 0, + "creation": "2026-02-23 01:08:54.564508", + "custom_format": 1, + "default_print_language": "en", + "disabled": 0, + "doc_type": "Sales Order", + "docstatus": 0, + "doctype": "Print Format", + "font_size": 14, + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Sales Order:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Order Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Delivery Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.delivery_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 01:08:54.564508", + "modified_by": "Administrator", + "module": "Selling", + "name": "Sales Order with Item Image", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "wkhtmltopdf", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "DocType", + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} From f4ec356dfbdbe58ea198844dcf24d941d763fd6e Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 13:05:48 +0530 Subject: [PATCH 76/78] refactor: add translation and fix typo (cherry picked from commit cbea4493c1530e9b64f42ce428d315d57a2c5aa2) --- .../purchase_invoice_with_item_image.json | 4 ++-- .../purchase_order_with_item_image.json | 4 ++-- .../sales_order_standard/sales_order_standard.json | 4 ++-- .../sales_order_with_item_image.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json index 310a2f1b0cb..ddcd4b48d5a 100644 --- a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Invoice:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Due By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 00:55:47.184575", + "modified": "2026-02-23 12:58:12.227646", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice with Item Image", diff --git a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json index df27dbbe479..b70401ea0a2 100644 --- a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json +++ b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 01:34:16.965402", + "modified": "2026-02-23 14:15:59.698407", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order with Item Image", diff --git a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json index 13651985c2e..0df19107c1b 100644 --- a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json +++ b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t{{ _(\"Customer Name\") }}: {{doc.customer_name }}\n\t\t\t\t\n\t\t\t\t\t{{ _(\"Dilevery Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.delivery_date) }}\n\t\t\t\t
{{ _(\"Sales Order\") }}: {{ doc.name }}\n\t\t\t\t\t{{ _(\"Posting Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.transaction_date) }}\n\t\t\t\t
{{ _(\"Bill From\") }}:
\n\t\t\t\t\t{% if doc.company_address %}\n {% set company_address = frappe.db.get_value(\"Address\", doc.company_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.company }}
\n {{ company_address.get(\"address_line1\") or \"\" }}
\n {% if company_address.get(\"address_line2\") %}{{ company_address.get(\"address_line2\") }}
{% endif %}\n {{ company_address.get(\"city\") or \"\" }}, {{ company_address.get(\"state\") or \"\" }} {{ company_address.get(\"pincode\") or \"\" }}, {{ company_address.get(\"country\") or \"\" }}
\n {% endif %}\n\t\t\t\t
{{ _(\"Bill To\") }}:
\n\t\t\t\t {% if doc.customer_address %}\n\t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.customer_name }}
\n\t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n\t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n\t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n\t\t\t\t\t{% endif %}\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}{{ item.item_name }}{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t
\n\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t

{{ _(\"Total in words\") }}

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\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\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\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
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t{{ _(\"Customer Name\") }}: {{doc.customer_name }}\n\t\t\t\t\n\t\t\t\t\t{{ _(\"Delievery Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.delivery_date) }}\n\t\t\t\t
{{ _(\"Sales Order\") }}: {{ doc.name }}\n\t\t\t\t\t{{ _(\"Posting Date\") }}: {{\n\t\t\t\t\tfrappe.utils.format_date(doc.transaction_date) }}\n\t\t\t\t
{{ _(\"Bill From\") }}:
\n\t\t\t\t\t{% if doc.company_address %}\n {% set company_address = frappe.db.get_value(\"Address\", doc.company_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.company }}
\n {{ company_address.get(\"address_line1\") or \"\" }}
\n {% if company_address.get(\"address_line2\") %}{{ company_address.get(\"address_line2\") }}
{% endif %}\n {{ company_address.get(\"city\") or \"\" }}, {{ company_address.get(\"state\") or \"\" }} {{ company_address.get(\"pincode\") or \"\" }}, {{ company_address.get(\"country\") or \"\" }}
\n {% endif %}\n\t\t\t\t
{{ _(\"Bill To\") }}:
\n\t\t\t\t {% if doc.customer_address %}\n\t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.customer_name }}
\n\t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n\t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n\t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n\t\t\t\t\t{% endif %}\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}{{ item.item_name }}{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t
\n\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t

{{ _(\"Total in words\") }}

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\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\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\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
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 01:06:39.568460", + "modified": "2026-02-23 13:04:24.036955", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Standard", diff --git a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json index d27fa63154d..25cd22bcf66 100644 --- a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json +++ b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Sales Order:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Order Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Delivery Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.delivery_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Sales Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.delivery_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 01:08:54.564508", + "modified": "2026-02-23 13:00:02.496058", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order with Item Image", From 265342d40a4d025b694b1f19bdb93f2632b4bc61 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 25 Feb 2026 09:57:13 +0530 Subject: [PATCH 77/78] chore: clearer description for internal transfer at arms length (cherry picked from commit bd9e5e97d716f1ae64b6a2d2d89f83ad381d8780) --- erpnext/stock/doctype/stock_settings/stock_settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index a9f6d1904a3..e2c55c3b8e3 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -456,7 +456,7 @@ }, { "default": "0", - "description": "If enabled, the item rate won't adjust to the valuation rate during internal transfers, but accounting will still use the valuation rate.", + "description": "If enabled, the item rate won't adjust to the valuation rate during internal transfers, but accounting will still use the valuation rate. This will allow the user to specify a different rate for printing or taxation purposes.", "fieldname": "allow_internal_transfer_at_arms_length_price", "fieldtype": "Check", "label": "Allow Internal Transfers at Arm's Length Price" @@ -562,7 +562,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-16 10:36:59.921491", + "modified": "2026-02-25 09:56:34.105949", "modified_by": "Administrator", "module": "Stock", "name": "Stock Settings", From 0fd9fc48f33a5d787ca6a0a6f2063b53a1b30080 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 25 Feb 2026 10:19:10 +0530 Subject: [PATCH 78/78] fix: item code shows undefined (cherry picked from commit 9ef7f057126c0d3b10474f32dee7b55881fdae24) --- erpnext/public/js/utils.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 3d3b86a15c5..41e7a7cad81 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -1081,6 +1081,8 @@ function add_link_title(value, doc, df, title_field) { } else { return value; } + } else { + return value; } }