diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index 1cb95962709..496cf4599b3 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -6,64 +6,83 @@ "Current Assets": { "Accounts Receivable": { "Debtors": { - "account_type": "Receivable" + "account_type": "Receivable", + "account_category": "Trade Receivables" } }, "Bank Accounts": { "account_type": "Bank", - "is_group": 1 + "is_group": 1, + "account_category": "Cash and Cash Equivalents" }, "Cash In Hand": { "Cash": { - "account_type": "Cash" + "account_type": "Cash", + "account_category": "Cash and Cash Equivalents" }, - "account_type": "Cash" + "account_type": "Cash", + "account_category": "Cash and Cash Equivalents" }, "Loans and Advances (Assets)": { - "is_group": 1 + "is_group": 1, + "account_category": "Other Receivables" }, "Securities and Deposits": { - "Earnest Money": {} + "Earnest Money": { + "account_category": "Other Current Assets" + } }, "Stock Assets": { "Stock In Hand": { - "account_type": "Stock" + "account_type": "Stock", + "account_category": "Stock Assets" }, - "account_type": "Stock" + "account_type": "Stock", + "account_category": "Stock Assets" }, "Tax Assets": { - "is_group": 1 + "is_group": 1, + "account_category": "Other Current Assets" } }, "Fixed Assets": { "Capital Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Electronic Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Furniture and Fixtures": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Office Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Plants and Machineries": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Buildings": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Accumulated Depreciations": { - "account_type": "Accumulated Depreciation" + "account_type": "Accumulated Depreciation", + "account_category": "Tangible Assets" } }, "Investments": { - "is_group": 1 + "is_group": 1, + "account_category": "Long-term Investments" }, "Temporary Accounts": { "Temporary Opening": { - "account_type": "Temporary" + "account_type": "Temporary", + "account_category": "Other Non-current Assets" } }, "root_type": "Asset" @@ -72,55 +91,103 @@ "Direct Expenses": { "Stock Expenses": { "Cost of Goods Sold": { - "account_type": "Cost of Goods Sold" + "account_type": "Cost of Goods Sold", + "account_category": "Cost of Goods Sold" }, "Expenses Included In Valuation": { - "account_type": "Expenses Included In Valuation" + "account_type": "Expenses Included In Valuation", + "account_category": "Other Direct Costs" }, "Stock Adjustment": { - "account_type": "Stock Adjustment" + "account_type": "Stock Adjustment", + "account_category": "Other Direct Costs" } } }, "Indirect Expenses": { - "Administrative Expenses": {}, - "Commission on Sales": {}, + "Administrative Expenses": { + "account_category": "Operating Expenses" + }, + "Commission on Sales": { + "account_category": "Operating Expenses" + }, "Depreciation": { - "account_type": "Depreciation" + "account_type": "Depreciation", + "account_category": "Operating Expenses" + }, + "Entertainment Expenses": { + "account_category": "Operating Expenses" }, - "Entertainment Expenses": {}, "Freight and Forwarding Charges": { - "account_type": "Chargeable" + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Legal Expenses": { + "account_category": "Operating Expenses" + }, + "Marketing Expenses": { + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Miscellaneous Expenses": { + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Office Maintenance Expenses": { + "account_category": "Operating Expenses" + }, + "Office Rent": { + "account_category": "Operating Expenses" + }, + "Postal Expenses": { + "account_category": "Operating Expenses" + }, + "Print and Stationery": { + "account_category": "Operating Expenses" }, - "Legal Expenses": {}, - "Marketing Expenses": {}, - "Miscellaneous Expenses": {}, - "Office Maintenance Expenses": {}, - "Office Rent": {}, - "Postal Expenses": {}, - "Print and Stationery": {}, "Rounded Off": { - "account_type": "Round Off" + "account_type": "Round Off", + "account_category": "Operating Expenses" }, - "Salary": {}, - "Sales Expenses": {}, - "Telephone Expenses": {}, - "Travel Expenses": {}, - "Utility Expenses": {}, - "Write Off": {}, - "Exchange Gain/Loss": {}, - "Gain/Loss on Asset Disposal": {}, - "Impairment": {} + "Salary": { + "account_category": "Operating Expenses" + }, + "Sales Expenses": { + "account_category": "Operating Expenses" + }, + "Telephone Expenses": { + "account_category": "Operating Expenses" + }, + "Travel Expenses": { + "account_category": "Operating Expenses" + }, + "Utility Expenses": { + "account_category": "Operating Expenses" + }, + "Write Off": { + "account_category": "Operating Expenses" + }, + "Exchange Gain/Loss": { + "account_category": "Operating Expenses" + }, + "Gain/Loss on Asset Disposal": { + "account_category": "Other Operating Income" + }, + "Impairment": { + "account_category": "Operating Expenses" + } }, "root_type": "Expense" }, "Income": { "Direct Income": { "Sales": { - "account_type": "Income Account" + "account_type": "Income Account", + "account_category": "Revenue from Operations" }, "Service": { - "account_type": "Income Account" + "account_type": "Income Account", + "account_category": "Revenue from Operations" }, "account_type": "Income Account" }, @@ -132,31 +199,51 @@ }, "Source of Funds (Liabilities)": { "Capital Account": { - "Reserves and Surplus": {}, - "Shareholders Funds": {}, - "Revaluation Surplus": {} + "Reserves and Surplus": { + "account_category": "Reserves and Surplus" + }, + "Shareholders Funds": { + "account_category": "Share Capital" + }, + "Revaluation Surplus": { + "account_category": "Reserves and Surplus" + } }, "Current Liabilities": { "Accounts Payable": { "Creditors": { - "account_type": "Payable" + "account_type": "Payable", + "account_category": "Trade Payables" }, - "Payroll Payable": {} + "Payroll Payable": { + "account_category": "Other Payables" + } }, "Stock Liabilities": { "Stock Received But Not Billed": { - "account_type": "Stock Received But Not Billed" + "account_type": "Stock Received But Not Billed", + "account_category": "Trade Payables" } }, "Duties and Taxes": { "TDS": { - "account_type": "Tax" - } + "account_type": "Tax", + "account_category": "Current Tax Liabilities" + }, + "account_type": "Tax", + "is_group": 1, + "account_category": "Current Tax Liabilities" }, "Loans (Liabilities)": { - "Secured Loans": {}, - "Unsecured Loans": {}, - "Bank Overdraft Account": {} + "Secured Loans": { + "account_category": "Long-term Borrowings" + }, + "Unsecured Loans": { + "account_category": "Long-term Borrowings" + }, + "Bank Overdraft Account": { + "account_category": "Short-term Borrowings" + } } }, "root_type": "Liability" diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.json b/erpnext/accounts/doctype/accounting_period/accounting_period.json index 2fb69f6b97c..10c6b72ec88 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.json +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -20,7 +20,6 @@ { "fieldname": "period_name", "fieldtype": "Data", - "in_list_view": 1, "label": "Period Name", "reqd": 1, "unique": 1 @@ -79,7 +78,7 @@ } ], "links": [], - "modified": "2025-12-01 16:53:44.631299", + "modified": "2026-03-09 17:15:33.577217", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Period", diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.py b/erpnext/accounts/doctype/accounting_period/accounting_period.py index c4e51d813b2..16a29bf4591 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.py @@ -97,7 +97,7 @@ def validate_accounting_period_on_doc_save(doc, method=None): if doc.doctype == "Bank Clearance": return elif doc.doctype == "Asset": - if doc.is_existing_asset: + if doc.asset_type == "Existing Asset": return else: date = doc.available_for_use_date diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 874da99bdbf..ee734184452 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -205,7 +205,7 @@ "description": "Payment Terms from orders will be fetched into the invoices as is", "fieldname": "automatically_fetch_payment_terms", "fieldtype": "Check", - "label": "Automatically Fetch Payment Terms from Order" + "label": "Automatically Fetch Payment Terms from Order/Quotation" }, { "description": "The percentage you are allowed to bill more against the amount ordered. For example, if the order value is $100 for an item and tolerance is set as 10%, then you are allowed to bill up to $110 ", @@ -697,7 +697,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-04 17:15:38.609327", + "modified": "2026-02-27 01:04:09.415288", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 45e9c4eab85..0856f41bb09 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -140,6 +140,7 @@ { "fieldname": "company", "fieldtype": "Link", + "in_list_view": 1, "in_standard_filter": 1, "label": "Company", "oldfieldname": "company", @@ -181,7 +182,6 @@ "fieldname": "cheque_no", "fieldtype": "Data", "in_global_search": 1, - "in_list_view": 1, "label": "Reference Number", "mandatory_depends_on": "eval:doc.voucher_type == \"Bank Entry\"", "no_copy": 1, @@ -665,7 +665,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-02-16 16:06:10.468482", + "modified": "2026-03-09 17:15:26.569327", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 1adf6a5866e..afa508781d8 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -138,6 +138,7 @@ "fieldname": "posting_date", "fieldtype": "Date", "in_list_view": 1, + "in_standard_filter": 1, "label": "Posting Date", "reqd": 1 }, @@ -160,7 +161,6 @@ { "fieldname": "mode_of_payment", "fieldtype": "Link", - "in_list_view": 1, "label": "Mode of Payment", "options": "Mode of Payment" }, @@ -228,6 +228,7 @@ "fieldname": "paid_from", "fieldtype": "Link", "in_global_search": 1, + "in_list_view": 1, "label": "Account Paid From", "options": "Account", "print_hide": 1, @@ -252,6 +253,7 @@ "fieldname": "paid_to", "fieldtype": "Link", "in_global_search": 1, + "in_list_view": 1, "label": "Account Paid To", "options": "Account", "print_hide": 1, @@ -414,6 +416,7 @@ "depends_on": "eval:(doc.paid_from && doc.paid_to)", "fieldname": "reference_no", "fieldtype": "Data", + "in_standard_filter": 1, "label": "Cheque/Reference No", "mandatory_depends_on": "eval:(doc.paid_from_account_type == 'Bank' || doc.paid_to_account_type == 'Bank')" }, @@ -792,7 +795,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-02-03 16:08:49.800381", + "modified": "2026-03-09 17:15:30.453920", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index ac214fdac43..e214d2f4416 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -534,7 +534,7 @@ cur_frm.fields_dict["select_print_heading"].get_query = function (doc, cdt, cdn) cur_frm.set_query("wip_composite_asset", "items", function () { return { - filters: { is_composite_asset: 1, docstatus: 0 }, + filters: { asset_type: "Composite Asset", docstatus: 0 }, }; }); diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index f5da645b4b6..24c32fca451 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -266,6 +266,7 @@ { "fieldname": "due_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Due Date", "oldfieldname": "due_date", "oldfieldtype": "Date" @@ -319,6 +320,7 @@ "fieldname": "posting_date", "fieldtype": "Date", "in_list_view": 1, + "in_standard_filter": 1, "label": "Date", "oldfieldname": "posting_date", "oldfieldtype": "Date", @@ -397,6 +399,8 @@ { "fieldname": "bill_no", "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Supplier Invoice No", "oldfieldname": "bill_no", "oldfieldtype": "Data", @@ -1689,7 +1693,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2026-02-23 14:23:57.269770", + "modified": "2026-03-09 17:15:27.014131", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 2d6d9fd8c51..527c33225c6 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -733,9 +733,10 @@ class PurchaseInvoice(BuyingController): for item in self.get("items"): if item.purchase_receipt: frappe.throw( - _("Stock cannot be updated against Purchase Receipt {0}").format( - item.purchase_receipt - ) + _( + "Stock cannot be updated for Purchase Invoice {0} because a Purchase Receipt {1} has already been created for this transaction. Please disable the 'Update Stock' checkbox in the Purchase Invoice and save the invoice." + ).format(self.name, item.purchase_receipt), + title=_("Stock Update Not Allowed"), ) def validate_for_repost(self): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index da4d71ebd87..b67552788fa 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -381,6 +381,8 @@ "fieldtype": "Date", "hide_days": 1, "hide_seconds": 1, + "in_list_view": 1, + "in_standard_filter": 1, "label": "Date", "no_copy": 1, "oldfieldname": "posting_date", @@ -415,6 +417,7 @@ "fieldtype": "Date", "hide_days": 1, "hide_seconds": 1, + "in_list_view": 1, "label": "Payment Due Date", "no_copy": 1, "oldfieldname": "due_date", @@ -1639,6 +1642,7 @@ "fieldtype": "Select", "hide_days": 1, "hide_seconds": 1, + "in_list_view": 1, "in_standard_filter": 1, "label": "Status", "length": 30, @@ -2330,7 +2334,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-02-28 17:58:56.453076", + "modified": "2026-03-09 17:15:30.931929", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index d586d091707..fb32b4db364 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1451,6 +1451,9 @@ class SalesInvoice(SellingController): return asset_qty_map def process_asset_depreciation(self): + if self.is_internal_transfer(): + return + if (self.is_return and self.docstatus == 2) or (not self.is_return and self.docstatus == 1): self.depreciate_asset_on_sale() else: diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py index f122e41ef70..3a36e57ae60 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -8,6 +8,8 @@ import frappe from frappe import _ from frappe.contacts.doctype.address.address import get_default_address from frappe.model.document import Document +from frappe.query_builder import DocType +from frappe.query_builder.functions import IfNull from frappe.utils import cstr from frappe.utils.nestedset import get_root_of @@ -83,6 +85,8 @@ class TaxRule(Document): frappe.throw(_("Tax Template is mandatory.")) def validate_filters(self): + TaxRule = DocType("Tax Rule") + filters = { "tax_type": self.tax_type, "customer": self.customer, @@ -105,33 +109,34 @@ class TaxRule(Document): "company": self.company, } - conds = "" - for d in filters: - if conds: - conds += " and " - conds += f"""ifnull({d}, '') = {frappe.db.escape(cstr(filters[d]))}""" - - if self.from_date and self.to_date: - conds += f""" and ((from_date > '{self.from_date}' and from_date < '{self.to_date}') or - (to_date > '{self.from_date}' and to_date < '{self.to_date}') or - ('{self.from_date}' > from_date and '{self.from_date}' < to_date) or - ('{self.from_date}' = from_date and '{self.to_date}' = to_date))""" - - elif self.from_date and not self.to_date: - conds += f""" and to_date > '{self.from_date}'""" - - elif self.to_date and not self.from_date: - conds += f""" and from_date < '{self.to_date}'""" - - tax_rule = frappe.db.sql( - f"select name, priority \ - from `tabTax Rule` where {conds} and name != '{self.name}'", - as_dict=1, + query = ( + frappe.qb.from_(TaxRule).select(TaxRule.name, TaxRule.priority).where(TaxRule.name != self.name) ) - if tax_rule: - if tax_rule[0].priority == self.priority: - frappe.throw(_("Tax Rule Conflicts with {0}").format(tax_rule[0].name), ConflictingTaxRule) + for field, value in filters.items(): + query = query.where(IfNull(TaxRule[field], "") == cstr(value)) + + if self.from_date and self.to_date: + query = query.where( + ((TaxRule.from_date > self.from_date) & (TaxRule.from_date < self.to_date)) + | ((TaxRule.to_date > self.from_date) & (TaxRule.to_date < self.to_date)) + | ((self.from_date > TaxRule.from_date) & (self.from_date < TaxRule.to_date)) + | ((TaxRule.from_date == self.from_date) & (TaxRule.to_date == self.to_date)) + ) + + elif self.from_date: + query = query.where(TaxRule.to_date > self.from_date) + + elif self.to_date: + query = query.where(TaxRule.from_date < self.to_date) + + tax_rule = query.run(as_dict=True) + + if tax_rule and tax_rule[0].priority == self.priority: + frappe.throw( + _("Tax Rule Conflicts with {0}").format(tax_rule[0].name), + ConflictingTaxRule, + ) @frappe.whitelist() diff --git a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py index fad93e6fb70..212698765b1 100644 --- a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py +++ b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py @@ -4,6 +4,7 @@ import frappe from frappe import _ +from frappe.query_builder.functions import IfNull, Sum from frappe.utils import add_days, flt, formatdate @@ -75,210 +76,333 @@ def get_group_by_asset_category_data(filters): def get_asset_categories_for_grouped_by_category(filters): - condition = "" - if filters.get("asset_category"): - condition += " and a.asset_category = %(asset_category)s" - if filters.get("finance_book"): - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") + asset_capitalization_asset_item = frappe.qb.DocType("Asset Capitalization Asset Item") + asset_capitalization = frappe.qb.DocType("Asset Capitalization") - # nosemgrep - return frappe.db.sql( - f""" - SELECT a.asset_category, - ifnull(sum(case when a.purchase_date < %(from_date)s then - case when ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_as_on_from_date, - ifnull(sum(case when a.purchase_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end), 0) as value_of_new_purchase, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Sold" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_sold_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Scrapped" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_scrapped_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Capitalized" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_capitalized_asset - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - and not exists( - select 1 from `tabAsset Capitalization Asset Item` acai join `tabAsset Capitalization` ac on acai.parent=ac.name - where acai.asset = a.name - and ac.posting_date < %(from_date)s - and ac.docstatus=1 - ) - group by a.asset_category - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "asset_category": filters.get("asset_category"), - "finance_book": filters.get("finance_book"), - }, - as_dict=1, + disposal_in_period = ( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) ) + value_as_on_from_date = IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.purchase_date < filters.from_date) + & ((IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date)), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_as_on_from_date") + + value_of_new_purchase = IfNull( + Sum( + frappe.qb.terms.Case() + .when(asset.purchase_date >= filters.from_date, asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_new_purchase") + + value_of_sold_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Sold"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_sold_asset") + + value_of_scrapped_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Scrapped"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_scrapped_asset") + + value_of_capitalized_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Capitalized"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_capitalized_asset") + + capitalized_before_from_date = ( + frappe.qb.from_(asset_capitalization_asset_item) + .join(asset_capitalization) + .on(asset_capitalization_asset_item.parent == asset_capitalization.name) + .select(asset_capitalization_asset_item.asset) + .where(asset_capitalization.posting_date < filters.from_date) + .where(asset_capitalization.docstatus == 1) + ) + + query = ( + frappe.qb.from_(asset) + .select( + asset.asset_category, + value_as_on_from_date, + value_of_new_purchase, + value_of_sold_asset, + value_of_scrapped_asset, + value_of_capitalized_asset, + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(asset.name.notin(capitalized_before_from_date)) + .groupby(asset.asset_category) + ) + + if filters.get("asset_category"): + query = query.where(asset.asset_category == filters.get("asset_category")) + + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + query = query.where(asset.name.isin(assets_with_finance_book)) + + return query.run(as_dict=True) + def get_assets_for_grouped_by_category(filters): - condition = "" - if filters.get("asset_category"): - condition = f" and a.asset_category = '{filters.get('asset_category')}'" - finance_book_filter = "" - if filters.get("finance_book"): - finance_book_filter += " and ifnull(gle.finance_book, '')=%(finance_book)s" - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") + company = frappe.qb.DocType("Company") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") - # nosemgrep - return frappe.db.sql( - f""" - SELECT results.asset_category, - sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date, - sum(results.depreciation_eliminated_via_reversal) as depreciation_eliminated_via_reversal, - sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period, - sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period - from (SELECT a.asset_category, - ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then - gle.debit - else - 0 - end), 0) as accumulated_depreciation_as_on_from_date, - ifnull(sum(case when gle.posting_date <= %(to_date)s and ifnull(a.disposal_date, 0) = 0 then - gle.credit - else - 0 - end), 0) as depreciation_eliminated_via_reversal, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then - gle.debit - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s - and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then - gle.debit - else - 0 - end), 0) as depreciation_amount_during_the_period - from `tabGL Entry` gle - join `tabAsset` a on - gle.against_voucher = a.name - join `tabAsset Category Account` aca on - aca.parent = a.asset_category and aca.company_name = %(company)s - join `tabCompany` company on - company.name = %(company)s - where - a.docstatus=1 - and a.company=%(company)s - and a.purchase_date <= %(to_date)s - and gle.is_cancelled = 0 - and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) - {condition} {finance_book_filter} - group by a.asset_category - union - SELECT a.asset_category, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date < %(from_date)s then - 0 - else - a.opening_accumulated_depreciation - end), 0) as accumulated_depreciation_as_on_from_date, - 0 as depreciation_eliminated_via_reversal, - ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then - a.opening_accumulated_depreciation - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - 0 as depreciation_amount_during_the_period - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - group by a.asset_category) as results - group by results.asset_category - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "finance_book": filters.get("finance_book", ""), - }, - as_dict=1, + assets_with_finance_book = None + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + + from_gl_entries_query = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .join(company) + .on(company.name == filters.company) + .select( + asset.asset_category, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) & (IfNull(asset.disposal_date, 0) == 0), + gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_via_reversal"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) + & (gl_entry.posting_date <= asset.disposal_date), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date >= filters.from_date) + & (gl_entry.posting_date <= filters.to_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) + | (gl_entry.posting_date <= asset.disposal_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_amount_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.is_cancelled == 0) + .where( + gl_entry.account + == IfNull( + asset_category_account.depreciation_expense_account, + company.depreciation_expense_account, + ) + ) + .groupby(asset.asset_category) ) + from_opening_depreciation_query = ( + frappe.qb.from_(asset) + .select( + asset.asset_category, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) & (asset.disposal_date < filters.from_date), + 0, + ) + .else_(asset.opening_accumulated_depreciation) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.disposal_date >= filters.from_date) & (asset.disposal_date <= filters.to_date), + asset.opening_accumulated_depreciation, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .groupby(asset.asset_category) + ) + + if filters.get("asset_category"): + from_gl_entries_query = from_gl_entries_query.where( + asset.asset_category == filters.get("asset_category") + ) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.asset_category == filters.get("asset_category") + ) + + if assets_with_finance_book is not None: + from_gl_entries_query = from_gl_entries_query.where( + IfNull(gl_entry.finance_book, "") == filters.get("finance_book") + ).where(asset.name.isin(assets_with_finance_book)) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name.isin(assets_with_finance_book) + ) + + combined = {} + + for row in from_gl_entries_query.run(as_dict=True): + combined[row.asset_category] = { + "asset_category": row.asset_category, + "accumulated_depreciation_as_on_from_date": flt(row.accumulated_depreciation_as_on_from_date), + "depreciation_eliminated_via_reversal": flt(row.depreciation_eliminated_via_reversal), + "depreciation_eliminated_during_the_period": flt(row.depreciation_eliminated_during_the_period), + "depreciation_amount_during_the_period": flt(row.depreciation_amount_during_the_period), + } + + for row in from_opening_depreciation_query.run(as_dict=True): + if row.asset_category not in combined: + combined[row.asset_category] = { + "asset_category": row.asset_category, + "accumulated_depreciation_as_on_from_date": 0.0, + "depreciation_eliminated_via_reversal": 0.0, + "depreciation_eliminated_during_the_period": 0.0, + "depreciation_amount_during_the_period": 0.0, + } + + combined[row.asset_category]["accumulated_depreciation_as_on_from_date"] += flt( + row.accumulated_depreciation_as_on_from_date + ) + combined[row.asset_category]["depreciation_eliminated_during_the_period"] += flt( + row.depreciation_eliminated_during_the_period + ) + + return list(combined.values()) + def get_asset_value_adjustment_map_by_category(filters): - asset_value_adjustments = frappe.db.sql( - """ - SELECT - a.asset_category AS asset_category, - IFNULL( - SUM( - CASE - WHEN gle.posting_date < %(from_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(from_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_before_from_date, - IFNULL( - SUM( - CASE - WHEN gle.posting_date <= %(to_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(to_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_till_to_date + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") - FROM `tabGL Entry` gle - JOIN `tabAsset` a ON gle.against_voucher = a.name - JOIN `tabAsset Category Account` aca - ON aca.parent = a.asset_category - AND aca.company_name = %(company)s - WHERE gle.is_cancelled = 0 - AND a.docstatus = 1 - AND a.company = %(company)s - AND a.purchase_date <= %(to_date)s - AND gle.account = aca.fixed_asset_account - AND gle.is_opening = 'No' - GROUP BY a.asset_category - """, - {"from_date": filters.from_date, "to_date": filters.to_date, "company": filters.company}, - as_dict=1, - ) + asset_value_adjustments = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .select( + asset.asset_category.as_("asset_category"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.from_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_before_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.to_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_till_to_date"), + ) + .where(gl_entry.is_cancelled == 0) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.account == asset_category_account.fixed_asset_account) + .where(gl_entry.is_opening == "No") + .groupby(asset.asset_category) + ).run(as_dict=True) category_value_adjustment_map = {} @@ -346,210 +470,327 @@ def get_group_by_asset_data(filters): def get_asset_details_for_grouped_by_category(filters): - condition = "" - if filters.get("asset"): - condition += " and a.name = %(asset)s" - if filters.get("finance_book"): - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") + asset_capitalization_asset_item = frappe.qb.DocType("Asset Capitalization Asset Item") + asset_capitalization = frappe.qb.DocType("Asset Capitalization") - # nosemgrep - return frappe.db.sql( - f""" - SELECT a.name, a.asset_name, - ifnull(sum(case when a.purchase_date < %(from_date)s then - case when ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_as_on_from_date, - ifnull(sum(case when a.purchase_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end), 0) as value_of_new_purchase, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Sold" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_sold_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Scrapped" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_scrapped_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Capitalized" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_capitalized_asset - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - and not exists( - select 1 from `tabAsset Capitalization Asset Item` acai join `tabAsset Capitalization` ac on acai.parent=ac.name - where acai.asset = a.name - and ac.posting_date < %(from_date)s - and ac.docstatus=1 - ) - group by a.name - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "asset": filters.get("asset"), - "finance_book": filters.get("finance_book"), - }, - as_dict=1, + disposal_in_period = ( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) ) + capitalized_before_from_date = ( + frappe.qb.from_(asset_capitalization_asset_item) + .join(asset_capitalization) + .on(asset_capitalization_asset_item.parent == asset_capitalization.name) + .select(asset_capitalization_asset_item.asset) + .where(asset_capitalization.posting_date < filters.from_date) + .where(asset_capitalization.docstatus == 1) + ) + + query = ( + frappe.qb.from_(asset) + .select( + asset.name, + asset.asset_name, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.purchase_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(asset.purchase_date >= filters.from_date, asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_new_purchase"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Sold"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_sold_asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Scrapped"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_scrapped_asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + disposal_in_period & (asset.status == "Capitalized"), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_of_capitalized_asset"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(asset.name.notin(capitalized_before_from_date)) + .groupby(asset.name) + ) + + if filters.get("asset"): + query = query.where(asset.name == filters.get("asset")) + + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + query = query.where(asset.name.isin(assets_with_finance_book)) + + return query.run(as_dict=True) + def get_assets_for_grouped_by_asset(filters): - condition = "" - if filters.get("asset"): - condition = f" and a.name = '{filters.get('asset')}'" - finance_book_filter = "" - if filters.get("finance_book"): - finance_book_filter += " and ifnull(gle.finance_book, '')=%(finance_book)s" - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") + company = frappe.qb.DocType("Company") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") - # nosemgrep - return frappe.db.sql( - f""" - SELECT results.name as asset, - sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date, - sum(results.depreciation_eliminated_via_reversal) as depreciation_eliminated_via_reversal, - sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period, - sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period - from (SELECT a.name as name, - ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then - gle.debit - else - 0 - end), 0) as accumulated_depreciation_as_on_from_date, - ifnull(sum(case when gle.posting_date <= %(to_date)s and ifnull(a.disposal_date, 0) = 0 then - gle.credit - else - 0 - end), 0) as depreciation_eliminated_via_reversal, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then - gle.debit - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s - and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then - gle.debit - else - 0 - end), 0) as depreciation_amount_during_the_period - from `tabGL Entry` gle - join `tabAsset` a on - gle.against_voucher = a.name - join `tabAsset Category Account` aca on - aca.parent = a.asset_category and aca.company_name = %(company)s - join `tabCompany` company on - company.name = %(company)s - where - a.docstatus=1 - and a.company=%(company)s - and a.purchase_date <= %(to_date)s - and gle.is_cancelled = 0 - and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) - {finance_book_filter} {condition} - group by a.name - union - SELECT a.name as name, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date < %(from_date)s then - 0 - else - a.opening_accumulated_depreciation - end), 0) as accumulated_depreciation_as_on_from_date, - 0 as depreciation_as_on_from_date_credit, - ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then - a.opening_accumulated_depreciation - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - 0 as depreciation_amount_during_the_period - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - group by a.name) as results - group by results.name - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "finance_book": filters.get("finance_book", ""), - }, - as_dict=1, + assets_with_finance_book = None + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + + from_gl_entries_query = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .join(company) + .on(company.name == filters.company) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) & (IfNull(asset.disposal_date, 0) == 0), + gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_via_reversal"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) + & (gl_entry.posting_date <= asset.disposal_date), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date >= filters.from_date) + & (gl_entry.posting_date <= filters.to_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) + | (gl_entry.posting_date <= asset.disposal_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_amount_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.is_cancelled == 0) + .where( + gl_entry.account + == IfNull( + asset_category_account.depreciation_expense_account, + company.depreciation_expense_account, + ) + ) + .groupby(asset.name) ) + from_opening_depreciation_query = ( + frappe.qb.from_(asset) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) & (asset.disposal_date < filters.from_date), + 0, + ) + .else_(asset.opening_accumulated_depreciation) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.disposal_date >= filters.from_date) & (asset.disposal_date <= filters.to_date), + asset.opening_accumulated_depreciation, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .groupby(asset.name) + ) + + if filters.get("asset"): + from_gl_entries_query = from_gl_entries_query.where(asset.name == filters.get("asset")) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name == filters.get("asset") + ) + + if assets_with_finance_book is not None: + from_gl_entries_query = from_gl_entries_query.where( + IfNull(gl_entry.finance_book, "") == filters.get("finance_book") + ).where(asset.name.isin(assets_with_finance_book)) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name.isin(assets_with_finance_book) + ) + + combined = {} + + for row in from_gl_entries_query.run(as_dict=True): + combined[row.asset] = { + "asset": row.asset, + "accumulated_depreciation_as_on_from_date": flt(row.accumulated_depreciation_as_on_from_date), + "depreciation_eliminated_via_reversal": flt(row.depreciation_eliminated_via_reversal), + "depreciation_eliminated_during_the_period": flt(row.depreciation_eliminated_during_the_period), + "depreciation_amount_during_the_period": flt(row.depreciation_amount_during_the_period), + } + + for row in from_opening_depreciation_query.run(as_dict=True): + if row.asset not in combined: + combined[row.asset] = { + "asset": row.asset, + "accumulated_depreciation_as_on_from_date": 0.0, + "depreciation_eliminated_via_reversal": 0.0, + "depreciation_eliminated_during_the_period": 0.0, + "depreciation_amount_during_the_period": 0.0, + } + + combined[row.asset]["accumulated_depreciation_as_on_from_date"] += flt( + row.accumulated_depreciation_as_on_from_date + ) + combined[row.asset]["depreciation_eliminated_during_the_period"] += flt( + row.depreciation_eliminated_during_the_period + ) + + return list(combined.values()) + def get_asset_value_adjustment_map(filters): - asset_with_value_adjustments = frappe.db.sql( - """ - SELECT - a.name AS asset, - IFNULL( - SUM( - CASE - WHEN gle.posting_date < %(from_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(from_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_before_from_date, - IFNULL( - SUM( - CASE - WHEN gle.posting_date <= %(to_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(to_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_till_to_date + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") - FROM `tabGL Entry` gle - JOIN `tabAsset` a ON gle.against_voucher = a.name - JOIN `tabAsset Category Account` aca - ON aca.parent = a.asset_category - AND aca.company_name = %(company)s - WHERE gle.is_cancelled = 0 - AND a.docstatus = 1 - AND a.company = %(company)s - AND a.purchase_date <= %(to_date)s - AND gle.account = aca.fixed_asset_account - AND gle.is_opening = 'No' - GROUP BY a.name - """, - {"from_date": filters.from_date, "to_date": filters.to_date, "company": filters.company}, - as_dict=1, - ) + asset_with_value_adjustments = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.from_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_before_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.to_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_till_to_date"), + ) + .where(gl_entry.is_cancelled == 0) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.account == asset_category_account.fixed_asset_account) + .where(gl_entry.is_opening == "No") + .groupby(asset.name) + ).run(as_dict=True) asset_value_adjustment_map = {} diff --git a/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js b/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js index 4eadf342be8..fa651541696 100644 --- a/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js +++ b/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js @@ -37,6 +37,20 @@ function get_filters() { }); }, }, + { + fieldname: "party_type", + label: __("Party Type"), + fieldtype: "Link", + options: "Party Type", + width: 100, + }, + { + fieldname: "party", + label: __("Party"), + fieldtype: "Dynamic Link", + options: "party_type", + width: 100, + }, { fieldname: "voucher_no", label: __("Voucher No"), diff --git a/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py b/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py index 9d079eb9ebd..e28bd4edefe 100644 --- a/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py +++ b/erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py @@ -68,6 +68,12 @@ class General_Payment_Ledger_Comparison: if self.filters.period_end_date: filter_criterion.append(gle.posting_date.lte(self.filters.period_end_date)) + if self.filters.party_type: + filter_criterion.append(gle.party_type.eq(self.filters.party_type)) + + if self.filters.party: + filter_criterion.append(gle.party.eq(self.filters.party)) + if acc_type == "receivable": outstanding = (Sum(gle.debit) - Sum(gle.credit)).as_("outstanding") else: @@ -111,6 +117,12 @@ class General_Payment_Ledger_Comparison: if self.filters.period_end_date: filter_criterion.append(ple.posting_date.lte(self.filters.period_end_date)) + if self.filters.party_type: + filter_criterion.append(ple.party_type.eq(self.filters.party_type)) + + if self.filters.party: + filter_criterion.append(ple.party.eq(self.filters.party)) + self.account_types[acc_type].ple = ( qb.from_(ple) .select( diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 55ab95ac662..a53c2134e3f 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -649,7 +649,7 @@ class GrossProfitGenerator: new_row = row self.set_average_based_on_payment_term_portion(new_row, row, invoice_portion) else: - new_row.qty += flt(row.qty) + new_row.qty = flt((new_row.qty + row.qty), self.float_precision) self.set_average_based_on_payment_term_portion(new_row, row, invoice_portion, True) new_row = self.set_average_rate(new_row) @@ -659,11 +659,17 @@ class GrossProfitGenerator: if i == 0: new_row = row else: - new_row.qty += flt(row.qty) - new_row.buying_amount += flt(row.buying_amount, self.currency_precision) - new_row.base_amount += flt(row.base_amount, self.currency_precision) + new_row.qty = flt((new_row.qty + row.qty), self.float_precision) + new_row.buying_amount = flt( + (new_row.buying_amount + row.buying_amount), self.currency_precision + ) + new_row.base_amount = flt( + (new_row.base_amount + row.base_amount), self.currency_precision + ) if self.filters.get("group_by") == "Sales Person": - new_row.allocated_amount += flt(row.allocated_amount, self.currency_precision) + new_row.allocated_amount = flt( + (new_row.allocated_amount + row.allocated_amount), self.currency_precision + ) new_row = self.set_average_rate(new_row) self.grouped_data.append(new_row) diff --git a/erpnext/assets/dashboard_chart/category_wise_asset_value/category_wise_asset_value.json b/erpnext/assets/dashboard_chart/category_wise_asset_value/category_wise_asset_value.json index 78611da0036..60551560185 100644 --- a/erpnext/assets/dashboard_chart/category_wise_asset_value/category_wise_asset_value.json +++ b/erpnext/assets/dashboard_chart/category_wise_asset_value/category_wise_asset_value.json @@ -6,11 +6,11 @@ "docstatus": 0, "doctype": "Dashboard Chart", "dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_date\":\"frappe.datetime.add_months(frappe.datetime.nowdate(), -12)\",\"to_date\":\"frappe.datetime.nowdate()\"}", - "filters_json": "{\"status\":\"In Location\",\"group_by\":\"Asset Category\",\"is_existing_asset\":0}", + "filters_json": "{\"status\":\"In Location\",\"group_by\":\"Asset Category\",\"asset_type\":[\"!=\",\"Existing Asset\"]}", "idx": 0, "is_public": 1, "is_standard": 1, - "modified": "2020-10-28 23:16:16.939070", + "modified": "2026-02-03 15:48:13.407835", "modified_by": "Administrator", "module": "Assets", "name": "Category-wise Asset Value", diff --git a/erpnext/assets/dashboard_chart/location_wise_asset_value/location_wise_asset_value.json b/erpnext/assets/dashboard_chart/location_wise_asset_value/location_wise_asset_value.json index 848184cc148..3f89d987ba0 100644 --- a/erpnext/assets/dashboard_chart/location_wise_asset_value/location_wise_asset_value.json +++ b/erpnext/assets/dashboard_chart/location_wise_asset_value/location_wise_asset_value.json @@ -6,11 +6,11 @@ "docstatus": 0, "doctype": "Dashboard Chart", "dynamic_filters_json": "{\"company\":\"frappe.defaults.get_user_default(\\\"Company\\\")\",\"from_date\":\"frappe.datetime.add_months(frappe.datetime.nowdate(), -12)\",\"to_date\":\"frappe.datetime.nowdate()\"}", - "filters_json": "{\"status\":\"In Location\",\"group_by\":\"Location\",\"is_existing_asset\":0}", + "filters_json": "{\"status\":\"In Location\",\"group_by\":\"Location\",\"asset_type\":[\"!=\",\"Existing Asset\"]}", "idx": 0, "is_public": 1, "is_standard": 1, - "modified": "2020-10-28 23:16:07.883312", + "modified": "2026-02-03 15:48:13.407835", "modified_by": "Administrator", "module": "Assets", "name": "Location-wise Asset Value", diff --git a/erpnext/assets/dashboard_fixtures.py b/erpnext/assets/dashboard_fixtures.py index 3b1d14440cf..0fd6c019f36 100644 --- a/erpnext/assets/dashboard_fixtures.py +++ b/erpnext/assets/dashboard_fixtures.py @@ -100,7 +100,7 @@ def get_charts(fiscal_year, year_start_date, year_end_date): "company": company, "status": "In Location", "group_by": "Asset Category", - "is_existing_asset": 0, + "asset_type": ["!=", "Existing Asset"], } ), "type": "Donut", @@ -126,7 +126,12 @@ def get_charts(fiscal_year, year_start_date, year_end_date): "x_field": "location", "timeseries": 0, "filters_json": json.dumps( - {"company": company, "status": "In Location", "group_by": "Location", "is_existing_asset": 0} + { + "company": company, + "status": "In Location", + "group_by": "Location", + "asset_type": ["!=", "Existing Asset"], + } ), "type": "Donut", "doctype": "Dashboard Chart", diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 28add7cb35d..2a7703495bf 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -81,23 +81,79 @@ frappe.ui.form.on("Asset", { }, before_submit: function (frm) { - if (frm.doc.is_composite_asset && !frm.has_active_capitalization) { + if (frm.doc.asset_type == "Composite Asset" && !frm.has_active_capitalization) { frappe.throw(__("Please capitalize this asset before submitting.")); } }, - refresh: function (frm) { - frappe.ui.form.trigger("Asset", "is_existing_asset"); + refresh: async function (frm) { + frappe.ui.form.trigger("Asset", "asset_type"); frm.toggle_display("next_depreciation_date", frm.doc.docstatus < 1); + let has_create_buttons = false; if (frm.doc.docstatus == 1) { + if (["Submitted", "Partially Depreciated"].includes(frm.doc.status)) { + frm.add_custom_button( + __("Asset Value Adjustment"), + function () { + frm.trigger("create_asset_value_adjustment"); + }, + __("Create") + ); + + frm.add_custom_button( + __("Asset Repair"), + function () { + frm.trigger("create_asset_repair"); + }, + __("Create") + ); + has_create_buttons = true; + } + + if ( + !frm.doc.calculate_depreciation && + ["Submitted", "Partially Depreciated", "Fully Depreciated"].includes(frm.doc.status) + ) { + frm.add_custom_button( + __("Depreciation Entry"), + function () { + frm.trigger("make_journal_entry"); + }, + __("Create") + ); + has_create_buttons = true; + } + + if (has_create_buttons) { + frm.page.set_inner_btn_group_as_primary(__("Create")); + } + if (["Submitted", "Partially Depreciated", "Fully Depreciated"].includes(frm.doc.status)) { + if (frm.doc.maintenance_required && !frm.doc.maintenance_schedule) { + frm.add_custom_button( + __("Maintain Asset"), + function () { + frm.trigger("create_asset_maintenance"); + }, + __("Actions") + ); + } + + frm.add_custom_button( + __("Split Asset"), + function () { + frm.trigger("split_asset"); + }, + __("Actions") + ); + frm.add_custom_button( __("Transfer Asset"), function () { erpnext.asset.transfer_asset(frm); }, - __("Manage") + __("Actions") ); frm.add_custom_button( @@ -105,7 +161,7 @@ frappe.ui.form.on("Asset", { function () { erpnext.asset.scrap_asset(frm); }, - __("Manage") + __("Actions") ); frm.add_custom_button( @@ -113,15 +169,7 @@ frappe.ui.form.on("Asset", { function () { frm.trigger("sell_asset"); }, - __("Manage") - ); - - frm.add_custom_button( - __("Split Asset"), - function () { - frm.trigger("split_asset"); - }, - __("Manage") + __("Actions") ); } else if (frm.doc.status == "Scrapped") { frm.add_custom_button(__("Restore Asset"), function () { @@ -129,47 +177,9 @@ frappe.ui.form.on("Asset", { }).addClass("btn-primary"); } - if (frm.doc.maintenance_required && !frm.doc.maintenance_schedule) { + if (await frm.events.should_show_accounting_ledger(frm)) { frm.add_custom_button( - __("Maintain Asset"), - function () { - frm.trigger("create_asset_maintenance"); - }, - __("Manage") - ); - } - - if (["Submitted", "Partially Depreciated"].includes(frm.doc.status)) { - frm.add_custom_button( - __("Adjust Asset Value"), - function () { - frm.trigger("create_asset_value_adjustment"); - }, - __("Manage") - ); - - frm.add_custom_button( - __("Repair Asset"), - function () { - frm.trigger("create_asset_repair"); - }, - __("Manage") - ); - } - - if (!frm.doc.calculate_depreciation) { - frm.add_custom_button( - __("Create Depreciation Entry"), - function () { - frm.trigger("make_journal_entry"); - }, - __("Manage") - ); - } - - if (frm.doc.purchase_receipt || !frm.doc.is_existing_asset) { - frm.add_custom_button( - __("View General Ledger"), + __("Accounting Ledger"), function () { frappe.route_options = { voucher_no: frm.doc.name, @@ -179,7 +189,7 @@ frappe.ui.form.on("Asset", { }; frappe.set_route("query-report", "General Ledger"); }, - __("Manage") + __("View") ); } @@ -195,7 +205,7 @@ frappe.ui.form.on("Asset", { if (frm.doc.docstatus == 0) { frm.toggle_reqd("finance_books", frm.doc.calculate_depreciation); - if (frm.doc.is_composite_asset) { + if (frm.doc.asset_type == "Composite Asset") { frappe.call({ method: "erpnext.assets.doctype.asset.asset.has_active_capitalization", args: { @@ -217,6 +227,28 @@ frappe.ui.form.on("Asset", { } }, + should_show_accounting_ledger: async function (frm) { + if (["Capitalized"].includes(frm.doc.status)) { + return false; + } + + if ( + !frm.doc.purchase_receipt && + !frm.doc.purchase_invoice && + ["Existing Asset", "Composite Component"].includes(frm.doc.asset_type) + ) { + return false; + } + + const asset_category = await frappe.db.get_value( + "Asset Category", + frm.doc.asset_category, + "enable_cwip_accounting" + ); + + return !!asset_category.message?.enable_cwip_accounting; + }, + set_depr_posting_failure_alert: function (frm) { const alert = `
@@ -232,7 +264,8 @@ frappe.ui.form.on("Asset", { toggle_reference_doc: function (frm) { const is_submitted = frm.doc.docstatus === 1; - const is_special_asset = frm.doc.is_existing_asset || frm.doc.is_composite_asset; + const is_special_asset = + frm.doc.asset_type == "Existing Asset" || frm.doc.asset_type == "Composite Asset"; const clear_field = (field) => { if (frm.doc[field]) { @@ -508,18 +541,13 @@ frappe.ui.form.on("Asset", { }); }, - is_existing_asset: function (frm) { - frm.trigger("toggle_reference_doc"); - }, - - is_composite_asset: function (frm) { + asset_type: function (frm) { if (frm.doc.docstatus == 0) { - if (frm.doc.is_composite_asset) { + if (frm.doc.asset_type == "Composite Asset") { frm.set_value("net_purchase_amount", 0); } else { frm.set_df_property("net_purchase_amount", "read_only", 0); } - frm.trigger("toggle_reference_doc"); } }, diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 832f7c18e68..9fe15940970 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -9,20 +9,17 @@ "engine": "InnoDB", "field_order": [ "naming_series", + "company", "item_code", "item_name", "asset_name", - "asset_category", - "location", "image", "column_break_3", - "status", - "company", - "asset_owner", - "asset_owner_company", - "is_existing_asset", - "is_composite_asset", - "is_composite_component", + "location", + "asset_category", + "asset_type", + "maintenance_required", + "calculate_depreciation", "purchase_details_section", "purchase_receipt", "purchase_receipt_item", @@ -30,31 +27,44 @@ "purchase_invoice_item", "purchase_date", "available_for_use_date", + "disposal_date", "column_break_23", "net_purchase_amount", "purchase_amount", "asset_quantity", "additional_asset_cost", + "section_break_uiyd", + "column_break_bbwr", + "column_break_bfkm", "total_asset_cost", - "disposal_date", "depreciation_tab", - "calculate_depreciation", - "column_break_33", + "column_break_wqzi", "opening_accumulated_depreciation", - "opening_number_of_booked_depreciations", "is_fully_depreciated", + "column_break_33", + "opening_number_of_booked_depreciations", "section_break_36", "finance_books", "section_break_33", "depreciation_method", "value_after_depreciation", - "total_number_of_depreciations", - "column_break_24", "frequency_of_depreciation", + "column_break_24", "next_depreciation_date", + "total_number_of_depreciations", "depreciation_schedule_sb", "depreciation_schedule_view", - "insurance_details_tab", + "other_info_tab", + "accounting_dimensions_section", + "cost_center", + "column_break_rjyw", + "asset_owner_section", + "asset_owner", + "column_break_yeds", + "asset_owner_company", + "customer", + "supplier", + "insurance_section", "policy_number", "insurer", "insured_value", @@ -62,22 +72,17 @@ "insurance_start_date", "insurance_end_date", "comprehensive_insurance", - "other_info_tab", - "accounting_dimensions_section", - "cost_center", "section_break_jtou", + "status", "custodian", + "department", "default_finance_book", "depr_entry_posting_status", - "booked_fixed_asset", - "customer", - "supplier", "column_break_51", - "department", - "split_from", "journal_entry_for_scrap", + "split_from", "amended_from", - "maintenance_required", + "booked_fixed_asset", "connections_tab" ], "fields": [ @@ -106,13 +111,6 @@ "options": "Item", "reqd": 1 }, - { - "depends_on": "item_code", - "fetch_from": "item_code.item_name", - "fieldname": "item_name", - "fieldtype": "Read Only", - "label": "Item Name" - }, { "depends_on": "item_code", "fetch_from": "item_code.asset_category", @@ -171,6 +169,8 @@ { "fieldname": "company", "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Company", "options": "Company", "remember_last_selected_value": 1, @@ -207,7 +207,7 @@ "fieldname": "purchase_date", "fieldtype": "Date", "label": "Purchase Date", - "read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset", + "read_only_depends_on": "eval:doc.asset_type != \"Existing Asset\" && doc.asset_type != \"Composite Asset\"", "reqd": 1 }, { @@ -229,25 +229,18 @@ { "fieldname": "available_for_use_date", "fieldtype": "Date", - "label": "Available-for-use Date", - "mandatory_depends_on": "eval:(!(doc.is_composite_component || doc.is_composite_asset) || doc.docstatus==1)" + "label": "Available for Use Date", + "mandatory_depends_on": "eval:(!(doc.asset_type == \"Composite Component\" || doc.asset_type == \"Composite Asset\") || doc.docstatus==1)" }, { "default": "0", "fieldname": "calculate_depreciation", "fieldtype": "Check", "label": "Calculate Depreciation", - "read_only_depends_on": "eval:(doc.is_composite_asset && !doc.net_purchase_amount) || doc.is_composite_component" + "read_only_depends_on": "eval:(doc.asset_type == \"Composite Asset\" && !doc.net_purchase_amount) || doc.asset_type == \"Composite Component\"" }, { - "default": "0", - "depends_on": "eval:(!doc.is_composite_asset && !doc.is_composite_component)", - "fieldname": "is_existing_asset", - "fieldtype": "Check", - "label": "Is Existing Asset" - }, - { - "depends_on": "eval:(doc.is_existing_asset)", + "depends_on": "eval:(doc.asset_type == \"Existing Asset\")", "fieldname": "opening_accumulated_depreciation", "fieldtype": "Currency", "label": "Opening Accumulated Depreciation", @@ -257,18 +250,20 @@ "columns": 10, "fieldname": "finance_books", "fieldtype": "Table", + "label": "Finance Books", "options": "Asset Finance Book" }, { "fieldname": "section_break_33", "fieldtype": "Section Break", - "hidden": 1 + "hidden": 1, + "label": "Depreciation Details" }, { "fieldname": "depreciation_method", "fieldtype": "Select", "label": "Depreciation Method", - "options": "\nStraight Line\nDouble Declining Balance\nManual" + "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual" }, { "fieldname": "value_after_depreciation", @@ -295,6 +290,7 @@ { "fieldname": "next_depreciation_date", "fieldtype": "Date", + "hidden": 1, "label": "Next Depreciation Date", "no_copy": 1 }, @@ -364,7 +360,7 @@ "fieldtype": "Column Break" }, { - "depends_on": "eval:!doc.is_composite_asset && !doc.is_existing_asset", + "depends_on": "eval:doc.asset_type != \"Composite Asset\" && doc.asset_type != \"Existing Asset\"", "fieldname": "purchase_receipt", "fieldtype": "Link", "label": "Purchase Receipt", @@ -373,7 +369,7 @@ "print_hide": 1 }, { - "depends_on": "eval:!doc.is_composite_asset && !doc.is_existing_asset", + "depends_on": "eval:doc.asset_type != \"Composite Asset\" && doc.asset_type != \"Existing Asset\"", "fieldname": "purchase_invoice", "fieldtype": "Link", "label": "Purchase Invoice", @@ -399,7 +395,7 @@ "read_only": 1 }, { - "collapsible_depends_on": "is_existing_asset", + "collapsible_depends_on": "eval:doc.asset_type == \"Existing Asset\"", "fieldname": "purchase_details_section", "fieldtype": "Section Break", "label": "Purchase Details" @@ -413,10 +409,9 @@ "fieldtype": "Column Break" }, { - "depends_on": "calculate_depreciation", + "depends_on": "eval: doc.calculate_depreciation", "fieldname": "section_break_36", - "fieldtype": "Section Break", - "label": "Finance Books" + "fieldtype": "Section Break" }, { "fieldname": "split_from", @@ -455,18 +450,11 @@ }, { "default": "0", - "depends_on": "eval:(doc.is_existing_asset)", "fieldname": "is_fully_depreciated", "fieldtype": "Check", + "hidden": 1, "label": "Is Fully Depreciated" }, - { - "default": "0", - "depends_on": "eval:(!doc.is_existing_asset && !doc.is_composite_component)", - "fieldname": "is_composite_asset", - "fieldtype": "Check", - "label": "Is Composite Asset" - }, { "depends_on": "eval:doc.docstatus > 0", "fieldname": "total_asset_cost", @@ -496,7 +484,7 @@ "read_only": 1 }, { - "depends_on": "eval:(doc.is_existing_asset)", + "depends_on": "eval:(doc.asset_type == \"Existing Asset\")", "fieldname": "opening_number_of_booked_depreciations", "fieldtype": "Int", "label": "Opening Number of Booked Depreciations" @@ -513,15 +501,10 @@ "hidden": 1, "label": "Purchase Invoice Item" }, - { - "fieldname": "insurance_details_tab", - "fieldtype": "Tab Break", - "label": "Insurance" - }, { "fieldname": "other_info_tab", "fieldtype": "Tab Break", - "label": "Other Info" + "label": "More Info" }, { "fieldname": "connections_tab", @@ -530,6 +513,7 @@ "show_dashboard": 1 }, { + "depends_on": "eval: doc.calculate_depreciation || doc.asset_type == \"Existing Asset\"", "fieldname": "depreciation_tab", "fieldtype": "Tab Break", "label": "Depreciation" @@ -544,20 +528,61 @@ "fieldtype": "Section Break", "label": "Additional Info" }, - { - "default": "0", - "depends_on": "eval:(!doc.is_existing_asset && !doc.is_composite_asset)", - "fieldname": "is_composite_component", - "fieldtype": "Check", - "label": "Is Composite Component" - }, { "fieldname": "net_purchase_amount", "fieldtype": "Currency", "label": "Net Purchase Amount", - "mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)", + "mandatory_depends_on": "eval:(doc.asset_type != \"Composite Asset\" || doc.docstatus==1)", "options": "Company:company:default_currency", - "read_only_depends_on": "eval: doc.is_composite_asset" + "read_only_depends_on": "eval: doc.asset_type == \"Composite Asset\"" + }, + { + "fieldname": "asset_type", + "fieldtype": "Select", + "label": "Asset Type", + "options": "\nExisting Asset\nComposite Asset\nComposite Component" + }, + { + "fieldname": "column_break_wqzi", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_rjyw", + "fieldtype": "Column Break" + }, + { + "fieldname": "insurance_section", + "fieldtype": "Section Break", + "label": "Insurance" + }, + { + "fieldname": "section_break_uiyd", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_bbwr", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_bfkm", + "fieldtype": "Column Break" + }, + { + "fetch_from": "item_code.item_name", + "fetch_if_empty": 1, + "fieldname": "item_name", + "fieldtype": "Read Only", + "hidden": 1, + "label": "Item Name" + }, + { + "fieldname": "asset_owner_section", + "fieldtype": "Section Break", + "label": "Ownership" + }, + { + "fieldname": "column_break_yeds", + "fieldtype": "Column Break" } ], "idx": 72, @@ -601,7 +626,7 @@ "link_fieldname": "target_asset" } ], - "modified": "2025-12-18 16:36:40.904246", + "modified": "2026-03-09 17:15:32.819896", "modified_by": "Administrator", "module": "Assets", "name": "Asset", diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 42c8e9f9dfa..95011c8bba1 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -56,6 +56,7 @@ class Asset(AccountsController): asset_owner: DF.Literal["", "Company", "Supplier", "Customer"] asset_owner_company: DF.Link | None asset_quantity: DF.Int + asset_type: DF.Literal["", "Existing Asset", "Composite Asset", "Composite Component"] available_for_use_date: DF.Date | None booked_fixed_asset: DF.Check calculate_depreciation: DF.Check @@ -67,7 +68,9 @@ class Asset(AccountsController): default_finance_book: DF.Link | None department: DF.Link | None depr_entry_posting_status: DF.Literal["", "Successful", "Failed"] - depreciation_method: DF.Literal["", "Straight Line", "Double Declining Balance", "Manual"] + depreciation_method: DF.Literal[ + "", "Straight Line", "Double Declining Balance", "Written Down Value", "Manual" + ] disposal_date: DF.Date | None finance_books: DF.Table[AssetFinanceBook] frequency_of_depreciation: DF.Int @@ -76,9 +79,6 @@ class Asset(AccountsController): insurance_start_date: DF.Date | None insured_value: DF.Data | None insurer: DF.Data | None - is_composite_asset: DF.Check - is_composite_component: DF.Check - is_existing_asset: DF.Check is_fully_depreciated: DF.Check item_code: DF.Link item_name: DF.ReadOnly | None @@ -243,7 +243,7 @@ class Asset(AccountsController): self.set_total_booked_depreciations() def before_submit(self): - if self.is_composite_asset and not has_active_capitalization(self.name): + if self.asset_type == "Composite Asset" and not has_active_capitalization(self.name): if self.split_from and has_active_capitalization(self.split_from): return frappe.throw(_("Please capitalize this asset before submitting.")) @@ -252,7 +252,11 @@ class Asset(AccountsController): self.validate_in_use_date() self.make_asset_movement() self.reload() - if not self.booked_fixed_asset and not self.is_composite_component and self.validate_make_gl_entry(): + if ( + not self.booked_fixed_asset + and self.asset_type != "Composite Component" + and self.validate_make_gl_entry() + ): self.make_gl_entries() if self.calculate_depreciation and not self.split_from: convert_draft_asset_depr_schedules_into_active(self) @@ -267,7 +271,7 @@ class Asset(AccountsController): cancel_asset_depr_schedules(self) self.set_status() self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry") - if not self.is_composite_component: + if self.asset_type != "Composite Component": make_reverse_gl_entries(voucher_type="Asset", voucher_no=self.name) self.db_set("booked_fixed_asset", 0) add_asset_activity(self.name, _("Asset cancelled")) @@ -285,7 +289,7 @@ class Asset(AccountsController): add_asset_activity(self.name, _("Asset deleted")) def set_purchase_doc_row_item(self): - if self.is_existing_asset or self.is_composite_asset: + if self.asset_type == "Existing Asset" or self.asset_type == "Composite Asset": return self.purchase_amount = self.net_purchase_amount @@ -328,7 +332,7 @@ class Asset(AccountsController): ) ) - if self.is_existing_asset and self.purchase_invoice: + if self.asset_type == "Existing Asset" and self.purchase_invoice: frappe.throw(_("Purchase Invoice cannot be made against an existing asset {0}").format(self.name)) def validate_item(self): @@ -374,7 +378,7 @@ class Asset(AccountsController): ) def validate_in_use_date(self): - if not self.available_for_use_date and not self.is_composite_component: + if not self.available_for_use_date and self.asset_type != "Composite Component": frappe.throw(_("Available for use date is required")) for d in self.finance_books: @@ -442,13 +446,13 @@ class Asset(AccountsController): if not self.asset_category: self.asset_category = frappe.get_cached_value("Item", self.item_code, "asset_category") - if not flt(self.net_purchase_amount) and not self.is_composite_asset: + if not flt(self.net_purchase_amount) and self.asset_type != "Composite Asset": frappe.throw(_("Net Purchase Amount is mandatory"), frappe.MandatoryError) if is_cwip_accounting_enabled(self.asset_category): if ( - not self.is_existing_asset - and not self.is_composite_asset + not self.asset_type == "Existing Asset" + and not self.asset_type == "Composite Asset" and not self.purchase_receipt and not self.purchase_invoice ): @@ -477,7 +481,7 @@ class Asset(AccountsController): if self.is_fully_depreciated: frappe.throw(_("Depreciation cannot be calculated for fully depreciated assets")) - if self.is_existing_asset: + if self.asset_type == "Existing Asset": return if self.available_for_use_date and getdate(self.available_for_use_date) < getdate(self.purchase_date): @@ -549,7 +553,7 @@ class Asset(AccountsController): ) def validate_gross_and_purchase_amount(self): - if self.is_existing_asset: + if self.asset_type == "Existing Asset": return if self.net_purchase_amount and self.net_purchase_amount != self.purchase_amount: @@ -617,7 +621,7 @@ class Asset(AccountsController): self.validate_depreciation_start_date(row) self.validate_total_number_of_depreciations_and_frequency(row) - if not self.is_existing_asset: + if self.asset_type != "Existing Asset": self.opening_accumulated_depreciation = 0 self.opening_number_of_booked_depreciations = 0 else: @@ -770,7 +774,7 @@ class Asset(AccountsController): def get_status(self): """Returns status based on whether it is draft, submitted, scrapped or depreciated""" if self.docstatus == 0: - if self.is_composite_asset: + if self.asset_type == "Composite Asset": status = "Work In Progress" else: status = "Draft" @@ -843,7 +847,7 @@ class Asset(AccountsController): return records def validate_make_gl_entry(self): - if self.is_composite_asset: + if self.asset_type == "Composite Asset": return True purchase_document = self.get_purchase_document() @@ -924,7 +928,7 @@ class Asset(AccountsController): purchase_document = self.get_purchase_document() fixed_asset_account, cwip_account = self.get_fixed_asset_account(), self.get_cwip_account() - if (self.is_composite_asset or (purchase_document and self.purchase_amount)) and getdate( + if (self.asset_type == "Composite Asset" or (purchase_document and self.purchase_amount)) and getdate( self.available_for_use_date ) <= getdate(): gl_entries.append( @@ -964,7 +968,7 @@ class Asset(AccountsController): self.db_set("booked_fixed_asset", 1) def check_asset_capitalization_gl_entries(self): - if self.is_composite_asset: + if self.asset_type == "Composite Asset": result = frappe.db.get_value( "Asset Capitalization", {"target_asset": self.name, "docstatus": 1}, @@ -1395,7 +1399,7 @@ def process_asset_split(existing_asset, split_qty, splitted_asset=None, is_new_a def set_split_asset_values(asset_doc, scaling_factor, split_qty, existing_asset, is_new_asset): asset_doc.net_purchase_amount = existing_asset.net_purchase_amount * scaling_factor - asset_doc.purchase_amount = existing_asset.net_purchase_amount + asset_doc.purchase_amount = existing_asset.net_purchase_amount * scaling_factor asset_doc.additional_asset_cost = existing_asset.additional_asset_cost * scaling_factor asset_doc.total_asset_cost = asset_doc.net_purchase_amount + asset_doc.additional_asset_cost asset_doc.opening_accumulated_depreciation = ( diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 1e0cfedfbb9..832e3736e7d 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -786,10 +786,14 @@ def get_disposal_account_and_cost_center(company): @frappe.whitelist() -def get_value_after_depreciation_on_disposal_date(asset, disposal_date, finance_book=None): +def get_value_after_depreciation_on_disposal_date( + asset: str, + disposal_date: str, + finance_book: str | None = None, +) -> float: asset_doc = frappe.get_doc("Asset", asset) - if asset_doc.is_composite_component: + if asset_doc.asset_type == "Composite Component": validate_disposal_date(asset_doc.purchase_date, getdate(disposal_date), "purchase") return flt(asset_doc.value_after_depreciation) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 6733a7f89e3..6440fcfad62 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -71,16 +71,16 @@ class TestAsset(AssetSetup): self.assertRaises(frappe.MandatoryError, asset.save) def test_pr_or_pi_mandatory_if_not_existing_asset(self): - """Tests if either PI or PR is present if CWIP is enabled and is_existing_asset=0.""" + """Tests if either PI or PR is present if CWIP is enabled and asset_type == Existing Asset.""" asset = create_asset(item_code="Macbook Pro", do_not_save=1) - asset.is_existing_asset = 0 + asset.asset_type = "" self.assertRaises(frappe.ValidationError, asset.save) def test_available_for_use_date_is_after_purchase_date(self): asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, do_not_save=1) - asset.is_existing_asset = 0 + asset.asset_type = "" asset.purchase_date = getdate("2021-10-10") asset.available_for_use_date = getdate("2021-10-1") @@ -183,7 +183,7 @@ class TestAsset(AssetSetup): asset.submit() def test_is_fixed_asset_set(self): - asset = create_asset(is_existing_asset=1) + asset = create_asset(asset_type="Existing Asset") doc = frappe.new_doc("Purchase Invoice") doc.company = "_Test Company" doc.supplier = "_Test Supplier" @@ -710,7 +710,7 @@ class TestAsset(AssetSetup): # create an asset asset = create_asset( item_code="Macbook Pro", - is_existing_asset=1, + asset_type="Existing Asset", calculate_depreciation=1, available_for_use_date=purchase_date, purchase_date=purchase_date, @@ -890,7 +890,7 @@ class TestDepreciationMethods(AssetSetup): asset = create_asset( calculate_depreciation=1, available_for_use_date="2030-06-06", - is_existing_asset=1, + asset_type="Existing Asset", opening_number_of_booked_depreciations=2, opening_accumulated_depreciation=47178.08, expected_value_after_useful_life=10000, @@ -939,7 +939,7 @@ class TestDepreciationMethods(AssetSetup): asset = create_asset( calculate_depreciation=1, available_for_use_date="2030-01-01", - is_existing_asset=1, + asset_type="Existing Asset", depreciation_method="Double Declining Balance", opening_number_of_booked_depreciations=1, opening_accumulated_depreciation=50000, @@ -1680,7 +1680,7 @@ class TestDepreciationBasics(AssetSetup): self.assertEqual(asset.finance_books[0].value_after_depreciation, 100000.0) def test_asset_cost_center(self): - asset = create_asset(is_existing_asset=1, do_not_save=1) + asset = create_asset(asset_type="Existing Asset", do_not_save=1) asset.cost_center = "Main - WP" self.assertRaises(frappe.ValidationError, asset.submit) @@ -1717,7 +1717,7 @@ class TestDepreciationBasics(AssetSetup): def test_manual_depreciation_for_existing_asset(self): asset = create_asset( item_code="Macbook Pro", - is_existing_asset=1, + asset_type="Existing Asset", purchase_date="2020-01-30", available_for_use_date="2020-01-30", submit=1, @@ -1843,7 +1843,7 @@ class TestDepreciationBasics(AssetSetup): # Create composite asset wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset for Split", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, asset_quantity=2, # Set quantity > 1 to allow splitting @@ -1937,9 +1937,7 @@ def create_asset(**args): "available_for_use_date": args.available_for_use_date or "2020-06-06", "location": args.location or "Test Location", "asset_owner": args.asset_owner or "Company", - "is_existing_asset": args.is_existing_asset or 1, - "is_composite_asset": args.is_composite_asset or 0, - "is_composite_component": args.is_composite_component or 0, + "asset_type": args.asset_type or "Existing Asset", "asset_quantity": args.get("asset_quantity") or 1, "depr_entry_posting_status": args.depr_entry_posting_status or "", } @@ -1961,7 +1959,7 @@ def create_asset(**args): }, ) - if asset.is_composite_asset: + if asset.asset_type == "Composite Asset": asset.net_purchase_amount = 0 asset.purchase_amount = 0 diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index 3857f6411f5..e3a80db6610 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -16,11 +16,9 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s refresh() { this.show_general_ledger(); + erpnext.toggle_serial_batch_fields(this.frm); - if ( - (this.frm.doc.stock_items && this.frm.doc.stock_items.length) || - !this.frm.doc.target_is_fixed_asset - ) { + if (this.frm.doc.stock_items && this.frm.doc.stock_items.length) { this.show_stock_ledger(); } @@ -41,7 +39,7 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s me.frm.set_query("target_asset", function () { return { - filters: { is_composite_asset: 1, docstatus: 0 }, + filters: { asset_type: "Composite Asset", docstatus: 0 }, }; }); @@ -240,10 +238,6 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s this.calculate_totals(); } - target_qty() { - this.calculate_totals(); - } - rate() { this.calculate_totals(); } @@ -485,10 +479,7 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s me.frm.doc.stock_items_total + me.frm.doc.asset_items_total + me.frm.doc.service_items_total; me.frm.doc.total_value = flt(me.frm.doc.total_value, precision("total_value")); - me.frm.doc.target_qty = flt(me.frm.doc.target_qty, precision("target_qty")); - me.frm.doc.target_incoming_rate = me.frm.doc.target_qty - ? me.frm.doc.total_value / flt(me.frm.doc.target_qty) - : me.frm.doc.total_value; + me.frm.doc.target_incoming_rate = me.frm.doc.total_value; me.frm.refresh_fields(); } diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json index 57642e41472..0fc6b454051 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json @@ -9,30 +9,33 @@ "field_order": [ "title", "naming_series", + "company", "target_asset", "target_asset_name", - "target_item_code", - "finance_book", - "target_qty", "column_break_9", - "company", + "finance_book", "posting_date", "posting_time", "set_posting_time", - "target_batch_no", - "target_serial_no", + "target_item_code", "amended_from", - "target_is_fixed_asset", - "target_has_batch_no", - "target_has_serial_no", "section_break_16", "stock_items", + "section_break_urtz", + "column_break_gqep", + "column_break_yvlx", "stock_items_total", "section_break_26", "asset_items", + "section_break_arbh", + "column_break_boeu", + "column_break_qecy", "asset_items_total", "service_expenses_section", "service_items", + "section_break_ptna", + "column_break_szvh", + "column_break_katv", "service_items_total", "totals_section", "total_value", @@ -55,20 +58,12 @@ "depends_on": "eval:(doc.target_item_code && !doc.__islocal)", "fieldname": "target_item_code", "fieldtype": "Link", + "hidden": 1, "in_standard_filter": 1, "label": "Target Item Code", "options": "Item", "read_only": 1 }, - { - "default": "0", - "fetch_from": "target_item_code.is_fixed_asset", - "fieldname": "target_is_fixed_asset", - "fieldtype": "Check", - "hidden": 1, - "label": "Target Is Fixed Asset", - "read_only": 1 - }, { "fieldname": "target_asset", "fieldtype": "Link", @@ -143,6 +138,7 @@ "depends_on": "eval:doc.docstatus == 0 || (doc.stock_items && doc.stock_items.length)", "fieldname": "section_break_16", "fieldtype": "Section Break", + "hide_border": 1, "label": "Consumed Stock Items" }, { @@ -151,49 +147,11 @@ "label": "Stock Items", "options": "Asset Capitalization Stock Item" }, - { - "depends_on": "target_has_batch_no", - "fieldname": "target_batch_no", - "fieldtype": "Link", - "label": "Target Batch No", - "options": "Batch" - }, - { - "default": "1", - "fieldname": "target_qty", - "fieldtype": "Float", - "hidden": 1, - "label": "Target Qty", - "read_only": 1 - }, - { - "default": "0", - "fetch_from": "target_item_code.has_batch_no", - "fieldname": "target_has_batch_no", - "fieldtype": "Check", - "hidden": 1, - "label": "Target Has Batch No", - "read_only": 1 - }, - { - "default": "0", - "fetch_from": "target_item_code.has_serial_no", - "fieldname": "target_has_serial_no", - "fieldtype": "Check", - "hidden": 1, - "label": "Target Has Serial No", - "read_only": 1 - }, - { - "depends_on": "target_has_serial_no", - "fieldname": "target_serial_no", - "fieldtype": "Small Text", - "label": "Target Serial No" - }, { "depends_on": "eval:doc.docstatus == 0 || (doc.asset_items && doc.asset_items.length)", "fieldname": "section_break_26", "fieldtype": "Section Break", + "hide_border": 1, "label": "Consumed Assets" }, { @@ -203,6 +161,7 @@ "options": "Asset Capitalization Asset Item" }, { + "depends_on": "eval: doc.stock_items_total", "fieldname": "stock_items_total", "fieldtype": "Currency", "label": "Consumed Stock Total Value", @@ -210,6 +169,7 @@ "read_only": 1 }, { + "depends_on": "eval: doc.asset_items_total", "fieldname": "asset_items_total", "fieldtype": "Currency", "label": "Consumed Asset Total Value", @@ -226,6 +186,7 @@ "depends_on": "eval:doc.docstatus == 0 || (doc.service_items && doc.service_items.length)", "fieldname": "service_expenses_section", "fieldtype": "Section Break", + "hide_border": 1, "label": "Service Expenses" }, { @@ -235,6 +196,7 @@ "options": "Asset Capitalization Service Item" }, { + "depends_on": "eval: doc.service_items_total", "fieldname": "service_items_total", "fieldtype": "Currency", "label": "Service Expense Total Amount", @@ -277,10 +239,10 @@ "options": "Cost Center" }, { - "fieldname": "project", - "fieldtype": "Link", - "label": "Project", - "options": "Project" + "fieldname": "project", + "fieldtype": "Link", + "label": "Project", + "options": "Project" }, { "fieldname": "dimension_col_break", @@ -292,12 +254,48 @@ "label": "Target Fixed Asset Account", "options": "Account", "read_only": 1 + }, + { + "fieldname": "section_break_urtz", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_gqep", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_yvlx", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_arbh", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_boeu", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_qecy", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_ptna", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_szvh", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_katv", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-05-20 15:15:12.110035", + "modified": "2026-02-06 01:52:41.890713", "modified_by": "Administrator", "module": "Assets", "name": "Asset Capitalization", diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py index 7b9369d7390..0894bad2d3d 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py @@ -39,9 +39,6 @@ force_fields = [ "target_asset_name", "item_name", "asset_name", - "target_is_fixed_asset", - "target_has_serial_no", - "target_has_batch_no", "stock_uom", "fixed_asset_account", "valuation_rate", @@ -76,6 +73,7 @@ class AssetCapitalization(StockController): naming_series: DF.Literal["ACC-ASC-.YYYY.-"] posting_date: DF.Date posting_time: DF.Time + project: DF.Link | None service_items: DF.Table[AssetCapitalizationServiceItem] service_items_total: DF.Currency set_posting_time: DF.Check @@ -83,15 +81,9 @@ class AssetCapitalization(StockController): stock_items_total: DF.Currency target_asset: DF.Link | None target_asset_name: DF.Data | None - target_batch_no: DF.Link | None target_fixed_asset_account: DF.Link | None - target_has_batch_no: DF.Check - target_has_serial_no: DF.Check target_incoming_rate: DF.Currency - target_is_fixed_asset: DF.Check target_item_code: DF.Link | None - target_qty: DF.Float - target_serial_no: DF.SmallText | None title: DF.Data | None total_value: DF.Currency # end: auto-generated types @@ -190,22 +182,13 @@ class AssetCapitalization(StockController): if not target_item.is_fixed_asset: frappe.throw(_("Target Item {0} must be a Fixed Asset item").format(target_item.name)) - if target_item.is_fixed_asset: - self.target_qty = 1 - if flt(self.target_qty) <= 0: - frappe.throw(_("Target Qty must be a positive number")) - if not target_item.has_batch_no: - self.target_batch_no = None - if not target_item.has_serial_no: - self.target_serial_no = "" - self.validate_item(target_item) def validate_target_asset(self): if self.target_asset: target_asset = self.get_asset_for_validation(self.target_asset) - if not target_asset.is_composite_asset: + if not target_asset.asset_type == "Composite Asset": frappe.throw(_("Target Asset {0} needs to be composite asset").format(target_asset.name)) if target_asset.item_code != self.target_item_code: @@ -314,7 +297,7 @@ class AssetCapitalization(StockController): return frappe.db.get_value( "Asset", asset, - ["name", "item_code", "company", "status", "docstatus", "is_composite_asset"], + ["name", "item_code", "company", "status", "docstatus", "asset_type"], as_dict=1, ) @@ -380,8 +363,7 @@ class AssetCapitalization(StockController): self.total_value = self.stock_items_total + self.asset_items_total + self.service_items_total self.total_value = flt(self.total_value, self.precision("total_value")) - self.target_qty = flt(self.target_qty, self.precision("target_qty")) - self.target_incoming_rate = self.total_value / self.target_qty + self.target_incoming_rate = self.total_value def update_stock_ledger(self): sl_entries = [] @@ -489,7 +471,7 @@ class AssetCapitalization(StockController): for item in self.asset_items: asset = frappe.get_doc("Asset", item.asset) - if not asset.is_composite_component: + if asset.asset_type != "Composite Component": if asset.calculate_depreciation: notes = _( "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." @@ -542,30 +524,29 @@ class AssetCapitalization(StockController): def get_composite_component_value(self): composite_component_value = 0 for item in self.asset_items: - asset = frappe.db.get_value("Asset", item.asset, ["is_composite_component"], as_dict=True) - if asset and asset.is_composite_component: + asset = frappe.db.get_value("Asset", item.asset, ["asset_type"], as_dict=True) + if asset and asset.asset_type == "Composite Component": composite_component_value += flt(item.asset_value, item.precision("asset_value")) return composite_component_value def get_gl_entries_for_target_item( self, gl_entries, target_account, target_against, precision, composite_component_value ): - if self.target_is_fixed_asset: - total_value = flt(self.total_value - composite_component_value, precision) - if total_value: - # Capitalization - gl_entries.append( - self.get_gl_dict( - { - "account": target_account, - "against": ", ".join(target_against), - "remarks": self.get("remarks") or _("Accounting Entry for Asset"), - "debit": total_value, - "cost_center": self.get("cost_center"), - }, - item=self, - ) + total_value = flt(self.total_value - composite_component_value, precision) + if total_value: + # Capitalization + gl_entries.append( + self.get_gl_dict( + { + "account": target_account, + "against": ", ".join(target_against), + "remarks": self.get("remarks") or _("Accounting Entry for Asset"), + "debit": total_value, + "cost_center": self.get("cost_center"), + }, + item=self, ) + ) def update_target_asset(self): total_target_asset_value = flt(self.total_value, self.precision("total_value")) @@ -611,14 +592,13 @@ class AssetCapitalization(StockController): def set_consumed_asset_status(self, asset): if self.docstatus == 1: - if self.target_is_fixed_asset: - asset.set_status("Capitalized") - add_asset_activity( - asset.name, - _("Asset capitalized after Asset Capitalization {0} was submitted").format( - get_link_to_form("Asset Capitalization", self.name) - ), - ) + asset.set_status("Capitalized") + add_asset_activity( + asset.name, + _("Asset capitalized after Asset Capitalization {0} was submitted").format( + get_link_to_form("Asset Capitalization", self.name) + ), + ) else: asset.set_status() add_asset_activity( @@ -630,7 +610,7 @@ class AssetCapitalization(StockController): @frappe.whitelist() -def get_target_item_details(item_code=None, company=None): +def get_target_item_details(item_code: str | None = None, company: str | None = None) -> frappe._dict: out = frappe._dict() # Get Item Details @@ -640,17 +620,6 @@ def get_target_item_details(item_code=None, company=None): # Set Item Details out.target_item_name = item.item_name - out.target_is_fixed_asset = cint(item.is_fixed_asset) - out.target_has_batch_no = cint(item.has_batch_no) - out.target_has_serial_no = cint(item.has_serial_no) - - if out.target_is_fixed_asset: - out.target_qty = 1 - - if not out.target_has_batch_no: - out.target_batch_no = None - if not out.target_has_serial_no: - out.target_serial_no = "" # Cost Center item_defaults = get_item_defaults(item.name, company) @@ -667,7 +636,7 @@ def get_target_item_details(item_code=None, company=None): @frappe.whitelist() -def get_target_asset_details(asset=None, company=None): +def get_target_asset_details(asset: str | None = None, company: str | None = None) -> frappe._dict: out = frappe._dict() # Get Asset Details diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py index c87fff0b73e..914b87b728f 100644 --- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py @@ -10,12 +10,14 @@ from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries from erpnext.assets.doctype.asset.test_asset import ( create_asset, create_asset_data, + create_fixed_asset_item, set_depreciation_settings_in_company, ) from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( get_asset_depr_schedule_doc, ) from erpnext.stock.doctype.item.test_item import create_item +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import ( make_serial_batch_bundle, ) @@ -61,7 +63,7 @@ class TestAssetCapitalization(IntegrationTestCase): wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, ) @@ -81,7 +83,6 @@ class TestAssetCapitalization(IntegrationTestCase): ) # Test Asset Capitalization values - self.assertEqual(asset_capitalization.target_qty, 1) self.assertEqual(asset_capitalization.stock_items[0].valuation_rate, stock_rate) self.assertEqual(asset_capitalization.stock_items[0].amount, stock_amount) @@ -156,7 +157,7 @@ class TestAssetCapitalization(IntegrationTestCase): wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, ) @@ -176,8 +177,6 @@ class TestAssetCapitalization(IntegrationTestCase): ) # Test Asset Capitalization values - self.assertEqual(asset_capitalization.target_qty, 1) - self.assertEqual(asset_capitalization.stock_items[0].valuation_rate, stock_rate) self.assertEqual(asset_capitalization.stock_items[0].amount, stock_amount) self.assertEqual(asset_capitalization.stock_items_total, stock_amount) @@ -245,7 +244,7 @@ class TestAssetCapitalization(IntegrationTestCase): wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, ) @@ -262,8 +261,6 @@ class TestAssetCapitalization(IntegrationTestCase): ) # Test Asset Capitalization values - self.assertEqual(asset_capitalization.target_qty, 1) - self.assertEqual(asset_capitalization.stock_items[0].valuation_rate, stock_rate) self.assertEqual(asset_capitalization.stock_items[0].amount, stock_amount) self.assertEqual(asset_capitalization.stock_items_total, stock_amount) @@ -313,7 +310,7 @@ class TestAssetCapitalization(IntegrationTestCase): wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, ) @@ -361,33 +358,45 @@ class TestAssetCapitalization(IntegrationTestCase): wip_composite_asset = create_asset( asset_name="Asset Capitalization WIP Composite Asset", - is_composite_asset=1, + asset_type="Composite Asset", warehouse="Stores - TCP1", company=company, ) consumed_asset_value = 100000 - consumed_asset = create_asset( - asset_name="Asset Capitalization Consumable Asset", - asset_value=consumed_asset_value, - submit=1, - warehouse="Stores - _TC", - is_composite_component=1, + item = create_fixed_asset_item("Asset Capitalization Consumable Asset") + + pr = make_purchase_receipt( + item_code=item.item_code, + qty=1, + rate=consumed_asset_value, company=company, + warehouse="Stores - TCP1", ) + consumed_asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, "name") + consumed_asset_doc = frappe.get_doc("Asset", consumed_asset_name) + + consumed_asset_doc.update( + { + "asset_type": "Composite Component", + "purchase_date": pr.posting_date, + "available_for_use_date": pr.posting_date, + } + ) + consumed_asset_doc.save() + consumed_asset_doc.submit() # Create and submit Asset Captitalization asset_capitalization = create_asset_capitalization( target_asset=wip_composite_asset.name, target_asset_location="Test Location", - consumed_asset=consumed_asset.name, + consumed_asset=consumed_asset_doc.name, company=company, submit=1, ) # Test Asset Capitalization values - self.assertEqual(asset_capitalization.target_qty, 1) self.assertEqual(asset_capitalization.asset_items[0].asset_value, consumed_asset_value) actual_gle = get_actual_gle_dict(asset_capitalization.name) @@ -421,9 +430,6 @@ def create_asset_capitalization(**args): "target_item_code": target_item_code, "target_asset": target_asset.name, "target_asset_location": "Test Location", - "target_qty": flt(args.target_qty) or 1, - "target_batch_no": args.target_batch_no, - "target_serial_no": args.target_serial_no, "finance_book": args.finance_book, } ) @@ -516,7 +522,7 @@ def create_depreciation_asset(**args): args = frappe._dict(args) asset = frappe.new_doc("Asset") - asset.is_existing_asset = 1 + asset.asset_type = args.asset_type or "Existing Asset" asset.calculate_depreciation = 1 asset.asset_owner = "Company" diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py index 2cca15a89f7..824c7cbba1f 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py @@ -87,7 +87,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): calculate_depreciation=1, depreciation_method="Straight Line", available_for_use_date="2023-10-10", - is_existing_asset=1, + asset_type="Existing Asset", opening_number_of_booked_depreciations=9, opening_accumulated_depreciation=265, depreciation_start_date="2024-07-31", @@ -127,7 +127,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): calculate_depreciation=1, depreciation_method="Straight Line", available_for_use_date="2023-10-10", - is_existing_asset=1, + asset_type="Existing Asset", opening_number_of_booked_depreciations=9, opening_accumulated_depreciation=265.30, depreciation_start_date="2024-07-31", @@ -165,7 +165,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): calculate_depreciation=1, depreciation_method="Straight Line", available_for_use_date="2023-11-01", - is_existing_asset=1, + asset_type="Existing Asset", opening_number_of_booked_depreciations=4, opening_accumulated_depreciation=223.15, depreciation_start_date="2024-12-31", @@ -529,7 +529,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): depreciation_start_date="2023-03-31", frequency_of_depreciation=1, total_number_of_depreciations=12, - is_existing_asset=1, + asset_type="Existing Asset", opening_accumulated_depreciation=64.52, opening_number_of_booked_depreciations=2, submit=1, @@ -851,7 +851,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): depreciation_start_date="2023-03-31", frequency_of_depreciation=1, total_number_of_depreciations=12, - is_existing_asset=1, + asset_type="Existing Asset", opening_accumulated_depreciation=64.52, opening_number_of_booked_depreciations=2, submit=1, @@ -925,7 +925,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): depreciation_start_date="2021-12-31", frequency_of_depreciation=12, total_number_of_depreciations=3, - is_existing_asset=1, + asset_type="Existing Asset", submit=1, ) post_depreciation_entries(date="2021-12-31") @@ -1014,7 +1014,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): depreciation_start_date="2021-12-31", frequency_of_depreciation=12, total_number_of_depreciations=3, - is_existing_asset=1, + asset_type="Existing Asset", submit=1, ) post_depreciation_entries(date="2021-12-31") @@ -1093,7 +1093,7 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): rate_of_depreciation=50, frequency_of_depreciation=12, total_number_of_depreciations=3, - is_existing_asset=1, + asset_type="Existing Asset", submit=1, ) post_depreciation_entries(date="2021-12-31") diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json index a656acf1265..aedfc149f64 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.json +++ b/erpnext/assets/doctype/asset_movement/asset_movement.json @@ -32,6 +32,7 @@ { "fieldname": "purpose", "fieldtype": "Select", + "in_list_view": 1, "label": "Purpose", "options": "\nIssue\nReceipt\nTransfer\nTransfer and Issue", "reqd": 1 @@ -97,7 +98,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-05-30 17:01:55.864353", + "modified": "2026-03-09 17:19:02.087333", "modified_by": "Administrator", "module": "Assets", "name": "Asset Movement", diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.json b/erpnext/assets/doctype/asset_repair/asset_repair.json index b840b5a56b3..71b9469cfbd 100644 --- a/erpnext/assets/doctype/asset_repair/asset_repair.json +++ b/erpnext/assets/doctype/asset_repair/asset_repair.json @@ -9,9 +9,9 @@ "engine": "InnoDB", "field_order": [ "naming_series", + "company", "asset", "asset_name", - "company", "column_break_2", "repair_status", "failure_date", @@ -28,10 +28,6 @@ "column_break_ajbh", "column_break_hkem", "repair_cost", - "accounting_dimensions_section", - "cost_center", - "column_break_14", - "project", "stock_consumption_details_section", "stock_items", "section_break_ltbb", @@ -43,7 +39,12 @@ "capitalize_repair_cost", "increase_in_asset_life", "column_break_xebe", - "total_repair_cost" + "total_repair_cost", + "accounting_dimensions_section", + "cost_center", + "column_break_14", + "project", + "connection_tab" ], "fields": [ { @@ -149,8 +150,7 @@ { "fieldname": "accounting_details", "fieldtype": "Section Break", - "hide_border": 1, - "label": "Repair Purchase Invoices" + "hide_border": 1 }, { "fieldname": "stock_items", @@ -206,6 +206,7 @@ { "fieldname": "invoices", "fieldtype": "Table", + "label": "Repair Purchase Invoices", "mandatory_depends_on": "eval: doc.repair_status == 'Completed' && doc.repair_cost > 0;", "no_copy": 1, "options": "Asset Repair Purchase Invoice" @@ -244,6 +245,7 @@ "fieldtype": "Column Break" }, { + "depends_on": "eval: doc.consumed_items_cost", "fieldname": "consumed_items_cost", "fieldtype": "Currency", "label": "Consumed Items Cost" @@ -256,7 +258,13 @@ "depends_on": "capitalize_repair_cost", "fieldname": "accounting_dimensions_section", "fieldtype": "Section Break", - "label": "Accounting Dimensions" + "label": "Accounting Dimension" + }, + { + "fieldname": "connection_tab", + "fieldtype": "Tab Break", + "label": "Connection", + "show_dashboard": 1 } ], "index_web_pages_for_search": 1, @@ -267,7 +275,7 @@ "link_fieldname": "asset_repair" } ], - "modified": "2026-01-06 15:48:13.862505", + "modified": "2026-02-06 14:57:54.257572", "modified_by": "Administrator", "module": "Assets", "name": "Asset Repair", diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py index d085a4c6e4b..c56622d6665 100644 --- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py +++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py @@ -360,7 +360,7 @@ class TestAssetRepair(IntegrationTestCase): self.assertEqual(stock_entry.asset_repair, asset_repair.name) def test_gl_entries_with_capitalized_asset_repair(self): - asset = create_asset(is_existing_asset=1, calculate_depreciation=1, submit=1) + asset = create_asset(asset_type="Existing Asset", calculate_depreciation=1, submit=1) asset_repair = create_asset_repair( asset=asset, capitalize_repair_cost=1, item="_Test Non Stock Item", submit=1 ) @@ -400,7 +400,7 @@ def create_asset_repair(**args): if args.asset: asset = args.asset else: - asset = create_asset(is_existing_asset=1, submit=1, company=args.company) + asset = create_asset(asset_type=args.asset_type or "Existing Asset", submit=1, company=args.company) asset_repair = frappe.new_doc("Asset Repair") asset_repair.update( { diff --git a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py index 2103379df93..44bf59fc3ea 100644 --- a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py @@ -144,7 +144,7 @@ def get_conditions(filters): conditions[date_field] = ["between", [filters.year_start_date, filters.year_end_date]] if filters.get("only_existing_assets"): - conditions["is_existing_asset"] = filters.get("only_existing_assets") + conditions["asset_type"] = "Existing Asset" if filters.get("asset_category"): conditions["asset_category"] = filters.get("asset_category") if filters.get("cost_center"): @@ -274,7 +274,7 @@ def get_asset_depreciation_amount_map(filters, finance_book): ) if filters.only_existing_assets: - query = query.where(asset.is_existing_asset == 1) + query = query.where(asset.asset_type == "Existing Asset") if filters.asset_category: query = query.where(asset.asset_category == filters.asset_category) if filters.cost_center: @@ -325,7 +325,7 @@ def get_asset_value_adjustment_map(filters, finance_book): ) if filters.only_existing_assets: - query = query.where(asset.is_existing_asset == 1) + query = query.where(asset.asset_type == "Existing Asset") if filters.asset_category: query = query.where(asset.asset_category == filters.asset_category) if filters.cost_center: diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 212a034763a..2a1b37aae2a 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -252,6 +252,7 @@ "allow_on_submit": 1, "fieldname": "schedule_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Required By" }, { @@ -1327,7 +1328,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-02 00:40:47.119584", + "modified": "2026-03-09 17:15:29.184682", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json index a10497702ce..18e1356b263 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -49,7 +49,6 @@ { "fieldname": "naming_series", "fieldtype": "Select", - "in_list_view": 1, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", @@ -77,6 +76,7 @@ "fieldname": "vendor", "fieldtype": "Link", "hidden": 1, + "in_list_view": 1, "in_standard_filter": 1, "label": "Supplier", "no_copy": 1, @@ -95,6 +95,7 @@ "fieldname": "transaction_date", "fieldtype": "Date", "in_list_view": 1, + "in_standard_filter": 1, "label": "Date", "oldfieldname": "transaction_date", "oldfieldtype": "Date", @@ -147,7 +148,6 @@ "depends_on": "eval:doc.use_html == 0", "fieldname": "message_for_supplier", "fieldtype": "Text Editor", - "in_list_view": 1, "label": "Message for Supplier", "mandatory_depends_on": "eval:doc.use_html == 0", "print_hide": 1 @@ -225,6 +225,8 @@ { "fieldname": "status", "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Status", "no_copy": 1, "oldfieldname": "status", @@ -263,6 +265,7 @@ { "fieldname": "schedule_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Required Date" }, { @@ -350,7 +353,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-03-01 23:38:48.079274", + "modified": "2026-03-09 17:15:29.774614", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 43dbbdd7b96..9caf3d3fa7c 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -178,6 +178,7 @@ "default": "Company", "fieldname": "supplier_type", "fieldtype": "Select", + "in_list_view": 1, "label": "Supplier Type", "options": "Company\nIndividual\nPartnership", "reqd": 1 @@ -238,6 +239,7 @@ "fieldname": "default_currency", "fieldtype": "Link", "ignore_user_permissions": 1, + "in_list_view": 1, "label": "Billing Currency", "no_copy": 1, "options": "Currency" @@ -515,7 +517,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-10 21:28:01.101808", + "modified": "2026-03-09 17:15:25.465759", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py index ffbec9bd73e..7c2714ba671 100644 --- a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py @@ -34,7 +34,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertEqual(sq.get("items")[1].rate, 300) self.assertEqual(sq.get("items")[1].description, "test") - def test_update_supplier_quotation_child_rate_disallow(self): + def test_update_supplier_quotation_child_rate(self): sq = frappe.copy_doc(self.globalTestRecords["Supplier Quotation"][0]) sq.submit() trans_item = json.dumps( @@ -47,6 +47,22 @@ class TestPurchaseOrder(IntegrationTestCase): }, ] ) + update_child_qty_rate("Supplier Quotation", trans_item, sq.name) + sq.reload() + self.assertEqual(sq.get("items")[0].rate, 300) + po = make_purchase_order(sq.name) + po.schedule_date = add_days(today(), 1) + po.submit() + trans_item = json.dumps( + [ + { + "item_code": sq.items[0].item_code, + "rate": 20, + "qty": sq.items[0].qty, + "docname": sq.items[0].name, + }, + ] + ) self.assertRaises( frappe.ValidationError, update_child_qty_rate, "Supplier Quotation", trans_item, sq.name ) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 6a75859cdb0..43eaffa786b 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2525,13 +2525,14 @@ class AccountsController(TransactionBase): grand_total = flt(self.get("rounded_total") or self.grand_total) automatically_fetch_payment_terms = 0 - if self.doctype in ("Sales Invoice", "Purchase Invoice"): - base_grand_total = base_grand_total - flt(self.base_write_off_amount) - grand_total = grand_total - flt(self.write_off_amount) + if self.doctype in ("Sales Invoice", "Purchase Invoice", "Sales Order"): po_or_so, doctype, fieldname = self.get_order_details() automatically_fetch_payment_terms = cint( frappe.get_single_value("Accounts Settings", "automatically_fetch_payment_terms") ) + if self.doctype != "Sales Order": + base_grand_total = base_grand_total - flt(self.base_write_off_amount) + grand_total = grand_total - flt(self.write_off_amount) if self.get("total_advance"): if party_account_currency == self.company_currency: @@ -2547,7 +2548,7 @@ class AccountsController(TransactionBase): if not self.get("payment_schedule"): if ( - self.doctype in ["Sales Invoice", "Purchase Invoice"] + self.doctype in ["Sales Invoice", "Purchase Invoice", "Sales Order"] and automatically_fetch_payment_terms and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype) ): @@ -2605,16 +2606,18 @@ class AccountsController(TransactionBase): if not self.get("items"): return None, None, None if self.doctype == "Sales Invoice": - po_or_so = self.get("items")[0].get("sales_order") - po_or_so_doctype = "Sales Order" - po_or_so_doctype_name = "sales_order" - + prev_doc = self.get("items")[0].get("sales_order") + prev_doctype = "Sales Order" + prev_doctype_name = "sales_order" + elif self.doctype == "Purchase Invoice": + prev_doc = self.get("items")[0].get("purchase_order") + prev_doctype = "Purchase Order" + prev_doctype_name = "purchase_order" else: - po_or_so = self.get("items")[0].get("purchase_order") - po_or_so_doctype = "Purchase Order" - po_or_so_doctype_name = "purchase_order" - - return po_or_so, po_or_so_doctype, po_or_so_doctype_name + prev_doc = self.get("items")[0].get("prevdoc_docname") + prev_doctype = "Quotation" + prev_doctype_name = "prevdoc_docname" + return prev_doc, prev_doctype, prev_doctype_name def linked_order_has_payment_terms(self, po_or_so, fieldname, doctype): if po_or_so and self.all_items_have_same_po_or_so(po_or_so, fieldname): @@ -3872,20 +3875,28 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil return frappe.db.get_single_value("Buying Settings", "allow_zero_qty_in_purchase_order") or False return False - def validate_quantity(child_item, new_data): + def validate_quantity_and_rate(child_item, new_data): if not flt(new_data.get("qty")) and not is_allowed_zero_qty(): frappe.throw( - _("Row #{0}: Quantity for Item {1} cannot be zero.").format( + _("Row #{0}:Quantity for Item {1} cannot be zero.").format( new_data.get("idx"), frappe.bold(new_data.get("item_code")) ), title=_("Invalid Qty"), ) - if parent_doctype == "Sales Order" and flt(new_data.get("qty")) < flt(child_item.delivered_qty): - frappe.throw(_("Cannot set quantity less than delivered quantity")) + qty_limits = { + "Sales Order": ("delivered_qty", _("Cannot set quantity less than delivered quantity")), + "Purchase Order": ("received_qty", _("Cannot set quantity less than received quantity")), + } - if parent_doctype == "Purchase Order" and flt(new_data.get("qty")) < flt(child_item.received_qty): - frappe.throw(_("Cannot set quantity less than received quantity")) + if parent_doctype in qty_limits: + qty_field, error_message = qty_limits[parent_doctype] + if flt(new_data.get("qty")) < flt(child_item.get(qty_field)): + frappe.throw( + _("Row #{0}:").format(new_data.get("idx")) + + error_message.format(frappe.bold(new_data.get("item_code"))), + title=_("Invalid Qty"), + ) if parent_doctype in ["Quotation", "Supplier Quotation"]: if (parent_doctype == "Quotation" and not ordered_items) or ( @@ -3898,7 +3909,15 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if parent_doctype == "Quotation" else purchased_items.get(child_item.name) ) + if qty_to_check: + if not rate_unchanged: + frappe.throw( + _( + "Cannot update rate as item {0} is already ordered or purchased against this quotation" + ).format(frappe.bold(new_data.get("item_code"))) + ) + if flt(new_data.get("qty")) < qty_to_check: frappe.throw(_("Cannot reduce quantity than ordered or purchased quantity")) @@ -4017,10 +4036,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil ): continue - validate_quantity(child_item, d) - if parent_doctype in ["Quotation", "Supplier Quotation"]: - if not rate_unchanged: - frappe.throw(_("Rates cannot be modified for quoted items")) + validate_quantity_and_rate(child_item, d) if flt(child_item.get("qty")) != flt(d.get("qty")): any_qty_changed = True diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 5436cd3e54f..1fed02a23ed 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -1439,6 +1439,16 @@ class StockController(AccountsController): continue if qi_required: # validate row only if inspection is required on item level + if self.doctype in [ + "Purchase Receipt", + "Purchase Invoice", + "Sales Invoice", + "Delivery Note", + ] and frappe.get_single_value( + "Stock Settings", "allow_to_make_quality_inspection_after_purchase_or_delivery" + ): + return + self.validate_qi_presence(row) if self.docstatus == 1: self.validate_qi_submission(row) @@ -1446,16 +1456,6 @@ class StockController(AccountsController): def validate_qi_presence(self, row): """Check if QI is present on row level. Warn on save and stop on submit if missing.""" - if self.doctype in [ - "Purchase Receipt", - "Purchase Invoice", - "Sales Invoice", - "Delivery Note", - ] and frappe.get_single_value( - "Stock Settings", "allow_to_make_quality_inspection_after_purchase_or_delivery" - ): - return - if not row.quality_inspection: msg = _("Row #{0}: Quality Inspection is required for Item {1}").format( row.idx, frappe.bold(row.item_code) diff --git a/erpnext/desktop_icon/organization.json b/erpnext/desktop_icon/organization.json new file mode 100644 index 00000000000..dbc86a5e6e0 --- /dev/null +++ b/erpnext/desktop_icon/organization.json @@ -0,0 +1,21 @@ +{ + "app": "erpnext", + "bg_color": "blue", + "creation": "2026-02-24 17:43:08.379896", + "docstatus": 0, + "doctype": "Desktop Icon", + "hidden": 0, + "icon_type": "Link", + "idx": 0, + "label": "Organization", + "link_to": "Organization", + "link_type": "Workspace Sidebar", + "modified": "2026-02-24 17:59:39.885360", + "modified_by": "Administrator", + "name": "Organization", + "owner": "Administrator", + "parent_icon": "", + "restrict_removal": 0, + "roles": [], + "standard": 1 +} diff --git a/erpnext/hooks.py b/erpnext/hooks.py index e90362431a3..0780822b191 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -219,6 +219,16 @@ website_route_rules = [ {"from_route": "/tasks", "to_route": "Task"}, ] +standard_navbar_items = [ + { + "item_label": "Clear Demo Data", + "item_type": "Action", + "action": "erpnext.demo.clear_demo();", + "is_standard": 1, + "condition": "eval: frappe.boot.sysdefaults.demo_company", + }, +] + standard_portal_menu_items = [ {"title": "Projects", "route": "/project", "reference_doctype": "Project", "role": "Customer"}, { diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index 7d4ba39e4a8..2016b23d789 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-03-01 09:43+0000\n" -"PO-Revision-Date: 2026-03-01 09:43+0000\n" +"POT-Creation-Date: 2026-03-08 09:42+0000\n" +"PO-Revision-Date: 2026-03-08 09:42+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.16.0\n" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1485 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1515 msgid "" "\n" "\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}{3}.\n" @@ -266,7 +266,7 @@ msgstr "" msgid "'Account' in the Accounting section of Customer {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:358 +#: erpnext/selling/doctype/sales_order/sales_order.py:360 msgid "'Allow Multiple Sales Orders Against a Customer's Purchase Order'" msgstr "" @@ -308,8 +308,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:601 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:634 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:665 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:705 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:810 msgid "'Opening'" msgstr "" @@ -596,12 +597,12 @@ msgstr "" msgid "90 Above" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1288 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1289 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1330 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1331 msgid "<0" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:537 +#: erpnext/assets/doctype/asset/asset.py:541 msgid "Cannot create asset.

You're trying to create {0} asset(s) from {2} {3}.
However, only {1} item(s) were purchased and {4} asset(s) already exist against {5}." msgstr "" @@ -1027,7 +1028,7 @@ msgstr "" msgid "A logical Warehouse against which stock entries are made." msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1451 +#: erpnext/stock/serial_batch_bundle.py:1459 msgid "A naming series conflict occurred while creating serial numbers. Please change the naming series for the item {0}." msgstr "" @@ -1137,7 +1138,7 @@ msgstr "" msgid "Abbreviation: {0} must appear only once" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1285 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1327 msgid "Above" msgstr "" @@ -1182,7 +1183,7 @@ msgstr "" #. Label of the qty (Float) field in DocType 'Purchase Receipt Item' #. Label of the qty (Float) field in DocType 'Subcontracting Receipt Item' -#: erpnext/public/js/controllers/transaction.js:2914 +#: erpnext/public/js/controllers/transaction.js:2916 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json msgid "Accepted Quantity" @@ -1215,7 +1216,7 @@ msgstr "" msgid "According to CEFACT/ICG/2010/IC013 or CEFACT/ICG/2010/IC010" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:989 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:990 msgid "According to the BOM {0}, the Item '{1}' is missing in the stock entry." msgstr "" @@ -1450,7 +1451,7 @@ msgstr "" msgid "Account is not set for the dashboard chart {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:901 +#: erpnext/assets/doctype/asset/asset.py:905 msgid "Account not Found" msgstr "" @@ -1563,11 +1564,11 @@ msgstr "" msgid "Account: {0} can only be updated via Stock Transactions" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2721 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2725 msgid "Account: {0} is not permitted under Payment Entry" msgstr "" -#: erpnext/controllers/accounts_controller.py:3266 +#: erpnext/controllers/accounts_controller.py:3269 msgid "Account: {0} with currency: {1} can not be selected" msgstr "" @@ -1648,12 +1649,15 @@ msgstr "" #. Label of the accounting_dimension (Link) field in DocType 'Allowed #. Dimension' #. Label of a Link in the Invoicing Workspace +#. Label of the accounting_dimensions_section (Section Break) field in DocType +#. 'Asset Repair' #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.json #: erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json #: erpnext/accounts/report/profitability_analysis/profitability_analysis.js:32 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/assets/doctype/asset_repair/asset_repair.json #: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/budget.json msgid "Accounting Dimension" @@ -1730,8 +1734,6 @@ msgstr "" #. Label of the accounting_dimensions_section (Section Break) field in DocType #. 'Asset Capitalization Stock Item' #. Label of the accounting_dimensions_section (Section Break) field in DocType -#. 'Asset Repair' -#. Label of the accounting_dimensions_section (Section Break) field in DocType #. 'Asset Value Adjustment' #. Label of the section_break_24 (Section Break) field in DocType 'Request for #. Quotation Item' @@ -1794,7 +1796,6 @@ msgstr "" #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json #: erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json -#: erpnext/assets/doctype/asset_repair/asset_repair.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -1846,14 +1847,14 @@ msgstr "" msgid "Accounting Entries" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:935 -#: erpnext/assets/doctype/asset/asset.py:950 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:562 +#: erpnext/assets/doctype/asset/asset.py:939 +#: erpnext/assets/doctype/asset/asset.py:954 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:543 msgid "Accounting Entry for Asset" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1960 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1980 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1961 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1981 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1874,11 +1875,11 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1231 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1467 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1489 -#: erpnext/controllers/stock_controller.py:686 -#: erpnext/controllers/stock_controller.py:703 +#: erpnext/controllers/stock_controller.py:727 +#: erpnext/controllers/stock_controller.py:744 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:930 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1905 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1906 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1920 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:708 msgid "Accounting Entry for Stock" msgstr "" @@ -1892,12 +1893,13 @@ msgid "Accounting Entry for {0}: {1} can only be made in currency: {2}" msgstr "" #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.js:193 +#: erpnext/assets/doctype/asset/asset.js:182 #: erpnext/assets/doctype/asset_repair/asset_repair.js:171 #: erpnext/buying/doctype/supplier/supplier.js:98 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 #: erpnext/selling/doctype/customer/customer.js:173 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:50 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "" @@ -2115,7 +2117,7 @@ msgstr "" #. Label of the accumulated_depreciation_amount (Currency) field in DocType #. 'Depreciation Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:178 -#: erpnext/assets/doctype/asset/asset.js:340 +#: erpnext/assets/doctype/asset/asset.js:373 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Accumulated Depreciation Amount" msgstr "" @@ -2326,10 +2328,10 @@ msgstr "" #: erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json #: erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json #: erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:239 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:243 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:325 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:335 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:246 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:250 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:332 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:342 msgid "Actual" msgstr "" @@ -2390,7 +2392,7 @@ msgstr "" msgid "Actual End Time" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:453 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:471 msgid "Actual Expense" msgstr "" @@ -2511,7 +2513,7 @@ msgstr "" msgid "Ad-hoc Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:583 +#: erpnext/stock/doctype/item/item.js:601 #: erpnext/stock/doctype/price_list/price_list.js:8 msgid "Add / Edit Prices" msgstr "" @@ -2668,7 +2670,7 @@ msgstr "" msgid "Add Sub Assembly" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:513 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:520 #: erpnext/public/js/event.js:32 msgid "Add Suppliers" msgstr "" @@ -2929,6 +2931,7 @@ msgstr "" #. Label of the additional_info_section (Section Break) field in DocType #. 'Purchase Order' #. Label of the more_info (Section Break) field in DocType 'Supplier Quotation' +#. Label of the sb_more_info (Section Break) field in DocType 'Task' #. Label of the additional_info_section (Section Break) field in DocType #. 'Quotation' #. Label of the additional_info_section (Section Break) field in DocType 'Sales @@ -2942,6 +2945,7 @@ msgstr "" #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +#: erpnext/projects/doctype/task/task.json #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -2984,7 +2988,7 @@ msgstr "" msgid "Additional Transferred Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:676 +#: erpnext/manufacturing/doctype/work_order/work_order.py:694 msgid "" "Additional Transferred Qty {0}\n" "\t\t\t\t\tcannot be greater than {1}.\n" @@ -3140,10 +3144,6 @@ msgstr "" msgid "Address used to determine Tax Category in transactions" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:144 -msgid "Adjust Asset Value" -msgstr "" - #. Label of the adjust_qty (Float) field in DocType 'Sales Forecast Item' #: erpnext/manufacturing/doctype/sales_forecast_item/sales_forecast_item.json msgid "Adjust Qty" @@ -3484,7 +3484,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:154 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:133 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1226 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 msgid "Age (Days)" msgstr "" @@ -3745,7 +3745,7 @@ msgstr "" msgid "All items are already requested" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1418 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1423 msgid "All items have already been Invoiced/Returned" msgstr "" @@ -3753,11 +3753,11 @@ msgstr "" msgid "All items have already been received" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3112 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3113 msgid "All items have already been transferred for this Work Order." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3022 +#: erpnext/public/js/controllers/transaction.js:3025 msgid "All items in this document already have a linked Quality Inspection." msgstr "" @@ -3970,7 +3970,7 @@ msgstr "" msgid "Allow Item To Be Added Multiple Times in a Transaction" msgstr "" -#: erpnext/controllers/selling_controller.py:854 +#: erpnext/controllers/selling_controller.py:855 msgid "Allow Item to Be Added Multiple Times in a Transaction" msgstr "" @@ -4013,8 +4013,8 @@ msgstr "" #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:179 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:191 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:201 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:213 msgid "Allow Negative Stock" msgstr "" @@ -4335,8 +4335,8 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:250 #: erpnext/manufacturing/doctype/work_order/work_order.js:165 #: erpnext/manufacturing/doctype/work_order/work_order.js:180 -#: erpnext/public/js/utils.js:496 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:287 +#: erpnext/public/js/utils.js:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:288 msgid "Alternate Item" msgstr "" @@ -4686,19 +4686,19 @@ msgstr "" msgid "Amount to Bill" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1255 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1259 msgid "Amount {0} {1} against {2} {3}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1266 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1270 msgid "Amount {0} {1} deducted against {2}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1230 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1234 msgid "Amount {0} {1} transferred from {2} to {3}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1236 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1240 msgid "Amount {0} {1} {2} {3}" msgstr "" @@ -4764,7 +4764,7 @@ msgstr "" msgid "Analytical Accounting" msgstr "" -#: erpnext/public/js/utils.js:93 +#: erpnext/public/js/utils.js:158 msgid "Annual Billing: {0}" msgstr "" @@ -5238,7 +5238,7 @@ msgstr "" msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.py:204 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:226 msgid "As there are reserved stock, you cannot disable {0}." msgstr "" @@ -5250,8 +5250,8 @@ msgstr "" msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.py:178 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:190 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:200 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:212 msgid "As {0} is enabled, you can not enable {1}." msgstr "" @@ -5514,7 +5514,7 @@ msgstr "" msgid "Asset Movement Item" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1181 +#: erpnext/assets/doctype/asset/asset.py:1185 msgid "Asset Movement record {0} created" msgstr "" @@ -5576,6 +5576,7 @@ msgstr "" #. Batch Bundle' #. Label of the asset_repair (Link) field in DocType 'Stock Entry' #. Label of a Workspace Sidebar Item +#: erpnext/assets/doctype/asset/asset.js:105 #: erpnext/assets/doctype/asset_repair/asset_repair.json #: erpnext/assets/workspace/assets/assets.json #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json @@ -5619,10 +5620,15 @@ msgstr "" msgid "Asset Status" msgstr "" +#. Label of the asset_type (Select) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Asset Type" +msgstr "" + #. Label of the asset_value (Currency) field in DocType 'Asset Capitalization #. Asset Item' -#: erpnext/assets/dashboard_fixtures.py:175 -#: erpnext/assets/doctype/asset/asset.js:472 +#: erpnext/assets/dashboard_fixtures.py:180 +#: erpnext/assets/doctype/asset/asset.js:505 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:209 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:460 @@ -5633,6 +5639,7 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Assets Workspace #. Label of a Workspace Sidebar Item +#: erpnext/assets/doctype/asset/asset.js:97 #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/workspace/assets/assets.json #: erpnext/workspace_sidebar/assets.json @@ -5649,11 +5656,11 @@ msgstr "" msgid "Asset Value Analytics" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:273 +#: erpnext/assets/doctype/asset/asset.py:277 msgid "Asset cancelled" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:730 +#: erpnext/assets/doctype/asset/asset.py:734 msgid "Asset cannot be cancelled, as it is already {0}" msgstr "" @@ -5661,19 +5668,19 @@ msgstr "" msgid "Asset cannot be scrapped before the last depreciation entry." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:618 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:598 msgid "Asset capitalized after Asset Capitalization {0} was submitted" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:282 +#: erpnext/assets/doctype/asset/asset.py:286 msgid "Asset created" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1422 +#: erpnext/assets/doctype/asset/asset.py:1426 msgid "Asset created after being split from Asset {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:285 +#: erpnext/assets/doctype/asset/asset.py:289 msgid "Asset deleted" msgstr "" @@ -5693,11 +5700,11 @@ msgstr "" msgid "Asset restored" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:626 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:606 msgid "Asset restored after Asset Capitalization {0} was cancelled" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 msgid "Asset returned" msgstr "" @@ -5709,12 +5716,12 @@ msgstr "" msgid "Asset scrapped via Journal Entry {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1527 msgid "Asset sold" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:260 +#: erpnext/assets/doctype/asset/asset.py:264 msgid "Asset submitted" msgstr "" @@ -5722,7 +5729,7 @@ msgstr "" msgid "Asset transferred to Location {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1431 +#: erpnext/assets/doctype/asset/asset.py:1435 msgid "Asset updated after being split into Asset {0}" msgstr "" @@ -5734,7 +5741,7 @@ msgstr "" msgid "Asset {0} cannot be scrapped, as it is already {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:213 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:196 msgid "Asset {0} does not belong to Item {1}" msgstr "" @@ -5750,12 +5757,12 @@ msgstr "" msgid "Asset {0} does not belong to the location {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:678 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:771 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:647 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:740 msgid "Asset {0} does not exist" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:592 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:573 msgid "Asset {0} has been updated. Please set the depreciation details if any and submit it." msgstr "" @@ -5849,7 +5856,7 @@ msgstr "" msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} in the warehouse {4}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1368 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1398 msgid "At Row {0}: In Serial and Batch Bundle {1} must have docstatus as 1 and not 0" msgstr "" @@ -5857,7 +5864,7 @@ msgstr "" msgid "At least one account with exchange gain or loss is required" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1287 +#: erpnext/assets/doctype/asset/asset.py:1291 msgid "At least one asset has to be selected." msgstr "" @@ -5882,7 +5889,7 @@ msgstr "" msgid "At least one of the Selling or Buying must be selected" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:314 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:315 msgid "At least one raw material item must be present in the stock entry for the type {0}" msgstr "" @@ -5890,11 +5897,11 @@ msgstr "" msgid "At least one row is required for a financial report template" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:821 msgid "At least one warehouse is mandatory" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:723 msgid "At row #{0}: the Difference Account must not be a Stock type account, please change the Account Type for the account {1} or select a different account" msgstr "" @@ -5902,11 +5909,11 @@ msgstr "" msgid "At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:733 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:734 msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1130 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1146 msgid "At row {0}: Batch No is mandatory for Item {1}" msgstr "" @@ -5914,15 +5921,15 @@ msgstr "" msgid "At row {0}: Parent Row No cannot be set for item {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1115 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1131 msgid "At row {0}: Qty is mandatory for the batch {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1122 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1138 msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:634 +#: erpnext/controllers/stock_controller.py:675 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 "" @@ -6241,7 +6248,7 @@ msgstr "" #. Label of the automatically_fetch_payment_terms (Check) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Automatically Fetch Payment Terms from Order" +msgid "Automatically Fetch Payment Terms from Order/Quotation" msgstr "" #. Label of the automatically_process_deferred_accounting_entry (Check) field @@ -6306,7 +6313,7 @@ msgstr "" #. 'Pick List Item' #: erpnext/manufacturing/doctype/workstation/workstation.js:505 #: erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py:88 -#: erpnext/public/js/utils.js:556 +#: erpnext/public/js/utils.js:621 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/report/stock_ageing/stock_ageing.py:169 @@ -6389,11 +6396,16 @@ msgstr "" msgid "Available Stock for Packing Items" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:378 +#. Label of the available_for_use_date (Date) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Available for Use Date" +msgstr "" + +#: erpnext/assets/doctype/asset/asset.py:382 msgid "Available for use date is required" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:953 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:954 msgid "Available quantity is {0}, you need {1}" msgstr "" @@ -6401,18 +6413,13 @@ msgstr "" msgid "Available {0}" msgstr "" -#. Label of the available_for_use_date (Date) field in DocType 'Asset' -#: erpnext/assets/doctype/asset/asset.json -msgid "Available-for-use Date" -msgstr "" - -#: erpnext/assets/doctype/asset/asset.py:484 +#: erpnext/assets/doctype/asset/asset.py:488 msgid "Available-for-use Date should be after purchase date" msgstr "" #: erpnext/stock/report/stock_ageing/stock_ageing.py:170 #: erpnext/stock/report/stock_ageing/stock_ageing.py:204 -#: erpnext/stock/report/stock_balance/stock_balance.py:548 +#: erpnext/stock/report/stock_balance/stock_balance.py:590 msgid "Average Age" msgstr "" @@ -6459,7 +6466,7 @@ msgid "Avg Rate" msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:154 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:288 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:352 msgid "Avg Rate (Balance Stock)" msgstr "" @@ -6530,7 +6537,7 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1415 #: 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:706 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:707 #: 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 @@ -6782,11 +6789,11 @@ msgstr "" msgid "BOM Website Operation" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2280 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2281 msgid "BOM and Finished Good Quantity is mandatory for Disassembly" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1341 msgid "BOM and Manufacturing Quantity are required" msgstr "" @@ -6797,7 +6804,7 @@ msgid "BOM and Production" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:758 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:759 msgid "BOM does not contain any stock item" msgstr "" @@ -6911,8 +6918,8 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:63 #: erpnext/stock/report/available_serial_no/available_serial_no.py:126 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:84 -#: erpnext/stock/report/stock_balance/stock_balance.py:476 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:251 +#: erpnext/stock/report/stock_balance/stock_balance.py:518 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:315 msgid "Balance Qty" msgstr "" @@ -6976,8 +6983,8 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:174 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 -#: erpnext/stock/report/stock_balance/stock_balance.py:483 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:308 +#: erpnext/stock/report/stock_balance/stock_balance.py:525 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:372 msgid "Balance Value" msgstr "" @@ -7476,7 +7483,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:330 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:394 #: 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 @@ -7551,7 +7558,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:2940 +#: erpnext/public/js/controllers/transaction.js:2942 #: 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 @@ -7582,11 +7589,11 @@ msgstr "" msgid "Batch No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1133 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1149 msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3321 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3351 msgid "Batch No {0} does not exists" msgstr "" @@ -7594,7 +7601,7 @@ msgstr "" msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:448 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:458 msgid "Batch No {0} is not present in the original {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -7609,11 +7616,11 @@ msgstr "" msgid "Batch Nos" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1886 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1916 msgid "Batch Nos are created successfully" msgstr "" -#: erpnext/controllers/sales_and_purchase_return.py:1187 +#: erpnext/controllers/sales_and_purchase_return.py:1194 msgid "Batch Not Available for Return" msgstr "" @@ -7663,7 +7670,7 @@ msgstr "" msgid "Batch and Serial No" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:897 +#: erpnext/manufacturing/doctype/work_order/work_order.py:921 msgid "Batch not created for item {} since it does not have a batch series." msgstr "" @@ -7671,16 +7678,16 @@ msgstr "" msgid "Batch {0} and Warehouse" msgstr "" -#: erpnext/controllers/sales_and_purchase_return.py:1186 +#: erpnext/controllers/sales_and_purchase_return.py:1193 msgid "Batch {0} is not available in warehouse {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3289 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3290 #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:290 msgid "Batch {0} of Item {1} has expired." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3295 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3296 msgid "Batch {0} of Item {1} is disabled." msgstr "" @@ -7723,7 +7730,7 @@ msgstr "" #. Label of the bill_date (Date) field in DocType 'Journal Entry' #. Label of the bill_date (Date) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1211 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1253 #: erpnext/accounts/report/purchase_register/purchase_register.py:214 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill Date" @@ -7732,7 +7739,7 @@ msgstr "" #. Label of the bill_no (Data) field in DocType 'Journal Entry' #. Label of the bill_no (Data) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1210 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1252 #: erpnext/accounts/report/purchase_register/purchase_register.py:213 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill No" @@ -7750,7 +7757,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1318 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:692 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:693 #: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "" @@ -8226,10 +8233,12 @@ msgstr "" #. Label of the branch (Data) field in DocType 'Branch' #. Label of the branch (Link) field in DocType 'Employee' #. Label of the branch (Link) field in DocType 'Employee Internal Work History' +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sms_center/sms_center.json #: erpnext/setup/doctype/branch/branch.json #: erpnext/setup/doctype/employee/employee.json #: erpnext/setup/doctype/employee_internal_work_history/employee_internal_work_history.json +#: erpnext/workspace_sidebar/organization.json msgid "Branch" msgstr "" @@ -8325,11 +8334,11 @@ msgstr "" #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:65 #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:73 #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:81 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:238 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:242 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:324 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:334 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:448 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:245 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:249 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:331 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:341 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:466 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budget.json msgid "Budget" @@ -8891,7 +8900,7 @@ msgstr "" msgid "Can be approved by {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2500 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2524 msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state." msgstr "" @@ -8920,18 +8929,18 @@ msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1378 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2875 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2879 msgid "Can only make payment against unbilled {0}" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1517 -#: erpnext/controllers/accounts_controller.py:3175 +#: erpnext/controllers/accounts_controller.py:3178 #: erpnext/public/js/controllers/accounts.js:103 msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'" msgstr "" #: erpnext/setup/doctype/company/company.py:207 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:145 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:167 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "" @@ -9030,7 +9039,7 @@ msgstr "" msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1075 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1099 msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "" @@ -9050,7 +9059,7 @@ msgstr "" msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:495 msgid "Cannot cancel transaction for Completed Work Order." msgstr "" @@ -9074,7 +9083,7 @@ msgstr "" msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "" -#: erpnext/projects/doctype/task/task.py:145 +#: erpnext/projects/doctype/task/task.py:147 msgid "Cannot complete task {0} as its dependant task {1} are not completed / cancelled." msgstr "" @@ -9098,7 +9107,7 @@ msgstr "" msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1888 +#: erpnext/selling/doctype/sales_order/sales_order.py:1890 #: erpnext/stock/doctype/pick_list/pick_list.py:219 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 "" @@ -9132,7 +9141,7 @@ msgstr "" msgid "Cannot delete Serial No {0}, as it is used in stock transactions" msgstr "" -#: erpnext/controllers/accounts_controller.py:3771 +#: erpnext/controllers/accounts_controller.py:3774 msgid "Cannot delete an item which has been ordered" msgstr "" @@ -9145,11 +9154,15 @@ msgstr "" msgid "Cannot delete virtual DocType: {0}. Virtual DocTypes do not have database tables." msgstr "" +#: erpnext/stock/doctype/stock_settings/stock_settings.py:132 +msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." +msgstr "" + #: erpnext/setup/doctype/company/company.py:561 msgid "Cannot disable perpetual inventory, as there are existing Stock Ledger Entries for the company {0}. Please cancel the stock transactions first and try again." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:693 +#: erpnext/manufacturing/doctype/work_order/work_order.py:711 msgid "Cannot disassemble more than produced quantity." msgstr "" @@ -9157,8 +9170,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:782 -#: erpnext/selling/doctype/sales_order/sales_order.py:805 +#: erpnext/selling/doctype/sales_order/sales_order.py:784 +#: erpnext/selling/doctype/sales_order/sales_order.py:807 msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "" @@ -9174,7 +9187,7 @@ msgstr "" msgid "Cannot find Item with this Barcode" msgstr "" -#: erpnext/controllers/accounts_controller.py:3723 +#: erpnext/controllers/accounts_controller.py:3726 msgid "Cannot find a default warehouse for item {0}. Please set one in the Item Master or in Stock Settings." msgstr "" @@ -9182,15 +9195,15 @@ msgstr "" msgid "Cannot merge {0} '{1}' into '{2}' as both have existing accounting entries in different currencies for company '{3}'." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:543 +#: erpnext/manufacturing/doctype/work_order/work_order.py:561 msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1426 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1450 msgid "Cannot produce more item for {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1430 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1454 msgid "Cannot produce more than {0} items for {1}" msgstr "" @@ -9198,12 +9211,12 @@ msgstr "" msgid "Cannot receive from customer against negative outstanding" msgstr "" -#: erpnext/controllers/accounts_controller.py:3903 +#: erpnext/controllers/accounts_controller.py:3922 msgid "Cannot reduce quantity than ordered or purchased quantity" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1530 -#: erpnext/controllers/accounts_controller.py:3190 +#: erpnext/controllers/accounts_controller.py:3193 #: erpnext/public/js/controllers/accounts.js:120 msgid "Cannot refer row number greater than or equal to current row number for this Charge type" msgstr "" @@ -9218,8 +9231,8 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1523 #: erpnext/accounts/doctype/payment_entry/payment_entry.js:1701 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1823 -#: erpnext/controllers/accounts_controller.py:3180 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1827 +#: erpnext/controllers/accounts_controller.py:3183 #: erpnext/public/js/controllers/accounts.js:112 #: erpnext/public/js/controllers/taxes_and_totals.js:531 msgid "Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row" @@ -9237,11 +9250,11 @@ msgstr "" msgid "Cannot set multiple Item Defaults for a company." msgstr "" -#: erpnext/controllers/accounts_controller.py:3885 +#: erpnext/controllers/accounts_controller.py:3888 msgid "Cannot set quantity less than delivered quantity" msgstr "" -#: erpnext/controllers/accounts_controller.py:3888 +#: erpnext/controllers/accounts_controller.py:3889 msgid "Cannot set quantity less than received quantity" msgstr "" @@ -9253,7 +9266,11 @@ msgstr "" msgid "Cannot start deletion. Another deletion {0} is already queued/running. Please wait for it to complete." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1933 +#: erpnext/controllers/accounts_controller.py:3916 +msgid "Cannot update rate as item {0} is already ordered or purchased against this quotation" +msgstr "" + +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1937 msgid "Cannot {0} from {1} without any negative outstanding invoice" msgstr "" @@ -9282,7 +9299,7 @@ msgstr "" msgid "Capacity Planning" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1061 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1085 msgid "Capacity Planning Error, planned start time can not be same as end time" msgstr "" @@ -9326,7 +9343,7 @@ msgstr "" msgid "Capital Work in Progress" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:210 +#: erpnext/assets/doctype/asset/asset.js:220 msgid "Capitalize Asset" msgstr "" @@ -9335,7 +9352,7 @@ msgstr "" msgid "Capitalize Repair Cost" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:208 +#: erpnext/assets/doctype/asset/asset.js:218 msgid "Capitalize this asset before submitting." msgstr "" @@ -9524,8 +9541,8 @@ msgstr "" msgid "Category-wise Asset Value" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:297 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:130 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:298 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:140 msgid "Caution" msgstr "" @@ -9647,7 +9664,7 @@ msgstr "" msgid "Changes in {0}" msgstr "" -#: erpnext/stock/doctype/item/item.js:337 +#: erpnext/stock/doctype/item/item.js:355 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "" @@ -9661,8 +9678,8 @@ msgstr "" msgid "Channel Partner" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2252 -#: erpnext/controllers/accounts_controller.py:3243 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2256 +#: erpnext/controllers/accounts_controller.py:3246 msgid "Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount" msgstr "" @@ -9848,7 +9865,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:2851 +#: erpnext/public/js/controllers/transaction.js:2853 msgid "Cheque/Reference Date" msgstr "" @@ -9902,7 +9919,7 @@ msgstr "" #. Label of the child_row_reference (Data) field in DocType 'Quality #. Inspection' -#: erpnext/public/js/controllers/transaction.js:2946 +#: erpnext/public/js/controllers/transaction.js:2948 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Child Row Reference" msgstr "" @@ -9911,7 +9928,7 @@ msgstr "" msgid "Child Table Not Allowed" msgstr "" -#: erpnext/projects/doctype/task/task.py:312 +#: erpnext/projects/doctype/task/task.py:314 msgid "Child Task exists for this Task. You can not delete this Task." msgstr "" @@ -9929,7 +9946,7 @@ msgstr "" msgid "Child warehouse exists for this warehouse. You can not delete this warehouse." msgstr "" -#: erpnext/projects/doctype/task/task.py:260 +#: erpnext/projects/doctype/task/task.py:262 msgid "Circular Reference Error" msgstr "" @@ -9955,7 +9972,9 @@ msgstr "" msgid "Clauses and Conditions" msgstr "" -#: erpnext/public/js/utils/demo.js:5 +#. Label of a standard navbar item +#. Type: Action +#: erpnext/hooks.py erpnext/public/js/utils/demo.js:5 msgid "Clear Demo Data" msgstr "" @@ -10070,11 +10089,11 @@ msgstr "" msgid "Closed Documents" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2423 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2447 msgid "Closed Work Order can not be stopped or Re-opened" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:536 +#: erpnext/selling/doctype/sales_order/sales_order.py:538 msgid "Closed order cannot be cancelled. Unclose to cancel." msgstr "" @@ -10555,7 +10574,7 @@ msgstr "" #: erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.js:8 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:9 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:8 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:180 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:192 #: erpnext/accounts/report/general_ledger/general_ledger.js:8 #: erpnext/accounts/report/general_ledger/general_ledger.py:59 #: erpnext/accounts/report/gross_profit/gross_profit.js:8 @@ -10745,9 +10764,9 @@ msgstr "" #: erpnext/stock/report/stock_analytics/stock_analytics.js:41 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:7 #: erpnext/stock/report/stock_balance/stock_balance.js:8 -#: erpnext/stock/report/stock_balance/stock_balance.py:537 +#: 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:358 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:422 #: 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 @@ -10763,6 +10782,7 @@ msgstr "" #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 #: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "" @@ -10831,7 +10851,7 @@ msgstr "" msgid "Company Address Name" msgstr "" -#: erpnext/controllers/accounts_controller.py:4324 +#: erpnext/controllers/accounts_controller.py:4340 msgid "Company Address is missing. You don't have permission to update it. Please contact your System Manager." msgstr "" @@ -10927,12 +10947,12 @@ msgstr "" msgid "Company and Posting Date is mandatory" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2580 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2583 msgid "Company currencies of both the companies should match for Inter Company Transactions." msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:752 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:753 msgid "Company field is required" msgstr "" @@ -10958,7 +10978,7 @@ msgstr "" msgid "Company name not same" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:326 +#: erpnext/assets/doctype/asset/asset.py:330 msgid "Company of asset {0} and purchase document {1} doesn't matches." msgstr "" @@ -11051,7 +11071,7 @@ msgstr "" msgid "Completed On" msgstr "" -#: erpnext/projects/doctype/task/task.py:185 +#: erpnext/projects/doctype/task/task.py:187 msgid "Completed On cannot be greater than Today" msgstr "" @@ -11075,7 +11095,7 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1344 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1368 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" @@ -11142,6 +11162,16 @@ msgstr "" msgid "Component Name" msgstr "" +#. Option for the 'Asset Type' (Select) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Composite Asset" +msgstr "" + +#. Option for the 'Asset Type' (Select) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Composite Component" +msgstr "" + #. Label of the comprehensive_insurance (Data) field in DocType 'Asset' #: erpnext/assets/doctype/asset/asset.json msgid "Comprehensive Insurance" @@ -11201,6 +11231,11 @@ msgstr "" msgid "Confirmation Date" msgstr "" +#. Label of the connection_tab (Tab Break) field in DocType 'Asset Repair' +#: erpnext/assets/doctype/asset_repair/asset_repair.json +msgid "Connection" +msgstr "" + #: erpnext/accounts/report/general_ledger/general_ledger.js:175 msgid "Consider Accounting Dimensions" msgstr "" @@ -11402,7 +11437,7 @@ msgstr "" msgid "Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1720 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1744 msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}" msgstr "" @@ -11421,7 +11456,7 @@ msgstr "" msgid "Consumed Stock Items" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:303 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:286 msgid "Consumed Stock Items, Consumed Asset Items or Consumed Service Items is mandatory for Capitalization" msgstr "" @@ -11712,7 +11747,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/public/js/utils.js:811 +#: erpnext/public/js/utils.js:876 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/stock/doctype/packed_item/packed_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -11742,19 +11777,19 @@ msgstr "" msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "" -#: erpnext/controllers/stock_controller.py:86 +#: erpnext/controllers/stock_controller.py:127 msgid "Conversion factor for item {0} has been reset to 1.0 as the uom {1} is same as stock uom {2}." msgstr "" -#: erpnext/controllers/accounts_controller.py:2958 +#: erpnext/controllers/accounts_controller.py:2961 msgid "Conversion rate cannot be 0" msgstr "" -#: erpnext/controllers/accounts_controller.py:2965 +#: erpnext/controllers/accounts_controller.py:2968 msgid "Conversion rate is 1.00, but document currency is different from company currency" msgstr "" -#: erpnext/controllers/accounts_controller.py:2961 +#: erpnext/controllers/accounts_controller.py:2964 msgid "Conversion rate must be 1.00 if document currency is same as company currency" msgstr "" @@ -11967,7 +12002,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:28 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:47 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:30 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1197 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1239 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:47 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.js:42 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:204 @@ -12083,11 +12118,11 @@ msgstr "" msgid "Cost Center {0} cannot be used for allocation as it is used as main cost center in other allocation record." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:354 +#: erpnext/assets/doctype/asset/asset.py:358 msgid "Cost Center {} doesn't belong to Company {}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:361 +#: erpnext/assets/doctype/asset/asset.py:365 msgid "Cost Center {} is a group cost center and group cost centers cannot be used in transactions" msgstr "" @@ -12129,7 +12164,7 @@ msgstr "" msgid "Cost of Goods Sold" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:736 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:737 msgid "Cost of Goods Sold Account in Items Table" msgstr "" @@ -12164,10 +12199,12 @@ msgstr "" #. Label of the currency_detail (Section Break) field in DocType 'BOM Creator' #. Label of the costing_section (Section Break) field in DocType 'BOM #. Operation' +#. Label of the costing_tab (Tab Break) field in DocType 'Project' #. Label of the sb_costing (Section Break) field in DocType 'Task' #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json +#: erpnext/projects/doctype/project/project.json #: erpnext/projects/doctype/task/task.json msgid "Costing" msgstr "" @@ -12206,7 +12243,7 @@ msgstr "" msgid "Could Not Delete Demo Data" msgstr "" -#: erpnext/selling/doctype/quotation/quotation.py:614 +#: erpnext/selling/doctype/quotation/quotation.py:621 msgid "Could not auto create Customer due to the following missing mandatory field(s):" msgstr "" @@ -12346,10 +12383,6 @@ msgstr "" msgid "Create Delivery Trip" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:162 -msgid "Create Depreciation Entry" -msgstr "" - #: erpnext/utilities/activation.py:137 msgid "Create Employee" msgstr "" @@ -12671,12 +12704,12 @@ msgstr "" msgid "Create Users" msgstr "" -#: erpnext/stock/doctype/item/item.js:879 +#: erpnext/stock/doctype/item/item.js:897 msgid "Create Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:693 -#: erpnext/stock/doctype/item/item.js:737 +#: erpnext/stock/doctype/item/item.js:711 +#: erpnext/stock/doctype/item/item.js:755 msgid "Create Variants" msgstr "" @@ -12695,12 +12728,12 @@ msgstr "" msgid "Create Workstation" msgstr "" -#: erpnext/stock/doctype/item/item.js:720 -#: erpnext/stock/doctype/item/item.js:872 +#: erpnext/stock/doctype/item/item.js:738 +#: erpnext/stock/doctype/item/item.js:890 msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2011 +#: erpnext/stock/stock_ledger.py:2014 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -12778,7 +12811,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:704 #: erpnext/buying/doctype/purchase_order/purchase_order.js:497 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:73 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:74 msgid "Creating Purchase Receipt ..." msgstr "" @@ -12986,7 +13019,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:176 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:147 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1220 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1262 #: erpnext/controllers/sales_and_purchase_return.py:453 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:303 #: erpnext/stock/doctype/delivery_note/delivery_note.js:89 @@ -13222,8 +13255,8 @@ msgstr "" msgid "Currency filters are currently unsupported in Custom Financial Report." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1600 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1668 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1604 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1672 #: erpnext/accounts/utils.py:2456 msgid "Currency for {0} must be {1}" msgstr "" @@ -13572,7 +13605,7 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:384 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:385 #: erpnext/stock/doctype/warehouse/warehouse.json #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:36 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:121 @@ -13670,7 +13703,7 @@ msgstr "" #. Label of the customer_contact_display (Small Text) field in DocType #. 'Purchase Order' #. Label of the customer_contact (Small Text) field in DocType 'Delivery Stop' -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1191 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1233 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/stock/doctype/delivery_stop/delivery_stop.json msgid "Customer Contact" @@ -13775,7 +13808,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:104 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1248 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1290 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:85 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:185 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:56 @@ -13820,10 +13853,6 @@ msgstr "" msgid "Customer Group Name" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1344 -msgid "Customer Group: {0} does not exist" -msgstr "" - #. Label of the customer_groups (Table) field in DocType 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json msgid "Customer Groups" @@ -13839,7 +13868,7 @@ msgstr "" msgid "Customer Items" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1239 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1281 msgid "Customer LPO" msgstr "" @@ -13892,7 +13921,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1181 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1223 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:92 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:35 @@ -14056,7 +14085,7 @@ msgid "Customer required for 'Customerwise Discount'" msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1145 -#: erpnext/selling/doctype/sales_order/sales_order.py:432 +#: erpnext/selling/doctype/sales_order/sales_order.py:434 #: erpnext/stock/doctype/delivery_note/delivery_note.py:432 msgid "Customer {0} does not belong to project {1}" msgstr "" @@ -14473,7 +14502,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:178 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:147 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1223 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1265 #: erpnext/controllers/sales_and_purchase_return.py:457 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:304 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:45 @@ -14677,15 +14706,15 @@ msgstr "" msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2220 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2244 msgid "Default BOM for {0} not found" msgstr "" -#: erpnext/controllers/accounts_controller.py:3941 +#: erpnext/controllers/accounts_controller.py:3960 msgid "Default BOM not found for FG Item {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2217 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2241 msgid "Default BOM not found for Item {0} and Project {1}" msgstr "" @@ -15398,7 +15427,7 @@ msgstr "" #: 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/public/js/utils.js:804 +#: erpnext/public/js/utils.js:869 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:624 #: erpnext/selling/doctype/sales_order/sales_order.js:1486 @@ -15455,7 +15484,7 @@ msgstr "" #: erpnext/stock/doctype/delivery_stop/delivery_stop.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:52 #: erpnext/stock/doctype/packing_slip/packing_slip.json -#: erpnext/stock/doctype/pick_list/pick_list.js:132 +#: erpnext/stock/doctype/pick_list/pick_list.js:134 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:59 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/shipment_delivery_note/shipment_delivery_note.json @@ -15505,7 +15534,7 @@ msgstr "" msgid "Delivery Note {0} is not submitted" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1243 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1285 #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:73 msgid "Delivery Notes" msgstr "" @@ -15591,7 +15620,7 @@ msgstr "" msgid "Delivery to" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:451 +#: erpnext/selling/doctype/sales_order/sales_order.py:453 msgid "Delivery warehouse required for stock item {0}" msgstr "" @@ -15648,7 +15677,7 @@ msgstr "" msgid "Dependent Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:178 +#: erpnext/projects/doctype/task/task.py:180 msgid "Dependent Task {0} is not a Template Task" msgstr "" @@ -15706,7 +15735,7 @@ msgstr "" #. Label of the depreciation_amount (Currency) field in DocType 'Depreciation #. Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:172 -#: erpnext/assets/doctype/asset/asset.js:339 +#: erpnext/assets/doctype/asset/asset.js:372 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Depreciation Amount" msgstr "" @@ -15719,8 +15748,10 @@ msgstr "" msgid "Depreciation Date" msgstr "" +#. Label of the section_break_33 (Section Break) field in DocType 'Asset' #. Label of the depreciation_details_section (Section Break) field in DocType #. 'Asset Depreciation Schedule' +#: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json msgid "Depreciation Details" msgstr "" @@ -15735,6 +15766,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:190 +#: erpnext/assets/doctype/asset/asset.js:119 msgid "Depreciation Entry" msgstr "" @@ -15743,7 +15775,7 @@ msgstr "" msgid "Depreciation Entry Posting Status" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1255 +#: erpnext/assets/doctype/asset/asset.py:1259 msgid "Depreciation Entry against asset {0}" msgstr "" @@ -15786,15 +15818,15 @@ msgstr "" msgid "Depreciation Posting Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:881 +#: erpnext/assets/doctype/asset/asset.js:909 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:383 +#: erpnext/assets/doctype/asset/asset.py:387 msgid "Depreciation Row {0}: Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:715 +#: erpnext/assets/doctype/asset/asset.py:719 msgid "Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}" msgstr "" @@ -15823,7 +15855,7 @@ msgstr "" msgid "Depreciation Schedule View" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:478 +#: erpnext/assets/doctype/asset/asset.py:482 msgid "Depreciation cannot be calculated for fully depreciated assets" msgstr "" @@ -15903,11 +15935,11 @@ msgstr "" msgid "Difference Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:725 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:726 msgid "Difference Account in Items Table" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:714 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:715 msgid "Difference Account must be a Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" msgstr "" @@ -16378,7 +16410,7 @@ msgstr "" msgid "Discount must be less than 100" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3353 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3357 msgid "Discount of {} applied as per Payment Term" msgstr "" @@ -16531,7 +16563,7 @@ msgstr "" msgid "Disposal Date" msgstr "" -#: erpnext/assets/doctype/asset/depreciation.py:828 +#: erpnext/assets/doctype/asset/depreciation.py:832 msgid "Disposal date {0} cannot be before {1} date {2} of the asset." msgstr "" @@ -16698,7 +16730,7 @@ msgstr "" msgid "Do not update variants on save" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:919 +#: erpnext/assets/doctype/asset/asset.js:947 msgid "Do you really want to restore this scrapped asset?" msgstr "" @@ -17036,7 +17068,7 @@ msgstr "" msgid "Duplicate Entry. Please check Authorization Rule {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:410 +#: erpnext/assets/doctype/asset/asset.py:414 msgid "Duplicate Finance Book" msgstr "" @@ -17074,7 +17106,7 @@ msgstr "" msgid "Duplicate Sales Invoices found" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1454 +#: erpnext/stock/serial_batch_bundle.py:1462 msgid "Duplicate Serial Number Error" msgstr "" @@ -17202,7 +17234,7 @@ msgstr "" msgid "Earliest" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:549 +#: erpnext/stock/report/stock_balance/stock_balance.py:591 msgid "Earliest Age" msgstr "" @@ -17411,7 +17443,7 @@ msgstr "" msgid "Email Sent" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:358 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:371 msgid "Email Sent to Supplier {0}" msgstr "" @@ -17780,6 +17812,12 @@ 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" +msgstr "" + #. Label of the enable_stock_reservation (Check) field in DocType 'Stock #. Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -17891,7 +17929,7 @@ msgstr "" msgid "End Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:310 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:311 msgid "End Transit" msgstr "" @@ -18004,7 +18042,7 @@ msgstr "" msgid "Enter amount to be redeemed." msgstr "" -#: erpnext/stock/doctype/item/item.js:1041 +#: erpnext/stock/doctype/item/item.js:1059 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "" @@ -18016,11 +18054,11 @@ msgstr "" msgid "Enter customer's phone number" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:890 +#: erpnext/assets/doctype/asset/asset.js:918 msgid "Enter date to scrap asset" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:476 +#: erpnext/assets/doctype/asset/asset.py:480 msgid "Enter depreciation details" msgstr "" @@ -18051,7 +18089,7 @@ msgstr "" msgid "Enter the name of the bank or lending institution before submitting." msgstr "" -#: erpnext/stock/doctype/item/item.js:1067 +#: erpnext/stock/doctype/item/item.js:1085 msgid "Enter the opening stock units." msgstr "" @@ -18221,7 +18259,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:2275 +#: erpnext/stock/stock_ledger.py:2278 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -18376,7 +18414,7 @@ msgstr "" msgid "Excise Entry" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1412 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1409 msgid "Excise Invoice" msgstr "" @@ -18425,6 +18463,11 @@ msgstr "" msgid "Exhibition" msgstr "" +#. Option for the 'Asset Type' (Select) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Existing Asset" +msgstr "" + #. Option for the 'Create Chart Of Accounts Based On' (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -18485,7 +18528,7 @@ msgstr "" msgid "Expected Delivery Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:413 +#: erpnext/selling/doctype/sales_order/sales_order.py:415 msgid "Expected Delivery Date should be after Sales Order Date" msgstr "" @@ -18567,7 +18610,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/controllers/stock_controller.py:900 +#: erpnext/controllers/stock_controller.py:941 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -18615,7 +18658,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/controllers/stock_controller.py:880 +#: erpnext/controllers/stock_controller.py:921 msgid "Expense Account Missing" msgstr "" @@ -18662,7 +18705,7 @@ msgid "Expenses Included In Valuation" msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:271 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:408 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:409 msgid "Expired Batches" msgstr "" @@ -18833,7 +18876,7 @@ msgstr "" msgid "Failed to parse MT940 format. Error: {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:221 +#: erpnext/assets/doctype/asset/asset.js:253 msgid "Failed to post depreciation entries" msgstr "" @@ -18911,7 +18954,7 @@ msgstr "" msgid "Fetch Customers" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:80 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:82 msgid "Fetch Items from Warehouse" msgstr "" @@ -18950,7 +18993,7 @@ msgid "Fetch Value From" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:729 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:730 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "" @@ -18971,7 +19014,7 @@ msgid "Fetching Sales Orders..." msgstr "" #: erpnext/accounts/doctype/dunning/dunning.js:135 -#: erpnext/public/js/controllers/transaction.js:1588 +#: erpnext/public/js/controllers/transaction.js:1590 msgid "Fetching exchange rates ..." msgstr "" @@ -19143,7 +19186,7 @@ msgstr "" msgid "Finance Book Id" msgstr "" -#. Label of the section_break_36 (Section Break) field in DocType 'Asset' +#. Label of the finance_books (Table) field in DocType 'Asset' #. Label of the finance_books (Table) field in DocType 'Asset Category' #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_category/asset_category.json @@ -19244,7 +19287,7 @@ msgstr "" #. Service Item' #. Label of the fg_item (Link) field in DocType 'Subcontracting Order Service #. Item' -#: erpnext/public/js/utils.js:830 +#: erpnext/public/js/utils.js:895 #: erpnext/subcontracting/doctype/subcontracting_inward_order_service_item/subcontracting_inward_order_service_item.json #: erpnext/subcontracting/doctype/subcontracting_order_service_item/subcontracting_order_service_item.json msgid "Finished Good Item" @@ -19257,7 +19300,7 @@ msgstr "" msgid "Finished Good Item Code" msgstr "" -#: erpnext/public/js/utils.js:848 +#: erpnext/public/js/utils.js:913 msgid "Finished Good Item Qty" msgstr "" @@ -19270,15 +19313,15 @@ msgstr "" msgid "Finished Good Item Quantity" msgstr "" -#: erpnext/controllers/accounts_controller.py:3927 +#: erpnext/controllers/accounts_controller.py:3946 msgid "Finished Good Item is not specified for service item {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:3944 +#: erpnext/controllers/accounts_controller.py:3963 msgid "Finished Good Item {0} Qty can not be zero" msgstr "" -#: erpnext/controllers/accounts_controller.py:3938 +#: erpnext/controllers/accounts_controller.py:3957 msgid "Finished Good Item {0} must be a sub-contracted item" msgstr "" @@ -19364,7 +19407,7 @@ msgstr "" msgid "Finished Goods based Operating Cost" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1671 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1672 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" @@ -19508,7 +19551,7 @@ msgstr "" #. Capitalization Asset Item' #. Label of the fixed_asset_account (Link) field in DocType 'Asset Category #. Account' -#: erpnext/assets/doctype/asset/asset.py:897 +#: erpnext/assets/doctype/asset/asset.py:901 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/doctype/asset_category_account/asset_category_account.json msgid "Fixed Asset Account" @@ -19673,7 +19716,7 @@ msgstr "" msgid "For Item" msgstr "" -#: erpnext/controllers/stock_controller.py:1559 +#: erpnext/controllers/stock_controller.py:1600 msgid "For Item {0} cannot be received more than {1} qty against the {2} {3}" msgstr "" @@ -19704,7 +19747,7 @@ msgstr "" msgid "For Production" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:837 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:838 msgid "For Quantity (Manufactured Qty) is mandatory" msgstr "" @@ -19772,7 +19815,7 @@ msgstr "" msgid "For individual supplier" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:330 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:370 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 "" @@ -19784,12 +19827,12 @@ 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:2570 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2594 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})" msgstr "" #: erpnext/projects/doctype/project/project.js:208 -msgid "For project {0}, update your status" +msgid "For project - {0}, update your status" msgstr "" #. Description of the 'Parent Warehouse' (Link) field in DocType 'Master @@ -19801,7 +19844,7 @@ msgstr "" msgid "For projected and forecast quantities, the system will consider all child warehouses under the selected parent warehouse." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1704 msgid "For quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -19834,20 +19877,20 @@ msgstr "" msgid "For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:978 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:979 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." msgstr "" -#: erpnext/public/js/controllers/transaction.js:1398 +#: erpnext/public/js/controllers/transaction.js:1400 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:401 +#: erpnext/controllers/stock_controller.py:442 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" -#: erpnext/controllers/sales_and_purchase_return.py:1238 +#: erpnext/controllers/sales_and_purchase_return.py:1245 msgid "For the {0}, the quantity is required to make the return entry" msgstr "" @@ -20410,14 +20453,14 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:188 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:155 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1235 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1277 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:177 msgid "Future Payment Amount" msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:187 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:154 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1234 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1276 msgid "Future Payment Ref" msgstr "" @@ -20440,7 +20483,7 @@ msgid "GENERAL LEDGER" msgstr "" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:170 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:238 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:250 msgid "GL Balance" msgstr "" @@ -20729,9 +20772,9 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1125 #: erpnext/buying/doctype/purchase_order/purchase_order.js:540 #: erpnext/buying/doctype/purchase_order/purchase_order.js:563 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:376 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:398 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:443 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:383 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:405 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:450 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:75 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:108 #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:80 @@ -20749,12 +20792,12 @@ msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:238 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:144 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:244 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:398 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:431 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:522 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:696 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:164 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:399 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:432 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:523 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:697 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "" @@ -20769,12 +20812,12 @@ msgid "Get Items for Purchase Only" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:732 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:745 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:733 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:746 msgid "Get Items from BOM" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:415 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:422 msgid "Get Items from Material Requests against this Supplier" msgstr "" @@ -20864,12 +20907,12 @@ msgstr "" msgid "Get Sub Assembly Items" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:457 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:477 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:464 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:484 msgid "Get Suppliers" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:481 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:488 msgid "Get Suppliers By" msgstr "" @@ -20890,7 +20933,7 @@ msgstr "" msgid "Get stops from" msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:194 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:195 msgid "Getting Scrap Items" msgstr "" @@ -20945,7 +20988,7 @@ msgstr "" msgid "Goods Transferred" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2221 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2222 msgid "Goods are already received against the outward entry {0}" msgstr "" @@ -21242,7 +21285,7 @@ msgstr "" msgid "Group Same Items" msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.py:120 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:142 msgid "Group Warehouses cannot be used in transactions. Please change the value of {0}" msgstr "" @@ -21547,7 +21590,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:1996 +#: erpnext/stock/stock_ledger.py:1999 msgid "Here are the options to proceed:" msgstr "" @@ -22132,7 +22175,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:2006 +#: erpnext/stock/stock_ledger.py:2009 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -22161,7 +22204,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:1999 +#: erpnext/stock/stock_ledger.py:2002 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 "" @@ -22248,7 +22291,7 @@ msgstr "" msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "" -#: erpnext/stock/doctype/item/item.js:1053 +#: erpnext/stock/doctype/item/item.js:1071 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 "" @@ -22313,8 +22356,11 @@ msgstr "" #. 'Purchase Invoice' #. Label of the ignore_default_payment_terms_template (Check) field in DocType #. 'Sales Invoice' +#. Label of the ignore_default_payment_terms_template (Check) field in DocType +#. 'Sales Order' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json +#: erpnext/selling/doctype/sales_order/sales_order.json msgid "Ignore Default Payment Terms Template" msgstr "" @@ -22324,7 +22370,7 @@ msgstr "" msgid "Ignore Employee Time Overlap" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:143 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:145 msgid "Ignore Empty Stock" msgstr "" @@ -22553,8 +22599,8 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:112 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 -#: erpnext/stock/report/stock_balance/stock_balance.py:504 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:237 +#: erpnext/stock/report/stock_balance/stock_balance.py:546 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:301 msgid "In Qty" msgstr "" @@ -22585,7 +22631,7 @@ msgstr "" msgid "In Transit Warehouse" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:510 +#: erpnext/stock/report/stock_balance/stock_balance.py:552 msgid "In Value" msgstr "" @@ -22680,7 +22726,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:1086 +#: erpnext/stock/doctype/item/item.js:1104 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "" @@ -22973,7 +23019,7 @@ msgstr "" #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:146 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:167 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:280 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:344 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:193 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:96 msgid "Incoming Rate" @@ -22992,6 +23038,10 @@ msgstr "" msgid "Incompatible Setting Detected" msgstr "" +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:191 +msgid "Incorrect Account" +msgstr "" + #. Name of a report #: erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.json msgid "Incorrect Balance Qty After Transaction" @@ -23005,16 +23055,20 @@ msgstr "" msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:985 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:142 +msgid "Incorrect Company" +msgstr "" + +#: erpnext/stock/doctype/stock_entry/stock_entry.py:986 msgid "Incorrect Component Quantity" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:386 +#: erpnext/assets/doctype/asset/asset.py:390 #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py:56 msgid "Incorrect Date" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:135 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:157 msgid "Incorrect Invoice" msgstr "" @@ -23022,7 +23076,7 @@ msgstr "" msgid "Incorrect Payment Type" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:108 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:113 msgid "Incorrect Reference Document (Purchase Receipt Item)" msgstr "" @@ -23050,7 +23104,7 @@ msgid "Incorrect Type of Transaction" msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:175 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:123 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:145 msgid "Incorrect Warehouse" msgstr "" @@ -23206,14 +23260,14 @@ msgstr "" msgid "Inspected By" msgstr "" -#: erpnext/controllers/stock_controller.py:1453 +#: erpnext/controllers/stock_controller.py:1494 #: erpnext/manufacturing/doctype/job_card/job_card.py:815 msgid "Inspection Rejected" msgstr "" #. Label of the inspection_required (Check) field in DocType 'Stock Entry' -#: erpnext/controllers/stock_controller.py:1423 -#: erpnext/controllers/stock_controller.py:1425 +#: erpnext/controllers/stock_controller.py:1464 +#: erpnext/controllers/stock_controller.py:1466 #: erpnext/stock/doctype/stock_entry/stock_entry.json msgid "Inspection Required" msgstr "" @@ -23230,7 +23284,7 @@ msgstr "" msgid "Inspection Required before Purchase" msgstr "" -#: erpnext/controllers/stock_controller.py:1438 +#: erpnext/controllers/stock_controller.py:1479 #: erpnext/manufacturing/doctype/job_card/job_card.py:796 msgid "Inspection Submission" msgstr "" @@ -23300,8 +23354,8 @@ msgstr "" msgid "Insufficient Capacity" msgstr "" -#: erpnext/controllers/accounts_controller.py:3837 -#: erpnext/controllers/accounts_controller.py:3861 +#: erpnext/controllers/accounts_controller.py:3840 +#: erpnext/controllers/accounts_controller.py:3864 msgid "Insufficient Permissions" msgstr "" @@ -23309,13 +23363,13 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:134 #: erpnext/stock/doctype/pick_list/pick_list.py:152 #: erpnext/stock/doctype/pick_list/pick_list.py:1019 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:957 -#: erpnext/stock/serial_batch_bundle.py:1197 erpnext/stock/stock_ledger.py:1710 -#: erpnext/stock/stock_ledger.py:2166 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:958 +#: erpnext/stock/serial_batch_bundle.py:1205 erpnext/stock/stock_ledger.py:1710 +#: erpnext/stock/stock_ledger.py:2169 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2181 +#: erpnext/stock/stock_ledger.py:2184 msgid "Insufficient Stock for Batch" msgstr "" @@ -23323,7 +23377,7 @@ msgstr "" msgid "Insufficient Stock for Product Bundle Items" msgstr "" -#. Label of the insurance_details_tab (Tab Break) field in DocType 'Asset' +#. Label of the insurance_section (Section Break) field in DocType 'Asset' #: erpnext/assets/doctype/asset/asset.json msgid "Insurance" msgstr "" @@ -23451,7 +23505,7 @@ msgstr "" msgid "Interest Income" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2987 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2991 msgid "Interest and/or dunning fee" msgstr "" @@ -23536,7 +23590,7 @@ msgstr "" msgid "Internal Work History" msgstr "" -#: erpnext/controllers/stock_controller.py:1520 +#: erpnext/controllers/stock_controller.py:1561 msgid "Internal transfers can only be done in company's default currency" msgstr "" @@ -23556,11 +23610,15 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1029 #: erpnext/assets/doctype/asset_category/asset_category.py:69 #: erpnext/assets/doctype/asset_category/asset_category.py:97 -#: erpnext/controllers/accounts_controller.py:3204 -#: erpnext/controllers/accounts_controller.py:3212 +#: erpnext/controllers/accounts_controller.py:3207 +#: erpnext/controllers/accounts_controller.py:3215 msgid "Invalid Account" msgstr "" +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:418 +msgid "Invalid Accounting Dimension" +msgstr "" + #: erpnext/accounts/doctype/payment_entry/payment_entry.py:400 #: erpnext/accounts/doctype/payment_request/payment_request.py:1004 msgid "Invalid Allocated Amount" @@ -23582,7 +23640,7 @@ msgstr "" msgid "Invalid Barcode. There is no Item attached to this barcode." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3206 +#: erpnext/public/js/controllers/transaction.js:3209 msgid "Invalid Blanket Order for the selected Customer and Item" msgstr "" @@ -23598,17 +23656,17 @@ msgstr "" msgid "Invalid Company Field" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2355 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2358 msgid "Invalid Company for Inter Company Transaction." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:357 -#: erpnext/assets/doctype/asset/asset.py:364 -#: erpnext/controllers/accounts_controller.py:3227 +#: erpnext/assets/doctype/asset/asset.py:361 +#: erpnext/assets/doctype/asset/asset.py:368 +#: erpnext/controllers/accounts_controller.py:3230 msgid "Invalid Cost Center" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:415 +#: erpnext/selling/doctype/sales_order/sales_order.py:417 msgid "Invalid Delivery Date" msgstr "" @@ -23620,7 +23678,7 @@ msgstr "" msgid "Invalid Discount Amount" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:122 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:129 msgid "Invalid Document" msgstr "" @@ -23651,7 +23709,7 @@ msgstr "" msgid "Invalid Ledger Entries" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:561 +#: erpnext/assets/doctype/asset/asset.py:565 msgid "Invalid Net Purchase Amount" msgstr "" @@ -23698,7 +23756,8 @@ msgstr "" msgid "Invalid Purchase Invoice" msgstr "" -#: erpnext/controllers/accounts_controller.py:3881 +#: erpnext/controllers/accounts_controller.py:3884 +#: erpnext/controllers/accounts_controller.py:3898 msgid "Invalid Qty" msgstr "" @@ -23706,7 +23765,7 @@ msgstr "" msgid "Invalid Quantity" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:435 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:475 msgid "Invalid Query" msgstr "" @@ -23718,8 +23777,8 @@ msgstr "" msgid "Invalid Sales Invoices" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:652 -#: erpnext/assets/doctype/asset/asset.py:680 +#: erpnext/assets/doctype/asset/asset.py:656 +#: erpnext/assets/doctype/asset/asset.py:684 msgid "Invalid Schedule" msgstr "" @@ -23727,12 +23786,12 @@ msgstr "" msgid "Invalid Selling Price" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1746 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1747 msgid "Invalid Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1019 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1041 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1020 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1042 msgid "Invalid Source and Target Warehouse" msgstr "" @@ -23781,7 +23840,7 @@ msgstr "" msgid "Invalid result key. Response:" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:435 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:475 msgid "Invalid search query" msgstr "" @@ -23796,7 +23855,7 @@ msgstr "" msgid "Invalid {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2353 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2356 msgid "Invalid {0} for Inter Company Transaction." msgstr "" @@ -23860,6 +23919,12 @@ msgstr "" msgid "Investments" msgstr "" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Invite Users' +#: erpnext/setup/onboarding_step/invite_users/invite_users.json +msgid "Invite Users" +msgstr "" + #. Option for the 'Posting Date Inheritance for Exchange Gain / Loss' (Select) #. field in DocType 'Accounts Settings' #. Label of the sales_invoice (Link) field in DocType 'Discounted Invoice' @@ -23901,7 +23966,7 @@ msgstr "" msgid "Invoice Document Type Selection Error" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1215 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1257 msgid "Invoice Grand Total" msgstr "" @@ -24004,7 +24069,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:171 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:144 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1217 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1259 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:164 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:194 msgid "Invoiced Amount" @@ -24024,7 +24089,7 @@ msgstr "" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2404 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2407 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:62 msgid "Invoices" @@ -24155,16 +24220,6 @@ msgstr "" msgid "Is Company Account" msgstr "" -#. Label of the is_composite_asset (Check) field in DocType 'Asset' -#: erpnext/assets/doctype/asset/asset.json -msgid "Is Composite Asset" -msgstr "" - -#. Label of the is_composite_component (Check) field in DocType 'Asset' -#: erpnext/assets/doctype/asset/asset.json -msgid "Is Composite Component" -msgstr "" - #. Label of the is_consolidated (Check) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json msgid "Is Consolidated" @@ -24232,11 +24287,6 @@ msgstr "" msgid "Is Exchange Gain / Loss?" msgstr "" -#. Label of the is_existing_asset (Check) field in DocType 'Asset' -#: erpnext/assets/doctype/asset/asset.json -msgid "Is Existing Asset" -msgstr "" - #. Label of the is_expandable (Check) field in DocType 'BOM Creator Item' #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json msgid "Is Expandable" @@ -24709,11 +24759,11 @@ 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:2608 +#: erpnext/public/js/controllers/transaction.js:2610 msgid "It is needed to fetch Item Details." msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:171 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:211 msgid "It's not possible to distribute charges equally when total amount is zero, please set 'Distribute Charges Based On' as 'Quantity'" msgstr "" @@ -24826,8 +24876,8 @@ msgstr "" #: erpnext/stock/report/stock_ageing/stock_ageing.js:46 #: erpnext/stock/report/stock_analytics/stock_analytics.js:15 #: erpnext/stock/report/stock_analytics/stock_analytics.py:43 -#: erpnext/stock/report/stock_balance/stock_balance.py:431 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:207 +#: erpnext/stock/report/stock_balance/stock_balance.py:473 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:271 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:27 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:51 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:28 @@ -25073,10 +25123,10 @@ msgstr "" #: 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:2902 +#: erpnext/public/js/controllers/transaction.js:2904 #: erpnext/public/js/stock_reservation.js:112 -#: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:488 -#: erpnext/public/js/utils.js:645 +#: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:553 +#: erpnext/public/js/utils.js:710 #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/installation_note_item/installation_note_item.json @@ -25337,9 +25387,9 @@ msgstr "" #: erpnext/stock/report/stock_analytics/stock_analytics.js:8 #: erpnext/stock/report/stock_analytics/stock_analytics.py:52 #: erpnext/stock/report/stock_balance/stock_balance.js:32 -#: erpnext/stock/report/stock_balance/stock_balance.py:439 +#: erpnext/stock/report/stock_balance/stock_balance.py:481 #: erpnext/stock/report/stock_ledger/stock_ledger.js:71 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:265 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:329 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:39 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:113 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.js:33 @@ -25363,7 +25413,7 @@ msgstr "" msgid "Item Group Tree" msgstr "" -#: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:526 +#: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:525 msgid "Item Group not mentioned in item master for item {0}" msgstr "" @@ -25555,8 +25605,8 @@ msgstr "" #: 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:2908 -#: erpnext/public/js/utils.js:740 +#: erpnext/public/js/controllers/transaction.js:2910 +#: erpnext/public/js/utils.js:805 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:1252 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -25596,8 +25646,8 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:440 #: erpnext/stock/report/stock_ageing/stock_ageing.py:138 #: erpnext/stock/report/stock_analytics/stock_analytics.py:45 -#: erpnext/stock/report/stock_balance/stock_balance.py:437 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:213 +#: erpnext/stock/report/stock_balance/stock_balance.py:479 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:277 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:110 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:31 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:32 @@ -25706,7 +25756,7 @@ msgstr "" msgid "Item Row" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:145 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:167 msgid "Item Row {0}: {1} {2} does not exist in above '{1}' table" msgstr "" @@ -25845,7 +25895,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:151 +#: erpnext/stock/doctype/item/item.js:169 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -25853,7 +25903,7 @@ msgstr "" msgid "Item Variant Settings" msgstr "" -#: erpnext/stock/doctype/item/item.js:902 +#: erpnext/stock/doctype/item/item.js:920 msgid "Item Variant {0} already exists with same attributes" msgstr "" @@ -25949,7 +25999,7 @@ msgstr "" msgid "Item and Warranty Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3268 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3269 msgid "Item for row {0} does not match Material Request" msgstr "" @@ -25965,7 +26015,7 @@ msgstr "" msgid "Item is removed since no serial / batch no selected." msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:141 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:163 msgid "Item must be added using 'Get Items from Purchase Receipts' button" msgstr "" @@ -25979,11 +26029,11 @@ msgstr "" msgid "Item operation" msgstr "" -#: erpnext/controllers/accounts_controller.py:3919 +#: erpnext/controllers/accounts_controller.py:3938 msgid "Item qty can not be updated as raw materials are already processed." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1149 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1150 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "" @@ -26021,7 +26071,7 @@ msgstr "" msgid "Item {0} cannot be ordered more than {1} against Blanket Order {2}." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:339 +#: erpnext/assets/doctype/asset/asset.py:343 #: erpnext/stock/doctype/item/item.py:654 msgid "Item {0} does not exist" msgstr "" @@ -26030,11 +26080,11 @@ msgstr "" msgid "Item {0} does not exist in the system or has expired" msgstr "" -#: erpnext/controllers/stock_controller.py:515 +#: erpnext/controllers/stock_controller.py:556 msgid "Item {0} does not exist." msgstr "" -#: erpnext/controllers/selling_controller.py:851 +#: erpnext/controllers/selling_controller.py:852 msgid "Item {0} entered multiple times." msgstr "" @@ -26042,11 +26092,11 @@ msgstr "" msgid "Item {0} has already been returned" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:341 +#: erpnext/assets/doctype/asset/asset.py:345 msgid "Item {0} has been disabled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:789 +#: erpnext/selling/doctype/sales_order/sales_order.py:791 msgid "Item {0} has no Serial No. Only serialized items can have delivery based on Serial No" msgstr "" @@ -26082,11 +26132,11 @@ msgstr "" msgid "Item {0} is not a subcontracted item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2133 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2134 msgid "Item {0} is not active or end of life has been reached" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:343 +#: erpnext/assets/doctype/asset/asset.py:347 msgid "Item {0} must be a Fixed Asset Item" msgstr "" @@ -26098,11 +26148,11 @@ msgstr "" msgid "Item {0} must be a Sub-contracted Item" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:345 +#: erpnext/assets/doctype/asset/asset.py:349 msgid "Item {0} must be a non-stock item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1482 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1483 msgid "Item {0} not found in 'Raw Materials Supplied' table in {1} {2}" msgstr "" @@ -26110,7 +26160,7 @@ msgstr "" msgid "Item {0} not found." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:324 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:325 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "" @@ -26212,11 +26262,11 @@ msgstr "" msgid "Items and Pricing" msgstr "" -#: erpnext/controllers/accounts_controller.py:4182 +#: erpnext/controllers/accounts_controller.py:4198 msgid "Items cannot be updated as Subcontracting Inward Order(s) exist against this Subcontracted Sales Order." msgstr "" -#: erpnext/controllers/accounts_controller.py:4175 +#: erpnext/controllers/accounts_controller.py:4191 msgid "Items cannot be updated as Subcontracting Order is created against the Purchase Order {0}." msgstr "" @@ -26228,7 +26278,7 @@ msgstr "" msgid "Items not found." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1145 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1146 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "" @@ -26258,7 +26308,7 @@ msgstr "" msgid "Items under this warehouse will be suggested" msgstr "" -#: erpnext/controllers/stock_controller.py:125 +#: erpnext/controllers/stock_controller.py:166 msgid "Items {0} do not exist in the Item master." msgstr "" @@ -26443,7 +26493,7 @@ msgstr "" msgid "Job Worker Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2623 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2647 msgid "Job card {0} created" msgstr "" @@ -26493,8 +26543,8 @@ msgstr "" #: erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json #: erpnext/accounts/print_format/journal_auditing_voucher/journal_auditing_voucher.html:10 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/assets/doctype/asset/asset.js:345 -#: erpnext/assets/doctype/asset/asset.js:354 +#: erpnext/assets/doctype/asset/asset.js:378 +#: erpnext/assets/doctype/asset/asset.js:387 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -26865,7 +26915,7 @@ msgstr "" msgid "Latest" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:550 +#: erpnext/stock/report/stock_balance/stock_balance.py:592 msgid "Latest Age" msgstr "" @@ -27232,7 +27282,7 @@ msgstr "" msgid "Link to Material Request" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:448 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:455 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:80 msgid "Link to Material Requests" msgstr "" @@ -27304,7 +27354,7 @@ msgstr "" msgid "Load All Criteria" msgstr "" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:81 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:68 msgid "Loading Invoices! Please Wait..." msgstr "" @@ -27529,7 +27579,7 @@ msgstr "" msgid "Loyalty Points will be calculated from the spent done (via the Sales Invoice), based on collection factor mentioned." msgstr "" -#: erpnext/public/js/utils.js:109 +#: erpnext/public/js/utils.js:174 msgid "Loyalty Points: {0}" msgstr "" @@ -27647,7 +27697,7 @@ msgstr "" msgid "Main Item Code" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:134 +#: erpnext/assets/doctype/asset/asset.js:135 msgid "Maintain Asset" msgstr "" @@ -27892,7 +27942,7 @@ msgstr "" msgid "Make Difference Entry" msgstr "" -#: erpnext/stock/doctype/item/item.js:591 +#: erpnext/stock/doctype/item/item.js:609 msgid "Make Lead Time" msgstr "" @@ -27915,7 +27965,7 @@ msgid "Make Quotation" msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:330 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:127 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:128 msgid "Make Return Entry" msgstr "" @@ -27947,11 +27997,11 @@ msgstr "" msgid "Make project from a template." msgstr "" -#: erpnext/stock/doctype/item/item.js:699 +#: erpnext/stock/doctype/item/item.js:717 msgid "Make {0} Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:701 +#: erpnext/stock/doctype/item/item.js:719 msgid "Make {0} Variants" msgstr "" @@ -27959,15 +28009,6 @@ msgstr "" msgid "Making Journal Entries against advance accounts: {0} is not recommended. These Journals won't be available for Reconciliation." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:100 -#: erpnext/assets/doctype/asset/asset.js:108 -#: erpnext/assets/doctype/asset/asset.js:116 -#: erpnext/assets/doctype/asset/asset.js:124 -#: erpnext/assets/doctype/asset/asset.js:138 -#: erpnext/assets/doctype/asset/asset.js:148 -#: erpnext/assets/doctype/asset/asset.js:156 -#: erpnext/assets/doctype/asset/asset.js:166 -#: erpnext/assets/doctype/asset/asset.js:182 #: erpnext/setup/doctype/company/company.js:161 #: erpnext/setup/doctype/company/company.js:172 msgid "Manage" @@ -28004,7 +28045,7 @@ msgstr "" msgid "Mandatory Accounting Dimension" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1884 msgid "Mandatory Field" msgstr "" @@ -28020,7 +28061,7 @@ msgstr "" msgid "Mandatory For Profit and Loss Account" msgstr "" -#: erpnext/selling/doctype/quotation/quotation.py:618 +#: erpnext/selling/doctype/quotation/quotation.py:625 msgid "Mandatory Missing" msgstr "" @@ -28103,8 +28144,8 @@ msgstr "" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1226 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1242 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1227 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1243 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json @@ -28253,7 +28294,7 @@ msgstr "" msgid "Manufacturing Manager" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2386 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2387 msgid "Manufacturing Quantity is mandatory" msgstr "" @@ -28330,7 +28371,7 @@ msgstr "" msgid "Mapping Subcontracting Order ..." msgstr "" -#: erpnext/public/js/utils.js:975 +#: erpnext/public/js/utils.js:1040 msgid "Mapping {0} ..." msgstr "" @@ -28484,12 +28525,12 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:114 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1227 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1228 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:576 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:577 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "" @@ -28557,7 +28598,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/purchase_order/purchase_order.js:519 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:357 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:364 #: erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:56 #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -28576,13 +28617,13 @@ msgstr "" #: 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 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:423 -#: erpnext/stock/doctype/material_request/material_request.py:473 +#: erpnext/stock/doctype/material_request/material_request.py:426 +#: erpnext/stock/doctype/material_request/material_request.py:476 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:252 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:355 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:253 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:356 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json @@ -28661,7 +28702,7 @@ msgstr "" msgid "Material Request Type" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1834 +#: erpnext/selling/doctype/sales_order/sales_order.py:1836 msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" @@ -28869,7 +28910,7 @@ msgid "Max discount allowed for item: {0} is {1}%" msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:982 -#: erpnext/stock/doctype/pick_list/pick_list.js:198 +#: erpnext/stock/doctype/pick_list/pick_list.js:200 msgid "Max: {0}" msgstr "" @@ -28890,11 +28931,11 @@ msgstr "" msgid "Maximum Payment Amount" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3871 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3872 msgid "Maximum Samples - {0} can be retained for Batch {1} and Item {2}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3862 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3863 msgid "Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}." msgstr "" @@ -28949,7 +28990,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2012 +#: erpnext/stock/stock_ledger.py:2015 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -28994,7 +29035,7 @@ msgstr "" msgid "Merge Similar Account Heads" msgstr "" -#: erpnext/public/js/utils.js:1007 +#: erpnext/public/js/utils.js:1072 msgid "Merge taxes from multiple documents" msgstr "" @@ -29017,6 +29058,7 @@ msgstr "" #. Label of the message_for_supplier (Text Editor) field in DocType 'Request #. for Quotation' +#. Label of the mfs_html (Code) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json msgid "Message for Supplier" msgstr "" @@ -29235,7 +29277,7 @@ msgstr "" msgid "Min Qty should be greater than Recurse Over Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:853 +#: erpnext/stock/doctype/item/item.js:871 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "" @@ -29322,8 +29364,8 @@ msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:97 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:200 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:597 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2421 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3027 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2424 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3030 #: erpnext/assets/doctype/asset_category/asset_category.py:116 msgid "Missing Account" msgstr "" @@ -29333,11 +29375,11 @@ msgid "Missing Asset" msgstr "" #: erpnext/accounts/doctype/gl_entry/gl_entry.py:186 -#: erpnext/assets/doctype/asset/asset.py:373 +#: erpnext/assets/doctype/asset/asset.py:377 msgid "Missing Cost Center" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1144 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1148 msgid "Missing Default in Company" msgstr "" @@ -29345,11 +29387,11 @@ msgstr "" msgid "Missing Filters" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:418 +#: erpnext/assets/doctype/asset/asset.py:422 msgid "Missing Finance Book" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1681 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1682 msgid "Missing Finished Good" msgstr "" @@ -29357,7 +29399,7 @@ msgstr "" msgid "Missing Formula" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:992 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:993 msgid "Missing Item" msgstr "" @@ -29382,7 +29424,7 @@ msgid "Missing required filter: {0}" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1183 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1452 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1476 msgid "Missing value" msgstr "" @@ -29489,11 +29531,6 @@ msgstr "" msgid "Module (for Export)" msgstr "" -#. Label of the monitor_progress (Section Break) field in DocType 'Project' -#: erpnext/projects/doctype/project/project.json -msgid "Monitor Progress" -msgstr "" - #. Label of the monitor_for_last_x_days (Int) field in DocType 'Ledger Health #. Monitor' #: erpnext/accounts/doctype/ledger_health_monitor/ledger_health_monitor.json @@ -29644,7 +29681,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:175 +#: erpnext/stock/doctype/item/item.js:193 msgid "Multiple Variants" msgstr "" @@ -29660,7 +29697,7 @@ msgstr "" msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1688 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1689 msgid "Multiple items cannot be marked as finished item" msgstr "" @@ -29669,10 +29706,10 @@ msgid "Music" msgstr "" #. Label of the must_be_whole_number (Check) field in DocType 'UOM' -#: erpnext/manufacturing/doctype/work_order/work_order.py:1399 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1423 #: erpnext/setup/doctype/uom/uom.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267 -#: erpnext/utilities/transaction_base.py:566 +#: erpnext/utilities/transaction_base.py:567 msgid "Must be Whole Number" msgstr "" @@ -29797,8 +29834,8 @@ msgstr "" msgid "Negative Quantity is not allowed" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1502 -#: erpnext/stock/serial_batch_bundle.py:1520 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1532 +#: erpnext/stock/serial_batch_bundle.py:1528 msgid "Negative Stock Error" msgstr "" @@ -29953,11 +29990,11 @@ msgstr "" msgid "Net Purchase Amount" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:446 +#: erpnext/assets/doctype/asset/asset.py:450 msgid "Net Purchase Amount is mandatory" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:556 +#: erpnext/assets/doctype/asset/asset.py:560 msgid "Net Purchase Amount should be equal to purchase amount of one single Asset." msgstr "" @@ -30122,7 +30159,7 @@ msgstr "" msgid "New Asset Value" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:164 +#: erpnext/assets/dashboard_fixtures.py:169 msgid "New Assets (This Year)" msgstr "" @@ -30348,7 +30385,7 @@ msgstr "" msgid "No Answer" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2526 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2529 msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "" @@ -30442,7 +30479,7 @@ msgstr "" msgid "No Summary" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2510 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2513 msgid "No Supplier found for Inter Company Transactions which represents company {0}" msgstr "" @@ -30476,7 +30513,7 @@ msgstr "" msgid "No accounting entries for the following warehouses" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:795 +#: erpnext/selling/doctype/sales_order/sales_order.py:797 msgid "No active BOM found for item {0}. Delivery by Serial No cannot be ensured" msgstr "" @@ -30647,7 +30684,7 @@ msgstr "" msgid "No outstanding invoices require exchange rate revaluation" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2427 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2431 msgid "No outstanding {0} found for the {1} {2} which qualify the filters you have specified." msgstr "" @@ -30716,11 +30753,11 @@ msgstr "" msgid "No values" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2574 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2577 msgid "No {0} found for Inter Company Transactions." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:337 +#: erpnext/assets/doctype/asset/asset.js:370 msgid "No." msgstr "" @@ -31364,7 +31401,7 @@ msgstr "" msgid "Only one operation can have 'Is Final Finished Good' checked when 'Track Semi Finished Goods' is enabled." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1241 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1242 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "" @@ -31630,7 +31667,7 @@ msgid "Opening Invoice Tool" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1646 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1990 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1993 msgid "Opening Invoice has rounding adjustment of {0}.

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

Or, '{3}' can be enabled to not post any rounding adjustment." msgstr "" @@ -31656,7 +31693,7 @@ msgid "Opening Purchase Invoices have been created." msgstr "" #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 -#: erpnext/stock/report/stock_balance/stock_balance.py:490 +#: erpnext/stock/report/stock_balance/stock_balance.py:532 msgid "Opening Qty" msgstr "" @@ -31676,7 +31713,7 @@ msgstr "" msgid "Opening Time" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:497 +#: erpnext/stock/report/stock_balance/stock_balance.py:539 msgid "Opening Value" msgstr "" @@ -31794,7 +31831,7 @@ msgstr "" msgid "Operation Time" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1458 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1482 msgid "Operation Time must be greater than 0 for Operation {0}" msgstr "" @@ -31892,7 +31929,7 @@ msgstr "" #. Label of the opportunity_name (Link) field in DocType 'Customer' #. Label of the opportunity (Link) field in DocType 'Quotation' #. Label of a Workspace Sidebar Item -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:381 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:388 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json #: erpnext/crm/doctype/crm_settings/crm_settings.json @@ -32148,7 +32185,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:967 +#: erpnext/selling/doctype/sales_order/sales_order.py:969 #: erpnext/setup/doctype/company/company_dashboard.py:23 msgid "Orders" msgstr "" @@ -32156,9 +32193,13 @@ msgstr "" #. Label of the organization_section (Section Break) field in DocType 'Lead' #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/crm/doctype/lead/lead.json #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py:30 +#: erpnext/desktop_icon/organization.json +#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "" @@ -32187,7 +32228,6 @@ msgstr "" msgid "Other Details" msgstr "" -#. Label of the other_info_tab (Tab Break) field in DocType 'Asset' #. Label of the other_info_tab (Tab Break) field in DocType 'Stock Entry' #. Label of the tab_other_info (Tab Break) field in DocType 'Subcontracting #. Inward Order' @@ -32195,7 +32235,6 @@ msgstr "" #. Order' #. Label of the tab_other_info (Tab Break) field in DocType 'Subcontracting #. Receipt' -#: erpnext/assets/doctype/asset/asset.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json @@ -32261,12 +32300,12 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:119 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:83 -#: erpnext/stock/report/stock_balance/stock_balance.py:512 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:244 +#: erpnext/stock/report/stock_balance/stock_balance.py:554 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:308 msgid "Out Qty" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:518 +#: erpnext/stock/report/stock_balance/stock_balance.py:560 msgid "Out Value" msgstr "" @@ -32362,7 +32401,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:149 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1224 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1266 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:289 #: erpnext/accounts/report/sales_register/sales_register.py:319 @@ -32406,7 +32445,7 @@ msgstr "" msgid "Over Billing Allowance (%)" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1309 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1314 msgid "Over Billing Allowance exceeded for Purchase Receipt Item {0} ({1}) by {2}%" msgstr "" @@ -32424,7 +32463,7 @@ msgstr "" msgid "Over Picking Allowance" msgstr "" -#: erpnext/controllers/stock_controller.py:1690 +#: erpnext/controllers/stock_controller.py:1731 msgid "Over Receipt" msgstr "" @@ -32546,6 +32585,11 @@ msgstr "" msgid "Owner" msgstr "" +#. Label of the asset_owner_section (Section Break) field in DocType 'Asset' +#: erpnext/assets/doctype/asset/asset.json +msgid "Ownership" +msgstr "" + #. Label of the p_l_closing_balance (JSON) field in DocType 'Process Period #. Closing Voucher' #: erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.json @@ -32627,11 +32671,11 @@ msgstr "" msgid "POS Closing Entry Taxes" msgstr "" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:31 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:18 msgid "POS Closing Failed" msgstr "" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:53 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:40 msgid "POS Closing failed while running in a background process. You can resolve the {0} and retry the process again." msgstr "" @@ -32914,7 +32958,7 @@ msgstr "" msgid "Packed Items" msgstr "" -#: erpnext/controllers/stock_controller.py:1524 +#: erpnext/controllers/stock_controller.py:1565 msgid "Packed Items cannot be transferred internally" msgstr "" @@ -32993,7 +33037,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:146 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1218 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1260 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:165 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:201 #: erpnext/accounts/report/pos_register/pos_register.py:209 @@ -33028,7 +33072,7 @@ msgstr "" msgid "Paid Amount After Tax (Company Currency)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1940 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1944 msgid "Paid Amount cannot be greater than total negative outstanding amount {0}" msgstr "" @@ -33218,11 +33262,11 @@ msgstr "" msgid "Parent Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:168 +#: erpnext/projects/doctype/task/task.py:170 msgid "Parent Task {0} is not a Template Task" msgstr "" -#: erpnext/projects/doctype/task/task.py:191 +#: erpnext/projects/doctype/task/task.py:193 msgid "Parent Task {0} must be a Group Task" msgstr "" @@ -33457,10 +33501,11 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:142 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:54 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1155 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1197 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:71 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:147 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:228 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:49 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:240 #: erpnext/accounts/report/general_ledger/general_ledger.js:74 #: erpnext/accounts/report/general_ledger/general_ledger.py:752 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:51 @@ -33483,7 +33528,7 @@ msgstr "" #. Name of a DocType #: erpnext/accounts/doctype/party_account/party_account.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1166 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1208 msgid "Party Account" msgstr "" @@ -33631,10 +33676,11 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:81 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:58 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:41 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1149 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1191 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:58 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:141 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:219 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:231 #: erpnext/accounts/report/general_ledger/general_ledger.js:65 #: erpnext/accounts/report/general_ledger/general_ledger.py:751 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:41 @@ -33773,7 +33819,7 @@ msgid "Payable" msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:39 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1164 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1206 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:204 #: erpnext/accounts/report/purchase_register/purchase_register.py:194 #: erpnext/accounts/report/purchase_register/purchase_register.py:235 @@ -33985,7 +34031,7 @@ msgstr "" msgid "Payment Ledger" msgstr "" -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:248 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:260 msgid "Payment Ledger Balance" msgstr "" @@ -34216,7 +34262,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/controllers/accounts_controller.py:2729 +#: erpnext/controllers/accounts_controller.py:2732 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json msgid "Payment Schedule" @@ -34249,7 +34295,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json #: erpnext/accounts/doctype/payment_term/payment_term.json #: erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1214 +#: 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:492 @@ -34330,8 +34376,8 @@ msgstr "" msgid "Payment Terms Template Detail" msgstr "" -#. Description of the 'Automatically Fetch Payment Terms from Order' (Check) -#. field in DocType 'Accounts Settings' +#. Description of the 'Automatically Fetch Payment Terms from Order/Quotation' +#. (Check) field in DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "Payment Terms from orders will be fetched into the invoices as is" msgstr "" @@ -35208,7 +35254,7 @@ msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:123 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:222 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:145 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:146 msgid "Please Select a Supplier" msgstr "" @@ -35236,7 +35282,7 @@ msgstr "" msgid "Please add Operations first." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:200 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:210 msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "" @@ -35268,7 +35314,7 @@ msgstr "" msgid "Please add {1} role to user {0}." msgstr "" -#: erpnext/controllers/stock_controller.py:1701 +#: erpnext/controllers/stock_controller.py:1742 msgid "Please adjust the qty or edit {0} to proceed." msgstr "" @@ -35276,7 +35322,7 @@ msgstr "" msgid "Please attach CSV file" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3164 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3167 msgid "Please cancel and amend the Payment Entry" msgstr "" @@ -35306,6 +35352,10 @@ msgstr "" 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." +msgstr "" + #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:539 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "" @@ -35347,11 +35397,11 @@ msgstr "" msgid "Please convert the parent account in corresponding child company to a group account." msgstr "" -#: erpnext/selling/doctype/quotation/quotation.py:616 +#: erpnext/selling/doctype/quotation/quotation.py:623 msgid "Please create Customer from Lead {0}." msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:132 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:154 msgid "Please create Landed Cost Vouchers against Invoices that have 'Update Stock' enabled." msgstr "" @@ -35363,7 +35413,7 @@ msgstr "" msgid "Please create purchase from internal sale or delivery document itself" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:456 +#: erpnext/assets/doctype/asset/asset.py:460 msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "" @@ -35375,7 +35425,7 @@ msgstr "" msgid "Please disable workflow temporarily for Journal Entry {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:560 +#: erpnext/assets/doctype/asset/asset.py:564 msgid "Please do not book expense of multiple assets against one single Asset." msgstr "" @@ -35403,7 +35453,7 @@ msgstr "" msgid "Please enable {0} in the {1}." msgstr "" -#: erpnext/controllers/selling_controller.py:853 +#: erpnext/controllers/selling_controller.py:854 msgid "Please enable {} in {} to allow same item in multiple rows" msgstr "" @@ -35423,7 +35473,7 @@ msgstr "" msgid "Please ensure {} account {} is a Receivable account." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:700 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:701 msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}" msgstr "" @@ -35444,7 +35494,7 @@ msgstr "" msgid "Please enter Cost Center" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:419 +#: erpnext/selling/doctype/sales_order/sales_order.py:421 msgid "Please enter Delivery Date" msgstr "" @@ -35456,12 +35506,12 @@ msgstr "" msgid "Please enter Expense Account" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:86 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 #: erpnext/stock/doctype/stock_entry/stock_entry.js:87 msgid "Please enter Item Code to get Batch Number" msgstr "" -#: erpnext/public/js/controllers/transaction.js:3063 +#: erpnext/public/js/controllers/transaction.js:3066 msgid "Please enter Item Code to get batch no" msgstr "" @@ -35489,7 +35539,7 @@ msgstr "" msgid "Please enter Purchase Receipt first" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:113 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:118 msgid "Please enter Receipt Document" msgstr "" @@ -35538,7 +35588,7 @@ msgstr "" msgid "Please enter company name first" msgstr "" -#: erpnext/controllers/accounts_controller.py:2955 +#: erpnext/controllers/accounts_controller.py:2958 msgid "Please enter default currency in Company Master" msgstr "" @@ -35638,7 +35688,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:604 +#: erpnext/stock/doctype/item/item.js:622 msgid "Please mention 'Weight UOM' along with Weight." msgstr "" @@ -35693,7 +35743,7 @@ msgstr "" msgid "Please select Apply Discount On" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1782 +#: erpnext/selling/doctype/sales_order/sales_order.py:1784 msgid "Please select BOM against item {0}" msgstr "" @@ -35752,8 +35802,8 @@ msgstr "" msgid "Please select Finished Good Item for Service Item {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:716 -#: erpnext/assets/doctype/asset/asset.js:731 +#: erpnext/assets/doctype/asset/asset.js:744 +#: erpnext/assets/doctype/asset/asset.js:759 msgid "Please select Item Code first" msgstr "" @@ -35785,7 +35835,7 @@ msgstr "" msgid "Please select Price List" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:1784 +#: erpnext/selling/doctype/sales_order/sales_order.py:1786 msgid "Please select Qty against item {0}" msgstr "" @@ -35805,11 +35855,11 @@ msgstr "" msgid "Please select Stock Asset Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1605 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1606 msgid "Please select Subcontracting Order instead of Purchase Order {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:2804 +#: erpnext/controllers/accounts_controller.py:2807 msgid "Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}" msgstr "" @@ -35826,7 +35876,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:680 #: erpnext/manufacturing/doctype/bom/bom.py:276 #: erpnext/public/js/controllers/accounts.js:277 -#: erpnext/public/js/controllers/transaction.js:3362 +#: erpnext/public/js/controllers/transaction.js:3365 msgid "Please select a Company first." msgstr "" @@ -35977,7 +36027,7 @@ msgstr "" msgid "Please select the Multiple Tier Program type for more than one collection rules." msgstr "" -#: erpnext/stock/doctype/item/item.js:323 +#: erpnext/stock/doctype/item/item.js:341 msgid "Please select the Warehouse first" msgstr "" @@ -36029,7 +36079,7 @@ msgstr "" msgid "Please set Account" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1884 msgid "Please set Account for Change Amount" msgstr "" @@ -36119,7 +36169,7 @@ msgstr "" msgid "Please set a Company" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:370 +#: erpnext/assets/doctype/asset/asset.py:374 msgid "Please set a Cost Center for the Asset or set an Asset Depreciation Cost Center for the Company {}" msgstr "" @@ -36144,7 +36194,7 @@ msgstr "" msgid "Please set an Address on the Company '%s'" msgstr "" -#: erpnext/controllers/stock_controller.py:875 +#: erpnext/controllers/stock_controller.py:916 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -36160,19 +36210,19 @@ msgstr "" msgid "Please set both the Tax ID and Fiscal Code on Company {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2418 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2421 msgid "Please set default Cash or Bank account in Mode of Payment {0}" msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:94 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:197 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3024 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3027 msgid "Please set default Cash or Bank account in Mode of Payment {}" msgstr "" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:96 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:199 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3026 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3029 msgid "Please set default Cash or Bank account in Mode of Payments {}" msgstr "" @@ -36188,11 +36238,11 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/controllers/stock_controller.py:734 +#: erpnext/controllers/stock_controller.py:775 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:190 +#: erpnext/controllers/stock_controller.py:231 msgid "Please set default inventory account for item {0}, or their item group or brand." msgstr "" @@ -36209,11 +36259,11 @@ msgstr "" msgid "Please set one of the following:" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:643 +#: erpnext/assets/doctype/asset/asset.py:647 msgid "Please set opening number of booked depreciations" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2751 +#: erpnext/public/js/controllers/transaction.js:2753 msgid "Please set recurring after saving" msgstr "" @@ -36268,7 +36318,7 @@ msgstr "" msgid "Please set {0} in BOM Creator {1}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1141 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1145 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "" @@ -36294,7 +36344,7 @@ msgstr "" msgid "Please specify Company to proceed" msgstr "" -#: erpnext/controllers/accounts_controller.py:3186 +#: erpnext/controllers/accounts_controller.py:3189 #: erpnext/public/js/controllers/accounts.js:117 msgid "Please specify a valid Row ID for row {0} in table {1}" msgstr "" @@ -36370,7 +36420,7 @@ msgstr "" msgid "Portal Users" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:403 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:410 msgid "Possible Supplier" msgstr "" @@ -36480,7 +36530,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:16 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:15 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:18 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1147 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1189 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:15 #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:35 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:7 @@ -36540,7 +36590,7 @@ msgstr "" msgid "Posting Date cannot be future date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:1104 +#: erpnext/public/js/controllers/transaction.js:1105 msgid "Posting Date will change to today's date as Edit Posting Date and Time is unchecked. Are you sure want to proceed?" msgstr "" @@ -36603,7 +36653,7 @@ msgstr "" msgid "Posting Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2334 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2335 msgid "Posting date and posting time is mandatory" msgstr "" @@ -36744,7 +36794,7 @@ msgid "Preventive Maintenance" msgstr "" #. Label of the preview (Button) field in DocType 'Request for Quotation' -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:263 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:270 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json msgid "Preview Email" msgstr "" @@ -37850,7 +37900,7 @@ msgstr "" msgid "Profitability Analysis" msgstr "" -#: erpnext/projects/doctype/task/task.py:154 +#: erpnext/projects/doctype/task/task.py:156 #, python-format msgid "Progress % for a task cannot be more than 100." msgstr "" @@ -38377,7 +38427,7 @@ msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js:30 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/quality_inspection/quality_inspection.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:336 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:337 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -38412,7 +38462,7 @@ msgstr "" msgid "Purchase Invoice Trends" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:332 +#: erpnext/assets/doctype/asset/asset.py:336 msgid "Purchase Invoice cannot be made against an existing asset {0}" msgstr "" @@ -38582,7 +38632,7 @@ msgstr "" msgid "Purchase Order {0} is not submitted" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:882 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:883 msgid "Purchase Orders" msgstr "" @@ -38597,7 +38647,7 @@ msgstr "" msgid "Purchase Orders Items Overdue" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:285 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "" @@ -38654,7 +38704,7 @@ msgstr "" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:67 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:68 #: erpnext/workspace_sidebar/stock.json msgid "Purchase Receipt" msgstr "" @@ -38845,14 +38895,14 @@ msgstr "" #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.js:163 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:371 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:372 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Purpose" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:514 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:515 msgid "Purpose must be one of {0}" msgstr "" @@ -38933,7 +38983,7 @@ msgstr "" #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:398 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:499 #: erpnext/public/js/stock_reservation.js:134 -#: erpnext/public/js/stock_reservation.js:336 erpnext/public/js/utils.js:778 +#: erpnext/public/js/stock_reservation.js:336 erpnext/public/js/utils.js:843 #: 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:390 @@ -39044,7 +39094,7 @@ msgstr "" msgid "Qty To Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1395 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1419 msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}." msgstr "" @@ -39112,7 +39162,7 @@ msgid "Qty in Stock UOM" msgstr "" #. Label of the for_qty (Float) field in DocType 'Pick List' -#: erpnext/stock/doctype/pick_list/pick_list.js:196 +#: erpnext/stock/doctype/pick_list/pick_list.js:198 #: erpnext/stock/doctype/pick_list/pick_list.json msgid "Qty of Finished Goods Item" msgstr "" @@ -39550,7 +39600,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:725 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:726 #: 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 @@ -39665,7 +39715,7 @@ msgid "Quantity must be greater than zero, and less or equal to {0}" msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:1010 -#: erpnext/stock/doctype/pick_list/pick_list.js:204 +#: erpnext/stock/doctype/pick_list/pick_list.js:206 msgid "Quantity must not be more than {0}" msgstr "" @@ -39693,11 +39743,11 @@ msgstr "" msgid "Quantity to Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2563 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2587 msgid "Quantity to Manufacture can not be zero for the operation {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1387 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1411 msgid "Quantity to Manufacture must be greater than 0." msgstr "" @@ -39846,11 +39896,11 @@ msgstr "" msgid "Quotation Trends" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:483 +#: erpnext/selling/doctype/sales_order/sales_order.py:485 msgid "Quotation {0} is cancelled" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:396 +#: erpnext/selling/doctype/sales_order/sales_order.py:398 msgid "Quotation {0} not of type {1}" msgstr "" @@ -39883,7 +39933,7 @@ msgstr "" msgid "RFQ and Purchase Order Settings" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:119 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:129 msgid "RFQs are not allowed for {0} due to a scorecard standing of {1}" msgstr "" @@ -39978,7 +40028,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json -#: erpnext/public/js/utils.js:788 +#: erpnext/public/js/utils.js:853 #: erpnext/selling/doctype/product_bundle_item/product_bundle_item.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -40160,7 +40210,7 @@ msgstr "" msgid "Rate at which this tax is applied" msgstr "" -#: erpnext/controllers/accounts_controller.py:4048 +#: erpnext/controllers/accounts_controller.py:4064 msgid "Rate of '{}' items cannot be changed" msgstr "" @@ -40222,10 +40272,6 @@ msgstr "" msgid "Rates" msgstr "" -#: erpnext/controllers/accounts_controller.py:4023 -msgid "Rates cannot be modified for quoted items" -msgstr "" - #: erpnext/accounts/report/financial_ratios/financial_ratios.py:48 msgid "Ratios" msgstr "" @@ -40335,7 +40381,7 @@ msgstr "" msgid "Raw Materials Consumption" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:317 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:318 msgid "Raw Materials Missing" msgstr "" @@ -40572,7 +40618,7 @@ msgid "Receivable / Payable Account" msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:68 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1162 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1204 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:234 #: erpnext/accounts/report/sales_register/sales_register.py:217 #: erpnext/accounts/report/sales_register/sales_register.py:271 @@ -40697,7 +40743,7 @@ msgstr "" msgid "Received Quantity" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:320 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:321 msgid "Received Stock Entries" msgstr "" @@ -40941,7 +40987,7 @@ msgstr "" msgid "Reference #{0} dated {1}" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2864 +#: erpnext/public/js/controllers/transaction.js:2866 msgid "Reference Date for Early Payment Discount" msgstr "" @@ -40979,7 +41025,7 @@ msgstr "" msgid "Reference No & Reference Date is required for {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1222 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1226 msgid "Reference No and Reference Date is mandatory for Bank transaction" msgstr "" @@ -41237,7 +41283,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:189 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:156 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1236 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1278 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:178 msgid "Remaining Balance" msgstr "" @@ -41290,7 +41336,7 @@ msgstr "" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:204 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:275 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1310 #: erpnext/accounts/report/general_ledger/general_ledger.html:90 #: erpnext/accounts/report/general_ledger/general_ledger.html:116 #: erpnext/accounts/report/general_ledger/general_ledger.py:794 @@ -41421,10 +41467,6 @@ msgstr "" msgid "Repair" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:152 -msgid "Repair Asset" -msgstr "" - #. Label of the repair_cost (Currency) field in DocType 'Asset Repair' #. Label of the repair_cost (Currency) field in DocType 'Asset Repair Purchase #. Invoice' @@ -41433,8 +41475,7 @@ msgstr "" msgid "Repair Cost" msgstr "" -#. Label of the accounting_details (Section Break) field in DocType 'Asset -#. Repair' +#. Label of the invoices (Table) field in DocType 'Asset Repair' #: erpnext/assets/doctype/asset_repair/asset_repair.json msgid "Repair Purchase Invoices" msgstr "" @@ -41681,7 +41722,7 @@ msgstr "" msgid "Reqd Qty (BOM)" msgstr "" -#: erpnext/public/js/utils.js:804 +#: erpnext/public/js/utils.js:869 msgid "Reqd by date" msgstr "" @@ -41723,8 +41764,8 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:311 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:413 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:324 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:426 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:88 #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 @@ -41779,9 +41820,11 @@ msgstr "" #. Label of the requested_qty (Float) field in DocType 'Job Card' #. Label of the requested_qty (Float) field in DocType 'Material Request Plan #. Item' +#. Label of the requested_qty (Float) field in DocType 'Sales Order Item' #. Label of the indented_qty (Float) field in DocType 'Bin' #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json +#: 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:44 #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:155 @@ -41954,7 +41997,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:891 #: erpnext/selling/doctype/sales_order/sales_order.js:92 -#: erpnext/stock/doctype/pick_list/pick_list.js:148 +#: erpnext/stock/doctype/pick_list/pick_list.js:150 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:180 msgid "Reserve" msgstr "" @@ -41997,7 +42040,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/controllers/stock_controller.py:1282 +#: erpnext/controllers/stock_controller.py:1323 msgid "Reserved Batch Conflict" msgstr "" @@ -42067,7 +42110,7 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2281 +#: erpnext/stock/stock_ledger.py:2284 msgid "Reserved Serial No." msgstr "" @@ -42080,16 +42123,16 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:457 #: erpnext/stock/dashboard/item_dashboard_list.html:15 #: erpnext/stock/doctype/bin/bin.json -#: erpnext/stock/doctype/pick_list/pick_list.js:168 +#: 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:530 -#: erpnext/stock/stock_ledger.py:2265 +#: erpnext/stock/report/stock_balance/stock_balance.py:572 +#: erpnext/stock/stock_ledger.py:2268 #: 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:2310 +#: erpnext/stock/stock_ledger.py:2313 msgid "Reserved Stock for Batch" msgstr "" @@ -42135,7 +42178,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:410 -#: erpnext/stock/doctype/pick_list/pick_list.js:293 +#: erpnext/stock/doctype/pick_list/pick_list.js:295 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:293 msgid "Reserving Stock..." msgstr "" @@ -42302,7 +42345,7 @@ msgstr "" msgid "Restart Subscription" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:127 +#: erpnext/assets/doctype/asset/asset.js:175 msgid "Restore Asset" msgstr "" @@ -42472,7 +42515,7 @@ msgid "Return Issued" msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:329 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:126 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:127 msgid "Return Qty" msgstr "" @@ -42480,7 +42523,7 @@ msgstr "" #. 'Purchase Receipt Item' #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:305 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:102 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:103 msgid "Return Qty from Rejected Warehouse" msgstr "" @@ -42492,7 +42535,7 @@ msgstr "" msgid "Return Raw Material to Customer" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1527 msgid "Return invoice of asset cancelled" msgstr "" @@ -42669,6 +42712,12 @@ msgstr "" msgid "Review Stock Settings" msgstr "" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review System Settings' +#: erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json +msgid "Review System Settings" +msgstr "" + #. Label of a Card Break in the Quality Workspace #: erpnext/quality_management/workspace/quality/quality.json msgid "Review and Action" @@ -42963,8 +43012,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/controllers/stock_controller.py:746 -#: erpnext/controllers/stock_controller.py:761 +#: erpnext/controllers/stock_controller.py:787 +#: erpnext/controllers/stock_controller.py:802 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -43007,17 +43056,17 @@ msgstr "" msgid "Row # {0}: Returned Item {1} does not exist in {2} {3}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:270 +#: erpnext/manufacturing/doctype/work_order/work_order.py:275 msgid "Row #1: Sequence ID must be 1 for Operation {0}." msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:563 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2073 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2076 msgid "Row #{0} (Payment Table): Amount must be negative" msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:561 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2068 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2071 msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "" @@ -43059,7 +43108,7 @@ msgstr "" msgid "Row #{0}: Allocated amount:{1} is greater than outstanding amount:{2} for Payment Term {3}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:293 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:276 msgid "Row #{0}: Amount must be a positive number" msgstr "" @@ -43071,11 +43120,11 @@ msgstr "" msgid "Row #{0}: Asset {1} is already sold" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:333 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:334 msgid "Row #{0}: BOM is not specified for subcontracting item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:298 +#: erpnext/selling/doctype/sales_order/sales_order.py:300 msgid "Row #{0}: BOM not found for FG Item {1}" msgstr "" @@ -43107,27 +43156,27 @@ msgstr "" msgid "Row #{0}: Cannot create entry with different taxable AND withholding document links." msgstr "" -#: erpnext/controllers/accounts_controller.py:3764 +#: erpnext/controllers/accounts_controller.py:3767 msgid "Row #{0}: Cannot delete item {1} which has already been billed." msgstr "" -#: erpnext/controllers/accounts_controller.py:3738 +#: erpnext/controllers/accounts_controller.py:3741 msgid "Row #{0}: Cannot delete item {1} which has already been delivered" msgstr "" -#: erpnext/controllers/accounts_controller.py:3757 +#: erpnext/controllers/accounts_controller.py:3760 msgid "Row #{0}: Cannot delete item {1} which has already been received" msgstr "" -#: erpnext/controllers/accounts_controller.py:3744 +#: erpnext/controllers/accounts_controller.py:3747 msgid "Row #{0}: Cannot delete item {1} which has work order assigned to it." msgstr "" -#: erpnext/controllers/accounts_controller.py:3750 +#: erpnext/controllers/accounts_controller.py:3753 msgid "Row #{0}: Cannot delete item {1} which is already ordered against this Sales Order." msgstr "" -#: erpnext/controllers/accounts_controller.py:4058 +#: erpnext/controllers/accounts_controller.py:4074 msgid "Row #{0}: Cannot set Rate if the billed amount is greater than the amount for Item {1}." msgstr "" @@ -43139,23 +43188,23 @@ msgstr "" msgid "Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:268 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:251 msgid "Row #{0}: Consumed Asset {1} cannot be Draft" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:271 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:254 msgid "Row #{0}: Consumed Asset {1} cannot be cancelled" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:253 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:236 msgid "Row #{0}: Consumed Asset {1} cannot be the same as the Target Asset" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:262 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:245 msgid "Row #{0}: Consumed Asset {1} cannot be {2}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:276 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:259 msgid "Row #{0}: Consumed Asset {1} does not belong to company {2}" msgstr "" @@ -43181,11 +43230,11 @@ msgstr "" msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times in the Subcontracting Inward process." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:347 +#: erpnext/manufacturing/doctype/work_order/work_order.py:352 msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:372 +#: erpnext/manufacturing/doctype/work_order/work_order.py:377 msgid "Row #{0}: Customer Provided Item {1} does not exist in the Required Items table linked to the Subcontracting Inward Order." msgstr "" @@ -43193,7 +43242,7 @@ msgstr "" msgid "Row #{0}: Customer Provided Item {1} exceeds quantity available through Subcontracting Inward Order" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:360 +#: erpnext/manufacturing/doctype/work_order/work_order.py:365 msgid "Row #{0}: Customer Provided Item {1} has insufficient quantity in the Subcontracting Inward Order. Available quantity is {2}." msgstr "" @@ -43210,11 +43259,11 @@ msgstr "" msgid "Row #{0}: Dates overlapping with other row in group {1}" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:357 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:358 msgid "Row #{0}: Default BOM not found for FG Item {1}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:679 +#: erpnext/assets/doctype/asset/asset.py:683 msgid "Row #{0}: Depreciation Start Date is required" msgstr "" @@ -43222,11 +43271,11 @@ msgstr "" msgid "Row #{0}: Duplicate entry in References {1} {2}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:328 +#: erpnext/selling/doctype/sales_order/sales_order.py:330 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/controllers/stock_controller.py:877 +#: erpnext/controllers/stock_controller.py:918 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" @@ -43234,22 +43283,22 @@ msgstr "" msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:362 -#: erpnext/selling/doctype/sales_order/sales_order.py:301 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:363 +#: erpnext/selling/doctype/sales_order/sales_order.py:303 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:281 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:345 +#: erpnext/selling/doctype/sales_order/sales_order.py:283 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:288 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:352 +#: erpnext/selling/doctype/sales_order/sales_order.py:290 msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:470 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:471 msgid "Row #{0}: Finished Good must be {1}" msgstr "" @@ -43270,7 +43319,7 @@ msgstr "" msgid "Row #{0}: For {1}, you can select reference document only if account gets debited" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:662 +#: erpnext/assets/doctype/asset/asset.py:666 msgid "Row #{0}: Frequency of Depreciation must be greater than zero" msgstr "" @@ -43286,7 +43335,7 @@ msgstr "" msgid "Row #{0}: Item added" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1536 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1537 msgid "Row #{0}: Item {1} cannot be transferred more than {2} against {3} {4}" msgstr "" @@ -43302,7 +43351,7 @@ msgstr "" msgid "Row #{0}: Item {1} has no stock in warehouse {2}." msgstr "" -#: erpnext/controllers/stock_controller.py:109 +#: erpnext/controllers/stock_controller.py:150 msgid "Row #{0}: Item {1} has zero rate but 'Allow Zero Valuation Rate' is not enabled." msgstr "" @@ -43323,11 +43372,11 @@ msgstr "" msgid "Row #{0}: Item {1} is not a part of Subcontracting Inward Order {2}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:287 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:270 msgid "Row #{0}: Item {1} is not a service item" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:241 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:224 msgid "Row #{0}: Item {1} is not a stock item" msgstr "" @@ -43343,15 +43392,15 @@ msgstr "" msgid "Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:673 +#: erpnext/assets/doctype/asset/asset.py:677 msgid "Row #{0}: Next Depreciation Date cannot be before Available-for-use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:668 +#: erpnext/assets/doctype/asset/asset.py:672 msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:668 +#: erpnext/selling/doctype/sales_order/sales_order.py:670 msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "" @@ -43359,11 +43408,11 @@ msgstr "" msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:636 +#: erpnext/assets/doctype/asset/asset.py:640 msgid "Row #{0}: Opening Accumulated Depreciation must be less than or equal to {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:869 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:870 msgid "Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}." msgstr "" @@ -43400,8 +43449,8 @@ msgstr "" msgid "Row #{0}: Qty increased by {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:244 -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:290 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:227 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:273 msgid "Row #{0}: Qty must be a positive number" msgstr "" @@ -43409,15 +43458,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:1419 +#: erpnext/controllers/stock_controller.py:1460 msgid "Row #{0}: Quality Inspection is required for Item {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1434 +#: erpnext/controllers/stock_controller.py:1475 msgid "Row #{0}: Quality Inspection {1} is not submitted for the item: {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1449 +#: erpnext/controllers/stock_controller.py:1490 msgid "Row #{0}: Quality Inspection {1} was rejected for item {2}" msgstr "" @@ -43426,7 +43475,6 @@ msgid "Row #{0}: Quantity cannot be a non-positive number. Please increase the q msgstr "" #: erpnext/controllers/accounts_controller.py:1453 -#: erpnext/controllers/accounts_controller.py:3878 msgid "Row #{0}: Quantity for Item {1} cannot be zero." msgstr "" @@ -43489,11 +43537,11 @@ msgid "" "\t\t\t\t\tthis validation." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:276 +#: erpnext/manufacturing/doctype/work_order/work_order.py:281 msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." msgstr "" -#: erpnext/controllers/stock_controller.py:261 +#: erpnext/controllers/stock_controller.py:302 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -43521,7 +43569,7 @@ msgstr "" msgid "Row #{0}: Service Start and End Date is required for deferred accounting" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:491 +#: erpnext/selling/doctype/sales_order/sales_order.py:493 msgid "Row #{0}: Set Supplier for item {1}" msgstr "" @@ -43533,19 +43581,19 @@ msgstr "" msgid "Row #{0}: Source Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:381 +#: erpnext/manufacturing/doctype/work_order/work_order.py:386 msgid "Row #{0}: Source Warehouse {1} for item {2} cannot be a customer warehouse." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:336 +#: erpnext/manufacturing/doctype/work_order/work_order.py:341 msgid "Row #{0}: Source Warehouse {1} for item {2} must be same as Source Warehouse {3} in the Work Order." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1016 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1017 msgid "Row #{0}: Source and Target Warehouse cannot be the same for Material Transfer" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1038 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1039 msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer" msgstr "" @@ -43602,7 +43650,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:274 +#: erpnext/controllers/stock_controller.py:315 msgid "Row #{0}: The batch {1} has already expired." msgstr "" @@ -43614,14 +43662,18 @@ msgstr "" msgid "Row #{0}: Timings conflicts with row {1}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:649 +#: erpnext/assets/doctype/asset/asset.py:653 msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:658 +#: erpnext/assets/doctype/asset/asset.py:662 msgid "Row #{0}: Total Number of Depreciations must be greater than zero" msgstr "" +#: erpnext/controllers/stock_controller.py:105 +msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." +msgstr "" + #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py:94 msgid "Row #{0}: Withholding Amount {1} does not match calculated amount {2}." msgstr "" @@ -43654,6 +43706,10 @@ msgstr "" msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "" +#: erpnext/controllers/accounts_controller.py:3881 +msgid "Row #{0}:Quantity for Item {1} cannot be zero." +msgstr "" + #: erpnext/buying/utils.py:106 msgid "Row #{1}: Warehouse is mandatory for stock Item {0}" msgstr "" @@ -43694,7 +43750,7 @@ msgstr "" msgid "Row #{}: Currency of {} - {} doesn't matches company currency." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:417 +#: erpnext/assets/doctype/asset/asset.py:421 msgid "Row #{}: Finance Book should not be empty since you're using multiple." msgstr "" @@ -43714,7 +43770,7 @@ msgstr "" msgid "Row #{}: Please assign task to a member." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:409 +#: erpnext/assets/doctype/asset/asset.py:413 msgid "Row #{}: Please use a different Finance Book." msgstr "" @@ -43759,7 +43815,7 @@ msgstr "" msgid "Row {0} picked quantity is less than the required quantity, additional {1} {2} required." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1560 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1561 msgid "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" msgstr "" @@ -43791,11 +43847,11 @@ msgstr "" msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1221 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1222 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:885 +#: erpnext/stock/doctype/material_request/material_request.py:888 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "" @@ -43813,11 +43869,11 @@ msgstr "" msgid "Row {0}: Conversion Factor is mandatory" msgstr "" -#: erpnext/controllers/accounts_controller.py:3224 +#: erpnext/controllers/accounts_controller.py:3227 msgid "Row {0}: Cost Center {1} does not belong to Company {2}" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:152 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:174 msgid "Row {0}: Cost center is required for an item {1}" msgstr "" @@ -43833,7 +43889,7 @@ msgstr "" msgid "Row {0}: Debit entry can not be linked with a {1}" msgstr "" -#: erpnext/controllers/selling_controller.py:875 +#: erpnext/controllers/selling_controller.py:876 msgid "Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same" msgstr "" @@ -43841,7 +43897,7 @@ msgstr "" msgid "Row {0}: Delivery Warehouse cannot be same as Customer Warehouse for Item {1}." msgstr "" -#: erpnext/controllers/accounts_controller.py:2717 +#: erpnext/controllers/accounts_controller.py:2720 msgid "Row {0}: Due Date in the Payment Terms table cannot be before Posting Date" msgstr "" @@ -43854,14 +43910,18 @@ msgstr "" msgid "Row {0}: Exchange Rate is mandatory" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:607 +#: erpnext/assets/doctype/asset/asset.py:611 msgid "Row {0}: Expected Value After Useful Life cannot be negative" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:610 +#: erpnext/assets/doctype/asset/asset.py:614 msgid "Row {0}: Expected Value After Useful Life must be less than Net Purchase Amount" msgstr "" +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:183 +msgid "Row {0}: Expense Account {1} is linked to company {2}. Please select an account belonging to company {3}." +msgstr "" + #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:534 msgid "Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}." msgstr "" @@ -43874,7 +43934,7 @@ msgstr "" msgid "Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:142 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:152 msgid "Row {0}: For Supplier {1}, Email Address is Required to send an email" msgstr "" @@ -43887,7 +43947,7 @@ msgstr "" msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:1515 +#: erpnext/controllers/stock_controller.py:1556 msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "" @@ -43907,7 +43967,7 @@ msgstr "" msgid "Row {0}: Item Tax template updated as per validity and rate applied" msgstr "" -#: erpnext/controllers/selling_controller.py:640 +#: erpnext/controllers/selling_controller.py:641 msgid "Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer" msgstr "" @@ -43987,7 +44047,7 @@ msgstr "" msgid "Row {0}: Project must be same as the one set in the Timesheet: {1}." msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:129 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:151 msgid "Row {0}: Purchase Invoice {1} has no stock impact." msgstr "" @@ -43995,7 +44055,7 @@ msgstr "" msgid "Row {0}: Qty cannot be greater than {1} for the Item {2}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:562 msgid "Row {0}: Qty in Stock UOM can not be zero." msgstr "" @@ -44007,7 +44067,7 @@ msgstr "" msgid "Row {0}: Quantity cannot be negative." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:943 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:944 msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})" msgstr "" @@ -44019,11 +44079,11 @@ msgstr "" msgid "Row {0}: Shift cannot be changed since the depreciation has already been processed" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1573 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1574 msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1506 +#: erpnext/controllers/stock_controller.py:1547 msgid "Row {0}: Target Warehouse is mandatory for internal transfers" msgstr "" @@ -44035,11 +44095,11 @@ msgstr "" msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:607 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:608 msgid "Row {0}: The item {1}, quantity must be positive number" msgstr "" -#: erpnext/controllers/accounts_controller.py:3201 +#: erpnext/controllers/accounts_controller.py:3204 msgid "Row {0}: The {3} Account {1} does not belong to the company {2}" msgstr "" @@ -44047,16 +44107,16 @@ msgstr "" msgid "Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3363 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3364 msgid "Row {0}: Transferred quantity cannot be greater than the requested quantity." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:555 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:556 msgid "Row {0}: UOM Conversion Factor is mandatory" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1203 -#: erpnext/manufacturing/doctype/work_order/work_order.py:410 +#: erpnext/manufacturing/doctype/work_order/work_order.py:415 msgid "Row {0}: Workstation or Workstation Type is mandatory for an operation {1}" msgstr "" @@ -44080,11 +44140,15 @@ msgstr "" msgid "Row {0}: {1} {2} does not match with {3}" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:102 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:133 +msgid "Row {0}: {1} {2} is linked to company {3}. Please select a document belonging to company {4}." +msgstr "" + +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:107 msgid "Row {0}: {2} Item {1} does not exist in {2} {3}" msgstr "" -#: erpnext/utilities/transaction_base.py:561 +#: erpnext/utilities/transaction_base.py:562 msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "" @@ -44114,7 +44178,7 @@ msgstr "" msgid "Rows with Same Account heads will be merged on Ledger" msgstr "" -#: erpnext/controllers/accounts_controller.py:2728 +#: erpnext/controllers/accounts_controller.py:2731 msgid "Rows with duplicate due dates in other rows were found: {0}" msgstr "" @@ -44197,7 +44261,7 @@ msgstr "" msgid "SLA Paused On" msgstr "" -#: erpnext/public/js/utils.js:1168 +#: erpnext/public/js/utils.js:1233 msgid "SLA is on hold since {0}" msgstr "" @@ -44500,7 +44564,7 @@ msgstr "" msgid "Sales Invoice {0} has already been submitted" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:587 +#: erpnext/selling/doctype/sales_order/sales_order.py:589 msgid "Sales Invoice {0} must be deleted before cancelling this Sales Order" msgstr "" @@ -44558,7 +44622,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:238 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json -#: erpnext/controllers/selling_controller.py:494 +#: erpnext/controllers/selling_controller.py:495 #: erpnext/crm/doctype/contract/contract.json #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:65 #: erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json @@ -44698,7 +44762,7 @@ msgstr "" msgid "Sales Order required for Item {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:352 +#: erpnext/selling/doctype/sales_order/sales_order.py:354 msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" @@ -44706,12 +44770,12 @@ msgstr "" msgid "Sales Order {0} is not submitted" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:461 +#: erpnext/manufacturing/doctype/work_order/work_order.py:479 msgid "Sales Order {0} is not valid" msgstr "" -#: erpnext/controllers/selling_controller.py:475 -#: erpnext/manufacturing/doctype/work_order/work_order.py:466 +#: erpnext/controllers/selling_controller.py:476 +#: erpnext/manufacturing/doctype/work_order/work_order.py:484 msgid "Sales Order {0} is {1}" msgstr "" @@ -44767,7 +44831,7 @@ msgstr "" #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:119 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1257 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1299 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:103 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:194 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:74 @@ -44874,7 +44938,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:158 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:137 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:125 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1254 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1296 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:109 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:191 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:80 @@ -45120,7 +45184,7 @@ msgstr "" msgid "Same item cannot be entered multiple times." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:111 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:121 msgid "Same supplier has been entered multiple times" msgstr "" @@ -45132,7 +45196,7 @@ msgid "Sample Quantity" msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:447 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:448 msgid "Sample Retention Stock Entry" msgstr "" @@ -45144,12 +45208,12 @@ 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:2921 +#: erpnext/public/js/controllers/transaction.js:2923 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Sample Size" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3853 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3854 msgid "Sample quantity {0} cannot be more than received quantity {1}" msgstr "" @@ -45227,7 +45291,7 @@ msgstr "" msgid "Scan barcode for item {0}" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:109 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:111 msgid "Scan mode enabled, existing quantity will not be fetched." msgstr "" @@ -45244,7 +45308,7 @@ msgstr "" #. Label of the schedule_date (Date) field in DocType 'Depreciation Schedule' #. Label of the schedule_date (Datetime) field in DocType 'Production Plan Sub #. Assembly Item' -#: erpnext/assets/doctype/asset/asset.js:338 +#: erpnext/assets/doctype/asset/asset.js:371 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json msgid "Schedule Date" @@ -45357,7 +45421,7 @@ msgstr "" msgid "Scrap & Process Loss" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:104 +#: erpnext/assets/doctype/asset/asset.js:160 msgid "Scrap Asset" msgstr "" @@ -45508,7 +45572,7 @@ msgstr "" msgid "Select Accounting Dimension." msgstr "" -#: erpnext/public/js/utils.js:464 +#: erpnext/public/js/utils.js:529 msgid "Select Alternate Item" msgstr "" @@ -45516,7 +45580,7 @@ msgstr "" msgid "Select Alternative Items for Sales Order" msgstr "" -#: erpnext/stock/doctype/item/item.js:715 +#: erpnext/stock/doctype/item/item.js:733 msgid "Select Attribute Values" msgstr "" @@ -45534,7 +45598,7 @@ 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:385 +#: erpnext/stock/doctype/pick_list/pick_list.js:387 msgid "Select Batch No" msgstr "" @@ -45623,7 +45687,7 @@ msgstr "" msgid "Select Items based on Delivery Date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2960 +#: erpnext/public/js/controllers/transaction.js:2962 msgid "Select Items for Quality Inspection" msgstr "" @@ -45657,24 +45721,24 @@ msgstr "" msgid "Select Payment Schedule" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:407 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:414 msgid "Select Possible Supplier" msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:1016 -#: erpnext/stock/doctype/pick_list/pick_list.js:214 +#: erpnext/stock/doctype/pick_list/pick_list.js:216 msgid "Select Quantity" 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:385 +#: erpnext/stock/doctype/pick_list/pick_list.js:387 msgid "Select Serial No" msgstr "" #: erpnext/assets/doctype/asset_repair/asset_repair.js:237 #: erpnext/public/js/utils/sales_common.js:446 -#: erpnext/stock/doctype/pick_list/pick_list.js:388 +#: erpnext/stock/doctype/pick_list/pick_list.js:390 msgid "Select Serial and Batch" msgstr "" @@ -45748,7 +45812,7 @@ msgstr "" msgid "Select a company" msgstr "" -#: erpnext/stock/doctype/item/item.js:1048 +#: erpnext/stock/doctype/item/item.js:1066 msgid "Select an Item Group." msgstr "" @@ -45764,7 +45828,7 @@ msgstr "" msgid "Select an item from each set to be used in the Sales Order." msgstr "" -#: erpnext/stock/doctype/item/item.js:728 +#: erpnext/stock/doctype/item/item.js:746 msgid "Select at least one value from each of the attributes." msgstr "" @@ -45778,7 +45842,7 @@ msgstr "" msgid "Select company name first." msgstr "" -#: erpnext/controllers/accounts_controller.py:2976 +#: erpnext/controllers/accounts_controller.py:2979 msgid "Select finance book for the item {0} at row {1}" msgstr "" @@ -45816,7 +45880,7 @@ msgstr "" msgid "Select the customer or supplier." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:893 +#: erpnext/assets/doctype/asset/asset.js:921 msgid "Select the date" msgstr "" @@ -45852,7 +45916,7 @@ msgstr "" msgid "Selected POS Opening Entry should be open." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2569 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2572 msgid "Selected Price List should have buying and selling fields checked." msgstr "" @@ -45883,22 +45947,22 @@ msgstr "" msgid "Self delivery" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:604 +#: erpnext/assets/doctype/asset/asset.js:632 #: erpnext/stock/doctype/batch/batch_dashboard.py:9 #: erpnext/stock/doctype/item/item_dashboard.py:20 msgid "Sell" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:112 -#: erpnext/assets/doctype/asset/asset.js:593 +#: erpnext/assets/doctype/asset/asset.js:168 +#: erpnext/assets/doctype/asset/asset.js:621 msgid "Sell Asset" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:598 +#: erpnext/assets/doctype/asset/asset.js:626 msgid "Sell Qty" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:614 +#: erpnext/assets/doctype/asset/asset.js:642 msgid "Sell quantity cannot exceed the asset quantity" msgstr "" @@ -45906,7 +45970,7 @@ msgstr "" msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:610 +#: erpnext/assets/doctype/asset/asset.js:638 msgid "Sell quantity must be greater than zero" msgstr "" @@ -45959,7 +46023,7 @@ msgstr "" #: erpnext/selling/doctype/selling_settings/selling_settings.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:222 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:244 #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Selling Settings" msgstr "" @@ -46017,7 +46081,7 @@ msgid "Send Emails to Suppliers" msgstr "" #. Label of the send_sms (Button) field in DocType 'SMS Center' -#: erpnext/public/js/controllers/transaction.js:688 +#: erpnext/public/js/controllers/transaction.js:689 #: erpnext/selling/doctype/sms_center/sms_center.json msgid "Send SMS" msgstr "" @@ -46101,7 +46165,7 @@ msgstr "" msgid "Serial / Batch No" msgstr "" -#: erpnext/public/js/utils.js:126 +#: erpnext/public/js/utils.js:191 msgid "Serial / Batch Nos" msgstr "" @@ -46153,14 +46217,14 @@ 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:2934 +#: erpnext/public/js/controllers/transaction.js:2936 #: 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 #: erpnext/stock/doctype/packed_item/packed_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:160 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:170 #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -46173,7 +46237,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:337 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:401 #: 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 @@ -46214,7 +46278,7 @@ msgstr "" msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2549 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2579 msgid "Serial No Reserved" msgstr "" @@ -46271,7 +46335,7 @@ msgstr "" msgid "Serial No and Batch Traceability" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1125 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1141 msgid "Serial No is mandatory" msgstr "" @@ -46300,11 +46364,11 @@ msgstr "" msgid "Serial No {0} does not exist" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3315 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3345 msgid "Serial No {0} does not exists" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:369 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:379 msgid "Serial No {0} is already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -46316,7 +46380,7 @@ msgstr "" msgid "Serial No {0} is already assigned to customer {1}. Can only be returned against the customer {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:441 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:451 msgid "Serial No {0} is not present in the {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -46340,7 +46404,7 @@ msgstr "" #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:190 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:50 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:160 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:170 msgid "Serial Nos" msgstr "" @@ -46354,15 +46418,15 @@ msgstr "" msgid "Serial Nos and Batches" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1835 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1865 msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2271 +#: erpnext/stock/stock_ledger.py:2274 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:375 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:385 msgid "Serial Nos {0} are already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -46407,8 +46471,6 @@ msgstr "" #. Detail' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Stock Ledger #. Entry' -#. Label of the serial_and_batch_bundle_section (Section Break) field in -#. DocType 'Stock Settings' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Subcontracting #. Receipt Item' #. Label of a Workspace Sidebar Item @@ -46427,26 +46489,25 @@ msgstr "" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/stock/doctype/stock_settings/stock_settings.json #: 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:344 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:408 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:177 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/workspace_sidebar/stock.json msgid "Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2057 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2087 msgid "Serial and Batch Bundle created" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2129 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2159 msgid "Serial and Batch Bundle updated" msgstr "" -#: erpnext/controllers/stock_controller.py:155 +#: erpnext/controllers/stock_controller.py:196 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "" @@ -46474,6 +46535,10 @@ msgstr "" msgid "Serial and Batch No" msgstr "" +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:153 +msgid "Serial and Batch No for Item Disabled" +msgstr "" + #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:53 msgid "Serial and Batch Nos" msgstr "" @@ -46809,12 +46874,12 @@ msgid "Service Stop Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:45 -#: erpnext/public/js/controllers/transaction.js:1770 +#: erpnext/public/js/controllers/transaction.js:1772 msgid "Service Stop Date cannot be after Service End Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:42 -#: erpnext/public/js/controllers/transaction.js:1767 +#: erpnext/public/js/controllers/transaction.js:1769 msgid "Service Stop Date cannot be before Service Start Date" msgstr "" @@ -46838,7 +46903,7 @@ msgstr "" #. Label of the set_basic_rate_manually (Check) field in DocType 'Stock Entry #. Detail' -#: erpnext/stock/doctype/stock_entry/stock_entry.py:297 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:298 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Set Basic Rate Manually" msgstr "" @@ -47073,15 +47138,15 @@ msgstr "" msgid "Set this if the customer is a Public Administration company." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:896 +#: erpnext/assets/doctype/asset/asset.py:900 msgid "Set {0} in asset category {1} for company {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1229 +#: erpnext/assets/doctype/asset/asset.py:1233 msgid "Set {0} in asset category {1} or company {2}" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1226 +#: erpnext/assets/doctype/asset/asset.py:1230 msgid "Set {0} in company {1}" msgstr "" @@ -47149,7 +47214,7 @@ msgid "Setting up company" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1182 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1451 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1475 msgid "Setting {0} is required" msgstr "" @@ -47169,6 +47234,29 @@ msgstr "" msgid "Settled" msgstr "" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Company' +#: erpnext/setup/onboarding_step/setup_company/setup_company.json +msgid "Setup Company" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Email Account' +#: erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json +msgid "Setup Email Account" +msgstr "" + +#. Title of the Module Onboarding 'Organization Onboarding' +#: erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json +msgid "Setup Organization" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Role Permissions' +#: erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json +msgid "Setup Role Permissions" +msgstr "" + #. Label of an action in the Onboarding Step 'Setup Sales taxes' #: erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json msgid "Setup Sales Taxes" @@ -47266,7 +47354,7 @@ msgid "Shelf Life in Days" msgstr "" #. Label of the shift (Link) field in DocType 'Depreciation Schedule' -#: erpnext/assets/doctype/asset/asset.js:351 +#: erpnext/assets/doctype/asset/asset.js:384 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Shift" msgstr "" @@ -47699,7 +47787,7 @@ msgstr "" msgid "Show Variant Attributes" msgstr "" -#: erpnext/stock/doctype/item/item.js:143 +#: erpnext/stock/doctype/item/item.js:161 msgid "Show Variants" msgstr "" @@ -47838,7 +47926,7 @@ msgstr "" msgid "Simultaneous" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:688 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:689 msgid "Since there is a process loss of {0} units for the finished good {1}, you should reduce the quantity by {0} units for the finished good {1} in the Items Table." msgstr "" @@ -47861,7 +47949,7 @@ msgstr "" msgid "Single Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:168 +#: erpnext/stock/doctype/item/item.js:186 msgid "Single Variant" msgstr "" @@ -47939,7 +48027,7 @@ msgstr "" msgid "Solvency Ratios" msgstr "" -#: erpnext/controllers/accounts_controller.py:4316 +#: erpnext/controllers/accounts_controller.py:4332 msgid "Some required Company details are missing. You don't have permission to update them. Please contact your System Manager." msgstr "" @@ -48037,7 +48125,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:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:717 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "" @@ -48057,7 +48145,7 @@ msgstr "" msgid "Source Warehouse is mandatory for the Item {0}." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:295 +#: erpnext/manufacturing/doctype/work_order/work_order.py:300 msgid "Source Warehouse {0} must be same as Customer Warehouse {1} in the Subcontracting Inward Order." msgstr "" @@ -48065,7 +48153,7 @@ msgstr "" msgid "Source and Target Location cannot be same" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:817 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:818 msgid "Source and target warehouse cannot be same for row {0}" msgstr "" @@ -48078,9 +48166,9 @@ msgstr "" msgid "Source of Funds (Liabilities)" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:783 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:800 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:807 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:784 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:801 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:808 msgid "Source warehouse is mandatory for row {0}" msgstr "" @@ -48118,15 +48206,15 @@ msgstr "" msgid "Spending for Account {0} ({1}) between {2} and {3} has already exceeded the new allocated budget. Spent: {4}, Budget: {5}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:654 +#: erpnext/assets/doctype/asset/asset.js:682 #: erpnext/stock/doctype/batch/batch.js:91 #: erpnext/stock/doctype/batch/batch.js:183 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:120 -#: erpnext/assets/doctype/asset/asset.js:638 +#: erpnext/assets/doctype/asset/asset.js:144 +#: erpnext/assets/doctype/asset/asset.js:666 msgid "Split Asset" msgstr "" @@ -48149,15 +48237,15 @@ msgstr "" msgid "Split Issue" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:644 +#: erpnext/assets/doctype/asset/asset.js:672 msgid "Split Qty" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1368 +#: erpnext/assets/doctype/asset/asset.py:1372 msgid "Split Quantity must be less than Asset Quantity" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2453 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2457 msgid "Splitting {0} {1} into {2} rows as per Payment Terms" msgstr "" @@ -48323,11 +48411,6 @@ msgstr "" msgid "Start Year and End Year are mandatory" msgstr "" -#. Label of the section_break_18 (Section Break) field in DocType 'Project' -#: erpnext/projects/doctype/project/project.json -msgid "Start and End Dates" -msgstr "" - #. Description of the 'From Date' (Date) field in DocType 'Purchase Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json msgid "Start date of current invoice's period" @@ -48476,7 +48559,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:90 +#: erpnext/stock/doctype/item/item.js:108 #: 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 @@ -48532,7 +48615,7 @@ msgstr "" msgid "Stock Details" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:911 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:912 msgid "Stock Entries already created for Work Order {0}: {1}" msgstr "" @@ -48553,7 +48636,7 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json -#: erpnext/stock/doctype/pick_list/pick_list.js:138 +#: erpnext/stock/doctype/pick_list/pick_list.js:140 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -48634,11 +48717,11 @@ 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:100 +#: erpnext/stock/doctype/item/item.js:118 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:35 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:36 #: erpnext/workspace_sidebar/stock.json msgid "Stock Ledger" msgstr "" @@ -48677,7 +48760,7 @@ msgid "Stock Ledgers won’t be reposted." msgstr "" #: erpnext/stock/doctype/batch/batch.js:79 -#: erpnext/stock/doctype/item/item.js:568 +#: erpnext/stock/doctype/item/item.js:586 msgid "Stock Levels" msgstr "" @@ -48745,7 +48828,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:110 +#: erpnext/stock/doctype/item/item.js:128 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -48841,9 +48924,9 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:109 #: erpnext/selling/doctype/sales_order/sales_order.js:122 #: erpnext/selling/doctype/sales_order/sales_order.js:250 -#: erpnext/stock/doctype/pick_list/pick_list.js:150 -#: erpnext/stock/doctype/pick_list/pick_list.js:165 -#: erpnext/stock/doctype/pick_list/pick_list.js:170 +#: 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 #: erpnext/stock/doctype/stock_entry/stock_entry_dashboard.py:12 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:738 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:674 @@ -48855,9 +48938,9 @@ msgstr "" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 #: erpnext/stock/doctype/stock_settings/stock_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:179 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:191 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:205 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:201 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:213 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:227 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:182 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:195 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:207 @@ -48872,7 +48955,7 @@ msgstr "" #: erpnext/controllers/subcontracting_inward_controller.py:1003 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:2234 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2100 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2124 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1777 msgid "Stock Reservation Entries Created" msgstr "" @@ -49053,8 +49136,8 @@ msgstr "" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:35 #: erpnext/stock/report/reserved_stock/reserved_stock.py:110 -#: erpnext/stock/report/stock_balance/stock_balance.py:469 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:215 +#: erpnext/stock/report/stock_balance/stock_balance.py:511 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:279 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_received_item/subcontracting_inward_order_received_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_scrap_item/subcontracting_inward_order_scrap_item.json @@ -49234,7 +49317,7 @@ msgstr "" msgid "Stop Reason" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1065 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1089 msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "" @@ -49367,7 +49450,7 @@ msgstr "" msgid "Subcontract Order Summary" msgstr "" -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:83 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:84 msgid "Subcontract Return" msgstr "" @@ -49542,7 +49625,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:140 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:141 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json #: erpnext/workspace_sidebar/subcontracting.json @@ -49575,7 +49658,7 @@ msgstr "" msgid "Subcontracting Order Supplied Item" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:919 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:920 msgid "Subcontracting Order {0} created." msgstr "" @@ -49664,7 +49747,7 @@ msgstr "" msgid "Subdivision" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:915 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:916 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1047 msgid "Submit Action Failed" msgstr "" @@ -49689,7 +49772,7 @@ msgstr "" msgid "Submit this Work Order for further processing." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:296 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:306 msgid "Submit your Quotation" msgstr "" @@ -49999,7 +50082,7 @@ msgstr "" #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:188 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:266 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:273 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json #: erpnext/buying/doctype/supplier/supplier.json @@ -50125,14 +50208,14 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_payable/accounts_payable.js:108 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:91 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1261 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1303 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:198 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:178 #: erpnext/accounts/report/purchase_register/purchase_register.js:27 #: erpnext/accounts/report/purchase_register/purchase_register.py:186 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:55 #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:499 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:506 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.py:105 #: erpnext/buying/workspace/buying/buying.json @@ -50229,7 +50312,7 @@ msgstr "" #. Label of the supplier_name (Data) field in DocType 'Purchase Receipt' #. Label of the supplier_name (Data) field in DocType 'Stock Entry' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1178 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1220 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:191 #: erpnext/accounts/report/purchase_register/purchase_register.py:177 @@ -50346,7 +50429,7 @@ msgstr "" msgid "Supplier Quotation Item" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:482 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:495 msgid "Supplier Quotation {0} Created" msgstr "" @@ -50648,31 +50731,26 @@ msgstr "" msgid "Target Asset" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:226 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:209 msgid "Target Asset {0} cannot be cancelled" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:224 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:207 msgid "Target Asset {0} cannot be submitted" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:220 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:203 msgid "Target Asset {0} cannot be {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:230 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:213 msgid "Target Asset {0} does not belong to company {1}" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:209 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:192 msgid "Target Asset {0} needs to be composite asset" msgstr "" -#. Label of the target_batch_no (Link) field in DocType 'Asset Capitalization' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json -msgid "Target Batch No" -msgstr "" - #. Name of a DocType #: erpnext/setup/doctype/target_detail/target_detail.json msgid "Target Detail" @@ -50704,36 +50782,18 @@ msgstr "" msgid "Target Fixed Asset Account" msgstr "" -#. Label of the target_has_batch_no (Check) field in DocType 'Asset -#. Capitalization' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json -msgid "Target Has Batch No" -msgstr "" - -#. Label of the target_has_serial_no (Check) field in DocType 'Asset -#. Capitalization' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json -msgid "Target Has Serial No" -msgstr "" - #. Label of the target_incoming_rate (Currency) field in DocType 'Asset #. Capitalization' #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json msgid "Target Incoming Rate" msgstr "" -#. Label of the target_is_fixed_asset (Check) field in DocType 'Asset -#. Capitalization' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json -msgid "Target Is Fixed Asset" -msgstr "" - #. Label of the target_item_code (Link) field in DocType 'Asset Capitalization' #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json msgid "Target Item Code" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:191 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:183 msgid "Target Item {0} must be a Fixed Asset item" msgstr "" @@ -50756,23 +50816,11 @@ msgstr "" msgid "Target On" msgstr "" -#. Label of the target_qty (Float) field in DocType 'Asset Capitalization' #. Label of the target_qty (Float) field in DocType 'Target Detail' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json #: erpnext/setup/doctype/target_detail/target_detail.json msgid "Target Qty" msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:196 -msgid "Target Qty must be a positive number" -msgstr "" - -#. Label of the target_serial_no (Small Text) field in DocType 'Asset -#. Capitalization' -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json -msgid "Target Serial No" -msgstr "" - #. Label of the target_warehouse (Link) field in DocType 'Sales Invoice Item' #. Label of the warehouse (Link) field in DocType 'Purchase Order Item' #. Label of the target_warehouse (Link) field in DocType 'Job Card' @@ -50790,7 +50838,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:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:723 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "" @@ -50806,7 +50854,7 @@ msgstr "" msgid "Target Warehouse Address Link" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:240 +#: erpnext/manufacturing/doctype/work_order/work_order.py:245 msgid "Target Warehouse Reservation Error" msgstr "" @@ -50814,21 +50862,21 @@ msgstr "" msgid "Target Warehouse for Finished Good must be same as Finished Good Warehouse {1} in Work Order {2} linked to the Subcontracting Inward Order." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:753 +#: erpnext/manufacturing/doctype/work_order/work_order.py:777 msgid "Target Warehouse is required before Submit" msgstr "" -#: erpnext/controllers/selling_controller.py:881 +#: erpnext/controllers/selling_controller.py:882 msgid "Target Warehouse is set for some items but the customer is not an internal customer." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:311 +#: erpnext/manufacturing/doctype/work_order/work_order.py:316 msgid "Target Warehouse {0} must be same as Delivery Warehouse {1} in the Subcontracting Inward Order Item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:789 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:796 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:811 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:790 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:797 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:812 msgid "Target warehouse is mandatory for row {0}" msgstr "" @@ -51127,7 +51175,7 @@ msgstr "" msgid "Tax Rule" msgstr "" -#: erpnext/accounts/doctype/tax_rule/tax_rule.py:134 +#: erpnext/accounts/doctype/tax_rule/tax_rule.py:137 msgid "Tax Rule Conflicts with {0}" msgstr "" @@ -51142,7 +51190,7 @@ msgstr "" msgid "Tax Template" msgstr "" -#: erpnext/accounts/doctype/tax_rule/tax_rule.py:83 +#: erpnext/accounts/doctype/tax_rule/tax_rule.py:85 msgid "Tax Template is mandatory." msgstr "" @@ -51732,7 +51780,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/territory_item/territory_item.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:131 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1245 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1287 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:97 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:182 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:68 @@ -51831,7 +51879,7 @@ msgstr "" msgid "The 'From Package No.' field must neither be empty nor it's value less than 1." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:398 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:411 msgid "The Access to Request for Quotation From Portal is Disabled. To Allow Access, Enable it in Portal Settings." msgstr "" @@ -51840,7 +51888,7 @@ msgstr "" msgid "The BOM which will be replaced" msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1517 +#: erpnext/stock/serial_batch_bundle.py:1525 msgid "The Batch {0} has negative batch quantity {1}. To fix this, go to the batch and click on Recalculate Batch Qty. If the issue still persists, create an inward entry." msgstr "" @@ -51884,7 +51932,7 @@ msgstr "" msgid "The Pick List having Stock Reservation Entries cannot be updated. If you need to make changes, we recommend canceling the existing Stock Reservation Entries before updating the Pick List." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2610 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2611 msgid "The Process Loss Qty has reset as per job cards Process Loss Qty" msgstr "" @@ -51896,11 +51944,11 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2546 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2576 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1743 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1744 msgid "The Serial and Batch Bundle {0} is not valid for this transaction. The 'Type of Transaction' should be 'Outward' instead of 'Inward' in Serial and Batch Bundle {0}" msgstr "" @@ -51922,7 +51970,7 @@ msgstr "" msgid "The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document." msgstr "" -#: erpnext/controllers/stock_controller.py:1271 +#: erpnext/controllers/stock_controller.py:1312 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 "" @@ -52021,7 +52069,7 @@ msgstr "" msgid "The following rows are duplicates:" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:895 +#: erpnext/stock/doctype/material_request/material_request.py:898 msgid "The following {0} were created: {1}" msgstr "" @@ -52124,11 +52172,11 @@ msgstr "" msgid "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units." msgstr "" -#: erpnext/public/js/utils.js:876 +#: erpnext/public/js/utils.js:941 msgid "The reserved stock will be released when you update items. Are you certain you wish to proceed?" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.js:159 +#: erpnext/stock/doctype/pick_list/pick_list.js:161 msgid "The reserved stock will be released. Are you certain you wish to proceed?" msgstr "" @@ -52148,7 +52196,7 @@ msgstr "" msgid "The selected item cannot have Batch" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:619 +#: erpnext/assets/doctype/asset/asset.js:647 msgid "The sell quantity is less than the total asset quantity. The remaining quantity will be split into a new asset. This action cannot be undone.

Do you want to continue?" msgstr "" @@ -52156,8 +52204,8 @@ msgstr "" msgid "The seller and the buyer cannot be the same" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:177 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:189 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:187 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:199 msgid "The serial and batch bundle {0} not linked to {1} {2}" msgstr "" @@ -52203,11 +52251,11 @@ msgstr "" msgid "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:338 +#: erpnext/stock/doctype/material_request/material_request.py:341 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:345 +#: erpnext/stock/doctype/material_request/material_request.py:348 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "" @@ -52259,7 +52307,7 @@ msgstr "" msgid "The {0} ({1}) must be equal to {2} ({3})" msgstr "" -#: erpnext/public/js/controllers/transaction.js:3401 +#: erpnext/public/js/controllers/transaction.js:3404 msgid "The {0} contains Unit Price Items." msgstr "" @@ -52267,7 +52315,7 @@ msgstr "" msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:901 +#: erpnext/stock/doctype/material_request/material_request.py:904 msgid "The {0} {1} created successfully" msgstr "" @@ -52283,7 +52331,7 @@ msgstr "" msgid "Then Pricing Rules are filtered out based on Customer, Customer Group, Territory, Supplier, Supplier Type, Campaign, Sales Partner etc." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:725 +#: erpnext/assets/doctype/asset/asset.py:729 msgid "There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset." msgstr "" @@ -52307,7 +52355,7 @@ msgstr "" msgid "There are no slots available on this date" msgstr "" -#: erpnext/stock/doctype/item/item.js:1072 +#: erpnext/stock/doctype/item/item.js:1090 msgid "There are two options to maintain valuation of stock. FIFO (first in - first out) and Moving Average. To understand this topic in detail please visit Item Valuation, FIFO and Moving Average." msgstr "" @@ -52339,7 +52387,7 @@ msgstr "" msgid "There is no batch found against the {0}: {1}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1680 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1681 msgid "There must be atleast 1 Finished Good in this Stock Entry" msgstr "" @@ -52370,11 +52418,11 @@ msgstr "" msgid "This Account has '0' balance in either Base Currency or Account Currency" msgstr "" -#: erpnext/stock/doctype/item/item.js:136 +#: erpnext/stock/doctype/item/item.js:154 msgid "This Item is a Template and cannot be used in transactions.
All fields present in the 'Copy Fields to Variant' table in Item Variant Settings will be copied to its variant items." msgstr "" -#: erpnext/stock/doctype/item/item.js:195 +#: erpnext/stock/doctype/item/item.js:213 msgid "This Item is a Variant of {0} (Template)." msgstr "" @@ -52382,11 +52430,11 @@ msgstr "" msgid "This Month's Summary" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:928 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:929 msgid "This Purchase Order has been fully subcontracted." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:2052 +#: erpnext/selling/doctype/sales_order/sales_order.py:2054 msgid "This Sales Order has been fully subcontracted." msgstr "" @@ -52402,7 +52450,7 @@ msgstr "" msgid "This action will unlink this account from any external service integrating ERPNext with your bank accounts. It cannot be undone. Are you certain ?" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:427 +#: erpnext/assets/doctype/asset/asset.py:431 msgid "This asset category is marked as non-depreciable. Please disable depreciation calculation or choose a different category." msgstr "" @@ -52453,7 +52501,7 @@ msgstr "" msgid "This is a location where scraped materials are stored." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:315 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:322 msgid "This is a preview of the email to be sent. A PDF of the document will automatically be attached with the email." msgstr "" @@ -52509,7 +52557,7 @@ msgstr "" msgid "This is enabled by default. If you want to plan materials for sub-assemblies of the Item you're manufacturing leave this enabled. If you plan and manufacture the sub-assemblies separately, you can disable this checkbox." msgstr "" -#: erpnext/stock/doctype/item/item.js:1060 +#: erpnext/stock/doctype/item/item.js:1078 msgid "This is for raw material Items that'll be used to create finished goods. If the Item is an additional service like 'washing' that'll be used in the BOM, keep this unchecked." msgstr "" @@ -52535,7 +52583,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was adjusted through Asset Value Adjustment {1}." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:494 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:476 msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "" @@ -52543,11 +52591,11 @@ msgstr "" msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1501 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1504 msgid "This schedule was created when Asset {0} was restored due to Sales Invoice {1} cancellation." msgstr "" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:604 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:585 msgid "This schedule was created when Asset {0} was restored on Asset Capitalization {1}'s cancellation." msgstr "" @@ -52555,7 +52603,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was restored." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1497 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1500 msgid "This schedule was created when Asset {0} was returned through Sales Invoice {1}." msgstr "" @@ -52563,11 +52611,11 @@ msgstr "" msgid "This schedule was created when Asset {0} was scrapped." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1503 +#: erpnext/assets/doctype/asset/asset.py:1507 msgid "This schedule was created when Asset {0} was {1} into new Asset {2}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1473 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1476 msgid "This schedule was created when Asset {0} was {1} through Sales Invoice {2}." msgstr "" @@ -52611,7 +52659,7 @@ msgstr "" msgid "This will restrict user access to other employee records" msgstr "" -#: erpnext/controllers/selling_controller.py:882 +#: erpnext/controllers/selling_controller.py:883 msgid "This {} will be treated as material transfer." msgstr "" @@ -52734,6 +52782,13 @@ msgstr "" msgid "Time(in mins)" msgstr "" +#. Label of the section_break_18 (Section Break) field in DocType 'Project' +#. Label of the sb_timeline (Section Break) field in DocType 'Task' +#: erpnext/projects/doctype/project/project.json +#: erpnext/projects/doctype/task/task.json +msgid "Timeline" +msgstr "" + #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:36 #: erpnext/public/js/projects/timer.js:5 msgid "Timer" @@ -53087,6 +53142,10 @@ msgstr "" msgid "To enable Capital Work in Progress Accounting," msgstr "" +#: erpnext/stock/doctype/item/item.js:94 +msgid "To enable the Serial No and Batch No feature, please check the 'Enable Serial / Batch No for Item' checkbox in Stock Settings." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.js:733 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "" @@ -53097,8 +53156,8 @@ msgstr "" msgid "To include sub-assembly costs and scrap items in Finished Goods on a work order without using a job card, when the 'Use Multi-Level BOM' option is enabled." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2243 -#: erpnext/controllers/accounts_controller.py:3234 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2247 +#: erpnext/controllers/accounts_controller.py:3237 msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" @@ -53227,7 +53286,7 @@ msgstr "" msgid "Total Active Items" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 msgid "Total Actual" msgstr "" @@ -53298,7 +53357,7 @@ msgstr "" msgid "Total Amount in Words" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:218 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:258 msgid "Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges" msgstr "" @@ -53311,7 +53370,7 @@ msgstr "" msgid "Total Asset Cost" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:153 +#: erpnext/assets/dashboard_fixtures.py:158 msgid "Total Assets" msgstr "" @@ -53360,7 +53419,7 @@ msgstr "" msgid "Total Billing Hours" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 msgid "Total Budget" msgstr "" @@ -53653,7 +53712,7 @@ msgstr "" msgid "Total Paid Amount" msgstr "" -#: erpnext/controllers/accounts_controller.py:2782 +#: erpnext/controllers/accounts_controller.py:2785 msgid "Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total" msgstr "" @@ -53665,7 +53724,7 @@ msgstr "" msgid "Total Payments" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:723 +#: erpnext/selling/doctype/sales_order/sales_order.py:725 msgid "Total Picked Quantity {0} is more than ordered qty {1}. You can set the Over Picking Allowance in Stock Settings." msgstr "" @@ -53878,7 +53937,7 @@ msgstr "" msgid "Total Time in Mins" msgstr "" -#: erpnext/public/js/utils.js:102 +#: erpnext/public/js/utils.js:167 msgid "Total Unpaid: {0}" msgstr "" @@ -53895,7 +53954,7 @@ msgstr "" msgid "Total Value Difference (Incoming - Outgoing)" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 #: erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py:144 msgid "Total Variance" msgstr "" @@ -53993,7 +54052,7 @@ msgstr "" msgid "Total {0} ({1})" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:199 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:239 msgid "Total {0} for all items is zero, may be you should change 'Distribute Charges Based On'" msgstr "" @@ -54229,7 +54288,7 @@ msgstr "" msgid "Transaction not allowed against stopped Work Order {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1248 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1252 msgid "Transaction reference no {0} dated {1}" msgstr "" @@ -54273,7 +54332,7 @@ msgstr "" msgid "Transfer" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:96 +#: erpnext/assets/doctype/asset/asset.js:152 msgid "Transfer Asset" msgstr "" @@ -54353,7 +54412,7 @@ msgstr "" msgid "Transit" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:501 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:502 msgid "Transit Entry" msgstr "" @@ -54638,7 +54697,7 @@ msgstr "" #: erpnext/manufacturing/doctype/workstation/workstation.js:480 #: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:70 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:110 -#: erpnext/public/js/stock_analytics.js:94 erpnext/public/js/utils.js:749 +#: erpnext/public/js/stock_analytics.js:94 erpnext/public/js/utils.js:814 #: erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json #: erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json @@ -54734,7 +54793,7 @@ msgstr "" msgid "UOM Name" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3775 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3776 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "" @@ -54811,7 +54870,7 @@ msgstr "" msgid "Unable to find score starting at {0}. You need to have standing scores covering 0 to 100" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1023 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1047 msgid "Unable to find the time slot in the next {0} days for the operation {1}. Please increase the 'Capacity Planning For (Days)' in the {2}." msgstr "" @@ -54897,7 +54956,7 @@ msgstr "" msgid "Unit" msgstr "" -#: erpnext/controllers/accounts_controller.py:4048 +#: erpnext/controllers/accounts_controller.py:4064 msgid "Unit Price" msgstr "" @@ -55050,7 +55109,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:900 #: erpnext/selling/doctype/sales_order/sales_order.js:107 -#: erpnext/stock/doctype/pick_list/pick_list.js:156 +#: erpnext/stock/doctype/pick_list/pick_list.js:158 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:193 msgid "Unreserve" msgstr "" @@ -55071,7 +55130,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:514 -#: erpnext/stock/doctype/pick_list/pick_list.js:308 +#: erpnext/stock/doctype/pick_list/pick_list.js:310 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:390 msgid "Unreserving Stock..." msgstr "" @@ -55244,7 +55303,7 @@ msgstr "" msgid "Update Costing and Billing" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.js:126 +#: erpnext/stock/doctype/pick_list/pick_list.js:128 msgid "Update Current Stock" msgstr "" @@ -55256,7 +55315,7 @@ msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.js:324 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:43 -#: erpnext/public/js/utils.js:855 +#: erpnext/public/js/utils.js:920 #: erpnext/selling/doctype/quotation/quotation.js:135 #: erpnext/selling/doctype/sales_order/sales_order.js:75 #: erpnext/selling/doctype/sales_order/sales_order.js:940 @@ -55320,7 +55379,7 @@ msgstr "" msgid "Update latest price in all BOMs" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:467 +#: erpnext/assets/doctype/asset/asset.py:471 msgid "Update stock must be enabled for the purchase invoice {0}" msgstr "" @@ -55901,8 +55960,8 @@ msgstr "" #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:67 -#: erpnext/stock/report/stock_balance/stock_balance.py:520 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:298 +#: erpnext/stock/report/stock_balance/stock_balance.py:562 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:362 msgid "Valuation Rate" msgstr "" @@ -55910,11 +55969,11 @@ msgstr "" msgid "Valuation Rate (In / Out)" msgstr "" -#: erpnext/stock/stock_ledger.py:2015 +#: erpnext/stock/stock_ledger.py:2018 msgid "Valuation Rate Missing" msgstr "" -#: erpnext/stock/stock_ledger.py:1993 +#: erpnext/stock/stock_ledger.py:1996 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" @@ -55945,8 +56004,8 @@ msgstr "" msgid "Valuation rate for the item as per Sales Invoice (Only for Internal Transfers)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2267 -#: erpnext/controllers/accounts_controller.py:3258 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2271 +#: erpnext/controllers/accounts_controller.py:3261 msgid "Valuation type charges can not be marked as Inclusive" msgstr "" @@ -56059,10 +56118,10 @@ msgstr "" msgid "Variables" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:240 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:244 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:326 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:336 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:247 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:251 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:333 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:343 msgid "Variance" msgstr "" @@ -56070,7 +56129,7 @@ msgstr "" msgid "Variance ({})" msgstr "" -#: erpnext/stock/doctype/item/item.js:183 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/doctype/item/item_list.js:22 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" @@ -56099,7 +56158,7 @@ msgstr "" msgid "Variant Based On cannot be changed" msgstr "" -#: erpnext/stock/doctype/item/item.js:159 +#: erpnext/stock/doctype/item/item.js:177 msgid "Variant Details Report" msgstr "" @@ -56124,7 +56183,7 @@ msgstr "" msgid "Variant Of" msgstr "" -#: erpnext/stock/doctype/item/item.js:752 +#: erpnext/stock/doctype/item/item.js:770 msgid "Variant creation has been queued." msgstr "" @@ -56259,10 +56318,6 @@ msgstr "" msgid "View Exchange Gain/Loss Journals" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:172 -msgid "View General Ledger" -msgstr "" - #: erpnext/crm/doctype/campaign/campaign.js:15 msgid "View Leads" msgstr "" @@ -56394,7 +56449,7 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.js:56 #: erpnext/stock/report/available_serial_no/available_serial_no.py:196 #: erpnext/stock/report/stock_ledger/stock_ledger.js:97 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:323 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:387 msgid "Voucher #" msgstr "" @@ -56452,9 +56507,9 @@ msgstr "" #: erpnext/accounts/doctype/repost_accounting_ledger_items/repost_accounting_ledger_items.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1200 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:209 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1242 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:56 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:221 #: erpnext/accounts/report/general_ledger/general_ledger.js:49 #: erpnext/accounts/report/general_ledger/general_ledger.py:744 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.js:41 @@ -56484,7 +56539,7 @@ msgstr "" msgid "Voucher No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1351 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1381 msgid "Voucher No is mandatory" msgstr "" @@ -56525,8 +56580,8 @@ msgstr "" #: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1198 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:200 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1240 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:212 #: erpnext/accounts/report/general_ledger/general_ledger.py:736 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:31 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:165 @@ -56552,7 +56607,7 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:486 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:27 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py:152 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:321 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:385 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:159 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:68 msgid "Voucher Type" @@ -56754,11 +56809,11 @@ msgstr "" msgid "Warehouse {0} does not exist" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:237 +#: erpnext/manufacturing/doctype/work_order/work_order.py:242 msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "" -#: erpnext/controllers/stock_controller.py:774 +#: erpnext/controllers/stock_controller.py:815 msgid "Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}." msgstr "" @@ -56879,11 +56934,11 @@ msgstr "" msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1436 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1460 msgid "Warning: Quantity exceeds maximum producible quantity based on quantity of raw materials received through the Subcontracting Inward Order {0}." msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:345 +#: erpnext/selling/doctype/sales_order/sales_order.py:347 msgid "Warning: Sales Order {0} already exists against Customer's Purchase Order {1}" msgstr "" @@ -56944,6 +56999,10 @@ msgstr "" msgid "Warranty Period (in days)" msgstr "" +#: erpnext/utilities/doctype/video/video.js:7 +msgid "Watch Video" +msgstr "" + #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Watt" @@ -57149,11 +57208,11 @@ msgstr "" msgid "When checked, the system will use the posting datetime of the document for naming the document instead of the creation datetime of the document." msgstr "" -#: erpnext/stock/doctype/item/item.js:1079 +#: erpnext/stock/doctype/item/item.js:1097 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:294 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:295 msgid "When there are multiple finished goods ({0}) in a Repack stock entry, the basic rate for all finished goods must be set manually. To set rate manually, enable the checkbox 'Set Basic Rate Manually' in the respective finished good row." msgstr "" @@ -57308,7 +57367,7 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1050 #: erpnext/stock/doctype/material_request/material_request.js:216 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:902 +#: erpnext/stock/doctype/material_request/material_request.py:905 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -57379,16 +57438,16 @@ msgstr "" msgid "Work Order Summary Report" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:908 +#: erpnext/stock/doctype/material_request/material_request.py:911 msgid "Work Order cannot be created for following reason:
{0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1380 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1404 msgid "Work Order cannot be raised against a Item Template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2427 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2507 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2451 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2531 msgid "Work Order has been {0}" msgstr "" @@ -57400,12 +57459,12 @@ msgstr "" msgid "Work Order {0} created" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:861 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:862 msgid "Work Order {0}: Job Card not found for the operation {1}" msgstr "" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:896 +#: erpnext/stock/doctype/material_request/material_request.py:899 msgid "Work Orders" msgstr "" @@ -57430,7 +57489,7 @@ msgstr "" msgid "Work-in-Progress Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:751 +#: erpnext/manufacturing/doctype/work_order/work_order.py:775 msgid "Work-in-Progress Warehouse is required before Submit" msgstr "" @@ -57663,10 +57722,12 @@ msgstr "" msgid "Writeoff" msgstr "" +#. Option for the 'Depreciation Method' (Select) field in DocType 'Asset' #. Option for the 'Depreciation Method' (Select) field in DocType 'Asset #. Depreciation Schedule' #. Option for the 'Depreciation Method' (Select) field in DocType 'Asset #. Finance Book' +#: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json #: erpnext/assets/doctype/asset_finance_book/asset_finance_book.json msgid "Written Down Value" @@ -57724,7 +57785,7 @@ msgstr "" msgid "You are importing data for the code list:" msgstr "" -#: erpnext/controllers/accounts_controller.py:3858 +#: erpnext/controllers/accounts_controller.py:3861 msgid "You are not allowed to update as per the conditions set in {} Workflow." msgstr "" @@ -57793,7 +57854,7 @@ msgstr "" msgid "You can't make any changes to Job Card since Work Order is closed." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:220 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:230 msgid "You can't process the serial number {0} as it has already been used in the SABB {1}. {2} if you want to inward same serial number multiple times then enabled 'Allow existing Serial No to be Manufactured/Received again' in the {3}" msgstr "" @@ -57833,7 +57894,7 @@ msgstr "" msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:158 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:168 msgid "You cannot outward following {0} as either they are Delivered, Inactive or located in a different warehouse." msgstr "" @@ -57861,7 +57922,7 @@ msgstr "" msgid "You cannot {0} this document because another Period Closing Entry {1} exists after {2}" msgstr "" -#: erpnext/controllers/accounts_controller.py:3834 +#: erpnext/controllers/accounts_controller.py:3837 msgid "You do not have permissions to {} items in a {}." msgstr "" @@ -57877,7 +57938,7 @@ msgstr "" msgid "You had {} errors while creating opening invoices. Check {} for more details" msgstr "" -#: erpnext/public/js/utils.js:955 +#: erpnext/public/js/utils.js:1020 msgid "You have already selected items from {0} {1}" msgstr "" @@ -57885,7 +57946,7 @@ msgstr "" msgid "You have been invited to collaborate on the project {0}." msgstr "" -#: erpnext/stock/doctype/stock_settings/stock_settings.py:217 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:239 msgid "You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted in the transaction price list." msgstr "" @@ -57913,7 +57974,7 @@ msgstr "" msgid "You need to cancel POS Closing Entry {} to be able to cancel this document." msgstr "" -#: erpnext/controllers/accounts_controller.py:3209 +#: erpnext/controllers/accounts_controller.py:3212 msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account." msgstr "" @@ -57964,7 +58025,7 @@ msgstr "" msgid "Zero Rated" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:562 msgid "Zero quantity" msgstr "" @@ -57981,7 +58042,7 @@ msgstr "" msgid "`Allow Negative rates for Items`" msgstr "" -#: erpnext/stock/stock_ledger.py:2007 +#: erpnext/stock/stock_ledger.py:2010 msgid "after" msgstr "" @@ -58001,7 +58062,7 @@ msgstr "" msgid "as a percentage of finished item quantity" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1483 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1513 msgid "as of {0}" msgstr "" @@ -58146,11 +58207,11 @@ msgstr "" msgid "out of 5" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1241 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1245 msgid "paid to" msgstr "" -#: erpnext/public/js/utils.js:372 +#: erpnext/public/js/utils.js:437 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "" @@ -58171,7 +58232,7 @@ msgstr "" msgid "per hour" msgstr "" -#: erpnext/stock/stock_ledger.py:2008 +#: erpnext/stock/stock_ledger.py:2011 msgid "performing either one below:" msgstr "" @@ -58196,11 +58257,11 @@ msgstr "" msgid "ratings" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1241 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1245 msgid "received from" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1478 msgid "returned" msgstr "" @@ -58235,7 +58296,7 @@ msgstr "" msgid "sandbox" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1478 msgid "sold" msgstr "" @@ -58262,7 +58323,7 @@ msgstr "" msgid "to" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3166 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3169 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "" @@ -58297,11 +58358,11 @@ msgstr "" msgid "{0} '{1}' not in Fiscal Year {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:643 +#: erpnext/manufacturing/doctype/work_order/work_order.py:661 msgid "{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}" msgstr "" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:341 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:381 msgid "{0} {1} has submitted Assets. Remove Item {2} from table to continue." msgstr "" @@ -58425,11 +58486,11 @@ msgstr "" msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:294 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:295 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:127 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:137 msgid "{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution." msgstr "" @@ -58471,7 +58532,7 @@ msgstr "" msgid "{0} hours" msgstr "" -#: erpnext/controllers/accounts_controller.py:2722 +#: erpnext/controllers/accounts_controller.py:2725 msgid "{0} in row {1}" msgstr "" @@ -58497,7 +58558,7 @@ msgstr "" msgid "{0} is blocked so this transaction cannot proceed" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:501 +#: erpnext/assets/doctype/asset/asset.py:505 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "" @@ -58514,7 +58575,7 @@ msgstr "" msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}" msgstr "" -#: erpnext/controllers/accounts_controller.py:3166 +#: erpnext/controllers/accounts_controller.py:3169 msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}." msgstr "" @@ -58526,10 +58587,14 @@ msgstr "" msgid "{0} is not a group node. Please select a group node as parent cost center" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:613 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:614 msgid "{0} is not a stock Item" msgstr "" +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:419 +msgid "{0} is not a valid Accounting Dimension." +msgstr "" + #: erpnext/controllers/item_variant.py:141 msgid "{0} is not a valid Value for Attribute {1} of Item {2}." msgstr "" @@ -58546,11 +58611,11 @@ msgstr "" msgid "{0} is not running. Cannot trigger events for this Document" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:652 +#: erpnext/stock/doctype/material_request/material_request.py:655 msgid "{0} is not the default supplier for any items." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2949 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2953 msgid "{0} is on hold till {1}" msgstr "" @@ -58574,7 +58639,7 @@ msgstr "" msgid "{0} must be negative in return document" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2366 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2369 msgid "{0} not allowed to transact with {1}. Please change the Company or add the Company in the 'Allowed To Transact With'-Section in the Customer record." msgstr "" @@ -58590,7 +58655,7 @@ msgstr "" msgid "{0} payment entries can not be filtered by {1}" msgstr "" -#: erpnext/controllers/stock_controller.py:1693 +#: erpnext/controllers/stock_controller.py:1734 msgid "{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}." msgstr "" @@ -58610,12 +58675,12 @@ msgstr "" msgid "{0} units of {1} are required in {2} with the inventory dimension: {3} on {4} {5} for {6} to complete the transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1683 erpnext/stock/stock_ledger.py:2157 -#: erpnext/stock/stock_ledger.py:2171 +#: erpnext/stock/stock_ledger.py:1683 erpnext/stock/stock_ledger.py:2160 +#: erpnext/stock/stock_ledger.py:2174 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:2258 erpnext/stock/stock_ledger.py:2303 +#: erpnext/stock/stock_ledger.py:2261 erpnext/stock/stock_ledger.py:2306 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "" @@ -58631,7 +58696,7 @@ msgstr "" msgid "{0} valid serial nos for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:757 +#: erpnext/stock/doctype/item/item.js:775 msgid "{0} variants created." msgstr "" @@ -58669,7 +58734,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:613 #: erpnext/accounts/doctype/payment_entry/payment_entry.py:666 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2695 msgid "{0} {1} does not exist" msgstr "" @@ -58685,8 +58750,8 @@ msgstr "" msgid "{0} {1} has already been partly paid. Please use the 'Get Outstanding Invoice' or the 'Get Outstanding Orders' button to get the latest outstanding amounts." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:434 -#: erpnext/selling/doctype/sales_order/sales_order.py:596 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:435 +#: erpnext/selling/doctype/sales_order/sales_order.py:598 #: erpnext/stock/doctype/material_request/material_request.py:247 msgid "{0} {1} has been modified. Please refresh." msgstr "" @@ -58707,12 +58772,12 @@ msgstr "" msgid "{0} {1} is associated with {2}, but Party Account is {3}" msgstr "" -#: erpnext/controllers/selling_controller.py:494 +#: erpnext/controllers/selling_controller.py:495 #: erpnext/controllers/subcontracting_controller.py:1167 msgid "{0} {1} is cancelled or closed" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:423 +#: erpnext/stock/doctype/material_request/material_request.py:426 msgid "{0} {1} is cancelled or stopped" msgstr "" @@ -58796,7 +58861,7 @@ msgstr "" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "" -#: erpnext/controllers/stock_controller.py:906 +#: erpnext/controllers/stock_controller.py:947 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "" @@ -58870,6 +58935,10 @@ msgstr "" msgid "{0}: {1} does not belong to the Company: {2}" msgstr "" +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1392 +msgid "{0}: {1} does not exist" +msgstr "" + #: erpnext/accounts/party.py:78 msgid "{0}: {1} does not exists" msgstr "" @@ -58894,7 +58963,7 @@ msgstr "" msgid "{field_label} is mandatory for sub-contracted {doctype}." msgstr "" -#: erpnext/controllers/stock_controller.py:2098 +#: erpnext/controllers/stock_controller.py:2141 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "" @@ -58906,7 +58975,7 @@ msgstr "" msgid "{}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2132 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2135 msgid "{} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {}" msgstr "" diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 44cddac46d6..9ae05611b6c 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -637,11 +637,18 @@ erpnext.bom.BomController = class BomController extends erpnext.TransactionContr } buying_price_list(doc) { - this.apply_price_list(); + if (doc.rm_cost_as_per !== "Price List" && doc.buying_price_list) { + this.frm.set_value("buying_price_list", ""); + return; + } + + if (doc.buying_price_list) { + this.apply_price_list(); + } } plc_conversion_rate(doc) { - if (!this.in_apply_price_list) { + if (!this.in_apply_price_list && doc.rm_cost_as_per === "Price List") { this.apply_price_list(null, true); } } diff --git a/erpnext/manufacturing/doctype/bom/bom_tree.js b/erpnext/manufacturing/doctype/bom/bom_tree.js index cbf09a618cf..c4ecb853d7b 100644 --- a/erpnext/manufacturing/doctype/bom/bom_tree.js +++ b/erpnext/manufacturing/doctype/bom/bom_tree.js @@ -15,18 +15,18 @@ frappe.treeview_settings["BOM"] = { get_tree_root: false, show_expand_all: false, get_label: function (node) { - if (node.data.qty) { - const escape = frappe.utils.escape_html; - let label = escape(node.data.item_code); - if (node.data.item_name && node.data.item_code !== node.data.item_name) { - label += `: ${escape(node.data.item_name)}`; - } - return `${label} ${node.data.qty} ${escape( - __(node.data.stock_uom) - )}`; - } else { - return node.data.item_code || node.data.value; + if (node.is_root && node.data.value != "BOM") { + frappe.model.with_doc("BOM", node.data.value, function () { + var bom = frappe.model.get_doc("BOM", node.data.value); + node.data.item_name = bom.item_name || ""; + node.data.item_code = bom.item || ""; + node.data.qty = bom.quantity || ""; + node.data.stock_uom = bom.uom || ""; + return get_bom_node(node); + }); } + + return get_bom_node(node); }, onload: function (me) { var label = frappe.get_route()[0] + "/" + frappe.get_route()[1]; @@ -78,3 +78,22 @@ frappe.treeview_settings["BOM"] = { }, view_template: "bom_item_preview", }; + +function get_bom_node(node) { + if (node.data.qty) { + const escape = frappe.utils.escape_html; + let label = escape(node.data.item_code); + if (node.is_root && node.data.value != "BOM") { + label = escape(node.data.value); + } + + if (node.data.item_name && node.data.item_code !== node.data.item_name) { + label += `: ${escape(node.data.item_name)}`; + } + return `${label} ${node.data.qty} ${escape( + __(node.data.stock_uom) + )}`; + } else { + return node.data.item_code || node.data.value; + } +} diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 46209c88117..d283bc8dadb 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -1321,9 +1321,9 @@ class JobCard(Document): def is_work_order_closed(self): if self.work_order: - status = frappe.get_value("Work Order", self.work_order) + status = frappe.get_value("Work Order", self.work_order, "status") - if status == "Closed": + if status in ["Closed", "Stopped"]: return True return False diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js index a61f95812b1..f382d1dcb60 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.js +++ b/erpnext/manufacturing/doctype/work_order/work_order.js @@ -461,10 +461,11 @@ frappe.ui.form.on("Work Order", { var added_min = false; // produced qty - var title = __("{0} items produced", [frm.doc.produced_qty]); + let produced_qty = frm.doc.produced_qty - frm.doc.disassembled_qty; + var title = __("{0} items produced", [produced_qty]); bars.push({ title: title, - width: (frm.doc.produced_qty / frm.doc.qty) * 100 + "%", + width: (flt(produced_qty) / frm.doc.qty) * 100 + "%", progress_class: "progress-bar-success", }); if (bars[0].width == "0%") { @@ -481,14 +482,27 @@ frappe.ui.form.on("Work Order", { if (pending_complete > 0) { var width = (pending_complete / frm.doc.qty) * 100 - added_min; title = __("{0} items in progress", [pending_complete]); + let progress_class = "progress-bar-warning"; + if (frm.doc.status == "Closed") { + if (frm.doc.required_items.find((d) => d.returned_qty > 0)) { + title = __("{0} items returned", [pending_complete]); + progress_class = "progress-bar-warning"; + } else { + title = __("{0} items to return", [pending_complete]); + progress_class = "progress-bar-info"; + } + } + bars.push({ title: title, width: (width > 100 ? "99.5" : width) + "%", - progress_class: "progress-bar-warning", + progress_class: progress_class, }); message = message + ". " + title; } } + + //process loss qty if (frm.doc.process_loss_qty) { var process_loss_width = (frm.doc.process_loss_qty / frm.doc.qty) * 100; title = __("{0} items lost during process.", [frm.doc.process_loss_qty]); @@ -499,6 +513,19 @@ frappe.ui.form.on("Work Order", { }); message = message + ". " + title; } + + // disassembled qty + if (frm.doc.disassembled_qty) { + var disassembled_width = (frm.doc.disassembled_qty / frm.doc.qty) * 100; + title = __("{0} items disassembled", [frm.doc.disassembled_qty]); + bars.push({ + title: title, + width: disassembled_width + "%", + progress_class: "progress-bar-secondary", + }); + message = message + ". " + title; + } + frm.dashboard.add_progress(__("Status"), bars, message); }, diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index b74281308b7..3c27d502088 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -713,19 +713,25 @@ class WorkOrder(Document): self.db_set("disassembled_qty", self.disassembled_qty) def get_transferred_or_manufactured_qty(self, purpose, fieldname): - table = frappe.qb.DocType("Stock Entry") - query = frappe.qb.from_(table).where( - (table.work_order == self.name) & (table.docstatus == 1) & (table.purpose == purpose) + parent = frappe.qb.DocType("Stock Entry") + + query = frappe.qb.from_(parent).where( + (parent.work_order == self.name) + & (parent.docstatus == 1) + & (parent.purpose == purpose) + & (parent.is_additional_transfer_entry == cint(fieldname == "additional_transferred_qty")) ) if purpose == "Manufacture": - query = query.select(Sum(table.fg_completed_qty) - Sum(table.process_loss_qty)) + child = frappe.qb.DocType("Stock Entry Detail") + query = ( + query.join(child) + .on(parent.name == child.parent) + .select(Sum(child.transfer_qty)) + .where(child.is_finished_item == 1) + ) else: - query = query.select(Sum(table.fg_completed_qty)) - - query = query.where( - table.is_additional_transfer_entry == cint(fieldname == "additional_transferred_qty") - ) + query = query.select(Sum(parent.fg_completed_qty)) return flt(query.run()[0][0]) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 3c59e1ff550..c80d2a2969b 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -74,7 +74,6 @@ erpnext.patches.v12_0.make_item_manufacturer erpnext.patches.v12_0.move_item_tax_to_item_tax_template erpnext.patches.v11_1.set_variant_based_on erpnext.patches.v11_1.woocommerce_set_creation_user -erpnext.patches.v11_1.rename_depends_on_lwp execute:frappe.delete_doc("Report", "Inactive Items") erpnext.patches.v11_1.delete_scheduling_tool erpnext.patches.v12_0.rename_tolerance_fields @@ -468,3 +467,6 @@ erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v15_0.delete_quotation_lost_record_detail erpnext.patches.v16_0.add_portal_redirects erpnext.patches.v16_0.complete_onboarding_steps_for_older_sites #2 +erpnext.patches.v16_0.migrate_asset_type_checkboxes_to_select +erpnext.patches.v16_0.update_order_qty_and_requested_qty_based_on_mr_and_po +erpnext.patches.v16_0.enable_serial_batch_setting diff --git a/erpnext/patches/v16_0/enable_serial_batch_setting.py b/erpnext/patches/v16_0/enable_serial_batch_setting.py new file mode 100644 index 00000000000..de46f591b99 --- /dev/null +++ b/erpnext/patches/v16_0/enable_serial_batch_setting.py @@ -0,0 +1,9 @@ +import frappe + + +def execute(): + if not frappe.get_all("Serial No", limit=1) and not frappe.get_all("Batch", limit=1): + return + + frappe.db.set_single_value("Stock Settings", "enable_serial_and_batch_no_for_item", 1) + frappe.db.set_default("enable_serial_and_batch_no_for_item", 1) diff --git a/erpnext/patches/v16_0/migrate_asset_type_checkboxes_to_select.py b/erpnext/patches/v16_0/migrate_asset_type_checkboxes_to_select.py new file mode 100644 index 00000000000..11f341ce65a --- /dev/null +++ b/erpnext/patches/v16_0/migrate_asset_type_checkboxes_to_select.py @@ -0,0 +1,25 @@ +import frappe +from frappe.query_builder import Case + + +def execute(): + required_columns = [ + "is_existing_asset", + "is_composite_asset", + "is_composite_component", + ] + + # Skip patch if any required column is missing + if not all(frappe.db.has_column("Asset", col) for col in required_columns): + return + + Asset = frappe.qb.DocType("Asset") + + frappe.qb.update(Asset).set( + Asset.asset_type, + Case() + .when(Asset.is_existing_asset == 1, "Existing Asset") + .when(Asset.is_composite_asset == 1, "Composite Asset") + .when(Asset.is_composite_component == 1, "Composite Component") + .else_(""), + ).run() diff --git a/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py new file mode 100644 index 00000000000..59a84ec11d0 --- /dev/null +++ b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py @@ -0,0 +1,33 @@ +import frappe +from frappe.query_builder import DocType +from frappe.query_builder.functions import Sum + + +def execute(): + PurchaseOrderItem = DocType("Purchase Order Item") + MaterialRequestItem = DocType("Material Request Item") + + poi_query = ( + frappe.qb.from_(PurchaseOrderItem) + .select(PurchaseOrderItem.sales_order_item, Sum(PurchaseOrderItem.stock_qty)) + .where(PurchaseOrderItem.sales_order_item.isnotnull() & PurchaseOrderItem.docstatus == 1) + .groupby(PurchaseOrderItem.sales_order_item) + ) + + mri_query = ( + frappe.qb.from_(MaterialRequestItem) + .select(MaterialRequestItem.sales_order_item, Sum(MaterialRequestItem.stock_qty)) + .where(MaterialRequestItem.sales_order_item.isnotnull() & MaterialRequestItem.docstatus == 1) + .groupby(MaterialRequestItem.sales_order_item) + ) + + poi_data = poi_query.run() + mri_data = mri_query.run() + + updates_against_poi = {data[0]: {"ordered_qty": data[1]} for data in poi_data} + updates_against_mri = {data[0]: {"requested_qty": data[1], "ordered_qty": 0} for data in mri_data} + + frappe.db.auto_commit_on_many_writes = 1 + frappe.db.bulk_update("Sales Order Item", updates_against_mri) + frappe.db.bulk_update("Sales Order Item", updates_against_poi) + frappe.db.auto_commit_on_many_writes = 0 diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index 4d4c4ece745..96023492516 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -205,7 +205,7 @@ frappe.ui.form.on("Project", { collect_progress: function (frm) { if (frm.doc.collect_progress && !frm.doc.subject) { - frm.set_value("subject", __("For project {0}, update your status", [frm.doc.name])); + frm.set_value("subject", __("For project - {0}, update your status", [frm.doc.project_name])); } }, }); diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index 7094a5a7226..e36e15f71f5 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -12,29 +12,21 @@ "project_name", "status", "project_type", - "is_active", "percent_complete_method", - "percent_complete", "column_break_5", "project_template", - "expected_start_date", - "expected_end_date", "priority", "department", - "customer_details", - "customer", - "column_break_14", - "sales_order", - "users_section", - "users", - "copied_from", - "section_break0", - "notes", + "is_active", + "percent_complete", "section_break_18", + "expected_start_date", "actual_start_date", "actual_time", "column_break_20", + "expected_end_date", "actual_end_date", + "costing_tab", "project_details", "estimated_costing", "total_costing_amount", @@ -50,7 +42,7 @@ "gross_margin", "column_break_37", "per_gross_margin", - "monitor_progress", + "monitor_progress_tab", "collect_progress", "holiday_list", "frequency", @@ -63,7 +55,18 @@ "weekly_time_to_send", "column_break_45", "subject", - "message" + "message", + "more_info_tab", + "customer_details", + "customer", + "column_break_14", + "sales_order", + "users_section", + "users", + "copied_from", + "section_break0", + "notes", + "connections_tab" ], "fields": [ { @@ -115,6 +118,7 @@ "bold": 1, "fieldname": "percent_complete", "fieldtype": "Percent", + "in_list_view": 1, "label": "% Completed", "no_copy": 1, "read_only": 1 @@ -135,6 +139,7 @@ "bold": 1, "fieldname": "expected_start_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Expected Start Date", "oldfieldname": "project_start_date", "oldfieldtype": "Date" @@ -231,7 +236,7 @@ "collapsible": 1, "fieldname": "section_break_18", "fieldtype": "Section Break", - "label": "Start and End Dates" + "label": "Timeline" }, { "fieldname": "actual_start_date", @@ -258,7 +263,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "project_details", "fieldtype": "Section Break", "label": "Costing and Billing", @@ -329,7 +333,6 @@ "options": "Cost Center" }, { - "collapsible": 1, "fieldname": "margin", "fieldtype": "Section Break", "label": "Margin", @@ -357,12 +360,6 @@ "oldfieldtype": "Currency", "read_only": 1 }, - { - "collapsible": 1, - "fieldname": "monitor_progress", - "fieldtype": "Section Break", - "label": "Monitor Progress" - }, { "default": "0", "fieldname": "collect_progress", @@ -455,6 +452,27 @@ "fieldtype": "Data", "label": "Subject", "mandatory_depends_on": "collect_progress" + }, + { + "fieldname": "costing_tab", + "fieldtype": "Tab Break", + "label": "Costing" + }, + { + "fieldname": "monitor_progress_tab", + "fieldtype": "Tab Break", + "label": "Progress" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "connections_tab", + "fieldtype": "Tab Break", + "label": "Connections", + "show_dashboard": 1 } ], "icon": "fa fa-puzzle-piece", @@ -462,7 +480,7 @@ "index_web_pages_for_search": 1, "links": [], "max_attachments": 4, - "modified": "2025-08-21 17:57:58.314809", + "modified": "2026-03-09 17:15:24.426294", "modified_by": "Administrator", "module": "Projects", "name": "Project", diff --git a/erpnext/projects/doctype/project_template/project_template.js b/erpnext/projects/doctype/project_template/project_template.js index a2d008af027..b929c59126e 100644 --- a/erpnext/projects/doctype/project_template/project_template.js +++ b/erpnext/projects/doctype/project_template/project_template.js @@ -19,6 +19,13 @@ frappe.ui.form.on("Project Template", { frappe.ui.form.on("Project Template Task", { task: function (frm, cdt, cdn) { var row = locals[cdt][cdn]; + + if (!row.task) { + row.subject = null; + refresh_field("tasks"); + return; + } + frappe.db.get_value("Task", row.task, "subject", (value) => { row.subject = value.subject; refresh_field("tasks"); diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index b9b70a207da..9335a196989 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -13,7 +13,6 @@ "type", "color", "is_group", - "is_template", "column_break0", "status", "priority", @@ -21,17 +20,21 @@ "parent_task", "completed_by", "completed_on", + "section_break_dafi", + "is_template", + "column_break_vvfp", + "start", + "duration", "sb_timeline", "exp_start_date", "expected_time", - "start", "column_break_11", "exp_end_date", "progress", - "duration", "is_milestone", "sb_details", "description", + "dependencies_tab", "sb_depends_on", "depends_on", "depends_on_tasks", @@ -44,12 +47,13 @@ "total_costing_amount", "column_break_20", "total_billing_amount", + "more_info_tab", "sb_more_info", + "company", "review_date", "closing_date", "column_break_22", "department", - "company", "lft", "rgt", "old_parent", @@ -78,7 +82,6 @@ "oldfieldname": "project", "oldfieldtype": "Link", "options": "Project", - "remember_last_selected_value": 1, "search_index": 1 }, { @@ -218,7 +221,6 @@ { "fieldname": "sb_depends_on", "fieldtype": "Section Break", - "label": "Dependencies", "oldfieldtype": "Section Break" }, { @@ -298,10 +300,9 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "sb_more_info", "fieldtype": "Section Break", - "label": "More Info" + "label": "Additional Info" }, { "depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"", @@ -334,8 +335,7 @@ "fieldname": "company", "fieldtype": "Link", "label": "Company", - "options": "Company", - "remember_last_selected_value": 1 + "options": "Company" }, { "fieldname": "lft", @@ -368,6 +368,7 @@ "options": "User" }, { + "allow_in_quick_entry": 1, "default": "0", "fieldname": "is_template", "fieldtype": "Check", @@ -397,6 +398,24 @@ "fieldtype": "Data", "hidden": 1, "label": "Template Task" + }, + { + "fieldname": "dependencies_tab", + "fieldtype": "Tab Break", + "label": "Dependencies" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "section_break_dafi", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_vvfp", + "fieldtype": "Column Break" } ], "icon": "fa fa-check", @@ -404,11 +423,11 @@ "is_tree": 1, "links": [], "max_attachments": 5, - "modified": "2025-10-16 08:39:12.214577", + "modified": "2026-03-04 11:47:10.454548", "modified_by": "Administrator", "module": "Projects", "name": "Task", - "naming_rule": "Expression (old style)", + "naming_rule": "Expression", "nsm_parent_field": "parent_task", "owner": "Administrator", "permissions": [ @@ -425,6 +444,7 @@ } ], "quick_entry": 1, + "row_format": "Dynamic", "search_fields": "subject", "show_name_in_global_search": 1, "show_preview_popup": 1, @@ -434,4 +454,4 @@ "timeline_field": "project", "title_field": "subject", "track_seen": 1 -} \ No newline at end of file +} diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index ba06dccb0b9..9b1e3bfcde4 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -138,6 +138,8 @@ class Task(NestedSet): def validate_status(self): if self.is_template and self.status != "Template": self.status = "Template" + if self.status == "Template" and not self.is_template: + self.status = "Open" if self.status != self.get_db_value("status") and self.status == "Completed": for d in self.depends_on: if frappe.db.get_value("Task", d.task, "status") not in ("Completed", "Cancelled"): diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index 97095dfa007..8001dffad86 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -260,6 +260,33 @@ frappe.ui.form.on("Timesheet", { parent_project: function (frm) { set_project_in_timelog(frm); }, + + employee: function (frm) { + if (frm.doc.employee && frm.doc.time_logs) { + const selected_employee = frm.doc.employee; + frm.doc.time_logs.forEach((row) => { + if (row.activity_type) { + frappe.call({ + method: "erpnext.projects.doctype.timesheet.timesheet.get_activity_cost", + args: { + employee: frm.doc.employee, + activity_type: row.activity_type, + currency: frm.doc.currency, + }, + callback: function (r) { + if (r.message) { + if (selected_employee !== frm.doc.employee) return; + row.billing_rate = r.message["billing_rate"]; + row.costing_rate = r.message["costing_rate"]; + frm.refresh_fields("time_logs"); + calculate_billing_costing_amount(frm, row.doctype, row.name); + } + }, + }); + } + }); + } + }, }); frappe.ui.form.on("Timesheet Detail", { diff --git a/erpnext/projects/doctype/timesheet/timesheet.json b/erpnext/projects/doctype/timesheet/timesheet.json index 0022ef9193b..bd38d7c6414 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.json +++ b/erpnext/projects/doctype/timesheet/timesheet.json @@ -18,28 +18,29 @@ "column_break_3", "status", "parent_project", - "employee_detail", - "employee", - "employee_name", - "department", - "column_break_9", "user", "start_date", "end_date", + "employee_detail", + "employee", + "department", + "column_break_9", + "employee_name", "section_break_5", "time_logs", "working_hours", "total_hours", + "billing_tab", "billing_details", "total_billable_hours", + "total_billable_amount", + "total_costing_amount", "base_total_billable_amount", - "base_total_billed_amount", "base_total_costing_amount", "column_break_10", "total_billed_hours", - "total_billable_amount", "total_billed_amount", - "total_costing_amount", + "base_total_billed_amount", "per_billed", "section_break_18", "note", @@ -176,7 +177,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "billing_details", "fieldtype": "Section Break", "label": "Billing Details", @@ -304,13 +304,18 @@ "fieldname": "exchange_rate", "fieldtype": "Float", "label": "Exchange Rate" + }, + { + "fieldname": "billing_tab", + "fieldtype": "Tab Break", + "label": "Billing" } ], "icon": "fa fa-clock-o", "idx": 1, "is_submittable": 1, "links": [], - "modified": "2025-12-19 13:48:23.453636", + "modified": "2026-03-04 11:56:51.438298", "modified_by": "Administrator", "module": "Projects", "name": "Timesheet", diff --git a/erpnext/public/icons/desktop_icons/solid/account_setup.svg b/erpnext/public/icons/desktop_icons/solid/account_setup.svg new file mode 100644 index 00000000000..e4139c73feb --- /dev/null +++ b/erpnext/public/icons/desktop_icons/solid/account_setup.svg @@ -0,0 +1,4 @@ + + + + diff --git a/erpnext/public/icons/desktop_icons/solid/organization.svg b/erpnext/public/icons/desktop_icons/solid/organization.svg new file mode 100644 index 00000000000..9f1763c8050 --- /dev/null +++ b/erpnext/public/icons/desktop_icons/solid/organization.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/erpnext/public/icons/desktop_icons/subtle/account_setup.svg b/erpnext/public/icons/desktop_icons/subtle/account_setup.svg new file mode 100644 index 00000000000..f34a59f4337 --- /dev/null +++ b/erpnext/public/icons/desktop_icons/subtle/account_setup.svg @@ -0,0 +1,4 @@ + + + + diff --git a/erpnext/public/icons/desktop_icons/subtle/organaisation.svg b/erpnext/public/icons/desktop_icons/subtle/organaisation.svg new file mode 100644 index 00000000000..95eeac954a2 --- /dev/null +++ b/erpnext/public/icons/desktop_icons/subtle/organaisation.svg @@ -0,0 +1,4 @@ + + + + diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 650611ee709..4a6ae04dac7 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -543,7 +543,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe schedules: selected, }, }); - + frappe.model.sync(pr_name); frappe.set_route("Form", "Payment Request", pr_name.name); }, }); @@ -580,6 +580,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe this.validate_has_items(); erpnext.utils.view_serial_batch_nos(this.frm); this.set_route_options_for_new_doc(); + erpnext.toggle_serial_batch_fields(this.frm); } set_route_options_for_new_doc() { @@ -1307,6 +1308,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe if (this.frm.doc.transaction_date) { this.frm.transaction_date = this.frm.doc.transaction_date; frappe.ui.form.trigger(this.frm.doc.doctype, "currency"); + this.recalculate_terms(); } } diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 41e7a7cad81..6fb1b88060c 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -19,6 +19,77 @@ $.extend(erpnext, { return currency_list; }, + toggle_serial_batch_fields(frm) { + let hide_fields = cint(frappe.user_defaults?.enable_serial_and_batch_no_for_item) === 0 ? 1 : 0; + let fields = ["serial_and_batch_bundle", "use_serial_batch_fields", "serial_no", "batch_no"]; + + if ( + [ + "Stock Entry", + "Purchase Receipt", + "Purchase Invoice", + "Stock Reconciliation", + "Subcontracting Receipt", + ].includes(frm.doc.doctype) + ) { + fields.push("add_serial_batch_bundle"); + } + + if (["Stock Reconciliation"].includes(frm.doc.doctype)) { + fields.push("reconcile_all_serial_batch"); + } + + if (["Sales Invoice", "Delivery Note", "Pick List"].includes(frm.doc.doctype)) { + fields.push("pick_serial_and_batch"); + } + + if (["Purchase Receipt", "Purchase Invoice", "Subcontracting Receipt"].includes(frm.doc.doctype)) { + fields.push("add_serial_batch_for_rejected_qty", "rejected_serial_and_batch_bundle"); + } + + let child_name = "items"; + if (frm.doc.doctype === "Pick List") { + child_name = "locations"; + } + + if (frm.doc.doctype === "Asset Capitalization") { + child_name = "stock_items"; + } + + fields.forEach((field) => { + if (frm.fields_dict[child_name].get_field(field)) { + frm.fields_dict[child_name].grid.update_docfield_property(field, "hidden", hide_fields); + + frm.fields_dict[child_name].grid.update_docfield_property( + field, + "in_list_view", + hide_fields ? 0 : 1 + ); + + if ( + frm.doc.doctype === "Subcontracting Receipt" && + !["add_serial_batch_for_rejected_qty", "rejected_serial_and_batch_bundle"].includes(field) + ) { + frm.fields_dict["supplied_items"].grid.update_docfield_property( + field, + "hidden", + hide_fields + ); + + frm.fields_dict["supplied_items"].grid.update_docfield_property( + field, + "in_list_view", + hide_fields ? 0 : 1 + ); + + frm.fields_dict["supplied_items"].grid.reset_grid(); + } + } + }); + + frm.fields_dict[child_name].grid.reset_grid(); + }, + toggle_naming_series: function () { if ( cur_frm && diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 360f5861d7b..95c5fb772e3 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -240,6 +240,7 @@ "fieldname": "default_currency", "fieldtype": "Link", "ignore_user_permissions": 1, + "in_list_view": 1, "label": "Billing Currency", "no_copy": 1, "options": "Currency" @@ -639,7 +640,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-02 15:39:55.920831", + "modified": "2026-03-09 17:15:26.040050", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index f4bad5d519b..f5e867964e5 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -213,6 +213,7 @@ { "fieldname": "company", "fieldtype": "Link", + "in_list_view": 1, "label": "Company", "oldfieldname": "company", "oldfieldtype": "Link", @@ -1127,7 +1128,7 @@ "idx": 82, "is_submittable": 1, "links": [], - "modified": "2026-02-06 17:34:22.170032", + "modified": "2026-03-09 17:15:31.941114", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 3db03a18513..4583b6cc1e5 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -7,7 +7,7 @@ import json import frappe from frappe import _ from frappe.model.mapper import get_mapped_doc -from frappe.utils import flt, getdate, nowdate +from frappe.utils import cint, flt, getdate, nowdate from erpnext.controllers.selling_controller import SellingController @@ -446,6 +446,10 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar child_filter = d.name in filtered_items if filtered_items else True return child_filter + automatically_fetch_payment_terms = cint( + frappe.get_single_value("Accounts Settings", "automatically_fetch_payment_terms") + ) + doclist = get_mapped_doc( "Quotation", source_name, @@ -453,6 +457,7 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar "Quotation": { "doctype": "Sales Order", "validation": {"docstatus": ["=", 1]}, + "field_no_map": ["payment_terms_template"], }, "Quotation Item": { "doctype": "Sales Order Item", @@ -462,13 +467,15 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar }, "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, - "Payment Schedule": {"doctype": "Payment Schedule", "add_if_empty": True}, }, target_doc, set_missing_values, ignore_permissions=ignore_permissions, ) + if automatically_fetch_payment_terms: + doclist.set_payment_schedule() + return doclist diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index 49f921d9865..367b7bae0f9 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -59,8 +59,22 @@ class TestQuotation(IntegrationTestCase): qo.payment_schedule[0].due_date = add_days(qo.transaction_date, -2) self.assertRaises(frappe.ValidationError, qo.save) - def test_update_child_disallow_rate_change(self): - qo = make_quotation(qty=4) + def test_update_child_rate_change(self): + from erpnext.stock.doctype.item.test_item import make_item + + item_1 = make_item("_Test Item") + item_2 = make_item("_Test Item 1") + + item_list = [ + {"item_code": item_1.item_code, "warehouse": "_Test Warehouse - _TC", "qty": 10, "rate": 300}, + {"item_code": item_2.item_code, "warehouse": "_Test Warehouse - _TC", "qty": 5, "rate": 400}, + ] + + qo = make_quotation(item_list=item_list) + so = make_sales_order(qo.name, args={"filtered_children": [qo.items[0].name]}) + so.delivery_date = nowdate() + so.submit() + qo.reload() trans_item = json.dumps( [ { @@ -68,10 +82,35 @@ class TestQuotation(IntegrationTestCase): "rate": 5000, "qty": qo.items[0].qty, "docname": qo.items[0].name, - } + }, + { + "item_code": qo.items[1].item_code, + "rate": qo.items[1].rate, + "qty": qo.items[1].qty, + "docname": qo.items[1].name, + }, ] ) self.assertRaises(frappe.ValidationError, update_child_qty_rate, "Quotation", trans_item, qo.name) + trans_item = json.dumps( + [ + { + "item_code": qo.items[0].item_code, + "rate": qo.items[0].rate, + "qty": qo.items[0].qty, + "docname": qo.items[0].name, + }, + { + "item_code": qo.items[1].item_code, + "rate": 50, + "qty": qo.items[1].qty, + "docname": qo.items[1].name, + }, + ] + ) + update_child_qty_rate("Quotation", trans_item, qo.name) + qo.reload() + self.assertEqual(qo.items[1].rate, 50) def test_update_child_removing_item(self): qo = make_quotation(qty=10) @@ -143,6 +182,10 @@ class TestQuotation(IntegrationTestCase): self.assertTrue(quotation.payment_schedule) + @IntegrationTestCase.change_settings( + "Accounts Settings", + {"automatically_fetch_payment_terms": 1}, + ) def test_make_sales_order_terms_copied(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order @@ -285,7 +328,11 @@ class TestQuotation(IntegrationTestCase): @IntegrationTestCase.change_settings( "Accounts Settings", - {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 0}, + { + "add_taxes_from_item_tax_template": 0, + "add_taxes_from_taxes_and_charges_template": 0, + "automatically_fetch_payment_terms": 1, + }, ) def test_make_sales_order_with_terms(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order @@ -323,10 +370,13 @@ class TestQuotation(IntegrationTestCase): sales_order.save() self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.00) - self.assertEqual(sales_order.payment_schedule[0].due_date, getdate(quotation.transaction_date)) + self.assertEqual( + getdate(sales_order.payment_schedule[0].due_date), getdate(quotation.transaction_date) + ) self.assertEqual(sales_order.payment_schedule[1].payment_amount, 8906.00) self.assertEqual( - sales_order.payment_schedule[1].due_date, getdate(add_days(quotation.transaction_date, 30)) + getdate(sales_order.payment_schedule[1].due_date), + getdate(add_days(quotation.transaction_date, 30)), ) def test_valid_till_before_transaction_date(self): @@ -1026,6 +1076,56 @@ class TestQuotation(IntegrationTestCase): quotation.reload() self.assertEqual(quotation.status, "Open") + @IntegrationTestCase.change_settings( + "Accounts Settings", + {"automatically_fetch_payment_terms": 1}, + ) + def test_make_sales_order_with_payment_terms(self): + from erpnext.selling.doctype.quotation.quotation import make_sales_order + + template = frappe.get_doc( + { + "doctype": "Payment Terms Template", + "template_name": "_Test Payment Terms Template for Quotation", + "terms": [ + { + "doctype": "Payment Terms Template Detail", + "invoice_portion": 50.00, + "credit_days_based_on": "Day(s) after invoice date", + "credit_days": 0, + }, + { + "doctype": "Payment Terms Template Detail", + "invoice_portion": 50.00, + "credit_days_based_on": "Day(s) after invoice date", + "credit_days": 10, + }, + ], + } + ).save() + + quotation = make_quotation(qty=10, rate=1000, do_not_submit=1) + quotation.transaction_date = add_days(nowdate(), -2) + quotation.valid_till = add_days(nowdate(), 10) + quotation.update({"payment_terms_template": template.name, "payment_schedule": []}) + quotation.save() + quotation.submit() + + self.assertEqual(quotation.payment_schedule[0].payment_amount, 5000) + self.assertEqual(quotation.payment_schedule[1].payment_amount, 5000) + self.assertEqual(quotation.payment_schedule[0].due_date, quotation.transaction_date) + self.assertEqual(quotation.payment_schedule[1].due_date, add_days(quotation.transaction_date, 10)) + + sales_order = make_sales_order(quotation.name) + sales_order.transaction_date = nowdate() + sales_order.delivery_date = nowdate() + sales_order.save() + + self.assertEqual(sales_order.payment_schedule[0].due_date, sales_order.transaction_date) + self.assertEqual(sales_order.payment_schedule[1].due_date, add_days(sales_order.transaction_date, 10)) + self.assertEqual(sales_order.payment_schedule[0].payment_amount, 5000) + self.assertEqual(sales_order.payment_schedule[1].payment_amount, 5000) + def enable_calculate_bundle_price(enable=1): selling_settings = frappe.get_doc("Selling Settings") diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index c47ce90a865..5ec2418df1f 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -56,6 +56,13 @@ frappe.ui.form.on("Sales Order", { frm.set_df_property("packed_items", "cannot_add_rows", true); frm.set_df_property("packed_items", "cannot_delete_rows", true); }, + delivery_date(frm) { + if (frm.doc.delivery_date) { + frm.doc.items.forEach((d) => { + frappe.model.set_value(d.doctype, d.name, "delivery_date", frm.doc.delivery_date); + }); + } + }, refresh: function (frm) { frm.fields_dict["items"].grid.update_docfield_property( @@ -158,7 +165,7 @@ frappe.ui.form.on("Sales Order", { }); } } - + prevent_past_delivery_dates(frm); // Hide `Reserve Stock` field description in submitted or cancelled Sales Order. if (frm.doc.docstatus > 0) { frm.set_df_property("reserve_stock", "description", null); @@ -238,13 +245,6 @@ frappe.ui.form.on("Sales Order", { ]; }, - delivery_date: function (frm) { - $.each(frm.doc.items || [], function (i, d) { - if (!d.delivery_date) d.delivery_date = frm.doc.delivery_date; - }); - refresh_field("items"); - }, - create_stock_reservation_entries(frm) { const dialog = new frappe.ui.Dialog({ title: __("Stock Reservation"), @@ -1816,3 +1816,11 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex }; extend_cscript(cur_frm.cscript, new erpnext.selling.SalesOrderController({ frm: cur_frm })); + +function prevent_past_delivery_dates(frm) { + if (frm.doc.transaction_date) { + frm.fields_dict["delivery_date"].datepicker?.update({ + minDate: new Date(frm.doc.transaction_date), + }); + } +} diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 1b186352bfa..87816741728 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -123,6 +123,7 @@ "company_contact_person", "payment_schedule_section", "payment_terms_section", + "ignore_default_payment_terms_template", "payment_terms_template", "payment_schedule", "terms_section_break", @@ -1733,6 +1734,14 @@ "fieldtype": "Time", "label": "Time", "mandatory_depends_on": "is_internal_customer" + }, + { + "default": "0", + "fieldname": "ignore_default_payment_terms_template", + "fieldtype": "Check", + "hidden": 1, + "label": "Ignore Default Payment Terms Template", + "read_only": 1 } ], "grid_page_length": 50, @@ -1740,7 +1749,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-02 00:42:18.834823", + "modified": "2026-03-04 18:04:05.873483", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 1759356c63d..5c6f64278af 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -116,6 +116,7 @@ class SalesOrder(SellingController): grand_total: DF.Currency group_same_items: DF.Check has_unit_price_items: DF.Check + ignore_default_payment_terms_template: DF.Check ignore_pricing_rule: DF.Check in_words: DF.Data | None incoterm: DF.Link | None diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 312b882a7df..d98dc8dccc4 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -95,6 +95,7 @@ "ordered_qty", "planned_qty", "production_plan_qty", + "requested_qty", "column_break_69", "work_order_qty", "delivered_qty", @@ -1010,13 +1011,21 @@ "fieldtype": "Float", "label": "Finished Good Qty", "mandatory_depends_on": "eval:parent.is_subcontracted" + }, + { + "fieldname": "requested_qty", + "fieldtype": "Float", + "label": "Requested Qty", + "no_copy": 1, + "print_hide": 1, + "read_only": 1 } ], "grid_page_length": 50, "idx": 1, "istable": 1, "links": [], - "modified": "2026-02-20 16:39:00.200328", + "modified": "2026-02-21 16:39:00.200328", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.py b/erpnext/selling/doctype/sales_order_item/sales_order_item.py index 9128f8a3e41..98298f22036 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.py +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.py @@ -80,6 +80,7 @@ class SalesOrderItem(Document): quotation_item: DF.Data | None rate: DF.Currency rate_with_margin: DF.Currency + requested_qty: DF.Float reserve_stock: DF.Check returned_qty: DF.Float stock_qty: DF.Float diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 53e9d42a7ab..6304a55c7d8 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -329,7 +329,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-12 10:38:34.605126", + "modified": "2026-02-27 00:47:46.003305", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index c7d6b4b7481..ab64635c048 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -166,6 +166,7 @@ "default": "0", "fieldname": "is_group", "fieldtype": "Check", + "in_list_view": 1, "label": "Is Group" }, { @@ -187,7 +188,6 @@ "fieldname": "parent_company", "fieldtype": "Link", "ignore_user_permissions": 1, - "in_list_view": 1, "label": "Parent Company", "options": "Company" }, @@ -245,6 +245,7 @@ "fieldname": "default_currency", "fieldtype": "Link", "ignore_user_permissions": 1, + "in_list_view": 1, "label": "Default Currency", "options": "Currency", "reqd": 1 @@ -468,6 +469,7 @@ "default": "1", "fieldname": "enable_perpetual_inventory", "fieldtype": "Check", + "in_list_view": 1, "label": "Enable Perpetual Inventory" }, { @@ -940,7 +942,6 @@ "description": "Accounting entries are frozen up to this date. Only users with the specified role can create or modify entries before this date.", "fieldname": "accounts_frozen_till_date", "fieldtype": "Date", - "in_list_view": 1, "label": "Accounts Frozen Till Date" }, { @@ -955,7 +956,6 @@ { "fieldname": "role_allowed_for_frozen_entries", "fieldtype": "Link", - "in_list_view": 1, "label": "Roles Allowed to Set and Edit Frozen Account Entries", "options": "Role" }, @@ -970,7 +970,7 @@ "image_field": "company_logo", "is_tree": 1, "links": [], - "modified": "2025-11-16 16:51:27.624096", + "modified": "2026-03-09 17:15:33.819426", "modified_by": "Administrator", "module": "Setup", "name": "Company", diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index 9b4759b360a..1ecbb4b9ac7 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -183,13 +183,11 @@ class Employee(NestedSet): throw(_("Please enter relieving date.")) def validate_for_enabled_user_id(self, enabled): - if self.status != "Active": - return - if enabled is None: frappe.throw(_("User {0} does not exist").format(self.user_id)) - if enabled == 0: - frappe.throw(_("User {0} is disabled").format(self.user_id), EmployeeUserDisabledError) + + if self.status != "Active" and enabled or self.status == "Active" and enabled == 0: + frappe.set_value("User", self.user_id, "enabled", not enabled) def validate_duplicate_user_id(self): Employee = frappe.qb.DocType("Employee") diff --git a/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json b/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json new file mode 100644 index 00000000000..c34f962ffec --- /dev/null +++ b/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json @@ -0,0 +1,47 @@ +{ + "allow_roles": [ + { + "role": "System Manager" + }, + { + "role": "Sales Manager" + }, + { + "role": "Accounts Manager" + }, + { + "role": "Manufacturing Manager" + }, + { + "role": "Stock Manager" + } + ], + "creation": "2026-02-24 18:03:53.158438", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-24 18:07:36.808560", + "modified_by": "Administrator", + "module": "Setup", + "name": "Organization Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Setup Company" + }, + { + "step": "Invite Users" + }, + { + "step": "Setup Email Account" + }, + { + "step": "Setup Role Permissions" + }, + { + "step": "Review System Settings" + } + ], + "title": "Setup Organization" +} diff --git a/erpnext/setup/onboarding_step/invite_users/invite_users.json b/erpnext/setup/onboarding_step/invite_users/invite_users.json new file mode 100644 index 00000000000..3ee88e4d876 --- /dev/null +++ b/erpnext/setup/onboarding_step/invite_users/invite_users.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Invite Users", + "creation": "2026-02-24 18:04:21.585575", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:04:21.585575", + "modified_by": "Administrator", + "name": "Invite Users", + "owner": "Administrator", + "reference_document": "User", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Invite Users", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json b/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json new file mode 100644 index 00000000000..987aeac7c98 --- /dev/null +++ b/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json @@ -0,0 +1,21 @@ +{ + "action": "Update Settings", + "action_label": "Review System Settings", + "creation": "2026-02-24 18:06:56.781335", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-24 18:06:56.781335", + "modified_by": "Administrator", + "name": "Review System Settings", + "owner": "Administrator", + "reference_document": "System Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review System Settings", + "validate_action": 0, + "value_to_validate": "" +} diff --git a/erpnext/setup/onboarding_step/setup_company/setup_company.json b/erpnext/setup/onboarding_step/setup_company/setup_company.json new file mode 100644 index 00000000000..b795c88396d --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_company/setup_company.json @@ -0,0 +1,21 @@ +{ + "action": "Go to Page", + "action_label": "Setup Company", + "creation": "2026-02-20 11:12:50.373049", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 21:10:17.680053", + "modified_by": "Administrator", + "name": "Setup Company", + "owner": "Administrator", + "path": "company", + "reference_document": "Company", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Company", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json b/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json new file mode 100644 index 00000000000..a8b4921a2c5 --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Setup Email Account", + "creation": "2026-02-24 18:04:39.983155", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:04:39.983155", + "modified_by": "Administrator", + "name": "Setup Email Account", + "owner": "Administrator", + "reference_document": "Email Account", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Email Account", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json b/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json new file mode 100644 index 00000000000..e7755a8ade0 --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json @@ -0,0 +1,20 @@ +{ + "action": "Go to Page", + "action_label": "Setup Role Permissions", + "creation": "2026-02-24 18:05:10.485778", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:05:10.485778", + "modified_by": "Administrator", + "name": "Setup Role Permissions", + "owner": "Administrator", + "path": "permission-manager", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Role Permissions", + "validate_action": 1 +} diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 122503027b1..4a4ae55e85c 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -221,6 +221,8 @@ def set_defaults_for_tests(): frappe.db.set_default(key, value) frappe.db.set_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing", 0) + frappe.db.set_single_value("Stock Settings", "enable_serial_and_batch_no_for_item", 1) + def insert_record(records): from frappe.desk.page.setup_wizard.setup_wizard import make_records diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 08a8de10163..479786a122a 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -246,6 +246,7 @@ "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Date", "no_copy": 1, "oldfieldname": "posting_date", @@ -971,6 +972,7 @@ { "fieldname": "per_billed", "fieldtype": "Percent", + "in_list_view": 1, "label": "% Amount Billed", "no_copy": 1, "print_hide": 1, @@ -1061,6 +1063,7 @@ "default": "Draft", "fieldname": "status", "fieldtype": "Select", + "in_list_view": 1, "in_standard_filter": 1, "label": "Status", "no_copy": 1, @@ -1078,7 +1081,6 @@ "depends_on": "eval:!doc.__islocal", "fieldname": "per_installed", "fieldtype": "Percent", - "in_list_view": 1, "label": "% Installed", "no_copy": 1, "oldfieldname": "per_installed", @@ -1212,6 +1214,7 @@ "depends_on": "eval:!doc.__islocal", "fieldname": "per_returned", "fieldtype": "Percent", + "in_list_view": 1, "label": "% Returned", "no_copy": 1, "print_hide": 1, @@ -1449,7 +1452,7 @@ "idx": 146, "is_submittable": 1, "links": [], - "modified": "2026-02-10 14:35:08.523130", + "modified": "2026-03-09 17:15:27.932956", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 6f13428c22b..af59eacd0df 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -84,7 +84,25 @@ frappe.ui.form.on("Item", { } }, + toggle_has_serial_batch_fields(frm) { + let hide_fields = cint(frappe.user_defaults?.enable_serial_and_batch_no_for_item) === 0 ? 1 : 0; + + frm.toggle_display(["serial_no_series", "batch_number_series", "create_new_batch"], !hide_fields); + frm.toggle_enable(["has_serial_no", "has_batch_no"], !hide_fields); + + if (hide_fields) { + let description = __( + "To enable the Serial No and Batch No feature, please check the 'Enable Serial / Batch No for Item' checkbox in Stock Settings." + ); + + frm.set_df_property("has_serial_no", "description", description); + frm.set_df_property("has_batch_no", "description", description); + } + }, + refresh: function (frm) { + frm.trigger("toggle_has_serial_batch_fields"); + if (frm.doc.is_stock_item) { frm.add_custom_button( __("Stock Balance"), diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 820bf4b2730..444c2ec0e66 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -452,6 +452,7 @@ "fieldname": "batch_number_series", "fieldtype": "Data", "label": "Batch Number Series", + "show_description_on_click": 1, "translatable": 1 }, { @@ -493,7 +494,8 @@ "description": "Example: ABCD.#####\nIf series is set and Serial No is not mentioned in transactions, then automatic serial number will be created based on this series. If you always want to explicitly mention Serial Nos for this item. leave this blank.", "fieldname": "serial_no_series", "fieldtype": "Data", - "label": "Serial Number Series" + "label": "Serial Number Series", + "show_description_on_click": 1 }, { "collapsible": 1, @@ -985,7 +987,7 @@ "image_field": "image", "links": [], "make_attachments_public": 1, - "modified": "2026-02-05 17:20:35.605734", + "modified": "2026-03-05 16:29:31.653447", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/material_request/material_request.json b/erpnext/stock/doctype/material_request/material_request.json index 8c9aff89c73..2a455a1437c 100644 --- a/erpnext/stock/doctype/material_request/material_request.json +++ b/erpnext/stock/doctype/material_request/material_request.json @@ -159,6 +159,7 @@ "default": "Today", "fieldname": "transaction_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Transaction Date", "no_copy": 1, "oldfieldname": "transaction_date", @@ -282,7 +283,6 @@ { "fieldname": "set_warehouse", "fieldtype": "Link", - "in_list_view": 1, "label": "Set Target Warehouse", "options": "Warehouse" }, @@ -377,7 +377,7 @@ "idx": 70, "is_submittable": 1, "links": [], - "modified": "2026-01-21 12:48:40.792323", + "modified": "2026-03-09 17:15:30.124509", "modified_by": "Administrator", "module": "Stock", "name": "Material Request", diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 47822ba1dae..15e13561afc 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -90,7 +90,7 @@ class MaterialRequest(BuyingController): { "source_dt": "Material Request Item", "target_dt": "Sales Order Item", - "target_field": "ordered_qty", + "target_field": "requested_qty", "target_parent_dt": "Sales Order", "target_parent_field": "", "join_field": "sales_order_item", @@ -280,6 +280,8 @@ class MaterialRequest(BuyingController): def on_cancel(self): self.update_requested_qty_in_production_plan(cancel=True) self.update_requested_qty() + if self.material_request_type == "Purchase": + self.update_prevdoc_status() def get_mr_items_ordered_qty(self, mr_items): mr_items_ordered_qty = {} diff --git a/erpnext/stock/doctype/pick_list/pick_list.js b/erpnext/stock/doctype/pick_list/pick_list.js index 6e95243eb24..d1386c183e3 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.js +++ b/erpnext/stock/doctype/pick_list/pick_list.js @@ -119,6 +119,8 @@ frappe.ui.form.on("Pick List", { refresh: (frm) => { frm.trigger("add_get_items_button"); frm.trigger("update_warehouse_property"); + erpnext.toggle_serial_batch_fields(frm); + if (frm.doc.docstatus === 1) { const status_completed = frm.doc.status === "Completed"; diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index e13837b5f10..805b7eef9e6 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -938,6 +938,7 @@ { "fieldname": "per_billed", "fieldtype": "Percent", + "in_list_view": 1, "label": "% Amount Billed", "no_copy": 1, "print_hide": 1, @@ -1302,7 +1303,7 @@ "idx": 261, "is_submittable": 1, "links": [], - "modified": "2026-02-23 16:56:41.075091", + "modified": "2026-03-09 17:15:28.602690", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index ba332231951..c987a364ade 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -107,6 +107,7 @@ class SerialandBatchBundle(Document): self.autoname() def validate(self): + self.validate_allow_to_set_serial_batch() if self.docstatus == 1 and self.voucher_detail_no: self.validate_voucher_detail_no() @@ -143,6 +144,15 @@ class SerialandBatchBundle(Document): self.calculate_qty_and_amount() self.set_child_details() + def validate_allow_to_set_serial_batch(self): + if not frappe.db.get_single_value("Stock Settings", "enable_serial_and_batch_no_for_item"): + frappe.throw( + _( + "Please check the 'Enable Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." + ).format(get_link_to_form("Stock Settings", "Stock Settings")), + title=_("Serial and Batch No for Item Disabled"), + ) + def validate_serial_no_status(self): serial_nos = [d.serial_no for d in self.entries if d.serial_no] invalid_serial_nos = frappe.get_all( diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 94b396e996a..3bdb5fb3596 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -245,6 +245,7 @@ frappe.ui.form.on("Stock Entry", { refresh: function (frm) { frm.trigger("get_items_from_transit_entry"); frm.trigger("toggle_warehouse_fields"); + erpnext.toggle_serial_batch_fields(frm); if (!frm.doc.docstatus && !frm.doc.subcontracting_inward_order) { frm.trigger("validate_purpose_consumption"); @@ -930,10 +931,6 @@ frappe.ui.form.on("Stock Entry Detail", { ); }, - qty(frm, cdt, cdn) { - frm.events.set_rate_and_fg_qty(frm, cdt, cdn); - }, - conversion_factor(frm, cdt, cdn) { frm.events.set_rate_and_fg_qty(frm, cdt, cdn); }, diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js index 450bc01a67c..ef4672899cc 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -76,6 +76,8 @@ frappe.ui.form.on("Stock Reconciliation", { }, refresh: function (frm) { + erpnext.toggle_serial_batch_fields(frm); + if (frm.doc.docstatus < 1) { frm.add_custom_button(__("Fetch Items from Warehouse"), function () { frm.events.get_items(frm); diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index e2c55c3b8e3..ba195104564 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -38,6 +38,7 @@ "allow_internal_transfer_at_arms_length_price", "validate_material_transfer_warehouses", "serial_and_batch_item_settings_tab", + "enable_serial_and_batch_no_for_item", "section_break_7", "allow_existing_serial_no", "do_not_use_batchwise_valuation", @@ -48,9 +49,8 @@ "use_serial_batch_fields", "do_not_update_serial_batch_on_creation_of_auto_bundle", "allow_negative_stock_for_batch", - "serial_and_batch_bundle_section", - "set_serial_and_batch_bundle_naming_based_on_naming_series", "section_break_gnhq", + "set_serial_and_batch_bundle_naming_based_on_naming_series", "use_naming_series", "column_break_wslv", "naming_series_prefix", @@ -158,6 +158,7 @@ "label": "Convert Item Description to Clean HTML in Transactions" }, { + "depends_on": "enable_serial_and_batch_no_for_item", "fieldname": "section_break_7", "fieldtype": "Section Break", "label": "Serial & Batch Item Settings" @@ -487,11 +488,6 @@ "fieldtype": "Check", "label": "Auto Reserve Stock" }, - { - "fieldname": "serial_and_batch_bundle_section", - "fieldtype": "Section Break", - "label": "Serial and Batch Bundle" - }, { "default": "0", "fieldname": "set_serial_and_batch_bundle_naming_based_on_naming_series", @@ -499,6 +495,7 @@ "label": "Set Serial and Batch Bundle Naming Based on Naming Series" }, { + "depends_on": "enable_serial_and_batch_no_for_item", "fieldname": "section_break_gnhq", "fieldtype": "Section Break" }, @@ -554,6 +551,11 @@ "fieldname": "allow_negative_stock_for_batch", "fieldtype": "Check", "label": "Allow Negative Stock for Batch" + }, + { + "fieldname": "enable_serial_and_batch_no_for_item", + "fieldtype": "Check", + "label": "Enable Serial / Batch No for Item" } ], "hide_toolbar": 1, @@ -562,7 +564,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-25 09:56:34.105949", + "modified": "2026-02-25 10:56:34.105949", "modified_by": "Administrator", "module": "Stock", "name": "Stock Settings", diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py index 2ab8c93bcb7..8ec3e9865d9 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -47,6 +47,7 @@ class StockSettings(Document): disable_serial_no_and_batch_selector: DF.Check do_not_update_serial_batch_on_creation_of_auto_bundle: DF.Check do_not_use_batchwise_valuation: DF.Check + enable_serial_and_batch_no_for_item: DF.Check enable_stock_reservation: DF.Check item_group: DF.Link | None item_naming_by: DF.Literal["Item Code", "Naming Series"] @@ -82,6 +83,7 @@ class StockSettings(Document): "default_warehouse", "set_qty_in_transactions_based_on_serial_no_input", "use_serial_batch_fields", + "enable_serial_and_batch_no_for_item", "set_serial_and_batch_bundle_naming_based_on_naming_series", ]: frappe.db.set_default(key, self.get(key, "")) @@ -104,6 +106,7 @@ class StockSettings(Document): ) self.validate_warehouses() + self.validate_serial_and_batch_no_settings() self.cant_change_valuation_method() self.validate_clean_description_html() self.validate_pending_reposts() @@ -112,6 +115,25 @@ class StockSettings(Document): self.change_precision_for_for_sales() self.change_precision_for_purchase() + def validate_serial_and_batch_no_settings(self): + doc_before_save = self.get_doc_before_save() + if not doc_before_save: + return + + if doc_before_save.enable_serial_and_batch_no_for_item == self.enable_serial_and_batch_no_for_item: + return + + if ( + doc_before_save.enable_serial_and_batch_no_for_item + and not self.enable_serial_and_batch_no_for_item + ): + if frappe.get_all("Serial and Batch Bundle", filters={"docstatus": 1}, limit=1, pluck="name"): + frappe.throw( + _( + "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." + ) + ) + def validate_warehouses(self): warehouse_fields = ["default_warehouse", "sample_retention_warehouse"] for field in warehouse_fields: diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 7fc143e38d4..5cfdd776240 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -352,7 +352,7 @@ class SerialBatchBundle: "Serial and Batch Entry", {"parent": self.sle.serial_and_batch_bundle, "docstatus": 0} ) > 0 - ): + ) and not self.sle.is_cancelled: frappe.throw( _("Serial and Batch Bundle {0} is not submitted").format( bold(self.sle.serial_and_batch_bundle) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js index 4e502793068..3339cff689c 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js @@ -30,6 +30,7 @@ frappe.ui.form.on("Subcontracting Receipt", { refresh: (frm) => { frappe.dynamic_link = { doc: frm.doc, fieldname: "supplier", doctype: "Supplier" }; + erpnext.toggle_serial_batch_fields(frm); if (frm.doc.docstatus === 1) { frm.add_custom_button( __("Stock Ledger"), diff --git a/erpnext/templates/pages/help.html b/erpnext/templates/pages/help.html index 1cfe358efd6..726d5e1b881 100644 --- a/erpnext/templates/pages/help.html +++ b/erpnext/templates/pages/help.html @@ -8,7 +8,7 @@
diff --git a/erpnext/workspace_sidebar/organization.json b/erpnext/workspace_sidebar/organization.json new file mode 100644 index 00000000000..8ea0a44faca --- /dev/null +++ b/erpnext/workspace_sidebar/organization.json @@ -0,0 +1,102 @@ +{ + "app": "erpnext", + "creation": "2026-02-24 17:39:43.793115", + "docstatus": 0, + "doctype": "Workspace Sidebar", + "header_icon": "organization", + "idx": 1, + "items": [ + { + "child": 0, + "collapsible": 1, + "icon": "organization", + "indent": 0, + "keep_closed": 0, + "label": "Company", + "link_to": "Company", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "book-text", + "indent": 0, + "keep_closed": 0, + "label": "Letter Head", + "link_to": "Letter Head", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "file-user", + "indent": 0, + "keep_closed": 0, + "label": "Department", + "link_to": "Department", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "book-user", + "indent": 0, + "keep_closed": 0, + "label": "Branch", + "link_to": "Branch", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "users", + "indent": 0, + "keep_closed": 0, + "label": "User", + "link_to": "User", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "user-round-check", + "indent": 0, + "keep_closed": 0, + "label": "Role Permissions", + "link_to": "permission-manager", + "link_type": "Page", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "mail", + "indent": 0, + "keep_closed": 0, + "label": "Email Account", + "link_to": "Email Account", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + } + ], + "modified": "2026-02-24 18:08:00.796746", + "modified_by": "Administrator", + "module": "Setup", + "module_onboarding": "Organization Onboarding", + "name": "Organization", + "owner": "Administrator", + "standard": 1, + "title": "Organization" +}