diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 8b74dd823ec..a5f8d60cf4b 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -203,7 +203,7 @@ "idx": 1, "is_tree": 1, "links": [], - "modified": "2025-08-02 06:26:44.657146", + "modified": "2026-04-14 18:14:42.202065", "modified_by": "Administrator", "module": "Accounts", "name": "Account", @@ -256,6 +256,14 @@ "role": "Accounts Manager", "share": 1, "write": 1 + }, + { + "role": "HR User", + "select": 1 + }, + { + "role": "HR Manager", + "select": 1 } ], "row_format": "Dynamic", diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index 95f17967fa7..f840ac86207 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -321,72 +321,6 @@ class TestAccount(ERPNextTestSuite): self.assertEqual(balance, 0) -def _make_test_records(verbose=None): - from frappe.tests.utils import make_test_objects - - accounts = [ - # [account_name, parent_account, is_group] - ["_Test Bank", "Bank Accounts", 0, "Bank", None], - ["_Test Bank USD", "Bank Accounts", 0, "Bank", "USD"], - ["_Test Bank EUR", "Bank Accounts", 0, "Bank", "EUR"], - ["_Test Cash", "Cash In Hand", 0, "Cash", None], - ["_Test Account Stock Expenses", "Direct Expenses", 1, None, None], - ["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable", None], - ["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax", None], - ["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable", None], - ["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment", None], - ["_Test Employee Advance", "Current Liabilities", 0, None, None], - ["_Test Account Tax Assets", "Current Assets", 1, None, None], - ["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax", None], - ["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax", None], - ["_Test Account Reserves and Surplus", "Current Liabilities", 0, None, None], - ["_Test Account Cost for Goods Sold", "Expenses", 0, None, None], - ["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax", None], - ["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax", None], - ["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax", None], - ["_Test Account CST", "Direct Expenses", 0, "Tax", None], - ["_Test Account Discount", "Direct Expenses", 0, None, None], - ["_Test Write Off", "Indirect Expenses", 0, None, None], - ["_Test Exchange Gain/Loss", "Indirect Expenses", 0, None, None], - ["_Test Account Sales", "Direct Income", 0, None, None], - # related to Account Inventory Integration - ["_Test Account Stock In Hand", "Current Assets", 0, None, None], - # fixed asset depreciation - ["_Test Fixed Asset", "Current Assets", 0, "Fixed Asset", None], - ["_Test Accumulated Depreciations", "Current Assets", 0, "Accumulated Depreciation", None], - ["_Test Depreciations", "Expenses", 0, "Depreciation", None], - ["_Test Gain/Loss on Asset Disposal", "Expenses", 0, None, None], - # Receivable / Payable Account - ["_Test Receivable", "Current Assets", 0, "Receivable", None], - ["_Test Payable", "Current Liabilities", 0, "Payable", None], - ["_Test Receivable USD", "Current Assets", 0, "Receivable", "USD"], - ["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"], - ] - - for company, abbr in [ - ["_Test Company", "_TC"], - ["_Test Company 1", "_TC1"], - ["_Test Company with perpetual inventory", "TCP1"], - ]: - test_objects = make_test_objects( - "Account", - [ - { - "doctype": "Account", - "account_name": account_name, - "parent_account": parent_account + " - " + abbr, - "company": company, - "is_group": is_group, - "account_type": account_type, - "account_currency": currency, - } - for account_name, parent_account, is_group, account_type, currency in accounts - ], - ) - - return test_objects - - def get_inventory_account(company, warehouse=None): account = None if warehouse: diff --git a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py index 70253c674c5..549449cce42 100644 --- a/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py @@ -82,7 +82,7 @@ class AccountingDimension(Document): else: frappe.throw(_("Company {0} is added more than once").format(frappe.bold(default.company))) - def after_insert(self): + def on_update(self): if frappe.in_test: make_dimension_in_accounting_doctypes(doc=self) else: diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.js b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js index 931e05a716b..2fda643640b 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.js +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.js @@ -2,7 +2,15 @@ // For license information, please see license.txt frappe.ui.form.on("Accounts Settings", { - refresh: function (frm) {}, + refresh: function (frm) { + frm.set_query("document_type", "repost_allowed_types", function (doc, cdt, cdn) { + return { + filters: { + name: ["in", frappe.boot.sysdefaults.repost_allowed_doctypes], + }, + }; + }); + }, enable_immutable_ledger: function (frm) { if (!frm.doc.enable_immutable_ledger) { return; diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 29673e89b6c..0807f07d8d9 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -62,6 +62,8 @@ "reconciliation_queue_size", "column_break_resa", "exchange_gain_loss_posting_date", + "repost_section", + "repost_allowed_types", "payment_options_section", "enable_loyalty_point_program", "column_break_ctam", @@ -702,6 +704,17 @@ "fieldname": "fetch_payment_schedule_in_payment_request", "fieldtype": "Check", "label": "Fetch Payment Schedule In Payment Request" + }, + { + "fieldname": "repost_section", + "fieldtype": "Section Break", + "label": "Repost" + }, + { + "fieldname": "repost_allowed_types", + "fieldtype": "Table", + "label": "Allowed Doctypes", + "options": "Repost Allowed Types" } ], "grid_page_length": 50, @@ -711,7 +724,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-03-30 07:32:58.182018", + "modified": "2026-04-13 15:30:28.729627", "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 94b35eba00a..693d0918d20 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -10,6 +10,9 @@ from frappe.custom.doctype.property_setter.property_setter import make_property_ from frappe.model.document import Document from frappe.utils import cint +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( + get_accounting_dimensions, +) from erpnext.accounts.utils import sync_auto_reconcile_config SELLING_DOCTYPES = [ @@ -44,6 +47,8 @@ class AccountsSettings(Document): if TYPE_CHECKING: from frappe.types import DF + from erpnext.accounts.doctype.repost_allowed_types.repost_allowed_types import RepostAllowedTypes + add_taxes_from_item_tax_template: DF.Check add_taxes_from_taxes_and_charges_template: DF.Check allow_multi_currency_invoices_against_single_party_account: DF.Check @@ -86,6 +91,7 @@ class AccountsSettings(Document): receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"] receivable_payable_remarks_length: DF.Int reconciliation_queue_size: DF.Int + repost_allowed_types: DF.Table[RepostAllowedTypes] role_allowed_to_over_bill: DF.Link | None role_to_notify_on_depreciation_failure: DF.Link | None role_to_override_stop_action: DF.Link | None @@ -140,6 +146,7 @@ class AccountsSettings(Document): frappe.clear_cache() self.validate_and_sync_auto_reconcile_config() + self.update_property_for_accounting_dimension() def validate_stale_days(self): if not self.allow_stale and cint(self.stale_days) <= 0: @@ -186,6 +193,17 @@ class AccountsSettings(Document): title=_("Auto Tax Settings Error"), ) + def update_property_for_accounting_dimension(self): + doctypes = [entry.document_type for entry in self.repost_allowed_types] + if not doctypes: + return + + from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import get_child_docs + + doctypes += get_child_docs(doctypes) + + set_allow_on_submit_for_dimension_fields(doctypes) + @frappe.whitelist() def drop_ar_sql_procedures(self): from erpnext.accounts.report.accounts_receivable.accounts_receivable import InitSQLProceduresForAR @@ -225,3 +243,12 @@ def create_property_setter_for_hiding_field(doctype, field_name, hide): "Check", validate_fields_for_doctype=False, ) + + +def set_allow_on_submit_for_dimension_fields(doctypes): + for dt in doctypes: + meta = frappe.get_meta(dt) + for dimension in get_accounting_dimensions(): + df = meta.get_field(dimension) + if df and not df.allow_on_submit: + frappe.db.set_value("Custom Field", dt + "-" + dimension, "allow_on_submit", 1) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json index 8a84e2c4c01..bb69300ff8c 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.json +++ b/erpnext/accounts/doctype/cost_center/cost_center.json @@ -126,7 +126,7 @@ "idx": 1, "is_tree": 1, "links": [], - "modified": "2025-01-22 10:46:42.904001", + "modified": "2026-04-14 18:15:27.367298", "modified_by": "Administrator", "module": "Accounts", "name": "Cost Center", @@ -173,11 +173,20 @@ "role": "Employee", "select": 1, "share": 1 + }, + { + "role": "HR User", + "select": 1 + }, + { + "role": "HR Manager", + "select": 1 } ], + "row_format": "Dynamic", "search_fields": "parent_cost_center, is_group", "show_name_in_global_search": 1, "sort_field": "creation", "sort_order": "ASC", "states": [] -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.js b/erpnext/accounts/doctype/item_tax_template/item_tax_template.js index b608ccd3568..94c87fcae93 100644 --- a/erpnext/accounts/doctype/item_tax_template/item_tax_template.js +++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.js @@ -47,3 +47,12 @@ frappe.ui.form.on("Item Tax Template", { }); }, }); + +frappe.ui.form.on("Item Tax Template Detail", { + not_applicable: function (frm, cdt, cdn) { + let row = locals[cdt][cdn]; + if (row.not_applicable) { + frappe.model.set_value(cdt, cdn, "tax_rate", 0); + } + }, +}); diff --git a/erpnext/accounts/doctype/item_tax_template/item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py index 464fb0f8227..8a23331b3f6 100644 --- a/erpnext/accounts/doctype/item_tax_template/item_tax_template.py +++ b/erpnext/accounts/doctype/item_tax_template/item_tax_template.py @@ -27,8 +27,15 @@ class ItemTaxTemplate(Document): # end: auto-generated types def validate(self): + self.set_zero_rate_for_not_applicable_tax() self.validate_tax_accounts() + def set_zero_rate_for_not_applicable_tax(self): + """Ensure tax_rate is 0 for any row marked as not applicable.""" + for row in self.get("taxes"): + if row.not_applicable: + row.tax_rate = 0 + def autoname(self): if self.company and self.title: abbr = frappe.get_cached_value("Company", self.company, "abbr") diff --git a/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json index 5092489c012..d11d249894d 100644 --- a/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json +++ b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.json @@ -6,7 +6,8 @@ "engine": "InnoDB", "field_order": [ "tax_type", - "tax_rate" + "tax_rate", + "not_applicable" ], "fields": [ { @@ -21,20 +22,30 @@ "fieldname": "tax_rate", "fieldtype": "Float", "in_list_view": 1, - "label": "Tax Rate" + "label": "Tax Rate", + "read_only_depends_on": "eval:doc.not_applicable" + }, + { + "default": "0", + "description": "Check if this tax is not applicable to items (distinct from 0% rate)", + "fieldname": "not_applicable", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Not Applicable" } ], "istable": 1, "links": [], - "modified": "2024-03-27 13:09:55.735360", + "modified": "2025-12-26 17:19:18.791891", "modified_by": "Administrator", "module": "Accounts", "name": "Item Tax Template Detail", "owner": "Administrator", "permissions": [], "quick_entry": 1, + "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/item_tax_template_detail/item_tax_template_detail.py b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py index 810235e3691..a98fbc6ba86 100644 --- a/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py +++ b/erpnext/accounts/doctype/item_tax_template_detail/item_tax_template_detail.py @@ -14,6 +14,7 @@ class ItemTaxTemplateDetail(Document): if TYPE_CHECKING: from frappe.types import DF + not_applicable: DF.Check parent: DF.Data parentfield: DF.Data parenttype: DF.Data diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index cc3b616d601..1e3ad530f72 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -648,7 +648,7 @@ $.extend(erpnext.journal_entry, { reqd: 1, default: frm.doc.posting_date, }, - { fieldtype: "Small Text", fieldname: "user_remark", label: __("User Remark") }, + { fieldtype: "Small Text", fieldname: "remark", label: __("Remark") }, { fieldtype: "Select", fieldname: "naming_series", @@ -665,8 +665,14 @@ $.extend(erpnext.journal_entry, { var values = dialog.get_values(); frm.set_value("posting_date", values.posting_date); - frm.set_value("user_remark", values.user_remark); frm.set_value("naming_series", values.naming_series); + if (values.remark) { + frm.set_value("custom_remark", 1); + frm.set_value("remark", values.remark); + } else { + frm.set_value("custom_remark", 0); + frm.set_value("remark", ""); + } // clear table is used because there might've been an error while adding child // and cleanup didn't happen diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 0856f41bb09..0eaefb5f618 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -78,6 +78,7 @@ "from_template", "title", "column_break3", + "custom_remark", "remark", "mode_of_payment", "party_not_required" @@ -202,6 +203,7 @@ { "fieldname": "user_remark", "fieldtype": "Small Text", + "hidden": 1, "label": "User Remark", "no_copy": 1, "oldfieldname": "user_remark", @@ -315,7 +317,7 @@ "no_copy": 1, "oldfieldname": "remark", "oldfieldtype": "Small Text", - "read_only": 1 + "read_only_depends_on": "eval: !doc.custom_remark" }, { "depends_on": "eval:doc.voucher_type== \"Inter Company Journal Entry\"", @@ -651,6 +653,17 @@ "fieldname": "tax_withholding_tab", "fieldtype": "Tab Break", "label": "Tax Withholding" + }, + { + "fieldname": "auto_repeat_section", + "fieldtype": "Section Break", + "label": "Auto Repeat" + }, + { + "default": "0", + "fieldname": "custom_remark", + "fieldtype": "Check", + "label": "Custom Remark" } ], "icon": "fa fa-file-text", @@ -665,7 +678,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-03-09 17:15:26.569327", + "modified": "2026-04-08 14:19:30.870894", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 8b6cd3eee23..7a30139796a 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -61,6 +61,7 @@ class JournalEntry(AccountsController): cheque_no: DF.Data | None clearance_date: DF.Date | None company: DF.Link + custom_remark: DF.Check difference: DF.Currency due_date: DF.Date | None finance_book: DF.Link | None @@ -1026,8 +1027,8 @@ class JournalEntry(AccountsController): if self.flags.skip_remarks_creation: return - if self.user_remark: - r.append(_("Note: {0}").format(self.user_remark)) + if self.get("custom_remark"): + return if self.cheque_no: if self.cheque_date: @@ -1548,7 +1549,7 @@ def get_against_jv(doctype, txt, searchfield, start, page_len, filters): frappe.qb.from_(JournalEntry) .join(JournalEntryAccount) .on(JournalEntryAccount.parent == JournalEntry.name) - .select(JournalEntry.name, JournalEntry.posting_date, JournalEntry.user_remark) + .select(JournalEntry.name, JournalEntry.posting_date, JournalEntry.remark) .where(JournalEntryAccount.account == filters.get("account")) .where(JournalEntryAccount.reference_type.isnull() | (JournalEntryAccount.reference_type == "")) .where(JournalEntry.docstatus == 1) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry_list.js b/erpnext/accounts/doctype/journal_entry/journal_entry_list.js index 4ef7b998b8a..6ea0df946f2 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry_list.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry_list.js @@ -1,5 +1,5 @@ frappe.listview_settings["Journal Entry"] = { - add_fields: ["voucher_type", "posting_date", "total_debit", "company", "user_remark"], + add_fields: ["voucher_type", "posting_date", "total_debit", "company", "remark"], get_indicator: function (doc) { if (doc.docstatus === 1) { return [__(doc.voucher_type), "blue", `voucher_type,=,${doc.voucher_type}`]; diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index 53d6013e1e2..581a0866721 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -413,9 +413,9 @@ class TestJournalEntry(ERPNextTestSuite): from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center # Configure Repost Accounting Ledger for JVs - settings = frappe.get_doc("Repost Accounting Ledger Settings") - if not [x for x in settings.allowed_types if x.document_type == "Journal Entry"]: - settings.append("allowed_types", {"document_type": "Journal Entry", "allowed": True}) + settings = frappe.get_doc("Accounts Settings") + if "Journal Entry" not in [x.document_type for x in settings.repost_allowed_types]: + settings.append("repost_allowed_types", {"document_type": "Journal Entry"}) settings.save() # Create JV with defaut cost center - _Test Cost Center @@ -523,7 +523,7 @@ class TestJournalEntry(ERPNextTestSuite): jv = frappe.new_doc("Journal Entry") jv.posting_date = nowdate() jv.company = "_Test Company" - jv.user_remark = "test" + jv.remark = "test" jv.extend( "accounts", [ @@ -592,6 +592,14 @@ class TestJournalEntry(ERPNextTestSuite): self.assertEqual(jv.pay_to_recd_from, "_Test Receiver 2") + def test_custom_remark(self): + # When custom_remark is enabled, remark should not be auto-overwritten on save + jv = make_journal_entry("_Test Cash - _TC", "_Test Bank - _TC", 100, save=False) + jv.custom_remark = 1 + jv.remark = "My custom remark text" + jv.insert() + self.assertEqual(jv.remark, "My custom remark text") + def test_credit_limit_for_customer(self): customer = make_customer("_Test New Customer") set_credit_limit("_Test New Customer", "_Test Company", 50) @@ -620,7 +628,7 @@ def make_journal_entry( jv = frappe.new_doc("Journal Entry") jv.posting_date = posting_date or nowdate() jv.company = company or "_Test Company" - jv.user_remark = "test" + jv.remark = "test" jv.multi_currency = 1 jv.set( "accounts", diff --git a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json index f7e7fc414bd..ec03452e56a 100644 --- a/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json +++ b/erpnext/accounts/doctype/mode_of_payment/mode_of_payment.json @@ -48,7 +48,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2024-08-16 19:22:42.942264", + "modified": "2026-04-14 18:16:47.795986", "modified_by": "Administrator", "module": "Accounts", "name": "Mode of Payment", @@ -68,12 +68,21 @@ "read": 1, "report": 1, "role": "Accounts User" + }, + { + "role": "HR User", + "select": 1 + }, + { + "role": "HR Manager", + "select": 1 } ], "quick_entry": 1, + "row_format": "Dynamic", "show_name_in_global_search": 1, "sort_field": "creation", "sort_order": "ASC", "states": [], "translated_doctype": 1 -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index 9d2890f5e79..f6a23ddf450 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -2105,6 +2105,37 @@ class TestPaymentEntry(ERPNextTestSuite): self.assertEqual(ref.voucher_no, so.name) self.assertIsNotNone(ref.payment_term) + def test_project_name_in_exchange_gain_loss_entry(self): + si = create_sales_invoice( + customer="_Test Customer USD", + debit_to="_Test Receivable USD - _TC", + currency="USD", + conversion_rate=50, + do_not_submit=True, + ) + from erpnext.projects.doctype.project.test_project import make_project + + si.project = make_project({"project_name": "_Test Project for Exchange Gain Loss Entry"}).name + + si.submit() + + pe = get_payment_entry("Sales Invoice", si.name) + + pe.source_exchange_rate = 100 + + pe.insert() + pe.submit() + + rows = frappe.get_all( + "Journal Entry Account", + or_filters=[{"reference_name": pe.name}, {"reference_name": si.name}], + fields=["project"], + ) + self.assertEqual(len(rows), 2) + + self.assertEqual(rows[0].project, si.project) + self.assertEqual(rows[1].project, si.project) + def create_payment_entry(**args): payment_entry = frappe.new_doc("Payment Entry") diff --git a/erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json b/erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json index 9fefe251533..ad9f8751942 100644 --- a/erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json +++ b/erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json @@ -811,6 +811,7 @@ }, { "default": "0", + "fetch_from": "item_code.grant_commission", "fieldname": "grant_commission", "fieldtype": "Check", "label": "Grant Commission", @@ -857,7 +858,7 @@ ], "istable": 1, "links": [], - "modified": "2025-11-12 18:11:11.818015", + "modified": "2026-04-20 16:16:12.322024", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice Item", diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py index 56ba6a040dc..6df17e4e2cd 100644 --- a/erpnext/accounts/doctype/pricing_rule/utils.py +++ b/erpnext/accounts/doctype/pricing_rule/utils.py @@ -662,7 +662,7 @@ def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None): if pricing_rule.is_recursive: transaction_qty = sum( [ - row.qty + flt(row.qty) for row in doc.items if not row.is_free_item and row.item_code == args.item_code diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index b42574ee206..5cf3c6be879 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -2256,9 +2256,9 @@ class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): def test_repost_accounting_entries(self): # update repost settings - settings = frappe.get_doc("Repost Accounting Ledger Settings") - if not [x for x in settings.allowed_types if x.document_type == "Purchase Invoice"]: - settings.append("allowed_types", {"document_type": "Purchase Invoice", "allowed": True}) + settings = frappe.get_doc("Accounts Settings") + if "Purchase Invoice" not in [x.document_type for x in settings.repost_allowed_types]: + settings.append("repost_allowed_types", {"document_type": "Purchase Invoice"}) settings.save() pi = make_purchase_invoice( diff --git a/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py b/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py index 819ced1c911..807a1789881 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py +++ b/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py @@ -219,7 +219,6 @@ def get_allowed_types_from_settings(child_doc: bool = False): x.document_type for x in frappe.db.get_all( "Repost Allowed Types", - filters={"allowed": True}, fields=["document_type"], distinct=True, ) @@ -274,14 +273,13 @@ def validate_docs_for_voucher_types(doc_voucher_types): if disallowed_types := voucher_types.difference(allowed_types): message = "are" if len(disallowed_types) > 1 else "is" frappe.throw( - _("{0} {1} not allowed to be reposted. Modify {2} to enable reposting.").format( + _( + "{0} {1} not allowed to be reposted. You can enable it by adding it '{2}' table in {3}." + ).format( frappe.bold(comma_and(list(disallowed_types))), message, - frappe.bold( - frappe.utils.get_link_to_form( - "Repost Accounting Ledger Settings", "Repost Accounting Ledger Settings" - ) - ), + frappe.bold("Allowed Doctype"), + frappe.utils.get_link_to_form("Accounts Settings"), ) ) @@ -289,8 +287,6 @@ def validate_docs_for_voucher_types(doc_voucher_types): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def get_repost_allowed_types(doctype, txt, searchfield, start, page_len, filters): - filters = {"allowed": True} - if txt: filters.update({"document_type": ("like", f"%{txt}%")}) diff --git a/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py b/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py index 793bde5c99f..935047e2e35 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py +++ b/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py @@ -203,6 +203,11 @@ class TestRepostAccountingLedger(ERPNextTestSuite): def test_06_repost_purchase_receipt(self): from erpnext.accounts.doctype.account.test_account import create_account + if not frappe.db.set_value("Company", "_Test Company", "service_expense_account"): + frappe.db.set_value( + "Company", "_Test Company", "service_expense_account", "Marketing Expenses - _TC" + ) + provisional_account = create_account( account_name="Provision Account", parent_account="Current Liabilities - _TC", @@ -275,7 +280,8 @@ def update_repost_settings(): "Journal Entry", "Purchase Receipt", ] - repost_settings = frappe.get_doc("Repost Accounting Ledger Settings") - for x in allowed_types: - repost_settings.append("allowed_types", {"document_type": x, "allowed": True}) - repost_settings.save() + settings = frappe.get_doc("Accounts Settings") + for _type in allowed_types: + if _type not in [x.document_type for x in settings.repost_allowed_types]: + settings.append("repost_allowed_types", {"document_type": _type}) + settings.save() diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/__init__.py b/erpnext/accounts/doctype/repost_accounting_ledger_settings/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.js b/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.js deleted file mode 100644 index 8c83ca50431..00000000000 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -// frappe.ui.form.on("Repost Accounting Ledger Settings", { -// refresh(frm) { - -// }, -// }); diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json b/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json deleted file mode 100644 index 808986bba23..00000000000 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "actions": [], - "creation": "2023-11-07 09:57:20.619939", - "doctype": "DocType", - "engine": "InnoDB", - "field_order": [ - "allowed_types" - ], - "fields": [ - { - "fieldname": "allowed_types", - "fieldtype": "Table", - "label": "Allowed Doctypes", - "options": "Repost Allowed Types" - } - ], - "grid_page_length": 50, - "hide_toolbar": 0, - "in_create": 1, - "issingle": 1, - "links": [], - "modified": "2026-03-16 13:28:21.312607", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Repost Accounting Ledger Settings", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "print": 1, - "read": 1, - "role": "Administrator", - "select": 1, - "share": 1, - "write": 1 - }, - { - "create": 1, - "delete": 1, - "read": 1, - "role": "System Manager", - "select": 1, - "write": 1 - } - ], - "row_format": "Dynamic", - "sort_field": "creation", - "sort_order": "DESC", - "states": [], - "track_changes": 1 -} diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.py b/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.py deleted file mode 100644 index d6ef25cd1b7..00000000000 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -import frappe -from frappe.model.document import Document - -from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( - get_accounting_dimensions, -) -from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import get_child_docs - - -class RepostAccountingLedgerSettings(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 - - from erpnext.accounts.doctype.repost_allowed_types.repost_allowed_types import RepostAllowedTypes - - allowed_types: DF.Table[RepostAllowedTypes] - # end: auto-generated types - - def validate(self): - self.update_property_for_accounting_dimension() - - def update_property_for_accounting_dimension(self): - doctypes = [entry.document_type for entry in self.allowed_types if entry.allowed] - if not doctypes: - return - doctypes += get_child_docs(doctypes) - - set_allow_on_submit_for_dimension_fields(doctypes) - - -def set_allow_on_submit_for_dimension_fields(doctypes): - for dt in doctypes: - meta = frappe.get_meta(dt) - for dimension in get_accounting_dimensions(): - df = meta.get_field(dimension) - if df and not df.allow_on_submit: - frappe.db.set_value("Custom Field", dt + "-" + dimension, "allow_on_submit", 1) diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py b/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py deleted file mode 100644 index 6a8698e96af..00000000000 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt - -# import frappe - - -from erpnext.tests.utils import ERPNextTestSuite - - -class TestRepostAccountingLedgerSettings(ERPNextTestSuite): - pass diff --git a/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.json b/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.json index cb7e6bac5f8..e9206b3cf2e 100644 --- a/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.json +++ b/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.json @@ -6,9 +6,7 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "document_type", - "column_break_sfzb", - "allowed" + "document_type" ], "fields": [ { @@ -17,29 +15,20 @@ "in_list_view": 1, "label": "Doctype", "options": "DocType" - }, - { - "default": "0", - "fieldname": "allowed", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Allowed" - }, - { - "fieldname": "column_break_sfzb", - "fieldtype": "Column Break" } ], + "grid_page_length": 50, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-03-27 13:10:32.415806", + "modified": "2026-04-14 16:53:16.806714", "modified_by": "Administrator", "module": "Accounts", "name": "Repost Allowed Types", "owner": "Administrator", "permissions": [], + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.py b/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.py index 8226a910171..7f0064cc3cf 100644 --- a/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.py +++ b/erpnext/accounts/doctype/repost_allowed_types/repost_allowed_types.py @@ -14,7 +14,6 @@ class RepostAllowedTypes(Document): if TYPE_CHECKING: from frappe.types import DF - allowed: DF.Check document_type: DF.Link | None parent: DF.Data parentfield: DF.Data diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js index 1ece3e6c3dd..5c02fd2f127 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.js +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.js @@ -25,6 +25,10 @@ frappe.ui.form.on("Shipping Rule", { }, calculate_based_on: function (frm) { frm.trigger("toggle_reqd"); + if (frm.doc.calculate_based_on === "Fixed") { + frm.clear_table("conditions"); + frm.refresh_field("conditions"); + } }, toggle_reqd: function (frm) { frm.toggle_reqd("shipping_amount", frm.doc.calculate_based_on === "Fixed"); diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py index 3ec11364afa..7b226560668 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py @@ -58,6 +58,11 @@ class ShippingRule(Document): self.validate_overlapping_shipping_rule_conditions() def validate_from_to_values(self): + if self.calculate_based_on == "Fixed": + if self.conditions: + self.set("conditions", []) + return + zero_to_values = [] for d in self.get("conditions"): diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.js b/erpnext/accounts/report/accounts_payable/accounts_payable.js index 4d74a5c2d7c..c94f8c245ec 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.js +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.js @@ -34,6 +34,17 @@ frappe.query_reports["Accounts Payable"] = { }, options: "Cost Center", }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "MultiSelectList", + options: "Project", + get_data: function (txt) { + return frappe.db.get_link_options("Project", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, { fieldname: "party_account", label: __("Payable Account"), diff --git a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py index a8074468f55..ee296447c0e 100644 --- a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py +++ b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py @@ -117,3 +117,49 @@ class TestAccountsPayable(ERPNextTestSuite, AccountsTestMixin): self.assertEqual(len(report[1]), 2) self.assertEqual([pi.name, payment_term1.payment_term_name], [row.voucher_no, row.payment_term]) + + def test_project_filter(self): + project = frappe.get_doc( + {"doctype": "Project", "project_name": "_Test AP Project", "company": self.company} + ).insert() + + pi = self.create_purchase_invoice(do_not_submit=True) + pi.project = project.name + pi.save().submit() + + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + "project": [project.name], + } + + report = execute(filters)[1] + self.assertEqual(len(report), 1) + row = report[0] + self.assertEqual(row.project, project.name) + self.assertEqual(row.invoiced, 300.0) + + def test_project_on_report_output(self): + """ + Report row must carry the invoice's project. + """ + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + } + + project = frappe.get_doc( + {"doctype": "Project", "project_name": "_Test AP Project Output", "company": self.company} + ).insert() + + pi = self.create_purchase_invoice(do_not_submit=True) + pi.project = project.name + pi.save().submit() + + report = execute(filters) + + self.assertEqual(len(report[1]), 1) + row = report[1][0] + self.assertEqual([pi.name, project.name, 300], [row.voucher_no, row.project, row.outstanding]) diff --git a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js index a4cb0584bf1..3f603b62833 100644 --- a/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js +++ b/erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js @@ -53,6 +53,17 @@ frappe.query_reports["Accounts Payable Summary"] = { }, options: "Cost Center", }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "MultiSelectList", + options: "Project", + get_data: function (txt) { + return frappe.db.get_link_options("Project", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, { fieldname: "party_type", label: __("Party Type"), diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js index a05b17bfade..e7aa1f57036 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.js +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.js @@ -36,6 +36,17 @@ frappe.query_reports["Accounts Receivable"] = { }, options: "Cost Center", }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "MultiSelectList", + options: "Project", + get_data: function (txt) { + return frappe.db.get_link_options("Project", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, { fieldname: "party_type", label: __("Party Type"), diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index e29ed79cc49..4ca1bdcfffb 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -196,6 +196,7 @@ class ReceivablePayableReport: and ple.against_voucher_type in self.advance_payment_doctypes ): self.voucher_balance[key].cost_center = ple.cost_center + self.voucher_balance[key].project = ple.project self.get_invoices(ple) @@ -362,6 +363,7 @@ class ReceivablePayableReport: posting_date, account_currency, cost_center, + project, sum(invoiced) `invoiced`, sum(paid) `paid`, sum(credit_note) `credit_note`, @@ -390,6 +392,7 @@ class ReceivablePayableReport: "credit_note_in_account_currency", "outstanding_in_account_currency", "cost_center", + "project", ]: _d[field] = x.get(field) @@ -931,6 +934,7 @@ class ReceivablePayableReport: ple.against_voucher_no, ple.party_type, ple.cost_center, + ple.project, ple.party, ple.posting_date, ple.due_date, @@ -998,6 +1002,9 @@ class ReceivablePayableReport: if self.filters.cost_center: self.get_cost_center_conditions() + if self.filters.project: + self.qb_selection_filter.append(self.ple.project.isin(self.filters.project)) + self.add_accounting_dimensions_filters() def get_cost_center_conditions(self): @@ -1237,6 +1244,7 @@ class ReceivablePayableReport: ) self.add_column(label=_("Cost Center"), fieldname="cost_center", fieldtype="Data") + self.add_column(label=_("Project"), fieldname="project", fieldtype="Link", options="Project") self.add_column(label=_("Voucher Type"), fieldname="voucher_type", fieldtype="Data") self.add_column( label=_("Voucher No"), @@ -1413,6 +1421,7 @@ class InitSQLProceduresForAR: posting_date date, account_currency {_varchar_type}, cost_center {_varchar_type}, + project {_varchar_type}, invoiced {_currency_type}, paid {_currency_type}, credit_note {_currency_type}, @@ -1432,6 +1441,7 @@ class InitSQLProceduresForAR: against_voucher_no {_varchar_type}, party_type {_varchar_type}, cost_center {_varchar_type}, + project {_varchar_type}, party {_varchar_type}, posting_date date, due_date date, @@ -1447,7 +1457,7 @@ class InitSQLProceduresForAR: begin if not exists (select name from `{_voucher_balance_name}` where name = sha1(concat_ws(',', ple.account, ple.against_voucher_type, ple.against_voucher_no, ple.party))) then - insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.against_voucher_type, ple.against_voucher_no, ple.party)), ple.voucher_type, ple.voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency, ple.cost_center, 0, 0, 0, 0, 0, 0); + insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.against_voucher_type, ple.against_voucher_no, ple.party)), ple.voucher_type, ple.voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency, ple.cost_center, ple.project, 0, 0, 0, 0, 0, 0); end if; end; """ @@ -1489,7 +1499,7 @@ class InitSQLProceduresForAR: end if; - insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.voucher_type, ple.voucher_no, ple.party)), ple.against_voucher_type, ple.against_voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency,'', invoiced, paid, 0, invoiced_in_account_currency, paid_in_account_currency, 0); + insert into `{_voucher_balance_name}` values (sha1(concat_ws(',', ple.account, ple.voucher_type, ple.voucher_no, ple.party)), ple.against_voucher_type, ple.against_voucher_no, ple.party, ple.account, ple.posting_date, ple.account_currency,'', '', invoiced, paid, 0, invoiced_in_account_currency, paid_in_account_currency, 0); end; """ diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py index 4b852e0583d..9b8b8b709db 100644 --- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py @@ -774,22 +774,18 @@ class TestAccountsReceivable(ERPNextTestSuite, AccountsTestMixin): def test_party_account_filter(self): si1 = self.create_sales_invoice() - self.customer2 = ( - frappe.get_doc( - { - "doctype": "Customer", - "customer_name": "Jane Doe", - "type": "Individual", - "default_currency": "USD", - } - ) - .insert() - .submit() - ) + jane = frappe.get_doc( + { + "doctype": "Customer", + "customer_name": "Jane Doe", + "type": "Individual", + "default_currency": "USD", + } + ).insert() + self.customer = jane.name si2 = self.create_sales_invoice(do_not_submit=True) si2.posting_date = add_days(today(), -1) - si2.customer = self.customer2.name si2.currency = "USD" si2.conversion_rate = 80 si2.debit_to = self.debtors_usd @@ -997,22 +993,18 @@ class TestAccountsReceivable(ERPNextTestSuite, AccountsTestMixin): self.assertEqual(expected_data, report_output) def test_future_payments_on_foreign_currency(self): - self.customer2 = ( - frappe.get_doc( - { - "doctype": "Customer", - "customer_name": "Jane Doe", - "type": "Individual", - "default_currency": "USD", - } - ) - .insert() - .submit() - ) + jane = frappe.get_doc( + { + "doctype": "Customer", + "customer_name": "Jane Doe", + "type": "Individual", + "default_currency": "USD", + } + ).insert() + self.customer = jane.name si = self.create_sales_invoice(do_not_submit=True) si.posting_date = add_days(today(), -1) - si.customer = self.customer2.name si.currency = "USD" si.conversion_rate = 80 si.debit_to = self.debtors_usd @@ -1204,3 +1196,52 @@ class TestAccountsReceivable(ERPNextTestSuite, AccountsTestMixin): self.assertEqual(len(report[1]), 2) self.assertEqual([si.name, payment_term1.payment_term_name], [row.voucher_no, row.payment_term]) + + def test_project_filter(self): + project = frappe.get_doc( + {"doctype": "Project", "project_name": "_Test AR Project", "company": self.company} + ).insert() + + si = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True) + si.project = project.name + si.save().submit() + + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + "project": [project.name], + } + + report = execute(filters)[1] + self.assertEqual(len(report), 1) + row = report[0] + self.assertEqual(row.project, project.name) + self.assertEqual(row.invoiced, 100.0) + + def test_project_on_report_output(self): + """ + Report row must carry the invoice's project even when the payment entry + has no project set. + """ + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + } + + project = frappe.get_doc( + {"doctype": "Project", "project_name": "_Test AR Project Output", "company": self.company} + ).insert() + + si = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True) + si.project = project.name + si.save().submit() + + # payment has no project — report row must still show the invoice's project + self.create_payment_entry(si.name) + report = execute(filters) + + self.assertEqual(len(report[1]), 1) + row = report[1][0] + self.assertEqual([si.name, project.name, 60], [row.voucher_no, row.project, row.outstanding]) diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js index c8e59d6e054..46585071174 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js +++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js @@ -53,6 +53,17 @@ frappe.query_reports["Accounts Receivable Summary"] = { }, options: "Cost Center", }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "MultiSelectList", + options: "Project", + get_data: function (txt) { + return frappe.db.get_link_options("Project", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, { fieldname: "party_type", label: __("Party Type"), diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 518b49f0ea5..dfba16a77eb 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -774,7 +774,28 @@ class GrossProfitGenerator: # IMP NOTE # stock_ledger_entries should already be filtered by item_code and warehouse and # sorted by posting_date desc, posting_time desc - if item_code in self.non_stock_items and (row.project or row.cost_center): + if ( + row.delivered_by_supplier + and row.so_detail + and ( + po_details := frappe.get_all( + "Purchase Order Item", + filters={"sales_order_item": row.so_detail, "docstatus": 1}, + pluck="name", + ) + ) + ): + from frappe.query_builder.functions import Sum + + table = frappe.qb.DocType("Purchase Invoice Item") + query = ( + frappe.qb.from_(table) + .select(Sum(table.qty * table.base_net_rate)) + .where((table.po_detail.isin(po_details)) & (table.docstatus == 1)) + ) + return flt(query.run()[0][0]) + + elif item_code in self.non_stock_items and (row.project or row.cost_center): # Issue 6089-Get last purchasing rate for non-stock item item_rate = self.get_last_purchase_rate(item_code, row) return flt(row.qty) * item_rate @@ -804,26 +825,6 @@ class GrossProfitGenerator: return self.calculate_buying_amount_from_sle( row, my_sle, parenttype, parent, item_row, item_code ) - elif ( - row.delivered_by_supplier - and row.so_detail - and ( - po_details := frappe.get_all( - "Purchase Order Item", - filters={"sales_order_item": row.so_detail, "docstatus": 1}, - pluck="name", - ) - ) - ): - from frappe.query_builder.functions import Sum - - table = frappe.qb.DocType("Purchase Invoice Item") - query = ( - frappe.qb.from_(table) - .select(Sum(table.stock_qty * table.base_net_rate)) - .where((table.po_detail.isin(po_details)) & (table.docstatus == 1)) - ) - return flt(query.run()[0][0]) elif row.sales_order and row.so_detail: incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code) if incoming_amount: diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index 2ec8931b63d..4801bf15b56 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -499,7 +499,7 @@ def get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts, inc else sum(base_tax_amount_after_discount_amount) * -1 end as tax_amount from `tabPurchase Taxes and Charges` where parent in (%s) and category in ('Total', 'Valuation and Total') - and base_tax_amount_after_discount_amount != 0 + and base_tax_amount_after_discount_amount != 0 and parenttype='Purchase Invoice' group by parent, account_head, add_deduct_tax """ % ", ".join(["%s"] * len(invoice_list)), diff --git a/erpnext/accounts/report/purchase_register/test_purchase_register.py b/erpnext/accounts/report/purchase_register/test_purchase_register.py index 400ee899fa1..e4ce5ffcfe3 100644 --- a/erpnext/accounts/report/purchase_register/test_purchase_register.py +++ b/erpnext/accounts/report/purchase_register/test_purchase_register.py @@ -5,6 +5,7 @@ import frappe from frappe.utils import add_months, today from erpnext.accounts.report.purchase_register.purchase_register import execute +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.tests.utils import ERPNextTestSuite @@ -26,6 +27,52 @@ class TestPurchaseRegister(ERPNextTestSuite): self.assertEqual(first_row.total_tax, 100) self.assertEqual(first_row.grand_total, 1100) + def test_purchase_register_ignores_tax_rows_from_other_doctype(self): + frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company 6'") + frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 6'") + + filters = frappe._dict(company="_Test Company 6", from_date=add_months(today(), -1), to_date=today()) + + pi = make_purchase_invoice() + + # Real workflow setup: create a Purchase Receipt tax row in the same shared child table. + pr = make_purchase_receipt( + company="_Test Company 6", + supplier="_Test Supplier", + item="_Test Item", + warehouse="_Test Warehouse - _TC6", + cost_center="_Test Cost Center - _TC6", + do_not_save=1, + do_not_submit=1, + qty=1, + rate=1000, + ) + pr.append( + "taxes", + { + "account_head": "GST - _TC6", + "cost_center": "_Test Cost Center - _TC6", + "add_deduct_tax": "Add", + "category": "Valuation and Total", + "charge_type": "Actual", + "description": "PR Tax", + "tax_amount": 100.0, + "rate": 100, + }, + ) + pr.insert() + pr.submit() + + # Mimic custom naming collision across doctypes (same parent value in shared child table). + frappe.rename_doc("Purchase Receipt", pr.name, pi.name, force=True) + + report_results = execute(filters) + first_row = frappe._dict(report_results[1][0]) + + self.assertEqual(first_row.voucher_no, pi.name) + self.assertEqual(first_row.total_tax, 100) + self.assertEqual(first_row.grand_total, 1100) + def test_purchase_register_ledger_view(self): frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company 6'") frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 6'") diff --git a/erpnext/accounts/report/sales_register/test_sales_register.py b/erpnext/accounts/report/sales_register/test_sales_register.py index c6926d57dea..0875c7c143f 100644 --- a/erpnext/accounts/report/sales_register/test_sales_register.py +++ b/erpnext/accounts/report/sales_register/test_sales_register.py @@ -4,6 +4,7 @@ from frappe.utils import getdate, today from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.sales_register.sales_register import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.tests.utils import ERPNextTestSuite @@ -72,6 +73,43 @@ class TestItemWiseSalesRegister(ERPNextTestSuite, AccountsTestMixin): report_output = {k: v for k, v in report[1][0].items() if k in expected_result} self.assertDictEqual(report_output, expected_result) + def test_sales_register_ignores_tax_rows_from_other_doctype(self): + si = self.create_sales_invoice(rate=98) + + # Real workflow setup: create a Sales Order with taxes in the shared child table. + so = make_sales_order( + item=self.item, + company=self.company, + customer=self.customer, + rate=77, + do_not_save=1, + do_not_submit=1, + ) + so.append( + "taxes", + { + "charge_type": "Actual", + "account_head": self.income_account, + "description": "SO Tax", + "tax_amount": 55.0, + }, + ) + so.insert() + so.submit() + + # Mimic custom naming collision across doctypes (same parent value in shared child table). + frappe.rename_doc("Sales Order", so.name, si.name, force=True) + + filters = frappe._dict({"from_date": today(), "to_date": today(), "company": self.company}) + report = execute(filters) + + self.assertEqual(len(report[1]), 1) + result = frappe._dict(report[1][0]) + self.assertEqual(result.voucher_no, si.name) + self.assertEqual(result.net_total, 98.0) + self.assertEqual(result.tax_total, 0) + self.assertEqual(result.grand_total, 98.0) + def test_journal_with_cost_center_filter(self): je1 = frappe.get_doc( { diff --git a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py index ed4a223311b..70813aaeb1d 100644 --- a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py +++ b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py @@ -68,8 +68,10 @@ def get_tax_withholding_data(filters): } data.append(row) - # Sort by section code and transaction date - data.sort(key=lambda x: (x["section_code"] or "", x["transaction_date"] or "")) + # Sort by section code, transaction date, then withholding_name for deterministic ordering + data.sort( + key=lambda x: (x["section_code"] or "", x["transaction_date"] or "", x["withholding_name"] or "") + ) return data diff --git a/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py index 49e50b7ff32..91683867188 100644 --- a/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py +++ b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py @@ -5,10 +5,12 @@ import frappe from frappe.utils import add_to_date, today from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry -from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice -from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.doctype.tax_withholding_category.test_tax_withholding_category import ( + create_purchase_invoice, + create_records, + create_sales_invoice, create_tax_withholding_category, + make_journal_entry_with_tax_withholding, ) from erpnext.accounts.report.tax_withholding_details.tax_withholding_details import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin @@ -20,43 +22,45 @@ class TestTaxWithholdingDetails(ERPNextTestSuite, AccountsTestMixin): def setUp(self): self.create_company() self.clear_old_entries() - create_tax_accounts() + create_records() def test_tax_withholding_for_customers(self): create_tax_category(cumulative_threshold=300) - frappe.db.set_value("Customer", "_Test Customer", "tax_withholding_category", "TCS") - si = create_sales_invoice(rate=1000) - pe = create_tcs_payment_entry() + frappe.db.set_value("Customer", "Test TCS Customer", "tax_withholding_category", "TCS") + si = create_sales_invoice(customer="Test TCS Customer", rate=1000) + si.submit() + + create_tcs_payment_entry() jv = create_tcs_journal_entry() filters = frappe._dict( company="_Test Company", party_type="Customer", from_date=today(), to_date=today() ) result = execute(filters)[1] + expected_values = [ - # Check for JV totals using back calculation logic - [jv.name, "TCS", 0.075, -10000.0, -7.5, -10000.0], - [pe.name, "TCS", 0.075, 2550, 0.53, 2550.53], - [si.name, "TCS", 0.075, 1000, 0.52, 1000.52], + [jv.name, "TCS", 0.075, 1000.75, 0.75, 1000.75], + ["", "TCS", 0.075, 0, 0.75, 0], + [si.name, "TCS", 0.075, 1000.0, 0.75, 1000.75], ] self.check_expected_values(result, expected_values) def test_single_account_for_multiple_categories(self): - create_tax_category("TDS - 1", rate=10, account="TDS - _TC") - inv_1 = make_purchase_invoice(rate=1000, do_not_submit=True) - inv_1.tax_withholding_category = "TDS - 1" + create_tax_category("TDS - 1", rate=10, account="TDS - _TC", cumulative_threshold=1) + frappe.db.set_value("Supplier", "Test TDS Supplier", "tax_withholding_category", "TDS - 1") + inv_1 = create_purchase_invoice(supplier="Test TDS Supplier", rate=5000) inv_1.submit() - create_tax_category("TDS - 2", rate=20, account="TDS - _TC") - inv_2 = make_purchase_invoice(rate=1000, do_not_submit=True) - inv_2.tax_withholding_category = "TDS - 2" + create_tax_category("TDS - 2", rate=20, account="TDS - _TC", cumulative_threshold=1) + frappe.db.set_value("Supplier", "Test TDS Supplier", "tax_withholding_category", "TDS - 2") + inv_2 = create_purchase_invoice(supplier="Test TDS Supplier", rate=5000) inv_2.submit() result = execute( frappe._dict(company="_Test Company", party_type="Supplier", from_date=today(), to_date=today()) )[1] expected_values = [ - [inv_1.name, "TDS - 1", 10, 5000, 500, 5500], - [inv_2.name, "TDS - 2", 20, 5000, 1000, 6000], + [inv_1.name, "TDS - 1", 10, 5000, 500, 4500], + [inv_2.name, "TDS - 2", 20, 5000, 1000, 4000], ] self.check_expected_values(result, expected_values) @@ -81,20 +85,21 @@ class TestTaxWithholdingDetails(ERPNextTestSuite, AccountsTestMixin): tds_doc.save() - inv_1 = make_purchase_invoice( - rate=1000, posting_date=add_to_date(fiscal_year[1], days=1), do_not_save=True, do_not_submit=True + frappe.db.set_value("Supplier", "Test TDS Supplier", "tax_withholding_category", tds_doc.name) + inv_1 = create_purchase_invoice( + supplier="Test TDS Supplier", + rate=5000, + posting_date=add_to_date(fiscal_year[1], days=1), + set_posting_time=True, ) - inv_1.set_posting_time = 1 - inv_1.apply_tds = 1 - inv_1.tax_withholding_category = tds_doc.name - inv_1.save() inv_1.submit() - inv_2 = make_purchase_invoice(rate=1000, posting_date=from_date, do_not_save=True, do_not_submit=True) - inv_2.set_posting_time = 1 - inv_2.apply_tds = 1 - inv_2.tax_withholding_category = tds_doc.name - inv_2.save() + inv_2 = create_purchase_invoice( + supplier="Test TDS Supplier", + rate=5000, + posting_date=from_date, + set_posting_time=True, + ) inv_2.submit() result = execute( @@ -113,6 +118,7 @@ class TestTaxWithholdingDetails(ERPNextTestSuite, AccountsTestMixin): self.check_expected_values(result, expected_values) def check_expected_values(self, result, expected_values): + self.assertEqual(len(result), len(expected_values)) for i in range(len(result)): voucher = frappe._dict(result[i]) voucher_expected_values = expected_values[i] @@ -127,21 +133,6 @@ class TestTaxWithholdingDetails(ERPNextTestSuite, AccountsTestMixin): self.assertSequenceEqual(voucher_actual_values, voucher_expected_values) -def create_tax_accounts(): - account_names = ["TCS", "TDS"] - for account in account_names: - frappe.get_doc( - { - "doctype": "Account", - "company": "_Test Company", - "account_name": account, - "parent_account": "Duties and Taxes - _TC", - "report_type": "Balance Sheet", - "root_type": "Liability", - } - ).insert(ignore_if_duplicate=True) - - def create_tax_category(category="TCS", rate=0.075, account="TCS - _TC", cumulative_threshold=0): fiscal_year = get_fiscal_year(today(), company="_Test Company") from_date = fiscal_year[1] @@ -157,55 +148,34 @@ def create_tax_category(category="TCS", rate=0.075, account="TCS - _TC", cumulat ) -def create_tcs_payment_entry(): +def create_tcs_payment_entry(party="Test TCS Customer", category="TCS", amount=1000): + """Create a TCS Payment Entry that generates a Tax Withholding Entry (Over Withheld).""" payment_entry = create_payment_entry( payment_type="Receive", party_type="Customer", - party="_Test Customer", + party=party, paid_from="Debtors - _TC", paid_to="Cash - _TC", - paid_amount=2550, - ) - - payment_entry.append( - "taxes", - { - "account_head": "TCS - _TC", - "charge_type": "Actual", - "tax_amount": 0.53, - "add_deduct_tax": "Add", - "description": "Test", - "cost_center": "Main - _TC", - }, + paid_amount=amount, ) + payment_entry.apply_tds = 1 + payment_entry.tax_withholding_category = category + payment_entry.save() payment_entry.submit() return payment_entry -def create_tcs_journal_entry(): - jv = frappe.new_doc("Journal Entry") - jv.posting_date = today() - jv.company = "_Test Company" - jv.set( - "accounts", - [ - { - "account": "Debtors - _TC", - "party_type": "Customer", - "party": "_Test Customer", - "credit_in_account_currency": 10000, - }, - { - "account": "Debtors - _TC", - "party_type": "Customer", - "party": "_Test Customer", - "debit_in_account_currency": 9992.5, - }, - { - "account": "TCS - _TC", - "debit_in_account_currency": 7.5, - }, - ], +def create_tcs_journal_entry(party="Test TCS Customer", category="TCS", amount=1000): + """Create a TCS Credit Note Journal Entry that generates a Tax Withholding Entry.""" + jv = make_journal_entry_with_tax_withholding( + party_type="Customer", + party=party, + voucher_type="Credit Note", + amount=amount, + save=False, ) - jv.insert() - return jv.submit() + jv.apply_tds = 1 + jv.tax_withholding_category = category + jv.save() + jv.submit() + return jv diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 0c23353d1eb..fe68c4018aa 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -2513,6 +2513,7 @@ def create_gain_loss_journal( ref2_detail_no, cost_center, dimensions, + project=None, ) -> str: journal_entry = frappe.new_doc("Journal Entry") journal_entry.voucher_type = "Exchange Gain Or Loss" @@ -2539,6 +2540,7 @@ def create_gain_loss_journal( "account_currency": party_account_currency, "exchange_rate": 0, "cost_center": cost_center or erpnext.get_default_cost_center(company), + "project": project, "reference_type": ref1_dt, "reference_name": ref1_dn, "reference_detail_no": ref1_detail_no, @@ -2556,6 +2558,7 @@ def create_gain_loss_journal( "account_currency": gain_loss_account_currency, "exchange_rate": 1, "cost_center": cost_center or erpnext.get_default_cost_center(company), + "project": project, "reference_type": ref2_dt, "reference_name": ref2_dn, "reference_detail_no": ref2_detail_no, diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json index 5a0edbdf5d1..3963bbb4959 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.json +++ b/erpnext/buying/doctype/buying_settings/buying_settings.json @@ -24,6 +24,7 @@ "allow_zero_qty_in_supplier_quotation", "use_transaction_date_exchange_rate", "allow_zero_qty_in_request_for_quotation", + "allow_negative_rates_for_items", "column_break_12", "maintain_same_rate", "allow_multiple_items", @@ -279,6 +280,12 @@ "fieldname": "validate_consumed_qty", "fieldtype": "Check", "label": "Validate Consumed Qty (as per BOM)" + }, + { + "default": "0", + "fieldname": "allow_negative_rates_for_items", + "fieldtype": "Check", + "label": "Allow Negative rates for Items" } ], "grid_page_length": 50, @@ -288,7 +295,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-03-16 13:28:19.432589", + "modified": "2026-04-15 16:07:35.484787", "modified_by": "Administrator", "module": "Buying", "name": "Buying Settings", diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.py b/erpnext/buying/doctype/buying_settings/buying_settings.py index 3634f8a9069..8f358bb364b 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.py +++ b/erpnext/buying/doctype/buying_settings/buying_settings.py @@ -18,6 +18,7 @@ class BuyingSettings(Document): from frappe.types import DF allow_multiple_items: DF.Check + allow_negative_rates_for_items: DF.Check allow_zero_qty_in_purchase_order: DF.Check allow_zero_qty_in_request_for_quotation: DF.Check allow_zero_qty_in_supplier_quotation: DF.Check diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 09d7d30ab39..03254c30f6e 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -477,6 +477,11 @@ def create_supplier_quotation(doc): if isinstance(doc, str): doc = json.loads(doc) + if frappe.session.user not in frappe.get_all( + "Portal User", {"parent": doc.get("supplier")}, pluck="user" + ): + frappe.throw(_("Not Permitted"), frappe.PermissionError) + try: sq_doc = frappe.get_doc( { diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index 9201f6c4f2d..36468a83dac 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -264,6 +264,13 @@ def make_request_for_quotation(**args) -> "RequestforQuotation": for data in supplier_data: rfq.append("suppliers", data) + frappe.new_doc( + "Portal User", + user="Administrator", + parent=data.get("supplier"), + parentfield="portal_users", + parenttype="Supplier", + ).insert() rfq.append( "items", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index e0bb6e85bab..6a2794dd9ab 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -68,6 +68,7 @@ from erpnext.setup.utils import get_exchange_rate from erpnext.stock.doctype.item.item import get_uom_conv_factor from erpnext.stock.doctype.packed_item.packed_item import make_packing_list from erpnext.stock.get_item_details import ( + NOT_APPLICABLE_TAX, ItemDetailsCtx, _get_item_tax_template, get_conversion_factor, @@ -1767,6 +1768,7 @@ class AccountsController(TransactionBase): arg.get("referenced_row"), arg.get("cost_center"), dimensions_dict, + arg.get("project"), ) frappe.msgprint( _("Exchange Gain/Loss amount has been booked through {0}").format( @@ -1851,6 +1853,7 @@ class AccountsController(TransactionBase): d.idx, self.cost_center, dimensions_dict, + self.project, ) frappe.msgprint( _("Exchange Gain/Loss amount has been booked through {0}").format( @@ -3684,8 +3687,11 @@ def add_taxes_from_tax_template(child_item, parent_doc, db_insert=True): if child_item.get("item_tax_rate") and add_taxes_from_item_tax_template: tax_map = json.loads(child_item.get("item_tax_rate")) - for tax_type in tax_map: - tax_rate = flt(tax_map[tax_type]) + for tax_type, tax_rate in tax_map.items(): + if tax_rate == NOT_APPLICABLE_TAX: + continue + + tax_rate = flt(tax_rate) taxes = parent_doc.get("taxes") or [] # add new row for tax head only if missing found = any(tax.account_head == tax_type for tax in taxes) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index fd86291027e..5627dffea95 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -18,7 +18,11 @@ from erpnext.buying.utils import update_last_purchase_rate, validate_for_items from erpnext.controllers.accounts_controller import get_taxes_and_charges from erpnext.controllers.sales_and_purchase_return import get_rate_for_return from erpnext.controllers.subcontracting_controller import SubcontractingController -from erpnext.stock.get_item_details import get_conversion_factor, get_item_defaults +from erpnext.stock.get_item_details import ( + NOT_APPLICABLE_TAX, + get_conversion_factor, + get_item_defaults, +) from erpnext.stock.utils import get_incoming_rate @@ -523,6 +527,9 @@ class BuyingController(SubcontractingController): if account not in tax_accounts: continue + if rate == NOT_APPLICABLE_TAX: + continue + net_rate = item.base_net_amount if item.sales_incoming_rate: net_rate = item.qty * item.sales_incoming_rate diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 96ca67c28df..95c25c497bf 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -272,6 +272,12 @@ class StatusUpdater(Document): continue items_to_validate = [] + selling_negative_rate_allowed = frappe.get_single_value( + "Selling Settings", "allow_negative_rates_for_items" + ) + buying_negative_rate_allowed = frappe.get_single_value( + "Buying Settings", "allow_negative_rates_for_items" + ) # get unique transactions to update for d in self.get_all_children(): @@ -281,7 +287,12 @@ class StatusUpdater(Document): if hasattr(d, "qty") and d.qty > 0 and self.get("is_return"): frappe.throw(_("For an item {0}, quantity must be negative number").format(d.item_code)) - if not frappe.get_single_value("Selling Settings", "allow_negative_rates_for_items"): + if ( + not selling_negative_rate_allowed and self.doctype in ["Sales Invoice", "Delivery Note"] + ) or ( + not buying_negative_rate_allowed + and self.doctype in ["Purchase Invoice", "Purchase Receipt"] + ): if hasattr(d, "item_code") and hasattr(d, "rate") and flt(d.rate) < 0: frappe.throw( _( @@ -289,7 +300,11 @@ class StatusUpdater(Document): ).format( frappe.bold(d.item_code), frappe.bold(_("`Allow Negative rates for Items`")), - get_link_to_form("Selling Settings", "Selling Settings"), + get_link_to_form( + "Selling Settings" + if self.doctype in ["Sales Invoice", "Delivery Note"] + else "Buying Settings" + ), ), ) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 05f2e18c878..5e883a6695c 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -142,14 +142,19 @@ class StockController(AccountsController): ]: for item in self.get("items"): if ( - (item.get("valuation_rate") == 0 or item.get("incoming_rate") == 0) + ( + item.get("valuation_rate") == 0 + or (item.get("incoming_rate") == 0 and self.get("update_stock", 1)) + ) and item.get("allow_zero_valuation_rate") == 0 and frappe.get_cached_value("Item", item.item_code, "is_stock_item") ): frappe.toast( - _( - "Row #{0}: Item {1} has zero rate but 'Allow Zero Valuation Rate' is not enabled." - ).format(item.idx, frappe.bold(item.item_code)), + _("Row #{0}: Item {1} has zero rate but '{2}' is not enabled.").format( + item.idx, + frappe.bold(item.item_code), + item.meta.get_label("allow_zero_valuation_rate"), + ), indicator="orange", ) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 21743e57f11..6a0a41b1799 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -20,7 +20,12 @@ from erpnext.controllers.accounts_controller import ( validate_taxes_and_charges, ) from erpnext.deprecation_dumpster import deprecated -from erpnext.stock.get_item_details import ItemDetailsCtx, _get_item_tax_template, get_item_tax_map +from erpnext.stock.get_item_details import ( + NOT_APPLICABLE_TAX, + ItemDetailsCtx, + _get_item_tax_template, + get_item_tax_map, +) from erpnext.utilities.regional import temporary_flag @@ -358,6 +363,9 @@ class calculate_taxes_and_totals: if cint(tax.included_in_print_rate): tax_rate = self._get_tax_rate(tax, item_tax_map) + if tax_rate == NOT_APPLICABLE_TAX: + return current_tax_fraction, inclusive_tax_amount_per_qty + if tax.charge_type == "On Net Total": current_tax_fraction = tax_rate / 100.0 @@ -382,9 +390,12 @@ class calculate_taxes_and_totals: def _get_tax_rate(self, tax, item_tax_map): if tax.account_head in item_tax_map: - return flt(item_tax_map.get(tax.account_head), self.doc.precision("rate", tax)) - else: - return tax.rate + rate = item_tax_map[tax.account_head] + if rate == NOT_APPLICABLE_TAX: + return NOT_APPLICABLE_TAX + return flt(rate, self.doc.precision("rate", tax)) + + return tax.rate def calculate_net_total(self): self.doc.total_qty = ( @@ -594,6 +605,9 @@ class calculate_taxes_and_totals: current_tax_amount = 0.0 current_net_amount = 0.0 + if tax_rate == NOT_APPLICABLE_TAX: + return current_net_amount, current_tax_amount + if tax.charge_type == "Actual": current_net_amount = item.net_amount # distribute the tax amount proportionally to each item row @@ -784,18 +798,17 @@ class calculate_taxes_and_totals: if self.doc.meta.get_field("rounded_total"): if self.doc.is_rounded_total_disabled(): self.doc.rounded_total = 0 - self.doc.base_rounded_total = 0 self.doc.rounding_adjustment = 0 - return - self.doc.rounded_total = round_based_on_smallest_currency_fraction( - self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total") - ) + else: + self.doc.rounded_total = round_based_on_smallest_currency_fraction( + self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total") + ) - # rounding adjustment should always be the difference vetween grand and rounded total - self.doc.rounding_adjustment = flt( - self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment") - ) + # rounding adjustment should always be the difference between grand and rounded total + self.doc.rounding_adjustment = flt( + self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment") + ) self._set_in_company_currency(self.doc, ["rounding_adjustment", "rounded_total"]) @@ -1290,7 +1303,8 @@ def get_itemised_tax(doc, with_tax_account=False): ) tax_info.tax_amount += flt(row.amount, precision) - tax_info.taxable_amount += flt(row.taxable_amount, precision) + conversion_rate = doc.conversion_rate or 1 + tax_info.taxable_amount += flt(row.taxable_amount / conversion_rate, precision) if with_tax_account: tax_info.tax_account = tax.account_head diff --git a/erpnext/controllers/tests/test_item_wise_tax_details.py b/erpnext/controllers/tests/test_item_wise_tax_details.py index 7e19c1dc057..81dd92c8606 100644 --- a/erpnext/controllers/tests/test_item_wise_tax_details.py +++ b/erpnext/controllers/tests/test_item_wise_tax_details.py @@ -301,3 +301,238 @@ class TestTaxesAndTotals(ERPNextTestSuite): tax = doc.taxes[0] detail = doc.item_wise_tax_details[0] self.assertEqual(detail.amount, tax.base_tax_amount_after_discount_amount) + + @change_settings("Selling Settings", {"allow_multiple_items": 1}) + def test_not_applicable_tax_in_item_tax_template(self): + """Test that items with 'not applicable' tax don't contribute to net amount of that tax.""" + template_7pct = frappe.get_doc( + { + "doctype": "Item Tax Template", + "title": "_Test VAT 7% Template", + "company": "_Test Company", + "taxes": [ + { + "tax_type": "_Test Account VAT - _TC", + "tax_rate": 7, + }, + { + "tax_type": "_Test Account Service Tax - _TC", + "tax_rate": 0, + "not_applicable": 1, + }, + ], + } + ).insert(ignore_if_duplicate=True) + + template_19pct = frappe.get_doc( + { + "doctype": "Item Tax Template", + "title": "_Test VAT 19% Template", + "company": "_Test Company", + "taxes": [ + { + "tax_type": "_Test Account VAT - _TC", + "tax_rate": 0, + }, + { + "tax_type": "_Test Account Service Tax - _TC", + "tax_rate": 19, + }, + ], + } + ).insert(ignore_if_duplicate=True) + + self.doc.items[0].item_tax_template = template_7pct.name + + self.doc.append( + "items", + { + "item_code": "_Test Item", + "qty": 1, + "rate": 100, + "income_account": "Sales - _TC", + "expense_account": "Cost of Goods Sold - _TC", + "cost_center": "_Test Cost Center - _TC", + "item_tax_template": template_19pct.name, + }, + ) + + self.doc.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account VAT - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT 7%", + "rate": 7, + }, + ) + + self.doc.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT 19%", + "rate": 19, + }, + ) + + self.doc.save() + + # VAT 7%: Both items contribute (Item 2 has 0% rate, not "not applicable") + self.assertEqual(self.doc.taxes[0].net_amount, 200.0) + # Service Tax 19%: Only Item 2 contributes (Item 1 has not_applicable) + self.assertEqual(self.doc.taxes[1].net_amount, 100.0) + + expected_values = [ + { + "item_row": self.doc.items[0].name, + "tax_row": self.doc.taxes[0].name, + "rate": 7.0, + "amount": 7.0, + "taxable_amount": 100.0, + }, + { + "item_row": self.doc.items[1].name, + "tax_row": self.doc.taxes[0].name, + "rate": 0.0, + "amount": 0.0, + "taxable_amount": 100.0, + }, + { + "item_row": self.doc.items[1].name, + "tax_row": self.doc.taxes[1].name, + "rate": 19.0, + "amount": 19.0, + "taxable_amount": 100.0, + }, + ] + + actual_values = [ + { + "item_row": row.item_row, + "tax_row": row.tax_row, + "rate": row.rate, + "amount": row.amount, + "taxable_amount": row.taxable_amount, + } + for row in self.doc.item_wise_tax_details + ] + + self.assertEqual(actual_values, expected_values) + + def test_not_applicable_tax_in_item_tax_template_with_different_items(self): + """Test that items with 'not applicable' tax don't contribute to net amount of that tax.""" + template_7pct = frappe.get_doc( + { + "doctype": "Item Tax Template", + "title": "_Test VAT 7% Template", + "company": "_Test Company", + "taxes": [ + { + "tax_type": "_Test Account VAT - _TC", + "tax_rate": 7, + }, + { + "tax_type": "_Test Account Service Tax - _TC", + "tax_rate": 0, + "not_applicable": 1, + }, + ], + } + ).insert(ignore_if_duplicate=True) + + template_19pct = frappe.get_doc( + { + "doctype": "Item Tax Template", + "title": "_Test VAT 19% Template", + "company": "_Test Company", + "taxes": [ + { + "tax_type": "_Test Account VAT - _TC", + "tax_rate": 0, + "not_applicable": 1, + }, + { + "tax_type": "_Test Account Service Tax - _TC", + "tax_rate": 19, + }, + ], + } + ).insert(ignore_if_duplicate=True) + + self.doc.items[0].item_tax_template = template_7pct.name + + self.doc.append( + "items", + { + "item_code": "_Test Item 2", + "qty": 1, + "rate": 100, + "income_account": "Sales - _TC", + "expense_account": "Cost of Goods Sold - _TC", + "cost_center": "_Test Cost Center - _TC", + "item_tax_template": template_19pct.name, + }, + ) + + self.doc.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account VAT - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT 7%", + "rate": 0, + }, + ) + + self.doc.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT 19%", + "rate": 0, + }, + ) + + self.doc.save() + + # VAT 7%: Only Item 1 contributes (Item 2 has not_applicable) + self.assertEqual(self.doc.taxes[0].net_amount, 100.0) + # Service Tax 19%: Only Item 2 contributes (Item 1 has not_applicable) + self.assertEqual(self.doc.taxes[1].net_amount, 100.0) + + expected_values = [ + { + "item_row": self.doc.items[0].name, + "tax_row": self.doc.taxes[0].name, + "rate": 7.0, + "amount": 7.0, + "taxable_amount": 100.0, + }, + { + "item_row": self.doc.items[1].name, + "tax_row": self.doc.taxes[1].name, + "rate": 19.0, + "amount": 19.0, + "taxable_amount": 100.0, + }, + ] + + actual_values = [ + { + "item_row": row.item_row, + "tax_row": row.tax_row, + "rate": row.rate, + "amount": row.amount, + "taxable_amount": row.taxable_amount, + } + for row in self.doc.item_wise_tax_details + ] + + self.assertEqual(actual_values, expected_values) diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py new file mode 100644 index 00000000000..09d5231d7bc --- /dev/null +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -0,0 +1,37 @@ +import frappe + +from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite + + +class TestTaxesAndTotals(ERPNextTestSuite): + def test_disabling_rounded_total_resets_base_fields(self): + """Disabling rounded total should also clear base rounded values.""" + so = make_sales_order(do_not_save=True) + so.items[0].qty = 1 + so.items[0].rate = 1000.25 + so.items[0].price_list_rate = 1000.25 + so.items[0].discount_percentage = 0 + so.items[0].discount_amount = 0 + so.set("taxes", []) + + so.disable_rounded_total = 0 + calculate_taxes_and_totals(so) + + self.assertEqual(so.grand_total, 1000.25) + self.assertEqual(so.rounded_total, 1000.0) + self.assertEqual(so.rounding_adjustment, -0.25) + self.assertEqual(so.base_grand_total, 1000.25) + self.assertEqual(so.base_rounded_total, 1000.0) + self.assertEqual(so.base_rounding_adjustment, -0.25) + + # User toggles disable_rounded_total after values are already set. + so.disable_rounded_total = 1 + + calculate_taxes_and_totals(so) + + self.assertEqual(so.rounded_total, 0) + self.assertEqual(so.rounding_adjustment, 0) + self.assertEqual(so.base_rounded_total, 0) + self.assertEqual(so.base_rounding_adjustment, 0) diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py index bc4e2b346d4..f8e152f5299 100644 --- a/erpnext/controllers/trends.py +++ b/erpnext/controllers/trends.py @@ -4,7 +4,9 @@ import frappe from frappe import _ -from frappe.utils import getdate +from frappe.utils import DateTimeLikeObject, getdate, today + +from erpnext.accounts.utils import get_fiscal_year def get_columns(filters, trans): @@ -45,6 +47,10 @@ def get_columns(filters, trans): def validate_filters(filters): + if not filters.get("fiscal_year"): + filters["fiscal_year"] = get_fiscal_year(today())[0] + if not filters.get("company"): + filters["company"] = frappe.defaults.get_user_default("Company") for f in ["Fiscal Year", "Based On", "Period", "Company"]: if not filters.get(f.lower().replace(" ", "_")): frappe.throw(_("{0} is mandatory").format(_(f))) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index cc4a08d8b67..2fd4be3a510 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -692,3 +692,10 @@ fields_for_group_similar_items = ["qty", "amount"] # ------------ # List of apps whose translatable strings should be excluded from this app's translations. ignore_translatable_strings_from = ["frappe"] +repost_allowed_doctypes = [ + "Sales Invoice", + "Purchase Invoice", + "Journal Entry", + "Payment Entry", + "Purchase Receipt", +] diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index 06178e5e76e..bacf12f631e 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-04-12 09:47+0000\n" -"PO-Revision-Date: 2026-04-12 09:47+0000\n" +"POT-Creation-Date: 2026-04-19 09:47+0000\n" +"PO-Revision-Date: 2026-04-19 09:47+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -271,7 +271,7 @@ msgstr "" msgid "'Account' in the Accounting section of Customer {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:360 +#: erpnext/selling/doctype/sales_order/sales_order.py:361 msgid "'Allow Multiple Sales Orders Against a Customer's Purchase Order'" msgstr "" @@ -313,9 +313,9 @@ msgstr "" msgid "'Inspection Required before Purchase' has disabled for the item {0}, no need to create the QI" msgstr "" -#: erpnext/stock/report/stock_ledger/stock_ledger.py:665 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:706 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:811 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:668 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:709 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:814 msgid "'Opening'" msgstr "" @@ -826,7 +826,7 @@ msgstr "" msgid "
Posting Date {0} cannot be before Purchase Order date for the following:
Price List Rate has not been set as editable in Selling Settings. In this scenario, setting Update Price List Based On to Price List Rate will prevent auto-updation of Item Price.
Are you sure you want to continue?" msgstr "" @@ -1184,7 +1184,7 @@ msgid "Accepted Qty in Stock UOM" msgstr "" #. Label of the qty (Float) field in DocType 'Purchase Receipt Item' -#: erpnext/public/js/controllers/transaction.js:2923 +#: erpnext/public/js/controllers/transaction.js:2924 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json msgid "Accepted Quantity" msgstr "" @@ -1875,8 +1875,8 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1238 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1474 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1496 -#: erpnext/controllers/stock_controller.py:727 -#: erpnext/controllers/stock_controller.py:744 +#: erpnext/controllers/stock_controller.py:732 +#: erpnext/controllers/stock_controller.py:749 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:936 #: erpnext/stock/doctype/stock_entry/stock_entry.py:2001 #: erpnext/stock/doctype/stock_entry/stock_entry.py:2015 @@ -1961,7 +1961,7 @@ msgstr "" #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json #: erpnext/setup/doctype/supplier_group/supplier_group.json -#: erpnext/setup/install.py:369 +#: erpnext/setup/install.py:378 msgid "Accounts" msgstr "" @@ -2263,6 +2263,13 @@ msgstr "" msgid "Actions performed" msgstr "" +#. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType +#. 'Stock Settings' +#: erpnext/stock/doctype/item/item.js:413 +#: erpnext/stock/doctype/stock_settings/stock_settings.json +msgid "Activate Serial / Batch No for Item" +msgstr "" + #: erpnext/selling/page/sales_funnel/sales_funnel.py:55 msgid "Active Leads" msgstr "" @@ -2509,11 +2516,11 @@ msgstr "" msgid "Actual type tax cannot be included in Item rate in row {0}" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1021 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1023 msgid "Ad-hoc Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:601 +#: erpnext/stock/doctype/item/item.js:682 #: erpnext/stock/doctype/price_list/price_list.js:8 msgid "Add / Edit Prices" msgstr "" @@ -2547,7 +2554,7 @@ msgid "Add Employees" msgstr "" #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:256 -#: erpnext/selling/doctype/sales_order/sales_order.js:284 +#: erpnext/selling/doctype/sales_order/sales_order.js:285 #: erpnext/stock/dashboard/item_dashboard.js:216 msgid "Add Item" msgstr "" @@ -2623,7 +2630,7 @@ msgid "Add Sales Partners" msgstr "" #. Label of the add_schedule (Button) field in DocType 'Sales Order Item' -#: erpnext/selling/doctype/sales_order/sales_order.js:656 +#: erpnext/selling/doctype/sales_order/sales_order.js:657 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json msgid "Add Schedule" msgstr "" @@ -2885,7 +2892,7 @@ msgstr "" msgid "Additional Discount Amount (Company Currency)" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:837 +#: erpnext/controllers/taxes_and_totals.py:836 msgid "Additional Discount Amount ({discount_amount}) cannot exceed the total before such discount ({total_before_discount})" msgstr "" @@ -2980,7 +2987,7 @@ msgstr "" msgid "Additional Information updated successfully." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:818 +#: erpnext/manufacturing/doctype/work_order/work_order.js:829 msgid "Additional Material Transfer" msgstr "" @@ -3284,7 +3291,7 @@ msgstr "" msgid "Advance amount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:974 +#: erpnext/controllers/taxes_and_totals.py:973 msgid "Advance amount cannot be greater than {0} {1}" msgstr "" @@ -3328,6 +3335,10 @@ msgstr "" msgid "Aerospace" msgstr "" +#: erpnext/stock/doctype/stock_settings/stock_settings.js:20 +msgid "After save, please refresh the page to apply the changes." +msgstr "" + #. Label of the against (Text) field in DocType 'GL Entry' #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:20 @@ -3769,7 +3780,7 @@ msgstr "" msgid "All items have already been transferred for this Work Order." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3032 +#: erpnext/public/js/controllers/transaction.js:3033 msgid "All items in this document already have a linked Quality Inspection." msgstr "" @@ -3791,7 +3802,7 @@ msgstr "" msgid "All the items have been already returned." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1256 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1267 msgid "All the required items (raw materials) will be fetched from BOM and populated in this table. Here you can also change the Source Warehouse for any item. And during the production, you can track transferred raw materials from this table." msgstr "" @@ -4026,8 +4037,11 @@ msgstr "" msgid "Allow Negative Stock for Batch" msgstr "" +#. Label of the allow_negative_rates_for_items (Check) field in DocType 'Buying +#. Settings' #. Label of the allow_negative_rates_for_items (Check) field in DocType #. 'Selling Settings' +#: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Allow Negative rates for Items" msgstr "" @@ -4256,9 +4270,9 @@ msgstr "" msgid "Allowed Dimension" msgstr "" -#. Label of the allowed_types (Table) field in DocType 'Repost Accounting -#. Ledger Settings' -#: erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json +#. Label of the repost_allowed_types (Table) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "Allowed Doctypes" msgstr "" @@ -4534,7 +4548,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json -#: erpnext/public/js/controllers/transaction.js:510 +#: erpnext/public/js/controllers/transaction.js:512 #: erpnext/selling/doctype/quotation/quotation.js:316 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -5235,7 +5249,7 @@ msgstr "" msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "" -#: erpnext/stock/doctype/item/item.py:1006 +#: erpnext/stock/doctype/item/item.py:1019 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "" @@ -5918,7 +5932,7 @@ msgstr "" msgid "At row {0}: Batch No is mandatory for Item {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:118 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:129 msgid "At row {0}: Parent Row No cannot be set for item {1}" msgstr "" @@ -5930,11 +5944,11 @@ msgstr "" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:675 +#: erpnext/controllers/stock_controller.py:680 msgid "At row {0}: Serial and Batch Bundle {1} has already created. Please remove the values from the serial no or batch no fields." msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:112 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:123 msgid "At row {0}: set Parent Row No for item {1}" msgstr "" @@ -5994,7 +6008,7 @@ msgstr "" msgid "Attribute Value" msgstr "" -#: erpnext/stock/doctype/item/item.py:942 +#: erpnext/stock/doctype/item/item.py:955 msgid "Attribute table is mandatory" msgstr "" @@ -6002,11 +6016,11 @@ msgstr "" msgid "Attribute value: {0} must appear only once" msgstr "" -#: erpnext/stock/doctype/item/item.py:946 +#: erpnext/stock/doctype/item/item.py:959 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "" -#: erpnext/stock/doctype/item/item.py:874 +#: erpnext/stock/doctype/item/item.py:887 msgid "Attributes" msgstr "" @@ -6192,7 +6206,7 @@ msgstr "" msgid "Auto Reserve Stock for Sales Order on Purchase" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:186 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:193 msgid "Auto Tax Settings Error" msgstr "" @@ -6539,10 +6553,10 @@ msgstr "" #: erpnext/manufacturing/report/bom_stock_analysis/bom_stock_analysis.js:8 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:109 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1422 +#: erpnext/selling/doctype/sales_order/sales_order.js:1440 #: erpnext/stock/doctype/material_request/material_request.js:351 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:796 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:788 #: erpnext/stock/report/bom_search/bom_search.py:38 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:525 @@ -6556,7 +6570,7 @@ msgstr "" msgid "BOM 1" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1806 +#: erpnext/manufacturing/doctype/bom/bom.py:1801 msgid "BOM 1 {0} and BOM 2 {1} should not be same" msgstr "" @@ -6662,7 +6676,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/report/bom_variance_report/bom_variance_report.js:8 #: erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py:31 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1082 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1084 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/quality_inspection/quality_inspection.json @@ -6802,7 +6816,7 @@ msgid "BOM and Production" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:848 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:840 msgid "BOM does not contain any stock item" msgstr "" @@ -6835,15 +6849,15 @@ msgstr "" msgid "BOMs Updated" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:299 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:310 msgid "BOMs created successfully" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:309 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:320 msgid "BOMs creation failed" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:249 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:260 msgid "BOMs creation has been enqueued, kindly check the status after some time" msgstr "" @@ -6859,7 +6873,7 @@ msgstr "" #. Order Operation' #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json #: erpnext/manufacturing/doctype/job_card/job_card.json -#: erpnext/manufacturing/doctype/work_order/work_order.js:371 +#: erpnext/manufacturing/doctype/work_order/work_order.js:381 #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json msgid "Backflush Materials From WIP Warehouse" msgstr "" @@ -6943,7 +6957,7 @@ msgstr "" #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json #: erpnext/accounts/report/balance_sheet/balance_sheet.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json -#: erpnext/public/js/financial_statements.js:311 +#: erpnext/public/js/financial_statements.js:314 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/workspace_sidebar/financial_reports.json msgid "Balance Sheet" @@ -7479,7 +7493,7 @@ msgstr "" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:34 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:80 #: erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py:158 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:394 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:402 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:171 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:80 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:19 @@ -7554,7 +7568,7 @@ msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:89 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:115 -#: erpnext/public/js/controllers/transaction.js:2949 +#: erpnext/public/js/controllers/transaction.js:2950 #: erpnext/public/js/utils/barcode_scanner.js:281 #: erpnext/public/js/utils/serial_no_batch_selector.js:438 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -7649,7 +7663,7 @@ msgstr "" #. Label of the batch_size (Float) field in DocType 'Work Order Operation' #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json #: erpnext/manufacturing/doctype/operation/operation.json -#: erpnext/manufacturing/doctype/work_order/work_order.js:353 +#: erpnext/manufacturing/doctype/work_order/work_order.js:363 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json msgid "Batch Size" @@ -7753,7 +7767,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1372 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:782 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:774 #: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "" @@ -8907,7 +8921,7 @@ msgstr "" msgid "Can be approved by {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2554 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2559 msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state." msgstr "" @@ -9070,7 +9084,7 @@ msgstr "" msgid "Cannot cancel transaction for Completed Work Order." msgstr "" -#: erpnext/stock/doctype/item/item.py:894 +#: erpnext/stock/doctype/item/item.py:907 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "" @@ -9082,7 +9096,7 @@ msgstr "" msgid "Cannot change Service Stop Date for item in row {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:885 +#: erpnext/stock/doctype/item/item.py:898 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "" @@ -9114,7 +9128,7 @@ msgstr "" msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1886 +#: erpnext/selling/doctype/sales_order/sales_order.py:1917 #: erpnext/stock/doctype/pick_list/pick_list.py:255 msgid "Cannot create a pick list for Sales Order {0} because it has reserved stock. Please unreserve the stock in order to create a pick list." msgstr "" @@ -9185,8 +9199,8 @@ msgstr "" msgid "Cannot enable Item-wise Inventory Account, as there are existing Stock Ledger Entries for the company {0} with Warehouse-wise Inventory Account. Please cancel the stock transactions first and try again." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:784 -#: erpnext/selling/doctype/sales_order/sales_order.py:807 +#: erpnext/selling/doctype/sales_order/sales_order.py:785 +#: erpnext/selling/doctype/sales_order/sales_order.py:808 msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "" @@ -9214,11 +9228,11 @@ msgstr "" msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1451 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1456 msgid "Cannot produce more item for {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1455 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1460 msgid "Cannot produce more than {0} items for {1}" msgstr "" @@ -9302,7 +9316,7 @@ msgstr "" #. Label of the capacity_per_day (Int) field in DocType 'Item Lead Time' #. Label of the capacity (Float) field in DocType 'Putaway Rule' -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:963 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:965 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json #: erpnext/stock/doctype/putaway_rule/putaway_rule.json msgid "Capacity" @@ -9445,7 +9459,7 @@ msgstr "" msgid "Cash Flow" msgstr "" -#: erpnext/public/js/financial_statements.js:343 +#: erpnext/public/js/financial_statements.js:346 msgid "Cash Flow Statement" msgstr "" @@ -9683,7 +9697,7 @@ msgstr "" msgid "Changes in {0}" msgstr "" -#: erpnext/stock/doctype/item/item.js:355 +#: erpnext/stock/doctype/item/item.js:379 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "" @@ -9884,7 +9898,7 @@ msgstr "" #. Label of the reference_date (Date) field in DocType 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json -#: erpnext/public/js/controllers/transaction.js:2860 +#: erpnext/public/js/controllers/transaction.js:2861 msgid "Cheque/Reference Date" msgstr "" @@ -9938,7 +9952,7 @@ msgstr "" #. Label of the child_row_reference (Data) field in DocType 'Quality #. Inspection' -#: erpnext/public/js/controllers/transaction.js:2955 +#: erpnext/public/js/controllers/transaction.js:2956 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Child Row Reference" msgstr "" @@ -10110,11 +10124,11 @@ msgstr "" msgid "Closed Documents" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2477 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2482 msgid "Closed Work Order can not be stopped or Re-opened" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:538 +#: erpnext/selling/doctype/sales_order/sales_order.py:539 msgid "Closed order cannot be cancelled. Unclose to cancel." msgstr "" @@ -10357,7 +10371,7 @@ msgstr "" msgid "Communication Medium Type" msgstr "" -#: erpnext/setup/install.py:98 +#: erpnext/setup/install.py:106 msgid "Compact Item Print" msgstr "" @@ -10702,7 +10716,7 @@ msgstr "" #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/project_summary/project_summary.js:8 #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:44 -#: erpnext/public/js/financial_statements.js:365 +#: erpnext/public/js/financial_statements.js:368 #: erpnext/public/js/purchase_trends_filters.js:8 #: erpnext/public/js/sales_trends_filters.js:51 #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json @@ -10748,8 +10762,8 @@ msgstr "" #: erpnext/setup/doctype/employee/employee_tree.js:8 #: erpnext/setup/doctype/employee_external_work_history/employee_external_work_history.json #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json -#: erpnext/setup/doctype/vehicle/vehicle.json erpnext/setup/install.py:157 -#: erpnext/setup/install.py:166 erpnext/setup/workspace/home/home.json +#: erpnext/setup/doctype/vehicle/vehicle.json erpnext/setup/install.py:165 +#: erpnext/setup/install.py:174 erpnext/setup/workspace/home/home.json #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json @@ -10802,7 +10816,7 @@ msgstr "" #: erpnext/stock/report/stock_balance/stock_balance.js:8 #: erpnext/stock/report/stock_balance/stock_balance.py:579 #: erpnext/stock/report/stock_ledger/stock_ledger.js:8 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:422 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:425 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:18 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:8 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.js:8 @@ -10887,6 +10901,10 @@ msgstr "" msgid "Company Address Name" msgstr "" +#: erpnext/controllers/accounts_controller.py:4364 +msgid "Company Address is missing. You don't have permission to create an Address. Please contact your System Manager." +msgstr "" + #: erpnext/controllers/accounts_controller.py:4352 msgid "Company Address is missing. You don't have permission to update it. Please contact your System Manager." msgstr "" @@ -10957,7 +10975,7 @@ msgid "Company Field" msgstr "" #. Label of the company_logo (Attach Image) field in DocType 'Company' -#: erpnext/public/js/print.js:77 erpnext/setup/doctype/company/company.json +#: erpnext/public/js/print.js:80 erpnext/setup/doctype/company/company.json msgid "Company Logo" msgstr "" @@ -10991,7 +11009,7 @@ msgid "Company currencies of both the companies should match for Inter Company T msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:842 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:834 msgid "Company field is required" msgstr "" @@ -11053,7 +11071,7 @@ msgid "Company {0} added multiple times" msgstr "" #: erpnext/accounts/doctype/account/account.py:509 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1307 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1309 msgid "Company {0} does not exist" msgstr "" @@ -11061,6 +11079,10 @@ msgstr "" msgid "Company {0} is added more than once" msgstr "" +#: erpnext/regional/doctype/south_africa_vat_settings/south_africa_vat_settings.py:33 +msgid "Company {0} is not in South Africa." +msgstr "" + #: erpnext/setup/setup_wizard/operations/taxes_setup.py:14 msgid "Company {} does not exist yet. Taxes setup aborted." msgstr "" @@ -11138,7 +11160,7 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1369 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1374 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" @@ -11289,7 +11311,7 @@ msgstr "" msgid "Consider Minimum Order Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1078 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1089 msgid "Consider Process Loss" msgstr "" @@ -11480,7 +11502,7 @@ msgstr "" msgid "Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1745 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1750 msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}" msgstr "" @@ -11813,7 +11835,7 @@ msgstr "" #. Label of the conversion_rate (Float) field in DocType 'BOM Creator' #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:86 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:93 #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json msgid "Conversion Rate" msgstr "" @@ -12093,7 +12115,7 @@ msgstr "" #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json #: erpnext/buying/report/procurement_tracker/procurement_tracker.js:15 #: erpnext/buying/report/procurement_tracker/procurement_tracker.py:32 -#: erpnext/public/js/financial_statements.js:458 +#: erpnext/public/js/financial_statements.js:461 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -12543,7 +12565,7 @@ msgstr "" msgid "Create Missing Party" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:164 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:196 msgid "Create Multi-level BOM" msgstr "" @@ -12588,11 +12610,11 @@ msgstr "" msgid "Create Payment Entry for Consolidated POS Invoices." msgstr "" -#: erpnext/public/js/controllers/transaction.js:517 +#: erpnext/public/js/controllers/transaction.js:519 msgid "Create Payment Request" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:800 +#: erpnext/manufacturing/doctype/work_order/work_order.js:811 msgid "Create Pick List" msgstr "" @@ -12619,7 +12641,7 @@ msgstr "" #. Title of an Onboarding Step #. Label of an action in the Onboarding Step 'Create Purchase Order' #: erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1675 +#: erpnext/selling/doctype/sales_order/sales_order.js:1693 #: erpnext/utilities/activation.py:106 msgid "Create Purchase Order" msgstr "" @@ -12775,12 +12797,12 @@ msgstr "" msgid "Create Users" msgstr "" -#: erpnext/stock/doctype/item/item.js:897 +#: erpnext/stock/doctype/item/item.js:978 msgid "Create Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:711 -#: erpnext/stock/doctype/item/item.js:755 +#: erpnext/stock/doctype/item/item.js:792 +#: erpnext/stock/doctype/item/item.js:836 msgid "Create Variants" msgstr "" @@ -12799,12 +12821,12 @@ msgstr "" msgid "Create Workstation" msgstr "" -#: erpnext/stock/doctype/item/item.js:738 -#: erpnext/stock/doctype/item/item.js:890 +#: erpnext/stock/doctype/item/item.js:819 +#: erpnext/stock/doctype/item/item.js:971 msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2058 +#: erpnext/stock/stock_ledger.py:2068 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -12852,11 +12874,11 @@ msgstr "" msgid "Creating Accounts..." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1550 +#: erpnext/selling/doctype/sales_order/sales_order.js:1568 msgid "Creating Delivery Note ..." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:684 +#: erpnext/selling/doctype/sales_order/sales_order.js:685 msgid "Creating Delivery Schedule..." msgstr "" @@ -12876,7 +12898,7 @@ msgstr "" msgid "Creating Purchase Invoices ..." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1699 +#: erpnext/selling/doctype/sales_order/sales_order.js:1717 msgid "Creating Purchase Order ..." msgstr "" @@ -12895,7 +12917,7 @@ msgstr "" msgid "Creating Stock Entry" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1820 +#: erpnext/selling/doctype/sales_order/sales_order.js:1838 msgid "Creating Subcontracting Inward Order ..." msgstr "" @@ -13203,7 +13225,7 @@ msgstr "" msgid "Criteria weights must add up to 100%" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:173 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:180 msgid "Cron Interval should be between 1 and 59 Min" msgstr "" @@ -13637,7 +13659,7 @@ msgstr "" #: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/installation_note/installation_note.json #: erpnext/selling/doctype/party_specific_item/party_specific_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1190 +#: erpnext/selling/doctype/sales_order/sales_order.js:1199 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/sales_order/sales_order_calendar.js:19 #: erpnext/selling/doctype/sms_center/sms_center.json @@ -14155,7 +14177,7 @@ msgid "Customer required for 'Customerwise Discount'" msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1140 -#: erpnext/selling/doctype/sales_order/sales_order.py:434 +#: erpnext/selling/doctype/sales_order/sales_order.py:435 #: erpnext/stock/doctype/delivery_note/delivery_note.py:436 msgid "Customer {0} does not belong to project {1}" msgstr "" @@ -14776,7 +14798,7 @@ msgstr "" msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2245 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2250 msgid "Default BOM for {0} not found" msgstr "" @@ -14784,7 +14806,7 @@ msgstr "" msgid "Default BOM not found for FG Item {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2242 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2247 msgid "Default BOM not found for Item {0} and Project {1}" msgstr "" @@ -15129,15 +15151,15 @@ msgstr "" msgid "Default Unit of Measure" msgstr "" -#: erpnext/stock/doctype/item/item.py:1289 +#: erpnext/stock/doctype/item/item.py:1302 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "" -#: erpnext/stock/doctype/item/item.py:1272 +#: erpnext/stock/doctype/item/item.py:1285 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "" -#: erpnext/stock/doctype/item/item.py:920 +#: erpnext/stock/doctype/item/item.py:933 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "" @@ -15508,11 +15530,11 @@ msgstr "" #. Label of the delivery_date (Date) field in DocType 'Sales Order Item' #: erpnext/manufacturing/doctype/master_production_schedule_item/master_production_schedule_item.json #: erpnext/manufacturing/doctype/sales_forecast_item/sales_forecast_item.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1067 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1069 #: erpnext/public/js/utils.js:895 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:631 -#: erpnext/selling/doctype/sales_order/sales_order.js:1497 +#: erpnext/selling/doctype/sales_order/sales_order.js:632 +#: erpnext/selling/doctype/sales_order/sales_order.js:1515 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/report/sales_order_analysis/sales_order_analysis.py:321 @@ -15559,7 +15581,7 @@ msgstr "" #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:21 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:291 #: erpnext/accounts/report/sales_register/sales_register.py:245 -#: erpnext/selling/doctype/sales_order/sales_order.js:1049 +#: erpnext/selling/doctype/sales_order/sales_order.js:1050 #: erpnext/selling/doctype/sales_order/sales_order_list.js:81 #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -15629,8 +15651,8 @@ msgstr "" msgid "Delivery Notes {0} updated" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:626 -#: erpnext/selling/doctype/sales_order/sales_order.js:653 +#: erpnext/selling/doctype/sales_order/sales_order.js:627 +#: erpnext/selling/doctype/sales_order/sales_order.js:654 msgid "Delivery Schedule" msgstr "" @@ -15702,7 +15724,7 @@ msgstr "" msgid "Delivery to" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:453 +#: erpnext/selling/doctype/sales_order/sales_order.py:454 msgid "Delivery warehouse required for stock item {0}" msgstr "" @@ -15710,19 +15732,19 @@ msgstr "" #. DocType 'Master Production Schedule' #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py:233 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:311 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:376 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:313 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:378 msgid "Demand" msgstr "" #. Label of the demand_qty (Float) field in DocType 'Sales Forecast Item' #: erpnext/manufacturing/doctype/sales_forecast_item/sales_forecast_item.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1015 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1017 msgid "Demand Qty" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:323 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:388 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:325 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:390 msgid "Demand vs Supply" msgstr "" @@ -16276,7 +16298,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#: erpnext/manufacturing/doctype/work_order/work_order.js:1056 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1067 #: erpnext/stock/doctype/stock_entry/stock_entry.js:370 #: erpnext/stock/doctype/stock_entry/stock_entry.js:413 #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -16292,7 +16314,7 @@ msgstr "" msgid "Disassemble Qty cannot be less than or equal to 0." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:447 +#: erpnext/manufacturing/doctype/work_order/work_order.js:458 msgid "Disassemble Qty cannot be less than or equal to 0." msgstr "" @@ -16829,11 +16851,11 @@ msgstr "" msgid "Do you really want to restore this scrapped asset?" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:15 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:23 msgid "Do you still want to enable immutable ledger?" msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.js:44 +#: erpnext/stock/doctype/stock_settings/stock_settings.js:50 msgid "Do you still want to enable negative inventory?" msgstr "" @@ -16911,7 +16933,7 @@ msgstr "" msgid "Documents Processed on each trigger. Queue Size should be between 5 and 100" msgstr "" -#: erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py:262 +#: erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py:261 msgid "Documents: {0} have deferred revenue/expense enabled for them. Cannot repost." msgstr "" @@ -17167,7 +17189,7 @@ msgstr "" msgid "Duplicate Item Group" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:100 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:102 msgid "Duplicate Item Under Same Parent" msgstr "" @@ -17786,7 +17808,7 @@ msgstr "" msgid "Enable Auto Email" msgstr "" -#: erpnext/stock/doctype/item/item.py:1081 +#: erpnext/stock/doctype/item/item.py:1094 msgid "Enable Auto Re-Order" msgstr "" @@ -17904,10 +17926,8 @@ msgstr "" msgid "Enable Separate Reposting for GL" msgstr "" -#. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType -#. 'Stock Settings' -#: erpnext/stock/doctype/stock_settings/stock_settings.json -msgid "Enable Serial / Batch No for Item" +#: erpnext/stock/report/stock_ledger/stock_ledger.js:122 +msgid "Enable Serial / Batch Bundle" msgstr "" #. Label of the enable_stock_reservation (Check) field in DocType 'Stock @@ -18012,7 +18032,7 @@ msgstr "" msgid "Enabling this will allow creation of multi-currency invoices against single party account in company currency" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:11 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:19 msgid "Enabling this will change the way how cancelled transactions are handled." msgstr "" @@ -18046,7 +18066,7 @@ msgstr "" #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:64 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:25 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:89 -#: erpnext/public/js/financial_statements.js:427 +#: erpnext/public/js/financial_statements.js:430 msgid "End Year" msgstr "" @@ -18099,7 +18119,7 @@ msgstr "" msgid "Enter API key in Google Settings." msgstr "" -#: erpnext/public/js/print.js:64 +#: erpnext/public/js/print.js:67 msgid "Enter Company Details" msgstr "" @@ -18141,7 +18161,7 @@ msgstr "" msgid "Enter amount to be redeemed." msgstr "" -#: erpnext/stock/doctype/item/item.js:1059 +#: erpnext/stock/doctype/item/item.js:1140 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "" @@ -18188,7 +18208,7 @@ msgstr "" msgid "Enter the name of the bank or lending institution before submitting." msgstr "" -#: erpnext/stock/doctype/item/item.js:1085 +#: erpnext/stock/doctype/item/item.js:1166 msgid "Enter the opening stock units." msgstr "" @@ -18196,7 +18216,7 @@ msgstr "" msgid "Enter the quantity of the Item that will be manufactured from this Bill of Materials." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1218 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1229 msgid "Enter the quantity to manufacture. Raw material Items will be fetched only when this is set." msgstr "" @@ -18342,7 +18362,7 @@ msgstr "" msgid "Example URL" msgstr "" -#: erpnext/stock/doctype/item/item.py:1012 +#: erpnext/stock/doctype/item/item.py:1025 msgid "Example of a linked document: {0}" msgstr "" @@ -18358,7 +18378,7 @@ msgstr "" msgid "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings." msgstr "" -#: erpnext/stock/stock_ledger.py:2321 +#: erpnext/stock/stock_ledger.py:2331 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -18517,7 +18537,7 @@ msgstr "" msgid "Excise Entry" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1501 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1493 msgid "Excise Invoice" msgstr "" @@ -18636,7 +18656,7 @@ msgstr "" msgid "Expected Delivery Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:415 +#: erpnext/selling/doctype/sales_order/sales_order.py:416 msgid "Expected Delivery Date should be after Sales Order Date" msgstr "" @@ -18718,7 +18738,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/controllers/stock_controller.py:941 +#: erpnext/controllers/stock_controller.py:946 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -18766,7 +18786,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/controllers/stock_controller.py:921 +#: erpnext/controllers/stock_controller.py:926 msgid "Expense Account Missing" msgstr "" @@ -19007,7 +19027,7 @@ msgstr "" msgid "Failed to setup defaults" msgstr "" -#: erpnext/setup/doctype/company/company.py:871 +#: erpnext/setup/doctype/company/company.py:856 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "" @@ -19113,7 +19133,7 @@ msgid "Fetch Value From" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:819 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:811 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "" @@ -19134,7 +19154,7 @@ msgid "Fetching Sales Orders..." msgstr "" #: erpnext/accounts/doctype/dunning/dunning.js:135 -#: erpnext/public/js/controllers/transaction.js:1597 +#: erpnext/public/js/controllers/transaction.js:1598 msgid "Fetching exchange rates ..." msgstr "" @@ -19183,7 +19203,7 @@ msgstr "" #: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.js:16 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:16 -#: erpnext/public/js/financial_statements.js:379 +#: erpnext/public/js/financial_statements.js:382 msgid "Filter Based On" msgstr "" @@ -19289,7 +19309,7 @@ msgstr "" #: erpnext/assets/doctype/asset_shift_allocation/asset_shift_allocation.json #: 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/public/js/financial_statements.js:376 #: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "" @@ -19360,7 +19380,7 @@ msgstr "" #. Label of a Card Break in the Financial Reports Workspace #: erpnext/accounts/workspace/financial_reports/financial_reports.json -#: erpnext/public/js/financial_statements.js:309 +#: erpnext/public/js/financial_statements.js:312 msgid "Financial Statements" msgstr "" @@ -19374,9 +19394,9 @@ msgstr "" msgid "Financial reports will be generated using GL Entry doctypes (should be enabled if Period Closing Voucher is not posted for all years sequentially or missing) " msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:884 -#: erpnext/manufacturing/doctype/work_order/work_order.js:899 -#: erpnext/manufacturing/doctype/work_order/work_order.js:908 +#: erpnext/manufacturing/doctype/work_order/work_order.js:895 +#: erpnext/manufacturing/doctype/work_order/work_order.js:910 +#: erpnext/manufacturing/doctype/work_order/work_order.js:919 msgid "Finish" msgstr "" @@ -19392,7 +19412,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py:43 #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py:147 -#: erpnext/selling/doctype/sales_order/sales_order.js:831 +#: erpnext/selling/doctype/sales_order/sales_order.js:832 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json msgid "Finished Good" @@ -19486,6 +19506,7 @@ msgstr "" msgid "Finished Good {0} must be a sub-contracted item." msgstr "" +#: erpnext/selling/doctype/sales_order/sales_order.js:1419 #: erpnext/setup/doctype/company/company.py:386 msgid "Finished Goods" msgstr "" @@ -19531,7 +19552,7 @@ msgstr "" msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:584 +#: erpnext/selling/doctype/sales_order/sales_order.js:585 msgid "First Delivery Date" msgstr "" @@ -19832,7 +19853,7 @@ msgstr "" msgid "For Item" msgstr "" -#: erpnext/controllers/stock_controller.py:1600 +#: erpnext/controllers/stock_controller.py:1605 msgid "For Item {0} cannot be received more than {1} qty against the {2} {3}" msgstr "" @@ -19891,7 +19912,7 @@ msgstr "" #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan/production_plan.js:471 #: erpnext/manufacturing/doctype/production_plan/production_plan.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1414 +#: erpnext/selling/doctype/sales_order/sales_order.js:1432 #: erpnext/stock/doctype/material_request/material_request.js:361 #: erpnext/templates/form_grid/material_request_grid.html:36 msgid "For Warehouse" @@ -19901,11 +19922,11 @@ msgstr "" msgid "For Work Order" msgstr "" -#: erpnext/controllers/status_updater.py:282 +#: erpnext/controllers/status_updater.py:288 msgid "For an item {0}, quantity must be negative number" msgstr "" -#: erpnext/controllers/status_updater.py:279 +#: erpnext/controllers/status_updater.py:285 msgid "For an item {0}, quantity must be positive number" msgstr "" @@ -19935,7 +19956,7 @@ msgstr "" msgid "For item {0}, only {1} asset have been created or linked to {2}. Please create or link {3} more asset with the respective document." msgstr "" -#: erpnext/controllers/status_updater.py:287 +#: erpnext/controllers/status_updater.py:298 msgid "For item {0}, rate must be a positive number. To Allow negative rates, enable {1} in {2}" msgstr "" @@ -19943,7 +19964,7 @@ msgstr "" msgid "For operation {0} at row {1}, please add raw materials or set a BOM against it." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2624 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2629 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})" msgstr "" @@ -19997,12 +20018,12 @@ msgstr "" msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." msgstr "" -#: erpnext/public/js/controllers/transaction.js:1407 +#: erpnext/public/js/controllers/transaction.js:1408 msgctxt "Clear payment terms template and/or payment schedule when due date is changed" msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "" -#: erpnext/controllers/stock_controller.py:442 +#: erpnext/controllers/stock_controller.py:447 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" @@ -20074,7 +20095,7 @@ msgstr "" msgid "Forum URL" msgstr "" -#: erpnext/setup/install.py:201 +#: erpnext/setup/install.py:209 msgid "Frappe School" msgstr "" @@ -20844,7 +20865,7 @@ msgstr "" msgid "Get Customer Group Details" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:615 +#: erpnext/selling/doctype/sales_order/sales_order.js:616 msgid "Get Delivery Schedule" msgstr "" @@ -20900,8 +20921,8 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/public/js/controllers/buying.js:327 #: erpnext/selling/doctype/quotation/quotation.js:183 -#: erpnext/selling/doctype/sales_order/sales_order.js:210 -#: erpnext/selling/doctype/sales_order/sales_order.js:1207 +#: erpnext/selling/doctype/sales_order/sales_order.js:211 +#: erpnext/selling/doctype/sales_order/sales_order.js:1216 #: erpnext/stock/doctype/delivery_note/delivery_note.js:187 #: erpnext/stock/doctype/delivery_note/delivery_note.js:239 #: erpnext/stock/doctype/material_request/material_request.js:141 @@ -20912,7 +20933,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.js:486 #: erpnext/stock/doctype/stock_entry/stock_entry.js:519 #: erpnext/stock/doctype/stock_entry/stock_entry.js:610 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:786 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:778 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "" @@ -20928,8 +20949,8 @@ msgid "Get Items for Purchase Only" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:822 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:835 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:814 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:827 msgid "Get Items from BOM" msgstr "" @@ -21497,7 +21518,7 @@ msgstr "" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.js:64 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:77 #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.js:59 -#: erpnext/public/js/financial_statements.js:440 +#: erpnext/public/js/financial_statements.js:443 #: erpnext/public/js/purchase_trends_filters.js:21 #: erpnext/public/js/sales_trends_filters.js:13 #: erpnext/selling/report/sales_partner_target_variance_based_on_item_group/sales_partner_target_variance_based_on_item_group.js:34 @@ -21706,7 +21727,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:2043 +#: erpnext/stock/stock_ledger.py:2053 msgid "Here are the options to proceed:" msgstr "" @@ -21801,7 +21822,7 @@ msgid "History In Company" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.js:338 -#: erpnext/selling/doctype/sales_order/sales_order.js:996 +#: erpnext/selling/doctype/sales_order/sales_order.js:997 msgid "Hold" msgstr "" @@ -22291,7 +22312,7 @@ msgstr "" msgid "If no taxes are set, and Taxes and Charges Template is selected, the system will automatically apply the taxes from the chosen template." msgstr "" -#: erpnext/stock/stock_ledger.py:2053 +#: erpnext/stock/stock_ledger.py:2063 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -22319,7 +22340,7 @@ msgstr "" msgid "If set, the system does not use the user's Email or the standard outgoing Email account for sending request for quotations." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1251 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1262 msgid "If the BOM results in Scrap material, the Scrap Warehouse needs to be selected." msgstr "" @@ -22328,7 +22349,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:2046 +#: erpnext/stock/stock_ledger.py:2056 msgid "If the item is transacting as a Zero Valuation Rate item in this entry, please enable 'Allow Zero Valuation Rate' in the {0} Item table." msgstr "" @@ -22338,7 +22359,7 @@ msgstr "" msgid "If the reorder check is set at the Group warehouse level, the available quantity becomes the sum of the projected quantities of all its child warehouses." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1270 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1281 msgid "If the selected BOM has Operations mentioned in it, the system will fetch all Operations from BOM, these values can be changed." msgstr "" @@ -22415,7 +22436,7 @@ msgstr "" msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "" -#: erpnext/stock/doctype/item/item.js:1071 +#: erpnext/stock/doctype/item/item.js:1152 msgid "If you are maintaining stock of this Item in your Inventory, ERPNext will make a stock ledger entry for each transaction of this item." msgstr "" @@ -22505,7 +22526,7 @@ msgstr "" msgid "Ignore Exchange Rate Revaluation and Gain / Loss Journals" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1397 +#: erpnext/selling/doctype/sales_order/sales_order.js:1414 msgid "Ignore Existing Ordered Qty" msgstr "" @@ -22848,7 +22869,7 @@ msgstr "" msgid "In the case of multi-tier program, Customers will be auto assigned to the concerned tier as per their spent" msgstr "" -#: erpnext/stock/doctype/item/item.js:1104 +#: erpnext/stock/doctype/item/item.js:1185 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "" @@ -22960,7 +22981,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1393 +#: erpnext/selling/doctype/sales_order/sales_order.js:1410 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json @@ -23156,7 +23177,7 @@ msgstr "" msgid "Incoming call from {0}" msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.js:68 +#: erpnext/stock/doctype/stock_settings/stock_settings.js:74 msgid "Incompatible Setting Detected" msgstr "" @@ -23383,14 +23404,14 @@ msgstr "" msgid "Inspected By" msgstr "" -#: erpnext/controllers/stock_controller.py:1494 +#: erpnext/controllers/stock_controller.py:1499 #: erpnext/manufacturing/doctype/job_card/job_card.py:832 msgid "Inspection Rejected" msgstr "" #. Label of the inspection_required (Check) field in DocType 'Stock Entry' -#: erpnext/controllers/stock_controller.py:1464 -#: erpnext/controllers/stock_controller.py:1466 +#: erpnext/controllers/stock_controller.py:1469 +#: erpnext/controllers/stock_controller.py:1471 #: erpnext/stock/doctype/stock_entry/stock_entry.json msgid "Inspection Required" msgstr "" @@ -23407,7 +23428,7 @@ msgstr "" msgid "Inspection Required before Purchase" msgstr "" -#: erpnext/controllers/stock_controller.py:1479 +#: erpnext/controllers/stock_controller.py:1484 #: erpnext/manufacturing/doctype/job_card/job_card.py:813 msgid "Inspection Submission" msgstr "" @@ -23479,6 +23500,9 @@ msgstr "" #: erpnext/controllers/accounts_controller.py:3850 #: erpnext/controllers/accounts_controller.py:3874 +#: erpnext/controllers/accounts_controller.py:4394 +#: erpnext/controllers/accounts_controller.py:4400 +#: erpnext/controllers/accounts_controller.py:4422 msgid "Insufficient Permissions" msgstr "" @@ -23487,12 +23511,12 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:163 #: erpnext/stock/doctype/pick_list/pick_list.py:1088 #: erpnext/stock/doctype/stock_entry/stock_entry.py:1048 -#: erpnext/stock/serial_batch_bundle.py:1205 erpnext/stock/stock_ledger.py:1734 -#: erpnext/stock/stock_ledger.py:2212 +#: erpnext/stock/serial_batch_bundle.py:1205 erpnext/stock/stock_ledger.py:1744 +#: erpnext/stock/stock_ledger.py:2222 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2227 +#: erpnext/stock/stock_ledger.py:2237 msgid "Insufficient Stock for Batch" msgstr "" @@ -23585,7 +23609,7 @@ msgstr "" msgid "Inter Company Order Reference" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1144 +#: erpnext/selling/doctype/sales_order/sales_order.js:1153 msgid "Inter Company Purchase Order" msgstr "" @@ -23651,7 +23675,7 @@ msgstr "" msgid "Internal Customer for company {0} already exists" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1143 +#: erpnext/selling/doctype/sales_order/sales_order.js:1152 msgid "Internal Purchase Order" msgstr "" @@ -23707,7 +23731,7 @@ msgstr "" msgid "Internal Work History" msgstr "" -#: erpnext/controllers/stock_controller.py:1561 +#: erpnext/controllers/stock_controller.py:1566 msgid "Internal transfers can only be done in company's default currency" msgstr "" @@ -23757,7 +23781,7 @@ msgstr "" msgid "Invalid Barcode. There is no Item attached to this barcode." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3216 +#: erpnext/public/js/controllers/transaction.js:3217 msgid "Invalid Blanket Order for the selected Customer and Item" msgstr "" @@ -23787,7 +23811,7 @@ msgstr "" msgid "Invalid Customer Group" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:417 +#: erpnext/selling/doctype/sales_order/sales_order.py:418 msgid "Invalid Delivery Date" msgstr "" @@ -23795,7 +23819,7 @@ msgstr "" msgid "Invalid Discount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:844 +#: erpnext/controllers/taxes_and_totals.py:843 msgid "Invalid Discount Amount" msgstr "" @@ -23821,7 +23845,7 @@ msgstr "" msgid "Invalid Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1427 +#: erpnext/stock/doctype/item/item.py:1440 msgid "Invalid Item Defaults" msgstr "" @@ -23986,7 +24010,7 @@ msgid "Invalid {0}: {1}" msgstr "" #. Label of the inventory_section (Tab Break) field in DocType 'Item' -#: erpnext/setup/install.py:359 erpnext/stock/doctype/item/item.json +#: erpnext/setup/install.py:368 erpnext/stock/doctype/item/item.json msgid "Inventory" msgstr "" @@ -24596,11 +24620,14 @@ msgstr "" #. Label of the is_phantom_bom (Check) field in DocType 'BOM' #: erpnext/manufacturing/doctype/bom/bom.json +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:68 msgid "Is Phantom BOM" msgstr "" +#. Label of the is_phantom (Check) field in DocType 'BOM Creator' #. Label of the is_phantom_item (Check) field in DocType 'BOM Creator Item' #. Label of the is_phantom_item (Check) field in DocType 'BOM Item' +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:68 @@ -24886,7 +24913,7 @@ msgstr "" msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "" -#: erpnext/public/js/controllers/transaction.js:2617 +#: erpnext/public/js/controllers/transaction.js:2618 msgid "It is needed to fetch Item Details." msgstr "" @@ -24945,7 +24972,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:33 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:204 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/taxes_and_totals.py:1253 +#: erpnext/controllers/taxes_and_totals.py:1252 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/manufacturing/doctype/bom/bom.js:1085 #: erpnext/manufacturing/doctype/bom/bom.json @@ -24966,7 +24993,7 @@ msgstr "" #: erpnext/public/js/stock_analytics.js:92 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/doctype/product_bundle_item/product_bundle_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1638 +#: erpnext/selling/doctype/sales_order/sales_order.js:1656 #: erpnext/selling/page/point_of_sale/pos_item_cart.js:50 #: erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.js:14 #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js:36 @@ -25241,14 +25268,14 @@ msgstr "" #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.js:75 #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.py:166 #: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.js:30 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:951 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:987 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:953 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:989 #: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:364 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.js:27 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:119 #: erpnext/projects/doctype/timesheet/timesheet.js:214 -#: erpnext/public/js/controllers/transaction.js:2911 +#: erpnext/public/js/controllers/transaction.js:2912 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:579 #: erpnext/public/js/utils.js:736 @@ -25257,10 +25284,10 @@ msgstr "" #: erpnext/selling/doctype/installation_note_item/installation_note_item.json #: erpnext/selling/doctype/quotation/quotation.js:298 #: erpnext/selling/doctype/quotation_item/quotation_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:375 -#: erpnext/selling/doctype/sales_order/sales_order.js:483 -#: erpnext/selling/doctype/sales_order/sales_order.js:1252 -#: erpnext/selling/doctype/sales_order/sales_order.js:1407 +#: erpnext/selling/doctype/sales_order/sales_order.js:376 +#: erpnext/selling/doctype/sales_order/sales_order.js:484 +#: erpnext/selling/doctype/sales_order/sales_order.js:1261 +#: erpnext/selling/doctype/sales_order/sales_order.js:1425 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py:29 #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py:27 @@ -25588,6 +25615,7 @@ msgstr "" #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/doctype/packing_slip/packing_slip.json #: erpnext/stock/doctype/serial_no/serial_no.json +#: erpnext/stock/doctype/uom_category/uom_category.json #: erpnext/stock/doctype/warehouse/warehouse.json #: erpnext/stock/doctype/warehouse_type/warehouse_type.json msgid "Item Manager" @@ -25723,16 +25751,16 @@ msgstr "" #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:109 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:106 #: erpnext/manufacturing/report/job_card_summary/job_card_summary.py:158 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:958 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:994 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:960 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:996 #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py:153 #: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:371 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:92 #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:138 -#: erpnext/public/js/controllers/transaction.js:2917 +#: erpnext/public/js/controllers/transaction.js:2918 #: erpnext/public/js/utils.js:831 #: erpnext/selling/doctype/quotation_item/quotation_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1259 +#: erpnext/selling/doctype/sales_order/sales_order.js:1268 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py:35 #: erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.py:33 @@ -26023,7 +26051,7 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:169 +#: erpnext/stock/doctype/item/item.js:193 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -26031,11 +26059,11 @@ msgstr "" msgid "Item Variant Settings" msgstr "" -#: erpnext/stock/doctype/item/item.js:920 +#: erpnext/stock/doctype/item/item.js:1001 msgid "Item Variant {0} already exists with same attributes" msgstr "" -#: erpnext/stock/doctype/item/item.py:790 +#: erpnext/stock/doctype/item/item.py:803 msgid "Item Variants updated" msgstr "" @@ -26131,7 +26159,7 @@ msgstr "" msgid "Item for row {0} does not match Material Request" msgstr "" -#: erpnext/stock/doctype/item/item.py:807 +#: erpnext/stock/doctype/item/item.py:820 msgid "Item has variants." msgstr "" @@ -26148,7 +26176,7 @@ msgid "Item must be added using 'Get Items from Purchase Receipts' button" msgstr "" #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py:42 -#: erpnext/selling/doctype/sales_order/sales_order.js:1645 +#: erpnext/selling/doctype/sales_order/sales_order.js:1663 msgid "Item name" msgstr "" @@ -26183,15 +26211,15 @@ msgstr "" msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "" -#: erpnext/stock/doctype/item/item.py:964 +#: erpnext/stock/doctype/item/item.py:977 msgid "Item variant {0} exists with same attributes" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:97 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:99 msgid "Item {0} added multiple times under the same parent item {1} at rows {2} and {3}" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:108 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:119 msgid "Item {0} cannot be added as a sub-assembly of itself" msgstr "" @@ -26208,7 +26236,7 @@ msgstr "" msgid "Item {0} does not exist in the system or has expired" msgstr "" -#: erpnext/controllers/stock_controller.py:556 +#: erpnext/controllers/stock_controller.py:561 msgid "Item {0} does not exist." msgstr "" @@ -26224,11 +26252,11 @@ msgstr "" msgid "Item {0} has been disabled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:791 +#: erpnext/selling/doctype/sales_order/sales_order.py:792 msgid "Item {0} has no Serial No. Only serialized items can have delivery based on Serial No" msgstr "" -#: erpnext/stock/doctype/item/item.py:1143 +#: erpnext/stock/doctype/item/item.py:1156 msgid "Item {0} has reached its end of life on {1}" msgstr "" @@ -26240,11 +26268,11 @@ msgstr "" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1163 +#: erpnext/stock/doctype/item/item.py:1176 msgid "Item {0} is cancelled" msgstr "" -#: erpnext/stock/doctype/item/item.py:1147 +#: erpnext/stock/doctype/item/item.py:1160 msgid "Item {0} is disabled" msgstr "" @@ -26252,7 +26280,7 @@ msgstr "" msgid "Item {0} is not a serialized Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1155 +#: erpnext/stock/doctype/item/item.py:1168 msgid "Item {0} is not a stock Item" msgstr "" @@ -26367,7 +26395,7 @@ msgid "Items Filter" msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.py:1683 -#: erpnext/selling/doctype/sales_order/sales_order.js:1683 +#: erpnext/selling/doctype/sales_order/sales_order.js:1701 msgid "Items Required" msgstr "" @@ -26398,7 +26426,7 @@ msgstr "" msgid "Items cannot be updated as Subcontracting Order is created against the Purchase Order {0}." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1443 +#: erpnext/selling/doctype/sales_order/sales_order.js:1461 msgid "Items for Raw Material Request" msgstr "" @@ -26426,7 +26454,7 @@ msgid "Items to Order and Receive" msgstr "" #: erpnext/public/js/stock_reservation.js:72 -#: erpnext/selling/doctype/sales_order/sales_order.js:334 +#: erpnext/selling/doctype/sales_order/sales_order.js:335 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:226 msgid "Items to Reserve" msgstr "" @@ -26436,7 +26464,7 @@ msgstr "" msgid "Items under this warehouse will be suggested" msgstr "" -#: erpnext/controllers/stock_controller.py:166 +#: erpnext/controllers/stock_controller.py:171 msgid "Items {0} do not exist in the Item master." msgstr "" @@ -26483,7 +26511,7 @@ msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card/job_card.py:997 #: erpnext/manufacturing/doctype/operation/operation.json -#: erpnext/manufacturing/doctype/work_order/work_order.js:400 +#: erpnext/manufacturing/doctype/work_order/work_order.js:410 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:29 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:86 @@ -26621,7 +26649,7 @@ msgstr "" msgid "Job Worker Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2678 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2684 msgid "Job card {0} created" msgstr "" @@ -27139,7 +27167,7 @@ msgstr "" #. Label of the lead_time (Float) field in DocType 'Work Order' #: erpnext/manufacturing/doctype/master_production_schedule_item/master_production_schedule_item.json #: erpnext/manufacturing/doctype/work_order/work_order.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1072 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1074 #: erpnext/stock/doctype/item/item_dashboard.py:35 msgid "Lead Time" msgstr "" @@ -27363,7 +27391,7 @@ msgstr "" msgid "License Plate" msgstr "" -#: erpnext/controllers/status_updater.py:474 +#: erpnext/controllers/status_updater.py:489 msgid "Limit Crossed" msgstr "" @@ -27445,7 +27473,7 @@ msgstr "" msgid "Linked Location" msgstr "" -#: erpnext/stock/doctype/item/item.py:1016 +#: erpnext/stock/doctype/item/item.py:1029 msgid "Linked with submitted documents" msgstr "" @@ -27807,10 +27835,10 @@ msgstr "" msgid "Machine operator errors" msgstr "" +#: erpnext/setup/doctype/company/company.py:720 #: erpnext/setup/doctype/company/company.py:735 -#: erpnext/setup/doctype/company/company.py:750 -#: erpnext/setup/doctype/company/company.py:751 -#: erpnext/setup/doctype/company/company.py:752 +#: erpnext/setup/doctype/company/company.py:736 +#: erpnext/setup/doctype/company/company.py:737 msgid "Main" msgstr "" @@ -27923,7 +27951,7 @@ msgstr "" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.json #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:81 #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1121 +#: erpnext/selling/doctype/sales_order/sales_order.js:1130 #: erpnext/support/workspace/support/support.json #: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/support.json msgid "Maintenance Schedule" @@ -28030,7 +28058,7 @@ msgstr "" #: 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:1114 +#: erpnext/selling/doctype/sales_order/sales_order.js:1123 #: 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 @@ -28054,8 +28082,8 @@ msgstr "" #. Label of the make (Data) field in DocType 'Vehicle' #: erpnext/accounts/doctype/journal_entry/journal_entry.js:123 #: erpnext/manufacturing/doctype/job_card/job_card.js:544 -#: erpnext/manufacturing/doctype/work_order/work_order.js:839 -#: erpnext/manufacturing/doctype/work_order/work_order.js:873 +#: erpnext/manufacturing/doctype/work_order/work_order.js:850 +#: erpnext/manufacturing/doctype/work_order/work_order.js:884 #: erpnext/setup/doctype/vehicle/vehicle.json msgid "Make" msgstr "" @@ -28075,7 +28103,7 @@ msgstr "" msgid "Make Difference Entry" msgstr "" -#: erpnext/stock/doctype/item/item.js:609 +#: erpnext/stock/doctype/item/item.js:690 msgid "Make Lead Time" msgstr "" @@ -28134,11 +28162,11 @@ msgstr "" msgid "Make project from a template." msgstr "" -#: erpnext/stock/doctype/item/item.js:717 +#: erpnext/stock/doctype/item/item.js:798 msgid "Make {0} Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:719 +#: erpnext/stock/doctype/item/item.js:800 msgid "Make {0} Variants" msgstr "" @@ -28386,7 +28414,7 @@ msgstr "" #: 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 -#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:364 +#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:373 #: erpnext/setup/setup_wizard/data/industry_type.txt:31 #: erpnext/stock/doctype/batch/batch.json erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -28614,7 +28642,6 @@ msgstr "" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:112 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:191 -#: erpnext/setup/doctype/company/company.py:691 msgid "Marketing Expenses" msgstr "" @@ -28654,7 +28681,7 @@ msgstr "" msgid "Material" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:864 +#: erpnext/manufacturing/doctype/work_order/work_order.js:875 msgid "Material Consumption" msgstr "" @@ -28749,7 +28776,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan_material_request/production_plan_material_request.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/sales_order/sales_order.js:1085 +#: erpnext/selling/doctype/sales_order/sales_order.js:1094 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:36 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -28839,11 +28866,11 @@ msgstr "" msgid "Material Request Type" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1122 +#: erpnext/selling/doctype/sales_order/sales_order.py:1123 msgid "Material Request already created for the ordered quantity" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1832 +#: erpnext/selling/doctype/sales_order/sales_order.py:1863 msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" @@ -28861,7 +28888,7 @@ msgstr "" msgid "Material Request {0} is cancelled or stopped" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1459 +#: erpnext/selling/doctype/sales_order/sales_order.js:1477 msgid "Material Request {0} submitted." msgstr "" @@ -29050,9 +29077,9 @@ msgstr "" msgid "Max discount allowed for item: {0} is {1}%" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1040 -#: erpnext/manufacturing/doctype/work_order/work_order.js:1047 -#: erpnext/manufacturing/doctype/work_order/work_order.js:1070 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1051 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1058 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1081 #: erpnext/stock/doctype/pick_list/pick_list.js:200 #: erpnext/stock/doctype/stock_entry/stock_entry.js:382 msgid "Max: {0}" @@ -29139,7 +29166,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2059 +#: erpnext/stock/stock_ledger.py:2069 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -29227,7 +29254,7 @@ msgstr "" msgid "Messages greater than 160 characters will be split into multiple messages" msgstr "" -#: erpnext/setup/install.py:128 +#: erpnext/setup/install.py:136 msgid "Messaging CRM Campaign" msgstr "" @@ -29399,7 +29426,7 @@ msgid "Min Grade" msgstr "" #. Label of the min_order_qty (Float) field in DocType 'Material Request Item' -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1062 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1064 #: erpnext/stock/doctype/material_request_item/material_request_item.json msgid "Min Order Qty" msgstr "" @@ -29426,7 +29453,7 @@ msgstr "" msgid "Min Qty should be greater than Recurse Over Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:871 +#: erpnext/stock/doctype/item/item.js:952 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "" @@ -29577,7 +29604,7 @@ msgid "Missing required filter: {0}" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1218 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1477 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1482 msgid "Missing value" msgstr "" @@ -29830,7 +29857,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:193 +#: erpnext/stock/doctype/item/item.js:217 msgid "Multiple Variants" msgstr "" @@ -29851,7 +29878,7 @@ msgid "Music" msgstr "" #. Label of the must_be_whole_number (Check) field in DocType 'UOM' -#: erpnext/manufacturing/doctype/work_order/work_order.py:1424 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1429 #: erpnext/setup/doctype/uom/uom.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267 #: erpnext/utilities/transaction_base.py:568 @@ -30328,11 +30355,11 @@ msgstr "" msgid "New Balance In Base Currency" msgstr "" -#: erpnext/stock/doctype/batch/batch.js:167 +#: erpnext/stock/doctype/batch/batch.js:168 msgid "New Batch ID (Optional)" msgstr "" -#: erpnext/stock/doctype/batch/batch.js:161 +#: erpnext/stock/doctype/batch/batch.js:162 msgid "New Batch Qty" msgstr "" @@ -30563,11 +30590,11 @@ msgstr "" msgid "No Items selected for transfer." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1233 +#: erpnext/selling/doctype/sales_order/sales_order.js:1242 msgid "No Items with Bill of Materials to Manufacture or all items already manufactured" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1379 +#: erpnext/selling/doctype/sales_order/sales_order.js:1395 msgid "No Items with Bill of Materials." msgstr "" @@ -30590,7 +30617,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1573 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1633 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1647 -#: erpnext/stock/doctype/item/item.py:1388 +#: erpnext/stock/doctype/item/item.py:1401 msgid "No Permission" msgstr "" @@ -30631,7 +30658,7 @@ msgstr "" msgid "No Tax withholding account set for Company {0} in Tax Withholding Category {1}." msgstr "" -#: erpnext/accounts/report/gross_profit/gross_profit.py:971 +#: erpnext/accounts/report/gross_profit/gross_profit.py:998 msgid "No Terms" msgstr "" @@ -30653,7 +30680,7 @@ msgstr "" msgid "No accounting entries for the following warehouses" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:797 +#: erpnext/selling/doctype/sales_order/sales_order.py:798 msgid "No active BOM found for item {0}. Delivery by Serial No cannot be ensured" msgstr "" @@ -30734,7 +30761,7 @@ msgstr "" msgid "No more children on Right" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:607 +#: erpnext/selling/doctype/sales_order/sales_order.js:608 msgid "No of Deliveries" msgstr "" @@ -30884,6 +30911,10 @@ msgstr "" msgid "No rows with zero document count found" msgstr "" +#: erpnext/stock/doctype/batch/batch.js:76 +msgid "No stock available for this batch." +msgstr "" + #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:806 msgid "No stock ledger entries were created. Please set the quantity or valuation rate for the items properly and try again." msgstr "" @@ -30940,7 +30971,7 @@ msgstr "" msgid "Non Profit" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1639 +#: erpnext/manufacturing/doctype/bom/bom.py:1634 msgid "Non stock items" msgstr "" @@ -30953,6 +30984,11 @@ msgstr "" msgid "Non-Zeros" msgstr "" +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:117 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:113 +msgid "Non-phantom BOM cannot be created for non-stock item {0}." +msgstr "" + #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:558 msgid "None of the items have any change in quantity or value." msgstr "" @@ -31051,7 +31087,7 @@ msgstr "" msgid "Not in stock" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1301 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1303 msgid "Not permitted to make Purchase Orders" msgstr "" @@ -31360,7 +31396,7 @@ msgstr "" msgid "Oldest Of Invoice Or Advance" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1036 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1038 msgid "On Hand" msgstr "" @@ -31451,7 +31487,7 @@ msgstr "" msgid "Once set, this invoice will be on hold till the set date" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:751 +#: erpnext/manufacturing/doctype/work_order/work_order.js:762 msgid "Once the Work Order is Closed. It can't be resumed." msgstr "" @@ -31901,7 +31937,7 @@ msgstr "" msgid "Operating Cost Per BOM Quantity" msgstr "" -#: erpnext/manufacturing/doctype/bom/bom.py:1726 +#: erpnext/manufacturing/doctype/bom/bom.py:1721 msgid "Operating Cost as per Work Order / BOM" msgstr "" @@ -31949,7 +31985,7 @@ msgstr "" msgid "Operation ID" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:336 +#: erpnext/manufacturing/doctype/work_order/work_order.js:346 msgid "Operation Id" msgstr "" @@ -31977,7 +32013,7 @@ msgstr "" msgid "Operation Time" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1483 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1488 msgid "Operation Time must be greater than 0 for Operation {0}" msgstr "" @@ -32000,7 +32036,7 @@ msgstr "" msgid "Operation {0} does not belong to the work order {1}" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:430 +#: erpnext/manufacturing/doctype/workstation/workstation.py:432 msgid "Operation {0} longer than any available working hours in workstation {1}, break down the operation into multiple operations" msgstr "" @@ -32012,7 +32048,7 @@ msgstr "" #. Label of the operations (Table) field in DocType 'Work Order' #. Label of the operation (Section Break) field in DocType 'Email Digest' #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/manufacturing/doctype/work_order/work_order.js:317 +#: erpnext/manufacturing/doctype/work_order/work_order.js:327 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/setup/doctype/company/company.py:469 #: erpnext/setup/doctype/email_digest/email_digest.json @@ -32187,7 +32223,7 @@ msgstr "" msgid "Optimize Route" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1017 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1028 msgid "Optional. Select a specific manufacture entry to reverse." msgstr "" @@ -32335,7 +32371,7 @@ msgstr "" #: erpnext/buying/doctype/supplier/supplier_dashboard.py:11 #: erpnext/selling/doctype/customer/customer_dashboard.py:20 -#: erpnext/selling/doctype/sales_order/sales_order.py:969 +#: erpnext/selling/doctype/sales_order/sales_order.py:970 #: erpnext/setup/doctype/company/company_dashboard.py:23 msgid "Orders" msgstr "" @@ -32613,11 +32649,11 @@ msgstr "" msgid "Over Picking Allowance" msgstr "" -#: erpnext/controllers/stock_controller.py:1731 +#: erpnext/controllers/stock_controller.py:1736 msgid "Over Receipt" msgstr "" -#: erpnext/controllers/status_updater.py:479 +#: erpnext/controllers/status_updater.py:494 msgid "Over Receipt/Delivery of {0} {1} ignored for item {2} because you have {3} role." msgstr "" @@ -32637,7 +32673,7 @@ msgstr "" msgid "Over Withheld" msgstr "" -#: erpnext/controllers/status_updater.py:481 +#: erpnext/controllers/status_updater.py:496 msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role." msgstr "" @@ -33108,7 +33144,7 @@ msgstr "" msgid "Packed Items" msgstr "" -#: erpnext/controllers/stock_controller.py:1565 +#: erpnext/controllers/stock_controller.py:1570 msgid "Packed Items cannot be transferred internally" msgstr "" @@ -33393,7 +33429,7 @@ msgstr "" msgid "Parent Row No" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:535 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:548 msgid "Parent Row No not found for {0}" msgstr "" @@ -34010,7 +34046,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice_list.js:42 #: erpnext/buying/doctype/purchase_order/purchase_order.js:421 #: erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py:24 -#: erpnext/selling/doctype/sales_order/sales_order.js:1166 +#: erpnext/selling/doctype/sales_order/sales_order.js:1175 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:31 msgid "Payment" msgstr "" @@ -34362,7 +34398,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:135 #: 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:1159 +#: erpnext/selling/doctype/sales_order/sales_order.js:1168 #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Payment Request" @@ -34428,7 +34464,7 @@ msgstr "" msgid "Payment Schedule based Payment Requests cannot be created because a Payment Entry already exists for this document." msgstr "" -#: erpnext/public/js/controllers/transaction.js:482 +#: erpnext/public/js/controllers/transaction.js:483 msgid "Payment Schedules" msgstr "" @@ -34454,7 +34490,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1256 #: erpnext/accounts/report/gross_profit/gross_profit.py:449 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/public/js/controllers/transaction.js:496 +#: erpnext/public/js/controllers/transaction.js:498 #: 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" @@ -34701,9 +34737,9 @@ msgstr "" #. Label of the pending_qty (Float) field in DocType 'Production Plan Item' #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:254 #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json -#: erpnext/manufacturing/doctype/work_order/work_order.js:341 +#: erpnext/manufacturing/doctype/work_order/work_order.js:351 #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py:182 -#: erpnext/selling/doctype/sales_order/sales_order.js:1652 +#: erpnext/selling/doctype/sales_order/sales_order.js:1670 #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:45 msgid "Pending Qty" msgstr "" @@ -34983,7 +35019,7 @@ msgstr "" #: erpnext/assets/doctype/asset_maintenance_task/asset_maintenance_task.json #: erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json #: erpnext/manufacturing/report/exponential_smoothing_forecasting/exponential_smoothing_forecasting.js:54 -#: erpnext/public/js/financial_statements.js:435 +#: erpnext/public/js/financial_statements.js:438 msgid "Periodicity" msgstr "" @@ -35020,6 +35056,11 @@ msgstr "" msgid "Petrol" msgstr "" +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:113 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:110 +msgid "Phantom BOM cannot be created for stock item {0}." +msgstr "" + #: erpnext/manufacturing/doctype/bom/bom_item_preview.html:16 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:321 msgid "Phantom Item" @@ -35046,7 +35087,7 @@ msgstr "" #. Label of the phone_no (Data) field in DocType 'Company' #. Label of the phone_no (Data) field in DocType 'Warehouse' -#: erpnext/public/js/print.js:79 erpnext/setup/doctype/company/company.json +#: erpnext/public/js/print.js:82 erpnext/setup/doctype/company/company.json #: erpnext/stock/doctype/warehouse/warehouse.json msgid "Phone No" msgstr "" @@ -35065,7 +35106,7 @@ msgstr "" #. Reservation Entry' #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/selling/doctype/sales_order/sales_order.js:1029 +#: erpnext/selling/doctype/sales_order/sales_order.js:1030 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 #: erpnext/stock/doctype/material_request/material_request.js:156 #: erpnext/stock/doctype/pick_list/pick_list.json @@ -35312,7 +35353,7 @@ msgstr "" msgid "Planned Operating Cost" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1042 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1044 msgid "Planned Purchase Order" msgstr "" @@ -35322,7 +35363,7 @@ msgstr "" #. Label of the planned_qty (Float) field in DocType 'Bin' #: erpnext/manufacturing/doctype/master_production_schedule_item/master_production_schedule_item.json #: erpnext/manufacturing/doctype/production_plan_item/production_plan_item.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1030 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1032 #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:148 msgid "Planned Qty" @@ -35353,7 +35394,7 @@ msgstr "" msgid "Planned Start Time" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1047 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1049 msgid "Planned Work Order" msgstr "" @@ -35475,7 +35516,7 @@ msgstr "" msgid "Please add {1} role to user {0}." msgstr "" -#: erpnext/controllers/stock_controller.py:1742 +#: erpnext/controllers/stock_controller.py:1747 msgid "Please adjust the qty or edit {0} to proceed." msgstr "" @@ -35514,7 +35555,7 @@ msgid "Please check either with operations or FG Based Operating Cost." msgstr "" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:150 -msgid "Please check the 'Enable Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." +msgid "Please check the 'Activate Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." msgstr "" #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:562 @@ -35606,7 +35647,7 @@ msgstr "" msgid "Please enable Use Old Serial / Batch Fields to make_bundle" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:13 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:21 msgid "Please enable only if the understand the effects of enabling this." msgstr "" @@ -35655,7 +35696,7 @@ msgstr "" msgid "Please enter Cost Center" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:421 +#: erpnext/selling/doctype/sales_order/sales_order.py:422 msgid "Please enter Delivery Date" msgstr "" @@ -35672,7 +35713,7 @@ msgstr "" msgid "Please enter Item Code to get Batch Number" msgstr "" -#: erpnext/public/js/controllers/transaction.js:3073 +#: erpnext/public/js/controllers/transaction.js:3074 msgid "Please enter Item Code to get batch no" msgstr "" @@ -35729,15 +35770,15 @@ msgstr "" msgid "Please enter Write Off Account" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:724 +#: erpnext/selling/doctype/sales_order/sales_order.js:725 msgid "Please enter a valid number of deliveries" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:665 +#: erpnext/selling/doctype/sales_order/sales_order.js:666 msgid "Please enter a valid quantity" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:659 +#: erpnext/selling/doctype/sales_order/sales_order.js:660 msgid "Please enter at least one delivery date and quantity" msgstr "" @@ -35777,7 +35818,7 @@ msgstr "" msgid "Please enter the company name to confirm" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:720 +#: erpnext/selling/doctype/sales_order/sales_order.js:721 msgid "Please enter the first delivery date" msgstr "" @@ -35845,7 +35886,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone." msgstr "" -#: erpnext/stock/doctype/item/item.js:622 +#: erpnext/stock/doctype/item/item.js:703 msgid "Please mention 'Weight UOM' along with Weight." msgstr "" @@ -35887,7 +35928,7 @@ msgstr "" msgid "Please save first" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:866 +#: erpnext/selling/doctype/sales_order/sales_order.js:867 msgid "Please save the Sales Order before adding a delivery schedule." msgstr "" @@ -35895,12 +35936,12 @@ msgstr "" msgid "Please select Template Type to download template" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:850 -#: erpnext/public/js/controllers/taxes_and_totals.js:796 +#: erpnext/controllers/taxes_and_totals.py:849 +#: erpnext/public/js/controllers/taxes_and_totals.js:794 msgid "Please select Apply Discount On" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1780 +#: erpnext/selling/doctype/sales_order/sales_order.py:1781 msgid "Please select BOM against item {0}" msgstr "" @@ -35992,7 +36033,7 @@ msgstr "" msgid "Please select Price List" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1782 +#: erpnext/selling/doctype/sales_order/sales_order.py:1783 msgid "Please select Qty against item {0}" msgstr "" @@ -36033,7 +36074,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:727 #: erpnext/manufacturing/doctype/bom/bom.py:278 #: erpnext/public/js/controllers/accounts.js:277 -#: erpnext/public/js/controllers/transaction.js:3372 +#: erpnext/public/js/controllers/transaction.js:3373 msgid "Please select a Company first." msgstr "" @@ -36085,7 +36126,7 @@ msgstr "" msgid "Please select a field to edit from numpad" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:716 +#: erpnext/selling/doctype/sales_order/sales_order.js:717 msgid "Please select a frequency for delivery schedule" msgstr "" @@ -36126,15 +36167,15 @@ msgstr "" msgid "Please select at least one row with difference value" msgstr "" -#: erpnext/public/js/controllers/transaction.js:524 +#: erpnext/public/js/controllers/transaction.js:526 msgid "Please select at least one schedule." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1303 +#: erpnext/selling/doctype/sales_order/sales_order.js:1312 msgid "Please select atleast one item to continue" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:384 +#: erpnext/manufacturing/doctype/work_order/work_order.js:394 msgid "Please select atleast one operation to create Job Card" msgstr "" @@ -36156,13 +36197,13 @@ msgid "Please select item code" msgstr "" #: erpnext/public/js/stock_reservation.js:212 -#: erpnext/selling/doctype/sales_order/sales_order.js:426 +#: erpnext/selling/doctype/sales_order/sales_order.js:427 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:301 msgid "Please select items to reserve." msgstr "" #: erpnext/public/js/stock_reservation.js:290 -#: erpnext/selling/doctype/sales_order/sales_order.js:530 +#: erpnext/selling/doctype/sales_order/sales_order.js:531 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:399 msgid "Please select items to unreserve." msgstr "" @@ -36184,7 +36225,7 @@ msgstr "" msgid "Please select the Multiple Tier Program type for more than one collection rules." msgstr "" -#: erpnext/stock/doctype/item/item.js:341 +#: erpnext/stock/doctype/item/item.js:365 msgid "Please select the Warehouse first" msgstr "" @@ -36292,7 +36333,7 @@ msgstr "" msgid "Please set Fixed Asset Account in {} against {}." msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:281 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:292 msgid "Please set Parent Row No for item {0}" msgstr "" @@ -36351,7 +36392,7 @@ msgstr "" msgid "Please set an Address on the Company '%s'" msgstr "" -#: erpnext/controllers/stock_controller.py:916 +#: erpnext/controllers/stock_controller.py:921 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -36395,11 +36436,11 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/controllers/stock_controller.py:775 +#: erpnext/controllers/stock_controller.py:780 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "" -#: erpnext/controllers/stock_controller.py:231 +#: erpnext/controllers/stock_controller.py:236 msgid "Please set default inventory account for item {0}, or their item group or brand." msgstr "" @@ -36420,7 +36461,7 @@ msgstr "" msgid "Please set opening number of booked depreciations" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2760 +#: erpnext/public/js/controllers/transaction.js:2761 msgid "Please set recurring after saving" msgstr "" @@ -36432,7 +36473,7 @@ msgstr "" msgid "Please set the Default Cost Center in {0} company." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:668 +#: erpnext/manufacturing/doctype/work_order/work_order.js:679 msgid "Please set the Item Code first" msgstr "" @@ -36471,7 +36512,7 @@ msgstr "" msgid "Please set {0} for address {1}" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:234 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:245 msgid "Please set {0} in BOM Creator {1}" msgstr "" @@ -36751,7 +36792,7 @@ msgstr "" msgid "Posting Date cannot be future date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:1112 +#: erpnext/public/js/controllers/transaction.js:1113 msgid "Posting Date will change to today's date as Edit Posting Date and Time is unchecked. Are you sure want to proceed?" msgstr "" @@ -37445,7 +37486,7 @@ msgstr "" msgid "Print Receipt on Order Complete" msgstr "" -#: erpnext/setup/install.py:105 +#: erpnext/setup/install.py:113 msgid "Print UOM after Quantity" msgstr "" @@ -37463,7 +37504,7 @@ msgstr "" msgid "Print settings updated in respective print format" msgstr "" -#: erpnext/setup/install.py:112 +#: erpnext/setup/install.py:120 msgid "Print taxes with zero amount" msgstr "" @@ -37568,7 +37609,7 @@ msgstr "" msgid "Procedure" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:39 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:47 msgid "Procedures dropped" msgstr "" @@ -37926,6 +37967,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/manufacturing/report/production_plan_summary/production_plan_summary.js:8 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json +#: erpnext/selling/doctype/sales_order/sales_order.js:1066 #: 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 @@ -38029,7 +38071,7 @@ msgstr "" #: 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/public/js/financial_statements.js:330 #: erpnext/workspace_sidebar/financial_reports.json msgid "Profit and Loss" msgstr "" @@ -38484,7 +38526,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:463 erpnext/setup/install.py:378 +#: erpnext/setup/doctype/company/company.py:463 erpnext/setup/install.py:387 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json #: erpnext/stock/doctype/item_reorder/item_reorder.json @@ -38687,8 +38729,8 @@ msgstr "" #: 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 -#: erpnext/selling/doctype/sales_order/sales_order.js:188 -#: erpnext/selling/doctype/sales_order/sales_order.js:1104 +#: erpnext/selling/doctype/sales_order/sales_order.js:189 +#: erpnext/selling/doctype/sales_order/sales_order.js:1113 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -38789,7 +38831,7 @@ msgstr "" msgid "Purchase Order Trends" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1596 +#: erpnext/selling/doctype/sales_order/sales_order.js:1614 msgid "Purchase Order already created for all Sales Order items" msgstr "" @@ -38797,7 +38839,7 @@ msgstr "" msgid "Purchase Order number required for Item {0}" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1361 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1363 msgid "Purchase Order {0} created" msgstr "" @@ -39045,7 +39087,7 @@ msgstr "" msgid "Purchased" msgstr "" -#: erpnext/regional/report/vat_audit_report/vat_audit_report.py:146 +#: erpnext/regional/report/vat_audit_report/vat_audit_report.py:145 msgid "Purchases" msgstr "" @@ -39159,12 +39201,12 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:336 erpnext/public/js/utils.js:869 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/product_bundle_item/product_bundle_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:397 -#: erpnext/selling/doctype/sales_order/sales_order.js:501 -#: erpnext/selling/doctype/sales_order/sales_order.js:591 -#: erpnext/selling/doctype/sales_order/sales_order.js:638 -#: erpnext/selling/doctype/sales_order/sales_order.js:1279 -#: erpnext/selling/doctype/sales_order/sales_order.js:1432 +#: erpnext/selling/doctype/sales_order/sales_order.js:398 +#: erpnext/selling/doctype/sales_order/sales_order.js:502 +#: erpnext/selling/doctype/sales_order/sales_order.js:592 +#: erpnext/selling/doctype/sales_order/sales_order.js:639 +#: erpnext/selling/doctype/sales_order/sales_order.js:1288 +#: erpnext/selling/doctype/sales_order/sales_order.js:1450 #: erpnext/selling/report/sales_order_analysis/sales_order_analysis.py:255 #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json @@ -39274,7 +39316,7 @@ msgstr "" msgid "Qty To Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1420 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1425 msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}." msgstr "" @@ -39329,8 +39371,8 @@ msgstr "" msgid "Qty for which recursion isn't applicable." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1045 -#: erpnext/manufacturing/doctype/work_order/work_order.js:1068 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1056 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1079 msgid "Qty for {0}" msgstr "" @@ -39771,7 +39813,7 @@ msgstr "" #: erpnext/manufacturing/doctype/blanket_order_item/blanket_order_item.json #: erpnext/manufacturing/doctype/bom/bom.js:493 #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:69 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.js:76 #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:194 #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:218 @@ -39791,7 +39833,7 @@ msgstr "" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/packing_slip_item/packing_slip_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:815 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:807 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:36 @@ -39906,7 +39948,7 @@ msgstr "" msgid "Quantity must be less than or equal to {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1098 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1109 #: erpnext/stock/doctype/pick_list/pick_list.js:206 msgid "Quantity must not be more than {0}" msgstr "" @@ -39927,15 +39969,15 @@ msgstr "" msgid "Quantity should be greater than 0" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:346 +#: erpnext/manufacturing/doctype/work_order/work_order.js:356 msgid "Quantity to Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2617 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2622 msgid "Quantity to Manufacture can not be zero for the operation {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1412 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1417 msgid "Quantity to Manufacture must be greater than 0." msgstr "" @@ -39968,7 +40010,7 @@ msgstr "" msgid "Query Route String" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:177 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:184 msgid "Queue Size should be between 5 and 100" msgstr "" @@ -40025,7 +40067,7 @@ msgstr "" #: erpnext/crm/report/lead_details/lead_details.js:37 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:38 #: erpnext/selling/doctype/quotation/quotation.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1182 +#: erpnext/selling/doctype/sales_order/sales_order.js:1191 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json @@ -40076,11 +40118,11 @@ msgstr "" msgid "Quotation Trends" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:485 +#: erpnext/selling/doctype/sales_order/sales_order.py:486 msgid "Quotation {0} is cancelled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:398 +#: erpnext/selling/doctype/sales_order/sales_order.py:399 msgid "Quotation {0} not of type {1}" msgstr "" @@ -40617,8 +40659,8 @@ msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.js:369 #: erpnext/manufacturing/doctype/production_plan/production_plan.js:124 -#: erpnext/manufacturing/doctype/work_order/work_order.js:767 -#: erpnext/selling/doctype/sales_order/sales_order.js:975 +#: erpnext/manufacturing/doctype/work_order/work_order.js:778 +#: erpnext/selling/doctype/sales_order/sales_order.js:976 #: erpnext/selling/doctype/sales_order/sales_order_list.js:70 #: erpnext/stock/doctype/material_request/material_request.js:243 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116 @@ -40717,7 +40759,7 @@ msgid "Reason for Failure" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.js:679 -#: erpnext/selling/doctype/sales_order/sales_order.js:1767 +#: erpnext/selling/doctype/sales_order/sales_order.js:1785 msgid "Reason for Hold" msgstr "" @@ -40726,7 +40768,7 @@ msgstr "" msgid "Reason for Leaving" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1782 +#: erpnext/selling/doctype/sales_order/sales_order.js:1800 msgid "Reason for hold:" msgstr "" @@ -41164,7 +41206,7 @@ msgstr "" msgid "Reference #{0} dated {1}" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2873 +#: erpnext/public/js/controllers/transaction.js:2874 msgid "Reference Date for Early Payment Discount" msgstr "" @@ -41437,7 +41479,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:310 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/buying/doctype/supplier/supplier.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1077 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1079 msgid "Release Date" msgstr "" @@ -41543,7 +41585,7 @@ msgstr "" msgid "Remarks:" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:119 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:130 msgid "Remove Parent Row No in Items Table" msgstr "" @@ -41716,7 +41758,7 @@ msgstr "" msgid "Report Type is mandatory" msgstr "" -#: erpnext/setup/install.py:207 +#: erpnext/setup/install.py:215 msgid "Report an Issue" msgstr "" @@ -41744,6 +41786,12 @@ msgstr "" msgid "Reports to" msgstr "" +#. Label of the repost_section (Section Break) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Repost" +msgstr "" + #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.json @@ -41757,9 +41805,7 @@ msgstr "" 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" @@ -41980,7 +42026,7 @@ msgstr "" msgid "Request for Quotation Supplier" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1091 +#: erpnext/selling/doctype/sales_order/sales_order.js:1100 msgid "Request for Raw Materials" msgstr "" @@ -42105,7 +42151,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/report/bom_stock_analysis/bom_stock_analysis.py:119 #: erpnext/manufacturing/report/bom_variance_report/bom_variance_report.py:58 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1057 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1059 #: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:426 #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:139 #: erpnext/subcontracting/doctype/subcontracting_inward_order_received_item/subcontracting_inward_order_received_item.json @@ -42185,8 +42231,8 @@ msgstr "" msgid "Reservation Based On" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:925 -#: erpnext/selling/doctype/sales_order/sales_order.js:106 +#: erpnext/manufacturing/doctype/work_order/work_order.js:936 +#: erpnext/selling/doctype/sales_order/sales_order.js:107 #: erpnext/stock/doctype/pick_list/pick_list.js:150 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:180 msgid "Reserve" @@ -42200,7 +42246,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/public/js/stock_reservation.js:15 -#: erpnext/selling/doctype/sales_order/sales_order.js:404 +#: erpnext/selling/doctype/sales_order/sales_order.js:405 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:278 @@ -42230,7 +42276,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/controllers/stock_controller.py:1323 +#: erpnext/controllers/stock_controller.py:1328 msgid "Reserved Batch Conflict" msgstr "" @@ -42300,29 +42346,29 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2327 +#: erpnext/stock/stock_ledger.py:2337 msgid "Reserved Serial No." msgstr "" #. Label of the reserved_stock (Float) field in DocType 'Bin' #. Name of a report #: erpnext/manufacturing/doctype/plant_floor/stock_summary_template.html:24 -#: erpnext/manufacturing/doctype/work_order/work_order.js:941 +#: erpnext/manufacturing/doctype/work_order/work_order.js:952 #: erpnext/public/js/stock_reservation.js:236 -#: erpnext/selling/doctype/sales_order/sales_order.js:134 -#: erpnext/selling/doctype/sales_order/sales_order.js:464 +#: erpnext/selling/doctype/sales_order/sales_order.js:135 +#: erpnext/selling/doctype/sales_order/sales_order.js:465 #: erpnext/stock/dashboard/item_dashboard_list.html:15 #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/doctype/pick_list/pick_list.js:170 #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:572 -#: erpnext/stock/stock_ledger.py:2311 +#: erpnext/stock/stock_ledger.py:2321 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:205 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:333 msgid "Reserved Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2356 +#: erpnext/stock/stock_ledger.py:2366 msgid "Reserved Stock for Batch" msgstr "" @@ -42367,7 +42413,7 @@ msgid "Reserved for sub contracting" msgstr "" #: erpnext/public/js/stock_reservation.js:203 -#: erpnext/selling/doctype/sales_order/sales_order.js:417 +#: erpnext/selling/doctype/sales_order/sales_order.js:418 #: erpnext/stock/doctype/pick_list/pick_list.js:295 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:293 msgid "Reserving Stock..." @@ -42584,7 +42630,7 @@ msgstr "" #: erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js:43 #: erpnext/buying/doctype/purchase_order/purchase_order.js:344 #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:63 -#: erpnext/selling/doctype/sales_order/sales_order.js:961 +#: erpnext/selling/doctype/sales_order/sales_order.js:962 msgid "Resume" msgstr "" @@ -42689,7 +42735,7 @@ msgstr "" msgid "Return Against Subcontracting Receipt" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:287 +#: erpnext/manufacturing/doctype/work_order/work_order.js:297 msgid "Return Components" msgstr "" @@ -43206,8 +43252,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/controllers/stock_controller.py:787 -#: erpnext/controllers/stock_controller.py:802 +#: erpnext/controllers/stock_controller.py:792 +#: erpnext/controllers/stock_controller.py:807 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -43217,7 +43263,7 @@ msgstr "" #. 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.js:101 #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/routing/routing.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -43318,7 +43364,7 @@ msgstr "" msgid "Row #{0}: BOM is not specified for subcontracting item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:300 +#: erpnext/selling/doctype/sales_order/sales_order.py:301 msgid "Row #{0}: BOM not found for FG Item {1}" msgstr "" @@ -43465,11 +43511,11 @@ msgstr "" msgid "Row #{0}: Duplicate entry in References {1} {2}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:330 +#: erpnext/selling/doctype/sales_order/sales_order.py:331 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/controllers/stock_controller.py:918 +#: erpnext/controllers/stock_controller.py:923 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" @@ -43478,17 +43524,17 @@ msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:362 -#: erpnext/selling/doctype/sales_order/sales_order.py:303 +#: erpnext/selling/doctype/sales_order/sales_order.py:304 msgid "Row #{0}: Finished Good Item Qty can not be zero" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:344 -#: erpnext/selling/doctype/sales_order/sales_order.py:283 +#: erpnext/selling/doctype/sales_order/sales_order.py:284 msgid "Row #{0}: Finished Good Item is not specified for service item {1}" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.py:351 -#: erpnext/selling/doctype/sales_order/sales_order.py:290 +#: erpnext/selling/doctype/sales_order/sales_order.py:291 msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item" msgstr "" @@ -43545,8 +43591,8 @@ msgstr "" msgid "Row #{0}: Item {1} has no stock in warehouse {2}." msgstr "" -#: erpnext/controllers/stock_controller.py:150 -msgid "Row #{0}: Item {1} has zero rate but 'Allow Zero Valuation Rate' is not enabled." +#: erpnext/controllers/stock_controller.py:153 +msgid "Row #{0}: Item {1} has zero rate but '{2}' is not enabled." msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:455 @@ -43594,7 +43640,7 @@ msgstr "" msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:670 +#: erpnext/selling/doctype/sales_order/sales_order.py:671 msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "" @@ -43657,15 +43703,15 @@ msgstr "" msgid "Row #{0}: Qty should be less than or equal to Available Qty to Reserve (Actual Qty - Reserved Qty) {1} for Iem {2} against Batch {3} in Warehouse {4}." msgstr "" -#: erpnext/controllers/stock_controller.py:1460 +#: erpnext/controllers/stock_controller.py:1465 msgid "Row #{0}: Quality Inspection is required for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1475 +#: erpnext/controllers/stock_controller.py:1480 msgid "Row #{0}: Quality Inspection {1} is not submitted for the item: {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1490 +#: erpnext/controllers/stock_controller.py:1495 msgid "Row #{0}: Quality Inspection {1} was rejected for item {2}" msgstr "" @@ -43744,7 +43790,7 @@ msgstr "" msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." msgstr "" -#: erpnext/controllers/stock_controller.py:302 +#: erpnext/controllers/stock_controller.py:307 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -43772,7 +43818,7 @@ msgstr "" msgid "Row #{0}: Service Start and End Date is required for deferred accounting" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:493 +#: erpnext/selling/doctype/sales_order/sales_order.py:494 msgid "Row #{0}: Set Supplier for item {1}" msgstr "" @@ -43800,7 +43846,7 @@ msgstr "" msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:105 +#: erpnext/manufacturing/doctype/workstation/workstation.py:107 msgid "Row #{0}: Start Time must be before End Time" msgstr "" @@ -43849,7 +43895,7 @@ msgstr "" msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/controllers/stock_controller.py:315 +#: erpnext/controllers/stock_controller.py:320 msgid "Row #{0}: The batch {1} has already expired." msgstr "" @@ -43857,7 +43903,7 @@ msgstr "" msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:178 +#: erpnext/manufacturing/doctype/workstation/workstation.py:180 msgid "Row #{0}: Timings conflicts with row {1}" msgstr "" @@ -44006,7 +44052,7 @@ msgstr "" msgid "Row #{}: {} {} does not exist." msgstr "" -#: erpnext/stock/doctype/item/item.py:1420 +#: erpnext/stock/doctype/item/item.py:1433 msgid "Row #{}: {} {} doesn't belong to Company {}. Please select valid {}." msgstr "" @@ -44154,7 +44200,7 @@ msgstr "" msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1556 +#: erpnext/controllers/stock_controller.py:1561 msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "" @@ -44294,7 +44340,7 @@ msgstr "" msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1547 +#: erpnext/controllers/stock_controller.py:1552 msgid "Row {0}: Target Warehouse is mandatory for internal transfers" msgstr "" @@ -44528,7 +44574,7 @@ msgstr "" #. Item' #. Label of the safety_stock (Float) field in DocType 'Item' #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1052 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1054 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py:58 msgid "Safety Stock" @@ -44572,14 +44618,14 @@ msgstr "" #: erpnext/crm/doctype/opportunity/opportunity.js:288 #: erpnext/crm/doctype/opportunity/opportunity.py:158 #: erpnext/projects/doctype/project/project_dashboard.py:15 -#: erpnext/regional/report/vat_audit_report/vat_audit_report.py:146 +#: erpnext/regional/report/vat_audit_report/vat_audit_report.py:145 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/company/company.py:457 #: erpnext/setup/doctype/company/company.py:649 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 -#: erpnext/setup/install.py:373 +#: erpnext/setup/install.py:382 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:297 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/pick_list/pick_list_dashboard.py:16 @@ -44687,7 +44733,7 @@ msgstr "" #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/doctype/timesheet_detail/timesheet_detail.json #: erpnext/selling/doctype/quotation/quotation_list.js:22 -#: erpnext/selling/doctype/sales_order/sales_order.js:1070 +#: erpnext/selling/doctype/sales_order/sales_order.js:1079 #: erpnext/selling/doctype/sales_order/sales_order_list.js:75 #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json @@ -44783,7 +44829,7 @@ msgstr "" msgid "Sales Invoice {0} has already been submitted" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:589 +#: erpnext/selling/doctype/sales_order/sales_order.py:590 msgid "Sales Invoice {0} must be deleted before cancelling this Sales Order" msgstr "" @@ -44933,8 +44979,8 @@ msgstr "" #: 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:343 -#: erpnext/selling/doctype/sales_order/sales_order.js:1286 +#: erpnext/selling/doctype/sales_order/sales_order.js:344 +#: erpnext/selling/doctype/sales_order/sales_order.js:1295 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json @@ -44981,10 +45027,15 @@ msgstr "" msgid "Sales Order required for Item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:354 +#: erpnext/selling/doctype/sales_order/sales_order.py:355 msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" +#: erpnext/selling/doctype/sales_order/sales_order.py:1817 +#: erpnext/selling/doctype/sales_order/sales_order.py:1830 +msgid "Sales Order {0} is not available for production" +msgstr "" + #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1395 msgid "Sales Order {0} is not submitted" msgstr "" @@ -45250,7 +45301,7 @@ msgstr "" msgid "Sales Representative" msgstr "" -#: erpnext/accounts/report/gross_profit/gross_profit.py:970 +#: erpnext/accounts/report/gross_profit/gross_profit.py:997 #: erpnext/stock/doctype/delivery_note/delivery_note.js:270 msgid "Sales Return" msgstr "" @@ -45427,7 +45478,7 @@ msgstr "" #. Label of the sample_size (Float) field in DocType 'Quality Inspection' #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:93 -#: erpnext/public/js/controllers/transaction.js:2930 +#: erpnext/public/js/controllers/transaction.js:2931 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Sample Size" msgstr "" @@ -45533,7 +45584,7 @@ msgstr "" msgid "Schedule Date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:490 +#: erpnext/public/js/controllers/transaction.js:492 msgid "Schedule Name" msgstr "" @@ -45793,10 +45844,6 @@ msgstr "" msgid "See all open tickets" msgstr "" -#: erpnext/stock/report/stock_ledger/stock_ledger.js:122 -msgid "Segregate Serial / Batch Bundle" -msgstr "" - #: erpnext/accounts/report/profitability_analysis/profitability_analysis.py:23 msgid "Select Accounting Dimension." msgstr "" @@ -45809,22 +45856,18 @@ msgstr "" msgid "Select Alternative Items for Sales Order" msgstr "" -#: erpnext/stock/doctype/item/item.js:733 +#: erpnext/stock/doctype/item/item.js:814 msgid "Select Attribute Values" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1269 +#: erpnext/selling/doctype/sales_order/sales_order.js:1278 msgid "Select BOM" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1246 +#: erpnext/selling/doctype/sales_order/sales_order.js:1255 msgid "Select BOM and Qty for Production" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1402 -msgid "Select BOM, Qty and For Warehouse" -msgstr "" - #: erpnext/assets/doctype/asset_repair/asset_repair.js:234 #: erpnext/public/js/utils/sales_common.js:443 #: erpnext/stock/doctype/pick_list/pick_list.js:387 @@ -45851,7 +45894,7 @@ msgstr "" msgid "Select Company" msgstr "" -#: erpnext/public/js/print.js:115 +#: erpnext/public/js/print.js:118 msgid "Select Company Address" msgstr "" @@ -45896,7 +45939,7 @@ msgid "Select Employees" msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.js:198 -#: erpnext/selling/doctype/sales_order/sales_order.js:825 +#: erpnext/selling/doctype/sales_order/sales_order.js:826 msgid "Select Finished Good" msgstr "" @@ -45906,24 +45949,24 @@ msgstr "" #. Forecast' #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.json #: erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1603 -#: erpnext/selling/doctype/sales_order/sales_order.js:1631 +#: erpnext/selling/doctype/sales_order/sales_order.js:1621 +#: erpnext/selling/doctype/sales_order/sales_order.js:1649 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:493 msgid "Select Items" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1489 +#: erpnext/selling/doctype/sales_order/sales_order.js:1507 msgid "Select Items based on Delivery Date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2969 +#: erpnext/public/js/controllers/transaction.js:2970 msgid "Select Items for Quality Inspection" msgstr "" #. Label of the select_items_to_manufacture_section (Section Break) field in #. DocType 'Production Plan' #: erpnext/manufacturing/doctype/production_plan/production_plan.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1298 +#: erpnext/selling/doctype/sales_order/sales_order.js:1307 msgid "Select Items to Manufacture" msgstr "" @@ -45946,7 +45989,7 @@ msgstr "" msgid "Select Loyalty Program" msgstr "" -#: erpnext/public/js/controllers/transaction.js:477 +#: erpnext/public/js/controllers/transaction.js:478 msgid "Select Payment Schedule" msgstr "" @@ -45954,7 +45997,7 @@ msgstr "" msgid "Select Possible Supplier" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1104 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1115 #: erpnext/stock/doctype/pick_list/pick_list.js:216 msgid "Select Quantity" msgstr "" @@ -45984,7 +46027,7 @@ msgstr "" msgid "Select Supplier Address" msgstr "" -#: erpnext/stock/doctype/batch/batch.js:148 +#: erpnext/stock/doctype/batch/batch.js:149 msgid "Select Target Warehouse" msgstr "" @@ -46037,7 +46080,7 @@ msgstr "" msgid "Select a company" msgstr "" -#: erpnext/stock/doctype/item/item.js:1066 +#: erpnext/stock/doctype/item/item.js:1147 msgid "Select an Item Group." msgstr "" @@ -46053,7 +46096,7 @@ msgstr "" msgid "Select an item from each set to be used in the Sales Order." msgstr "" -#: erpnext/stock/doctype/item/item.js:747 +#: erpnext/stock/doctype/item/item.js:828 msgid "Select at least one value from each of the attributes." msgstr "" @@ -46088,7 +46131,7 @@ msgstr "" msgid "Select the Default Workstation where the Operation will be performed. This will be fetched in BOMs and Work Orders." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1206 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1217 msgid "Select the Item to be manufactured." msgstr "" @@ -46306,7 +46349,7 @@ msgid "Send Emails to Suppliers" msgstr "" #. Label of the send_sms (Button) field in DocType 'SMS Center' -#: erpnext/public/js/controllers/transaction.js:696 +#: erpnext/public/js/controllers/transaction.js:697 #: erpnext/selling/doctype/sms_center/sms_center.json msgid "Send SMS" msgstr "" @@ -46442,7 +46485,7 @@ msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:74 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:114 -#: erpnext/public/js/controllers/transaction.js:2943 +#: erpnext/public/js/controllers/transaction.js:2944 #: erpnext/public/js/utils/serial_no_batch_selector.js:421 #: erpnext/selling/doctype/installation_note_item/installation_note_item.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -46462,7 +46505,7 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:450 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.js:38 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:60 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:401 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:410 #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json @@ -46547,7 +46590,7 @@ msgstr "" msgid "Serial No and Batch" msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.js:28 +#: erpnext/stock/doctype/stock_settings/stock_settings.js:34 msgid "Serial No and Batch Selector cannot be use when Use Serial / Batch Fields is enabled." msgstr "" @@ -46640,14 +46683,14 @@ msgstr "" #. Label of the serial_nos_and_batches (Section Break) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json -msgid "Serial Nos and Batches" +msgid "Serial Nos / Batches" msgstr "" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1958 msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2317 +#: erpnext/stock/stock_ledger.py:2327 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" @@ -46717,7 +46760,7 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:188 #: erpnext/stock/report/incorrect_serial_and_batch_bundle/incorrect_serial_and_batch_bundle.py:31 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:80 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:408 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:394 #: 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 @@ -46732,7 +46775,7 @@ msgstr "" msgid "Serial and Batch Bundle updated" msgstr "" -#: erpnext/controllers/stock_controller.py:196 +#: erpnext/controllers/stock_controller.py:201 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "" @@ -47101,12 +47144,12 @@ msgid "Service Stop Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:45 -#: erpnext/public/js/controllers/transaction.js:1779 +#: erpnext/public/js/controllers/transaction.js:1780 msgid "Service Stop Date cannot be after Service End Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:42 -#: erpnext/public/js/controllers/transaction.js:1776 +#: erpnext/public/js/controllers/transaction.js:1777 msgid "Service Stop Date cannot be before Service Start Date" msgstr "" @@ -47203,7 +47246,7 @@ msgstr "" msgid "Set Operating Cost Based On BOM Quantity" msgstr "" -#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:113 +#: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:124 msgid "Set Parent Row No in Items Table" msgstr "" @@ -47255,7 +47298,7 @@ msgstr "" msgid "Set Source Warehouse" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1609 +#: erpnext/selling/doctype/sales_order/sales_order.js:1627 msgid "Set Supplier" msgstr "" @@ -47285,7 +47328,7 @@ msgstr "" msgid "Set Valuation Rate for Rejected Materials" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:263 +#: erpnext/selling/doctype/sales_order/sales_order.js:264 msgid "Set Warehouse" msgstr "" @@ -47351,7 +47394,7 @@ msgstr "" msgid "Set targets Item Group-wise for this Sales Person." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1263 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1274 msgid "Set the Planned Start Date (an Estimated Date at which you want the Production to begin)" msgstr "" @@ -47447,7 +47490,7 @@ msgid "Setting up company" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1217 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1476 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1481 msgid "Setting {0} is required" msgstr "" @@ -48024,7 +48067,7 @@ msgstr "" msgid "Show Variant Attributes" msgstr "" -#: erpnext/stock/doctype/item/item.js:161 +#: erpnext/stock/doctype/item/item.js:185 msgid "Show Variants" msgstr "" @@ -48189,7 +48232,7 @@ msgstr "" msgid "Single Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:186 +#: erpnext/stock/doctype/item/item.js:210 msgid "Single Variant" msgstr "" @@ -48200,7 +48243,7 @@ msgstr "" #. Label of the skip_material_transfer (Check) field in DocType 'Work Order #. Operation' -#: erpnext/manufacturing/doctype/work_order/work_order.js:365 +#: erpnext/manufacturing/doctype/work_order/work_order.js:375 #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/doctype/workstation/workstation.js:454 msgid "Skip Material Transfer" @@ -48331,7 +48374,7 @@ msgstr "" msgid "Source Location" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1014 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1025 msgid "Source Manufacture Entry" msgstr "" @@ -48382,7 +48425,7 @@ msgstr "" #: 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:806 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:798 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "" @@ -48464,8 +48507,8 @@ msgid "Spending for Account {0} ({1}) between {2} and {3} has already exceeded t msgstr "" #: erpnext/assets/doctype/asset/asset.js:689 -#: erpnext/stock/doctype/batch/batch.js:102 -#: erpnext/stock/doctype/batch/batch.js:183 +#: erpnext/stock/doctype/batch/batch.js:103 +#: erpnext/stock/doctype/batch/batch.js:184 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "" @@ -48475,7 +48518,7 @@ msgstr "" msgid "Split Asset" msgstr "" -#: erpnext/stock/doctype/batch/batch.js:182 +#: erpnext/stock/doctype/batch/batch.js:183 msgid "Split Batch" msgstr "" @@ -48561,7 +48604,7 @@ msgstr "" msgid "Stale Days" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:147 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:154 msgid "Stale Days should start from 1." msgstr "" @@ -48663,7 +48706,7 @@ msgstr "" #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:56 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:17 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:81 -#: erpnext/public/js/financial_statements.js:419 +#: erpnext/public/js/financial_statements.js:422 msgid "Start Year" msgstr "" @@ -48819,7 +48862,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/quotation_item/quotation_item.json -#: erpnext/stock/doctype/item/item.js:108 +#: erpnext/stock/doctype/item/item.js:132 #: erpnext/stock/doctype/warehouse/warehouse.js:62 #: erpnext/stock/report/stock_balance/stock_balance.json #: erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py:107 @@ -48938,7 +48981,7 @@ msgstr "" msgid "Stock Entry has been already created against this Pick List" msgstr "" -#: erpnext/stock/doctype/batch/batch.js:136 +#: erpnext/stock/doctype/batch/batch.js:137 msgid "Stock Entry {0} created" msgstr "" @@ -48977,7 +49020,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:118 +#: erpnext/stock/doctype/item/item.js:142 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -49019,8 +49062,8 @@ msgstr "" msgid "Stock Ledgers won’t be reposted." msgstr "" -#: erpnext/stock/doctype/batch/batch.js:79 -#: erpnext/stock/doctype/item/item.js:586 +#: erpnext/stock/doctype/batch/batch.js:80 +#: erpnext/stock/doctype/item/item.js:667 msgid "Stock Levels" msgstr "" @@ -49065,6 +49108,7 @@ msgstr "" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/doctype/stock_settings/stock_settings.json +#: erpnext/stock/doctype/uom_category/uom_category.json #: erpnext/stock/doctype/warehouse_type/warehouse_type.json #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Stock Manager" @@ -49088,7 +49132,7 @@ msgstr "" #. Name of a report #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:128 +#: erpnext/stock/doctype/item/item.js:152 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -49177,15 +49221,15 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.js:289 #: erpnext/manufacturing/doctype/production_plan/production_plan.js:297 #: erpnext/manufacturing/doctype/production_plan/production_plan.js:303 -#: erpnext/manufacturing/doctype/work_order/work_order.js:927 -#: erpnext/manufacturing/doctype/work_order/work_order.js:936 -#: erpnext/manufacturing/doctype/work_order/work_order.js:943 +#: erpnext/manufacturing/doctype/work_order/work_order.js:938 +#: erpnext/manufacturing/doctype/work_order/work_order.js:947 +#: erpnext/manufacturing/doctype/work_order/work_order.js:954 #: erpnext/manufacturing/doctype/work_order/work_order_dashboard.py:14 #: erpnext/public/js/stock_reservation.js:12 -#: erpnext/selling/doctype/sales_order/sales_order.js:108 -#: erpnext/selling/doctype/sales_order/sales_order.js:123 -#: erpnext/selling/doctype/sales_order/sales_order.js:136 -#: erpnext/selling/doctype/sales_order/sales_order.js:257 +#: erpnext/selling/doctype/sales_order/sales_order.js:109 +#: erpnext/selling/doctype/sales_order/sales_order.js:124 +#: erpnext/selling/doctype/sales_order/sales_order.js:137 +#: erpnext/selling/doctype/sales_order/sales_order.js:258 #: erpnext/stock/doctype/pick_list/pick_list.js:152 #: erpnext/stock/doctype/pick_list/pick_list.js:167 #: erpnext/stock/doctype/pick_list/pick_list.js:172 @@ -49217,7 +49261,7 @@ msgstr "" #: erpnext/controllers/subcontracting_inward_controller.py:1018 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:2245 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2125 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2130 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1777 msgid "Stock Reservation Entries Created" msgstr "" @@ -49228,7 +49272,7 @@ msgstr "" #. Name of a DocType #: erpnext/public/js/stock_reservation.js:309 -#: erpnext/selling/doctype/sales_order/sales_order.js:474 +#: erpnext/selling/doctype/sales_order/sales_order.js:475 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:388 #: erpnext/stock/report/reserved_stock/reserved_stock.js:53 @@ -49285,6 +49329,7 @@ msgstr "" #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +#: erpnext/stock/doctype/item/item.js:414 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:675 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -49417,7 +49462,7 @@ msgid "Stock UOM Quantity" msgstr "" #: erpnext/public/js/stock_reservation.js:230 -#: erpnext/selling/doctype/sales_order/sales_order.js:458 +#: erpnext/selling/doctype/sales_order/sales_order.js:459 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:327 msgid "Stock Unreservation" msgstr "" @@ -49480,6 +49525,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json +#: erpnext/stock/doctype/uom_category/uom_category.json #: erpnext/stock/doctype/warehouse/warehouse.json #: erpnext/stock/doctype/warehouse_type/warehouse_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json @@ -49838,7 +49884,7 @@ msgstr "" #. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/work_order/work_order.json -#: erpnext/selling/doctype/sales_order/sales_order.js:1012 +#: erpnext/selling/doctype/sales_order/sales_order.js:1013 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json @@ -50381,8 +50427,8 @@ msgstr "" #: erpnext/regional/report/irs_1099/irs_1099.py:77 #: erpnext/selling/doctype/customer/customer.js:253 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json -#: erpnext/selling/doctype/sales_order/sales_order.js:196 -#: erpnext/selling/doctype/sales_order/sales_order.js:1667 +#: erpnext/selling/doctype/sales_order/sales_order.js:197 +#: erpnext/selling/doctype/sales_order/sales_order.js:1685 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/doctype/sms_center/sms_center.json #: erpnext/setup/workspace/home/home.json @@ -50701,7 +50747,7 @@ msgstr "" msgid "Supplier Quotation Item" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:497 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:502 msgid "Supplier Quotation {0} Created" msgstr "" @@ -50709,7 +50755,7 @@ msgstr "" msgid "Supplier Reference" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1691 +#: erpnext/selling/doctype/sales_order/sales_order.js:1709 msgid "Supplier Required" msgstr "" @@ -50803,7 +50849,7 @@ msgstr "" msgid "Supplier delivers to Customer" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.js:1690 +#: erpnext/selling/doctype/sales_order/sales_order.js:1708 msgid "Supplier is required for all selected Items" msgstr "" @@ -50844,8 +50890,8 @@ msgstr "" msgid "Supplies subject to the reverse charge provision" msgstr "" -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:315 -#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:380 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:317 +#: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:382 msgid "Supply" msgstr "" @@ -51110,7 +51156,7 @@ msgstr "" #: erpnext/stock/dashboard/item_dashboard.js:234 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/material_request_item/material_request_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:812 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:804 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "" @@ -51619,7 +51665,7 @@ msgstr "" #. Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:157 -#: erpnext/controllers/taxes_and_totals.py:1253 +#: erpnext/controllers/taxes_and_totals.py:1252 msgid "Taxable Amount" msgstr "" @@ -52242,10 +52288,14 @@ msgstr "" msgid "The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document." msgstr "" -#: erpnext/controllers/stock_controller.py:1312 +#: erpnext/controllers/stock_controller.py:1317 msgid "The batch {0} is already reserved in {1} {2}. So, cannot proceed with the {3} {4}, which is created against the {5} {6}." msgstr "" +#: erpnext/regional/report/vat_audit_report/vat_audit_report.py:43 +msgid "The company {0} is not in South Africa. VAT Audit Report is only available for companies in South Africa." +msgstr "" + #: erpnext/manufacturing/doctype/job_card/job_card.py:1319 msgid "The completed quantity {0} of an operation {1} cannot be greater than the completed quantity {2} of a previous operation {3}." msgstr "" @@ -52258,7 +52308,7 @@ msgstr "" msgid "The current POS opening entry is outdated. Please close it and create a new one." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.js:1211 +#: erpnext/manufacturing/doctype/work_order/work_order.js:1222 msgid "The default BOM for that item will be fetched by the system. You can also change the BOM." msgstr "" @@ -52319,7 +52369,7 @@ msgstr "" msgid "The following cancelled repost entries exist for {0}: