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 @@ -

{{ _("Fiscal Year") }}

+

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

-

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

+

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

+ +

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

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

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

+{% endif %} + +

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

\ No newline at end of file diff --git a/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json b/erpnext/accounts/notification/notification_for_new_fiscal_year/notification_for_new_fiscal_year.json index f605ad3ba67..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": "

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

\n\n

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

\n\n

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

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

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

\n{% endif %}\n\n

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

", "message_type": "HTML", - "modified": "2023-11-17 08:54:51.532104", + "minutes_offset": 0, + "modified": "2026-02-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
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 00:46:57.038144", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Purchase Invoice Standard", + "owner": "Administrator", + "page_number": "Hide", + "pdf_generator": "wkhtmltopdf", + "print_format_builder": 0, + "print_format_builder_beta": 0, + "print_format_for": "DocType", + "print_format_type": "Jinja", + "raw_printing": 0, + "show_section_headings": 0, + "standard": "Yes" +} diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/__init__.py b/erpnext/accounts/print_format/purchase_invoice_with_item_image/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json new file mode 100644 index 00000000000..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\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 20:07:51.896474", + "modified": "2026-02-23 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 \n \n \n {% for item in doc.items %}\n {% if frappe.utils.flt(item.received_qty, 2) > 0.0 %}\n \n \n \n \n {% endif %}\n {% endfor %}\n
{{ _(\"Item Name\") }}{{ _(\"Received Quantity\") }}
{{ item.item_code }}{{ frappe.utils.flt(item.received_qty, 2) }}
\n", "message_type": "HTML", "method": "", - "modified": "2023-11-17 08:53:29.525296", + "minutes_offset": 0, + "modified": "2026-02-23 17:41:43.982194", "modified_by": "Administrator", "module": "Manufacturing", "name": "Material Request Receipt Notification", "owner": "Administrator", "recipients": [ { - "receiver_by_document_field": "requested_by" + "receiver_by_document_field": "owner" } ], "send_system_notification": 0, 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\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 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\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Sales Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.delivery_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "idx": 0, + "line_breaks": 0, + "margin_bottom": 15.0, + "margin_left": 15.0, + "margin_right": 15.0, + "margin_top": 15.0, + "modified": "2026-02-23 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,