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/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
index f850749fe4f..020a692e38f 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)
@@ -373,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
)
)
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/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
index e4f935e91fb..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
@@ -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,37 +84,30 @@ 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(
- """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)
@@ -148,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/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
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/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js
index c3743c6e1f0..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;
@@ -1450,16 +1454,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);
}
},
});
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",
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..a1adb181d35
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_reference/payment_reference.json
@@ -0,0 +1,88 @@
+{
+ "actions": [],
+ "allow_rename": 1,
+ "creation": "2025-12-02 17:50:08.648006",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "payment_term",
+ "column_break_lnjp",
+ "payment_schedule",
+ "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"
+ },
+ {
+ "fieldname": "column_break_lnjp",
+ "fieldtype": "Column Break"
+ },
+ {
+ "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": "2026-01-19 02:21:36.455830",
+ "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..6e1956644c9
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_reference/payment_reference.py
@@ -0,0 +1,27 @@
+# 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
+ description: DF.SmallText | None
+ due_date: DF.Date | None
+ parent: DF.Data
+ parentfield: DF.Data
+ parenttype: DF.Data
+ payment_schedule: DF.Link | None
+ 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..8fcf1f2f41f 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.json
+++ b/erpnext/accounts/doctype/payment_request/payment_request.json
@@ -19,6 +19,8 @@
"column_break_4",
"reference_doctype",
"reference_name",
+ "payment_reference_section",
+ "payment_reference",
"transaction_details",
"grand_total",
"currency",
@@ -157,6 +159,7 @@
"label": "Amount",
"non_negative": 1,
"options": "currency",
+ "read_only_depends_on": "eval:doc.payment_reference.length>0",
"reqd": 1
},
{
@@ -457,6 +460,17 @@
"fieldname": "phone_number",
"fieldtype": "Data",
"label": "Phone Number"
+ },
+ {
+ "fieldname": "payment_reference_section",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "payment_reference",
+ "fieldtype": "Table",
+ "label": "Payment Reference",
+ "options": "Payment Reference",
+ "read_only": 1
}
],
"grid_page_length": 50,
@@ -464,7 +478,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2025-08-29 11:52:48.555415",
+ "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 028cb6b20f3..c95945bf6e2 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
@@ -109,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")),
@@ -535,7 +558,7 @@ class PaymentRequest(Document):
row_number += TO_SKIP_NEW_ROW
-@frappe.whitelist(allow_guest=True)
+@frappe.whitelist()
def make_payment_request(**args):
"""Make payment request"""
@@ -552,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"))
@@ -564,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)
@@ -584,19 +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)
+
+ 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"))
@@ -651,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"),
@@ -680,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
@@ -1024,3 +1149,44 @@ def get_irequests_of_payment_request(doc: str | None = None) -> list:
},
)
return res
+
+
+@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 []
+
+ if get_existing_payment_entry(reference_name):
+ return []
+
+ existing_refs = get_existing_payment_references(reference_name)
+ existing_ids = {r["payment_schedule"] for r in existing_refs if r.get("payment_schedule")}
+
+ return [r for r in ref_doc.payment_schedule if r.name not in existing_ids]
+
+
+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.as_("payment_amount"),
+ PRF.payment_schedule,
+ PRF.parent,
+ )
+ .where(PR.reference_name == reference_name)
+ .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 1f97b8b5784..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
@@ -851,3 +853,130 @@ class TestPaymentRequest(IntegrationTestCase):
pr.load_from_db()
self.assertEqual(pr.grand_total, pi.outstanding_amount)
+
+ 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": 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()
+
+ 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,
+ )
+
+ pr.submit()
+
+ 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=100)
+ po.payment_schedule = []
+ 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()
+
+ # 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()
+
+ 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(
+ dt="Purchase Order",
+ dn=po.name,
+ mute_email=1,
+ submit_doc=False,
+ return_doc=True,
+ schedules=schedules,
+ )
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/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/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
index 21cda420f5a..f5da645b4b6 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",
+ "use_company_roundoff_cost_center",
+ "grand_total",
+ "in_words",
+ "column_break8",
+ "disable_rounded_total",
+ "rounding_adjustment",
+ "rounded_total",
+ "base_totals_section",
"base_grand_total",
+ "base_in_words",
+ "column_break_hcca",
"base_rounding_adjustment",
"base_rounded_total",
- "base_in_words",
- "column_break8",
- "grand_total",
- "rounding_adjustment",
- "use_company_roundoff_cost_center",
- "rounded_total",
- "in_words",
+ "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,7 @@
"idx": 204,
"is_submittable": 1,
"links": [],
- "modified": "2026-02-05 20: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/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)
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/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index b668e13e36c..bfe52e8c7b1 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -77,34 +77,38 @@
"base_total_taxes_and_charges",
"column_break_47",
"total_taxes_and_charges",
- "totals",
+ "totals_section",
+ "use_company_roundoff_cost_center",
+ "grand_total",
+ "in_words",
+ "column_break5",
+ "disable_rounded_total",
+ "rounding_adjustment",
+ "rounded_total",
+ "base_totals_section",
"base_grand_total",
+ "base_in_words",
+ "column_break_xjag",
"base_rounding_adjustment",
"base_rounded_total",
- "base_in_words",
- "column_break5",
- "grand_total",
- "rounding_adjustment",
- "use_company_roundoff_cost_center",
- "rounded_total",
- "in_words",
+ "section_break_vacb",
"total_advance",
+ "column_break_rdks",
"outstanding_amount",
- "disable_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 +198,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 +221,7 @@
"update_auto_repeat_reference",
"more_information",
"status",
- "inter_company_invoice_reference",
- "represents_company",
+ "remarks",
"customer_group",
"column_break_imbx",
"utm_source",
@@ -227,8 +230,9 @@
"utm_content",
"col_break23",
"is_internal_customer",
+ "represents_company",
+ "inter_company_invoice_reference",
"is_discounted",
- "remarks",
"connections_tab"
],
"fields": [
@@ -794,7 +798,8 @@
"hide_seconds": 1,
"label": "Time Sheets",
"options": "Sales Invoice Timesheet",
- "print_hide": 1
+ "print_hide": 1,
+ "read_only": 1
},
{
"default": "0",
@@ -1073,14 +1078,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 +1122,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 +1141,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 +1152,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 +1164,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 +1257,6 @@
"read_only": 1
},
{
- "collapsible": 1,
"collapsible_depends_on": "advances",
"fieldname": "advances_section",
"fieldtype": "Section Break",
@@ -1706,10 +1690,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 +1722,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 +1765,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 +2255,64 @@
"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
+ },
+ {
+ "fieldname": "section_break_vacb",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "column_break_rdks",
+ "fieldtype": "Column Break"
}
],
"grid_page_length": 50,
@@ -2306,7 +2326,7 @@
"link_fieldname": "consolidated_invoice"
}
],
- "modified": "2026-02-06 20:43:44.732805",
+ "modified": "2026-02-23 14:29:00.301842",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
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/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/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/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 @@
-
{{ _("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..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
@@ -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": "{{ _(\"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-23 17:37:03.755394",
"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 {{ doc.name }} - Review Required"
}
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/accounts/party.py b/erpnext/accounts/party.py
index 61a4a976a19..9cc7aca9fc1 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,
)
@@ -298,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/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\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\t{{ _(\"Supplier Name\") }}: {{doc.supplier_name }}\n\t\t\t\t | \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 | \n\t\t\t
\n\t\t\t\n\t\t\t\t| {{ _(\"Invoice Number\") }}: {{ doc.name }} | \n\t\t\t\t\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 | \n\t\t\t
\n\t\t\t\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 | \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\t\t\t
\n\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\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t| {{ loop.index }} | \n\t\t\t\t\t{{ item.item_name }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t\n\t\t
\n\t\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\n\t\t\t\t \n\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| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }} | \n\t\t\t\t\t \n\t\t\t\t \n\t\t\t | \n\t\t
\n\n\t\t\n\t\t
\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..ddcd4b48d5a
--- /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{%- 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\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\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\t\t\t
\n\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| {{ _(\"No\") }} | \n\t\t\t\t\t{{ _(\"Item\") }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ _(\"Item Code\") }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ _(\"Quantity\") }} | \n\t\t\t\t\t{{ _(\"Rate\") }} | \n\t\t\t\t\t{{ _(\"Amount\") }} | \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| {{ loop.index }} | \n\t\t\t\t\t\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\t \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 | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }} | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t
\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\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 | \n\t\t\t\t\t{{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\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\t\t
\n\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 12:58:12.227646",
+ "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/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/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/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/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/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/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/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
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
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/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 12b0a8c301c..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")
);
@@ -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..3dd4d927255 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",
- "base_grand_total",
- "base_rounding_adjustment",
- "base_in_words",
- "base_rounded_total",
- "column_break4",
"grand_total",
+ "in_words",
+ "column_break4",
+ "disable_rounded_total",
"rounding_adjustment",
"rounded_total",
- "disable_rounded_total",
- "in_words",
+ "base_totals_section",
+ "base_grand_total",
+ "base_in_words",
+ "column_break_jkoz",
+ "base_rounding_adjustment",
+ "base_rounded_total",
+ "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-23 14:22:33.323946",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
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/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..43dbbdd7b96 100644
--- a/erpnext/buying/doctype/supplier/supplier.json
+++ b/erpnext/buying/doctype/supplier/supplier.json
@@ -11,11 +11,12 @@
"engine": "InnoDB",
"field_order": [
"naming_series",
+ "supplier_type",
"supplier_name",
- "country",
+ "gender",
"column_break0",
"supplier_group",
- "supplier_type",
+ "country",
"is_transporter",
"image",
"defaults_section",
@@ -23,24 +24,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 +43,32 @@
"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",
"disabled",
+ "rfq_and_purchase_order_settings_section",
+ "is_frozen",
"warn_rfqs",
- "warn_pos",
"prevent_rfqs",
+ "column_break_oxjw",
+ "warn_pos",
"prevent_pos",
"block_supplier_section",
"on_hold",
@@ -75,7 +77,7 @@
"release_date",
"portal_users_tab",
"portal_users",
- "column_break_1mqv"
+ "dashboard_tab"
],
"fields": [
{
@@ -398,7 +400,7 @@
{
"fieldname": "dashboard_tab",
"fieldtype": "Tab Break",
- "label": "Dashboard",
+ "label": "Connections",
"show_dashboard": 1
},
{
@@ -430,7 +432,7 @@
"collapsible": 1,
"fieldname": "internal_supplier_section",
"fieldtype": "Section Break",
- "label": "Internal Supplier"
+ "label": "Internal Supplier Accounting"
},
{
"fieldname": "column_break_16",
@@ -469,10 +471,6 @@
"label": "Supplier Portal Users",
"options": "Portal User"
},
- {
- "fieldname": "column_break_1mqv",
- "fieldtype": "Column Break"
- },
{
"fieldname": "column_break_mglr",
"fieldtype": "Column Break"
@@ -488,6 +486,22 @@
"fieldtype": "Link",
"label": "Tax Withholding Group",
"options": "Tax Withholding Group"
+ },
+ {
+ "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"
}
],
"grid_page_length": 50,
@@ -501,7 +515,7 @@
"link_fieldname": "party"
}
],
- "modified": "2026-02-06 12:58:01.398824",
+ "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 543b3726089..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
@@ -161,8 +162,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 = ""
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..96d08fecb1a
--- /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-24 16:57:55.172763",
+ "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..f1dc6a0ac91
--- /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-24 16:57:14.098288",
+ "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..c39c5404046
--- /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": "",
+ "idx": 2,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2026-02-24 16:57:37.904322",
+ "modified_by": "Administrator",
+ "name": "Create Purchase Order",
+ "owner": "Administrator",
+ "reference_document": "Purchase Order",
+ "show_form_tour": 0,
+ "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..2703b14c6f9
--- /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-24 16:57:14.031766",
+ "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/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..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{%- 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\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\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\t\t\t
\n\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| {{ _(\"No\") }} | \n\t\t\t\t\t{{ _(\"Item\") }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ _(\"Item Code\") }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ _(\"Quantity\") }} | \n\t\t\t\t\t{{ _(\"Rate\") }} | \n\t\t\t\t\t{{ _(\"Amount\") }} | \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| {{ loop.index }} | \n\t\t\t\t\t\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\t \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 | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }} | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t
\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\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 | \n\t\t\t\t\t{{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\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\t\t
\n\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{%- 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\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\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\t\t\t
\n\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| {{ _(\"No\") }} | \n\t\t\t\t\t{{ _(\"Item\") }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ _(\"Item Code\") }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ _(\"Quantity\") }} | \n\t\t\t\t\t{{ _(\"Rate\") }} | \n\t\t\t\t\t{{ _(\"Amount\") }} | \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| {{ loop.index }} | \n\t\t\t\t\t\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\t \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 | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }} | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t
\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\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 | \n\t\t\t\t\t{{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\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\t\t
\n\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 14:15:59.698407",
"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 25959c651cf..6a75859cdb0 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()
+ child_item.save(ignore_permissions=True)
parent.reload()
parent.flags.ignore_validate_update_after_submit = True
@@ -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/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/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/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
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/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/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 ""
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/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/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")
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 912131e2825..b442f5becfc 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
@@ -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()
@@ -869,6 +867,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
@@ -923,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
@@ -1381,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)
@@ -1540,6 +1530,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,
@@ -1577,7 +1568,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)
@@ -1650,7 +1641,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)
@@ -2160,7 +2151,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"]))
@@ -2351,7 +2342,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 +2368,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 +2379,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
@@ -2506,8 +2502,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
@@ -2677,6 +2673,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()
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/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/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 | {{ _(\"Item Name\") }} | \n {{ _(\"Received Quantity\") }} | \n
\n {% for item in doc.items %}\n {% if frappe.utils.flt(item.received_qty, 2) > 0.0 %}\n \n | {{ item.item_code }} | \n {{ frappe.utils.flt(item.received_qty, 2) }} | \n
\n {% endif %}\n {% endfor %}\n
\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,
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/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/patches.txt b/erpnext/patches.txt
index e6d090dac21..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
@@ -465,3 +466,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/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),
+ )
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()
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/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`
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;
+ }
}
}
}
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index d4a4577d8a0..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 &&
@@ -1733,13 +1832,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 +1847,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 +1858,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 +1921,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/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/public/js/utils.js b/erpnext/public/js/utils.js
index 578846f0937..41e7a7cad81 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({
@@ -1073,10 +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];
+ 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;
+ }
} else {
return value;
}
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index a2e4dbf1da1..09cff0bd423 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -294,27 +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;
}
+
+ 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);
+ },
+ });
};
+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] = "";
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/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.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")
);
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 609b093bae3..4238e3438a3 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",
+ "in_words",
+ "disable_rounded_total",
+ "column_break_nuxg",
"rounding_adjustment",
"rounded_total",
- "in_words",
+ "base_totals_section",
+ "base_grand_total",
+ "base_in_words",
+ "column_break_bgfw",
+ "base_rounding_adjustment",
+ "base_rounded_total",
+ "section_break_efew",
"advance_paid",
- "disable_rounded_total",
- "section_break_48",
+ "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-23 14:25:56.665392",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
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."))
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",
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)
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/module_onboarding/selling_onboarding/selling_onboarding.json b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json
new file mode 100644
index 00000000000..d211ab6abf1
--- /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-24 16:57:50.753045",
+ "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..142c395e55c
--- /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-24 16:57:14.111070",
+ "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..f1dc6a0ac91
--- /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-24 16:57:14.098288",
+ "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..6d16e625d21
--- /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-24 16:57:14.087292",
+ "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..ed87a015aba
--- /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": "",
+ "idx": 1,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2026-02-24 16:57:29.877286",
+ "modified_by": "Administrator",
+ "name": "Create Sales Order",
+ "owner": "Administrator",
+ "reference_document": "Sales Order",
+ "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
new file mode 100644
index 00000000000..29aac361bee
--- /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-24 16:57:14.062699",
+ "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..46a6a56b58e
--- /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-24 16:57:14.075341",
+ "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/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..0df19107c1b
--- /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{%- 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\t{{ _(\"Customer Name\") }}: {{doc.customer_name }}\n\t\t\t\t | \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 | \n\t\t\t
\n\t\t\t\n\t\t\t\t| {{ _(\"Sales Order\") }}: {{ doc.name }} | \n\t\t\t\t\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 | \n\t\t\t
\n\t\t\t\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 | \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\t\t\t
\n\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\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t| {{ loop.index }} | \n\t\t\t\t\t{{ item.item_name }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t\n\t\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }}\n\t\t\t\t\t | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t\n\t\t
\n\t\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\n\t\t\t\t \n\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| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t | \n\t\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }} | \n\t\t\t\t\t \n\t\t\t\t \n\t\t\t | \n\t\t
\n\n\t\t\n\t\t
\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 13:04:24.036955",
+ "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..25cd22bcf66
--- /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{%- 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\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\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\t\t\t
\n\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| {{ _(\"No\") }} | \n\t\t\t\t\t{{ _(\"Item\") }} | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ _(\"Item Code\") }} | \n\t\t\t\t\t{% endif %}\n\t\t\t\t\t{{ _(\"Quantity\") }} | \n\t\t\t\t\t{{ _(\"Rate\") }} | \n\t\t\t\t\t{{ _(\"Amount\") }} | \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| {{ loop.index }} | \n\t\t\t\t\t\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\t \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 | \n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t{{ item.item_code }} | \n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_rate\", doc) }} | \n\t\t\t\t\t{{ item.get_formatted(\"net_amount\", doc) }} | \n\t\t\t\t
\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t| {{ _(\"Sub Total:\") }} | \n\t\t\t\t\t{{ doc.get_formatted(\"total\", doc) }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \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| {{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%): | \n\t\t\t\t\t\t\t{{ tax.get_formatted(\"tax_amount\") }} | \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\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t | \n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }} | \n\t\t\t\t\t
\n\t\t\t\t{%- endif -%}\n\t\t\t
\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\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 | \n\t\t\t\t\t{{ _(\"Grand Total:\") }} | \n\t\t\t\t\t\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\t\t
\n\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 13:00:02.496058",
+ "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"
+}
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
diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py
index 13b80b25251..9b4759b360a 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
@@ -429,3 +428,59 @@ 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.
+
+ 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"))
+
+ 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,
+ [
+ "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": 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"),
+ }
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):
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index 94706443d6b..726906ac6cb 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,35 @@ 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
+
+ if not frappe.db.exists("Print Format", print_format):
+ continue
+
+ frappe.make_property_setter(
+ {
+ "doctype": doctype,
+ "doctype_or_field": "DocType",
+ "property": "default_print_format",
+ "value": print_format,
+ "property_type": "Link",
+ },
+ validate_fields_for_doctype=False,
+ )
+
+
def create_letter_head():
base_path = frappe.get_app_path("erpnext", "accounts", "letterhead")
@@ -318,6 +348,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)
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/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/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/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/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.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(
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/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
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
index 1e93e50b10d..e13837b5f10 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",
- "base_grand_total",
- "base_rounding_adjustment",
- "base_rounded_total",
- "base_in_words",
- "column_break_50",
+ "totals_section",
"grand_total",
+ "in_words",
+ "column_break_50",
+ "disable_rounded_total",
"rounding_adjustment",
"rounded_total",
- "in_words",
- "disable_rounded_total",
+ "base_totals_section",
+ "base_grand_total",
+ "base_in_words",
+ "column_break_ugyv",
+ "base_rounding_adjustment",
+ "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-23 16:56:41.075091",
"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",
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)
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..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
@@ -1028,6 +1038,8 @@ class SerialandBatchBundle(Document):
qty_field = "consumed_qty"
elif row.get("doctype") == "Stock Entry Detail":
qty_field = "transfer_qty"
+ elif row.get("doctype") in ["Sales Invoice Item", "Purchase Invoice Item"]:
+ qty_field = "stock_qty"
return qty_field
@@ -2584,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."""
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",
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": [
{
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",
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",
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/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"
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,
)
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)
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 faaf3b589c2..f866f93802c 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,
@@ -195,9 +195,10 @@
"type": "Link"
}
],
- "modified": "2026-01-26 21:25:37.877020",
+ "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,