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