From 243312985030dc515e6fedf7b253af08f3c55b06 Mon Sep 17 00:00:00 2001 From: Mohsin Akhtar <167299936+akhtarmohsin@users.noreply.github.com> Date: Sun, 21 Jun 2026 16:10:43 +0530 Subject: [PATCH 001/400] fix: show only template items in Variant Of filter --- erpnext/stock/doctype/item/item.json | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index 8a458e8ea04..62561f19945 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -170,6 +170,7 @@ "ignore_user_permissions": 1, "in_standard_filter": 1, "label": "Variant Of", + "link_filters": "[[\"Item\",\"has_variants\",\"=\",1]]", "options": "Item", "read_only": 1, "search_index": 1, From ac8b3f18c79efb3056c5442118a13e12bd383edb Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 22 Jun 2026 14:13:18 +0530 Subject: [PATCH 002/400] test: add purchase-side Payment Entry allocation coverage - pay multiple purchase invoices with a single Payment Entry - unallocated (advance) amount when a supplier payment is overpaid - allocating more than a purchase invoice's outstanding amount is rejected --- .../payment_entry/test_payment_entry.py | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index c8e096e65ac..a24b8fad1bf 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -246,6 +246,47 @@ class TestPaymentEntry(ERPNextTestSuite): outstanding_amount = flt(frappe.db.get_value("Sales Invoice", pi.name, "outstanding_amount")) self.assertEqual(outstanding_amount, 0) + def test_pay_multiple_purchase_invoices_in_one_entry(self): + pi1 = make_purchase_invoice() # outstanding 250 + pi2 = make_purchase_invoice() # outstanding 250 + + pe = get_payment_entry("Purchase Invoice", pi1.name, bank_account="_Test Cash - _TC") + pe.append( + "references", + { + "reference_doctype": "Purchase Invoice", + "reference_name": pi2.name, + "total_amount": pi2.grand_total, + "outstanding_amount": pi2.outstanding_amount, + "allocated_amount": pi2.outstanding_amount, + }, + ) + pe.paid_amount = pe.references[0].allocated_amount + pe.references[1].allocated_amount + pe.insert() + pe.submit() + + self.assertEqual(pe.total_allocated_amount, 500) + self.assertEqual(frappe.db.get_value("Purchase Invoice", pi1.name, "outstanding_amount"), 0) + self.assertEqual(frappe.db.get_value("Purchase Invoice", pi2.name, "outstanding_amount"), 0) + + def test_unallocated_amount_on_overpaid_purchase_payment(self): + pi = make_purchase_invoice() # outstanding 250 + + pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Cash - _TC") + pe.paid_amount = pe.references[0].allocated_amount + 200 # overpay -> 200 advance + pe.received_amount = pe.paid_amount + pe.insert() + + self.assertEqual(pe.unallocated_amount, 200) + + def test_overallocation_against_purchase_invoice_throws(self): + pi = make_purchase_invoice() # outstanding 250 + + pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Cash - _TC") + pe.references[0].allocated_amount += 100 # 350 > 250 outstanding + pe.paid_amount = pe.references[0].allocated_amount + self.assertRaises(frappe.ValidationError, pe.insert) + def test_payment_against_sales_invoice_to_check_status(self): si = create_sales_invoice( customer="_Test Customer USD", From 2bf9fcb81718f882f33893d53b1bf6019f3a90fd Mon Sep 17 00:00:00 2001 From: Raghav Ruia Date: Wed, 24 Jun 2026 16:06:30 +0530 Subject: [PATCH 003/400] feat: confirmation dialog when enabling negative stock on Item Co-Authored-By: Claude Opus 4.8 --- erpnext/stock/doctype/item/item.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index ed6d4efe43d..d4cd4b61f6a 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -54,6 +54,28 @@ frappe.ui.form.on("Item", { } }, + allow_negative_stock(frm) { + if (!frm.doc.allow_negative_stock) { + return; + } + + let msg = __( + "Using negative stock disables FIFO/Moving average valuation when inventory is negative." + ); + msg += " "; + msg += __("This is considered dangerous from accounting point of view."); + msg += "
"; + msg += __("Do you still want to enable negative inventory?"); + + frappe.confirm( + msg, + () => {}, + () => { + frm.set_value("allow_negative_stock", 0); + } + ); + }, + setup: function (frm) { frm.add_fetch("attribute", "numeric_values", "numeric_values"); frm.add_fetch("attribute", "from_range", "from_range"); From ecb6d48ec025e0c94abac35b2e4f7607f4c86465 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Thu, 25 Jun 2026 14:48:02 +0530 Subject: [PATCH 004/400] fix: restrict jinja globals in process statement of accounts templates --- .../process_statement_of_accounts.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py index a2dc1d62836..e5eacdc83e4 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py @@ -100,9 +100,9 @@ class ProcessStatementOfAccounts(Document): if not self.pdf_name: self.pdf_name = "{{ customer.customer_name }}" - validate_template(self.subject) - validate_template(self.body) - validate_template(self.pdf_name) + validate_template(self.subject, restrict_globals=True) + validate_template(self.body, restrict_globals=True) + validate_template(self.pdf_name, restrict_globals=True) if not self.customers: frappe.throw(_("Customers not selected.")) @@ -421,7 +421,6 @@ def get_context(customer, doc): return { "doc": template_doc, "customer": frappe.get_doc("Customer", customer), - "frappe": frappe.utils, } @@ -532,15 +531,15 @@ def send_emails(document_name: str, from_scheduler: bool = False, posting_date: if report: for customer, report_pdf in report.items(): context = get_context(customer, doc) - filename = frappe.render_template(doc.pdf_name, context) + filename = frappe.render_template(doc.pdf_name, context, restrict_globals=True) attachments = [{"fname": filename + ".pdf", "fcontent": report_pdf}] recipients, cc = get_recipients_and_cc(customer, doc) if not recipients: continue - subject = frappe.render_template(doc.subject, context) - message = frappe.render_template(doc.body, context) + subject = frappe.render_template(doc.subject, context, restrict_globals=True) + message = frappe.render_template(doc.body, context, restrict_globals=True) if doc.sender: sender_email = frappe.db.get_value("Email Account", doc.sender, "email_id") From 69d5d2bbc169c779681f7dcbe2c4d80a3a821667 Mon Sep 17 00:00:00 2001 From: Raghav Ruia Date: Fri, 26 Jun 2026 09:38:23 +0530 Subject: [PATCH 005/400] refactor: extract negative stock confirmation into shared util Deduplicate the identical confirmation dialog used by Item and Stock Settings into erpnext.utils.confirm_negative_stock, and collapse the message into a single translatable string. Co-Authored-By: Claude Opus 4.8 --- erpnext/public/js/utils.js | 12 +++++++++++ erpnext/stock/doctype/item/item.js | 20 +------------------ .../doctype/stock_settings/stock_settings.js | 20 +------------------ 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 51637316446..acaf7fb056e 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -562,6 +562,18 @@ $.extend(erpnext.utils, { }, }); +erpnext.utils.confirm_negative_stock = function (frm) { + if (!frm.doc.allow_negative_stock) return; + + frappe.confirm( + __( + "Using negative stock disables FIFO/Moving average valuation when inventory is negative. This is considered dangerous from accounting point of view.
Do you still want to enable negative inventory?" + ), + () => {}, + () => frm.set_value("allow_negative_stock", 0) + ); +}; + erpnext.utils.select_alternate_items = function (opts) { const frm = opts.frm; const warehouse_field = opts.warehouse_field || "warehouse"; diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index d4cd4b61f6a..3bc7499aaee 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -55,25 +55,7 @@ frappe.ui.form.on("Item", { }, allow_negative_stock(frm) { - if (!frm.doc.allow_negative_stock) { - return; - } - - let msg = __( - "Using negative stock disables FIFO/Moving average valuation when inventory is negative." - ); - msg += " "; - msg += __("This is considered dangerous from accounting point of view."); - msg += "
"; - msg += __("Do you still want to enable negative inventory?"); - - frappe.confirm( - msg, - () => {}, - () => { - frm.set_value("allow_negative_stock", 0); - } - ); + erpnext.utils.confirm_negative_stock(frm); }, setup: function (frm) { diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.js b/erpnext/stock/doctype/stock_settings/stock_settings.js index 3d70c199d05..db0c7bb337c 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.js +++ b/erpnext/stock/doctype/stock_settings/stock_settings.js @@ -96,25 +96,7 @@ frappe.ui.form.on("Stock Settings", { }, allow_negative_stock: function (frm) { - if (!frm.doc.allow_negative_stock) { - return; - } - - let msg = __( - "Using negative stock disables FIFO/Moving average valuation when inventory is negative." - ); - msg += " "; - msg += __("This is considered dangerous from accounting point of view."); - msg += "
"; - msg += __("Do you still want to enable negative inventory?"); - - frappe.confirm( - msg, - () => {}, - () => { - frm.set_value("allow_negative_stock", 0); - } - ); + erpnext.utils.confirm_negative_stock(frm); }, auto_insert_price_list_rate_if_missing(frm) { if (!frm.doc.auto_insert_price_list_rate_if_missing) return; From 07f641c48cd2c4d61c5106081b3769b8c82687cc Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Mon, 29 Jun 2026 21:48:38 +0530 Subject: [PATCH 006/400] fix(journal-entry): fetch outstanding on foreign currency --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 3b6cb7920b9..4bdda749795 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -2525,9 +2525,7 @@ def get_reference_details( exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date) else: exchange_rate = 1 - outstanding_amount, total_amount = get_outstanding_on_journal_entry( - reference_name, party_type, party - ) + outstanding_amount, total_amount = get_outstanding_on_journal_entry(reference_name, party_type, party) elif reference_doctype == "Payment Entry": if reverse_payment_details := frappe.db.get_all( From 2a1461c754d3b9a8301d4345d02ed8654432bc3f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 21:08:05 +0530 Subject: [PATCH 007/400] test: add coverage for Bank Clearance Summary report --- .../test_bank_clearance_summary.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py diff --git a/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py new file mode 100644 index 00000000000..c7781269f86 --- /dev/null +++ b/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py @@ -0,0 +1,60 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.accounts.report.bank_clearance_summary.bank_clearance_summary import execute +from erpnext.tests.utils import ERPNextTestSuite + +BANK_ACCOUNT = "_Test Bank - _TC" + + +class TestBankClearanceSummary(ERPNextTestSuite): + def run_report(self, **extra): + filters = frappe._dict( + { + "account": BANK_ACCOUNT, + "company": "_Test Company", + "from_date": "2026-01-01", + "to_date": "2026-12-31", + } + ) + filters.update(extra) + return execute(filters)[1] + + def find_row(self, data, payment_entry): + for row in data: + if row[1] == payment_entry: + return row + return None + + def test_uncleared_then_cleared_journal_entry(self): + je = make_journal_entry(BANK_ACCOUNT, "Sales - _TC", 5000, submit=True, posting_date="2026-06-01") + + # Uncleared: the bank row appears with the debit amount and no clearance date + row = self.find_row(self.run_report(), je.name) + self.assertIsNotNone(row, "Journal Entry not listed in Bank Clearance Summary") + self.assertEqual(row[0], "Journal Entry") + self.assertEqual(frappe.utils.getdate(row[2]), frappe.utils.getdate("2026-06-01")) + self.assertEqual(row[4], None) # clearance_date empty -> uncleared + self.assertEqual(row[5], "Sales - _TC") # against account + self.assertEqual(row[6], 5000) # debit - credit on the bank account + + # Cleared: set the clearance date on the Journal Entry and re-run + frappe.db.set_value("Journal Entry", je.name, "clearance_date", "2026-06-05") + + row = self.find_row(self.run_report(), je.name) + self.assertIsNotNone(row) + self.assertEqual(frappe.utils.getdate(row[4]), frappe.utils.getdate("2026-06-05")) + self.assertEqual(row[6], 5000) + + def test_date_filter_excludes_out_of_range_entries(self): + je = make_journal_entry(BANK_ACCOUNT, "Sales - _TC", 3000, submit=True, posting_date="2026-06-10") + + # Within range: present + self.assertIsNotNone(self.find_row(self.run_report(), je.name)) + + # Narrow window after the posting date: excluded + data = self.run_report(from_date="2026-07-01", to_date="2026-12-31") + self.assertIsNone(self.find_row(data, je.name)) From 8e560f1d1c70d92ce656c6ce1db3e422a3f15664 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 21:13:12 +0530 Subject: [PATCH 008/400] test: add coverage for Share Ledger report --- .../report/share_ledger/test_share_ledger.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 erpnext/accounts/report/share_ledger/test_share_ledger.py diff --git a/erpnext/accounts/report/share_ledger/test_share_ledger.py b/erpnext/accounts/report/share_ledger/test_share_ledger.py new file mode 100644 index 00000000000..f7a96c06dae --- /dev/null +++ b/erpnext/accounts/report/share_ledger/test_share_ledger.py @@ -0,0 +1,98 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.accounts.report.share_ledger.share_ledger import execute +from erpnext.tests.utils import ERPNextTestSuite + +COMPANY = "_Test Company" + + +class TestShareLedger(ERPNextTestSuite): + def setUp(self): + self.shareholder = self.create_shareholder("_Test Share Ledger Holder") + # Issue 100 shares on 2026-06-01, then another 50 on 2026-06-10. + self.first = self.issue_shares(date="2026-06-01", from_no=1, to_no=100, rate=10) + self.second = self.issue_shares(date="2026-06-10", from_no=101, to_no=150, rate=12) + + def test_ledger_lists_all_transfers_upto_date(self): + data = self.run_report(shareholder=self.shareholder, date="2026-06-30") + + self.assertEqual(len(data), 2) + + first_row, second_row = data + self.assertEqual(first_row[0], self.shareholder) + self.assertEqual(first_row[1], frappe.utils.getdate("2026-06-01")) + self.assertEqual(first_row[2], "Issue") + self.assertEqual(first_row[3], "Equity") + self.assertEqual(first_row[4], 100) + self.assertEqual(first_row[5], 10) + self.assertEqual(first_row[6], 1000) + self.assertEqual(first_row[7], COMPANY) + self.assertEqual(first_row[8], self.first) + + self.assertEqual(second_row[1], frappe.utils.getdate("2026-06-10")) + self.assertEqual(second_row[4], 50) + self.assertEqual(second_row[5], 12) + self.assertEqual(second_row[6], 600) + self.assertEqual(second_row[8], self.second) + + def test_running_balance_of_shares(self): + data = self.run_report(shareholder=self.shareholder, date="2026-06-30") + + running = 0 + balances = [] + for row in data: + running += row[4] + balances.append(running) + + self.assertEqual(balances, [100, 150]) + + def test_as_on_date_between_transfers_shows_only_first(self): + data = self.run_report(shareholder=self.shareholder, date="2026-06-05") + + self.assertEqual(len(data), 1) + self.assertEqual(data[0][8], self.first) + self.assertEqual(data[0][4], 100) + + def test_missing_date_throws(self): + self.assertRaises(frappe.ValidationError, execute, frappe._dict(shareholder=self.shareholder)) + + def test_missing_shareholder_returns_no_rows(self): + data = self.run_report(date="2026-06-30") + self.assertEqual(data, []) + + def run_report(self, **extra): + filters = frappe._dict({"company": COMPANY, **extra}) + return execute(filters)[1] + + def create_shareholder(self, title): + doc = frappe.get_doc( + { + "doctype": "Shareholder", + "title": title, + "company": COMPANY, + } + ).insert() + return doc.name + + def issue_shares(self, date, from_no, to_no, rate): + doc = frappe.get_doc( + { + "doctype": "Share Transfer", + "transfer_type": "Issue", + "date": date, + "to_shareholder": self.shareholder, + "share_type": "Equity", + "from_no": from_no, + "to_no": to_no, + "no_of_shares": to_no - from_no + 1, + "rate": rate, + "company": COMPANY, + "asset_account": "Cash - _TC", + "equity_or_liability_account": "Creditors - _TC", + } + ) + doc.submit() + return doc.name From 2c3285286c4976ed2f60bfbfb654ba57d31c2e84 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 21:13:21 +0530 Subject: [PATCH 009/400] test: add coverage for Consolidated Financial Statement report --- .../test_consolidated_financial_statement.py | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py diff --git a/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py new file mode 100644 index 00000000000..c928a82887e --- /dev/null +++ b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py @@ -0,0 +1,116 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt, today + +from erpnext.accounts.report.consolidated_financial_statement.consolidated_financial_statement import ( + execute, +) +from erpnext.accounts.utils import get_fiscal_year +from erpnext.tests.utils import ERPNextTestSuite + +PARENT_COMPANY = "Parent Group Company India" +CHILD_COMPANY = "Child Company India" + + +class TestConsolidatedFinancialStatement(ERPNextTestSuite): + """Consolidation is exercised via the bootstrap group of companies + (`Parent Group Company India` with child `Child Company India`). Income and + expense posted in the child company must surface in the report that is run + for the parent (group) company.""" + + def setUp(self): + self.fiscal_year = get_fiscal_year(today(), company=PARENT_COMPANY)[0] + + def run_report(self, **extra): + filters = frappe._dict( + { + "company": PARENT_COMPANY, + "filter_based_on": "Fiscal Year", + "from_fiscal_year": self.fiscal_year, + "to_fiscal_year": self.fiscal_year, + "periodicity": "Yearly", + "include_default_book_entries": 1, + } + ) + filters.update(extra) + return execute(filters)[1] + + def post_journal_entry(self, debit_account, credit_account, amount): + je = frappe.new_doc("Journal Entry") + je.posting_date = today() + je.company = CHILD_COMPANY + je.set( + "accounts", + [ + {"account": debit_account, "debit_in_account_currency": amount}, + {"account": credit_account, "credit_in_account_currency": amount}, + ], + ) + je.save() + je.submit() + return je + + def get_row(self, data, account_name_fragment): + for row in data: + if account_name_fragment in str(row.get("account_name") or ""): + return row + return None + + def test_profit_and_loss_reflects_child_company_income(self): + amount = 7000 + self.post_journal_entry("Cash - CCI", "Sales - CCI", amount) + + data = self.run_report(report="Profit and Loss Statement", accumulated_in_group_company=0) + + self.assertTrue(data, "Report returned no rows") + + # child's Sales account is mapped onto the parent chart (Sales - PGCI) + sales_row = self.get_row(data, "Sales") + self.assertIsNotNone(sales_row, "Sales row missing from consolidated P&L") + self.assertEqual(flt(sales_row.get(CHILD_COMPANY)), amount) + + total_income_row = self.get_row(data, "Total Income (Credit)") + self.assertIsNotNone(total_income_row, "Total Income row missing") + self.assertGreaterEqual(flt(total_income_row.get("total")), amount) + + def test_profit_and_loss_reflects_child_company_expense(self): + amount = 3000 + self.post_journal_entry("Marketing Expenses - CCI", "Cash - CCI", amount) + + data = self.run_report(report="Profit and Loss Statement", accumulated_in_group_company=0) + + expense_row = self.get_row(data, "Marketing Expenses") + self.assertIsNotNone(expense_row, "Marketing Expenses row missing from consolidated P&L") + self.assertEqual(flt(expense_row.get(CHILD_COMPANY)), amount) + + total_expense_row = self.get_row(data, "Total Expense (Debit)") + self.assertIsNotNone(total_expense_row, "Total Expense row missing") + self.assertGreaterEqual(flt(total_expense_row.get("total")), amount) + + def test_accumulated_in_group_company_rolls_up_to_parent(self): + """With `accumulated_in_group_company`, the child's amount is also + accumulated into the parent company column.""" + amount = 5000 + self.post_journal_entry("Cash - CCI", "Sales - CCI", amount) + + data = self.run_report(report="Profit and Loss Statement", accumulated_in_group_company=1) + + sales_row = self.get_row(data, "Sales") + self.assertIsNotNone(sales_row) + self.assertEqual(flt(sales_row.get(CHILD_COMPANY)), amount) + # parent column picks up the child value when accumulated + self.assertEqual(flt(sales_row.get(PARENT_COMPANY)), amount) + + def test_balance_sheet_executes_and_returns_rows(self): + # posting income leaves a balancing entry in the child's Cash (Asset) account + amount = 4000 + self.post_journal_entry("Cash - CCI", "Sales - CCI", amount) + + data = self.run_report(report="Balance Sheet", accumulated_in_group_company=0) + + self.assertTrue(data, "Balance Sheet returned no rows") + cash_row = self.get_row(data, "Cash") + self.assertIsNotNone(cash_row, "Cash asset row missing from consolidated Balance Sheet") + self.assertGreaterEqual(flt(cash_row.get(CHILD_COMPANY)), amount) From 0e8b152c680fd9db0663f60057ecb5af59c30bef Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 21:26:04 +0530 Subject: [PATCH 010/400] fix: avoid double-counting the total in accumulated Consolidated Financial Statement --- .../consolidated_financial_statement.py | 7 ++++++- .../test_consolidated_financial_statement.py | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py index fba7054e0a7..237f37e767f 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -582,7 +582,12 @@ def prepare_data(accounts, start_date, end_date, balance_must_be, companies, com total += flt(row[company]) row["has_value"] = has_value - row["total"] = total + # when accumulating into the group company, that company's column already consolidates its + # descendants, so summing every company column would double-count; use the group total directly. + if filters.get("accumulated_in_group_company"): + row["total"] = flt(row.get(filters.company, 0.0), 3) + else: + row["total"] = total data.append(row) diff --git a/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py index c928a82887e..202c495d378 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py @@ -102,6 +102,8 @@ class TestConsolidatedFinancialStatement(ERPNextTestSuite): self.assertEqual(flt(sales_row.get(CHILD_COMPANY)), amount) # parent column picks up the child value when accumulated self.assertEqual(flt(sales_row.get(PARENT_COMPANY)), amount) + # the total must equal the consolidated (group) value, not the sum of parent + child columns + self.assertEqual(flt(sales_row.get("total")), amount) def test_balance_sheet_executes_and_returns_rows(self): # posting income leaves a balancing entry in the child's Cash (Asset) account From 4f3dcd9e3972e44e089c3e55e3a2ceb023cf5615 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:48:27 +0530 Subject: [PATCH 011/400] test: add coverage for Job Card Summary report --- .../job_card_summary/test_job_card_summary.py | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py diff --git a/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py b/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py new file mode 100644 index 00000000000..81af722ad50 --- /dev/null +++ b/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py @@ -0,0 +1,76 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + + +import frappe +from frappe.utils import add_days, today + +from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record +from erpnext.manufacturing.report.job_card_summary.job_card_summary import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestJobCardSummary(ERPNextTestSuite): + def setUp(self): + # `_Test FG Item 2` has a default active BOM with operations, so submitting a + # Work Order for it auto-creates Job Cards (one per operation). + self.work_order = make_wo_order_test_record(item="_Test FG Item 2", qty=2) + self.job_cards = frappe.get_all( + "Job Card", + filters={"work_order": self.work_order.name}, + fields=["name", "operation", "workstation", "production_item", "status"], + ) + + def run_report(self, **extra): + filters = frappe._dict( + { + "company": "_Test Company", + "from_date": add_days(today(), -1), + "to_date": add_days(today(), 1), + } + ) + filters.update(extra) + return execute(filters)[1] + + def rows_for_work_order(self, rows): + return [row for row in rows if row.get("work_order") == self.work_order.name] + + def test_job_cards_are_listed(self): + self.assertTrue(self.job_cards, "Work Order did not produce any Job Cards") + + rows = self.rows_for_work_order(self.run_report()) + self.assertEqual(len(rows), len(self.job_cards)) + + reported_names = {row.get("name") for row in rows} + self.assertEqual(reported_names, {jc.name for jc in self.job_cards}) + + # Fresh (unsubmitted) job cards are reported as Open, and each row carries the + # operation / workstation / production item pulled from the Job Card. + for jc in self.job_cards: + row = next(row for row in rows if row.get("name") == jc.name) + self.assertEqual(row.get("status"), "Open") + self.assertEqual(row.get("operation"), jc.operation) + self.assertEqual(row.get("workstation"), jc.workstation) + self.assertEqual(row.get("production_item"), jc.production_item) + + def test_operation_filter_scopes_rows(self): + operation = self.job_cards[0].operation + matching = {jc.name for jc in self.job_cards if jc.operation == operation} + + rows = self.rows_for_work_order(self.run_report(operation=operation)) + self.assertEqual({row.get("name") for row in rows}, matching) + + def test_status_filter(self): + open_rows = self.rows_for_work_order(self.run_report(status="Open")) + self.assertEqual({row.get("name") for row in open_rows}, {jc.name for jc in self.job_cards}) + + # None of the freshly created job cards are Completed yet. + completed_rows = self.rows_for_work_order(self.run_report(status="Completed")) + self.assertEqual(completed_rows, []) + + def test_date_filter_excludes_out_of_range(self): + # Job Card posting_date defaults to today; a past-only window should exclude them. + rows = self.rows_for_work_order( + self.run_report(from_date=add_days(today(), -10), to_date=add_days(today(), -5)) + ) + self.assertEqual(rows, []) From baae9bfb2250367f5642ca4a966aa6d1fae054eb Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:48:35 +0530 Subject: [PATCH 012/400] test: add coverage for Production Analytics report --- .../test_production_analytics.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 erpnext/manufacturing/report/production_analytics/test_production_analytics.py diff --git a/erpnext/manufacturing/report/production_analytics/test_production_analytics.py b/erpnext/manufacturing/report/production_analytics/test_production_analytics.py new file mode 100644 index 00000000000..17a26ef06bd --- /dev/null +++ b/erpnext/manufacturing/report/production_analytics/test_production_analytics.py @@ -0,0 +1,60 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import get_first_day, get_last_day, today + +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProductionAnalytics(ERPNextTestSuite): + def run_report(self, **extra): + from erpnext.manufacturing.report.production_analytics.production_analytics import execute + + filters = frappe._dict( + { + "company": "_Test Company", + "from_date": get_first_day(today()), + "to_date": get_last_day(today()), + "range": "Monthly", + } + ) + filters.update(extra) + columns, data, _msg, _chart = execute(filters) + return columns, data + + def get_period_count(self, columns, data, status, period_label): + """Return the count for a status row under the period column resolved by label.""" + period_fieldname = next(col["fieldname"] for col in columns if col.get("label") == period_label) + row = next(row for row in data if row["status"] == status) + return row[period_fieldname] + + def test_submitted_work_order_increments_status_count(self): + from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record + + # The current month is the period a newly created Work Order falls into (bucketed by creation date). + cols_before, data_before = self.run_report() + period_label = cols_before[-1]["label"] + before = self.get_period_count(cols_before, data_before, "Not Started", period_label) + + wo = make_wo_order_test_record(production_item="_Test FG Item", qty=10, company="_Test Company") + self.assertEqual(wo.docstatus, 1) + # A freshly submitted Work Order with no material transfer has status "Not Started". + self.assertEqual(wo.status, "Not Started") + + cols_after, data_after = self.run_report() + after = self.get_period_count(cols_after, data_after, "Not Started", period_label) + + self.assertEqual(after, before + 1) + + def test_report_shape(self): + columns, data = self.run_report() + + # First column is the Status column, followed by one column per period. + self.assertEqual(columns[0]["fieldname"], "status") + self.assertGreaterEqual(len(columns), 2) + + # One row per known Work Order status. + statuses = {row["status"] for row in data} + for status in ("Not Started", "Overdue", "Pending", "Completed", "Closed", "Stopped"): + self.assertIn(status, statuses) From eadaf376061c3e1e2c6f840da773d23e266f9747 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:48:43 +0530 Subject: [PATCH 013/400] test: add coverage for BOM Explorer report --- .../report/bom_explorer/test_bom_explorer.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py diff --git a/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py b/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py new file mode 100644 index 00000000000..3a7a1351c5b --- /dev/null +++ b/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py @@ -0,0 +1,70 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom +from erpnext.manufacturing.report.bom_explorer.bom_explorer import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestBOMExplorer(ERPNextTestSuite): + def run_report(self, bom): + filters = frappe._dict({"bom": bom}) + return execute(filters)[1] + + def test_default_bom_lists_components_at_top_level(self): + bom = frappe.db.get_value("BOM", {"item": "_Test FG Item", "is_active": 1, "is_default": 1}) + self.assertIsNotNone(bom, "Default active BOM for _Test FG Item not found") + + data = self.run_report(bom) + rows_by_item = {row["item_code"]: row for row in data} + + self.assertIn("_Test Item", rows_by_item) + self.assertIn("_Test Item Home Desktop 100", rows_by_item) + + for item_code in ("_Test Item", "_Test Item Home Desktop 100"): + row = rows_by_item[item_code] + self.assertEqual(row["indent"], 0) + self.assertEqual(row["bom_level"], 0) + + def test_qty_matches_bom_item_qty(self): + bom = frappe.db.get_value("BOM", {"item": "_Test FG Item", "is_active": 1, "is_default": 1}) + data = self.run_report(bom) + rows_by_item = {row["item_code"]: row for row in data} + + for bom_item in frappe.get_all( + "BOM Item", filters={"parent": bom}, fields=["item_code", "qty", "uom"] + ): + row = rows_by_item[bom_item.item_code] + self.assertEqual(row["qty"], bom_item.qty) + self.assertEqual(row["uom"], bom_item.uom) + + def test_nested_bom_shows_deeper_level(self): + # Sub-assembly: "sub" is itself a BOM containing "leaf". + parent_bom = create_nested_bom( + {"parent": {"sub": {"leaf": {}}, "flat": {}}}, + prefix="_Test explorer ", + ) + + data = self.run_report(parent_bom.name) + rows_by_item = {row["item_code"]: row for row in data} + + sub_item = "_Test explorer sub" + leaf_item = "_Test explorer leaf" + flat_item = "_Test explorer flat" + + self.assertIn(sub_item, rows_by_item) + self.assertIn(flat_item, rows_by_item) + self.assertIn(leaf_item, rows_by_item) + + # Direct components of the parent sit at level 0. + self.assertEqual(rows_by_item[flat_item]["indent"], 0) + self.assertEqual(rows_by_item[sub_item]["indent"], 0) + + # The sub-assembly row carries its own BOM reference. + self.assertTrue(rows_by_item[sub_item]["bom"]) + + # The leaf belongs to the sub-assembly, so it is exploded one level deeper. + self.assertEqual(rows_by_item[leaf_item]["indent"], 1) + self.assertEqual(rows_by_item[leaf_item]["bom_level"], 1) From e0bf3713eaeeb1afd539a45fd3e119e8ba75ccac Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:48:53 +0530 Subject: [PATCH 014/400] test: add coverage for Quality Inspection Summary report --- .../test_quality_inspection_summary.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py diff --git a/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py b/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py new file mode 100644 index 00000000000..368e7f5c3c4 --- /dev/null +++ b/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py @@ -0,0 +1,73 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import add_days, nowdate + +from erpnext.manufacturing.report.quality_inspection_summary.quality_inspection_summary import execute +from erpnext.stock.doctype.item.test_item import create_item +from erpnext.stock.doctype.quality_inspection.test_quality_inspection import ( + create_quality_inspection, + make_minimal_job_card, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestQualityInspectionSummary(ERPNextTestSuite): + def setUp(self): + super().setUp() + create_item("_Test Item") + self.job_card = make_minimal_job_card(production_item="_Test Item") + self.qi = create_quality_inspection( + item_code="_Test Item", + reference_type="Job Card", + reference_name=self.job_card, + status="Accepted", + ) + + def run_report(self, **extra): + filters = frappe._dict(extra) + return execute(filters)[1] + + def _rows_for_qi(self, data): + return [row for row in data if row.get("name") == self.qi.name] + + def test_appears_in_date_range(self): + data = self.run_report(from_date=add_days(nowdate(), -1), to_date=add_days(nowdate(), 1)) + rows = self._rows_for_qi(data) + self.assertEqual(len(rows), 1) + + row = rows[0] + self.assertEqual(row["status"], "Accepted") + self.assertEqual(row["item_code"], "_Test Item") + self.assertEqual(row["reference_type"], "Job Card") + self.assertEqual(row["reference_name"], self.job_card) + + def test_excluded_outside_date_range(self): + data = self.run_report(from_date=add_days(nowdate(), -10), to_date=add_days(nowdate(), -5)) + self.assertEqual(self._rows_for_qi(data), []) + + def test_status_filter_includes_matching(self): + data = self.run_report( + from_date=add_days(nowdate(), -1), + to_date=add_days(nowdate(), 1), + status=["Accepted"], + ) + self.assertEqual(len(self._rows_for_qi(data)), 1) + + def test_status_filter_excludes_non_matching(self): + data = self.run_report( + from_date=add_days(nowdate(), -1), + to_date=add_days(nowdate(), 1), + status=["Rejected"], + ) + self.assertEqual(self._rows_for_qi(data), []) + + def test_item_code_filter_excludes_other_item(self): + other_item = frappe.generate_hash(length=10) + data = self.run_report( + from_date=add_days(nowdate(), -1), + to_date=add_days(nowdate(), 1), + item_code=[other_item], + ) + self.assertEqual(self._rows_for_qi(data), []) From 47ee1d126d32d746fa7b03009deaee8659823654 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:53:54 +0530 Subject: [PATCH 015/400] test: add coverage for Work Order Consumed Materials report --- .../test_work_order_consumed_materials.py | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py diff --git a/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py b/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py new file mode 100644 index 00000000000..c879de4dc02 --- /dev/null +++ b/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py @@ -0,0 +1,105 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import add_days, nowdate + +from erpnext.manufacturing.doctype.work_order.mapper import make_stock_entry +from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record +from erpnext.manufacturing.report.work_order_consumed_materials.work_order_consumed_materials import execute +from erpnext.stock.doctype.stock_entry import test_stock_entry +from erpnext.tests.utils import ERPNextTestSuite + + +class TestWorkOrderConsumedMaterials(ERPNextTestSuite): + def run_report(self, **extra): + filters = frappe._dict( + { + "company": "_Test Company", + "from_date": add_days(nowdate(), -1), + "to_date": add_days(nowdate(), 1), + } + ) + filters.update(extra) + return execute(filters)[1] + + def make_manufactured_work_order(self, qty=2): + """Create a submitted WO, stock its raw materials, transfer and fully manufacture it.""" + wo = make_wo_order_test_record(production_item="_Test FG Item", qty=qty, company="_Test Company") + + for item in wo.required_items: + test_stock_entry.make_stock_entry( + item_code=item.item_code, + target=wo.wip_warehouse, + qty=item.required_qty, + basic_rate=100, + ) + + transfer = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", qty)) + transfer.insert() + transfer.submit() + + manufacture = frappe.get_doc(make_stock_entry(wo.name, "Manufacture", qty)) + manufacture.insert() + manufacture.submit() + + wo.reload() + return wo + + def get_wo_rows(self, data, work_order): + """The report blanks parent fields after the first raw-material row, so match by raw + material's parent work order instead of the (blanked) `name` column.""" + return [row for row in data if row.get("parent") == work_order] + + def test_consumed_materials_reported_after_manufacture(self): + wo = self.make_manufactured_work_order(qty=2) + + # fully producing the WO consumes exactly the required quantity of each raw material + self.assertEqual(wo.produced_qty, 2) + + data = self.run_report() + rows = self.get_wo_rows(data, wo.name) + + self.assertEqual(len(rows), len(wo.required_items)) + + reported = {row["raw_material_item_code"]: row for row in rows} + for item in wo.required_items: + row = reported[item.item_code] + self.assertEqual(row["required_qty"], item.required_qty) + self.assertEqual(row["transferred_qty"], item.required_qty) + self.assertEqual(row["consumed_qty"], item.required_qty) + # no over-consumption in a clean full manufacture + self.assertEqual(row["extra_consumed_qty"], 0.0) + self.assertEqual(row["returned_qty"], 0.0) + + # parent columns are populated on the first row only + first = rows[0] + self.assertEqual(first["status"], wo.status) + self.assertEqual(first["production_item"], "_Test FG Item") + self.assertEqual(first["qty"], 2) + self.assertEqual(first["produced_qty"], 2) + + def test_work_order_filter_scopes_output(self): + wo = self.make_manufactured_work_order(qty=1) + + data = self.run_report(name=wo.name) + + parents = {row.get("parent") for row in data} + self.assertEqual(parents, {wo.name}) + self.assertTrue(data) + + def test_draft_work_order_is_excluded(self): + # report only lists WOs in status In Process / Completed / Stopped + draft = make_wo_order_test_record( + production_item="_Test FG Item", qty=1, company="_Test Company", do_not_submit=True + ) + + data = self.run_report() + self.assertNotIn(draft.name, {row.get("parent") for row in data}) + + def test_date_range_filter_excludes_work_order(self): + wo = self.make_manufactured_work_order(qty=1) + + # a window that ends before the WO was created must not include it + data = self.run_report(from_date=add_days(nowdate(), -10), to_date=add_days(nowdate(), -5)) + self.assertNotIn(wo.name, {row.get("parent") for row in data}) From c38363c16d783e1fc78e1931a65d865c8e645657 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:54:31 +0530 Subject: [PATCH 016/400] test: add coverage for Production Plan Summary report --- .../test_production_plan_summary.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py diff --git a/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py new file mode 100644 index 00000000000..44901b63da8 --- /dev/null +++ b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py @@ -0,0 +1,115 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.manufacturing.doctype.production_plan.test_production_plan import create_production_plan +from erpnext.manufacturing.doctype.work_order.mapper import make_stock_entry as make_se_from_wo +from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record +from erpnext.manufacturing.report.production_plan_summary.production_plan_summary import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProductionPlanSummary(ERPNextTestSuite): + def run_report(self, production_plan): + filters = frappe._dict({"production_plan": production_plan}) + return execute(filters)[1] + + def make_plan(self, planned_qty=2): + return create_production_plan( + item_code="_Test FG Item", + planned_qty=planned_qty, + skip_getting_mr_items=1, + ) + + def make_submitted_work_order(self, plan, qty): + wo = make_wo_order_test_record( + item_code="_Test FG Item", + qty=qty, + company=plan.company, + wip_warehouse="Work In Progress - _TC", + fg_warehouse="Finished Goods - _TC", + skip_transfer=1, + use_multi_level_bom=1, + do_not_submit=True, + ) + wo.production_plan = plan.name + wo.production_plan_item = plan.po_items[0].name + wo.submit() + return wo + + def get_work_order_row(self, data, item_code): + for row in data: + if row.get("item_code") == item_code and row.get("document_type") == "Work Order": + return row + return None + + def get_summary_row(self, data, item_code): + for row in data: + if row.get("item_code") == item_code and not row.get("document_type"): + return row + return None + + def test_summary_without_work_order(self): + """A submitted plan with no work order still yields a summary row for the planned item.""" + plan = self.make_plan(planned_qty=2) + + data = self.run_report(plan.name) + summary = self.get_summary_row(data, "_Test FG Item") + + self.assertIsNotNone(summary) + self.assertEqual(summary.get("qty"), 2) + self.assertEqual(summary.get("produced_qty"), 0) + self.assertIsNone(self.get_work_order_row(data, "_Test FG Item")) + + def test_summary_with_pending_work_order(self): + """An unproduced work order shows full planned qty as pending.""" + plan = self.make_plan(planned_qty=2) + wo = self.make_submitted_work_order(plan, qty=2) + + data = self.run_report(plan.name) + wo_row = self.get_work_order_row(data, "_Test FG Item") + + self.assertIsNotNone(wo_row) + self.assertEqual(wo_row.get("document_name"), wo.name) + self.assertEqual(wo_row.get("qty"), 2) + self.assertEqual(wo_row.get("produced_qty"), 0) + self.assertEqual(wo_row.get("pending_qty"), 2) + + summary = self.get_summary_row(data, "_Test FG Item") + self.assertEqual(summary.get("qty"), 2) + self.assertEqual(summary.get("produced_qty"), 0) + + def test_summary_reflects_produced_qty(self): + """Producing part of the work order updates produced and pending quantities.""" + plan = self.make_plan(planned_qty=2) + wo = self.make_submitted_work_order(plan, qty=2) + + se = frappe.get_doc(make_se_from_wo(wo.name, "Manufacture", 1)) + se.submit() + + data = self.run_report(plan.name) + wo_row = self.get_work_order_row(data, "_Test FG Item") + + self.assertEqual(wo_row.get("document_name"), wo.name) + self.assertEqual(wo_row.get("produced_qty"), 1) + self.assertEqual(wo_row.get("pending_qty"), 1) + + summary = self.get_summary_row(data, "_Test FG Item") + self.assertEqual(summary.get("qty"), 2) + self.assertEqual(summary.get("produced_qty"), 1) + self.assertEqual(summary.get("pending_qty"), 1) + + def test_summary_scoped_to_its_own_plan(self): + """Each plan's report only reports its own work order documents.""" + plan_a = self.make_plan(planned_qty=2) + wo_a = self.make_submitted_work_order(plan_a, qty=2) + + plan_b = self.make_plan(planned_qty=3) + wo_b = self.make_submitted_work_order(plan_b, qty=3) + + data_a = self.run_report(plan_a.name) + document_names = {row.get("document_name") for row in data_a if row.get("document_name")} + + self.assertIn(wo_a.name, document_names) + self.assertNotIn(wo_b.name, document_names) From 8b7780d49495bdcf0a97499a668079250496820c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 1 Jul 2026 22:54:38 +0530 Subject: [PATCH 017/400] test: add coverage for Exponential Smoothing Forecasting report --- .../test_exponential_smoothing_forecasting.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py diff --git a/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py b/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py new file mode 100644 index 00000000000..3f8ffd74af9 --- /dev/null +++ b/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py @@ -0,0 +1,91 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt + +from erpnext.manufacturing.report.exponential_smoothing_forecasting.exponential_smoothing_forecasting import ( + execute, +) +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite + +TEST_ITEM = "_Test Item" +FROM_DATE = "2026-06-01" +TO_DATE = "2026-08-31" + + +class TestExponentialSmoothingForecasting(ERPNextTestSuite): + """Drive real submitted Sales Orders and assert the report buckets the ordered + quantities into the correct historical periods and produces a forecast.""" + + def test_monthly_qty_forecast_from_sales_orders(self): + # Historical demand: distinct calendar months strictly before FROM_DATE. + # Monthly period keys are derived from the period's last day (e.g. "mar_2026"). + history = {"mar_2026": 7, "apr_2026": 4, "may_2026": 9} + self.create_sales_orders( + { + "2026-03-15": history["mar_2026"], + "2026-04-15": history["apr_2026"], + "2026-05-15": history["may_2026"], + } + ) + + columns, row = self.run_report() + fields = {col["fieldname"] for col in columns} + + # For Monthly periodicity only future periods are exposed as columns, each as a + # forecast_ field. Historical demand lives in the row data (keyed by month) but is + # not surfaced as its own column. + self.assertIn("forecast_jun_2026", fields, "expected future forecast column") + self.assertNotIn("jun_2026", fields, "future period must not expose raw demand column") + self.assertNotIn("mar_2026", fields, "historical month is not a Monthly report column") + + # Historical buckets must exactly reflect the ordered quantities. + for key, qty in history.items(): + self.assertEqual(flt(row.get(key)), flt(qty), f"bucket {key} mismatch") + + # A forecast is produced for the first future period. The first non-zero + # historical period seeds the forecast at the average of non-zero months, + # so the future forecast must be positive. + expected_avg = sum(history.values()) / len(history) + self.assertGreater(flt(row.get("forecast_jun_2026")), 0.0) + self.assertLessEqual(flt(row.get("forecast_jun_2026")), max(history.values())) + self.assertAlmostEqual(flt(row.get("avg")), expected_avg, places=6) + + def test_ignores_documents_outside_range_and_other_docstatus(self): + self.create_sales_orders({"2026-05-10": 6}) + # A draft SO and a future-dated SO must not contribute to historical demand. + make_sales_order(item_code=TEST_ITEM, qty=100, transaction_date="2026-05-20", do_not_submit=True) + make_sales_order(item_code=TEST_ITEM, qty=100, transaction_date=FROM_DATE) + + _columns, row = self.run_report() + self.assertEqual(flt(row.get("may_2026")), 6.0) + + def create_sales_orders(self, date_to_qty): + for transaction_date, qty in date_to_qty.items(): + make_sales_order(item_code=TEST_ITEM, qty=qty, transaction_date=transaction_date) + + def run_report(self, **extra): + filters = frappe._dict( + { + "company": "_Test Company", + "based_on_document": "Sales Order", + "based_on_field": "Qty", + "no_of_years": 3, + "periodicity": "Monthly", + "from_date": FROM_DATE, + "to_date": TO_DATE, + "smoothing_constant": 0.5, + "item_code": TEST_ITEM, + } + ) + filters.update(extra) + + columns, data = execute(filters)[:2] + item_row = next( + (r for r in data if r.get("item_code") == TEST_ITEM), + None, + ) + self.assertIsNotNone(item_row, f"{TEST_ITEM} row missing from report output") + return columns, item_row From 4e88157ed78562d5e0ac752d9ee70f6ec8613030 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 00:02:50 +0530 Subject: [PATCH 018/400] test: stock raw materials before manufacture to avoid negative stock in CI --- .../test_production_plan_summary.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py index 44901b63da8..fc47a3065d1 100644 --- a/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py +++ b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py @@ -7,6 +7,7 @@ from erpnext.manufacturing.doctype.production_plan.test_production_plan import c from erpnext.manufacturing.doctype.work_order.mapper import make_stock_entry as make_se_from_wo from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record from erpnext.manufacturing.report.production_plan_summary.production_plan_summary import execute +from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.tests.utils import ERPNextTestSuite @@ -38,6 +39,17 @@ class TestProductionPlanSummary(ERPNextTestSuite): wo.submit() return wo + def stock_required_materials(self, wo): + # make sure every raw material is available in its source warehouse before manufacturing, + # otherwise a clean database raises NegativeStockError + for item in wo.required_items: + make_stock_entry( + item_code=item.item_code, + to_warehouse=item.source_warehouse or "_Test Warehouse - _TC", + qty=item.required_qty + 10, + rate=100, + ) + def get_work_order_row(self, data, item_code): for row in data: if row.get("item_code") == item_code and row.get("document_type") == "Work Order": @@ -84,6 +96,7 @@ class TestProductionPlanSummary(ERPNextTestSuite): """Producing part of the work order updates produced and pending quantities.""" plan = self.make_plan(planned_qty=2) wo = self.make_submitted_work_order(plan, qty=2) + self.stock_required_materials(wo) se = frappe.get_doc(make_se_from_wo(wo.name, "Manufacture", 1)) se.submit() From 48aef307f9fc2c625a79efa41198af0be62317d5 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Thu, 2 Jul 2026 02:19:38 +0530 Subject: [PATCH 019/400] fix: surface create payment entries as primary action on row selection --- .../accounts_payable/accounts_payable.js | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.js b/erpnext/accounts/report/accounts_payable/accounts_payable.js index 2fa6ceeb08c..8541e094640 100644 --- a/erpnext/accounts/report/accounts_payable/accounts_payable.js +++ b/erpnext/accounts/report/accounts_payable/accounts_payable.js @@ -174,7 +174,17 @@ frappe.query_reports["Accounts Payable"] = { }, get_datatable_options(options) { - return Object.assign(options, { checkboxColumn: true }); + return Object.assign(options, { + checkboxColumn: true, + events: { + onCheckRow: () => erpnext.accounts.toggle_create_pe_primary_action(frappe.query_report), + }, + }); + }, + + after_refresh: function (report) { + report.datatable?.rowmanager?.checkAll(false); + report.page.clear_primary_action(); }, onload: function (report) { @@ -186,20 +196,27 @@ frappe.query_reports["Accounts Payable"] = { if (frappe.boot.sysdefaults.default_ageing_range) { report.set_filter_value("range", frappe.boot.sysdefaults.default_ageing_range); } - - if (frappe.model.can_create("Payment Entry")) { - report.page.add_inner_button( - __("Create Payment Entries"), - function () { - erpnext.accounts.create_payment_entries_from_payable_report(report); - }, - __("Actions") - ); - } }, }; frappe.provide("erpnext.accounts"); + +erpnext.accounts.toggle_create_pe_primary_action = function (report) { + if (!report || !report.datatable || !frappe.model.can_create("Payment Entry")) return; + + const has_purchase_invoice = report.datatable.rowmanager + .getCheckedRows() + .some((i) => report.datatable.datamanager.data[i]?.voucher_type === "Purchase Invoice"); + + if (has_purchase_invoice) { + report.page.set_primary_action(__("Create Payment Entries"), () => + erpnext.accounts.create_payment_entries_from_payable_report(report) + ); + } else { + report.page.clear_primary_action(); + } +}; + erpnext.accounts.create_payment_entries_from_payable_report = function (report) { const datatable = report.datatable; if (!datatable) return; From 0d8c65a013cddc1952f0075b2d04f9a28aa42d02 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:50:03 +0000 Subject: [PATCH 020/400] ci(mergify): upgrade configuration to current format --- .mergify.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index 5e558062048..95763b27cb2 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -88,7 +88,6 @@ pull_request_rules: actions: merge: method: squash - commit_message_template: | - {{ title }} (#{{ number }}) - - {{ body }} + commit_message_format: + title: pr-title + body: pr-body From d10504af030dec5748b74a3fa17c0575ba520ece Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 12:34:38 +0530 Subject: [PATCH 023/400] fix: bucket late payments into 90 Above in Payment Period report --- .../payment_period_based_on_invoice_date.py | 7 +- ...st_payment_period_based_on_invoice_date.py | 68 ++++++++++++------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py index 5bbe02e4a01..47ada82755e 100644 --- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py +++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py @@ -21,7 +21,12 @@ def execute(filters=None): entries = get_entries(filters) invoice_details = get_invoice_posting_date_map(filters) - report = ReceivablePayableReport(filters) + # Only four range columns are defined (range1-range4, the last being "90 Above"). + # Three thresholds yield exactly four buckets, so payments more than 90 days after + # the invoice land in range4 instead of an unread range5. + report_filters = frappe._dict(filters) + report_filters.range = "30, 60, 90" + report = ReceivablePayableReport(report_filters) data = [] for d in entries: diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/test_payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/test_payment_period_based_on_invoice_date.py index 2c88a2c1171..f7c4f874c25 100644 --- a/erpnext/accounts/report/payment_period_based_on_invoice_date/test_payment_period_based_on_invoice_date.py +++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/test_payment_period_based_on_invoice_date.py @@ -32,15 +32,15 @@ class TestPaymentPeriodBasedOnInvoiceDate(ERPNextTestSuite): } ) filters.update(extra) - return execute(filters) + columns, data = execute(filters) + fieldnames = [c["fieldname"] for c in columns] + # Map each positional row to a dict keyed by column fieldname so assertions + # stay correct even if a column is inserted or reordered. + return columns, [dict(zip(fieldnames, row, strict=False)) for row in data] def find_payment_row(self, data, payment_name): - # Row shape (positional): payment_document, payment_entry(voucher_no), - # party_type, party, posting_date, invoice(against_voucher_no), - # invoice_posting_date, due_date, amount, remarks, age, - # range1, range2, range3, range4, [delay_in_payment] for row in data: - if row[1] == payment_name: + if row["payment_entry"] == payment_name: return row return None @@ -57,42 +57,60 @@ class TestPaymentPeriodBasedOnInvoiceDate(ERPNextTestSuite): invoice = create_sales_invoice(customer="_Test Customer", rate=1000, posting_date="2026-06-01") payment = self.pay_invoice(invoice, "2026-06-20") - columns, data = self.run_report() + _columns, data = self.run_report() row = self.find_payment_row(data, payment.name) self.assertIsNotNone(row, "Payment row not found in report output") - # Positional assertions on the row shape. - self.assertEqual(row[2], "Customer") - self.assertEqual(row[4], getdate("2026-06-20")) # payment posting date - self.assertEqual(row[5], invoice.name) # against invoice - self.assertEqual(row[6], getdate("2026-06-01")) # invoice posting date - self.assertEqual(row[8], 1000) # amount - self.assertEqual(row[10], 19) # age = payment date - invoice date + self.assertEqual(row["party_type"], "Customer") + self.assertEqual(row["posting_date"], getdate("2026-06-20")) + self.assertEqual(row["invoice"], invoice.name) + self.assertEqual(row["invoice_posting_date"], getdate("2026-06-01")) + self.assertEqual(row["amount"], 1000) + self.assertEqual(row["age"], 19) # age = payment date - invoice date # Buckets: 0-30 filled, others empty. - self.assertEqual(row[11], 1000) # range1 (0-30) - self.assertEqual(row[12], 0) # range2 (30-60) - self.assertEqual(row[13], 0) # range3 (60-90) - self.assertEqual(row[14], 0) # range4 (90 Above) + self.assertEqual(row["range1"], 1000) # 0-30 + self.assertEqual(row["range2"], 0) # 30-60 + self.assertEqual(row["range3"], 0) # 60-90 + self.assertEqual(row["range4"], 0) # 90 Above def test_paid_amount_lands_in_30_60_bucket(self): # invoice 2026-06-01, paid 2026-07-16 -> 45 days after -> 30-60 bucket invoice = create_sales_invoice(customer="_Test Customer 1", rate=1000, posting_date="2026-06-01") payment = self.pay_invoice(invoice, "2026-07-16") - columns, data = self.run_report() + _columns, data = self.run_report() row = self.find_payment_row(data, payment.name) self.assertIsNotNone(row, "Payment row not found in report output") - self.assertEqual(row[8], 1000) # amount - self.assertEqual(row[10], 45) # age = payment date - invoice date + self.assertEqual(row["amount"], 1000) + self.assertEqual(row["age"], 45) # Buckets: 30-60 filled, others empty. - self.assertEqual(row[11], 0) # range1 (0-30) - self.assertEqual(row[12], 1000) # range2 (30-60) - self.assertEqual(row[13], 0) # range3 (60-90) - self.assertEqual(row[14], 0) # range4 (90 Above) + self.assertEqual(row["range1"], 0) + self.assertEqual(row["range2"], 1000) + self.assertEqual(row["range3"], 0) + self.assertEqual(row["range4"], 0) + + def test_payment_over_90_days_lands_in_90_above_bucket(self): + # invoice 2026-01-01, paid 2026-06-01 -> 151 days after -> "90 Above" bucket. + # Regression guard: with four range columns, a payment older than the last + # threshold must fall into range4 rather than an unread range5 (showing 0). + invoice = create_sales_invoice(customer="_Test Customer 2", rate=1000, posting_date="2026-01-01") + payment = self.pay_invoice(invoice, "2026-06-01") + + _columns, data = self.run_report() + + row = self.find_payment_row(data, payment.name) + self.assertIsNotNone(row, "Payment row not found in report output") + + self.assertEqual(row["amount"], 1000) + self.assertEqual(row["age"], 151) + self.assertEqual(row["range1"], 0) + self.assertEqual(row["range2"], 0) + self.assertEqual(row["range3"], 0) + self.assertEqual(row["range4"], 1000) # 90 Above captures the full amount def test_columns_expose_expected_age_buckets(self): columns, _data = self.run_report() From 2e72c13aee9694093d9901c83be9b3ad05b8bff6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 12:43:07 +0530 Subject: [PATCH 024/400] test: isolate COGS By Item Group test with a dedicated item group --- .../test_cogs_by_item_group.py | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py b/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py index 36b9d4ad1da..a7c4b384fbe 100644 --- a/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py +++ b/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py @@ -4,15 +4,18 @@ import frappe from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.stock.report.cogs_by_item_group.cogs_by_item_group import execute from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company with perpetual inventory" + class TestCogsByItemGroup(ERPNextTestSuite): def run_report(self, **extra) -> list: filters = frappe._dict( - company="_Test Company with perpetual inventory", + company=COMPANY, from_date="2026-01-01", to_date="2026-12-31", ) @@ -20,16 +23,19 @@ class TestCogsByItemGroup(ERPNextTestSuite): return execute(filters)[1] def test_cogs_for_item_group(self): - # Reuse the bootstrap item `_Test Item` (item group `_Test Item Group`). - # It has zero stock in `Stores - TCP1`, so this receipt starts from a clean balance. - item = "_Test Item" + # A dedicated item group with a single item keeps `agg_value` scoped to this + # test's COGS. The report sums COGS up the whole item-group tree keyed on the + # company's default expense account, so a shared group would accumulate COGS + # booked by any other test/fixture for the same company within the date range. + item_group = make_item_group("_Test COGS Item Group") + item = make_item(properties={"is_stock_item": 1, "item_group": item_group}).name make_stock_entry( item_code=item, to_warehouse="Stores - TCP1", qty=10, rate=100, - company="_Test Company with perpetual inventory", + company=COMPANY, posting_date="2026-06-01", ) @@ -40,7 +46,7 @@ class TestCogsByItemGroup(ERPNextTestSuite): qty=4, rate=150, warehouse="Stores - TCP1", - company="_Test Company with perpetual inventory", + company=COMPANY, update_stock=1, cost_center="Main - TCP1", parent_cost_center="Main - TCP1", @@ -51,7 +57,20 @@ class TestCogsByItemGroup(ERPNextTestSuite): ) data = self.run_report() - rows = [row for row in data if "_Test Item Group" in row.get("item_group")] - self.assertTrue(rows, "No row found for _Test Item Group") + rows = [row for row in data if item_group in row.get("item_group")] + self.assertTrue(rows, "No row found for the dedicated item group") # 4 units delivered at 100 valuation rate -> 400 COGS. self.assertEqual(rows[0].get("cogs_debit"), 400) + + +def make_item_group(name: str) -> str: + if not frappe.db.exists("Item Group", name): + frappe.get_doc( + { + "doctype": "Item Group", + "item_group_name": name, + "parent_item_group": "All Item Groups", + "is_group": 0, + } + ).insert() + return name From cb4f3588fa7fea0de9c03be20b9efe50f9fd4a38 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 12:45:01 +0530 Subject: [PATCH 025/400] test: isolate Profitability Analysis tests from shared cost centers --- .../test_profitability_analysis.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/report/profitability_analysis/test_profitability_analysis.py b/erpnext/accounts/report/profitability_analysis/test_profitability_analysis.py index 19e0c57ceb2..e9c98f75821 100644 --- a/erpnext/accounts/report/profitability_analysis/test_profitability_analysis.py +++ b/erpnext/accounts/report/profitability_analysis/test_profitability_analysis.py @@ -46,8 +46,9 @@ class TestProfitabilityAnalysis(ERPNextTestSuite): ) def test_income_expense_and_gross_profit(self): - # bootstrap leaf cost center; clean of committed GL so exact assertions hold - cc = "_Test Cost Center - _TC" + # a dedicated leaf cost center keeps these exact assertions free of GL that + # other tests may book against a shared cost center in the same fiscal year + cc = self.make_cc("_Test PA Income Expense") self.book_income(cc, 10000) self.book_expense(cc, 4000) @@ -74,7 +75,7 @@ class TestProfitabilityAnalysis(ERPNextTestSuite): self.assertEqual(parent_row["gross_profit_loss"], 7000) def test_date_range_excludes_out_of_period_entries(self): - cc = "_Test Cost Center 2 - _TC" + cc = self.make_cc("_Test PA Date Range") self.book_income(cc, 10000, posting_date="2025-06-01") # the 2025 income must not appear in a 2026 report (zero-value rows are dropped) @@ -97,7 +98,8 @@ class TestProfitabilityAnalysis(ERPNextTestSuite): data = self.run_report() # the report appends a blank separator row and a totals row at the end total_row = data[-1] - self.assertEqual(total_row["account"], "'Total'") + # the report wraps the (possibly translated) "Total" label in single quotes + self.assertEqual(total_row["account"], "'" + frappe._("Total") + "'") # total is built from direct (non-accumulated) values, so it stays internally consistent self.assertEqual(total_row["gross_profit_loss"], total_row["income"] - total_row["expense"]) # and it includes this test's bookings From 694328aab6c511683c83bfe2f03c4c55dfc0ec13 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 12:46:53 +0530 Subject: [PATCH 026/400] test: zero pre-committed actuals in Budget Variance report tests --- .../test_budget_variance_report.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/budget_variance_report/test_budget_variance_report.py b/erpnext/accounts/report/budget_variance_report/test_budget_variance_report.py index de1fb541cb6..e1f2bc5ef0e 100644 --- a/erpnext/accounts/report/budget_variance_report/test_budget_variance_report.py +++ b/erpnext/accounts/report/budget_variance_report/test_budget_variance_report.py @@ -4,7 +4,7 @@ import frappe from frappe.utils import nowdate -from erpnext.accounts.doctype.budget.test_budget import make_budget +from erpnext.accounts.doctype.budget.test_budget import make_budget, set_total_expense_zero from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry from erpnext.accounts.report.budget_variance_report.budget_variance_report import execute from erpnext.accounts.utils import get_fiscal_year @@ -33,7 +33,12 @@ class TestBudgetVarianceReport(ERPNextTestSuite): return execute(filters)[1] def report_row(self, data, dimension, account=ACCOUNT): - return next(row for row in data if row["budget_against"] == dimension and row["account"] == account) + row = next( + (r for r in data if r["budget_against"] == dimension and r["account"] == account), + None, + ) + self.assertIsNotNone(row, f"No report row for {dimension} / {account}") + return row def field(self, label): return frappe.scrub(f"{label} {self.fy}") @@ -55,6 +60,8 @@ class TestBudgetVarianceReport(ERPNextTestSuite): self.assertTrue(columns) def test_budget_amount_shown_with_zero_actual(self): + # neutralise any committed actuals so the exact Actual/Variance assertions hold + set_total_expense_zero(nowdate(), "cost_center") make_budget( budget_against="Cost Center", cost_center=COST_CENTER, budget_amount=120000, submit_budget=1 ) @@ -65,6 +72,9 @@ class TestBudgetVarianceReport(ERPNextTestSuite): self.assertEqual(row[self.field("Variance")], 120000) def test_actual_expense_updates_actual_and_variance(self): + # zero out pre-committed actuals: keeps Actual exact and avoids the budget's + # "Stop" action rejecting the journal entry when prior actuals already exist + set_total_expense_zero(nowdate(), "cost_center") make_budget( budget_against="Cost Center", cost_center=COST_CENTER, budget_amount=120000, submit_budget=1 ) @@ -88,6 +98,8 @@ class TestBudgetVarianceReport(ERPNextTestSuite): self.assertEqual(dimensions, {COST_CENTER}) def test_monthly_period_totals(self): + # zero out pre-committed actuals so total_actual reflects only this test's entry + set_total_expense_zero(nowdate(), "cost_center") make_budget( budget_against="Cost Center", cost_center=COST_CENTER, budget_amount=120000, submit_budget=1 ) From 27f5235e67912f345265584fb7874b784eb6a368 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 12:48:29 +0530 Subject: [PATCH 027/400] test: cover inconsistent balance detection in Incorrect Balance Qty report --- ...incorrect_balance_qty_after_transaction.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/erpnext/stock/report/incorrect_balance_qty_after_transaction/test_incorrect_balance_qty_after_transaction.py b/erpnext/stock/report/incorrect_balance_qty_after_transaction/test_incorrect_balance_qty_after_transaction.py index db95dd96ff6..cee67261b7d 100644 --- a/erpnext/stock/report/incorrect_balance_qty_after_transaction/test_incorrect_balance_qty_after_transaction.py +++ b/erpnext/stock/report/incorrect_balance_qty_after_transaction/test_incorrect_balance_qty_after_transaction.py @@ -3,6 +3,7 @@ import frappe +from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.stock.report.incorrect_balance_qty_after_transaction.incorrect_balance_qty_after_transaction import ( execute, @@ -28,6 +29,30 @@ class TestIncorrectBalanceQtyAfterTransaction(ERPNextTestSuite): flagged = [row for row in data if row.get("item_code") == item] self.assertEqual(flagged, []) + def test_inconsistent_balance_qty_is_flagged(self): + # a unique item keeps this SLE the only ledger entry for the item/warehouse + item = make_item(properties={"is_stock_item": 1}).name + entry = make_stock_entry( + item_code=item, to_warehouse=WAREHOUSE, qty=10, rate=100, posting_date="2026-06-01" + ) + + # Corrupt the running balance so it no longer matches the cumulative actual_qty -- + # exactly the inconsistency this report exists to detect. set_value bypasses the + # ledger recompute that would otherwise keep the two in sync. + sle_name = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_no": entry.name, "item_code": item, "warehouse": WAREHOUSE}, + "name", + ) + frappe.db.set_value("Stock Ledger Entry", sle_name, "qty_after_transaction", 5) + + flagged = [row for row in self.run_report(item_code=item) if row.get("name") == sle_name] + self.assertEqual(len(flagged), 1, "The tampered stock ledger entry should be flagged") + row = flagged[0] + self.assertEqual(row["expected_balance_qty"], 10) # cumulative actual_qty + self.assertEqual(row["qty_after_transaction"], 5) # tampered balance + self.assertEqual(row["differnce"], 5) + def test_sequence_of_movements_not_flagged(self): item = "_Test Item 2" make_stock_entry(item_code=item, to_warehouse=WAREHOUSE, qty=20, rate=50, posting_date="2026-06-01") From c17517d22a17f409420a597e0a51dbf25e1a5ff1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 13:55:16 +0530 Subject: [PATCH 028/400] test: use a unique item group per run in COGS test --- .../report/cogs_by_item_group/test_cogs_by_item_group.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py b/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py index a7c4b384fbe..8e2004c7d46 100644 --- a/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py +++ b/erpnext/stock/report/cogs_by_item_group/test_cogs_by_item_group.py @@ -27,7 +27,9 @@ class TestCogsByItemGroup(ERPNextTestSuite): # test's COGS. The report sums COGS up the whole item-group tree keyed on the # company's default expense account, so a shared group would accumulate COGS # booked by any other test/fixture for the same company within the date range. - item_group = make_item_group("_Test COGS Item Group") + # The group name is unique per run so items created by earlier runs (which + # reuse a fixed group name) can't inflate the total either. + item_group = make_item_group(f"_Test COGS Item Group {frappe.generate_hash(length=6)}") item = make_item(properties={"is_stock_item": 1, "item_group": item_group}).name make_stock_entry( From cc9d94efe884a54dfa81d674a1dff7655b35b658 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 13:57:07 +0530 Subject: [PATCH 029/400] test: use unique item and assert exact forecast in Exponential Smoothing test --- .../test_exponential_smoothing_forecasting.py | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py b/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py index 3f8ffd74af9..37d6c7da7ab 100644 --- a/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py +++ b/erpnext/manufacturing/report/exponential_smoothing_forecasting/test_exponential_smoothing_forecasting.py @@ -8,17 +8,24 @@ from erpnext.manufacturing.report.exponential_smoothing_forecasting.exponential_ execute, ) from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.stock.doctype.item.test_item import make_item from erpnext.tests.utils import ERPNextTestSuite -TEST_ITEM = "_Test Item" FROM_DATE = "2026-06-01" TO_DATE = "2026-08-31" +SMOOTHING_CONSTANT = 0.5 class TestExponentialSmoothingForecasting(ERPNextTestSuite): """Drive real submitted Sales Orders and assert the report buckets the ordered quantities into the correct historical periods and produces a forecast.""" + def setUp(self): + # The forecast query has no lower date bound, so it would pick up any committed + # Sales Order for the item. A uniquely-named item keeps the buckets scoped to + # just this test's orders. + self.item = make_item(properties={"is_stock_item": 1}).name + def test_monthly_qty_forecast_from_sales_orders(self): # Historical demand: distinct calendar months strictly before FROM_DATE. # Monthly period keys are derived from the period's last day (e.g. "mar_2026"). @@ -45,26 +52,29 @@ class TestExponentialSmoothingForecasting(ERPNextTestSuite): for key, qty in history.items(): self.assertEqual(flt(row.get(key)), flt(qty), f"bucket {key} mismatch") - # A forecast is produced for the first future period. The first non-zero - # historical period seeds the forecast at the average of non-zero months, - # so the future forecast must be positive. + # The forecast seeds at the average of the non-zero historical months and then + # smooths through them in order: F = F + a*(actual - F). Asserting the exact + # analytical value pins the smoothing formula (Jun 2026 works out to ~7.2083). expected_avg = sum(history.values()) / len(history) - self.assertGreater(flt(row.get("forecast_jun_2026")), 0.0) - self.assertLessEqual(flt(row.get("forecast_jun_2026")), max(history.values())) self.assertAlmostEqual(flt(row.get("avg")), expected_avg, places=6) + forecast = expected_avg + for month in ("mar_2026", "apr_2026", "may_2026"): + forecast = forecast + SMOOTHING_CONSTANT * (history[month] - forecast) + self.assertAlmostEqual(flt(row.get("forecast_jun_2026")), forecast, places=6) + def test_ignores_documents_outside_range_and_other_docstatus(self): self.create_sales_orders({"2026-05-10": 6}) # A draft SO and a future-dated SO must not contribute to historical demand. - make_sales_order(item_code=TEST_ITEM, qty=100, transaction_date="2026-05-20", do_not_submit=True) - make_sales_order(item_code=TEST_ITEM, qty=100, transaction_date=FROM_DATE) + make_sales_order(item_code=self.item, qty=100, transaction_date="2026-05-20", do_not_submit=True) + make_sales_order(item_code=self.item, qty=100, transaction_date=FROM_DATE) _columns, row = self.run_report() self.assertEqual(flt(row.get("may_2026")), 6.0) def create_sales_orders(self, date_to_qty): for transaction_date, qty in date_to_qty.items(): - make_sales_order(item_code=TEST_ITEM, qty=qty, transaction_date=transaction_date) + make_sales_order(item_code=self.item, qty=qty, transaction_date=transaction_date) def run_report(self, **extra): filters = frappe._dict( @@ -76,16 +86,16 @@ class TestExponentialSmoothingForecasting(ERPNextTestSuite): "periodicity": "Monthly", "from_date": FROM_DATE, "to_date": TO_DATE, - "smoothing_constant": 0.5, - "item_code": TEST_ITEM, + "smoothing_constant": SMOOTHING_CONSTANT, + "item_code": self.item, } ) filters.update(extra) columns, data = execute(filters)[:2] item_row = next( - (r for r in data if r.get("item_code") == TEST_ITEM), + (r for r in data if r.get("item_code") == self.item), None, ) - self.assertIsNotNone(item_row, f"{TEST_ITEM} row missing from report output") + self.assertIsNotNone(item_row, f"{self.item} row missing from report output") return columns, item_row From 14091a8996547c8fe428ed8fdb960cf8934acc8f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 13:58:31 +0530 Subject: [PATCH 030/400] fix: report full planned qty as pending when a plan has no work order --- .../report/production_plan_summary/production_plan_summary.py | 4 +++- .../production_plan_summary/test_production_plan_summary.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py index d7920af8141..82e150f807a 100644 --- a/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py +++ b/erpnext/manufacturing/report/production_plan_summary/production_plan_summary.py @@ -42,7 +42,9 @@ def get_production_plan_item_details(filters, data, order_details): order_qty = row.planned_qty total_produced_qty = 0.0 - pending_qty = 0.0 + # default to the full planned qty so a plan without any work order still + # reports everything as pending rather than a misleading zero + pending_qty = flt(order_qty) for work_order in work_orders: produced_qty = flt(order_details.get((work_order, row.item_code), {}).get("produced_qty", 0)) pending_qty = flt(order_qty) - produced_qty diff --git a/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py index fc47a3065d1..674c653b12e 100644 --- a/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py +++ b/erpnext/manufacturing/report/production_plan_summary/test_production_plan_summary.py @@ -72,6 +72,8 @@ class TestProductionPlanSummary(ERPNextTestSuite): self.assertIsNotNone(summary) self.assertEqual(summary.get("qty"), 2) self.assertEqual(summary.get("produced_qty"), 0) + # nothing produced yet, so the whole planned qty is pending + self.assertEqual(summary.get("pending_qty"), 2) self.assertIsNone(self.get_work_order_row(data, "_Test FG Item")) def test_summary_with_pending_work_order(self): From f1e91b6be662a79396fae7a4157bb23cc5afc19e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:02:45 +0530 Subject: [PATCH 031/400] test: add positive anchor and robust row pairing in Work Order Consumed Materials --- .../test_work_order_consumed_materials.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py b/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py index c879de4dc02..825c80701fb 100644 --- a/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py +++ b/erpnext/manufacturing/report/work_order_consumed_materials/test_work_order_consumed_materials.py @@ -62,9 +62,12 @@ class TestWorkOrderConsumedMaterials(ERPNextTestSuite): self.assertEqual(len(rows), len(wo.required_items)) - reported = {row["raw_material_item_code"]: row for row in rows} - for item in wo.required_items: - row = reported[item.item_code] + # pair rows to required items by sorting rather than a dict keyed on item code, so + # a BOM with two lines for the same component wouldn't silently collapse to one row + rows_sorted = sorted(rows, key=lambda r: (r["raw_material_item_code"], r["required_qty"])) + items_sorted = sorted(wo.required_items, key=lambda i: (i.item_code, i.required_qty)) + for row, item in zip(rows_sorted, items_sorted, strict=True): + self.assertEqual(row["raw_material_item_code"], item.item_code) self.assertEqual(row["required_qty"], item.required_qty) self.assertEqual(row["transferred_qty"], item.required_qty) self.assertEqual(row["consumed_qty"], item.required_qty) @@ -100,6 +103,9 @@ class TestWorkOrderConsumedMaterials(ERPNextTestSuite): def test_date_range_filter_excludes_work_order(self): wo = self.make_manufactured_work_order(qty=1) + # positive anchor: the WO shows up within the default (current) window + self.assertIn(wo.name, {row.get("parent") for row in self.run_report()}) + # a window that ends before the WO was created must not include it data = self.run_report(from_date=add_days(nowdate(), -10), to_date=add_days(nowdate(), -5)) self.assertNotIn(wo.name, {row.get("parent") for row in data}) From 14f862f80ccfb8bca7ee549fc5db8b05a48c24c5 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:03:45 +0530 Subject: [PATCH 032/400] test: add positive item_code filter case in Quality Inspection Summary --- .../test_quality_inspection_summary.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py b/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py index 368e7f5c3c4..08401329126 100644 --- a/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py +++ b/erpnext/manufacturing/report/quality_inspection_summary/test_quality_inspection_summary.py @@ -63,6 +63,14 @@ class TestQualityInspectionSummary(ERPNextTestSuite): ) self.assertEqual(self._rows_for_qi(data), []) + def test_item_code_filter_includes_matching(self): + data = self.run_report( + from_date=add_days(nowdate(), -1), + to_date=add_days(nowdate(), 1), + item_code=["_Test Item"], + ) + self.assertEqual(len(self._rows_for_qi(data)), 1) + def test_item_code_filter_excludes_other_item(self): other_item = frappe.generate_hash(length=10) data = self.run_report( From b77f6168d9433665be060836849a94f65f5ccbbc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:05:15 +0530 Subject: [PATCH 033/400] test: load BOM fixtures and scope to top-level rows in BOM Explorer test --- .../report/bom_explorer/test_bom_explorer.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py b/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py index 3a7a1351c5b..54bfae2d6c2 100644 --- a/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py +++ b/erpnext/manufacturing/report/bom_explorer/test_bom_explorer.py @@ -9,16 +9,26 @@ from erpnext.tests.utils import ERPNextTestSuite class TestBOMExplorer(ERPNextTestSuite): + def setUp(self): + # the tests look up `_Test FG Item`'s BOM, which comes from the BOM fixtures; + # load them so the file also passes when run in isolation + self.load_test_records("BOM") + def run_report(self, bom): filters = frappe._dict({"bom": bom}) return execute(filters)[1] + def top_level_rows_by_item(self, data): + # key only the direct (indent 0) components, so an item that also appears in a + # deeper sub-assembly can't overwrite the top-level row we assert against + return {row["item_code"]: row for row in data if row["indent"] == 0} + def test_default_bom_lists_components_at_top_level(self): bom = frappe.db.get_value("BOM", {"item": "_Test FG Item", "is_active": 1, "is_default": 1}) self.assertIsNotNone(bom, "Default active BOM for _Test FG Item not found") data = self.run_report(bom) - rows_by_item = {row["item_code"]: row for row in data} + rows_by_item = self.top_level_rows_by_item(data) self.assertIn("_Test Item", rows_by_item) self.assertIn("_Test Item Home Desktop 100", rows_by_item) @@ -31,7 +41,7 @@ class TestBOMExplorer(ERPNextTestSuite): def test_qty_matches_bom_item_qty(self): bom = frappe.db.get_value("BOM", {"item": "_Test FG Item", "is_active": 1, "is_default": 1}) data = self.run_report(bom) - rows_by_item = {row["item_code"]: row for row in data} + rows_by_item = self.top_level_rows_by_item(data) for bom_item in frappe.get_all( "BOM Item", filters={"parent": bom}, fields=["item_code", "qty", "uom"] From ece8c9538deaf448032f35e3fab2b146877ad556 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:06:37 +0530 Subject: [PATCH 034/400] test: locale-safe status match and stable period window in Production Analytics --- .../test_production_analytics.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/erpnext/manufacturing/report/production_analytics/test_production_analytics.py b/erpnext/manufacturing/report/production_analytics/test_production_analytics.py index 17a26ef06bd..c02e94f249f 100644 --- a/erpnext/manufacturing/report/production_analytics/test_production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/test_production_analytics.py @@ -2,6 +2,7 @@ # See license.txt import frappe +from frappe import _ from frappe.utils import get_first_day, get_last_day, today from erpnext.tests.utils import ERPNextTestSuite @@ -26,14 +27,19 @@ class TestProductionAnalytics(ERPNextTestSuite): def get_period_count(self, columns, data, status, period_label): """Return the count for a status row under the period column resolved by label.""" period_fieldname = next(col["fieldname"] for col in columns if col.get("label") == period_label) - row = next(row for row in data if row["status"] == status) + # the report stores the translated status label, so translate before matching + row = next(row for row in data if row["status"] == _(status)) return row[period_fieldname] def test_submitted_work_order_increments_status_count(self): from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record + # pin the reporting window once so both runs use the same period even if the + # test happens to straddle a month boundary + from_date, to_date = get_first_day(today()), get_last_day(today()) + # The current month is the period a newly created Work Order falls into (bucketed by creation date). - cols_before, data_before = self.run_report() + cols_before, data_before = self.run_report(from_date=from_date, to_date=to_date) period_label = cols_before[-1]["label"] before = self.get_period_count(cols_before, data_before, "Not Started", period_label) @@ -42,7 +48,7 @@ class TestProductionAnalytics(ERPNextTestSuite): # A freshly submitted Work Order with no material transfer has status "Not Started". self.assertEqual(wo.status, "Not Started") - cols_after, data_after = self.run_report() + cols_after, data_after = self.run_report(from_date=from_date, to_date=to_date) after = self.get_period_count(cols_after, data_after, "Not Started", period_label) self.assertEqual(after, before + 1) @@ -57,4 +63,4 @@ class TestProductionAnalytics(ERPNextTestSuite): # One row per known Work Order status. statuses = {row["status"] for row in data} for status in ("Not Started", "Overdue", "Pending", "Completed", "Closed", "Stopped"): - self.assertIn(status, statuses) + self.assertIn(_(status), statuses) From 7e7fd610cb9fa6240b952fe654884ea81757eca6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:08:19 +0530 Subject: [PATCH 035/400] test: guard job card list and derive status filter from stored status --- .../job_card_summary/test_job_card_summary.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py b/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py index 81af722ad50..6e59a0d559d 100644 --- a/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py +++ b/erpnext/manufacturing/report/job_card_summary/test_job_card_summary.py @@ -54,6 +54,7 @@ class TestJobCardSummary(ERPNextTestSuite): self.assertEqual(row.get("production_item"), jc.production_item) def test_operation_filter_scopes_rows(self): + self.assertTrue(self.job_cards, "Work Order did not produce any Job Cards") operation = self.job_cards[0].operation matching = {jc.name for jc in self.job_cards if jc.operation == operation} @@ -61,8 +62,18 @@ class TestJobCardSummary(ERPNextTestSuite): self.assertEqual({row.get("name") for row in rows}, matching) def test_status_filter(self): - open_rows = self.rows_for_work_order(self.run_report(status="Open")) - self.assertEqual({row.get("name") for row in open_rows}, {jc.name for jc in self.job_cards}) + self.assertTrue(self.job_cards, "Work Order did not produce any Job Cards") + + # The status filter matches the Job Card's *stored* status, so derive the + # expected set from that rather than assuming fresh cards are literally "Open". + stored_status = self.job_cards[0].status + expected = {jc.name for jc in self.job_cards if jc.status == stored_status} + + rows = self.rows_for_work_order(self.run_report(status=stored_status)) + self.assertEqual({row.get("name") for row in rows}, expected) + # any non-completed card is displayed as "Open" regardless of its stored status + for row in rows: + self.assertEqual(row.get("status"), "Open") # None of the freshly created job cards are Completed yet. completed_rows = self.rows_for_work_order(self.run_report(status="Completed")) From 5adbc7babae4f0ad1554248d4d4f7479d21e82e0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:10:24 +0530 Subject: [PATCH 036/400] test: target leaf accounts and robust amount assertions in Consolidated Financial Statement --- .../test_consolidated_financial_statement.py | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py index 202c495d378..1fb6a68e3b6 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/test_consolidated_financial_statement.py @@ -52,11 +52,19 @@ class TestConsolidatedFinancialStatement(ERPNextTestSuite): je.submit() return je - def get_row(self, data, account_name_fragment): + def get_row(self, data, account_name_fragment, last_match=False): + """Return the first (or last) row whose account_name contains the fragment. + + Pass ``last_match=True`` to get the leaf/most-specific match when the fragment + is also a prefix of a parent group account (parents precede children in tree order). + """ + found = None for row in data: if account_name_fragment in str(row.get("account_name") or ""): - return row - return None + if not last_match: + return row + found = row + return found def test_profit_and_loss_reflects_child_company_income(self): amount = 7000 @@ -67,9 +75,10 @@ class TestConsolidatedFinancialStatement(ERPNextTestSuite): self.assertTrue(data, "Report returned no rows") # child's Sales account is mapped onto the parent chart (Sales - PGCI) - sales_row = self.get_row(data, "Sales") + sales_row = self.get_row(data, "Sales", last_match=True) self.assertIsNotNone(sales_row, "Sales row missing from consolidated P&L") - self.assertEqual(flt(sales_row.get(CHILD_COMPANY)), amount) + # >= so a pre-existing Sales balance in the fiscal year doesn't make this brittle + self.assertGreaterEqual(flt(sales_row.get(CHILD_COMPANY)), amount) total_income_row = self.get_row(data, "Total Income (Credit)") self.assertIsNotNone(total_income_row, "Total Income row missing") @@ -81,9 +90,9 @@ class TestConsolidatedFinancialStatement(ERPNextTestSuite): data = self.run_report(report="Profit and Loss Statement", accumulated_in_group_company=0) - expense_row = self.get_row(data, "Marketing Expenses") + expense_row = self.get_row(data, "Marketing Expenses", last_match=True) self.assertIsNotNone(expense_row, "Marketing Expenses row missing from consolidated P&L") - self.assertEqual(flt(expense_row.get(CHILD_COMPANY)), amount) + self.assertGreaterEqual(flt(expense_row.get(CHILD_COMPANY)), amount) total_expense_row = self.get_row(data, "Total Expense (Debit)") self.assertIsNotNone(total_expense_row, "Total Expense row missing") @@ -97,13 +106,15 @@ class TestConsolidatedFinancialStatement(ERPNextTestSuite): data = self.run_report(report="Profit and Loss Statement", accumulated_in_group_company=1) - sales_row = self.get_row(data, "Sales") + sales_row = self.get_row(data, "Sales", last_match=True) self.assertIsNotNone(sales_row) - self.assertEqual(flt(sales_row.get(CHILD_COMPANY)), amount) + child_value = flt(sales_row.get(CHILD_COMPANY)) + self.assertGreaterEqual(child_value, amount) # parent column picks up the child value when accumulated - self.assertEqual(flt(sales_row.get(PARENT_COMPANY)), amount) - # the total must equal the consolidated (group) value, not the sum of parent + child columns - self.assertEqual(flt(sales_row.get("total")), amount) + self.assertEqual(flt(sales_row.get(PARENT_COMPANY)), child_value) + # the total equals the consolidated (group) value, not the sum of parent + child + # columns -- this is the regression guard for the double-count fix + self.assertEqual(flt(sales_row.get("total")), child_value) def test_balance_sheet_executes_and_returns_rows(self): # posting income leaves a balancing entry in the child's Cash (Asset) account From a69590b6092128763951b02df1201da1f3d8ba76 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:12:24 +0530 Subject: [PATCH 037/400] test: named column indices and Transfer-label coverage in Share Ledger --- .../report/share_ledger/test_share_ledger.py | 111 +++++++++++++++--- 1 file changed, 92 insertions(+), 19 deletions(-) diff --git a/erpnext/accounts/report/share_ledger/test_share_ledger.py b/erpnext/accounts/report/share_ledger/test_share_ledger.py index f7a96c06dae..51309bd9f94 100644 --- a/erpnext/accounts/report/share_ledger/test_share_ledger.py +++ b/erpnext/accounts/report/share_ledger/test_share_ledger.py @@ -8,6 +8,18 @@ from erpnext.tests.utils import ERPNextTestSuite COMPANY = "_Test Company" +# The report returns legacy positional columns (no fieldnames); name the indices once +# here so a column reorder needs a single edit instead of silently shifting assertions. +COL_SHAREHOLDER = 0 +COL_DATE = 1 +COL_TRANSFER_TYPE = 2 +COL_SHARE_TYPE = 3 +COL_NO_OF_SHARES = 4 +COL_RATE = 5 +COL_AMOUNT = 6 +COL_COMPANY = 7 +COL_SHARE_TRANSFER = 8 + class TestShareLedger(ERPNextTestSuite): def setUp(self): @@ -22,29 +34,32 @@ class TestShareLedger(ERPNextTestSuite): self.assertEqual(len(data), 2) first_row, second_row = data - self.assertEqual(first_row[0], self.shareholder) - self.assertEqual(first_row[1], frappe.utils.getdate("2026-06-01")) - self.assertEqual(first_row[2], "Issue") - self.assertEqual(first_row[3], "Equity") - self.assertEqual(first_row[4], 100) - self.assertEqual(first_row[5], 10) - self.assertEqual(first_row[6], 1000) - self.assertEqual(first_row[7], COMPANY) - self.assertEqual(first_row[8], self.first) + self.assertEqual(first_row[COL_SHAREHOLDER], self.shareholder) + self.assertEqual(first_row[COL_DATE], frappe.utils.getdate("2026-06-01")) + self.assertEqual(first_row[COL_TRANSFER_TYPE], "Issue") + self.assertEqual(first_row[COL_SHARE_TYPE], "Equity") + self.assertEqual(first_row[COL_NO_OF_SHARES], 100) + self.assertEqual(first_row[COL_RATE], 10) + self.assertEqual(first_row[COL_AMOUNT], 1000) + self.assertEqual(first_row[COL_COMPANY], COMPANY) + self.assertEqual(first_row[COL_SHARE_TRANSFER], self.first) - self.assertEqual(second_row[1], frappe.utils.getdate("2026-06-10")) - self.assertEqual(second_row[4], 50) - self.assertEqual(second_row[5], 12) - self.assertEqual(second_row[6], 600) - self.assertEqual(second_row[8], self.second) + self.assertEqual(second_row[COL_DATE], frappe.utils.getdate("2026-06-10")) + self.assertEqual(second_row[COL_NO_OF_SHARES], 50) + self.assertEqual(second_row[COL_RATE], 12) + self.assertEqual(second_row[COL_AMOUNT], 600) + self.assertEqual(second_row[COL_SHARE_TRANSFER], self.second) def test_running_balance_of_shares(self): data = self.run_report(shareholder=self.shareholder, date="2026-06-30") + # The ledger records each transfer's raw no_of_shares (always positive); it does + # not sign by direction. With only incoming "Issue" rows here, summing them is a + # valid running total. (Directional balances are the Share Balance report's job.) running = 0 balances = [] for row in data: - running += row[4] + running += row[COL_NO_OF_SHARES] balances.append(running) self.assertEqual(balances, [100, 150]) @@ -53,8 +68,40 @@ class TestShareLedger(ERPNextTestSuite): data = self.run_report(shareholder=self.shareholder, date="2026-06-05") self.assertEqual(len(data), 1) - self.assertEqual(data[0][8], self.first) - self.assertEqual(data[0][4], 100) + self.assertEqual(data[0][COL_SHARE_TRANSFER], self.first) + self.assertEqual(data[0][COL_NO_OF_SHARES], 100) + + def test_transfer_type_label_when_shareholder_is_seller(self): + buyer = self.create_shareholder("_Test Share Ledger Buyer") + transfer = self.make_transfer( + from_shareholder=self.shareholder, + to_shareholder=buyer, + date="2026-06-15", + from_no=1, + to_no=40, + rate=10, + ) + + row = self.transfer_row(self.run_report(shareholder=self.shareholder, date="2026-06-30"), transfer) + # seller side: the label names the counterparty it went "to" + self.assertEqual(row[COL_TRANSFER_TYPE], f"Transfer to {buyer}") + + def test_transfer_type_label_when_shareholder_is_buyer(self): + seller = self.create_shareholder("_Test Share Ledger Seller") + # the seller must own shares before it can transfer them + self.issue_shares(date="2026-06-12", from_no=201, to_no=300, rate=10, shareholder=seller) + transfer = self.make_transfer( + from_shareholder=seller, + to_shareholder=self.shareholder, + date="2026-06-15", + from_no=201, + to_no=240, + rate=10, + ) + + row = self.transfer_row(self.run_report(shareholder=self.shareholder, date="2026-06-30"), transfer) + # buyer side: the label names the counterparty it came "from" + self.assertEqual(row[COL_TRANSFER_TYPE], f"Transfer from {seller}") def test_missing_date_throws(self): self.assertRaises(frappe.ValidationError, execute, frappe._dict(shareholder=self.shareholder)) @@ -67,6 +114,11 @@ class TestShareLedger(ERPNextTestSuite): filters = frappe._dict({"company": COMPANY, **extra}) return execute(filters)[1] + def transfer_row(self, data, transfer_name): + row = next((r for r in data if r[COL_SHARE_TRANSFER] == transfer_name), None) + self.assertIsNotNone(row, f"Share Transfer {transfer_name} missing from ledger") + return row + def create_shareholder(self, title): doc = frappe.get_doc( { @@ -77,13 +129,34 @@ class TestShareLedger(ERPNextTestSuite): ).insert() return doc.name - def issue_shares(self, date, from_no, to_no, rate): + def issue_shares(self, date, from_no, to_no, rate, shareholder=None): doc = frappe.get_doc( { "doctype": "Share Transfer", "transfer_type": "Issue", "date": date, - "to_shareholder": self.shareholder, + "to_shareholder": shareholder or self.shareholder, + "share_type": "Equity", + "from_no": from_no, + "to_no": to_no, + "no_of_shares": to_no - from_no + 1, + "rate": rate, + "company": COMPANY, + "asset_account": "Cash - _TC", + "equity_or_liability_account": "Creditors - _TC", + } + ) + doc.submit() + return doc.name + + def make_transfer(self, from_shareholder, to_shareholder, date, from_no, to_no, rate): + doc = frappe.get_doc( + { + "doctype": "Share Transfer", + "transfer_type": "Transfer", + "date": date, + "from_shareholder": from_shareholder, + "to_shareholder": to_shareholder, "share_type": "Equity", "from_no": from_no, "to_no": to_no, From 18d194715464db2af8f6b89574cb5d2aaa9e1267 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:13:29 +0530 Subject: [PATCH 038/400] test: assert to_date upper bound and use assertIsNone in Bank Clearance Summary --- .../test_bank_clearance_summary.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py index c7781269f86..b44c3f987e0 100644 --- a/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py +++ b/erpnext/accounts/report/bank_clearance_summary/test_bank_clearance_summary.py @@ -37,7 +37,7 @@ class TestBankClearanceSummary(ERPNextTestSuite): self.assertIsNotNone(row, "Journal Entry not listed in Bank Clearance Summary") self.assertEqual(row[0], "Journal Entry") self.assertEqual(frappe.utils.getdate(row[2]), frappe.utils.getdate("2026-06-01")) - self.assertEqual(row[4], None) # clearance_date empty -> uncleared + self.assertIsNone(row[4]) # clearance_date empty -> uncleared self.assertEqual(row[5], "Sales - _TC") # against account self.assertEqual(row[6], 5000) # debit - credit on the bank account @@ -55,6 +55,10 @@ class TestBankClearanceSummary(ERPNextTestSuite): # Within range: present self.assertIsNotNone(self.find_row(self.run_report(), je.name)) - # Narrow window after the posting date: excluded - data = self.run_report(from_date="2026-07-01", to_date="2026-12-31") - self.assertIsNone(self.find_row(data, je.name)) + # Window entirely after the posting date (from_date lower bound): excluded + after = self.run_report(from_date="2026-07-01", to_date="2026-12-31") + self.assertIsNone(self.find_row(after, je.name)) + + # Window ending before the posting date (to_date upper bound): excluded + before = self.run_report(from_date="2026-01-01", to_date="2026-06-09") + self.assertIsNone(self.find_row(before, je.name)) From 7d8d1eaec788ff7002895ce5745550f51ecae259 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 14:15:38 +0530 Subject: [PATCH 039/400] test: submit overpaid payment for GL coverage and sync received_amount --- .../payment_entry/test_payment_entry.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index a24b8fad1bf..873d1f88632 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -261,7 +261,9 @@ class TestPaymentEntry(ERPNextTestSuite): "allocated_amount": pi2.outstanding_amount, }, ) - pe.paid_amount = pe.references[0].allocated_amount + pe.references[1].allocated_amount + pe.paid_amount = pe.received_amount = ( + pe.references[0].allocated_amount + pe.references[1].allocated_amount + ) pe.insert() pe.submit() @@ -276,15 +278,28 @@ class TestPaymentEntry(ERPNextTestSuite): pe.paid_amount = pe.references[0].allocated_amount + 200 # overpay -> 200 advance pe.received_amount = pe.paid_amount pe.insert() + pe.submit() + self.assertEqual(pe.docstatus, 1) self.assertEqual(pe.unallocated_amount, 200) + # end-to-end: submitting posts a balanced GL for the full paid amount (250 + # settling the invoice + 200 advance) + gl_entries = frappe.get_all( + "GL Entry", + filters={"voucher_no": pe.name, "is_cancelled": 0}, + fields=["debit", "credit"], + ) + self.assertTrue(gl_entries, "Submitted payment produced no GL entries") + self.assertEqual(flt(sum(e.debit for e in gl_entries)), flt(sum(e.credit for e in gl_entries))) + self.assertEqual(flt(sum(e.debit for e in gl_entries)), 450) + def test_overallocation_against_purchase_invoice_throws(self): pi = make_purchase_invoice() # outstanding 250 pe = get_payment_entry("Purchase Invoice", pi.name, bank_account="_Test Cash - _TC") pe.references[0].allocated_amount += 100 # 350 > 250 outstanding - pe.paid_amount = pe.references[0].allocated_amount + pe.paid_amount = pe.received_amount = pe.references[0].allocated_amount self.assertRaises(frappe.ValidationError, pe.insert) def test_payment_against_sales_invoice_to_check_status(self): From 0790d2e6df40e961719b48d1317abcab98d5ead8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:09:00 +0530 Subject: [PATCH 040/400] fix(manufacturing): include last-day records in Production Analytics `get_work_orders` bounded a BETWEEN on the datetime columns `creation` and `actual_end_date` with a bare date `to_date`, which MariaDB coerces to midnight. Work orders created after 00:00:00 on the period's last day were therefore dropped from the report (and made the new coverage test fail on month-end CI runs). Extend `to_date` to end of day. --- .../report/production_analytics/production_analytics.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/report/production_analytics/production_analytics.py b/erpnext/manufacturing/report/production_analytics/production_analytics.py index 9da87022e46..2fbd42210af 100644 --- a/erpnext/manufacturing/report/production_analytics/production_analytics.py +++ b/erpnext/manufacturing/report/production_analytics/production_analytics.py @@ -4,7 +4,7 @@ import frappe from frappe import _, scrub -from frappe.utils import getdate, today +from frappe.utils import get_datetime, getdate, today from erpnext.stock.report.stock_analytics.stock_analytics import ( get_period, @@ -31,7 +31,9 @@ def get_columns(period_columns): def get_work_orders(filters): from_date = filters.get("from_date") - to_date = filters.get("to_date") + # `creation` and `actual_end_date` are datetime columns, so a bare date upper + # bound would coerce to midnight and drop records created later on the last day. + to_date = get_datetime(filters.get("to_date")).replace(hour=23, minute=59, second=59) WorkOrder = frappe.qb.DocType("Work Order") From 08876ae07af5afce0912b348a104288f51e91795 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:32:13 +0530 Subject: [PATCH 041/400] test: Quotation Trends report coverage --- .../quotation_trends/test_quotation_trends.py | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 erpnext/selling/report/quotation_trends/test_quotation_trends.py diff --git a/erpnext/selling/report/quotation_trends/test_quotation_trends.py b/erpnext/selling/report/quotation_trends/test_quotation_trends.py new file mode 100644 index 00000000000..05b9c55e839 --- /dev/null +++ b/erpnext/selling/report/quotation_trends/test_quotation_trends.py @@ -0,0 +1,85 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.selling.doctype.quotation.test_quotation import make_quotation +from erpnext.selling.report.quotation_trends.quotation_trends import execute +from erpnext.tests.utils import ERPNextTestSuite + +FISCAL_YEAR = "_Test Fiscal Year 2026" +TXN_DATE = "2026-06-01" + + +class TestQuotationTrends(ERPNextTestSuite): + """The trends report buckets submitted Quotation quantities/amounts by period + (Yearly/Monthly) for the chosen `based_on` dimension (Item, Customer, ...).""" + + def run_report(self, **extra): + filters = frappe._dict( + { + "company": "_Test Company", + "fiscal_year": FISCAL_YEAR, + "based_on": "Item", + "period": "Yearly", + } + ) + filters.update(extra) + result = execute(filters) + columns, data = result[0], result[1] + labels = [c.split(":")[0] if isinstance(c, str) else c.get("label") for c in columns] + return labels, data + + def _cell(self, data, key_label, key_value, col_label, labels): + """Value at column `col_label` for the row whose `key_label` column equals + `key_value`, or 0 when that row doesn't exist yet.""" + key_idx = labels.index(key_label) + col_idx = labels.index(col_label) + for row in data: + if row[key_idx] == key_value: + return row[col_idx] or 0 + return 0 + + def test_yearly_item_amount_and_total(self): + # Yearly period => a single " (Qty)"/"(Amt)" bucket plus Total(Qty)/Total(Amt). + labels, before = self.run_report() + qty_col = f"{FISCAL_YEAR} (Qty)" + amt_col = f"{FISCAL_YEAR} (Amt)" + before_qty = self._cell(before, "Item", "_Test Item", qty_col, labels) + before_amt = self._cell(before, "Item", "_Test Item", amt_col, labels) + before_tot_qty = self._cell(before, "Item", "_Test Item", "Total(Qty)", labels) + before_tot_amt = self._cell(before, "Item", "_Test Item", "Total(Amt)", labels) + + make_quotation(item="_Test Item", qty=4, rate=200, transaction_date=TXN_DATE) + + labels, after = self.run_report() + self.assertEqual(self._cell(after, "Item", "_Test Item", qty_col, labels) - before_qty, 4) + self.assertEqual(self._cell(after, "Item", "_Test Item", amt_col, labels) - before_amt, 800) + self.assertEqual(self._cell(after, "Item", "_Test Item", "Total(Qty)", labels) - before_tot_qty, 4) + self.assertEqual(self._cell(after, "Item", "_Test Item", "Total(Amt)", labels) - before_tot_amt, 800) + + def test_monthly_lands_in_june_bucket(self): + # Monthly period => one bucket per month; a 2026-06-01 quotation hits "Jun (Qty)"/"(Amt)". + labels, before = self.run_report(period="Monthly") + before_jun_qty = self._cell(before, "Item", "_Test Item", "Jun (Qty)", labels) + before_may_qty = self._cell(before, "Item", "_Test Item", "May (Qty)", labels) + + make_quotation(item="_Test Item", qty=3, rate=100, transaction_date=TXN_DATE) + + labels, after = self.run_report(period="Monthly") + self.assertEqual(self._cell(after, "Item", "_Test Item", "Jun (Qty)", labels) - before_jun_qty, 3) + # nothing was quoted in May, so that bucket is unchanged + self.assertEqual(self._cell(after, "Item", "_Test Item", "May (Qty)", labels) - before_may_qty, 0) + + def test_based_on_customer_groups_amount_by_party(self): + # based_on Customer keys rows on the "Party" column (the customer id) + labels, before = self.run_report(based_on="Customer") + amt_col = f"{FISCAL_YEAR} (Amt)" + before_amt = self._cell(before, "Party", "_Test Customer", amt_col, labels) + + make_quotation( + party_name="_Test Customer", item="_Test Item", qty=2, rate=150, transaction_date=TXN_DATE + ) + + labels, after = self.run_report(based_on="Customer") + self.assertEqual(self._cell(after, "Party", "_Test Customer", amt_col, labels) - before_amt, 300) From 9865f636138d79cc9298b89cb72fd39031bc878d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:33:53 +0530 Subject: [PATCH 042/400] test: Customer-wise Item Price report coverage --- .../test_customer_wise_item_price.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 erpnext/selling/report/customer_wise_item_price/test_customer_wise_item_price.py diff --git a/erpnext/selling/report/customer_wise_item_price/test_customer_wise_item_price.py b/erpnext/selling/report/customer_wise_item_price/test_customer_wise_item_price.py new file mode 100644 index 00000000000..70181b19e79 --- /dev/null +++ b/erpnext/selling/report/customer_wise_item_price/test_customer_wise_item_price.py @@ -0,0 +1,69 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.selling.report.customer_wise_item_price.customer_wise_item_price import execute +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite + +PRICE_LIST = "Standard Selling" + + +class TestCustomerWiseItemPrice(ERPNextTestSuite): + """The report lists sales items with the selling rate from the customer's price + list and the available stock (summed across warehouses).""" + + def setUp(self): + self.item = make_item(properties={"is_stock_item": 1, "is_sales_item": 1}).name + self.customer = self.create_customer() + frappe.get_doc( + { + "doctype": "Item Price", + "item_code": self.item, + "price_list": PRICE_LIST, + "selling": 1, + "price_list_rate": 250, + } + ).insert() + make_stock_entry(item_code=self.item, to_warehouse="Stores - _TC", qty=10, rate=100) + + def create_customer(self): + name = "_Test CWIP Customer" + if not frappe.db.exists("Customer", name): + frappe.get_doc( + { + "doctype": "Customer", + "customer_name": name, + "customer_group": "_Test Customer Group", + "territory": "_Test Territory", + "default_price_list": PRICE_LIST, + } + ).insert() + return name + + def run_report(self, **extra): + filters = frappe._dict({"customer": self.customer}) + filters.update(extra) + return execute(filters)[1] + + def test_customer_filter_is_mandatory(self): + self.assertRaises(frappe.ValidationError, execute, frappe._dict({})) + + def test_selling_rate_and_available_stock_for_item(self): + rows = self.run_report(item=self.item) + + row = next((r for r in rows if r["item_code"] == self.item), None) + self.assertIsNotNone(row, "Sales item missing from report") + self.assertEqual(row["item_name"], frappe.db.get_value("Item", self.item, "item_name")) + self.assertEqual(row["selling_rate"], 250) # from the customer's price list + self.assertEqual(row["available_stock"], 10) # stocked into Stores - _TC + self.assertEqual(row["price_list"], PRICE_LIST) + + def test_item_filter_scopes_to_single_item(self): + other = make_item(properties={"is_stock_item": 1, "is_sales_item": 1}).name + + item_codes = {r["item_code"] for r in self.run_report(item=self.item)} + self.assertIn(self.item, item_codes) + self.assertNotIn(other, item_codes) From 55646667bebcbf9b9a96c3051dfa946ac13c559a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:36:47 +0530 Subject: [PATCH 043/400] test: Sales Person Commission Summary report coverage --- .../test_sales_person_commission_summary.py | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py diff --git a/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py b/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py new file mode 100644 index 00000000000..e807d33f506 --- /dev/null +++ b/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py @@ -0,0 +1,75 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.selling.report.sales_person_commission_summary.sales_person_commission_summary import ( + execute, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestSalesPersonCommissionSummary(ERPNextTestSuite): + """The report joins a sales document (Sales Invoice/Order/Delivery Note) with its + Sales Team rows, listing each sales person's contribution and commission.""" + + def setUp(self): + # reuse the bootstrap sales persons (under the "Sales Team" group) + self.sales_person = "_Test Sales Person" + + def make_invoice_with_commission(self, percentage=100, commission_rate=5, incentives=50): + si = create_sales_invoice(rate=1000, qty=1, do_not_save=True, posting_date="2026-06-01") + si.append( + "sales_team", + { + "sales_person": self.sales_person, + "allocated_percentage": percentage, + "commission_rate": commission_rate, + "incentives": incentives, + }, + ) + si.insert() + si.submit() + return si + + def run_report(self, **extra): + filters = frappe._dict( + {"company": "_Test Company", "doc_type": "Sales Invoice", "sales_person": self.sales_person} + ) + filters.update(extra) + return execute(filters)[1] + + def test_doc_type_is_mandatory(self): + self.assertRaises(frappe.ValidationError, execute, frappe._dict({"company": "_Test Company"})) + + def test_commission_row_matches_sales_team_entry(self): + si = self.make_invoice_with_commission(percentage=100, commission_rate=5, incentives=50) + team = si.sales_team[0] + + rows = self.run_report() + row = next((r for r in rows if r[0] == si.name), None) + self.assertIsNotNone(row, "Invoice with commission missing from report") + + # row: name, customer, territory, posting_date, base_net_amount, sales_person, + # allocated_percentage, commission_rate, allocated_amount, incentives + self.assertEqual(row[1], si.customer) + self.assertEqual(row[4], si.base_net_total) + self.assertEqual(row[5], self.sales_person) + self.assertEqual(row[6], team.allocated_percentage) + self.assertEqual(row[7], team.commission_rate) + self.assertEqual(row[8], team.allocated_amount) + self.assertEqual(row[9], team.incentives) + + def test_appends_total_row(self): + self.make_invoice_with_commission() + rows = self.run_report() + # the report appends a blank total row after the data rows + self.assertTrue(rows) + self.assertEqual(rows[-1], [""] * len(rows[0])) + + def test_sales_person_filter_scopes_rows(self): + si = self.make_invoice_with_commission() + + filtered = self.run_report(sales_person="_Test Sales Person 1") + self.assertNotIn(si.name, {r[0] for r in filtered if r[0]}) From 3092c920ff25b4cdffe0406270bad8bb4a2e16b1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:40:32 +0530 Subject: [PATCH 044/400] fix: pass only valid document filters in Sales Person-wise Transaction Summary --- .../sales_person_wise_transaction_summary.py | 65 ++++++++--------- ...t_sales_person_wise_transaction_summary.py | 69 +++++++++++++++++++ 2 files changed, 98 insertions(+), 36 deletions(-) create mode 100644 erpnext/selling/report/sales_person_wise_transaction_summary/test_sales_person_wise_transaction_summary.py diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py index f834f27df50..3616db44459 100644 --- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py +++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py @@ -183,8 +183,22 @@ def get_entries(filters): .as_("contribution_amt") ) + # Only pass valid document-field filters to get_query; report-specific keys such as + # doc_type / sales_person / item_group are handled separately below. + doc_filters = {"docstatus": 1} + for field in ["company", "customer", "territory"]: + if filters.get(field): + doc_filters[field] = filters.get(field) + + if filters.get("from_date") and filters.get("to_date"): + doc_filters[date_field] = ["between", [filters.get("from_date"), filters.get("to_date")]] + elif filters.get("from_date"): + doc_filters[date_field] = [">=", filters.get("from_date")] + elif filters.get("to_date"): + doc_filters[date_field] = ["<=", filters.get("to_date")] + query = ( - frappe.get_query(dt, filters=filters, ignore_permissions=False) + frappe.get_query(dt, filters=doc_filters, ignore_permissions=False) .join(dt_item) .on(dt.name == dt_item.parent) .join(st) @@ -203,48 +217,27 @@ def get_entries(filters): contribution_amt_case, ) .where(st.parenttype == doc_type) - .where(dt.docstatus == 1) ) + if filters.get("sales_person"): + lft, rgt = frappe.db.get_value("Sales Person", filters.get("sales_person"), ["lft", "rgt"]) + sp = frappe.qb.DocType("Sales Person") + query = query.where( + st.sales_person.isin(frappe.qb.from_(sp).select(sp.name).where((sp.lft >= lft) & (sp.rgt <= rgt))) + ) + + items = get_items(filters) + if items: + query = query.where(dt_item.item_code.isin([d[0] for d in items])) + elif filters.get("item_group") or filters.get("brand"): + # item_group/brand filter matched nothing -> no rows + return [] + query = query.orderby(st.sales_person).orderby(dt.name, order=frappe.qb.desc) return query.run(as_dict=True) -def get_conditions(filters, date_field): - conditions = [""] - values = [] - - for field in ["company", "customer", "territory"]: - if filters.get(field): - conditions.append(f"dt.{field}=%s") - values.append(filters[field]) - - if filters.get("sales_person"): - lft, rgt = frappe.get_value("Sales Person", filters.get("sales_person"), ["lft", "rgt"]) - conditions.append( - f"exists(select name from `tabSales Person` where lft >= {lft} and rgt <= {rgt} and name=st.sales_person)" - ) - - if filters.get("from_date"): - conditions.append(f"dt.{date_field}>=%s") - values.append(filters["from_date"]) - - if filters.get("to_date"): - conditions.append(f"dt.{date_field}<=%s") - values.append(filters["to_date"]) - - items = get_items(filters) - if items: - conditions.append("dt_item.item_code in (%s)" % ", ".join(["%s"] * len(items))) - values += items - else: - # return empty result, if no items are fetched after filtering on 'item group' and 'brand' - conditions.append("dt_item.item_code = Null") - - return " and ".join(conditions), values - - def get_items(filters): item = qb.DocType("Item") diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/test_sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/test_sales_person_wise_transaction_summary.py new file mode 100644 index 00000000000..2dbe8fee822 --- /dev/null +++ b/erpnext/selling/report/sales_person_wise_transaction_summary/test_sales_person_wise_transaction_summary.py @@ -0,0 +1,69 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.selling.report.sales_person_wise_transaction_summary.sales_person_wise_transaction_summary import ( + execute, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestSalesPersonWiseTransactionSummary(ERPNextTestSuite): + """Item-level summary joining a sales document with its Sales Team rows, showing + each sales person's contributed qty and amount per item line.""" + + def setUp(self): + self.sales_person = "_Test Sales Person" + + def make_invoice_with_commission(self, qty=5, rate=200, percentage=100): + si = create_sales_invoice( + item="_Test Item", qty=qty, rate=rate, do_not_save=True, posting_date="2026-06-01" + ) + si.append("sales_team", {"sales_person": self.sales_person, "allocated_percentage": percentage}) + si.insert() + si.submit() + return si + + def run_report(self, **extra): + filters = frappe._dict( + {"company": "_Test Company", "doc_type": "Sales Invoice", "sales_person": self.sales_person} + ) + filters.update(extra) + return execute(filters)[1] + + def test_doc_type_is_mandatory(self): + self.assertRaises(frappe.ValidationError, execute, frappe._dict({"company": "_Test Company"})) + + def test_invalid_doc_type_throws(self): + self.assertRaises( + frappe.ValidationError, + execute, + frappe._dict({"company": "_Test Company", "doc_type": "Purchase Invoice"}), + ) + + def test_item_line_contribution(self): + si = self.make_invoice_with_commission(qty=5, rate=200, percentage=100) + item = si.items[0] + + rows = self.run_report() + row = next((r for r in rows if r[0] == si.name and r[5] == "_Test Item"), None) + self.assertIsNotNone(row, "Invoice item line missing from report") + + # row: name, customer, territory, warehouse, posting_date, item_code, item_group, + # brand, stock_qty, base_net_amount, sales_person, allocated_percentage, + # contributed_qty, contribution_amt, currency + self.assertEqual(row[1], si.customer) + self.assertEqual(row[8], item.stock_qty) + self.assertEqual(row[9], item.base_net_amount) + self.assertEqual(row[10], self.sales_person) + self.assertEqual(row[11], 100) + self.assertEqual(row[12], item.stock_qty * 100 / 100) # contributed qty + self.assertEqual(row[13], item.base_net_amount * 100 / 100) # contribution amount + + def test_appends_total_row(self): + self.make_invoice_with_commission() + rows = self.run_report() + self.assertTrue(rows) + self.assertEqual(rows[-1], [""] * len(rows[0])) From f95baa54dec0e4be164279b370017f348c57ef91 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:42:07 +0530 Subject: [PATCH 045/400] test: Territory-wise Sales report coverage --- .../test_territory_wise_sales.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py diff --git a/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py b/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py new file mode 100644 index 00000000000..f2b81bfb633 --- /dev/null +++ b/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py @@ -0,0 +1,59 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.selling.doctype.quotation.test_quotation import make_quotation +from erpnext.selling.report.territory_wise_sales.territory_wise_sales import execute +from erpnext.tests.utils import ERPNextTestSuite + +TERRITORY = "_Test Territory" + + +class TestTerritoryWiseSales(ERPNextTestSuite): + """The report walks the Opportunity -> Quotation -> Sales Order -> Sales Invoice + funnel and totals each stage's amount per territory.""" + + def make_opportunity(self, amount=5000): + return frappe.get_doc( + { + "doctype": "Opportunity", + "opportunity_from": "Customer", + "party_name": "_Test Customer", + "territory": TERRITORY, + "company": "_Test Company", + "currency": "INR", + "opportunity_amount": amount, + "transaction_date": "2026-06-01", + } + ).insert() + + def make_quotation_for(self, opportunity, qty, rate): + qo = make_quotation(item="_Test Item", qty=qty, rate=rate, do_not_save=True) + qo.opportunity = opportunity.name + qo.insert() + qo.submit() + return qo + + def amount_for(self, territory, field): + for row in execute(frappe._dict({"company": "_Test Company"}))[1]: + if row["territory"] == territory: + return row[field] + return 0 + + def test_opportunity_amount_grouped_by_territory(self): + before = self.amount_for(TERRITORY, "opportunity_amount") + opp = self.make_opportunity(5000) + self.assertEqual(opp.territory, TERRITORY) + + after = self.amount_for(TERRITORY, "opportunity_amount") + self.assertEqual(after - before, 5000) + + def test_quotation_amount_flows_from_opportunity(self): + before = self.amount_for(TERRITORY, "quotation_amount") + + opp = self.make_opportunity() + quotation = self.make_quotation_for(opp, qty=2, rate=500) + + after = self.amount_for(TERRITORY, "quotation_amount") + self.assertEqual(after - before, quotation.base_grand_total) From 8d70385019fbede9fecfe55362039200b2b8c98a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:43:59 +0530 Subject: [PATCH 046/400] test: Territory Target Variance based on Item Group report coverage --- ...ory_target_variance_based_on_item_group.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py diff --git a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py new file mode 100644 index 00000000000..dd7cca771e3 --- /dev/null +++ b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py @@ -0,0 +1,71 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt, nowdate + +from erpnext.accounts.utils import get_fiscal_year +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.selling.report.territory_target_variance_based_on_item_group.territory_target_variance_based_on_item_group import ( + execute, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestTerritoryTargetVarianceBasedOnItemGroup(ERPNextTestSuite): + def setUp(self): + self.fiscal_year = get_fiscal_year(nowdate())[0] + + def test_achieved_target_and_variance(self): + distribution = create_target_distribution(self.fiscal_year) + territory = create_territory_with_target( + "_Test Target Territory", self.fiscal_year, distribution.name, target_qty=50 + ) + + # a Sales Order in that territory contributes to the achieved quantity + so = make_sales_order(rate=1000, qty=20, do_not_submit=True) + so.territory = territory.name + so.submit() + + result = execute( + frappe._dict( + { + "fiscal_year": self.fiscal_year, + "doctype": "Sales Order", + "period": "Yearly", + "target_on": "Quantity", + } + ) + )[1] + + rows = [frappe._dict(r) for r in result if r.get("territory") == territory.name] + self.assertTrue(rows, "Target territory missing from report") + achieved = sum(flt(r.total_achieved) for r in rows) + self.assertEqual(flt(rows[0].total_target, 2), 50) + self.assertEqual(flt(achieved, 2), 20) + self.assertEqual(flt(rows[0].total_variance, 2), -30) + + +def create_target_distribution(fiscal_year): + distribution = frappe.new_doc("Monthly Distribution") + distribution.distribution_id = "Target Report Distribution" + distribution.fiscal_year = fiscal_year + distribution.get_months() + return distribution.insert() + + +def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=50): + doc = frappe.new_doc("Territory") + doc.territory_name = name + doc.parent_territory = "All Territories" + doc.is_group = 0 + doc.append( + "targets", + { + "fiscal_year": fiscal_year, + "target_qty": target_qty, + "target_amount": 30000, + "distribution_id": distribution_id, + }, + ) + return doc.insert() From 6e57bd325f2b516888f0df420f432e53a67c0c0f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:45:50 +0530 Subject: [PATCH 047/400] test: Purchase Analytics report coverage --- .../test_purchase_analytics.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 erpnext/buying/report/purchase_analytics/test_purchase_analytics.py diff --git a/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py b/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py new file mode 100644 index 00000000000..2c6369a5880 --- /dev/null +++ b/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py @@ -0,0 +1,84 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt + +from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order +from erpnext.buying.report.purchase_analytics.purchase_analytics import execute +from erpnext.tests.utils import ERPNextTestSuite + +COMPANY = "_Test Company" +SUPPLIER = "_Test Supplier" +SUPPLIER_GROUP = "_Test Supplier Group" +# A historical window that ordinary test fixtures don't post into. +FROM_DATE = "2019-04-01" +TO_DATE = "2019-06-30" + + +class TestPurchaseAnalytics(ERPNextTestSuite): + """purchase_analytics reuses the shared Analytics engine; these tests lock its + wiring (doc_type=Purchase Order) across the Supplier Group / Item Group trees.""" + + def setUp(self): + frappe.set_user("Administrator") + + def _filters(self, **overrides): + filters = { + "doc_type": "Purchase Order", + "value_quantity": "Value", + "range": "Monthly", + "company": COMPANY, + "from_date": FROM_DATE, + "to_date": TO_DATE, + } + filters.update(overrides) + return frappe._dict(filters) + + def _rows(self, filters): + return {row["entity"]: row for row in execute(filters)[1]} + + def make_po(self, qty=4, rate=250): + return create_purchase_order( + company=COMPANY, supplier=SUPPLIER, qty=qty, rate=rate, transaction_date="2019-04-10" + ) + + def test_supplier_group_tree_rolls_up_to_root(self): + filters = self._filters(tree_type="Supplier Group") + base = self._rows(filters) + base_group = flt(base.get(SUPPLIER_GROUP, {}).get("total", 0.0)) + + po = self.make_po(qty=4, rate=250) + rows = self._rows(filters) + + # supplier is remapped to its group; the root sits at indent 0 + self.assertIn(SUPPLIER_GROUP, rows) + self.assertIn("All Supplier Groups", rows) + self.assertNotIn(SUPPLIER, rows) + self.assertEqual(rows["All Supplier Groups"]["indent"], 0) + + self.assertAlmostEqual(rows[SUPPLIER_GROUP]["total"] - base_group, flt(po.base_net_total), places=2) + self.assertGreaterEqual(flt(rows["All Supplier Groups"]["total"]), flt(po.base_net_total)) + + def test_item_group_tree_rolls_up_to_root(self): + item_group = frappe.db.get_value("Item", "_Test Item", "item_group") + filters = self._filters(tree_type="Item Group") + base = self._rows(filters) + base_group = flt(base.get(item_group, {}).get("total", 0.0)) + + po = self.make_po(qty=4, rate=250) + rows = self._rows(filters) + + self.assertIn(item_group, rows) + self.assertIn("All Item Groups", rows) + self.assertAlmostEqual(rows[item_group]["total"] - base_group, flt(po.base_net_total), places=2) + + def test_supplier_group_by_quantity(self): + filters = self._filters(tree_type="Supplier Group", value_quantity="Quantity") + base = self._rows(filters) + base_qty = flt(base.get(SUPPLIER_GROUP, {}).get("total", 0.0)) + + po = self.make_po(qty=7, rate=100) + rows = self._rows(filters) + + self.assertAlmostEqual(rows[SUPPLIER_GROUP]["total"] - base_qty, flt(po.total_qty), places=2) From 56e7690e640a891aec58e79e7957cb6e7d65c5e2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:47:57 +0530 Subject: [PATCH 048/400] test: Subcontract Order Summary report coverage --- .../test_subcontract_order_summary.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 erpnext/buying/report/subcontract_order_summary/test_subcontract_order_summary.py diff --git a/erpnext/buying/report/subcontract_order_summary/test_subcontract_order_summary.py b/erpnext/buying/report/subcontract_order_summary/test_subcontract_order_summary.py new file mode 100644 index 00000000000..e6e0922eaf2 --- /dev/null +++ b/erpnext/buying/report/subcontract_order_summary/test_subcontract_order_summary.py @@ -0,0 +1,49 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import add_days, today + +from erpnext.buying.report.subcontract_order_summary.subcontract_order_summary import execute +from erpnext.controllers.tests.test_subcontracting_controller import ( + get_subcontracting_order, + make_bom_for_subcontracted_items, + make_raw_materials, + make_service_items, + make_subcontracted_items, +) +from erpnext.tests.utils import ERPNextTestSuite + +FG_ITEM = "Subcontracted Item SA7" + + +class TestSubcontractOrderSummary(ERPNextTestSuite): + """The report lists Subcontracting Order finished items with their ordered and + received quantities within the transaction-date window.""" + + def setUp(self): + make_subcontracted_items() + make_raw_materials() + make_service_items() + make_bom_for_subcontracted_items() + + def run_report(self, **extra): + filters = frappe._dict( + {"company": "_Test Company", "from_date": add_days(today(), -1), "to_date": add_days(today(), 1)} + ) + filters.update(extra) + return execute(filters)[1] + + def test_subcontracting_order_is_listed(self): + sco = get_subcontracting_order() + + rows = [r for r in self.run_report(name=sco.name) if r.get("item_code") == FG_ITEM] + self.assertTrue(rows, "Subcontracting Order finished item missing from report") + self.assertEqual(rows[0]["qty"], 10) + self.assertEqual(rows[0]["received_qty"], 0) # nothing received yet + + def test_out_of_range_date_excludes_order(self): + sco = get_subcontracting_order() + + data = self.run_report(name=sco.name, from_date="2019-01-01", to_date="2019-01-31") + self.assertEqual(data, []) From 2a8d26c0a7e3ae336e70b64458e99fd8524e332d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:49:52 +0530 Subject: [PATCH 049/400] test: Supplier Quotation Comparison report coverage --- .../test_supplier_quotation_comparison.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py diff --git a/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py b/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py new file mode 100644 index 00000000000..7eaed09cd14 --- /dev/null +++ b/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py @@ -0,0 +1,62 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.buying.report.supplier_quotation_comparison.supplier_quotation_comparison import execute +from erpnext.tests.utils import ERPNextTestSuite + +COMPANY = "_Test Company" +ITEM = "_Test Item" + + +class TestSupplierQuotationComparison(ERPNextTestSuite): + """The report lists Supplier Quotation item lines so quotes for the same item can + be compared across suppliers.""" + + def make_quotation(self, supplier, qty, rate): + sq = frappe.get_doc( + { + "doctype": "Supplier Quotation", + "supplier": supplier, + "company": COMPANY, + "currency": "INR", + "transaction_date": "2026-06-01", + "items": [ + {"item_code": ITEM, "qty": qty, "rate": rate, "warehouse": "_Test Warehouse - _TC"} + ], + } + ) + sq.insert() + sq.submit() + return sq + + def run_report(self, **extra): + filters = frappe._dict({"company": COMPANY, "from_date": "2026-01-01", "to_date": "2026-12-31"}) + filters.update(extra) + return execute(filters)[1] + + def test_no_filters_returns_empty(self): + self.assertEqual(execute(None)[1], []) + + def test_quotation_line_listed_with_price(self): + sq = self.make_quotation("_Test Supplier", qty=10, rate=100) + + rows = [r for r in self.run_report(item_code=ITEM) if r.get("quotation") == sq.name] + self.assertTrue(rows, "Supplier Quotation line missing from report") + row = rows[0] + self.assertEqual(row["supplier_name"], "_Test Supplier") + self.assertEqual(row["qty"], 10) + self.assertEqual(row["base_rate"], 100) + self.assertEqual(row["base_amount"], 1000) + self.assertEqual(row["price_per_unit"], 100) + + def test_compares_multiple_suppliers_for_item(self): + sq1 = self.make_quotation("_Test Supplier", qty=10, rate=100) + sq2 = self.make_quotation("_Test Supplier 1", qty=10, rate=120) + + quotes = {r["quotation"]: r for r in self.run_report(item_code=ITEM) if r.get("quotation")} + self.assertIn(sq1.name, quotes) + self.assertIn(sq2.name, quotes) + self.assertEqual(quotes[sq1.name]["base_rate"], 100) + self.assertEqual(quotes[sq2.name]["base_rate"], 120) From 5514c64b7cb9a5ccbab6b1226a171a4bf21e6a16 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:51:22 +0530 Subject: [PATCH 050/400] test: Lead Owner Efficiency report coverage --- .../test_lead_owner_efficiency.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py diff --git a/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py b/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py new file mode 100644 index 00000000000..f1063c2e8e7 --- /dev/null +++ b/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py @@ -0,0 +1,70 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import add_days, today + +from erpnext.crm.report.lead_owner_efficiency.lead_owner_efficiency import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestLeadOwnerEfficiency(ERPNextTestSuite): + """Groups leads by their owner and counts the opportunity/quotation/order funnel + derived from those leads.""" + + def setUp(self): + # a unique owner keeps the per-owner counts isolated from other tests' leads + self.owner = self.make_user() + + def make_user(self): + email = f"lead_owner_{frappe.generate_hash(length=8)}@example.com" + frappe.get_doc( + {"doctype": "User", "email": email, "first_name": "Lead Owner", "send_welcome_email": 0} + ).insert() + return email + + def make_lead(self): + return frappe.get_doc( + { + "doctype": "Lead", + "lead_name": f"Lead {frappe.generate_hash(length=6)}", + "lead_owner": self.owner, + "company": "_Test Company", + } + ).insert() + + def run_report(self, **extra): + filters = frappe._dict({"from_date": add_days(today(), -1), "to_date": today()}) + filters.update(extra) + return execute(filters)[1] + + def owner_row(self, data): + return next((r for r in data if r["lead_owner"] == self.owner), None) + + def test_lead_count_grouped_by_owner(self): + self.make_lead() + self.make_lead() + + row = self.owner_row(self.run_report()) + self.assertIsNotNone(row, "Lead owner missing from report") + self.assertEqual(row["lead_count"], 2) + self.assertEqual(row["opp_count"], 0) + self.assertEqual(row["opp_lead"], 0.0) + + def test_opportunity_from_lead_is_counted(self): + lead = self.make_lead() + frappe.get_doc( + { + "doctype": "Opportunity", + "opportunity_from": "Lead", + "party_name": lead.name, + "company": "_Test Company", + "currency": "INR", + } + ).insert() + + row = self.owner_row(self.run_report()) + self.assertEqual(row["lead_count"], 1) + self.assertEqual(row["opp_count"], 1) + # one opportunity from one lead -> 100% opp/lead conversion + self.assertEqual(row["opp_lead"], 100.0) From c7fed2956953d500f5a4be9e12444f4ed6349f8c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:53:19 +0530 Subject: [PATCH 051/400] test: Project Summary report coverage --- .../project_summary/test_project_summary.py | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 erpnext/projects/report/project_summary/test_project_summary.py diff --git a/erpnext/projects/report/project_summary/test_project_summary.py b/erpnext/projects/report/project_summary/test_project_summary.py new file mode 100644 index 00000000000..9f0ef5c7a4a --- /dev/null +++ b/erpnext/projects/report/project_summary/test_project_summary.py @@ -0,0 +1,64 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.projects.report.project_summary.project_summary import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProjectSummary(ERPNextTestSuite): + """Lists projects with their total / completed / overdue task counts.""" + + def make_project(self): + return frappe.get_doc( + { + "doctype": "Project", + "project_name": f"_Test PS {frappe.generate_hash(length=6)}", + "company": "_Test Company", + } + ).insert() + + def make_task(self, project, status="Open"): + task = frappe.get_doc( + { + "doctype": "Task", + "subject": f"Task {frappe.generate_hash(length=6)}", + "project": project.name, + } + ).insert() + if status != "Open": + # set the status directly; the report counts tasks by their stored status + frappe.db.set_value("Task", task.name, "status", status) + return task + + def run_report(self, project): + return execute(frappe._dict({"name": project.name})) + + def project_row(self, project): + _columns, data, *_rest = self.run_report(project) + return next((r for r in data if r["name"] == project.name), None) + + def test_task_counts(self): + project = self.make_project() + self.make_task(project, "Completed") + self.make_task(project, "Completed") + self.make_task(project, "Open") + self.make_task(project, "Overdue") + + row = self.project_row(project) + self.assertIsNotNone(row, "Project missing from report") + self.assertEqual(row["total_tasks"], 4) + self.assertEqual(row["completed_tasks"], 2) + self.assertEqual(row["overdue_tasks"], 1) + + def test_report_summary_totals(self): + project = self.make_project() + self.make_task(project, "Completed") + self.make_task(project, "Open") + + report_summary = self.run_report(project)[4] + summary = {s["label"]: s["value"] for s in report_summary} + self.assertEqual(summary["Total Tasks"], 2) + self.assertEqual(summary["Completed Tasks"], 1) + self.assertEqual(summary["Overdue Tasks"], 0) From f9ac05f4a16324ef003a849852b2cfd6232fe35c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:54:55 +0530 Subject: [PATCH 052/400] test: Timesheet Billing Summary report coverage --- .../test_timesheet_billing_summary.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py diff --git a/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py b/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py new file mode 100644 index 00000000000..5526d5db01c --- /dev/null +++ b/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py @@ -0,0 +1,62 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet +from erpnext.projects.report.timesheet_billing_summary.timesheet_billing_summary import execute +from erpnext.setup.doctype.employee.test_employee import make_employee +from erpnext.tests.utils import ERPNextTestSuite + + +class TestTimesheetBillingSummary(ERPNextTestSuite): + """Lists submitted Timesheet Detail rows with working/billing hours and amount, + optionally grouped by date/project/employee.""" + + def setUp(self): + self.employee = make_employee("timesheet_billing@example.com", company="_Test Company") + self.project = frappe.get_doc( + { + "doctype": "Project", + "project_name": f"_Test TBS {frappe.generate_hash(length=6)}", + "company": "_Test Company", + } + ).insert() + + def make_ts(self, is_billable=1): + return make_timesheet( + self.employee, simulate=True, is_billable=is_billable, project=self.project.name + ) + + def run_report(self, **extra): + filters = frappe._dict({"company": "_Test Company", "employee": self.employee}) + filters.update(extra) + return execute(filters)[1] + + def test_billable_timesheet_row(self): + ts = self.make_ts(is_billable=1) + detail = ts.time_logs[0] + + rows = [r for r in self.run_report() if r.get("timesheet") == ts.name] + self.assertTrue(rows, "Timesheet missing from report") + row = rows[0] + self.assertEqual(row["hours"], 2) + self.assertEqual(row["billing_hours"], detail.billing_hours) + self.assertEqual(row["billing_amount"], detail.billing_amount) + self.assertEqual(row["project"], self.project.name) + + def test_group_by_project_sums_hours(self): + self.make_ts(is_billable=1) + + data = self.run_report(group_by="project") + group_rows = [r for r in data if r.get("is_group") and r.get("project") == self.project.name] + self.assertTrue(group_rows, "Grouped project row missing") + self.assertEqual(group_rows[0]["hours"], 2) + + def test_draft_excluded_unless_requested(self): + ts = make_timesheet(self.employee, is_billable=1, project=self.project.name, do_not_submit=True) + + # submitted-only by default: the draft timesheet is absent + self.assertNotIn(ts.name, {r.get("timesheet") for r in self.run_report()}) + # ... but included when draft timesheets are requested + self.assertIn(ts.name, {r.get("timesheet") for r in self.run_report(include_draft_timesheets=1)}) From 71f02d412a29f57abd4ac605ee374a6064373c0b Mon Sep 17 00:00:00 2001 From: pandiyan Date: Thu, 2 Jul 2026 16:56:34 +0530 Subject: [PATCH 053/400] fix: skip stock reservation for opted-out production plans --- .../purchase_receipt/services/reservation.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/services/reservation.py b/erpnext/stock/doctype/purchase_receipt/services/reservation.py index 8141ebb9ee5..6be9734d4f1 100644 --- a/erpnext/stock/doctype/purchase_receipt/services/reservation.py +++ b/erpnext/stock/doctype/purchase_receipt/services/reservation.py @@ -63,6 +63,13 @@ class PurchaseReceiptStockReservation: return production_plan_references = self.get_production_plan_references() + if not production_plan_references: + return + + reservable_plans = self.get_reservable_production_plans(production_plan_references) + if not reservable_plans: + return + production_plan_items = [] doc.reload() @@ -70,6 +77,9 @@ class PurchaseReceiptStockReservation: for row in doc.items: if row.material_request_item and row.material_request_item in production_plan_references: _ref = production_plan_references[row.material_request_item] + if _ref.production_plan not in reservable_plans: + continue + docnames.append(_ref.production_plan) row.update( { @@ -95,6 +105,25 @@ class PurchaseReceiptStockReservation: docnames, from_doctype="Production Plan", to_doctype="Work Order" ) + def get_reservable_production_plans(self, production_plan_references: frappe._dict) -> set: + """Production Plans that opted into stock reservation (``reserve_stock``). + + A Production Plan only gets this flag set if "Auto Reserve Stock" was enabled in + Stock Settings when it was created, or the user ticked "Reserve Stock" manually. + Without this check, a Purchase Receipt would auto-reserve stock for every + Production Plan whenever "Enable Stock Reservation" is on, ignoring both of those. + """ + plan_names = {ref.production_plan for ref in production_plan_references.values()} + return { + p.name + for p in frappe.get_all( + "Production Plan", + filters={"name": ["in", list(plan_names)]}, + fields=["name", "reserve_stock"], + ) + if p.reserve_stock + } + def get_production_plan_references(self) -> frappe._dict: production_plan_references = frappe._dict() material_request_items = [] From 820f5498e74ca206d54c83dc57acdec677cd9629 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Thu, 2 Jul 2026 16:56:44 +0530 Subject: [PATCH 054/400] test: cover reserve stock gating on purchase receipt submit --- .../production_plan/test_production_plan.py | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py index e720bd96319..ac2b38ea216 100644 --- a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py @@ -2322,6 +2322,145 @@ class TestProductionPlan(ERPNextTestSuite): self.assertEqual(len(reserved_entries), 0) frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 0) + def test_no_stock_reservation_via_purchase_receipt_when_reserve_stock_disabled(self): + from erpnext.buying.doctype.purchase_order.mapper import make_purchase_receipt + from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom + from erpnext.stock.doctype.material_request.mapper import make_purchase_order + + frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 1) + frappe.db.set_single_value("Stock Settings", "auto_reserve_stock", 0) + + bom_tree = {"FG For SR No Auto Reserve": {"RM For SR No Auto Reserve": {}}} + parent_bom = create_nested_bom(bom_tree, prefix="") + + warehouse = "_Test Warehouse - _TC" + + # reserve_stock is deliberately left unset (defaults to 0): this is what happens when + # "Auto Reserve Stock" is off and nobody ticks "Reserve Stock" on the Production Plan by hand. + plan = create_production_plan( + item_code=parent_bom.item, + planned_qty=5, + ignore_existing_ordered_qty=1, + do_not_submit=1, + warehouse=warehouse, + for_warehouse=warehouse, + ) + plan.get_sub_assembly_items() + plan.set("mr_items", []) + for d in get_items_for_material_requests(plan.as_dict()): + plan.append("mr_items", d) + plan.save() + + self.assertEqual(plan.reserve_stock, 0) + plan.submit() + + plan.submit_material_request = 1 + plan.make_material_request() + + material_requests = frappe.get_all( + "Material Request", filters={"production_plan": plan.name}, pluck="name" + ) + self.assertGreater(len(material_requests), 0) + + for mr_name in list(set(material_requests)): + po = make_purchase_order(mr_name) + po.supplier = "_Test Supplier" + po.submit() + + pr = make_purchase_receipt(po.name) + pr.submit() + + sre = StockReservation(plan) + reserved_entries = sre.get_reserved_entries("Production Plan", plan.name) + self.assertEqual(len(reserved_entries), 0) + + frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 0) + + def test_stock_reservation_ignores_production_plans_with_reserve_stock_off_on_shared_purchase_order(self): + from erpnext.buying.doctype.purchase_order.mapper import make_purchase_receipt + from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom + + frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 1) + frappe.db.set_single_value("Stock Settings", "auto_reserve_stock", 0) + + warehouse = "_Test Warehouse - _TC" + + bom_reserve = create_nested_bom({"FG SR Mixed Reserve": {"RM SR Mixed Reserve": {}}}, prefix="") + bom_skip = create_nested_bom({"FG SR Mixed Skip": {"RM SR Mixed Skip": {}}}, prefix="") + + def make_submitted_plan(item_code, reserve_stock): + plan = create_production_plan( + item_code=item_code, + planned_qty=5, + ignore_existing_ordered_qty=1, + do_not_submit=1, + warehouse=warehouse, + for_warehouse=warehouse, + reserve_stock=reserve_stock, + ) + plan.get_sub_assembly_items() + plan.set("mr_items", []) + for d in get_items_for_material_requests(plan.as_dict()): + plan.append("mr_items", d) + plan.save() + plan.submit() + plan.submit_material_request = 1 + plan.make_material_request() + return plan + + plan_reserve = make_submitted_plan(bom_reserve.item, reserve_stock=1) + plan_skip = make_submitted_plan(bom_skip.item, reserve_stock=0) + + self.assertEqual(plan_reserve.reserve_stock, 1) + self.assertEqual(plan_skip.reserve_stock, 0) + + mr_reserve = frappe.get_all( + "Material Request", filters={"production_plan": plan_reserve.name}, pluck="name" + )[0] + mr_skip = frappe.get_all( + "Material Request", filters={"production_plan": plan_skip.name}, pluck="name" + )[0] + + # One Purchase Order pulling rows from both Material Requests, so the Purchase Receipt made + # from it has both a reservable and a non-reservable Production Plan reference in `doc.items`. + po = frappe.new_doc("Purchase Order") + po.supplier = "_Test Supplier" + po.company = plan_reserve.company + po.schedule_date = nowdate() + + for mr_name in (mr_reserve, mr_skip): + mr = frappe.get_doc("Material Request", mr_name) + for item in mr.items: + po.append( + "items", + { + "item_code": item.item_code, + "qty": item.qty, + "rate": 100, + "schedule_date": nowdate(), + "warehouse": warehouse, + "material_request": mr.name, + "material_request_item": item.name, + }, + ) + + po.submit() + + pr = make_purchase_receipt(po.name) + pr.submit() + + reserved_for_plan_reserve = StockReservation(plan_reserve).get_reserved_entries( + "Production Plan", plan_reserve.name + ) + reserved_for_plan_skip = StockReservation(plan_skip).get_reserved_entries( + "Production Plan", plan_skip.name + ) + + self.assertGreater(len(reserved_for_plan_reserve), 0) + self.assertEqual(len(reserved_for_plan_skip), 0) + + frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 0) + def test_stock_reservation_restored_on_work_order_cancel(self): # Spec #5 (cancellation path): when a Work Order created from a Production Plan is cancelled, # the reservation that was transferred PP -> WO must flow back to the still-open Production From 3f9b8fe37ee8a9c4ba0d67c77b0e6446727bae11 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:03:32 +0530 Subject: [PATCH 055/400] test: reconcile negative-stock warehouses in reset_item_valuation_rate --- erpnext/manufacturing/doctype/bom/test_bom.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/bom/test_bom.py b/erpnext/manufacturing/doctype/bom/test_bom.py index 7797d819e39..2af6dbecb1a 100644 --- a/erpnext/manufacturing/doctype/bom/test_bom.py +++ b/erpnext/manufacturing/doctype/bom/test_bom.py @@ -881,8 +881,13 @@ def reset_item_valuation_rate(item_code, warehouse_list=None, qty=None, rate=Non warehouse_list = [warehouse_list] if not warehouse_list: + # Reconcile every warehouse the item has a non-zero balance in -- including + # negative balances left by other tests. `get_valuation_rate` averages + # Sum(stock_value)/Sum(actual_qty) across all bins, so a leftover negative + # balance in one warehouse can cancel the reset qty elsewhere and make the + # average collapse to 0, which is a source of flaky BOM-cost failures. warehouse_list = frappe.get_all( - "Bin", filters={"item_code": item_code, "actual_qty": [">", 0]}, pluck="warehouse" + "Bin", filters={"item_code": item_code, "actual_qty": ["!=", 0]}, pluck="warehouse" ) if not warehouse_list: From e0b0926dfff0f9105f5f4c57f116d1d4f28efd57 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:10:19 +0530 Subject: [PATCH 057/400] fix: only resolve items when item_group/brand filter is set --- .../sales_person_wise_transaction_summary.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py index 3616db44459..180740dcb6e 100644 --- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py +++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py @@ -226,12 +226,14 @@ def get_entries(filters): st.sales_person.isin(frappe.qb.from_(sp).select(sp.name).where((sp.lft >= lft) & (sp.rgt <= rgt))) ) - items = get_items(filters) - if items: + # only resolve items when an item_group/brand filter is set; otherwise get_items + # would return every item in the system and add a huge IN() clause on each run + if filters.get("item_group") or filters.get("brand"): + items = get_items(filters) + if not items: + # the item_group/brand filter matched nothing -> no rows + return [] query = query.where(dt_item.item_code.isin([d[0] for d in items])) - elif filters.get("item_group") or filters.get("brand"): - # item_group/brand filter matched nothing -> no rows - return [] query = query.orderby(st.sales_person).orderby(dt.name, order=frappe.qb.desc) From 5298438905df787aab07be7ce598a6e00a47ed6f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:11:37 +0530 Subject: [PATCH 058/400] test: also assert Jun amount bucket in Quotation Trends monthly test --- .../selling/report/quotation_trends/test_quotation_trends.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/selling/report/quotation_trends/test_quotation_trends.py b/erpnext/selling/report/quotation_trends/test_quotation_trends.py index 05b9c55e839..4ff03a5b53c 100644 --- a/erpnext/selling/report/quotation_trends/test_quotation_trends.py +++ b/erpnext/selling/report/quotation_trends/test_quotation_trends.py @@ -62,12 +62,15 @@ class TestQuotationTrends(ERPNextTestSuite): # Monthly period => one bucket per month; a 2026-06-01 quotation hits "Jun (Qty)"/"(Amt)". labels, before = self.run_report(period="Monthly") before_jun_qty = self._cell(before, "Item", "_Test Item", "Jun (Qty)", labels) + before_jun_amt = self._cell(before, "Item", "_Test Item", "Jun (Amt)", labels) before_may_qty = self._cell(before, "Item", "_Test Item", "May (Qty)", labels) make_quotation(item="_Test Item", qty=3, rate=100, transaction_date=TXN_DATE) labels, after = self.run_report(period="Monthly") self.assertEqual(self._cell(after, "Item", "_Test Item", "Jun (Qty)", labels) - before_jun_qty, 3) + # the amount path is a separate SUM(base_net_amount) case, so assert it too + self.assertEqual(self._cell(after, "Item", "_Test Item", "Jun (Amt)", labels) - before_jun_amt, 300) # nothing was quoted in May, so that bucket is unchanged self.assertEqual(self._cell(after, "Item", "_Test Item", "May (Qty)", labels) - before_may_qty, 0) From 2bab709ac442566c313d70c189d09fa9fb980074 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:12:58 +0530 Subject: [PATCH 059/400] test: scope date range, reload invoice, strengthen total-row check --- .../test_sales_person_commission_summary.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py b/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py index e807d33f506..b1385ca4f09 100644 --- a/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py +++ b/erpnext/selling/report/sales_person_commission_summary/test_sales_person_commission_summary.py @@ -31,11 +31,20 @@ class TestSalesPersonCommissionSummary(ERPNextTestSuite): ) si.insert() si.submit() + si.reload() # reflect any values recomputed on submit return si def run_report(self, **extra): filters = frappe._dict( - {"company": "_Test Company", "doc_type": "Sales Invoice", "sales_person": self.sales_person} + { + "company": "_Test Company", + "doc_type": "Sales Invoice", + "sales_person": self.sales_person, + # scope to this test's posting date so the query isn't unbounded over + # every invoice for the shared sales person + "from_date": "2026-06-01", + "to_date": "2026-06-01", + } ) filters.update(extra) return execute(filters)[1] @@ -64,8 +73,9 @@ class TestSalesPersonCommissionSummary(ERPNextTestSuite): def test_appends_total_row(self): self.make_invoice_with_commission() rows = self.run_report() - # the report appends a blank total row after the data rows - self.assertTrue(rows) + # the report appends a blank total row after one or more real data rows + self.assertGreaterEqual(len(rows), 2) + self.assertTrue(any(r[0] for r in rows[:-1]), "expected real data rows before the total row") self.assertEqual(rows[-1], [""] * len(rows[0])) def test_sales_person_filter_scopes_rows(self): From 087fb29d51f8e8a3bdced4a3b3287b28fc866720 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:13:42 +0530 Subject: [PATCH 060/400] test: narrow Territory-wise Sales docstring to covered stages --- .../report/territory_wise_sales/test_territory_wise_sales.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py b/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py index f2b81bfb633..8a069810b8d 100644 --- a/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py +++ b/erpnext/selling/report/territory_wise_sales/test_territory_wise_sales.py @@ -12,7 +12,10 @@ TERRITORY = "_Test Territory" class TestTerritoryWiseSales(ERPNextTestSuite): """The report walks the Opportunity -> Quotation -> Sales Order -> Sales Invoice - funnel and totals each stage's amount per territory.""" + funnel and totals each stage's amount per territory. + + These tests cover the Opportunity and Quotation stages; the Sales Order and + Sales Invoice (order_amount / billing_amount) stages are not yet exercised.""" def make_opportunity(self, amount=5000): return frappe.get_doc( From 08884056402bbbc7972d22a450bb1ca819622439 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:15:05 +0530 Subject: [PATCH 061/400] test: reuse shared distribution helper and assert a single territory row --- ...ory_target_variance_based_on_item_group.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py index dd7cca771e3..8c98a98bd7c 100644 --- a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py +++ b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py @@ -6,6 +6,9 @@ from frappe.utils import flt, nowdate from erpnext.accounts.utils import get_fiscal_year from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.selling.report.sales_person_target_variance_based_on_item_group.test_sales_person_target_variance_based_on_item_group import ( + create_target_distribution, +) from erpnext.selling.report.territory_target_variance_based_on_item_group.territory_target_variance_based_on_item_group import ( execute, ) @@ -38,20 +41,14 @@ class TestTerritoryTargetVarianceBasedOnItemGroup(ERPNextTestSuite): ) )[1] + # no item_group is set on the target, so the report emits exactly one row per + # territory -- assert all three figures against that single row rows = [frappe._dict(r) for r in result if r.get("territory") == territory.name] - self.assertTrue(rows, "Target territory missing from report") - achieved = sum(flt(r.total_achieved) for r in rows) - self.assertEqual(flt(rows[0].total_target, 2), 50) - self.assertEqual(flt(achieved, 2), 20) - self.assertEqual(flt(rows[0].total_variance, 2), -30) - - -def create_target_distribution(fiscal_year): - distribution = frappe.new_doc("Monthly Distribution") - distribution.distribution_id = "Target Report Distribution" - distribution.fiscal_year = fiscal_year - distribution.get_months() - return distribution.insert() + self.assertEqual(len(rows), 1, "expected exactly one row for the target territory") + row = rows[0] + self.assertEqual(flt(row.total_target, 2), 50) + self.assertEqual(flt(row.total_achieved, 2), 20) + self.assertEqual(flt(row.total_variance, 2), -30) def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=50): From 50b6f50b88d2ee9855999bab4ab0262591282991 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:16:20 +0530 Subject: [PATCH 062/400] test: assert root rollup and no item leak in Purchase Analytics --- .../report/purchase_analytics/test_purchase_analytics.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py b/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py index 2c6369a5880..35cd9ebac58 100644 --- a/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py +++ b/erpnext/buying/report/purchase_analytics/test_purchase_analytics.py @@ -71,14 +71,23 @@ class TestPurchaseAnalytics(ERPNextTestSuite): self.assertIn(item_group, rows) self.assertIn("All Item Groups", rows) + # the raw item code must not leak as its own entity; the root sits at indent 0 + self.assertNotIn("_Test Item", rows) + self.assertEqual(rows["All Item Groups"]["indent"], 0) self.assertAlmostEqual(rows[item_group]["total"] - base_group, flt(po.base_net_total), places=2) + self.assertGreaterEqual(flt(rows["All Item Groups"]["total"]), flt(po.base_net_total)) def test_supplier_group_by_quantity(self): filters = self._filters(tree_type="Supplier Group", value_quantity="Quantity") base = self._rows(filters) base_qty = flt(base.get(SUPPLIER_GROUP, {}).get("total", 0.0)) + base_root_qty = flt(base.get("All Supplier Groups", {}).get("total", 0.0)) po = self.make_po(qty=7, rate=100) rows = self._rows(filters) self.assertAlmostEqual(rows[SUPPLIER_GROUP]["total"] - base_qty, flt(po.total_qty), places=2) + # the quantity must roll up to the root too, not just the leaf group + self.assertAlmostEqual( + rows["All Supplier Groups"]["total"] - base_root_qty, flt(po.total_qty), places=2 + ) From 6591ae195d8790f22d5d202df7ed3ae9e8d65603 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 2 Jul 2026 17:38:14 +0530 Subject: [PATCH 063/400] fix(manufacturing): update work order status on partial pick-list transfer A stock entry created from a pick list has fg_completed_qty=0, so material_transferred_for_manufacturing is derived from the min-fraction of item-level transfers. When a pick list moves only some required items, the un-picked item stays at 0, which zeroes the aggregate and leaves the work order status at "not started" even though material is already in wip. Promote the status to "in process" when any raw material has been transferred via a pick list. material_transferred_for_manufacturing stays min-fraction based (0 correctly means no full finished good can be started yet). --- .../doctype/work_order/services/status.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/services/status.py b/erpnext/manufacturing/doctype/work_order/services/status.py index ce67978afd7..d22ee8bd937 100644 --- a/erpnext/manufacturing/doctype/work_order/services/status.py +++ b/erpnext/manufacturing/doctype/work_order/services/status.py @@ -132,7 +132,9 @@ class StatusService: status = ( "In Process" - if flt(self.doc.material_transferred_for_manufacturing) > 0 or self.doc.skip_transfer + if flt(self.doc.material_transferred_for_manufacturing) > 0 + or self.doc.skip_transfer + or self._has_transferred_material() else "Not Started" ) precision = frappe.get_precision("Work Order", "produced_qty") @@ -141,6 +143,26 @@ class StatusService: status = "Completed" return status + def _has_transferred_material(self): + """True if any raw material was transferred against this work order via a pick list + (these leave material_transferred_for_manufacturing at 0 via the min-fraction rule).""" + ste = frappe.qb.DocType("Stock Entry") + ste_child = frappe.qb.DocType("Stock Entry Detail") + qty = ( + frappe.qb.from_(ste) + .inner_join(ste_child) + .on(ste_child.parent == ste.name) + .select(Sum(ste_child.transfer_qty)) + .where( + (ste.work_order == self.doc.name) + & (ste.docstatus == 1) + & (ste.purpose == "Material Transfer for Manufacture") + & (ste.is_return == 0) + & (ste.pick_list.isnotnull()) + ) + ).run()[0][0] + return flt(qty) > 0 + def _is_partial_skip_transfer(self): return bool( self.doc.skip_transfer From f85f6be3cf1afa64e47b80ba4caad0c5d6e2175c Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 2 Jul 2026 17:39:23 +0530 Subject: [PATCH 064/400] test(manufacturing): add test to validate the work order status on partial pick-list transfer Cover the pick-list flow where a stock entry moves only one of the work order's required items: material_transferred_for_manufacturing stays 0 (min fraction) while the status must move to "in process". --- .../doctype/work_order/test_work_order.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index 0a4bbcddd2a..a101bb04b4d 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -1528,6 +1528,38 @@ class TestWorkOrder(ERPNextTestSuite): work_order.reload() self.assertEqual(work_order.material_transferred_for_manufacturing, 2.0) + def test_status_in_process_when_only_one_required_item_transferred(self): + """Stock Entry created from a Pick List that picked only one of the required items: + min-fraction keeps material_transferred_for_manufacturing at 0, but the work order must + still move to In Process because material is already in WIP.""" + from erpnext.manufacturing.doctype.work_order.mapper import create_pick_list + from erpnext.stock.doctype.pick_list.mapper import create_stock_entry + + work_order = make_wo_order_test_record( + planned_start_date=now(), qty=2, source_warehouse="Stores - _TC" + ) + test_stock_entry.make_stock_entry( + item_code="_Test Item", target="Stores - _TC", qty=10, basic_rate=5000.0 + ) + test_stock_entry.make_stock_entry( + item_code="_Test Item Home Desktop 100", target="Stores - _TC", qty=10, basic_rate=1000.0 + ) + + pick_list = create_pick_list(work_order.name, for_qty=work_order.qty) + # pick only _Test Item; the other required item is left out of this pick list + pick_list.pick_manually = 1 + pick_list.locations = [loc for loc in pick_list.locations if loc.item_code == "_Test Item"] + pick_list.save() + pick_list.submit() + + stock_entry = frappe.get_doc(create_stock_entry(pick_list.as_dict())) + self.assertEqual(stock_entry.fg_completed_qty, 0.0) + stock_entry.submit() + + work_order.reload() + self.assertEqual(work_order.material_transferred_for_manufacturing, 0.0) + self.assertEqual(work_order.status, "In Process") + def test_backflushed_batch_raw_materials_based_on_transferred(self): frappe.db.set_single_value( "Manufacturing Settings", From 5b738b7b0d21289569c92f0f3a85c7a57f3a2981 Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Thu, 2 Jul 2026 14:33:26 +0200 Subject: [PATCH 065/400] fix: don't attempt to create SABB for non-serialized / non-batch items (#56627) * fix: don't attempt to create SABB for non-serialized / non-batch items * fix(stock): skip serial batch lookup for rows without item code --- erpnext/stock/services/serial_batch_bundle_service.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/stock/services/serial_batch_bundle_service.py b/erpnext/stock/services/serial_batch_bundle_service.py index 29d732c1e32..2e752371ed5 100644 --- a/erpnext/stock/services/serial_batch_bundle_service.py +++ b/erpnext/stock/services/serial_batch_bundle_service.py @@ -176,6 +176,10 @@ class SerialBatchBundleService: parent_details = self.get_parent_details_for_packed_items() for row in self.doc.get(table_name): + item_code = row.get("rm_item_code") or row.get("item_code") + if not item_code or not self.is_serial_batch_item(item_code): + continue + if ( not via_landed_cost_voucher and row.serial_and_batch_bundle From caa4358057c9e22c32a81045b9ba5819442b5cc1 Mon Sep 17 00:00:00 2001 From: Shllokkk <140623894+Shllokkk@users.noreply.github.com> Date: Thu, 2 Jul 2026 19:33:16 +0530 Subject: [PATCH 066/400] fix: guard against missing DocType in onboarding steps patch (#56804) --- .../patches/v16_0/complete_onboarding_steps_for_older_sites.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py b/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py index 7230334266e..3f6e30bcbc5 100644 --- a/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py +++ b/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py @@ -34,6 +34,7 @@ def complete_onboarding_steps_if_record_exists(steps): if ( step.action == "Create Entry" and step.reference_document + and frappe.db.exists("DocType", step.reference_document) and frappe.get_all(step.reference_document, limit=1) ): frappe.db.set_value("Onboarding Step", step.name, "is_complete", 1, update_modified=False) From ceadc4f2696b6cad1991d8e425845469dbc8147c Mon Sep 17 00:00:00 2001 From: MochaMind Date: Thu, 2 Jul 2026 20:38:31 +0530 Subject: [PATCH 067/400] fix: sync translations from crowdin (#56673) --- erpnext/locale/bs.po | 545 ++++++++++++++++++++++--------------------- erpnext/locale/fa.po | 38 +-- erpnext/locale/hr.po | 545 ++++++++++++++++++++++--------------------- erpnext/locale/sv.po | 20 +- 4 files changed, 577 insertions(+), 571 deletions(-) diff --git a/erpnext/locale/bs.po b/erpnext/locale/bs.po index cf5e37e713c..681a4eddbc6 100644 --- a/erpnext/locale/bs.po +++ b/erpnext/locale/bs.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" "POT-Creation-Date: 2026-06-28 10:20+0000\n" -"PO-Revision-Date: 2026-06-28 20:03\n" +"PO-Revision-Date: 2026-07-01 20:39\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Bosnian\n" "MIME-Version: 1.0\n" @@ -269,7 +269,7 @@ msgstr "'Dozvoli višestruke Prodajne Naloge naspram Nabavnog Naloga Klijenta'" #: erpnext/controllers/trends.py:62 msgid "'Based On' and 'Group By' can not be the same" -msgstr "" +msgstr "'Na Osnovu' i 'Grupiraj Po' ne mogu biti isti" #: erpnext/selling/report/inactive_customers/inactive_customers.py:23 msgid "'Days Since Last Order' must be greater than or equal to zero" @@ -295,15 +295,15 @@ msgstr "'Od datuma' mora biti nakon 'Do datuma'" #: erpnext/stock/doctype/item/item.py:466 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" -msgstr "" +msgstr "'Ima Serijski Broj' ne može biti 'Da' za artikal koji nije na zalihama" #: erpnext/stock/doctype/quality_inspection/quality_inspection.py:145 msgid "'Inspection Required before Delivery' is disabled for the item {0}, no need to create the QI" -msgstr "" +msgstr "'Kontrola Obavezna prije Dostave' je onemogućena za artikal {0}, nema potrebe za kreiranjem Kontrole Kvaliteta" #: erpnext/stock/doctype/quality_inspection/quality_inspection.py:136 msgid "'Inspection Required before Purchase' is disabled for the item {0}, no need to create the QI" -msgstr "" +msgstr "'Kontrola Obavezna prije Nabave' je onemogućena za artikal {0}, nema potrebe za kreiranjem Kontrole Kvaliteta" #: erpnext/stock/report/stock_ledger/stock_ledger.py:684 #: erpnext/stock/report/stock_ledger/stock_ledger.py:725 @@ -323,7 +323,7 @@ msgstr "'Do Paketa Broj' ne može biti manje od 'Od Paketa Broj.'" #: erpnext/controllers/sales_and_purchase_return.py:80 msgid "'Update Stock' cannot be checked because items are not delivered via {0}" -msgstr "" +msgstr "'Ažuriraj Zalihe' ne se može provjeriti jer artikli nisu dostavljeni putem {0}" #: erpnext/accounts/doctype/sales_invoice/services/fixed_assets.py:46 msgid "'Update Stock' cannot be checked for fixed asset sale" @@ -827,7 +827,7 @@ msgstr "

Ne može se fakturisati više od predviđenog iznosa za sljedeće art #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:159 msgid "

Following {0}s do not belong to Company {1}:

" -msgstr "" +msgstr "

Slijedeći {0} ne pripadaju {1}:

" #. Content of the 'html_llwp' (HTML) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -1042,7 +1042,7 @@ msgstr "A - C" #: erpnext/selling/doctype/customer/customer.py:358 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" -msgstr "" +msgstr "Grupa Klijenta postoji sa istim imenom, preimenujte klijenta ili preimenujte Grupu Klijenta" #: erpnext/manufacturing/doctype/workstation/workstation.js:73 msgid "A Holiday List can be added to exclude counting these days for the Workstation." @@ -1054,7 +1054,7 @@ msgstr "Potencijalni Klijent zahtijeva ili ime osobe ili ime poduzeća" #: erpnext/stock/doctype/packing_slip/packing_slip.py:83 msgid "A Packing Slip can only be created for a Draft Delivery Note." -msgstr "" +msgstr "Nalog Pakovanja se može kreirati samo za nacrt Dostavnice." #: erpnext/accounts/services/gl_validator.py:123 msgid "A Period Closing Voucher is already submitted and an Opening Entry can no longer be created. {0} to learn more." @@ -1312,7 +1312,7 @@ msgstr "Pristupni ključ je potreban za davaoca usluga: {0}" #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:423 msgid "Access to Request for Quotation from the portal is disabled. To allow access, enable it in Portal Settings." -msgstr "" +msgstr "Pristup Zahtjevu za Ponudu sa portala je onemogućen. Da biste omogućili pristup, omogući ga u Postavkama Portala." #. Description of the 'Common Code' (Data) field in DocType 'UOM' #: erpnext/setup/doctype/uom/uom.json @@ -2062,7 +2062,7 @@ msgstr "Knjigovodstveni Period" #: erpnext/accounts/doctype/accounting_period/accounting_period.py:49 msgid "Accounting Period cannot be created for a future date. End Date {0} is after today." -msgstr "" +msgstr "Knjigovodstveni Period se ne može kreirati za budući datum. Datum završetka {0} je sutra." #: erpnext/accounts/doctype/accounting_period/accounting_period.py:77 msgid "Accounting Period overlaps with {0}" @@ -2921,7 +2921,7 @@ msgstr "Dodata uloga dobavljača korisniku {0}." #: erpnext/controllers/website_list_for_contact.py:311 msgid "Added {1} role to user {0}." -msgstr "" +msgstr "Dodana je uloga {1} korisniku {0}." #: erpnext/crm/doctype/lead/lead.js:81 msgid "Adding Lead to Prospect..." @@ -3183,7 +3183,7 @@ msgstr "Dodatna Prenesena Količina" #: erpnext/manufacturing/doctype/work_order/work_order.py:591 msgid "Additional Transferred Qty {0} cannot be greater than {1}. To fix this, increase the percentage value of the field 'Transfer Extra Raw Materials to WIP' in Manufacturing Settings." -msgstr "" +msgstr "Dodatna Prenesena Količina {0} ne može biti veća od {1}. Da biste ovo ispravili, povećajte procentualnu vrijednost 'Prenesi Dodatne Sirovine u Nedovršenu Proizvodnju' u Postavkama Proizvodnje." #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:630 msgid "Additional {0} {1} of item {2} required as per BOM to complete this transaction" @@ -3779,7 +3779,7 @@ msgstr "Algoritam" #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json msgid "Alias" -msgstr "" +msgstr "Nadimak" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 @@ -3989,7 +3989,7 @@ msgstr "Svi komentari i e-pošta kopirat će se iz jednog dokumenta u drugi novo #: erpnext/selling/page/point_of_sale/pos_past_order_summary.js:204 msgid "All the items have already been returned." -msgstr "" +msgstr "Svi artikli su već vraćeni." #: erpnext/manufacturing/doctype/work_order/work_order.js:1272 msgid "All the required items (raw materials) will be fetched from BOM and populated in this table. Here you can also change the Source Warehouse for any item. And during the production, you can track transferred raw materials from this table." @@ -3997,7 +3997,7 @@ msgstr "Svi obavezni Artikli (sirovine) bit će preuzeti iz Sastavnice i popunje #: erpnext/stock/doctype/delivery_note/mapper.py:82 msgid "All these items have already been invoiced/returned" -msgstr "" +msgstr "Svi ovi artikli su već fakturisani/vraćeni" #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js:100 #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js:101 @@ -4144,7 +4144,7 @@ msgstr "Dozvoli Alternativni Artikal" #: erpnext/stock/doctype/item_alternative/item_alternative.py:68 msgid "Allow Alternative Item must be checked on Item {0}" -msgstr "" +msgstr "Dozvoli Alternativni Artikal mora biti odabrano za Artikal {0}" #. Label of the material_consumption (Check) field in DocType 'Manufacturing #. Settings' @@ -4536,7 +4536,7 @@ msgstr "Dozvoljena Transakcija sa" #. Settings' #: erpnext/crm/doctype/crm_settings/crm_settings.json msgid "Allowed Users" -msgstr "" +msgstr "Dozvoljeni Korisnici" #: erpnext/accounts/doctype/party_link/party_link.py:27 msgid "Allowed primary roles are 'Customer' and 'Supplier'. Please select one of these roles only." @@ -5459,7 +5459,7 @@ msgstr "Termin s" #: erpnext/www/book_appointment/index.js:237 msgid "Appointment created successfully" -msgstr "" +msgstr "Termin je uspješno zakazan" #: erpnext/crm/doctype/appointment/appointment.py:101 msgid "Appointment was created. But no lead was found. Please check the email to confirm" @@ -5505,11 +5505,11 @@ msgstr "Jeste li sigurni da želite izbrisati sve demo podatke?" #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:51 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:100 msgid "Are you sure you want to create Reposting Entries?" -msgstr "" +msgstr "Jeste li sigurni da želite stvoriti ponovno knjiženje unosa?" #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js:66 msgid "Are you sure you want to create a Reposting Entry?" -msgstr "" +msgstr "Jeste li sigurni da želite stvoriti ponovno knjiženje unosa?" #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:480 msgid "Are you sure you want to delete this Item?" @@ -5603,7 +5603,7 @@ msgstr "Pošto ima dovoljno sirovina, Materijalni Nalog nije potreban za Skladi #: erpnext/stock/doctype/stock_settings/stock_settings.py:250 msgid "As there is reserved stock, you cannot disable {0}." -msgstr "" +msgstr "Pošto postoje rezervisane zalihe, ne možete onemogućiti {0}." #: erpnext/stock/doctype/stock_settings/stock_settings.py:224 #: erpnext/stock/doctype/stock_settings/stock_settings.py:236 @@ -6194,7 +6194,7 @@ msgstr "Dodijeli Imenu" #: erpnext/buying/doctype/purchase_order/purchase_order.js:593 #: erpnext/public/js/controllers/buying.js:555 msgid "Assigning {0} to {1} (row {2})" -msgstr "" +msgstr "Dodjeljuje se {0} {1} (red {2})" #. Label of the filters_section (Section Break) field in DocType 'Service Level #. Agreement' @@ -6220,7 +6220,7 @@ msgstr "U Redu {0}: U Serijskom i Šaržnom Paketu {1} mora imati status dokumen #: erpnext/accounts/services/internal_transfer.py:98 msgid "At Row {0}: The field {1} is mandatory for internal transfer" -msgstr "" +msgstr "U Redu {0}: Polje {1} je obavezno za interni prenos" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:85 msgid "At least one account with exchange gain or loss is required" @@ -6253,7 +6253,7 @@ msgstr "Najmanje jedno od Prodaje ili Nabave mora biti odabrano" #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:226 msgid "At least one raw material for Finished Good Item {0} should be customer provided." -msgstr "" +msgstr "Klijent treba da obezbijedi barem jednu sirovinu za gotov proizvod {0}." #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:60 msgid "At least one raw material item must be present in the stock entry for the type {0}" @@ -6293,7 +6293,7 @@ msgstr "Red {0}: Serijski Broj je obavezan za Artikal {1}" #: erpnext/stock/services/serial_batch_bundle_service.py:498 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." -msgstr "" +msgstr "U Redu {0}: Serijski i Šaržni Paket {1} je već stvoren. Uklonite vrijednosti iz polja za serijski ili šaržni broj." #: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:123 msgid "At row {0}: set Parent Row No for item {1}" @@ -6930,7 +6930,7 @@ msgstr "Sastavnica 1" #: erpnext/manufacturing/doctype/bom/mapper.py:82 msgid "BOM 1 {0} and BOM 2 {1} should not be the same" -msgstr "" +msgstr "Sastavnica 1 {0} i Sastavnica 2 {1} ne bi trebale biti iste" #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:38 msgid "BOM 2" @@ -7188,7 +7188,7 @@ msgstr "Rekurzija Sastavnice: {1} ne može biti nadređena ili podređena {0}" #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.js:81 msgid "BOM update is queued and may take a few minutes. Check {0} for progress." -msgstr "" +msgstr "Ažuriranje Sastavnice je u redu čekanja i može potrajati nekoliko minuta. Provjeri {0} za napredak." #: erpnext/manufacturing/doctype/bom/bom.py:1404 msgid "BOM {0} does not belong to Item {1}" @@ -7351,7 +7351,7 @@ msgstr "Sažetak Bilansa Stanja" #: erpnext/accounts/report/balance_sheet/balance_sheet.py:284 msgid "Balance Sheet requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Bilansa Stanja zahtijeva da se {0} sinhronizira s DuckDB-om" #: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary_header.html:13 msgid "Balance Stock Qty" @@ -7514,7 +7514,7 @@ msgstr "Tip Bankovnog Računa" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:443 msgid "Bank Account {0} in Bank Transaction {1} is not matching with Bank Account {2}" -msgstr "" +msgstr "Bankovni Račun {0} u Bankovnoj Transakciji {1} nije usklađen s Bankovnim Računom {2}" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:15 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:20 @@ -8096,7 +8096,7 @@ msgstr "Broj Šarže je obavezan" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3495 msgid "Batch No {0} does not exist" -msgstr "" +msgstr "Broj Šarže {0} ne postoji" #: erpnext/stock/utils.py:625 msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." @@ -8108,7 +8108,7 @@ msgstr "Broj Šarže {0} nije prisutan u originalnom {1} {2}, stoga ga ne možet #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:658 msgid "Batch No {0} of Item {1} has negative stock of quantity {2} in the warehouse {3}" -msgstr "" +msgstr "Broj Šarže {0} Artikla {1} ima negativnu količinu zaliha {2} u skladištu {3}" #. Label of the batch_no (Int) field in DocType 'BOM Update Batch' #: erpnext/manufacturing/doctype/bom_update_batch/bom_update_batch.json @@ -8177,7 +8177,7 @@ msgstr "Šarža i Serijski Broj" #: erpnext/manufacturing/doctype/work_order/work_order.py:742 msgid "Batch not created for item {0} since it does not have a batch series." -msgstr "" +msgstr "Šarža nije kreirana za artikal {0} jer nema Broj Šarže." #. Description of the 'Automatically Create New Batch' (Check) field in DocType #. 'Item' @@ -8765,7 +8765,7 @@ msgstr "Proknjižena Osnovna Imovina" #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" -msgstr "" +msgstr "Knjigovodstvo je zatvoreno do perioda koji se završava {0}" #. Option for the 'Type of Transaction' (Select) field in DocType 'Inventory #. Dimension' @@ -8993,7 +8993,7 @@ msgstr "Proračun se ne može dodijeliti naspram Grupnog Računu {0}" #: erpnext/accounts/doctype/budget/budget.py:165 msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" -msgstr "" +msgstr "Proračun se ne može dodijeliti za {0}, jer njegova kontna Klasa nije Prihod ili Rashod" #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" @@ -9347,7 +9347,7 @@ msgstr "Izračunata Razlika Popusta" #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:95 msgid "Calculating arrival times" -msgstr "" +msgstr "Izračunavanje vremena dolaska" #. Label of the section_break_11 (Section Break) field in DocType 'Supplier #. Scorecard Period' @@ -9565,7 +9565,7 @@ msgstr "Ne može se promijeniti način vrijednovanja, jer postoje transakcije na #: erpnext/stock/doctype/stock_settings/stock_settings.py:191 msgid "Can't change the valuation method, as there are transactions against some items which do not have their own valuation method" -msgstr "" +msgstr "Ne može se promijeniti način vrijednovanja, jer postoje transakcije naspram nekih artikala koji nemaju metod vrijednovanja" #: erpnext/support/doctype/warranty_claim/warranty_claim.py:79 msgid "Cancel Material Visit {0} before cancelling this Warranty Claim" @@ -9644,7 +9644,7 @@ msgstr "Ne može biti artikal fiksne imovine jer je kreiran Registar Zaliha." #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:92 #: erpnext/stock/doctype/delivery_trip/delivery_trip.py:219 msgid "Cannot calculate arrival time as the driver address is missing." -msgstr "" +msgstr "Ne može se izračunati vrijeme dolaska jer nedostaje adresa vozača." #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py:117 msgid "Cannot cancel Asset Depreciation Schedule {0} as it has a draft journal entry {1}." @@ -9656,7 +9656,7 @@ msgstr "Ne može se otkazati Unos Zatvaranja Kase" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:140 msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" -msgstr "" +msgstr "Ne može se otkazati Unos Rezervacije Zaliha {0}, jer je korišten u radnom nalogu {1}. Molimo prvo otkazati radni nalog ili otkloniti rezervaciju zaliha" #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 msgid "Cannot cancel as processing of cancelled documents is pending." @@ -9708,7 +9708,7 @@ msgstr "Nije moguće promijeniti standard valutu poduzeća, jer postoje postoje #: erpnext/projects/doctype/task/task.py:146 msgid "Cannot complete task {0} as its dependent task {1} is not completed / cancelled." -msgstr "" +msgstr "Ne može završiti zadatak {0} jer njegov zavisni zadatak {1} nije dovršen/poništen." #: erpnext/accounts/doctype/cost_center/cost_center.py:61 msgid "Cannot convert Cost Center to ledger as it has child nodes" @@ -9745,7 +9745,7 @@ msgstr "Nije moguće kreirati knjigovodstvene unose naspram onemogućenih račun #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:146 msgid "Cannot create more Subcontracting Orders against the Purchase Order {0}." -msgstr "" +msgstr "Ne može se stvoriti više Podugovornih Naloga na osnovu Naloga Nabave {0}." #: erpnext/controllers/sales_and_purchase_return.py:444 msgid "Cannot create return for consolidated invoice {0}." @@ -9840,7 +9840,7 @@ msgstr "Nije moguće spojiti {0} '{1}' u '{2}' jer oba imaju postojeće knjigovo #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:125 msgid "Cannot optimize route as the driver address is missing." -msgstr "" +msgstr "Ne može se optimizirati ruta jer nedostaje adresa vozača." #: erpnext/manufacturing/doctype/work_order/services/status.py:41 msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" @@ -9870,7 +9870,7 @@ msgstr "Ne može se upućivati na broj reda veći ili jednak trenutnom broju red #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:626 msgid "Cannot reserve more than Allowed Qty {0} {1} for Item {2} against {3} {4}.

The Allowed Qty is calculated as follows:
  • Actual Qty [Available Qty at Warehouse] = {5}
  • Reserved Stock [Ignore current SRE] = {6}
  • Available Qty To Reserve [Actual Qty - Reserved Stock] = {7}
  • Voucher Qty [Voucher Item Qty] = {8}
  • Delivered Qty [Qty delivered against the Voucher Item] = {9}
  • Total Reserved Qty [Qty reserved against the Voucher Item] = {10}
  • Allowed Qty [Minimum of (Available Qty To Reserve, (Voucher Qty - Delivered Qty - Total Reserved Qty))] = {11}
" -msgstr "" +msgstr "Ne može se rezervisati više od Dozvoljene Količine {0} {1} za artikal {2} prema {3} {4}.

Dozvoljena Količina se izračunava na sljedeći način:
  • Stvarna Količina [Dostupna Količina u Skladištu] = {5}
  • Rezervirana Zaliha [Ignoriši trenutni SRE] = {6}
  • Dostupna Količina za Rezervaciju [Stvarna Količina - Rezervirane Zalihe] = {7}
  • Količina Verifikata [Količina Artikal Verifikata] = {8}
  • Dostavljena Količina [Količina Dostavljena prema Artiklu Verifikata] = {9}
  • Ukupna Rezervirana Količina [Količina Rezervirana po Artiklu Verifikata] = {10}
  • Dozvoljena Količina [Minimum od (Količina Dostupna za Rezervaciju, (Količina Verifikata - Dostavljena Količina - Ukupna Rezervisana Količina))] = {11}
" #: erpnext/accounts/doctype/bank/bank.js:63 msgid "Cannot retrieve link token for update. Check Error Log for more information" @@ -9895,7 +9895,7 @@ msgstr "Nije moguće odabrati tip naknade kao 'Iznos na Prethodnom Redu' ili 'Uk #: erpnext/stock/doctype/item_alternative/item_alternative.py:36 msgid "Cannot set alternative item for the item {0}" -msgstr "" +msgstr "Ne može se postaviti alternativni artikal za artikal. {0}" #: erpnext/selling/doctype/quotation/quotation.py:293 msgid "Cannot set as Lost as Sales Order is made." @@ -10325,7 +10325,7 @@ msgstr "Ručno promijenite ovaj datum da postavite sljedeći datum početka sinh #: erpnext/selling/doctype/customer/customer.py:161 msgid "Changed customer name to '{0}' as '{1}' already exists." -msgstr "" +msgstr "Ime klijenta je promijenjeno u '{0}' jer '{1}' već postoji." #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:160 msgid "Changes in {0}" @@ -10615,7 +10615,7 @@ msgstr "Podređena tabela nije dozvoljena" #: erpnext/projects/doctype/task/task.py:319 msgid "Child Task exists for this Task. You cannot delete this Task." -msgstr "" +msgstr "Podređeni Zadatak postoji za ovaj Zadatak. Ne možete izbrisati ovaj Zadatak." #: erpnext/stock/doctype/warehouse/warehouse_tree.js:21 msgid "Child nodes can be only created under 'Group' type nodes" @@ -11795,11 +11795,11 @@ msgstr "Naziv polja za link poduzeća koji se koristi za filtriranje (opciono - #: erpnext/setup/doctype/company/company.js:239 msgid "Company name does not match" -msgstr "" +msgstr "Naziv poduzeća ne odgovara" #: erpnext/assets/doctype/asset/asset.py:330 msgid "Company of asset {0} and purchase document {1} does not match." -msgstr "" +msgstr "Poduzeće imovine {0} i nabavni dokument {1} ne odgovara." #: erpnext/setup/doctype/employee/employee.py:164 msgid "Company or Personal Email is mandatory when 'Create User Automatically' is enabled" @@ -11839,11 +11839,11 @@ msgstr "Poduzeće {0} ne postoji" #: erpnext/setup/setup_wizard/operations/taxes_setup.py:14 msgid "Company {0} does not exist yet. Taxes setup aborted." -msgstr "" +msgstr "Poduzeće {0} još ne postoji. Postavljanje Pdv-a je prekinuto." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:579 msgid "Company {0} does not match with POS Profile Company {1}" -msgstr "" +msgstr "Poduzeće {0} nije usklađeno s Kasa Profilom {1}" #: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py:105 msgid "Company {0} is added more than once" @@ -12319,7 +12319,7 @@ msgstr "Potrošena Količina" #: erpnext/manufacturing/doctype/work_order/services/reservation.py:186 msgid "Consumed Qty {0} cannot be greater than Reserved Qty {1} for item {2}" -msgstr "" +msgstr "Potrošena Količina {0} ne može biti veća od Rezervisane Količine {1} za artikal {2}" #. Label of the consumed_quantity (Data) field in DocType 'Asset Repair #. Consumed Item' @@ -13052,11 +13052,11 @@ msgstr "Centar Troškova {0} ne može se koristiti za dodjelu jer se koristi kao #: erpnext/assets/doctype/asset/asset.py:358 msgid "Cost Center {0} does not belong to Company {1}" -msgstr "" +msgstr "Centar Troškova {0} ne pripada {1}" #: erpnext/assets/doctype/asset/asset.py:365 msgid "Cost Center {0} is a group cost center and group cost centers cannot be used in transactions" -msgstr "" +msgstr "Centar Troškova {0} je grupni centar troškova a grupni centri troškova ne mogu se koristiti u transakcijama" #: erpnext/accounts/report/financial_statements.py:685 msgid "Cost Center: {0} does not exist" @@ -13181,7 +13181,7 @@ msgstr "Obračun Troškova i Fakturisanje" #: erpnext/projects/doctype/project/project.js:140 msgid "Costing and Billing fields have been updated" -msgstr "" +msgstr "Polja Troškova i Fakturisanje su ažurirana" #: erpnext/setup/demo.py:78 msgid "Could Not Delete Demo Data" @@ -13210,7 +13210,7 @@ msgstr "Nije moguće pronaći odgovarajuću promjenu koja bi odgovarala razlici: #: erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py:46 #: erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py:50 msgid "Could not find path for {0}" -msgstr "" +msgstr "Nije moguće pronaći putanju za {0}" #: banking/src/components/features/BankStatementImporter/PDF/PDFTableEditor.tsx:101 msgid "Could not re-extract the table." @@ -14335,7 +14335,7 @@ msgstr "Trenutna Sastavnica" #: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 msgid "Current BOM and New BOM cannot be the same" -msgstr "" +msgstr "Trenutna i Nova Sastavnica ne mogu biti iste" #. Label of the current_exchange_rate (Float) field in DocType 'Exchange Rate #. Revaluation Account' @@ -17059,11 +17059,11 @@ msgstr "Račun Razlike u Postavkama Artikla" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:155 msgid "Difference Account must be an Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" -msgstr "" +msgstr "Razlika u računu mora biti tip računa Imovine/Obaveza (Privremeno Početno), budući da je ovaj unos zaliha početni unos" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:985 msgid "Difference Account must be an Asset/Liability type account, since this Stock Reconciliation is an Opening Entry" -msgstr "" +msgstr "Račun razlike mora biti račun tipa Imovina/Obaveze, budući da je ovo usklađivanje Zaliha Početni Unos" #. Label of the difference_amount (Currency) field in DocType 'Payment #. Reconciliation Allocation' @@ -17309,7 +17309,7 @@ msgstr "Onemogućeni artikli se ne mogu odabrati ni u jednoj transakciji." #: erpnext/accounts/services/internal_transfer.py:120 msgid "Disabled pricing rules since this {0} is an internal transfer" -msgstr "" +msgstr "Pravila određivanja cijena su onemogućena jer je ovo {0} interni prijenos" #. Description of the 'Disabled' (Check) field in DocType 'Supplier' #: erpnext/buying/doctype/supplier/supplier.json @@ -17318,7 +17318,7 @@ msgstr "Onemogućeni dobavljači su skriveni od odabira u novim transakcijama, a #: erpnext/accounts/services/internal_transfer.py:136 msgid "Disabled tax included prices since this {0} is an internal transfer" -msgstr "" +msgstr "Cijene bez PDV-a budući da je ovo {0} interni prijenos" #: erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py:82 msgid "Disabled template must not be default template" @@ -17569,7 +17569,7 @@ msgstr "Popust mora biti manji od 100%" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:3090 msgid "Discount of {0} applied as per Payment Term" -msgstr "" +msgstr "Popust od {0} primjenjen prema Uslovima Plaćanja" #. Label of the section_break_18 (Section Break) field in DocType 'Pricing #. Rule' @@ -17934,7 +17934,7 @@ msgstr "Želiš li podnijeti unos zaliha?" #: erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py:50 #: erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py:22 msgid "DocType can be one of {0}" -msgstr "" +msgstr "DocType može biti jedan od {0}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:182 #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:458 @@ -18659,7 +18659,7 @@ msgstr "Verifikacija e-pošte nije uspjela." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:20 msgid "Emails queued" -msgstr "" +msgstr "E-pošta u redu čekanja" #. Label of the emergency_contact_details (Section Break) field in DocType #. 'Employee' @@ -18938,7 +18938,7 @@ msgstr "Omogući Evropski Pristup" #. 'CRM Settings' #: erpnext/crm/doctype/crm_settings/crm_settings.json msgid "Enable Frappe CRM Data Synchronization" -msgstr "" +msgstr "Omogući sinhronizaciju podataka Prodajne Podrške" #. Label of the enable_fuzzy_matching (Check) field in DocType 'Accounts #. Settings' @@ -19397,7 +19397,7 @@ msgstr "Unesi {0} iznos." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:170 msgid "Enter {0} name." -msgstr "" +msgstr "Unesi {0} ime." #: erpnext/setup/setup_wizard/data/industry_type.txt:22 msgid "Entertainment & Leisure" @@ -19496,15 +19496,15 @@ msgstr "Greška prilikom ponovnog knjiženja vrijednosti artikla" #: erpnext/assets/doctype/asset_depreciation_schedule/deppreciation_schedule_controller.py:175 msgid "Error: This asset already has {0} depreciation periods booked. The `depreciation start` date must be at least {1} periods after the `available for use` date. Please correct the dates accordingly." -msgstr "" +msgstr "Greška: Ova imovina već ima uknjiženih {0} perioda amortizacije. Datum `početka amortizacije` mora biti najmanje {1} perioda nakon datuma `dostupno za upotrebu`. Molimo vas da ispravite datume u skladu s tim." #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py:93 msgid "Error: {0}" -msgstr "" +msgstr "Greška: {0}" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:980 msgid "Error: {0} is a mandatory field" -msgstr "" +msgstr "Greška: {0} je obavezno polje" #. Label of the errors_notification_section (Section Break) field in DocType #. 'Stock Reposting Settings' @@ -20197,7 +20197,7 @@ msgstr "Neuspješni Unosi" #: erpnext/utilities/doctype/video_settings/video_settings.py:35 msgid "Failed to authenticate the API key. Please check the error logs." -msgstr "" +msgstr "Autentifikacija API ključa nije uspjela. Molimo provjerite zapise o greškama." #: erpnext/setup/setup_wizard/setup_wizard.py:37 #: erpnext/setup/setup_wizard/setup_wizard.py:38 @@ -21176,11 +21176,11 @@ msgstr "Za Radni Nalog" #: erpnext/controllers/status_updater.py:292 msgid "For an item {0}, quantity must be a negative number" -msgstr "" +msgstr "Za Artikal {0}, količina mora biti negativan broj" #: erpnext/controllers/status_updater.py:289 msgid "For an item {0}, quantity must be a positive number" -msgstr "" +msgstr "Za Artikal {0}, količina mora biti pozitivan broj" #. Description of the 'Income Account' (Link) field in DocType 'Dunning' #: erpnext/accounts/doctype/dunning/dunning.json @@ -21214,11 +21214,11 @@ msgstr "Za individualnog Dobavljača" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:379 msgid "For item {0}, only {1} assets have been created or linked to {2}. Please create or link {3} more assets with the respective document." -msgstr "" +msgstr "Za artikal {0}, samo {1} imovina je stvorena ili povezana s {2}. Stvori ili poveži još {3} imovine s odgovarajućim dokumentom." #: erpnext/controllers/status_updater.py:302 msgid "For item {0}, rate must be a positive number. To allow negative rates, enable {1} in {2}" -msgstr "" +msgstr "Za artikal {0}, cijena mora biti pozitivan broj. Da biste omogućili negativne cijene, omogućite {1} u {2}" #. Description of the 'Do not fetch incoming rate from Serial No' (Check) field #. in DocType 'Stock Reposting Settings' @@ -21232,7 +21232,7 @@ msgstr "Za operaciju {0} u redu {1}, molimo dodajte sirovine ili postavite Sasta #: erpnext/manufacturing/doctype/work_order/mapper.py:379 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity ({2})" -msgstr "" +msgstr "Za Operaciju {0}: Količina ({1}) ne može biti veća od količine na čekanju ({2})" #: erpnext/projects/doctype/project/project.js:208 msgid "For project - {0}, update your status" @@ -21278,7 +21278,7 @@ msgstr "Za praktičnost Klienta, ovi kodovi se mogu koristiti u formatima za isp #: erpnext/stock/serial_batch_bundle.py:1234 msgid "For the item {0}, the Available qty {1} is less than the Required Qty {2} in the warehouse {3}. Please add sufficient qty in the warehouse." -msgstr "" +msgstr "Za artikal {0}, Dostupna količina {1} je manja od Potrebne količine {2} u skladištu {3}. Dodaj dovoljnu količinu u skladište." #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:893 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." @@ -21381,11 +21381,11 @@ msgstr "Podrška Prodaje" #. Name of a DocType #: erpnext/crm/doctype/frappe_crm_allowed_user/frappe_crm_allowed_user.json msgid "Frappe CRM Allowed User" -msgstr "" +msgstr "Dozvoljeni korisnik Prodajne Podrške" #: erpnext/crm/frappe_crm_api.py:168 msgid "Frappe CRM data synchronization is not enabled on ERPNext. Contact System Manager of ERPNext." -msgstr "" +msgstr "Sinhronizacija podataka Prodajne Podrške nije omogućena na Sistemu. Kontaktiraj Odgovornog Sistema." #: erpnext/setup/install.py:232 msgid "Frappe School" @@ -22057,7 +22057,7 @@ msgstr "Dužina napomena Knjigovodstvenog Registra" #: erpnext/accounts/report/general_ledger/general_ledger.py:829 msgid "General Ledger requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Knjigovodstveni Registar zahtijeva da se {0} sinhronizira sa DuckDB-om" #. Label of the gs (Section Break) field in DocType 'Item Group' #: erpnext/setup/doctype/item_group/item_group.json @@ -24098,7 +24098,7 @@ msgstr "Uvezi Fakture" #. Import' #: erpnext/accounts/doctype/bank_statement_import/bank_statement_import.json msgid "Import MT940 Format" -msgstr "" +msgstr "Uvezi MT940 Format" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:144 msgid "Import Successful" @@ -25495,7 +25495,7 @@ msgstr "Nevažeće Skladište" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:460 msgid "Invalid amount in accounting entries of {0} {1} for Account {2}: {3}" -msgstr "" +msgstr "Nevažeći iznos u knjigovodstvenim unosima {0} {1} za račun {2}: {3}" #: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:312 msgid "Invalid condition expression" @@ -27846,7 +27846,7 @@ msgstr "Artikal {0} se nemože naručiti više od {1} u odnosu na Ugovorni Nalog #: erpnext/stock/services/internal_transfer.py:104 msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" -msgstr "" +msgstr "Artikal {0} ne može biti primljen u količini većoj od {1} u odnosu na {2} {3}" #: erpnext/assets/doctype/asset/asset.py:343 #: erpnext/stock/doctype/item/item.py:693 @@ -27892,7 +27892,7 @@ msgstr "Artikal {0} zanemaren jer nije artikal na zalihama" #: erpnext/stock/get_item_details.py:359 msgid "Item {0} is a template, please select one of its variants" -msgstr "" +msgstr "Artikal {0} je šablon, molimo odaberite jednu od njenih varijanti" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:614 msgid "Item {0} is already reserved/delivered against Sales Order {1}." @@ -28010,7 +28010,7 @@ msgstr "Artikal: {0} ne postoji u sistemu" #: erpnext/manufacturing/doctype/bom/bom.py:970 msgid "Item: {0} with Stock UOM: {1} cannot have fractional process loss qty as UOM {2} is a whole number." -msgstr "" +msgstr "Artikal: {0} sa Jedinicom Zalihe: {1} ne može imati količinu frakcijskog gubitka procesa jer je jedinica mjere {2} cijeli broj." #. Label of a Card Break in the Buying Workspace #. Label of a Workspace Sidebar Item @@ -28217,7 +28217,7 @@ msgstr "Radne Kartice {0} je završen" #: erpnext/manufacturing/doctype/job_card/job_card.py:1416 msgid "Job Card {0}: As per the sequence of the operations in the work order {1}, complete the operation {2} before the operation {3}." -msgstr "" +msgstr "Radna Kartica {0}: Prema redoslijedu operacija u radnom nalogu {1}, dovršite operaciju {2} prije operacije {3}." #. Label of the dashboard_tab (Tab Break) field in DocType 'Workstation' #: erpnext/manufacturing/doctype/workstation/workstation.json @@ -28292,11 +28292,11 @@ msgstr "Radna Kartica {0} kreirana" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:106 msgid "Job paused" -msgstr "" +msgstr "Posao pauziran" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:64 msgid "Job started" -msgstr "" +msgstr "Posao započet" #: erpnext/utilities/bulk_transaction.py:72 msgid "Job: {0} has been triggered for processing failed transactions" @@ -28645,7 +28645,7 @@ msgstr "Prošla Fiskalna Godina" #: erpnext/accounts/doctype/account/account.py:673 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." -msgstr "" +msgstr "Posljednje ažuriranje Knjigovodstvenog Registra je obavljeno {0}. Ova operacija nije dozvoljena dok se sistem aktivno koristi. Pričekaj 5 minuta prije ponovnog pokušaja." #. Label of the last_integration_date (Date) field in DocType 'Bank Account' #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -29163,7 +29163,7 @@ msgstr "Povezivanje s klijentom nije uspjelo. Molimo pokušajte ponovo." #: erpnext/selling/doctype/customer/customer.js:282 msgid "Linking to Supplier failed. Please try again." -msgstr "" +msgstr "Povezivanje s Dobavljačem nije uspjelo. Pokušaj ponovo." #: erpnext/accounts/report/financial_ratios/financial_ratios.js:55 #: erpnext/accounts/report/financial_ratios/financial_ratios.py:152 @@ -30731,7 +30731,7 @@ msgstr "Materijali su već primljeni naspram {0} {1}" #: erpnext/manufacturing/doctype/job_card/job_card.py:189 #: erpnext/manufacturing/doctype/job_card/job_card.py:903 msgid "Materials need to be transferred to the work in progress warehouse for the job card {0}" -msgstr "" +msgstr "Materijali se moraju prenijeti u skladište nedovršene proizvodnje za radnu karticu {0}" #. Label of the max_amount (Currency) field in DocType 'Bank Transaction Rule' #. Label of the max_amount (Currency) field in DocType 'Promotional Scheme @@ -31618,7 +31618,7 @@ msgstr "Više Računa (Šablon Naloga Knjiženja)" #: erpnext/selling/doctype/customer/customer.py:443 msgid "Multiple Loyalty Programs found for Customer {0}. Please select manually." -msgstr "" +msgstr "Višestruki Programi Lojalnosti su pronađeni za Klijenta {0}. Odaberi ručno." #: erpnext/accounts/doctype/sales_invoice/services/pos.py:253 msgid "Multiple POS Opening Entry" @@ -31626,7 +31626,7 @@ msgstr "Višestruki Unos Otvaranja Kase" #: erpnext/accounts/doctype/pricing_rule/utils.py:345 msgid "Multiple Price Rules exist with same criteria, please resolve conflict by assigning priority. Price Rules: {0}" -msgstr "" +msgstr "Postoji više pravila za cijene s istim kriterijima, riješi sukob dodjeljivanjem prioriteta. Pravila Cijena: {0}" #. Option for the 'Loyalty Program Type' (Select) field in DocType 'Loyalty #. Program' @@ -32289,7 +32289,7 @@ msgstr "Novi Radni Prostor" #: erpnext/selling/doctype/customer/customer.py:408 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}" -msgstr "" +msgstr "Novo kreditno ograničenje je niže od trenutnog iznosa klijenta. Kreditno ograničenje mora biti najmanje {0}" #. Description of the 'Bill Even If Previous Invoice Unpaid' (Check) field in #. DocType 'Subscription' @@ -32299,7 +32299,7 @@ msgstr "Nove fakture će se generirati prema rasporedu čak i ako su trenutne fa #: erpnext/support/doctype/issue/issue.js:126 msgid "New issue created: {0}" -msgstr "" +msgstr "Novi zahtjev stvoren: {0}" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:261 msgid "New release date should be in the future" @@ -32383,7 +32383,7 @@ msgstr "Nisu pronađeni Klijenti sa odabranim opcijama." #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:146 msgid "No Delivery Note selected for Customer {0}" -msgstr "" +msgstr "Nije odabrana Dostavnica za Klijenta {0}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:767 msgid "No DocTypes in To Delete list. Please generate or import the list before submitting." @@ -32548,7 +32548,7 @@ msgstr "Nisu pronađeni kontakti s e-poštom." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:164 msgid "No customers found with selected options." -msgstr "" +msgstr "Nisu pronađeni Klijenti sa odabranim opcijama." #: erpnext/selling/page/sales_funnel/sales_funnel.js:137 msgid "No data for this period" @@ -32769,7 +32769,7 @@ msgstr "Nije pronađen nijedan zapis" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:22 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:39 msgid "No records for these settings." -msgstr "" +msgstr "Nema zapisa za ove postavke." #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:773 msgid "No records found in Allocation table" @@ -33268,7 +33268,7 @@ msgstr "Numeričke Vrijednosti" #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py:88 msgid "Numero has not been set in the XML file" -msgstr "" +msgstr "Broj nije postavljen u XML datoteci" #. Option for the 'Blood Group' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json @@ -33444,11 +33444,11 @@ msgstr "Nakon postavljanja, ova faktura će biti na čekanju do postavljenog dat #: erpnext/manufacturing/doctype/work_order/work_order.js:763 msgid "Once the Work Order is Closed, it cannot be resumed." -msgstr "" +msgstr "Nakon što je Radni Nalog Zatvoren. Ne može se ponovo otvoriti." #: erpnext/accounts/doctype/loyalty_program/loyalty_program.js:39 msgid "One customer can be part of only a single Loyalty Program." -msgstr "" +msgstr "Jedan Klijent može biti dio samo jednog Programa Lojalnosti." #. Option for the 'Status' (Select) field in DocType 'Subcontracting Inward #. Order' @@ -34045,7 +34045,7 @@ msgstr "Operacija {0} ne pripada radnom nalogu {1}" #: erpnext/manufacturing/doctype/workstation/workstation.py:453 msgid "Operation {0} is longer than any available working hours in workstation {1}, break down the operation into multiple operations" -msgstr "" +msgstr "Operacija {0} traje duže od bilo kojeg raspoloživog radnog vremena na radnoj stanici {1}, podijeli operaciju na više operacija" #. Label of the operations (Table) field in DocType 'BOM' #. Label of the operations_section_section (Section Break) field in DocType @@ -34232,7 +34232,7 @@ msgstr "Optimiziraj Rutu" #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:128 msgid "Optimizing route" -msgstr "" +msgstr "Optimizacija rute" #: erpnext/manufacturing/doctype/work_order/work_order.js:1029 msgid "Optional. Select a specific manufacture entry to reverse." @@ -34693,7 +34693,7 @@ msgstr "Preko Odbitka" #: erpnext/accounts/services/billing_validation.py:56 msgid "Overbilling of {0} ignored because you have {1} role." -msgstr "" +msgstr "Prekomjerno Fakturisanje {0} zanemareno jer imate {1} ulogu." #: erpnext/controllers/status_updater.py:519 msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role." @@ -34815,7 +34815,7 @@ msgstr "Verifikat Zatvaranje Perioda" #. Label of the pcv_job_timeout (Int) field in DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "PCV Job Timeout (seconds)" -msgstr "" +msgstr "Vremensko Ograničenje Zadatka Završnog Verifikata Perioda (sekunde)" #: erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js:35 msgid "PCV Paused" @@ -34963,7 +34963,7 @@ msgstr "Kasa Faktura nije podnešena" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:130 msgid "POS Invoice isn't created by user {0}" -msgstr "" +msgstr "Korisnik {0} nije stvorio Kasa Fakturu" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:208 msgid "POS Invoice should have the field {0} checked." @@ -35087,7 +35087,7 @@ msgstr "Korisnik Kasa Profila" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:124 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:189 msgid "POS Profile doesn't match {0}" -msgstr "" +msgstr "Kasa Profil ne poklapa se s {0}" #: erpnext/accounts/doctype/sales_invoice/services/pos.py:210 msgid "POS Profile is mandatory to mark this invoice as POS Transaction." @@ -35099,19 +35099,19 @@ msgstr "Kasa profil {0} ne može biti onemogućen jer su Kasa sesije u toku." #: erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py:62 msgid "POS Profile {0} contains Mode of Payment {1}. Please remove them to disable this mode." -msgstr "" +msgstr "Kasa Profil {0} sadrži ovaj način plaćanja {1}. Uklonite ga da onemogućite ovaj način." #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:58 msgid "POS Profile {0} does not belong to company {1}" -msgstr "" +msgstr "Kasa Profil {0} ne pripada {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:47 msgid "POS Profile {0} does not exist." -msgstr "" +msgstr "Kasa Profil {0} ne postoji." #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:54 msgid "POS Profile {0} is disabled." -msgstr "" +msgstr "Kasa Profil {0} je onemogućen." #. Name of a report #: erpnext/accounts/report/pos_register/pos_register.json @@ -36059,7 +36059,7 @@ msgstr "Stranka je Obavezna" #: erpnext/accounts/doctype/bank_transaction_rule/bank_transaction_rule.py:69 msgid "Party is required to create a payment entry." -msgstr "" +msgstr "Stranka je obavezna za stvaranje unosa plaćanja." #: erpnext/accounts/doctype/bank_transaction_rule/bank_transaction_rule.py:66 msgid "Party type is required to create a payment entry." @@ -36766,7 +36766,7 @@ msgstr "Tip Plaćanja" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:624 msgid "Payment Type must be one of Receive, Pay, or Internal Transfer" -msgstr "" +msgstr "Tip Plaćanja mora biti Uplata, Isplata ili Interni Prijenos" #. Label of the payment_url (Data) field in DocType 'Payment Request' #: erpnext/accounts/doctype/payment_request/payment_request.json @@ -37723,7 +37723,7 @@ msgstr "Dodaj račun za pravilo bankovnog unosa." #: erpnext/public/js/utils/serial_no_batch_selector.js:663 msgid "Please add at least one Serial No / Batch No" -msgstr "" +msgstr "Dodaj barem jedan Serijski / Šaržni Broj" #: erpnext/stock/doctype/item/item.js:914 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." @@ -37731,7 +37731,7 @@ msgstr "Dodaj barem jedan red u Postavke Artikala sa poduzećem prije postavljan #: erpnext/crm/doctype/crm_settings/crm_settings.py:51 msgid "Please add at least one user on Allowed Users to allow Data Synchronization from Frappe CRM site." -msgstr "" +msgstr "Dodaj barem jednog korisnika na listu Dozvoljeni Korisnici kako biste omogućili sinhronizaciju podataka sa Prodajnom Podrškom." #: erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py:84 msgid "Please add the Bank Account column" @@ -37823,7 +37823,7 @@ msgstr "Konfiguriraj račune za pravilo bankovnog unosa." #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:345 msgid "Please contact any of the following users for this transaction." -msgstr "" +msgstr "Kontaktiraj bilo kojeg od sljedećih korisnika za ovu transakciju." #: erpnext/selling/doctype/customer/customer.py:534 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" @@ -37895,7 +37895,7 @@ msgstr "Omogući {0} u {1}." #: erpnext/controllers/selling_controller.py:872 msgid "Please enable {0} in {1} to allow same item in multiple rows" -msgstr "" +msgstr "Omogući {0} u {1} kako biste dozvolili isti artikal u više redova" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:378 msgid "Please ensure that the {0} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account." @@ -37907,11 +37907,11 @@ msgstr "Potvrdi da je {0} račun {1} Troškovni račun. Možete promijeniti vrst #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 msgid "Please ensure {0} account is a Balance Sheet account." -msgstr "" +msgstr "Provjeri da li je račun {0} račun Bilansa Stanja." #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 msgid "Please ensure {0} account {1} is a Receivable account." -msgstr "" +msgstr "Provjeri da li je {0} račun {1} račun Potraživanja." #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:140 msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}" @@ -38118,7 +38118,7 @@ msgstr "Molimo vas da generirate listu za brisanje prije podnošenja" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:67 msgid "Please import accounts against parent company or enable {0} in company master." -msgstr "" +msgstr "Uvezi račune naspram matičnog poduzeća ili omogući {0} u Postavkama Poduzeća." #: erpnext/setup/doctype/employee/employee.py:291 msgid "Please make sure the employees above report to another Active employee." @@ -38216,7 +38216,7 @@ msgstr "Odaberi Poduzeće" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js:139 #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:76 msgid "Please select Company and Posting Date to get entries" -msgstr "" +msgstr "Odaberi Poduzeće i Datum Knjiženja da biste preuzeli unose" #: erpnext/accounts/doctype/journal_entry/journal_entry.js:435 #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:28 @@ -38249,7 +38249,7 @@ msgstr "Odaberi Kod Artikla" #: erpnext/selling/doctype/sales_order/sales_order.js:1756 msgid "Please select Items from the Table" -msgstr "" +msgstr "Odaberi Artikle iz Tabele" #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py:55 msgid "Please select Maintenance Status as Completed or remove Completion Date" @@ -38398,7 +38398,7 @@ msgstr "Odaberi red za kreiranje Unosa Ponovnog Knjiženje" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:146 msgid "Please select a supplier" -msgstr "" +msgstr "Odaberi Dobavljača" #: erpnext/accounts/report/purchase_register/purchase_register.py:37 msgid "Please select a supplier for fetching payments." @@ -38410,7 +38410,7 @@ msgstr "Odaberi važeći Nabavni Nalog koji je konfigurisan za Podizvođača." #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:200 msgid "Please select a valid document type." -msgstr "" +msgstr "Odaberi važeći tip dokumenta." #: erpnext/selling/doctype/quotation/quotation.js:245 msgid "Please select a value for {0} quotation_to {1}" @@ -38430,7 +38430,7 @@ msgstr "Odaberi barem jedan filter: Šifra Artikla, Šarža ili Serijski Broj." #: erpnext/selling/doctype/sales_order/sales_order.js:1368 msgid "Please select at least one item to continue" -msgstr "" +msgstr "Odaberi jedan artikal za nastavak" #: erpnext/buying/doctype/purchase_order/services/drop_ship.py:17 msgid "Please select at least one item to update delivered quantity." @@ -38438,7 +38438,7 @@ msgstr "Molimo odaberite barem jedan artikal za ažuriranje isporučene količin #: erpnext/manufacturing/doctype/work_order/work_order.js:392 msgid "Please select at least one operation to create Job Card" -msgstr "" +msgstr "Odaberi barem jednu operaciju za stvaranje Kartice Posla" #: erpnext/stock/report/incorrect_serial_and_batch_bundle/incorrect_serial_and_batch_bundle.js:33 msgid "Please select at least one row to fix" @@ -38504,7 +38504,7 @@ msgstr "Odaberi Poduzeće" #: erpnext/accounts/doctype/loyalty_program/loyalty_program.js:65 msgid "Please select the Multiple Tier Program type for more than one collection rule." -msgstr "" +msgstr "Odaberi Tip Višeslojnog Programa za više od jednog pravila prikupljanja." #: erpnext/stock/doctype/item/item.js:433 msgid "Please select the Warehouse first" @@ -38566,7 +38566,7 @@ msgstr "Postavi Račun u Skladištu {0} ili Standard Račun Zaliha u {1}" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:333 msgid "Please set Accounting Dimension {0} in {1}" -msgstr "" +msgstr "Postavi Knjigovodstvenu Dimenziju {0} u {1}" #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:23 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:34 @@ -38608,7 +38608,7 @@ msgstr "Postavi Račun Osnovne Imovine u Kategoriju Imovine {0}" #: erpnext/accounts/doctype/purchase_invoice/services/expense_account.py:151 msgid "Please set Fixed Asset Account in {0} against {1}." -msgstr "" +msgstr "Postavi Račun Osnovnih Sredstava u {0} na {1}." #: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:296 msgid "Please set Parent Row No for item {0}" @@ -38645,7 +38645,7 @@ msgstr "Postavi Poduzeće" #: 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 {0}" -msgstr "" +msgstr "Postavi Centar Troškova za Imovinu ili postavite Centar Troškova Amortizacije za {0}" #: erpnext/stock/doctype/item/item.py:339 #: erpnext/stock/doctype/item/item.py:1623 @@ -38699,11 +38699,11 @@ msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Način Plaćanja {0}" #: erpnext/accounts/doctype/pos_profile/pos_profile.py:207 #: erpnext/accounts/doctype/sales_invoice/services/pos.py:367 msgid "Please set default Cash or Bank account in Mode of Payments {0}" -msgstr "" +msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Načine Plaćanja {0}" #: erpnext/accounts/utils.py:2568 msgid "Please set default Exchange Gain/Loss Account in Company {0}" -msgstr "" +msgstr "Postavi Standard Račun Rezultata od Kursnih Razlika u {0}" #: erpnext/assets/doctype/asset_repair/services/gl_composer.py:92 msgid "Please set default Expense Account in Company {0}" @@ -38842,11 +38842,11 @@ msgstr "Navedi od/Do Raspona" #: erpnext/public/js/controllers/transaction.js:2634 msgid "Please specify {0}. It is needed to fetch Item Details." -msgstr "" +msgstr "Navedi {0}. Potrebno je za preuzimanje Detalja Artikla." #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:142 msgid "Please submit Purchase Order {0} before proceeding." -msgstr "" +msgstr "Podnesite Nalog Nabave {0} prije nego što nastavite." #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 msgid "Please try again in an hour." @@ -39080,7 +39080,7 @@ msgstr "Datum Knjiženja" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:263 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:146 msgid "Posting Date cannot be a future date" -msgstr "" +msgstr "Datum knjiženja ne može biti budući datum" #. Label of the exchange_gain_loss_posting_date (Select) field in DocType #. 'Accounts Settings' @@ -39283,7 +39283,7 @@ msgstr "Uplaćeni Troškovi" #: erpnext/accounts/report/general_ledger/general_ledger.py:682 msgid "Presentation Currency cannot be {0}, when {1} is enabled." -msgstr "" +msgstr "Valuta prikaza ne može biti {0}, kada je omogućen {1}." #: erpnext/setup/setup_wizard/data/designation.txt:24 msgid "President" @@ -39957,7 +39957,7 @@ msgstr "Prioriteti" #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:61 msgid "Priority cannot be less than 1." -msgstr "" +msgstr "Prioritet ne može biti manji od 1." #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:764 msgid "Priority has been changed to {0}." @@ -40523,7 +40523,7 @@ msgstr "Bilans Uspjeha" #: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:215 msgid "Profit and Loss Statement requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Bilansa Uspjeha zahtijeva da se {0} sinhronizira s DuckDB-om" #. Label of the heading_cppb (Heading) field in DocType 'Bisect Accounting #. Statements' @@ -41282,7 +41282,7 @@ msgstr "Nabavni Nalog Obavezan" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:466 msgid "Purchase Order Required for item {0}" -msgstr "" +msgstr "Nabavni Nalog je obavezan za artikal {0}" #. Name of a report #. Label of a chart in the Buying Workspace @@ -41342,7 +41342,7 @@ msgstr "Nabavni Nalozi za Prijem" #: erpnext/controllers/accounts_controller.py:1236 msgid "Purchase Orders {0} are unlinked" -msgstr "" +msgstr "Nabavni Nalozi {0} nisu povezani" #: erpnext/stock/report/item_prices/item_prices.py:59 msgid "Purchase Price List" @@ -41432,7 +41432,7 @@ msgstr "Nabavni Račun je Obavezan" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:488 msgid "Purchase Receipt Required for item {0}" -msgstr "" +msgstr "Nabavni Račun je obavezan za artikal {0}" #. Label of a Link in the Buying Workspace #. Name of a report @@ -41452,7 +41452,7 @@ msgstr "Statistika Nabavnog Računa " #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:356 msgid "Purchase Receipt does not have any Item for which Retain Sample is enabled." -msgstr "" +msgstr "Nabavni Račun nema nijedan artikal za koju je omogućeno Zadržavanje Uzorka." #: erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py:135 msgid "Purchase Receipt {0} created." @@ -42483,7 +42483,7 @@ msgstr "Količina za Skeniranje" #: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "Quantity {0} should not be greater than allowed quantity {1}" -msgstr "" +msgstr "Količina {0} ne smije biti veća od dozvoljene količine {1}" #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json @@ -42935,7 +42935,7 @@ msgstr "PDV Stopa" #: erpnext/accounts/services/child_item_update.py:515 msgid "Rate of '{0}' items cannot be changed" -msgstr "" +msgstr "Cijena '{0}' artikala ne može se mijenjati" #. Label of the rate_of_depreciation (Percent) field in DocType 'Asset #. Depreciation Schedule' @@ -43674,7 +43674,7 @@ msgstr "Zabilježite prijenos između dva bankovna računa" #: erpnext/stock/doctype/item_alternative/item_alternative.py:84 msgid "Record already exists for the item {0}" -msgstr "" +msgstr "Zapis za artikal {0} već postoji" #: banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx:513 #: banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx:519 @@ -44099,7 +44099,7 @@ msgstr "Odbijeno Skladište" #: erpnext/public/js/utils/serial_no_batch_selector.js:671 msgid "Rejected Warehouse and Accepted Warehouse cannot be the same." -msgstr "" +msgstr "Odbijeno i Prihvaćeno Skladište ne mogu biti isto." #: erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py:23 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py:14 @@ -44528,11 +44528,11 @@ msgstr "Datoteke Podataka Ponovnog Knjiženja" #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:47 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:96 msgid "Reposting Entries will change the value of accounts Stock In Hand, and Stock Expenses in the Trial Balance report and will also change the Balance Value in the Stock Balance report." -msgstr "" +msgstr "Ponovno knjiženje će promijeniti vrijednost računa Zalihe na raspolaganju i Troškovi zaliha u izvještaju o probnom bilansu, a također će promijeniti i vrijednost stanja u izvještaju o stanju zaliha." #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js:62 msgid "Reposting Entry will change the value of accounts Stock In Hand and Stock Expenses in the Trial Balance report and will also change the Balance Value in the Stock Balance report." -msgstr "" +msgstr "Ponovno knjiženje će promijeniti vrijednost računa Zalihe na raspolaganju i Troškovi zaliha u izvještaju o probnom bilansu, a također će promijeniti i vrijednost stanja u izvještaju o stanju zaliha." #. Label of the reposting_info_section (Section Break) field in DocType 'Repost #. Item Valuation' @@ -44919,7 +44919,7 @@ msgstr "Rezervno Skladište" #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:178 msgid "Reserve Warehouse must be different from Supplier Warehouse for Supplied Item {0}." -msgstr "" +msgstr "Rezervno Skladište mora biti različito od Dobavljačevog Skladišta za Isporučeni Artikal {0}." #: erpnext/manufacturing/doctype/production_plan/production_plan.js:287 msgid "Reserve for Raw Materials" @@ -45522,7 +45522,7 @@ msgstr "Povrati" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:359 msgid "Revaluation Journal: {0}" -msgstr "" +msgstr "Žurnal Revalorizacije: {0}" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:151 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:113 @@ -46038,7 +46038,7 @@ msgstr "Red #{0}: Broj Šarže {1} je već odabran." #: erpnext/controllers/subcontracting_inward_controller.py:443 msgid "Row #{0}: Batch No(s) {1} are not a part of the linked Subcontracting Inward Order. Please select valid Batch No(s)." -msgstr "" +msgstr "Red #{0}: Broj(evi) Šarže {1} nisu dio povezanog Internog Podugovaračkog Naloga. Odaberi važeći Broj(eve) Šarže." #: erpnext/accounts/doctype/payment_entry/payment_entry.py:880 msgid "Row #{0}: Cannot allocate more than {1} against payment term {2}" @@ -46130,7 +46130,7 @@ msgstr "Red #{0}: Kumulativni prag ne može biti manji od praga pojedinačne tra #: erpnext/assets/doctype/asset_category/asset_category.py:66 msgid "Row #{0}: Currency of {1} - {2} does not match company currency." -msgstr "" +msgstr "Red #{0}: Valuta od {1} - {2} ne odgovara valuti poduzeća." #: erpnext/controllers/subcontracting_inward_controller.py:91 msgid "Row #{0}: Customer Provided Item {1} against Subcontracting Inward Order Item {2} ({3}) cannot be added multiple times." @@ -46184,7 +46184,7 @@ msgstr "Red #{0}: Duplikat unosa u Referencama {1} {2}" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:113 msgid "Row #{0}: Either Party ID or Party Name is required" -msgstr "" +msgstr "Red #{0}: Obavezan je ili ID Stranke ili Naziv Stranke" #: erpnext/selling/doctype/sales_order/sales_order.py:270 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" @@ -46200,7 +46200,7 @@ msgstr "Red #{0}: Račun troškova {1} nije važeći za Nabavnu Fakturu {2}. Doz #: erpnext/assets/doctype/asset/asset.py:421 msgid "Row #{0}: Finance Book should not be empty since you're using multiple." -msgstr "" +msgstr "Red #{0}: Finansijski Registar ne smije biti prazan jer ih koristite više." #: erpnext/selling/doctype/sales_order/services/subcontracting.py:40 msgid "Row #{0}: Finished Good Item Qty can not be zero" @@ -46208,7 +46208,7 @@ msgstr "Red #{0}: Količina gotovog proizvoda artikla ne može biti nula" #: erpnext/buying/doctype/purchase_order/services/subcontracting.py:39 msgid "Row #{0}: Finished Good Item Qty cannot be zero" -msgstr "" +msgstr "Red #{0}: Količina gotovog proizvoda ne može biti nula" #: erpnext/buying/doctype/purchase_order/services/subcontracting.py:21 #: erpnext/selling/doctype/sales_order/services/subcontracting.py:20 @@ -46259,7 +46259,7 @@ msgstr "Red #{0}: Polja Od i Do su obavezna" #: erpnext/stock/doctype/pick_list/pick_list.py:650 msgid "Row #{0}: Item Code is Mandatory" -msgstr "" +msgstr "Red #{0}: Šifra Artikla je obavezna" #: erpnext/public/js/utils/barcode_scanner.js:427 msgid "Row #{0}: Item added" @@ -46316,15 +46316,15 @@ msgstr "Red #{0}: Artikal {1} nije dio unosa izvornog proizvođača i ne može s #: erpnext/controllers/subcontracting_inward_controller.py:80 msgid "Row #{0}: Item {1} mismatch. Changing the item code is not permitted, add another row instead." -msgstr "" +msgstr "Red #{0}: Artikal {1} ne odgovara. Promjena šifre artikla nije dozvoljena, umjesto toga dodaj još jedan red." #: erpnext/controllers/subcontracting_inward_controller.py:129 msgid "Row #{0}: Item {1} mismatch. Changing the item code is not permitted." -msgstr "" +msgstr "Red #{0}: Artikal {1} ne odgovara. Promjena šifre artikla nije dozvoljena." #: erpnext/stock/doctype/stock_entry/services/subcontracting.py:94 msgid "Row #{0}: Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" -msgstr "" +msgstr "Red #{0}: Artikal {1} nije pronađen u tabeli 'Dostavljene Sirovine' u {2} {3}" #: erpnext/stock/doctype/stock_entry/services/disassemble.py:115 msgid "Row #{0}: Item {1} quantity ({2} in stock UOM) does not match the quantity derived from the source ({3}). Do not change the UOM, conversion factor or quantity of disassembly rows." @@ -46365,19 +46365,19 @@ msgstr "Red #{0}: Prekomjerna potrošnja Klijent Dostavljenog Artikla {1} u odno #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:92 msgid "Row #{0}: POS Invoice {1} has been {2}" -msgstr "" +msgstr "Red #{0}: Kasa Faktura {1} je {2}" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:73 msgid "Row #{0}: POS Invoice {1} is not against customer {2}" -msgstr "" +msgstr "Red #{0}: Kasa Faktura {1} nije vezana za klijenta {2}" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:88 msgid "Row #{0}: POS Invoice {1} is not submitted yet" -msgstr "" +msgstr "Red #{0}: Kasa Faktura {1} još nije podnešena" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:123 msgid "Row #{0}: Party ID is required" -msgstr "" +msgstr "Red #{0}: ID Stranke je obavezan" #: erpnext/manufacturing/doctype/production_plan/services/sub_assembly.py:80 msgid "Row #{0}: Please select Item Code in Assembly Items" @@ -46385,11 +46385,11 @@ msgstr "Red #{0}: Odaberi Kod Artikla u Artiklima Montaže" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:340 msgid "Row #{0}: Please select a valid Quality Inspection with Item Code {1}." -msgstr "" +msgstr "Red #{0}: Odaberi važeću Kontrolu Kvalitete sa Šifrom Artikla {1}." #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:333 msgid "Row #{0}: Please select a valid Quality Inspection with Reference Type {1} and Reference Name {2}." -msgstr "" +msgstr "Red #{0}: Odaberi važeću Kontrolu Kvalitete s Tipom Reference {1} i Nazivom Reference {2}." #: erpnext/manufacturing/doctype/production_plan/services/sub_assembly.py:82 msgid "Row #{0}: Please select the BOM No in Assembly Items" @@ -46413,7 +46413,7 @@ msgstr "Red #{0}: Ažuriraj račun odloženih prihoda/troškova u redu artikla i #: erpnext/assets/doctype/asset/asset.py:413 msgid "Row #{0}: Please use a different Finance Book." -msgstr "" +msgstr "Red #{0}: Koristi drugi Finansijski Registar." #: erpnext/manufacturing/doctype/bom/bom.py:378 #, python-format @@ -46435,7 +46435,7 @@ msgstr "Red #{0}: Količina mora biti pozitivan broj" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:429 msgid "Row #{0}: Qty should be less than or equal to Available Qty to Reserve (Actual Qty - Reserved Qty) {1} for Item {2} against Batch {3} in Warehouse {4}." -msgstr "" +msgstr "Red #{0}: Količina bi trebala biti manja ili jednaka Dostupnoj Količini za Rezervaciju (Stvarna količina - Rezervisana količina) {1} za artikal {2} naspram Šarže {3} u Skladištu {4}." #: erpnext/stock/services/quality_inspection_service.py:77 msgid "Row #{0}: Quality Inspection is required for Item {1}" @@ -46512,7 +46512,10 @@ msgid "Row #{0}: Selling rate for item {1} is lower than its {2}.\n" "\t\t\t\t\tSelling {3} should be at least {4}.

Alternatively,\n" "\t\t\t\t\tyou can disable '{5}' in {6} to bypass\n" "\t\t\t\t\tthis validation." -msgstr "" +msgstr "Red #{0}: Prodajna cijena za artikal {1} je niža od njegove {2}.\n" +"\t\t\t\t\tProdaja {3} treba biti najmanje {4}.

Alternativno,\n" +"\t\t\t\t\tmožete onemogućiti '{5}' u {6} da biste zaobišli\n" +"\t\t\t\t\tovu validaciju." #: erpnext/manufacturing/doctype/work_order/work_order.py:348 msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." @@ -46520,7 +46523,7 @@ msgstr "Red #{0}: ID Sekvence mora biti {1} ili {2} za Operaciju {3}." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:528 msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" -msgstr "" +msgstr "Red #{0}: Serijski Broj {1} ne može se vratiti jer nije naveden u originalnoj fakturi {2}" #: erpnext/stock/services/serial_batch_bundle_service.py:123 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" @@ -46637,11 +46640,11 @@ msgstr "Red #{0}: Šarža {1} je već istekla." #: erpnext/stock/doctype/stock_entry/stock_entry.py:408 msgid "Row #{0}: The job card item reference is missing. Kindly create the stock entry from the job card. If you have added the row manually then you won't be able to add job card item reference." -msgstr "" +msgstr "Red #{0}: Nedostaje referenca artikla na radnoj kartici. Stvori unos zaliha iz radne kartice. Ako ste red dodali ručno, nećete moći dodati referencu artikla na radnu karticu." #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:103 msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." -msgstr "" +msgstr "Red #{0}: Originalna Faktura {1} povratne fakture {2} nije konsolidovana." #: erpnext/stock/doctype/item/item.py:599 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" @@ -46649,7 +46652,7 @@ msgstr "Red #{0}: Skladište {1} nije podređeno skladište grupnog skladišta { #: erpnext/manufacturing/doctype/workstation/workstation.py:190 msgid "Row #{0}: Timings conflict with row {1}" -msgstr "" +msgstr "Red #{0}: Vremenski sukob je u odnosu na red {1}" #: erpnext/assets/doctype/asset/asset.py:656 msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations" @@ -46673,7 +46676,7 @@ msgstr "Red #{0}: Radni Nalog postoji za punu ili djelomičnu količinu artiikla #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:500 msgid "Row #{0}: You cannot add positive quantities in a return invoice. Please remove item {1} to complete the return." -msgstr "" +msgstr "Red #{0}: Ne možete dodati pozitivne količine u povratnu fakturu. Molimo vas da uklonite artikal {1} da biste dovršili povrat." #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:110 msgid "Row #{0}: You cannot use the inventory dimension '{1}' in Stock Reconciliation to modify the quantity or valuation rate. Stock reconciliation with inventory dimensions is intended solely for performing opening entries." @@ -46685,7 +46688,7 @@ msgstr "Red #{0}: Odaberi Imovinu za Artikal {1}." #: erpnext/stock/doctype/pick_list/pick_list.py:235 msgid "Row #{0}: item {1} has been picked already." -msgstr "" +msgstr "Red #{0}: artikal {1} je već odabran." #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:142 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:207 @@ -46694,7 +46697,7 @@ msgstr "Red #{0}: {1}" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:142 msgid "Row #{0}: {1} account is not of type {2}" -msgstr "" +msgstr "Red #{0}: {1} račun nije tipa {2}" #: erpnext/public/js/controllers/buying.js:261 msgid "Row #{0}: {1} can not be negative for item {2}" @@ -46714,11 +46717,11 @@ msgstr "Red #{0}: {1} od {2} bi trebao biti {3}. Ažuriraj {1} ili odaberi drugi #: erpnext/stock/doctype/item/item.py:1511 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." -msgstr "" +msgstr "Red #{0}: {1} {2} ne pripada {3}. Odaberi važeći {4}." #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:126 msgid "Row #{0}: {1} {2} does not exist." -msgstr "" +msgstr "Red #{0}: {1} {2} ne postoji." #: erpnext/accounts/services/child_item_update.py:251 msgid "Row #{0}:Quantity for Item {1} cannot be zero." @@ -46895,7 +46898,7 @@ msgstr "Red {0}: Od vremena i do vremena je obavezano." #: erpnext/manufacturing/doctype/job_card/job_card.py:355 msgid "Row {0}: From Time and To Time of {1} are overlapping with {2}" -msgstr "" +msgstr "Red {0}: Vrijeme od i Vrijeme do {1} se preklapaju sa {2}" #: erpnext/projects/doctype/timesheet/timesheet.py:225 msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" @@ -46919,7 +46922,7 @@ msgstr "Red {0}: Nevažeća referenca {1}" #: erpnext/controllers/taxes_and_totals.py:134 msgid "Row {0}: Item Tax template for {1} updated as per validity and rate applied" -msgstr "" +msgstr "Red {0}: Predložak Pdv-a za Artikal {1} ažuriran je u skladu s važećim rokom i primijenjenom stopom" #: erpnext/controllers/selling_controller.py:659 msgid "Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer" @@ -46983,7 +46986,7 @@ msgstr "Red {0}: Odaberi Sastavnicu za artikal {1}." #: erpnext/controllers/subcontracting_controller.py:214 msgid "Row {0}: Please select a valid BOM for Item {1}." -msgstr "" +msgstr "Red {0}: Odaberi važeću Sastavnicu za artikal {1}." #: erpnext/controllers/subcontracting_controller.py:208 msgid "Row {0}: Please select an active BOM for Item {1}." @@ -47055,7 +47058,7 @@ msgstr "Red {0}: Cijeli iznos troška za račun {1} u {2} je već dodijeljen." #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:103 msgid "Row {0}: The item {1}, quantity must be a positive number" -msgstr "" +msgstr "Red {0}: Artikal {1}, količina mora biti pozitivan broj" #: erpnext/accounts/services/taxes.py:269 msgid "Row {0}: The {3} Account {1} does not belong to the company {2}" @@ -47116,7 +47119,7 @@ msgstr "Red {0}: {1} {2} je povezan sa {3}. Odaberi dokument koji pripada {4}." #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:132 msgid "Row {0}: {1} {2} must be submitted" -msgstr "" +msgstr "Red {0}: {1} {2} mora biti podnešen" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:111 msgid "Row {0}: {2} Item {1} does not exist in {2} {3}" @@ -47162,7 +47165,7 @@ msgstr "Redovi: {0} imaju 'Unos Plaćanja' kao Tip Reference. Ovo ne treba posta #: erpnext/controllers/accounts_controller.py:276 msgid "Rows: {0} in {1} section are invalid. Reference Name should point to a valid Payment Entry or Journal Entry." -msgstr "" +msgstr "Redovi: {0} u {1} sekciji su nevažeći. Naziv reference treba da ukazuje na važeći Unos Plaćanja ili Nalog Knjiženja." #. Label of the rule_applied (Check) field in DocType 'Pricing Rule Detail' #: erpnext/accounts/doctype/pricing_rule_detail/pricing_rule_detail.json @@ -47589,7 +47592,7 @@ msgstr "Prodajna Faktura nije podnešena" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:195 msgid "Sales Invoice isn't created by user {0}" -msgstr "" +msgstr "Prodajna Faktura nije kreirana od {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:472 msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." @@ -49055,7 +49058,7 @@ msgstr "Odabrani dokument mora biti u podnešenom stanju" #: erpnext/assets/doctype/asset/asset.py:1195 msgid "Selected {0} does not contain the Item Code {1}" -msgstr "" +msgstr "Odabrani {0} ne sadrži Šifru Artikla {1}" #. Option for the 'Pickup Type' (Select) field in DocType 'Shipment' #: erpnext/stock/doctype/shipment/shipment.json @@ -49393,7 +49396,7 @@ msgstr "Serijski broj je već dodijeljen" #: erpnext/assets/doctype/asset_repair/asset_repair.py:296 msgid "Serial No Bundle is mandatory for Item {0}" -msgstr "" +msgstr "Paket Serijskih Brojeva je obavezan za artikal {0}" #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:33 msgid "Serial No Count" @@ -49458,7 +49461,7 @@ msgstr "Serijski Broj i Šarža" #: erpnext/stock/doctype/stock_settings/stock_settings.js:93 msgid "Serial No and Batch Selector cannot be used when Use Serial / Batch Fields is enabled." -msgstr "" +msgstr "Serijski Broj i birač Šarže ne mogu se koristiti kada je omogućeno Koristi Serijski Broj / Šaržu." #. Name of a report #. Label of a Link in the Stock Workspace @@ -49501,7 +49504,7 @@ msgstr "Serijski Broj {0} ne postoji" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:378 msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." -msgstr "" +msgstr "Serijski broj {0} je već dostavljen. Ne možete ga ponovno koristiti u unosu Proizvodnje / Ponovnog pakiranja." #: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Serial No {0} is already added" @@ -49517,11 +49520,11 @@ msgstr "Serijski broj {0} nije u {1} {2}, i ne može se vratiti naspram {1} {2}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:343 msgid "Serial No {0} is under maintenance contract until {1}" -msgstr "" +msgstr "Serijski Broj {0} je pod ugovorom o održavanju do {1}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:336 msgid "Serial No {0} is under warranty until {1}" -msgstr "" +msgstr "Serijski Broj {0} je pod garancijom do {1}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:322 msgid "Serial No {0} not found" @@ -49657,7 +49660,7 @@ msgstr "Serijski i Šaržni Paket {0} je podnešen i njegovi unosi se ne mogu mi #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:298 msgid "Serial and Batch Bundle {0} should have voucher type as 'Maintenance Schedule'" -msgstr "" +msgstr "Serijski i Šaržni Paket {0} treba imati tip verifikata kao 'Raspored Održavanja'" #. Label of the section_break_45 (Section Break) field in DocType #. 'Subcontracting Receipt Item' @@ -51136,7 +51139,7 @@ msgstr "Nedostaju neki obavezni podaci o poduzeću Nemate dozvolu da ih ažurira #: erpnext/www/book_appointment/index.js:248 msgid "Something went wrong, please try again" -msgstr "" +msgstr "Nešto nije u redu, pokušaj ponovo" #: erpnext/accounts/doctype/pricing_rule/utils.py:754 msgid "Sorry, this coupon code is no longer valid" @@ -51387,7 +51390,7 @@ msgstr "Raspodijeli proviziju među više prodavača." #: erpnext/buying/doctype/purchase_order/purchase_order.js:600 #: erpnext/public/js/controllers/buying.js:558 msgid "Splitting {0} units of {1}" -msgstr "" +msgstr "Dijeljenje {0} jedinica od {1}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2195 msgid "Splitting {0} {1} into {2} rows as per Payment Terms" @@ -51509,15 +51512,15 @@ msgstr "Poredak" #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:73 msgid "Standing scores must be continuous and cover 0 to 100 without gaps or overlaps" -msgstr "" +msgstr "Aktualni rezultati moraju biti neprekidni i obuhvatiti raspon od 0 do 100 bez praznina ili preklapanja" #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:76 msgid "Standing scores must cover the full range from 0 to 100" -msgstr "" +msgstr "Aktualni rezultati moraju pokrivati cijeli raspon od 0 do 100." #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:68 msgid "Standing {0} must have a minimum grade lower than its maximum grade" -msgstr "" +msgstr "{0} mora imati najmanje ocjene niže od svoje najviše ocjene" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:54 msgid "Start / Resume" @@ -51525,7 +51528,7 @@ msgstr "Pokreni / Nastavi" #: erpnext/accounts/doctype/accounting_period/accounting_period.py:45 msgid "Start Date cannot be after End Date" -msgstr "" +msgstr "Datum početka ne može biti nakon datuma završetka" #: erpnext/crm/doctype/email_campaign/email_campaign.py:40 msgid "Start Date cannot be before the current date" @@ -51591,7 +51594,7 @@ msgstr "Započet je pozadinski zadatak za kreiranje {1} {0}. {2}" #: erpnext/public/js/bulk_transaction_processing.js:29 msgid "Starting a background job to create {0} {1}" -msgstr "" +msgstr "Započet je pozadinski zadatak za kreiranje {0} {1}" #. Label of the date_dist_from_left_edge (Float) field in DocType 'Cheque Print #. Template' @@ -51802,7 +51805,7 @@ msgstr "Unos Zaključanih Zaliha {0} već postoji za odabrani vremenski raspon" #: erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py:100 msgid "Stock Closing Entry {0} has been queued for processing, the system will take some time to complete it." -msgstr "" +msgstr "Završni Unos Zaliha {0} je stavljen u red za obradu, sistemu će trebati neko vrijeme da ga završi." #: erpnext/stock/doctype/stock_closing_entry/stock_closing_entry_dashboard.py:9 msgid "Stock Closing Log" @@ -51885,11 +51888,11 @@ msgstr "Tip Unosa Zaliha" #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.py:65 msgid "Stock Entry Type {0} cannot be set as standard" -msgstr "" +msgstr "Tip Unosa Zaliha {0} ne može se postaviti kao standard" #: erpnext/stock/doctype/pick_list/mapper.py:289 msgid "Stock Entry has already been created against this Pick List" -msgstr "" +msgstr "Unos Zaliha je već kreiran naspram ove Liste Odabira" #: erpnext/stock/doctype/batch/batch.js:138 msgid "Stock Entry {0} created" @@ -51897,7 +51900,7 @@ msgstr "Unos Zaliha {0} je kreiran" #: erpnext/manufacturing/doctype/job_card/job_card.py:1639 msgid "Stock Entry {0} has been created" -msgstr "" +msgstr "Unos Zaliha {0} je stvoren" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:997 msgid "Stock Entry {0} is not submitted" @@ -52510,7 +52513,7 @@ msgstr "Zaliha nije dostupna za Artikal {0} u Skladištu {1}." #: erpnext/selling/page/point_of_sale/pos_controller.js:826 msgid "Stock quantity is not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}." -msgstr "" +msgstr "Količina Zaliha nije dovoljna za Kod Artikla: {0} na skladištu {1}. Dostupna količina {2} {3}." #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:255 msgid "Stock transactions before {0} are frozen" @@ -53980,7 +53983,7 @@ msgstr "Ciljna Imovina {0} ne pripada {1}" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:189 msgid "Target Asset {0} needs to be a composite asset" -msgstr "" +msgstr "Ciljana Imovina {0} mora biti objedinjena imovina" #. Name of a DocType #: erpnext/setup/doctype/target_detail/target_detail.json @@ -55090,7 +55093,7 @@ msgstr "Tekst prikazan u finansijskom izvještaju (npr. 'Ukupni Prihod', 'Gotovi #: erpnext/stock/doctype/packing_slip/packing_slip.py:89 msgid "The 'From Package No.' field must not be empty or have a value less than 1." -msgstr "" +msgstr "\"Od Paketa Broj.\" polje ne smije biti prazno niti njegova vrijednost manja od 1." #. Description of the 'Current BOM' (Link) field in DocType 'BOM Update Tool' #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.json @@ -55099,7 +55102,7 @@ msgstr "Sastavnica koja će biti zamijenjena" #: erpnext/controllers/subcontracting_controller.py:1056 msgid "The Batch No {0} has not been supplied against the {1} {2}" -msgstr "" +msgstr "Broj Šarže {0} nije dostavljen protiv {1} {2}" #: erpnext/stock/serial_batch_bundle.py:1557 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." @@ -55107,7 +55110,7 @@ msgstr "Šarža {0} ima negativnu količinu {1}. Da biste to riješili, idite na #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1590 msgid "The Batch {0} of item {1} has negative stock in the warehouse {2}{3}. Please add a stock quantity of {4} to proceed with this entry. If it is not possible to make an adjustment entry, please enable 'Allow Negative Stock for Batch' in the batch {0} or in the Stock Settings to proceed. However, enabling this setting may lead to negative stock in the system. So please ensure the stock levels are adjusted as soon as possible to maintain the correct valuation rate." -msgstr "" +msgstr "Šarža {0} artikla {1} ima negativne zalihe u skladištu {2}{3}. Dodaj količinu zaliha od {4} da biste nastavili s ovim unosom. Ako nije moguće izvršiti unos prilagođavanja, omogućite 'Dozvoli Negativne Zalihe za Šaržu' za Šaržu {0} ili u Postavkama Zaliha da biste nastavili. Međutim, omogućavanje ove postavke može dovesti do negativnih zaliha u sistemu. Stoga, molimo vas da osigurate da se nivoi zaliha što prije prilagode kako bi se održala ispravna stopa vrednovanja." #: erpnext/crm/doctype/email_campaign/email_campaign.py:71 msgid "The Campaign '{0}' already exists for the {1} '{2}'" @@ -55135,7 +55138,7 @@ msgstr "Knjigovodstveni Unosi će biti otkazani u pozadini, može potrajati neko #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1156 msgid "The Item {0} does not have Serial No or Batch No" -msgstr "" +msgstr "Artikal {0} nema Serijski niti Šaržni Broj" #: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:179 msgid "The Loyalty Program isn't valid for the selected company" @@ -55155,11 +55158,11 @@ msgstr "Lista Odabira koja ima Unose Rezervacije Zaliha ne može se ažurirati. #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:127 msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" -msgstr "" +msgstr "Količinski Gubitak Procesa je poništen prema Radnim Karticama Količinskog Gubitka Procesa" #: erpnext/stock/doctype/stock_entry/stock_entry.py:1375 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" -msgstr "" +msgstr "Količinski Gubitak Procesa je poništen prema Radnim Karticama Količinskog Gubitka Procesa" #: erpnext/setup/doctype/sales_person/sales_person.py:102 msgid "The Sales Person is linked with {0}" @@ -55175,7 +55178,7 @@ msgstr "Serijski Broj {0} je rezervisan naspram {1} {2} i ne može se koristiti #: erpnext/controllers/subcontracting_controller.py:1071 msgid "The Serial Nos {0} have not been supplied against the {1} {2}" -msgstr "" +msgstr "Serijski Brojevi {0} nisu dostavljeni protiv {1} {2}" #: erpnext/stock/doctype/stock_entry/stock_entry.py:950 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}" @@ -55231,7 +55234,7 @@ msgstr "Završena količina {0} operacije {1} ne može biti veća od završene k #: erpnext/accounts/doctype/dunning/dunning.py:87 msgid "The currency of invoice {0} ({1}) is different from the currency of this dunning ({2})." -msgstr "" +msgstr "Valuta Fakture {0} ({1}) se razlikuje od valute ove Opomene ({2})." #: erpnext/selling/page/point_of_sale/pos_controller.js:200 msgid "The current POS opening entry is outdated. Please close it and create a new one." @@ -55284,7 +55287,7 @@ msgstr "Polje {0} u redu {1} nije postavljeno" #: erpnext/stock/stock_ledger.py:369 msgid "The field {0} is required for reposting" -msgstr "" +msgstr "Polje {0} je obavezno za ponovno knjiženje" #: erpnext/accounts/doctype/share_transfer/share_transfer.py:188 msgid "The fields From Shareholder and To Shareholder cannot be blank" @@ -55309,7 +55312,7 @@ msgstr "Brojevi Folija nisu usklađeni" #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:306 msgid "The following Items, having Putaway Rules, could not be accommodated:" -msgstr "" +msgstr "Sljedeći artikli, koji imaju Pravila Odlaganja na Stranu, nisu mogli biti primjenjene:" #: erpnext/assets/doctype/asset_repair/asset_repair.py:137 msgid "The following Purchase Invoices are not submitted:" @@ -55337,7 +55340,7 @@ msgstr "Sljedeći personal još uvijek podnose izvještaj {0}:" #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py:185 msgid "The following invalid Pricing Rules are deleted:{0}" -msgstr "" +msgstr "Sljedeća nevažeća Pravila Cijena se brišu:{0}" #: erpnext/accounts/doctype/payment_request/payment_request.py:782 msgid "The following payment schedule(s) already exist:\n" @@ -55386,7 +55389,7 @@ msgstr "Artikli {items} nisu označeni kao {type_of} artikli. Možete ih omoguć #: erpnext/manufacturing/doctype/workstation/workstation.py:595 msgid "The job card {0} is in {1} state and you cannot complete it." -msgstr "" +msgstr "Radna Kartica {0} je u {1} stanju i ne možete je završiti." #: erpnext/manufacturing/doctype/workstation/workstation.py:589 msgid "The job card {0} is in {1} state and you cannot start it again." @@ -55424,11 +55427,11 @@ msgstr "Početno stanje se možda nije usklađeno s vašim bankovnim izvodom. Ž #: erpnext/manufacturing/doctype/operation/operation.py:43 msgid "The operation {0} cannot be added multiple times" -msgstr "" +msgstr "Operacija {0} se ne može dodati više puta" #: erpnext/manufacturing/doctype/operation/operation.py:48 msgid "The operation {0} cannot be its own sub-operation" -msgstr "" +msgstr "Operacija {0} ne može biti vlastita podoperacija" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:107 msgid "The original invoice should be consolidated before or along with the return invoice." @@ -55478,7 +55481,7 @@ msgstr "Procenat kojim vam je dozvoljeno prenijeti više naspram naručene koli #: erpnext/stock/doctype/item_price/item_price.py:71 msgid "The price list {0} does not exist or is disabled" -msgstr "" +msgstr "Cjenovnik {0} ne postoji ili je onemogućen" #. Description of the 'Last Purchase Rate' (Float) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -55507,7 +55510,7 @@ msgstr "Odabrane Sastavnice nisu za istu artikal" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:544 msgid "The selected change account {0} does not belong to Company {1}." -msgstr "" +msgstr "Odabrani račun povrata {0} ne pripada {1}." #: erpnext/stock/doctype/batch/batch.py:157 msgid "The selected item cannot have Batch" @@ -55524,7 +55527,7 @@ msgstr "Prodavač i Kupac ne mogu biti isti" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:186 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:198 msgid "The serial and batch bundle {0} is not linked to {1} {2}" -msgstr "" +msgstr "Serijski i Šaržni Paket {0} nije povezan sa {1} {2}" #: erpnext/stock/doctype/batch/batch.py:386 msgid "The serial no {0} does not belong to item {1}" @@ -55578,7 +55581,7 @@ msgstr "Zadatak je stavljen u red kao pozadinski posao. U slučaju da postoji bi #: erpnext/stock/doctype/material_request/material_request.py:352 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}" -msgstr "" +msgstr "Ukupna količina izdavanja / prijenosa {0} u Materijalnom Nalogu {1} ne može biti veća od dozvoljene tražene količine {2} za artikal {3}" #: erpnext/stock/doctype/material_request/material_request.py:359 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" @@ -55658,7 +55661,7 @@ msgstr "{0} {1} se ne poklapa s {0} {2} u {3} {4}" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1730 msgid "The {0} {1} is in submitted state, please cancel it first" -msgstr "" +msgstr "{0} {1} je u podnešenom stanju, prvo ga otkažite" #: erpnext/manufacturing/doctype/job_card/job_card.py:1075 msgid "The {0} {1} is used to calculate the valuation cost for the finished good {2}." @@ -55699,7 +55702,7 @@ msgstr "U sistemu nema unosa kod kojih je datum odobravanja prije datuma knjiže #: erpnext/stock/report/item_variant_details/item_variant_details.py:25 msgid "There are no item variants for the selected item" -msgstr "" +msgstr "Nema artikal varijanti za odabrani artikal" #: erpnext/www/book_appointment/index.js:95 msgid "There are no slots available on this date" @@ -55747,7 +55750,7 @@ msgstr "Postoji jedna neusklađena transakcija prije {0}." #: erpnext/stock/doctype/stock_entry/stock_entry.py:887 msgid "There must be at least 1 Finished Good in this Stock Entry" -msgstr "" +msgstr "U ovom Unosu Zaliha mora biti najmanje jedan gotov proizvod" #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:152 msgid "There was an error creating Bank Account while linking with Plaid." @@ -55759,7 +55762,7 @@ msgstr "Došlo je do greške pri sinhronizaciji transakcija." #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:174 msgid "There was an error updating Bank Account {0} while linking with Plaid." -msgstr "" +msgstr "Došlo je do greške prilikom ažuriranja Bankovnog Računa {0} prilikom povezivanja s Plaid-om." #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:81 msgid "There was an error while importing the bank statement." @@ -55815,7 +55818,7 @@ msgstr "Ovaj Unos Plaćanja je usklađen sa {0}. Otkazivanjem će se automatski #: erpnext/selling/doctype/product_bundle/product_bundle.py:121 msgid "This Product Bundle is linked with {0}. You will have to cancel these documents in order to delete this Product Bundle" -msgstr "" +msgstr "Ovaj Artikal Paket je povezan sa {0}. Morat ćete otkazati ove dokumente kako biste izbrisali ovaj Artikal Paket" #: erpnext/buying/doctype/purchase_order/mapper.py:251 msgid "This Purchase Order has been fully subcontracted." @@ -56156,7 +56159,7 @@ msgstr "Ovo će ograničiti pristup korisnika drugim zapisima zaposlenih" #: erpnext/controllers/selling_controller.py:901 msgid "This {0} will be treated as material transfer." -msgstr "" +msgstr "Ovaj {0} će se tretirati kao prijenos materijala." #. Option for the 'Under Withheld Reason' (Select) field in DocType 'Tax #. Withholding Entry' @@ -56288,7 +56291,7 @@ msgstr "Vremenska Linija" #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "Timeout (in seconds) for each background job enqueued by Process Period Closing Voucher" -msgstr "" +msgstr "Vremensko ograničenje (u sekundama) za svaki pozadinski zadatak koji je stavljen u red čekanja od strane verifikata za zatvaranje knjgovodstvenog perioda" #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:36 #: erpnext/public/js/projects/timer.js:5 @@ -56577,7 +56580,7 @@ msgstr "Do Vremena" #: erpnext/projects/doctype/timesheet_detail/timesheet_detail.py:108 msgid "To Time cannot be before From Time" -msgstr "" +msgstr "Do Vremena ne može biti prije Od Vremena" #. Description of the 'Referral Code' (Data) field in DocType 'Sales Partner' #: erpnext/setup/doctype/sales_partner/sales_partner.json @@ -56633,7 +56636,7 @@ msgstr "Dostava Klijentu" #: erpnext/accounts/doctype/sales_invoice/services/pos.py:276 msgid "To cancel a {0} you need to cancel the POS Closing Entry {1}." -msgstr "" +msgstr "Da biste otkazali {0}, potrebno je da otkažete unos zatvaranja Kase {1}." #: erpnext/accounts/doctype/sales_invoice/services/pos.py:290 msgid "To cancel this Sales Invoice you need to cancel the POS Closing Entry {0}." @@ -56645,7 +56648,7 @@ msgstr "Za kreiranje Zahtjeva Plaćanja obavezan je referentni dokument" #: erpnext/assets/doctype/asset_category/asset_category.py:120 msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" -msgstr "" +msgstr "Da biste omogućili knjigovodstvo nedovršenih kapitalnih radova, morate odabrati Račun nedovršenih kapitalnih radova u tabeli računa" #: erpnext/manufacturing/doctype/production_plan/production_plan.js:734 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." @@ -56824,19 +56827,19 @@ msgstr "Ukupni Predujam" #: erpnext/public/js/utils.js:250 msgid "Total Advance Paid" -msgstr "" +msgstr "Ukupno Plaćeno Unaprijed" #: erpnext/public/js/utils.js:195 msgid "Total Advance Paid: {0}" -msgstr "" +msgstr "Ukupno Plaćeno Unaprijed: {0}" #: erpnext/public/js/utils.js:252 msgid "Total Advance Received" -msgstr "" +msgstr "Ukupno Primljeno Unaprijed" #: erpnext/public/js/utils.js:198 msgid "Total Advance Received: {0}" -msgstr "" +msgstr "Ukupno Primljeno Unaprijed: {0}" #. Label of the total_allocated_amount (Currency) field in DocType 'Payment #. Entry' @@ -57495,7 +57498,7 @@ msgstr "Ukupno Vrijeme u minutama" #: erpnext/public/js/utils.js:253 msgid "Total Unpaid" -msgstr "" +msgstr "Ukupno Neplaćeno" #: erpnext/public/js/utils.js:200 msgid "Total Unpaid: {0}" @@ -57595,7 +57598,7 @@ msgstr "Ukupno sati: {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:574 #: erpnext/accounts/doctype/sales_invoice/services/pos.py:190 msgid "Total payments amount can't be greater than {0}" -msgstr "" +msgstr "Ukupan iznos plaćanja ne može biti veći od {0}" #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py:66 msgid "Total percentage against cost centers should be 100" @@ -57614,7 +57617,7 @@ msgstr "Ukupno {0} ({1})" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:248 msgid "Total {0} for all items is zero, maybe you should change 'Distribute Charges Based On'" -msgstr "" +msgstr "Ukupni iznos {0} a za sve artikle je nula, možda biste trebali promijeniti 'Raspodjeli Troškove na Osnovu'" #: erpnext/controllers/trends.py:25 erpnext/controllers/trends.py:32 msgid "Total(Amt)" @@ -58155,7 +58158,7 @@ msgstr "Probni Bilans Stranke" #: erpnext/accounts/report/trial_balance/trial_balance.py:595 msgid "Trial Balance requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Probni Bilans zahtijeva sinhronizaciju {0} sa DuckDB-om" #. Label of the trial_period_end (Date) field in DocType 'Subscription' #: erpnext/accounts/doctype/subscription/subscription.json @@ -59399,7 +59402,7 @@ msgstr "Korisnik nije primijenio pravilo na fakturi {0}" #: erpnext/crm/frappe_crm_api.py:175 msgid "User not allowed to synchronize data from Frappe CRM on ERPNext. Contact System Manager of ERPNext." -msgstr "" +msgstr "Korisniku nije dozvoljeno sinhroniziranje podataka iz Prodajne Podrške u Sistem. Kontaktiraj Odgovornog Sistema." #: erpnext/setup/doctype/employee/employee.py:298 msgid "User {0} does not exist" @@ -59415,7 +59418,7 @@ msgstr "Korisnik {0} je već dodijeljen {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:62 msgid "User {0} is disabled. Please select valid user/cashier" -msgstr "" +msgstr "Korisnik {0} je onemogućen. Odaberi važećeg korisnika/blagajnika" #: erpnext/setup/doctype/employee/employee.py:365 msgid "User {0}: Removed Employee Self Service role as there is no mapped employee." @@ -59763,7 +59766,7 @@ msgstr "Naknade za tip vrijednovanja ne mogu biti označene kao Inkluzivne" #: erpnext/public/js/controllers/accounts.js:228 msgid "Valuation type charges cannot be marked as Inclusive" -msgstr "" +msgstr "Naknade tipa procjene vrijednosti ne mogu biti označene kao uključene." #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:58 msgid "Value (G - D)" @@ -61329,11 +61332,11 @@ msgstr "Sažetka Izvještaja Radnog Naloga" #: erpnext/stock/doctype/material_request/material_request.py:579 msgid "Work Order cannot be created for the following reason:
{0}" -msgstr "" +msgstr "Radni Nalog se ne može kreirati iz sljedećeg razloga:
{0}" #: erpnext/manufacturing/doctype/work_order/work_order.py:857 msgid "Work Order cannot be raised against an Item Template" -msgstr "" +msgstr "Radni Nalog se nemože pokrenuti naspram Šablona Artikla" #: erpnext/manufacturing/doctype/work_order/work_order.py:1123 #: erpnext/manufacturing/doctype/work_order/work_order.py:1170 @@ -61686,7 +61689,7 @@ msgstr "Uvoziš podatke za Listu Koda:" #: erpnext/accounts/services/child_item_update.py:232 msgid "You are not allowed to update as per the conditions set in {0} Workflow." -msgstr "" +msgstr "Nije vam dozvoljeno ažuriranje prema uslovima postavljenim u {0} Radnom Toku." #: erpnext/accounts/services/gl_validator.py:114 msgid "You are not authorized to add or update entries before {0}" @@ -61706,7 +61709,7 @@ msgstr "Birate više od potrebne količine za artikal {0}. Provjerite postoji li #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:111 msgid "You can add the original invoice {0} manually to proceed." -msgstr "" +msgstr "Možete ručno dodati originalnu fakturu {0} da biste nastavili." #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:743 msgid "You can also add credit or debit values to pre-fill - these support both static values (like 200) or formulas (like transaction_amount * 0.25)." @@ -61718,7 +61721,7 @@ msgstr "Takođe možete kopirati i zalijepiti ovu vezu u svoj pretraživač" #: erpnext/assets/doctype/asset_category/asset_category.py:124 msgid "You can also set default CWIP account in Company {0}" -msgstr "" +msgstr "Također možete postaviti standard Račun Kapitalnog Posla u Toku za {0}" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 msgid "You can change the parent account to a Balance Sheet account or select a different account." @@ -61747,7 +61750,7 @@ msgstr "Možete odabrati samo jedan način plaćanja kao standard" #: erpnext/selling/page/point_of_sale/pos_payment.js:595 msgid "You can redeem up to {0}." -msgstr "" +msgstr "Možete iskoristiti do {0}." #: banking/src/components/features/BankReconciliation/IncorrectlyClearedEntries.tsx:193 msgid "You can reset the clearing dates of these entries here." @@ -61779,11 +61782,11 @@ msgstr "Ne možete kreirati {0} unutar zatvorenog Knjigovodstvenog Perioda {1}" #: erpnext/accounts/services/gl_validator.py:64 msgid "You cannot create or cancel any accounting entries within the closed Accounting Period {0}" -msgstr "" +msgstr "Ne možete izraditi niti otkazati nikakve knjigovodstvene zapise unutar zatvorenog knjigovodstvenog perioda. {0}" #: erpnext/accounts/services/gl_validator.py:145 msgid "You cannot create/amend any accounting entries until this date." -msgstr "" +msgstr "Ne možete izraditi/izmijeniti bilo koje knjigovodstvene unose do ovog datuma." #: erpnext/accounts/doctype/journal_entry/journal_entry.py:675 msgid "You cannot credit and debit same account at the same time" @@ -61795,7 +61798,7 @@ msgstr "Ne možete izbrisati tip projekta 'Eksterni'" #: erpnext/setup/doctype/department/department.js:19 msgid "You cannot edit the root node." -msgstr "" +msgstr "Ne možete uređivati korijenski čvor." #: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 msgid "You cannot enable both the settings '{0}' and '{1}'." @@ -61803,15 +61806,15 @@ msgstr "Ne možete omogućiti i '{0}' i '{1} postavke." #: erpnext/manufacturing/doctype/job_card/job_card.py:1441 msgid "You cannot make any changes to Job Card since Work Order is closed." -msgstr "" +msgstr "Ne možete napraviti nikakve promjene na Radnoj Kartici jer je Radni Nalog zatvoren." #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:167 msgid "You cannot outward the following {0} as they are either Delivered, Inactive or located in a different warehouse." -msgstr "" +msgstr "Ne možete poslati sljedeće {0} jer su ili Dostavljeni, Neaktivni ili se nalaze u drugom skladištu." #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:229 msgid "You cannot process the serial number {0} as it has already been used in the SABB {1}. {2} If you want to inward the same serial number multiple times, then enable 'Allow existing Serial No to be Manufactured/Received again' in the {3}" -msgstr "" +msgstr "Ne možete obraditi serijski broj {0} jer je već korišten u Serijskom i Šaržnom Paketu {1}. {2} ako želite da primite isti serijski broj više puta, tada omogući 'Dozvoli da se postojeći Serijski Broj ponovo Proizvede/Primi' u {3}" #: erpnext/selling/page/point_of_sale/pos_payment.js:625 msgid "You cannot redeem more than {0}." @@ -61819,7 +61822,7 @@ msgstr "Ne možete iskoristiti više od {0}." #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 msgid "You cannot repost item valuation before {0}" -msgstr "" +msgstr "Ne možete ponovo knjižiti procjenu vrijednosti artikla prije {0}" #: erpnext/accounts/doctype/subscription/subscription.py:832 msgid "You cannot restart a Subscription that is not cancelled." @@ -61827,7 +61830,7 @@ msgstr "Ne možete ponovo pokrenuti Pretplatu koja nije otkazana." #: erpnext/selling/page/point_of_sale/pos_payment.js:281 msgid "You cannot submit an empty order." -msgstr "" +msgstr "Ne možete podnijeti prazan nalog." #: erpnext/selling/page/point_of_sale/pos_payment.js:280 msgid "You cannot submit the order without payment." @@ -61843,7 +61846,7 @@ msgstr "Ne možete {0} ovaj dokument jer postoji drugi Unos Zatvaranje Perioda { #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:165 msgid "You do not have enough permission to access {0}: {1}" -msgstr "" +msgstr "Nemate dovoljno dozvola za pristup {0}: {1}" #: erpnext/accounts/doctype/bank_statement_import_log/bank_statement_import_log.py:82 msgid "You do not have permission to import and submit bank transactions" @@ -61856,7 +61859,7 @@ msgstr "Nemate dozvolu za uvoz bankovnih transakcija" #: erpnext/accounts/services/child_item_update.py:210 msgid "You do not have permissions to {0} items in a {1}." -msgstr "" +msgstr "Nemate dozvole za {0} artikla u {1}." #: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:187 msgid "You don't have enough Loyalty Points to redeem" @@ -61884,7 +61887,7 @@ msgstr "Nemate dozvolu za ažuriranje ovog dokumenta.Kontaktiraj Odgovornog Sist #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:310 msgid "You had {0} errors while creating opening invoices. Check {1} for more details" -msgstr "" +msgstr "Imali ste {0} grešaka prilikom izrade početnih faktura. Pogledaj {1} za više detalja" #: erpnext/public/js/utils.js:1055 msgid "You have already selected items from {0} {1}" @@ -61904,7 +61907,7 @@ msgstr "Omogućili ste {0} i {1} u {2}. Ovo može dovesti do umetanja cijena iz #: erpnext/stock/doctype/shipment/shipment.js:442 msgid "You have entered a duplicate Delivery Note on row {0}. Please rectify and try again." -msgstr "" +msgstr "Unijeli ste duplikat Dostavnice u red {0}. Ispravi grešku i pokušaj ponovo." #: banking/src/components/features/BankReconciliation/BankPicker.tsx:64 msgid "You have not added any bank accounts to your company." @@ -61928,7 +61931,7 @@ msgstr "Morate odabrati Klijenta prije dodavanja Artikla." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:282 msgid "You need to cancel POS Closing Entry {0} to be able to cancel this document." -msgstr "" +msgstr "Morate otkazati Unos Zatvaranje Kase {0} da biste mogli otkazati ovaj dokument." #: erpnext/accounts/services/taxes.py:277 msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account." @@ -61984,7 +61987,7 @@ msgstr "Nulto Stanje" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:353 msgid "Zero Balance Journal: {0}" -msgstr "" +msgstr "Žurnal Nultog Stanja: {0}" #: erpnext/regional/report/uae_vat_201/uae_vat_201.py:78 msgid "Zero Rated" @@ -62108,7 +62111,7 @@ msgstr "naziv polja" #: erpnext/setup/doctype/item_group/item_group.py:49 msgid "for tax category {0}" -msgstr "" +msgstr "za PDV kategoriju {0}" #. Option for the 'Service Provider' (Select) field in DocType 'Currency #. Exchange Settings' @@ -62467,7 +62470,7 @@ msgstr "{0} ne može biti negativan" #: erpnext/accounts/doctype/sales_invoice/services/loyalty.py:77 msgid "{0} cannot be cancelled since the Loyalty Points earned has been redeemed. First cancel the {1} No {2}" -msgstr "" +msgstr "{0} se ne može otkazati jer su zarađeni bodovi lojalnosti iskorišteni. Prvo otkaži {1} Broj {2}" #: erpnext/accounts/doctype/pos_settings/pos_settings.py:53 msgid "{0} cannot be changed with opened Opening Entries." @@ -62475,7 +62478,7 @@ msgstr "{0} se ne može mijenjati s otvorenim Početnim Unosima." #: erpnext/public/js/utils/sales_common.js:336 msgid "{0} cannot be greater than 100" -msgstr "" +msgstr "{0} ne može biti veće od 100" #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py:136 msgid "{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}" @@ -62544,7 +62547,7 @@ msgstr "{0} je uspješno podnešen" #: erpnext/controllers/buying_controller.py:289 msgid "{0} has submitted assets linked to it. You need to cancel the assets to create purchase return." -msgstr "" +msgstr "{0} je podnio/la imovinu povezanu s njim/njom. Morate otkazati imovinu da biste izradili povrat." #: erpnext/projects/doctype/project/project_dashboard.html:15 msgid "{0} hours" @@ -62556,7 +62559,7 @@ msgstr "{0} u redu {1}" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:66 msgid "{0} is a child company." -msgstr "" +msgstr "{0} je podređeno poduzeće." #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:465 msgid "{0} is a child table and will be deleted automatically with its parent" @@ -62639,7 +62642,7 @@ msgstr "{0} nije omogućen u {1}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:649 msgid "{0} is not running. Cannot trigger events for this document" -msgstr "" +msgstr "{0} se ne izvršava. Nije moguće pokrenuti događaje za ovaj dokument" #: erpnext/stock/doctype/material_request/material_request.py:478 msgid "{0} is not the default supplier for any items." @@ -62647,7 +62650,7 @@ msgstr "{0} nije standard dobavljač za bilo koji artikal." #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2686 msgid "{0} is on hold until {1}" -msgstr "" +msgstr "{0} je na čekanju do {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:68 msgid "{0} is open. Close the POS or cancel the existing POS Opening Entry to create a new POS Opening Entry." @@ -62822,11 +62825,11 @@ msgstr "{0} {1} je već povezan sa Zajedničkim Kodom {2}." #: erpnext/accounts/doctype/party_link/party_link.py:53 #: erpnext/accounts/doctype/party_link/party_link.py:63 msgid "{0} {1} is already linked with another {2}" -msgstr "" +msgstr "{0} {1} je već povezan sa drugim {2}" #: erpnext/accounts/doctype/party_link/party_link.py:40 msgid "{0} {1} is already linked with {2} {3}" -msgstr "" +msgstr "{0} {1} je već povezan s {2} {3}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:711 msgid "{0} {1} is associated with {2}, but Party Account is {3}" @@ -62867,7 +62870,7 @@ msgstr "{0} {1} nije aktivan" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:452 msgid "{0} {1} is not affecting bank account {2}" -msgstr "" +msgstr "{0} {1} ne utiče na bankovni račun {2}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:688 msgid "{0} {1} is not associated with {2} {3}" diff --git a/erpnext/locale/fa.po b/erpnext/locale/fa.po index f8f26879689..326be58cd19 100644 --- a/erpnext/locale/fa.po +++ b/erpnext/locale/fa.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" "POT-Creation-Date: 2026-06-28 10:20+0000\n" -"PO-Revision-Date: 2026-06-29 20:08\n" +"PO-Revision-Date: 2026-07-01 20:39\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -14218,7 +14218,7 @@ msgstr "آدرس فعلی" #. Label of the current_accommodation_type (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Current Address Is" -msgstr "آدرس فعلی است" +msgstr "آدرس فعلی" #. Label of the current_amount (Currency) field in DocType 'Stock #. Reconciliation Item' @@ -17767,7 +17767,7 @@ msgstr "سود سهام پرداخت شده" #. Option for the 'Marital Status' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Divorced" -msgstr "جدا شده" +msgstr "طلاق گرفته" #. Option for the 'Status' (Select) field in DocType 'Lead' #: erpnext/crm/doctype/lead/lead.json @@ -30241,7 +30241,7 @@ msgstr "متخصص بازاریابی" #. Option for the 'Marital Status' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Married" -msgstr "متاهل" +msgstr "متأهل" #: erpnext/setup/setup_wizard/data/marketing_source.txt:7 msgid "Mass Mailing" @@ -34688,7 +34688,7 @@ msgstr "" #. Option for the 'Current Address Is' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Owned" -msgstr "مالکیت" +msgstr "ملکی" #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js:29 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:24 @@ -37162,7 +37162,7 @@ msgstr "آدرس دائمی" #. 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Permanent Address Is" -msgstr "آدرس دائمی است" +msgstr "آدرس دائمی" #: erpnext/accounts/doctype/bank_statement_import_log/bank_statement_import_log.py:73 #: erpnext/accounts/doctype/bank_statement_import_log/bank_statement_import_log.py:77 @@ -44208,7 +44208,7 @@ msgstr "اجاره" #. Option for the 'Current Address Is' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Rented" -msgstr "اجاره شده" +msgstr "استیجاری" #. Label of the reorder_level (Float) field in DocType 'Material Request Item' #: erpnext/stock/doctype/material_request_item/material_request_item.json @@ -50940,7 +50940,7 @@ msgstr "" #. Option for the 'Marital Status' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Single" -msgstr "تنها" +msgstr "مجرد" #. Option for the 'Bank Entry Type' (Select) field in DocType 'Bank Transaction #. Rule' @@ -60982,7 +60982,7 @@ msgstr "هنگام تهیه فاکتور خرید از سفارش خرید، ب #. Option for the 'Marital Status' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json msgid "Widowed" -msgstr "بیوه" +msgstr "همسر فوت شده" #. Label of the width (Float) field in DocType 'Shipment Parcel' #. Label of the width (Float) field in DocType 'Shipment Parcel Template' @@ -61884,7 +61884,7 @@ msgstr "تراز صفر" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:353 msgid "Zero Balance Journal: {0}" -msgstr "" +msgstr "دفتر تراز صفر: {0}" #: erpnext/regional/report/uae_vat_201/uae_vat_201.py:78 msgid "Zero Rated" @@ -62008,7 +62008,7 @@ msgstr "fieldname" #: erpnext/setup/doctype/item_group/item_group.py:49 msgid "for tax category {0}" -msgstr "" +msgstr "برای دسته بندی مالیاتی {0}" #. Option for the 'Service Provider' (Select) field in DocType 'Currency #. Exchange Settings' @@ -62375,7 +62375,7 @@ msgstr "" #: erpnext/public/js/utils/sales_common.js:336 msgid "{0} cannot be greater than 100" -msgstr "" +msgstr "{0} نمی‌تواند بزرگتر از ۱۰۰ باشد" #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py:136 msgid "{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}" @@ -62444,7 +62444,7 @@ msgstr "{0} با موفقیت ارسال شد" #: erpnext/controllers/buying_controller.py:289 msgid "{0} has submitted assets linked to it. You need to cancel the assets to create purchase return." -msgstr "" +msgstr "{0} دارایی‌های مرتبط با آن را ارسال کرده است. برای ایجاد بازگشت خرید، باید دارایی‌ها را لغو کنید." #: erpnext/projects/doctype/project/project_dashboard.html:15 msgid "{0} hours" @@ -62456,7 +62456,7 @@ msgstr "{0} در ردیف {1}" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:66 msgid "{0} is a child company." -msgstr "" +msgstr "{0} یک شرکت فرزند است." #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:465 msgid "{0} is a child table and will be deleted automatically with its parent" @@ -62539,7 +62539,7 @@ msgstr "{0} در {1} فعال نیست" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:649 msgid "{0} is not running. Cannot trigger events for this document" -msgstr "" +msgstr "{0} در حال اجرا نیست. نمی‌توان رویدادها را برای این سند فعال کرد" #: erpnext/stock/doctype/material_request/material_request.py:478 msgid "{0} is not the default supplier for any items." @@ -62547,7 +62547,7 @@ msgstr "{0} تامین کننده پیش‌فرض هیچ موردی نیست." #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2686 msgid "{0} is on hold until {1}" -msgstr "" +msgstr "{0} تا زمان {1} در حالت انتظار است" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:68 msgid "{0} is open. Close the POS or cancel the existing POS Opening Entry to create a new POS Opening Entry." @@ -62722,11 +62722,11 @@ msgstr "" #: erpnext/accounts/doctype/party_link/party_link.py:53 #: erpnext/accounts/doctype/party_link/party_link.py:63 msgid "{0} {1} is already linked with another {2}" -msgstr "" +msgstr "{0} {1} از قبل به {2} دیگری لینک شده است" #: erpnext/accounts/doctype/party_link/party_link.py:40 msgid "{0} {1} is already linked with {2} {3}" -msgstr "" +msgstr "{0} {1} از قبل به {2} {3} لینک شده است" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:711 msgid "{0} {1} is associated with {2}, but Party Account is {3}" @@ -62767,7 +62767,7 @@ msgstr "{0} {1} فعال نیست" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:452 msgid "{0} {1} is not affecting bank account {2}" -msgstr "" +msgstr "{0} {1} تاثیری بر حساب بانکی {2} ندارد" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:688 msgid "{0} {1} is not associated with {2} {3}" diff --git a/erpnext/locale/hr.po b/erpnext/locale/hr.po index 71ebf3f6525..221c1d12322 100644 --- a/erpnext/locale/hr.po +++ b/erpnext/locale/hr.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" "POT-Creation-Date: 2026-06-28 10:20+0000\n" -"PO-Revision-Date: 2026-06-28 20:03\n" +"PO-Revision-Date: 2026-07-01 20:39\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Croatian\n" "MIME-Version: 1.0\n" @@ -269,7 +269,7 @@ msgstr "'Dozvoli višestruke Prodajne Naloge naspram Nabavnog Naloga Klijenta'" #: erpnext/controllers/trends.py:62 msgid "'Based On' and 'Group By' can not be the same" -msgstr "" +msgstr "'Na Temelju' i 'Grupiraj Po' ne mogu biti isti" #: erpnext/selling/report/inactive_customers/inactive_customers.py:23 msgid "'Days Since Last Order' must be greater than or equal to zero" @@ -295,15 +295,15 @@ msgstr "'Od datuma' mora biti nakon 'Do datuma'" #: erpnext/stock/doctype/item/item.py:466 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" -msgstr "" +msgstr "'Ima Serijski Broj' ne može biti 'Da' za artikal koji nije na zalihama" #: erpnext/stock/doctype/quality_inspection/quality_inspection.py:145 msgid "'Inspection Required before Delivery' is disabled for the item {0}, no need to create the QI" -msgstr "" +msgstr "'Kontrola Obavezna prije Dostave' je onemogućena za artikal {0}, nema potrebe za izradom Kontrole Kvaliteta" #: erpnext/stock/doctype/quality_inspection/quality_inspection.py:136 msgid "'Inspection Required before Purchase' is disabled for the item {0}, no need to create the QI" -msgstr "" +msgstr "'Kontrola Obavezna prije Nabave' je onemogućena za artikal {0}, nema potrebe za izradom Kontrole Kvaliteta" #: erpnext/stock/report/stock_ledger/stock_ledger.py:684 #: erpnext/stock/report/stock_ledger/stock_ledger.py:725 @@ -323,7 +323,7 @@ msgstr "'Do Paketa Broj' ne može biti manje od 'Od Paketa Broj.'" #: erpnext/controllers/sales_and_purchase_return.py:80 msgid "'Update Stock' cannot be checked because items are not delivered via {0}" -msgstr "" +msgstr "'Ažuriraj Zalihe' se ne može provjeriti jer se artikli ne dostavljaju putem {0}" #: erpnext/accounts/doctype/sales_invoice/services/fixed_assets.py:46 msgid "'Update Stock' cannot be checked for fixed asset sale" @@ -827,7 +827,7 @@ msgstr "

Ne možese fakturisati više od predviđenog iznosa za sljedeće arti #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:159 msgid "

Following {0}s do not belong to Company {1}:

" -msgstr "" +msgstr "

Slijedeći {0} ne pripadaju {1} :

" #. Content of the 'html_llwp' (HTML) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -1042,7 +1042,7 @@ msgstr "A - C" #: erpnext/selling/doctype/customer/customer.py:358 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" -msgstr "" +msgstr "Grupa Klijenta postoji sa istim imenom, molimo promijenite naziv klijenta ili preimenujte Grupu Klijenta" #: erpnext/manufacturing/doctype/workstation/workstation.js:73 msgid "A Holiday List can be added to exclude counting these days for the Workstation." @@ -1054,7 +1054,7 @@ msgstr "Potencijalni Klijent zahtijeva ili ime osobe ili ime tvrtke" #: erpnext/stock/doctype/packing_slip/packing_slip.py:83 msgid "A Packing Slip can only be created for a Draft Delivery Note." -msgstr "" +msgstr "Otpremnica se može kreirati samo za nacrt Dostavnice." #: erpnext/accounts/services/gl_validator.py:123 msgid "A Period Closing Voucher is already submitted and an Opening Entry can no longer be created. {0} to learn more." @@ -1312,7 +1312,7 @@ msgstr "Pristupni ključ je potreban za davaoca usluga: {0}" #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:423 msgid "Access to Request for Quotation from the portal is disabled. To allow access, enable it in Portal Settings." -msgstr "" +msgstr "Pristup zahtjevu za ponudu sa portala je onemogućen. Da biste omogućili pristup, omogućite ga u Postavkama Portala." #. Description of the 'Common Code' (Data) field in DocType 'UOM' #: erpnext/setup/doctype/uom/uom.json @@ -2062,7 +2062,7 @@ msgstr "Knjigovodstveni Period" #: erpnext/accounts/doctype/accounting_period/accounting_period.py:49 msgid "Accounting Period cannot be created for a future date. End Date {0} is after today." -msgstr "" +msgstr "Knjigovodstveno razdoblje ne može se izraditi za budući datum. Datum završetka {0} je sutra." #: erpnext/accounts/doctype/accounting_period/accounting_period.py:77 msgid "Accounting Period overlaps with {0}" @@ -2921,7 +2921,7 @@ msgstr "Dodata uloga dobavljača korisniku {0}." #: erpnext/controllers/website_list_for_contact.py:311 msgid "Added {1} role to user {0}." -msgstr "" +msgstr "Dodana je uloga {1} korisniku {0}." #: erpnext/crm/doctype/lead/lead.js:81 msgid "Adding Lead to Prospect..." @@ -3183,7 +3183,7 @@ msgstr "Dodatna Prenesena Količina" #: erpnext/manufacturing/doctype/work_order/work_order.py:591 msgid "Additional Transferred Qty {0} cannot be greater than {1}. To fix this, increase the percentage value of the field 'Transfer Extra Raw Materials to WIP' in Manufacturing Settings." -msgstr "" +msgstr "Dodatna Prenesena Količina {0} ne može biti veća od {1}. Da biste ovo ispravili, povećajte postotnu vrijednostpolja 'Prenesi Dodatne Sirovine u Nedovršenu Proizvodnju'u Postavkama Proizvodnje." #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:630 msgid "Additional {0} {1} of item {2} required as per BOM to complete this transaction" @@ -3779,7 +3779,7 @@ msgstr "Algoritam" #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json msgid "Alias" -msgstr "" +msgstr "Nadimak" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 @@ -3989,7 +3989,7 @@ msgstr "Svi komentari i e-pošta kopirat će se iz jednog dokumenta u drugi novo #: erpnext/selling/page/point_of_sale/pos_past_order_summary.js:204 msgid "All the items have already been returned." -msgstr "" +msgstr "Svi artikli su već vraćeni." #: erpnext/manufacturing/doctype/work_order/work_order.js:1272 msgid "All the required items (raw materials) will be fetched from BOM and populated in this table. Here you can also change the Source Warehouse for any item. And during the production, you can track transferred raw materials from this table." @@ -3997,7 +3997,7 @@ msgstr "Svi obavezni Artikli (sirovine) bit će preuzeti iz Sastavnice i popunje #: erpnext/stock/doctype/delivery_note/mapper.py:82 msgid "All these items have already been invoiced/returned" -msgstr "" +msgstr "Svi ovi artikli su već fakturirani/vraćeni" #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js:100 #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js:101 @@ -4144,7 +4144,7 @@ msgstr "Dozvoli Alternativni Artikal" #: erpnext/stock/doctype/item_alternative/item_alternative.py:68 msgid "Allow Alternative Item must be checked on Item {0}" -msgstr "" +msgstr "Dozvoli Alternativni Artikal mora biti odabrano za Artikal {0}" #. Label of the material_consumption (Check) field in DocType 'Manufacturing #. Settings' @@ -4536,7 +4536,7 @@ msgstr "Dozvoljena Transakcija sa" #. Settings' #: erpnext/crm/doctype/crm_settings/crm_settings.json msgid "Allowed Users" -msgstr "" +msgstr "Dopušteni Korisnici" #: erpnext/accounts/doctype/party_link/party_link.py:27 msgid "Allowed primary roles are 'Customer' and 'Supplier'. Please select one of these roles only." @@ -5459,7 +5459,7 @@ msgstr "Termin s" #: erpnext/www/book_appointment/index.js:237 msgid "Appointment created successfully" -msgstr "" +msgstr "Termin je uspješno zakazan" #: erpnext/crm/doctype/appointment/appointment.py:101 msgid "Appointment was created. But no lead was found. Please check the email to confirm" @@ -5505,11 +5505,11 @@ msgstr "Jeste li sigurni da želite izbrisati sve demo podatke?" #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:51 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:100 msgid "Are you sure you want to create Reposting Entries?" -msgstr "" +msgstr "Jeste li sigurni da želite stvoriti ponovno knjiženje unosa?" #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js:66 msgid "Are you sure you want to create a Reposting Entry?" -msgstr "" +msgstr "Jeste li sigurni da želite stvoriti ponovno knjiženje unosa?" #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:480 msgid "Are you sure you want to delete this Item?" @@ -5603,7 +5603,7 @@ msgstr "Pošto ima dovoljno sirovina, Materijalni Nalog nije potreban za Skladi #: erpnext/stock/doctype/stock_settings/stock_settings.py:250 msgid "As there is reserved stock, you cannot disable {0}." -msgstr "" +msgstr "Budući da postoje rezervirane zalihe, ne možete onemogućiti {0}." #: erpnext/stock/doctype/stock_settings/stock_settings.py:224 #: erpnext/stock/doctype/stock_settings/stock_settings.py:236 @@ -6194,7 +6194,7 @@ msgstr "Dodijeli Imenu" #: erpnext/buying/doctype/purchase_order/purchase_order.js:593 #: erpnext/public/js/controllers/buying.js:555 msgid "Assigning {0} to {1} (row {2})" -msgstr "" +msgstr "Dodjeljuje se {0} {1} (red {2})" #. Label of the filters_section (Section Break) field in DocType 'Service Level #. Agreement' @@ -6220,7 +6220,7 @@ msgstr "U Redu {0}: U Serijskom i Šaržnom Paketu {1} mora imati status dokumen #: erpnext/accounts/services/internal_transfer.py:98 msgid "At Row {0}: The field {1} is mandatory for internal transfer" -msgstr "" +msgstr "U redu {0}: Polje {1} je obavezno za interni prijenos" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:85 msgid "At least one account with exchange gain or loss is required" @@ -6253,7 +6253,7 @@ msgstr "Najmanje jedno od Prodaje ili Nabave mora biti odabrano" #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:226 msgid "At least one raw material for Finished Good Item {0} should be customer provided." -msgstr "" +msgstr "Klijent treba osigurati barem jednu sirovinu za Gotov Proizvod {0}." #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:60 msgid "At least one raw material item must be present in the stock entry for the type {0}" @@ -6293,7 +6293,7 @@ msgstr "Red {0}: Serijski Broj je obavezan za Artikal {1}" #: erpnext/stock/services/serial_batch_bundle_service.py:498 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." -msgstr "" +msgstr "U redu {0}: Serijski i Šaržni Paket {1} je već izrađen. Ukloni vrijednosti za serijski broj ili broj šarže." #: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:123 msgid "At row {0}: set Parent Row No for item {1}" @@ -6930,7 +6930,7 @@ msgstr "Sastavnica 1" #: erpnext/manufacturing/doctype/bom/mapper.py:82 msgid "BOM 1 {0} and BOM 2 {1} should not be the same" -msgstr "" +msgstr "Sastavnica 1 {0} i Sastavnica 2 {1} ne smiju biti isti" #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:38 msgid "BOM 2" @@ -7188,7 +7188,7 @@ msgstr "Rekurzija Sastavnice: {1} ne može biti nadređena ili podređena {0}" #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.js:81 msgid "BOM update is queued and may take a few minutes. Check {0} for progress." -msgstr "" +msgstr "Ažuriranje Sastavnice je u redu čekanja i može potrajati nekoliko minuta. Provjerite {0} za napredak." #: erpnext/manufacturing/doctype/bom/bom.py:1404 msgid "BOM {0} does not belong to Item {1}" @@ -7351,7 +7351,7 @@ msgstr "Sažetak Bilansa Stanja" #: erpnext/accounts/report/balance_sheet/balance_sheet.py:284 msgid "Balance Sheet requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Bilansa Stanja zahtijeva da se {0} sinkronizuje s DuckDB-om" #: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary_header.html:13 msgid "Balance Stock Qty" @@ -7514,7 +7514,7 @@ msgstr "Tip Bankovnog Računa" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:443 msgid "Bank Account {0} in Bank Transaction {1} is not matching with Bank Account {2}" -msgstr "" +msgstr "Bankovni Račun {0} u Bankovnoj Transakciji {1} ne odgovara Bankovnim Računu {2}" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:15 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:20 @@ -8096,7 +8096,7 @@ msgstr "Broj Šarže je obavezan" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3495 msgid "Batch No {0} does not exist" -msgstr "" +msgstr "Broj Šarže {0} ne postoji" #: erpnext/stock/utils.py:625 msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." @@ -8108,7 +8108,7 @@ msgstr "Broj Šarže {0} nije prisutan u originalnom {1} {2}, stoga ga ne možet #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:658 msgid "Batch No {0} of Item {1} has negative stock of quantity {2} in the warehouse {3}" -msgstr "" +msgstr "Broj Šarže {0} Artikla {1} ima negativnu količinu {2} u skladištu {3}" #. Label of the batch_no (Int) field in DocType 'BOM Update Batch' #: erpnext/manufacturing/doctype/bom_update_batch/bom_update_batch.json @@ -8177,7 +8177,7 @@ msgstr "Šarža i Serijski Broj" #: erpnext/manufacturing/doctype/work_order/work_order.py:742 msgid "Batch not created for item {0} since it does not have a batch series." -msgstr "" +msgstr "Šarža nije izrađena za artikal {0} jer nema Broj Šarže." #. Description of the 'Automatically Create New Batch' (Check) field in DocType #. 'Item' @@ -8765,7 +8765,7 @@ msgstr "Proknjižena Osnovna Imovina" #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" -msgstr "" +msgstr "Knjigovodstvo je zatvoreno do kraja razdoblja koje završava {0}" #. Option for the 'Type of Transaction' (Select) field in DocType 'Inventory #. Dimension' @@ -8993,7 +8993,7 @@ msgstr "Proračun se ne može dodijeliti naspram Grupnog Računu {0}" #: erpnext/accounts/doctype/budget/budget.py:165 msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" -msgstr "" +msgstr "Proračun se ne može dodijeliti za {0}, jer njegova Kontna Klasa nije Prihod ili Rashod" #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" @@ -9347,7 +9347,7 @@ msgstr "Izračunata Razlika Popusta" #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:95 msgid "Calculating arrival times" -msgstr "" +msgstr "Izračunavanje vremena dolaska" #. Label of the section_break_11 (Section Break) field in DocType 'Supplier #. Scorecard Period' @@ -9565,7 +9565,7 @@ msgstr "Ne može se promijeniti način vrijednovanja, jer postoje transakcije na #: erpnext/stock/doctype/stock_settings/stock_settings.py:191 msgid "Can't change the valuation method, as there are transactions against some items which do not have their own valuation method" -msgstr "" +msgstr "Ne može se promijeniti način vrijednovanja, jer postoje transakcije za neke artikle koji nemaju vlastiti metod vrijednovanja" #: erpnext/support/doctype/warranty_claim/warranty_claim.py:79 msgid "Cancel Material Visit {0} before cancelling this Warranty Claim" @@ -9644,7 +9644,7 @@ msgstr "Ne može biti artikal fiksne imovine jer je kreiran Registar Zaliha." #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:92 #: erpnext/stock/doctype/delivery_trip/delivery_trip.py:219 msgid "Cannot calculate arrival time as the driver address is missing." -msgstr "" +msgstr "Nije moguće izračunati vrijeme dolaska jer nedostaje adresa vozača." #: erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py:117 msgid "Cannot cancel Asset Depreciation Schedule {0} as it has a draft journal entry {1}." @@ -9656,7 +9656,7 @@ msgstr "Ne može se otkazati Unos Zatvaranja Blagajne" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:140 msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" -msgstr "" +msgstr "Ne može se otkazati Unos Rezervacije Zaliha {0} jer je korišten u radnom nalogu {1}. Prvo otkaži radni nalog ili poništiti rezervaciju zaliha" #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 msgid "Cannot cancel as processing of cancelled documents is pending." @@ -9708,7 +9708,7 @@ msgstr "Nije moguće promijeniti standard valutu tvrtke, jer postoje postojeće #: erpnext/projects/doctype/task/task.py:146 msgid "Cannot complete task {0} as its dependent task {1} is not completed / cancelled." -msgstr "" +msgstr "Nije moguće dovršiti zadatak {0} jer njegov zavisni zadatak {1} nije dovršen / otkazan." #: erpnext/accounts/doctype/cost_center/cost_center.py:61 msgid "Cannot convert Cost Center to ledger as it has child nodes" @@ -9745,7 +9745,7 @@ msgstr "Nije moguće kreirati knjigovodstvene unose naspram onemogućenih račun #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:146 msgid "Cannot create more Subcontracting Orders against the Purchase Order {0}." -msgstr "" +msgstr "Ne može se izraditi više Podugovornih Naloga na osnovu Naloga Nabave {0}." #: erpnext/controllers/sales_and_purchase_return.py:444 msgid "Cannot create return for consolidated invoice {0}." @@ -9840,7 +9840,7 @@ msgstr "Nije moguće spojiti {0} '{1}' u '{2}' jer oba imaju postojeće knjigovo #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:125 msgid "Cannot optimize route as the driver address is missing." -msgstr "" +msgstr "Nije moguće optimizirati rutu jer nedostaje adresa vozača." #: erpnext/manufacturing/doctype/work_order/services/status.py:41 msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" @@ -9870,7 +9870,7 @@ msgstr "Ne može se upućivati na broj reda veći ili jednak trenutnom broju red #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:626 msgid "Cannot reserve more than Allowed Qty {0} {1} for Item {2} against {3} {4}.

The Allowed Qty is calculated as follows:
  • Actual Qty [Available Qty at Warehouse] = {5}
  • Reserved Stock [Ignore current SRE] = {6}
  • Available Qty To Reserve [Actual Qty - Reserved Stock] = {7}
  • Voucher Qty [Voucher Item Qty] = {8}
  • Delivered Qty [Qty delivered against the Voucher Item] = {9}
  • Total Reserved Qty [Qty reserved against the Voucher Item] = {10}
  • Allowed Qty [Minimum of (Available Qty To Reserve, (Voucher Qty - Delivered Qty - Total Reserved Qty))] = {11}
" -msgstr "" +msgstr "Ne može se rezervirati više od Dopuštene Količine {0} {1} za Artikal {2} za {3} {4}.

Dopuštena Količina izračunava se na sljedeći način:
  • Stvarna Količina [Raspoloživa Količina u Skladištu] = {5}
  • Rezervirana Zaliha [Zanemari Trenutni Unos Rezarvascije Zaliha = {6}
  • Dostupna Količina za Rezervaciju [Stvarna Količina - Rezervirana Zaliha] = {7}
  • Količina Verifikata [Količina Artikla Verifikata] = {8}
  • Dostavljena Količina [Količina Dostavljena na Temelju Artikla Verifikata] = {9}
  • Ukupna Rezerviraa Količina [Količina Rezervirana za Artikal Verifikata] = {10}
  • Dopuštena Količina [Minimum od (Dostupna Količina za Rezervaciju, (Količina Verifikata - Dostavljena Količina - Ukupna Rezervirana Količina))] = {11}
" #: erpnext/accounts/doctype/bank/bank.js:63 msgid "Cannot retrieve link token for update. Check Error Log for more information" @@ -9895,7 +9895,7 @@ msgstr "Nije moguće odabrati tip naknade kao 'Iznos na Prethodnom Redu' ili 'Uk #: erpnext/stock/doctype/item_alternative/item_alternative.py:36 msgid "Cannot set alternative item for the item {0}" -msgstr "" +msgstr "Nije moguće postaviti alternativni artikal za artikal {0}" #: erpnext/selling/doctype/quotation/quotation.py:293 msgid "Cannot set as Lost as Sales Order is made." @@ -10325,7 +10325,7 @@ msgstr "Ručno promijenite ovaj datum da postavite sljedeći datum početka sinh #: erpnext/selling/doctype/customer/customer.py:161 msgid "Changed customer name to '{0}' as '{1}' already exists." -msgstr "" +msgstr "Ime klijenta promijenjeno je u '{0}' jer '{1}' već postoji." #: erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js:160 msgid "Changes in {0}" @@ -10615,7 +10615,7 @@ msgstr "Podređena tablica nije dopuštena" #: erpnext/projects/doctype/task/task.py:319 msgid "Child Task exists for this Task. You cannot delete this Task." -msgstr "" +msgstr "Za ovaj zadatak postoji podređeni zadatak. Ne možete izbrisati ovaj zadatak." #: erpnext/stock/doctype/warehouse/warehouse_tree.js:21 msgid "Child nodes can be only created under 'Group' type nodes" @@ -11795,11 +11795,11 @@ msgstr "Naziv polja poveznice tvrtke koje se koristi za filtriranje (neobavezno #: erpnext/setup/doctype/company/company.js:239 msgid "Company name does not match" -msgstr "" +msgstr "Naziv tvrtke se ne poklapa" #: erpnext/assets/doctype/asset/asset.py:330 msgid "Company of asset {0} and purchase document {1} does not match." -msgstr "" +msgstr "Tvrtka imovine {0} i dokument o nabavi {1} se ne poklapa." #: erpnext/setup/doctype/employee/employee.py:164 msgid "Company or Personal Email is mandatory when 'Create User Automatically' is enabled" @@ -11839,11 +11839,11 @@ msgstr "Tvrtka {0} ne postoji" #: erpnext/setup/setup_wizard/operations/taxes_setup.py:14 msgid "Company {0} does not exist yet. Taxes setup aborted." -msgstr "" +msgstr "Tvrtka {0} još ne postoji. Postavljanje PDV-a je prekinuto." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:579 msgid "Company {0} does not match with POS Profile Company {1}" -msgstr "" +msgstr "Tvrtka {0} ne odgovara Kasa Profilu Tvrtke {1}" #: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py:105 msgid "Company {0} is added more than once" @@ -12319,7 +12319,7 @@ msgstr "Potrošena Količina" #: erpnext/manufacturing/doctype/work_order/services/reservation.py:186 msgid "Consumed Qty {0} cannot be greater than Reserved Qty {1} for item {2}" -msgstr "" +msgstr "Potrošena Količina {0} ne može biti veća od Rezervirane Količine {1} za artikal {2}" #. Label of the consumed_quantity (Data) field in DocType 'Asset Repair #. Consumed Item' @@ -13052,11 +13052,11 @@ msgstr "Centar Troškova {0} ne može se koristiti za dodjelu jer se koristi kao #: erpnext/assets/doctype/asset/asset.py:358 msgid "Cost Center {0} does not belong to Company {1}" -msgstr "" +msgstr "Centar Troška {0} ne pripada Tvrtki {1}" #: erpnext/assets/doctype/asset/asset.py:365 msgid "Cost Center {0} is a group cost center and group cost centers cannot be used in transactions" -msgstr "" +msgstr "Centar Troška {0} je grupni centar troška a grupni centri troška ne mogu se koristiti u transakcijama" #: erpnext/accounts/report/financial_statements.py:685 msgid "Cost Center: {0} does not exist" @@ -13181,7 +13181,7 @@ msgstr "Obračun Troškova i Fakturisanje" #: erpnext/projects/doctype/project/project.js:140 msgid "Costing and Billing fields have been updated" -msgstr "" +msgstr "Polja Troškova i Fakturiranja su ažurirana" #: erpnext/setup/demo.py:78 msgid "Could Not Delete Demo Data" @@ -13210,7 +13210,7 @@ msgstr "Nije moguće pronaći odgovarajuću promjenu koja bi odgovarala razlici: #: erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py:46 #: erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.py:50 msgid "Could not find path for {0}" -msgstr "" +msgstr "Nije moguće pronaći put za {0}" #: banking/src/components/features/BankStatementImporter/PDF/PDFTableEditor.tsx:101 msgid "Could not re-extract the table." @@ -14335,7 +14335,7 @@ msgstr "Trenutna Sastavnica" #: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 msgid "Current BOM and New BOM cannot be the same" -msgstr "" +msgstr "Trenutna i Nova Sastavnica ne mogu biti iste" #. Label of the current_exchange_rate (Float) field in DocType 'Exchange Rate #. Revaluation Account' @@ -17059,11 +17059,11 @@ msgstr "Razlika u kontu stavki u tablici" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:155 msgid "Difference Account must be an Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" -msgstr "" +msgstr "Račun Razlika mora biti račun tipa Imovina/Obveza (Privremeno Početno), budući da je ovaj unos zaliha početni unos" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:985 msgid "Difference Account must be an Asset/Liability type account, since this Stock Reconciliation is an Opening Entry" -msgstr "" +msgstr "Račun Razlike mora biti račun tipa Imovine/Obveze, budući da je ovo Usklađivanje Zaliha početni unos" #. Label of the difference_amount (Currency) field in DocType 'Payment #. Reconciliation Allocation' @@ -17309,7 +17309,7 @@ msgstr "Onemogućeni artikli se ne mogu odabrati ni u jednoj transakciji." #: erpnext/accounts/services/internal_transfer.py:120 msgid "Disabled pricing rules since this {0} is an internal transfer" -msgstr "" +msgstr "Pravila određivanja cijena onemogućena su jer je ovo {0} interni prijenos" #. Description of the 'Disabled' (Check) field in DocType 'Supplier' #: erpnext/buying/doctype/supplier/supplier.json @@ -17318,7 +17318,7 @@ msgstr "Onemogućeni dobavljači su skriveni od odabira u novim transakcijama, a #: erpnext/accounts/services/internal_transfer.py:136 msgid "Disabled tax included prices since this {0} is an internal transfer" -msgstr "" +msgstr "Cijene s PDV-om onemogućene jer je ovo {0} interni prijenos" #: erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.py:82 msgid "Disabled template must not be default template" @@ -17569,7 +17569,7 @@ msgstr "Popust mora biti manji od 100%" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:3090 msgid "Discount of {0} applied as per Payment Term" -msgstr "" +msgstr "Popust od {0} primijenjen prema Uvjetima Plaćanja" #. Label of the section_break_18 (Section Break) field in DocType 'Pricing #. Rule' @@ -17934,7 +17934,7 @@ msgstr "Želiš li podnijeti unos zaliha?" #: erpnext/selling/report/sales_partner_commission_summary/sales_partner_commission_summary.py:50 #: erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py:22 msgid "DocType can be one of {0}" -msgstr "" +msgstr "DocType može biti jedan od {0}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:182 #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:458 @@ -18659,7 +18659,7 @@ msgstr "Verifikacija e-pošte nije uspjela." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:20 msgid "Emails queued" -msgstr "" +msgstr "E-pošta u redu čekanja" #. Label of the emergency_contact_details (Section Break) field in DocType #. 'Employee' @@ -18938,7 +18938,7 @@ msgstr "Omogući Evropski Pristup" #. 'CRM Settings' #: erpnext/crm/doctype/crm_settings/crm_settings.json msgid "Enable Frappe CRM Data Synchronization" -msgstr "" +msgstr "Omogući sinkronizaciju podataka Prodajne Podrške" #. Label of the enable_fuzzy_matching (Check) field in DocType 'Accounts #. Settings' @@ -19397,7 +19397,7 @@ msgstr "Unesi {0} iznos." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:170 msgid "Enter {0} name." -msgstr "" +msgstr "Unesi {0} ime." #: erpnext/setup/setup_wizard/data/industry_type.txt:22 msgid "Entertainment & Leisure" @@ -19496,15 +19496,15 @@ msgstr "Greška prilikom ponovnog knjiženja vrijednosti artikla" #: erpnext/assets/doctype/asset_depreciation_schedule/deppreciation_schedule_controller.py:175 msgid "Error: This asset already has {0} depreciation periods booked. The `depreciation start` date must be at least {1} periods after the `available for use` date. Please correct the dates accordingly." -msgstr "" +msgstr "Pogreška: Ova imovina već ima rezerviranih {0} razdoblja amortizacije. Datum `početka amortizacije` mora biti najmanje {1} razdoblja nakon datuma `raspoloživosti za upotrebu`. Molimo ispravite datume u skladu s tim." #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.py:93 msgid "Error: {0}" -msgstr "" +msgstr "Pogreška: {0}" #: erpnext/accounts/doctype/payment_entry/payment_entry.js:980 msgid "Error: {0} is a mandatory field" -msgstr "" +msgstr "Pogreška: {0} je obavezno polje" #. Label of the errors_notification_section (Section Break) field in DocType #. 'Stock Reposting Settings' @@ -20197,7 +20197,7 @@ msgstr "Neuspješni Unosi" #: erpnext/utilities/doctype/video_settings/video_settings.py:35 msgid "Failed to authenticate the API key. Please check the error logs." -msgstr "" +msgstr "Autentifikacija API ključa nije uspjela. Provjerite zapisnike pogrešaka." #: erpnext/setup/setup_wizard/setup_wizard.py:37 #: erpnext/setup/setup_wizard/setup_wizard.py:38 @@ -21176,11 +21176,11 @@ msgstr "Za Radni Nalog" #: erpnext/controllers/status_updater.py:292 msgid "For an item {0}, quantity must be a negative number" -msgstr "" +msgstr "Za Artikal {0}, količina mora biti negativan broj" #: erpnext/controllers/status_updater.py:289 msgid "For an item {0}, quantity must be a positive number" -msgstr "" +msgstr "Za Artikal {0}, količina mora biti pozitivan broj" #. Description of the 'Income Account' (Link) field in DocType 'Dunning' #: erpnext/accounts/doctype/dunning/dunning.json @@ -21214,11 +21214,11 @@ msgstr "Za individualnog Dobavljača" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:379 msgid "For item {0}, only {1} assets have been created or linked to {2}. Please create or link {3} more assets with the respective document." -msgstr "" +msgstr "Za artikal {0}, samo {1} imovina je stvorena ili povezana s {2}. Stvori ili poveži još {3} imovine s odgovarajućim dokumentom." #: erpnext/controllers/status_updater.py:302 msgid "For item {0}, rate must be a positive number. To allow negative rates, enable {1} in {2}" -msgstr "" +msgstr "Za artikal {0}, cijena mora biti pozitivan broj. Da biste omogućili negativne cijene, omogućite {1} u {2}" #. Description of the 'Do not fetch incoming rate from Serial No' (Check) field #. in DocType 'Stock Reposting Settings' @@ -21232,7 +21232,7 @@ msgstr "Za operaciju {0} u redu {1}, molimo dodajte sirovine ili postavite Sasta #: erpnext/manufacturing/doctype/work_order/mapper.py:379 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity ({2})" -msgstr "" +msgstr "Za Operaciju {0}: Količina ({1}) ne može biti veća od količine na čekanju ({2})" #: erpnext/projects/doctype/project/project.js:208 msgid "For project - {0}, update your status" @@ -21278,7 +21278,7 @@ msgstr "Za praktičnost Klienta, ovi kodovi se mogu koristiti u formatima za isp #: erpnext/stock/serial_batch_bundle.py:1234 msgid "For the item {0}, the Available qty {1} is less than the Required Qty {2} in the warehouse {3}. Please add sufficient qty in the warehouse." -msgstr "" +msgstr "Za artikal {0}, Raspoloživa Količina {1} je manja od Zatražene Količine {2} u skladištu {3}. Dodaj dovoljnu količinu u skladište." #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:893 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." @@ -21381,11 +21381,11 @@ msgstr "Podrška Prodaje" #. Name of a DocType #: erpnext/crm/doctype/frappe_crm_allowed_user/frappe_crm_allowed_user.json msgid "Frappe CRM Allowed User" -msgstr "" +msgstr "Dozvoljeni korisnik Prodajne Podrške" #: erpnext/crm/frappe_crm_api.py:168 msgid "Frappe CRM data synchronization is not enabled on ERPNext. Contact System Manager of ERPNext." -msgstr "" +msgstr "Sinkronizacija podataka Prodajne Podrške nije omogućena U Sustavu. Obrati se Upravitelju Sustava." #: erpnext/setup/install.py:232 msgid "Frappe School" @@ -22057,7 +22057,7 @@ msgstr "Dužina napomena Knjigovodstvenog Registra" #: erpnext/accounts/report/general_ledger/general_ledger.py:829 msgid "General Ledger requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Knjigovodstveni Registar zahtijeva da se {0} sinkronizuje sa DuckDB-om" #. Label of the gs (Section Break) field in DocType 'Item Group' #: erpnext/setup/doctype/item_group/item_group.json @@ -24098,7 +24098,7 @@ msgstr "Uvezi Fakture" #. Import' #: erpnext/accounts/doctype/bank_statement_import/bank_statement_import.json msgid "Import MT940 Format" -msgstr "" +msgstr "Uvezi MT940 Format" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:144 msgid "Import Successful" @@ -25495,7 +25495,7 @@ msgstr "Nevažeće Skladište" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:460 msgid "Invalid amount in accounting entries of {0} {1} for Account {2}: {3}" -msgstr "" +msgstr "Nevažeći iznos u knjigovodstvenim unosima {0} {1} za račun {2}: {3}" #: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:312 msgid "Invalid condition expression" @@ -27846,7 +27846,7 @@ msgstr "Artikal {0} se nemože naručiti više od {1} u odnosu na Ugovorni Nalog #: erpnext/stock/services/internal_transfer.py:104 msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" -msgstr "" +msgstr "Artikal {0} ne može se primiti u količini većoj od {1} u odnosu na {2} {3}" #: erpnext/assets/doctype/asset/asset.py:343 #: erpnext/stock/doctype/item/item.py:693 @@ -27892,7 +27892,7 @@ msgstr "Artikal {0} zanemaren jer nije artikal na zalihama" #: erpnext/stock/get_item_details.py:359 msgid "Item {0} is a template, please select one of its variants" -msgstr "" +msgstr "Artikal {0} je predložak, odaberite jednu od njezinih varijanti" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:614 msgid "Item {0} is already reserved/delivered against Sales Order {1}." @@ -28010,7 +28010,7 @@ msgstr "Artikal: {0} ne postoji u sustavu" #: erpnext/manufacturing/doctype/bom/bom.py:970 msgid "Item: {0} with Stock UOM: {1} cannot have fractional process loss qty as UOM {2} is a whole number." -msgstr "" +msgstr "Artikal: {0} s jedinicom zalihe: {1} ne može imati frakcijsku količinu gubitaka u procesu jer je jedinica mjere {2} cijeli broj." #. Label of a Card Break in the Buying Workspace #. Label of a Workspace Sidebar Item @@ -28217,7 +28217,7 @@ msgstr "Radne Kartice {0} je završen" #: erpnext/manufacturing/doctype/job_card/job_card.py:1416 msgid "Job Card {0}: As per the sequence of the operations in the work order {1}, complete the operation {2} before the operation {3}." -msgstr "" +msgstr "Radna Kartica {0}: Prema redoslijedu operacija u radnom nalogu {1}, dovršite operaciju {2} prije operacije {3}." #. Label of the dashboard_tab (Tab Break) field in DocType 'Workstation' #: erpnext/manufacturing/doctype/workstation/workstation.json @@ -28292,11 +28292,11 @@ msgstr "Radna Kartica {0} kreirana" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:106 msgid "Job paused" -msgstr "" +msgstr "Posao Pauziran" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:64 msgid "Job started" -msgstr "" +msgstr "Posao Započet" #: erpnext/utilities/bulk_transaction.py:72 msgid "Job: {0} has been triggered for processing failed transactions" @@ -28645,7 +28645,7 @@ msgstr "Prošla Fiskalna Godina" #: erpnext/accounts/doctype/account/account.py:673 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." -msgstr "" +msgstr "Posljednje ažuriranje Knjigovodstvenog Registra je obavljeno {0}. Ova operacija nije dopuštena dok se sustav aktivno koristi. Pričekaj 5 minuta prije ponovnog pokušaja." #. Label of the last_integration_date (Date) field in DocType 'Bank Account' #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -29163,7 +29163,7 @@ msgstr "Povezivanje s klijentom nije uspjelo. Molimo pokušajte ponovo." #: erpnext/selling/doctype/customer/customer.js:282 msgid "Linking to Supplier failed. Please try again." -msgstr "" +msgstr "Povezivanje sa Dobavljačem nije uspjelo. Pokušaj ponovo." #: erpnext/accounts/report/financial_ratios/financial_ratios.js:55 #: erpnext/accounts/report/financial_ratios/financial_ratios.py:152 @@ -30731,7 +30731,7 @@ msgstr "Materijali su već primljeni naspram {0} {1}" #: erpnext/manufacturing/doctype/job_card/job_card.py:189 #: erpnext/manufacturing/doctype/job_card/job_card.py:903 msgid "Materials need to be transferred to the work in progress warehouse for the job card {0}" -msgstr "" +msgstr "Materijali se moraju prenijeti u skladište nedovršene proizvodnje za radnu karticu {0}" #. Label of the max_amount (Currency) field in DocType 'Bank Transaction Rule' #. Label of the max_amount (Currency) field in DocType 'Promotional Scheme @@ -31618,7 +31618,7 @@ msgstr "Više Računa (Predložak Naloga Knjiženja)" #: erpnext/selling/doctype/customer/customer.py:443 msgid "Multiple Loyalty Programs found for Customer {0}. Please select manually." -msgstr "" +msgstr "Višei Program Vjernosti pronađeno je za Klijenta {0}. Odaberi ručno." #: erpnext/accounts/doctype/sales_invoice/services/pos.py:253 msgid "Multiple POS Opening Entry" @@ -31626,7 +31626,7 @@ msgstr "Višestruki Unos Otvaranja Blagajne" #: erpnext/accounts/doctype/pricing_rule/utils.py:345 msgid "Multiple Price Rules exist with same criteria, please resolve conflict by assigning priority. Price Rules: {0}" -msgstr "" +msgstr "Postoji više pravila o cijenama s istim kriterijima, molimo riješite sukob dodjeljivanjem prioriteta. Pravila o cijenama: {0}" #. Option for the 'Loyalty Program Type' (Select) field in DocType 'Loyalty #. Program' @@ -32289,7 +32289,7 @@ msgstr "Novi Radni Prostor" #: erpnext/selling/doctype/customer/customer.py:408 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}" -msgstr "" +msgstr "Novo kreditno ograničenje je manje od trenutnog nepodmirenog iznosa klijenta. Kreditno ograničenje mora biti najmanje {0}" #. Description of the 'Bill Even If Previous Invoice Unpaid' (Check) field in #. DocType 'Subscription' @@ -32299,7 +32299,7 @@ msgstr "Nove fakture će se generirati prema rasporedu čak i ako su trenutne fa #: erpnext/support/doctype/issue/issue.js:126 msgid "New issue created: {0}" -msgstr "" +msgstr "Novi zahtjev stvoren: {0}" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:261 msgid "New release date should be in the future" @@ -32383,7 +32383,7 @@ msgstr "Nisu pronađeni Klijenti sa odabranim opcijama." #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:146 msgid "No Delivery Note selected for Customer {0}" -msgstr "" +msgstr "Nije odabrana Dostavnica za Klijenta {0}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:767 msgid "No DocTypes in To Delete list. Please generate or import the list before submitting." @@ -32548,7 +32548,7 @@ msgstr "Nisu pronađeni kontakti s e-poštom." #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:164 msgid "No customers found with selected options." -msgstr "" +msgstr "Nisu pronađeni Klijenti sa odabranim opcijama." #: erpnext/selling/page/sales_funnel/sales_funnel.js:137 msgid "No data for this period" @@ -32769,7 +32769,7 @@ msgstr "Nije pronađen nijedan zapis" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:22 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:39 msgid "No records for these settings." -msgstr "" +msgstr "Nema zapisa za ove postavke." #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:773 msgid "No records found in Allocation table" @@ -33268,7 +33268,7 @@ msgstr "Numeričke Vrijednosti" #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.py:88 msgid "Numero has not been set in the XML file" -msgstr "" +msgstr "Broj nije postavljen u XML datoteci" #. Option for the 'Blood Group' (Select) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json @@ -33444,11 +33444,11 @@ msgstr "Nakon postavljanja, ova faktura će biti na čekanju do postavljenog dat #: erpnext/manufacturing/doctype/work_order/work_order.js:763 msgid "Once the Work Order is Closed, it cannot be resumed." -msgstr "" +msgstr "Nakon što je Radni Nalog Zatvoren, ne može se ponovo otvoriti." #: erpnext/accounts/doctype/loyalty_program/loyalty_program.js:39 msgid "One customer can be part of only a single Loyalty Program." -msgstr "" +msgstr "Jedan Klijent može biti dio samo jednog Programa Lojalnosti." #. Option for the 'Status' (Select) field in DocType 'Subcontracting Inward #. Order' @@ -34045,7 +34045,7 @@ msgstr "Operacija {0} ne pripada radnom nalogu {1}" #: erpnext/manufacturing/doctype/workstation/workstation.py:453 msgid "Operation {0} is longer than any available working hours in workstation {1}, break down the operation into multiple operations" -msgstr "" +msgstr "Operacija {0} traje duže od bilo kojeg raspoloživog radnog vremena na radnoj stanici {1}, podijelite operaciju na više operacija" #. Label of the operations (Table) field in DocType 'BOM' #. Label of the operations_section_section (Section Break) field in DocType @@ -34232,7 +34232,7 @@ msgstr "Optimiziraj Rutu" #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:128 msgid "Optimizing route" -msgstr "" +msgstr "Optimizacija rute" #: erpnext/manufacturing/doctype/work_order/work_order.js:1029 msgid "Optional. Select a specific manufacture entry to reverse." @@ -34693,7 +34693,7 @@ msgstr "Preko Odbitka" #: erpnext/accounts/services/billing_validation.py:56 msgid "Overbilling of {0} ignored because you have {1} role." -msgstr "" +msgstr "Prekomjerno Fakturiranje {0} zanemareno jer imate {1} ulogu." #: erpnext/controllers/status_updater.py:519 msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role." @@ -34815,7 +34815,7 @@ msgstr "Verifikat Zatvaranje Perioda" #. Label of the pcv_job_timeout (Int) field in DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "PCV Job Timeout (seconds)" -msgstr "" +msgstr "Vremensko Ograničenje Zadatka Završnog Verifikata Razdoblja (sekunde)" #: erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.js:35 msgid "PCV Paused" @@ -34963,7 +34963,7 @@ msgstr "Faktura Blagajne nije podnešena" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:130 msgid "POS Invoice isn't created by user {0}" -msgstr "" +msgstr "Fakturu Blagajne nije kreirao korisnik {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:208 msgid "POS Invoice should have the field {0} checked." @@ -35087,7 +35087,7 @@ msgstr "Korisnik Profila Blagajne" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:124 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:189 msgid "POS Profile doesn't match {0}" -msgstr "" +msgstr "Profil Blagajne ne poklapa se s {0}" #: erpnext/accounts/doctype/sales_invoice/services/pos.py:210 msgid "POS Profile is mandatory to mark this invoice as POS Transaction." @@ -35099,19 +35099,19 @@ msgstr "Kasa Profil {0} ne može se onemogućiti jer su u tijeku Kasa sesije." #: erpnext/accounts/doctype/mode_of_payment/mode_of_payment.py:62 msgid "POS Profile {0} contains Mode of Payment {1}. Please remove them to disable this mode." -msgstr "" +msgstr "Profil Blagajne {0} sadrži ovaj način plaćanja {1}. Uklonite ga da onemogućite ovaj način." #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:58 msgid "POS Profile {0} does not belong to company {1}" -msgstr "" +msgstr "Profil Blagajne {0} ne pripada tvrtki {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:47 msgid "POS Profile {0} does not exist." -msgstr "" +msgstr "Profil Blagajne {0} ne postoji." #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:54 msgid "POS Profile {0} is disabled." -msgstr "" +msgstr "Profil Blagajne {0} je onemogućen." #. Name of a report #: erpnext/accounts/report/pos_register/pos_register.json @@ -36059,7 +36059,7 @@ msgstr "Stranka je Obavezna" #: erpnext/accounts/doctype/bank_transaction_rule/bank_transaction_rule.py:69 msgid "Party is required to create a payment entry." -msgstr "" +msgstr "Stranka je obavezna za izradu unosa plaćanja." #: erpnext/accounts/doctype/bank_transaction_rule/bank_transaction_rule.py:66 msgid "Party type is required to create a payment entry." @@ -36766,7 +36766,7 @@ msgstr "Tip Plaćanja" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:624 msgid "Payment Type must be one of Receive, Pay, or Internal Transfer" -msgstr "" +msgstr "Tip Plaćanja mora biti Uplata, Isplata i Interni Prijenos" #. Label of the payment_url (Data) field in DocType 'Payment Request' #: erpnext/accounts/doctype/payment_request/payment_request.json @@ -37723,7 +37723,7 @@ msgstr "Dodaj račun za pravilo bankovnog unosa." #: erpnext/public/js/utils/serial_no_batch_selector.js:663 msgid "Please add at least one Serial No / Batch No" -msgstr "" +msgstr "Dodaj barem jedan Serijski Broj / Broj Šarže" #: erpnext/stock/doctype/item/item.js:914 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." @@ -37731,7 +37731,7 @@ msgstr "Dodaj barem jedan red u Postavke Artikala sa tvrtkom prije postavljanja #: erpnext/crm/doctype/crm_settings/crm_settings.py:51 msgid "Please add at least one user on Allowed Users to allow Data Synchronization from Frappe CRM site." -msgstr "" +msgstr "Dodaj barem jednog korisnika na popis Dopušteni Porisnici kako biste omogućili Sinkronizaciju Podataka s Prodajnom Podrškom." #: erpnext/accounts/doctype/bank_statement_import/bank_statement_import.py:84 msgid "Please add the Bank Account column" @@ -37823,7 +37823,7 @@ msgstr "Konfiguriraj račune za pravilo bankovnog unosa." #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:345 msgid "Please contact any of the following users for this transaction." -msgstr "" +msgstr "Za ovu transakciju obratite se bilo kojem od sljedećih korisnika." #: erpnext/selling/doctype/customer/customer.py:534 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" @@ -37895,7 +37895,7 @@ msgstr "Omogući {0} u {1}." #: erpnext/controllers/selling_controller.py:872 msgid "Please enable {0} in {1} to allow same item in multiple rows" -msgstr "" +msgstr "Omogući {0} u {1} kako biste dopustili isti artikal u više redova" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:378 msgid "Please ensure that the {0} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account." @@ -37907,11 +37907,11 @@ msgstr "Potvrdi da je {0} račun {1} Troškovni račun. Možete promijeniti vrst #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 msgid "Please ensure {0} account is a Balance Sheet account." -msgstr "" +msgstr "Provjeri da li je račun {0} račun Bilance Stanja." #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 msgid "Please ensure {0} account {1} is a Receivable account." -msgstr "" +msgstr "Provjeri da li je {0} račun {1} račun Potraživanja." #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:140 msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}" @@ -38118,7 +38118,7 @@ msgstr "Molimo vas da generirate popis za brisanje prije podnošenja" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:67 msgid "Please import accounts against parent company or enable {0} in company master." -msgstr "" +msgstr "Uvezi račune naspram matične tvrtkea ili omogući {0} u Postavkama Tvrtke." #: erpnext/setup/doctype/employee/employee.py:291 msgid "Please make sure the employees above report to another Active employee." @@ -38216,7 +38216,7 @@ msgstr "Odaberi Tvrtku" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js:139 #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:76 msgid "Please select Company and Posting Date to get entries" -msgstr "" +msgstr "Odaberi Tvrtku i Datum Knjiženja da biste preuzeli unose" #: erpnext/accounts/doctype/journal_entry/journal_entry.js:435 #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:28 @@ -38249,7 +38249,7 @@ msgstr "Odaberi Kod Artikla" #: erpnext/selling/doctype/sales_order/sales_order.js:1756 msgid "Please select Items from the Table" -msgstr "" +msgstr "Odaberi artikle iz Tablice" #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py:55 msgid "Please select Maintenance Status as Completed or remove Completion Date" @@ -38398,7 +38398,7 @@ msgstr "Odaberi red za kreiranje Unosa Ponovnog Knjiženje" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:146 msgid "Please select a supplier" -msgstr "" +msgstr "Odaberi Dobavljača" #: erpnext/accounts/report/purchase_register/purchase_register.py:37 msgid "Please select a supplier for fetching payments." @@ -38410,7 +38410,7 @@ msgstr "Odaberi važeći Nalog Nabave koji je konfigurisan za Podugovor." #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:200 msgid "Please select a valid document type." -msgstr "" +msgstr "Odaberi valjani tip dokumenta." #: erpnext/selling/doctype/quotation/quotation.js:245 msgid "Please select a value for {0} quotation_to {1}" @@ -38430,7 +38430,7 @@ msgstr "Molimo odaberite barem jedan filter: Šifra Artikla, Šarža ili Serijsk #: erpnext/selling/doctype/sales_order/sales_order.js:1368 msgid "Please select at least one item to continue" -msgstr "" +msgstr "Odaberi jedan artikal za nastavak" #: erpnext/buying/doctype/purchase_order/services/drop_ship.py:17 msgid "Please select at least one item to update delivered quantity." @@ -38438,7 +38438,7 @@ msgstr "Molimo odaberite barem jedan artikal za ažuriranje dostavljene količin #: erpnext/manufacturing/doctype/work_order/work_order.js:392 msgid "Please select at least one operation to create Job Card" -msgstr "" +msgstr "Odaberi barem jednu operaciju za stvaranje Radne Kartice" #: erpnext/stock/report/incorrect_serial_and_batch_bundle/incorrect_serial_and_batch_bundle.js:33 msgid "Please select at least one row to fix" @@ -38504,7 +38504,7 @@ msgstr "Odaberi Tvrtku" #: erpnext/accounts/doctype/loyalty_program/loyalty_program.js:65 msgid "Please select the Multiple Tier Program type for more than one collection rule." -msgstr "" +msgstr "Odaberi Tip Višeslojnog Programa za više od jednog pravila prikupljanja." #: erpnext/stock/doctype/item/item.js:433 msgid "Please select the Warehouse first" @@ -38566,7 +38566,7 @@ msgstr "Postavi Račun u Skladištu {0} ili Standard Račun Zaliha u Kompaniji { #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:333 msgid "Please set Accounting Dimension {0} in {1}" -msgstr "" +msgstr "Postavi Knjigovodstvenu Dimenziju {0} u {1}" #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:23 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:34 @@ -38608,7 +38608,7 @@ msgstr "Postavi Račun Osnovne Imovine u Kategoriju Imovine {0}" #: erpnext/accounts/doctype/purchase_invoice/services/expense_account.py:151 msgid "Please set Fixed Asset Account in {0} against {1}." -msgstr "" +msgstr "Postavi Račun Osnovnih Sredstava u {0} na {1}." #: erpnext/manufacturing/doctype/bom_creator/bom_creator.py:296 msgid "Please set Parent Row No for item {0}" @@ -38645,7 +38645,7 @@ msgstr "Postavi Tvrtku" #: 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 {0}" -msgstr "" +msgstr "Postavi Centar Troškova za Imovinu ili postavite Centar Troškova Amortizacije za {0}" #: erpnext/stock/doctype/item/item.py:339 #: erpnext/stock/doctype/item/item.py:1623 @@ -38699,11 +38699,11 @@ msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Način Plaćanja {0}" #: erpnext/accounts/doctype/pos_profile/pos_profile.py:207 #: erpnext/accounts/doctype/sales_invoice/services/pos.py:367 msgid "Please set default Cash or Bank account in Mode of Payments {0}" -msgstr "" +msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Načine Plaćanja {0}" #: erpnext/accounts/utils.py:2568 msgid "Please set default Exchange Gain/Loss Account in Company {0}" -msgstr "" +msgstr "Postavi Standard Račun Rezultata od Kursnih Razlika u {0}" #: erpnext/assets/doctype/asset_repair/services/gl_composer.py:92 msgid "Please set default Expense Account in Company {0}" @@ -38842,11 +38842,11 @@ msgstr "Navedi od/Do Raspona" #: erpnext/public/js/controllers/transaction.js:2634 msgid "Please specify {0}. It is needed to fetch Item Details." -msgstr "" +msgstr "Navedi {0}. Potrebno je za preuzimanje Detalja Artikla." #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:142 msgid "Please submit Purchase Order {0} before proceeding." -msgstr "" +msgstr "Podnesite Nalog Nabave {0} prije nego što nastavite." #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 msgid "Please try again in an hour." @@ -39080,7 +39080,7 @@ msgstr "Datuma Knjiženja" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:263 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:146 msgid "Posting Date cannot be a future date" -msgstr "" +msgstr "Datum Knjiženja ne može biti budući datum" #. Label of the exchange_gain_loss_posting_date (Select) field in DocType #. 'Accounts Settings' @@ -39283,7 +39283,7 @@ msgstr "Uplaćeni Troškovi" #: erpnext/accounts/report/general_ledger/general_ledger.py:682 msgid "Presentation Currency cannot be {0}, when {1} is enabled." -msgstr "" +msgstr "Valuta prikaza ne može biti {0}, kada je omogućen {1}." #: erpnext/setup/setup_wizard/data/designation.txt:24 msgid "President" @@ -39957,7 +39957,7 @@ msgstr "Prioriteti" #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:61 msgid "Priority cannot be less than 1." -msgstr "" +msgstr "Prioritet ne može biti manji od 1." #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:764 msgid "Priority has been changed to {0}." @@ -40523,7 +40523,7 @@ msgstr "Bilans Uspjeha" #: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:215 msgid "Profit and Loss Statement requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Bilanca Uspjeha zahtijeva da se {0} sinkronizuje s DuckDB-om" #. Label of the heading_cppb (Heading) field in DocType 'Bisect Accounting #. Statements' @@ -41282,7 +41282,7 @@ msgstr "Nalog Nabave Obavezan" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:466 msgid "Purchase Order Required for item {0}" -msgstr "" +msgstr "Nalog Nabave je obavezan za artikal {0}" #. Name of a report #. Label of a chart in the Buying Workspace @@ -41342,7 +41342,7 @@ msgstr "Nalozi Nabave za Primitak" #: erpnext/controllers/accounts_controller.py:1236 msgid "Purchase Orders {0} are unlinked" -msgstr "" +msgstr "Nabavni Nalozi {0} nisu povezani" #: erpnext/stock/report/item_prices/item_prices.py:59 msgid "Purchase Price List" @@ -41432,7 +41432,7 @@ msgstr "Nabavni Račun je Obavezan" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:488 msgid "Purchase Receipt Required for item {0}" -msgstr "" +msgstr "Račun Nabave je obavezan za artikal {0}" #. Label of a Link in the Buying Workspace #. Name of a report @@ -41452,7 +41452,7 @@ msgstr "Statistika Nabavnog Računa " #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:356 msgid "Purchase Receipt does not have any Item for which Retain Sample is enabled." -msgstr "" +msgstr "Račun Nabave nema nijedan artikal za koju je omogućeno Zadržavanje Uzorka." #: erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py:135 msgid "Purchase Receipt {0} created." @@ -42483,7 +42483,7 @@ msgstr "Količina za Skeniranje" #: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "Quantity {0} should not be greater than allowed quantity {1}" -msgstr "" +msgstr "Količina {0} ne smije biti veća od dopuštene količine {1}" #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json @@ -42935,7 +42935,7 @@ msgstr "PDV Stopa" #: erpnext/accounts/services/child_item_update.py:515 msgid "Rate of '{0}' items cannot be changed" -msgstr "" +msgstr "Cijena '{0}' artikala ne može se mijenjati" #. Label of the rate_of_depreciation (Percent) field in DocType 'Asset #. Depreciation Schedule' @@ -43674,7 +43674,7 @@ msgstr "Zabilježite prijenos između dva bankovna računa" #: erpnext/stock/doctype/item_alternative/item_alternative.py:84 msgid "Record already exists for the item {0}" -msgstr "" +msgstr "Zapis za artikal {0} već postoji" #: banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx:513 #: banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx:519 @@ -44099,7 +44099,7 @@ msgstr "Odbijeno Skladište" #: erpnext/public/js/utils/serial_no_batch_selector.js:671 msgid "Rejected Warehouse and Accepted Warehouse cannot be the same." -msgstr "" +msgstr "Odbijeno i Prihvaćeno Skladište ne mogu biti ista." #: erpnext/buying/doctype/purchase_order/purchase_order_dashboard.py:23 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation_dashboard.py:14 @@ -44528,11 +44528,11 @@ msgstr "Datoteke Podataka Ponovnog Knjiženja" #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:47 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:96 msgid "Reposting Entries will change the value of accounts Stock In Hand, and Stock Expenses in the Trial Balance report and will also change the Balance Value in the Stock Balance report." -msgstr "" +msgstr "Ponovno knjiženje unosa promijenit će vrijednost računa Zalihe na Raspolaganju i Troškovi zaliha u izvješću Probna Bilanca, a također će promijeniti i vrijednost stanja u izvješću Stanja Zaliha." #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js:62 msgid "Reposting Entry will change the value of accounts Stock In Hand and Stock Expenses in the Trial Balance report and will also change the Balance Value in the Stock Balance report." -msgstr "" +msgstr "Ponovno knjiženje će promijeniti vrijednost računa Zalihe na Raspolaganju i Troškovi Zaliha u izvješću Probna Bilanca, a također će promijeniti i vrijednost stanja u izvješću Stanju Zaliha." #. Label of the reposting_info_section (Section Break) field in DocType 'Repost #. Item Valuation' @@ -44919,7 +44919,7 @@ msgstr "Rezervno Skladište" #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py:178 msgid "Reserve Warehouse must be different from Supplier Warehouse for Supplied Item {0}." -msgstr "" +msgstr "Rezervno Skladište mora biti različito od Dobavljačevog Skladišta za Isporučeni Artikal {0}." #: erpnext/manufacturing/doctype/production_plan/production_plan.js:287 msgid "Reserve for Raw Materials" @@ -45522,7 +45522,7 @@ msgstr "Povrati" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:359 msgid "Revaluation Journal: {0}" -msgstr "" +msgstr "Žurnal Revalorizacije: {0}" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:151 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:113 @@ -46038,7 +46038,7 @@ msgstr "Red #{0}: Broj Šarže {1} je već odabran." #: erpnext/controllers/subcontracting_inward_controller.py:443 msgid "Row #{0}: Batch No(s) {1} are not a part of the linked Subcontracting Inward Order. Please select valid Batch No(s)." -msgstr "" +msgstr "Red #{0}: Šaržni Broj(evi) {1} nije u povezanom Podugovaračkom Nalogu. Odaberi važeće Šaržne broj(eve)." #: erpnext/accounts/doctype/payment_entry/payment_entry.py:880 msgid "Row #{0}: Cannot allocate more than {1} against payment term {2}" @@ -46130,7 +46130,7 @@ msgstr "Red #{0}: Kumulativni prag ne može biti manji od praga pojedinačne tra #: erpnext/assets/doctype/asset_category/asset_category.py:66 msgid "Row #{0}: Currency of {1} - {2} does not match company currency." -msgstr "" +msgstr "Red #{0}: Valuta od {1} do {2} ne odgovara valuti tvrtke." #: erpnext/controllers/subcontracting_inward_controller.py:91 msgid "Row #{0}: Customer Provided Item {1} against Subcontracting Inward Order Item {2} ({3}) cannot be added multiple times." @@ -46184,7 +46184,7 @@ msgstr "Red #{0}: Duplikat unosa u Referencama {1} {2}" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:113 msgid "Row #{0}: Either Party ID or Party Name is required" -msgstr "" +msgstr "Red #{0}: Obavezan je ili ID Stranke ili Naziv Stranke" #: erpnext/selling/doctype/sales_order/sales_order.py:270 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" @@ -46200,7 +46200,7 @@ msgstr "Red #{0}: Račun troškova {1} nije važeći za Fakturu Nabave {2}. Dopu #: erpnext/assets/doctype/asset/asset.py:421 msgid "Row #{0}: Finance Book should not be empty since you're using multiple." -msgstr "" +msgstr "Red #{0}: Finansijski Registar ne smije biti prazan jer ih koristite više." #: erpnext/selling/doctype/sales_order/services/subcontracting.py:40 msgid "Row #{0}: Finished Good Item Qty can not be zero" @@ -46208,7 +46208,7 @@ msgstr "Red #{0}: Količina gotovog proizvoda artikla ne može biti nula" #: erpnext/buying/doctype/purchase_order/services/subcontracting.py:39 msgid "Row #{0}: Finished Good Item Qty cannot be zero" -msgstr "" +msgstr "Red #{0}: Količina gotovog proizvoda artikla ne može biti nula" #: erpnext/buying/doctype/purchase_order/services/subcontracting.py:21 #: erpnext/selling/doctype/sales_order/services/subcontracting.py:20 @@ -46259,7 +46259,7 @@ msgstr "Red #{0}: Polja Od i Do su obavezna" #: erpnext/stock/doctype/pick_list/pick_list.py:650 msgid "Row #{0}: Item Code is Mandatory" -msgstr "" +msgstr "Red #{0}: Šifra Artikla je obavezna" #: erpnext/public/js/utils/barcode_scanner.js:427 msgid "Row #{0}: Item added" @@ -46316,15 +46316,15 @@ msgstr "Red #{0}: Artikal {1} nije dio unosa izvornog proizvođača i ne može s #: erpnext/controllers/subcontracting_inward_controller.py:80 msgid "Row #{0}: Item {1} mismatch. Changing the item code is not permitted, add another row instead." -msgstr "" +msgstr "Red #{0}: Artikal {1} se ne slaže. Promjena koda artikla nije dopuštena, umjesto toga dodaj još jedan red." #: erpnext/controllers/subcontracting_inward_controller.py:129 msgid "Row #{0}: Item {1} mismatch. Changing the item code is not permitted." -msgstr "" +msgstr "Red #{0}: Artikal {1} se ne slaže. Promjena koda artikla nije dopuštena." #: erpnext/stock/doctype/stock_entry/services/subcontracting.py:94 msgid "Row #{0}: Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" -msgstr "" +msgstr "Red #{0}: Artikal {1} nije pronađen u tablici 'Isporučene Sirovine' u {2} {3}" #: erpnext/stock/doctype/stock_entry/services/disassemble.py:115 msgid "Row #{0}: Item {1} quantity ({2} in stock UOM) does not match the quantity derived from the source ({3}). Do not change the UOM, conversion factor or quantity of disassembly rows." @@ -46365,19 +46365,19 @@ msgstr "Red #{0}: Prekomjerna potrošnja Klijent Dostavljenog Artikla {1} u odno #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:92 msgid "Row #{0}: POS Invoice {1} has been {2}" -msgstr "" +msgstr "Red #{0}: Faktura Blagajne {1} je {2}" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:73 msgid "Row #{0}: POS Invoice {1} is not against customer {2}" -msgstr "" +msgstr "Red #{0}: Faktura Blagajne {1} nije naspram klijenta {2}" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:88 msgid "Row #{0}: POS Invoice {1} is not submitted yet" -msgstr "" +msgstr "Red #{0}: Faktura Blagajne {1} još nije podnešena" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:123 msgid "Row #{0}: Party ID is required" -msgstr "" +msgstr "Red #{0}: ID Stranke je obavezan" #: erpnext/manufacturing/doctype/production_plan/services/sub_assembly.py:80 msgid "Row #{0}: Please select Item Code in Assembly Items" @@ -46385,11 +46385,11 @@ msgstr "Red #{0}: Odaberi Kod Artikla u Artiklima Montaže" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:340 msgid "Row #{0}: Please select a valid Quality Inspection with Item Code {1}." -msgstr "" +msgstr "Red #{0}: Odaberi važeću Kontrolu Kvalitete sa Kodom Artikla {1}." #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:333 msgid "Row #{0}: Please select a valid Quality Inspection with Reference Type {1} and Reference Name {2}." -msgstr "" +msgstr "Red #{0}: Odaberi važeću Kontrolu Kvalitete s Tipom Reference {1} i Nazivom Reference {2}." #: erpnext/manufacturing/doctype/production_plan/services/sub_assembly.py:82 msgid "Row #{0}: Please select the BOM No in Assembly Items" @@ -46413,7 +46413,7 @@ msgstr "Red #{0}: Ažuriraj račun odloženih prihoda/troškova u redu artikla i #: erpnext/assets/doctype/asset/asset.py:413 msgid "Row #{0}: Please use a different Finance Book." -msgstr "" +msgstr "Red #{0}: Koristi drugi Finansijski Registar." #: erpnext/manufacturing/doctype/bom/bom.py:378 #, python-format @@ -46435,7 +46435,7 @@ msgstr "Red #{0}: Količina mora biti pozitivan broj" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:429 msgid "Row #{0}: Qty should be less than or equal to Available Qty to Reserve (Actual Qty - Reserved Qty) {1} for Item {2} against Batch {3} in Warehouse {4}." -msgstr "" +msgstr "Red #{0}: Količina bi trebala biti manja ili jednaka Dostupnoj Količini za Rezervaciju (Stvarna količina - Rezervisana količina) {1} za artikal {2} naspram Šarže {3} u Skladištu {4}." #: erpnext/stock/services/quality_inspection_service.py:77 msgid "Row #{0}: Quality Inspection is required for Item {1}" @@ -46512,7 +46512,10 @@ msgid "Row #{0}: Selling rate for item {1} is lower than its {2}.\n" "\t\t\t\t\tSelling {3} should be at least {4}.

Alternatively,\n" "\t\t\t\t\tyou can disable '{5}' in {6} to bypass\n" "\t\t\t\t\tthis validation." -msgstr "" +msgstr "Red #{0}: Prodajna cijena za artikal {1} je niža od njegove {2}.\n" +"\t\t\t\t\tProdaja {3} treba biti barem {4}.

Alternativno,\n" +"\t\t\t\t\tmožete onemogućiti '{5}' u {6} kako biste zaobišli\n" +"\t\t\t\t\tovu validaciju." #: erpnext/manufacturing/doctype/work_order/work_order.py:348 msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." @@ -46520,7 +46523,7 @@ msgstr "Red #{0}: ID Sekvence mora biti {1} ili {2} za Operaciju {3}." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:528 msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" -msgstr "" +msgstr "Red #{0}: Serijski Broj {1} ne može se vratiti jer nije naveden u originalnoj fakturi {2}" #: erpnext/stock/services/serial_batch_bundle_service.py:123 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" @@ -46637,11 +46640,11 @@ msgstr "Red #{0}: Šarža {1} je već istekla." #: erpnext/stock/doctype/stock_entry/stock_entry.py:408 msgid "Row #{0}: The job card item reference is missing. Kindly create the stock entry from the job card. If you have added the row manually then you won't be able to add job card item reference." -msgstr "" +msgstr "Red #{0}: Nedostaje referenca artikla na radnoj kartici. Stvori unos zaliha iz radne kartice. Ako ste red dodali ručno, nećete moći dodati referencu artikla na radnu karticu." #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:103 msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." -msgstr "" +msgstr "Red #{0}: Izvorna faktura {1} povratne fakture {2} nije konsolidirana." #: erpnext/stock/doctype/item/item.py:599 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" @@ -46649,7 +46652,7 @@ msgstr "Red #{0}: Skladište {1} nije podređeno skladište grupnog skladišta { #: erpnext/manufacturing/doctype/workstation/workstation.py:190 msgid "Row #{0}: Timings conflict with row {1}" -msgstr "" +msgstr "Red #{0}: Vremenski sukob s redom {1}" #: erpnext/assets/doctype/asset/asset.py:656 msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations" @@ -46673,7 +46676,7 @@ msgstr "Red #{0}: Radni Nalog postoji za punu ili djelomičnu količinu artiikla #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:500 msgid "Row #{0}: You cannot add positive quantities in a return invoice. Please remove item {1} to complete the return." -msgstr "" +msgstr "Redak #{0}: Ne možete dodati pozitivne količine u povratnu fakturu. Ukloni artikal {1} kako biste dovršili povrat." #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:110 msgid "Row #{0}: You cannot use the inventory dimension '{1}' in Stock Reconciliation to modify the quantity or valuation rate. Stock reconciliation with inventory dimensions is intended solely for performing opening entries." @@ -46685,7 +46688,7 @@ msgstr "Red #{0}: Odaberi Imovinu za Artikal {1}." #: erpnext/stock/doctype/pick_list/pick_list.py:235 msgid "Row #{0}: item {1} has been picked already." -msgstr "" +msgstr "Red #{0}: artikal {1} je već odabran." #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:142 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:207 @@ -46694,7 +46697,7 @@ msgstr "Red #{0}: {1}" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:142 msgid "Row #{0}: {1} account is not of type {2}" -msgstr "" +msgstr "Red #{0}: {1} račun nije tipa {2}" #: erpnext/public/js/controllers/buying.js:261 msgid "Row #{0}: {1} can not be negative for item {2}" @@ -46714,11 +46717,11 @@ msgstr "Red #{0}: {1} od {2} bi trebao biti {3}. Ažuriraj {1} ili odaberi drugi #: erpnext/stock/doctype/item/item.py:1511 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." -msgstr "" +msgstr "Red #{0}: {1} {2} ne pripada tvrtki {3}. Odaberi valjani {4}." #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:126 msgid "Row #{0}: {1} {2} does not exist." -msgstr "" +msgstr "Red #{0}: {1} {2} ne postoji." #: erpnext/accounts/services/child_item_update.py:251 msgid "Row #{0}:Quantity for Item {1} cannot be zero." @@ -46895,7 +46898,7 @@ msgstr "Red {0}: Od vremena i do vremena je obavezano." #: erpnext/manufacturing/doctype/job_card/job_card.py:355 msgid "Row {0}: From Time and To Time of {1} are overlapping with {2}" -msgstr "" +msgstr "Red {0}: Vrijeme od i Vrijeme do {1} preklapaju se s {2}" #: erpnext/projects/doctype/timesheet/timesheet.py:225 msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" @@ -46919,7 +46922,7 @@ msgstr "Red {0}: Nevažeća referenca {1}" #: erpnext/controllers/taxes_and_totals.py:134 msgid "Row {0}: Item Tax template for {1} updated as per validity and rate applied" -msgstr "" +msgstr "Red {0}: Predložak PDV-a na Artikal za {1} ažuriran je prema valjanosti i primijenjenoj stopi" #: erpnext/controllers/selling_controller.py:659 msgid "Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer" @@ -46983,7 +46986,7 @@ msgstr "Red {0}: Odaberi Sastavnicu za artikal {1}." #: erpnext/controllers/subcontracting_controller.py:214 msgid "Row {0}: Please select a valid BOM for Item {1}." -msgstr "" +msgstr "Red {0}: Odaberi valjanu Sastavnicu za artikal {1}." #: erpnext/controllers/subcontracting_controller.py:208 msgid "Row {0}: Please select an active BOM for Item {1}." @@ -47055,7 +47058,7 @@ msgstr "Red {0}: Cijeli iznos troška za račun {1} u {2} je već dodijeljen." #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.py:103 msgid "Row {0}: The item {1}, quantity must be a positive number" -msgstr "" +msgstr "Red {0}: Artikal {1}, količina mora biti pozitivan broj" #: erpnext/accounts/services/taxes.py:269 msgid "Row {0}: The {3} Account {1} does not belong to the company {2}" @@ -47116,7 +47119,7 @@ msgstr "Red {0}: {1} {2} je povezan sa {3}. Odaberi dokument koji pripada {4}." #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:132 msgid "Row {0}: {1} {2} must be submitted" -msgstr "" +msgstr "Red {0}: {1} {2} mora biti podnešen" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:111 msgid "Row {0}: {2} Item {1} does not exist in {2} {3}" @@ -47162,7 +47165,7 @@ msgstr "Redovi: {0} imaju 'Unos Plaćanja' kao Tip Reference. Ovo ne treba posta #: erpnext/controllers/accounts_controller.py:276 msgid "Rows: {0} in {1} section are invalid. Reference Name should point to a valid Payment Entry or Journal Entry." -msgstr "" +msgstr "Redovi: {0} u {1} sekciji su nevažeći. Naziv reference treba da ukazuje na važeći Unos Plaćanja ili Nalog Knjiženja." #. Label of the rule_applied (Check) field in DocType 'Pricing Rule Detail' #: erpnext/accounts/doctype/pricing_rule_detail/pricing_rule_detail.json @@ -47589,7 +47592,7 @@ msgstr "Prodajna Faktura nije podnešena" #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:195 msgid "Sales Invoice isn't created by user {0}" -msgstr "" +msgstr "Prodajna Faktura nije izrađena od korisnika {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:472 msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." @@ -49055,7 +49058,7 @@ msgstr "Odabrani dokument mora biti u podnešenom stanju" #: erpnext/assets/doctype/asset/asset.py:1195 msgid "Selected {0} does not contain the Item Code {1}" -msgstr "" +msgstr "Odabrani {0} ne sadrži Kod Artikla {1}" #. Option for the 'Pickup Type' (Select) field in DocType 'Shipment' #: erpnext/stock/doctype/shipment/shipment.json @@ -49393,7 +49396,7 @@ msgstr "Serijski broj je već dodijeljen" #: erpnext/assets/doctype/asset_repair/asset_repair.py:296 msgid "Serial No Bundle is mandatory for Item {0}" -msgstr "" +msgstr "Paket Serijskih Brojeva je obavezan za artikal {0}" #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:33 msgid "Serial No Count" @@ -49458,7 +49461,7 @@ msgstr "Serijski Broj i Šarža" #: erpnext/stock/doctype/stock_settings/stock_settings.js:93 msgid "Serial No and Batch Selector cannot be used when Use Serial / Batch Fields is enabled." -msgstr "" +msgstr "Serijski Broj i birač Šarže ne mogu se koristiti kada je omogućeno Koristi Serijski Broj / Šaržu." #. Name of a report #. Label of a Link in the Stock Workspace @@ -49501,7 +49504,7 @@ msgstr "Serijski Broj {0} ne postoji" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:378 msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." -msgstr "" +msgstr "Serijski broj {0} je već dostavljen. Ne možete ga ponovno koristiti u unosu Proizvodnje / Ponovnog pakiranja." #: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Serial No {0} is already added" @@ -49517,11 +49520,11 @@ msgstr "Serijski broj {0} nije u {1} {2}, i ne može se vratiti naspram {1} {2}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:343 msgid "Serial No {0} is under maintenance contract until {1}" -msgstr "" +msgstr "Serijski Broj {0} je pod ugovorom o održavanju do {1}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:336 msgid "Serial No {0} is under warranty until {1}" -msgstr "" +msgstr "Serijski Broj {0} je pod jamstvom do {1}" #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:322 msgid "Serial No {0} not found" @@ -49657,7 +49660,7 @@ msgstr "Serijski i Šaržni Paket {0} je podnešen i njegovi unosi se ne mogu mi #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:298 msgid "Serial and Batch Bundle {0} should have voucher type as 'Maintenance Schedule'" -msgstr "" +msgstr "Serijski i Šaržni Paket {0} treba imati tip verifikata kao 'Raspored Održavanja'" #. Label of the section_break_45 (Section Break) field in DocType #. 'Subcontracting Receipt Item' @@ -51136,7 +51139,7 @@ msgstr "Nedostaju neki obavezni podaci o tvrtki. Nemate dopuštenje za njihovo a #: erpnext/www/book_appointment/index.js:248 msgid "Something went wrong, please try again" -msgstr "" +msgstr "Nešto nije u redu, pokušajte ponovo" #: erpnext/accounts/doctype/pricing_rule/utils.py:754 msgid "Sorry, this coupon code is no longer valid" @@ -51387,7 +51390,7 @@ msgstr "Raspodijeli proviziju među više prodavača." #: erpnext/buying/doctype/purchase_order/purchase_order.js:600 #: erpnext/public/js/controllers/buying.js:558 msgid "Splitting {0} units of {1}" -msgstr "" +msgstr "Dijeljenje {0} jedinica od {1}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2195 msgid "Splitting {0} {1} into {2} rows as per Payment Terms" @@ -51509,15 +51512,15 @@ msgstr "Poredak" #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:73 msgid "Standing scores must be continuous and cover 0 to 100 without gaps or overlaps" -msgstr "" +msgstr "Trenutni rezultati moraju biti kontinuirani i pokrivati od 0 do 100 bez praznina ili preklapanja" #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:76 msgid "Standing scores must cover the full range from 0 to 100" -msgstr "" +msgstr "Trenutni rezultati moraju pokrivati cijeli raspon od 0 do 100" #: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:68 msgid "Standing {0} must have a minimum grade lower than its maximum grade" -msgstr "" +msgstr "{0} mora imati minimalnu ocjenu nižu od maksimalne ocjene" #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.js:54 msgid "Start / Resume" @@ -51525,7 +51528,7 @@ msgstr "Pokreni / Nastavi" #: erpnext/accounts/doctype/accounting_period/accounting_period.py:45 msgid "Start Date cannot be after End Date" -msgstr "" +msgstr "Datum početka ne može biti nakon datuma završetka" #: erpnext/crm/doctype/email_campaign/email_campaign.py:40 msgid "Start Date cannot be before the current date" @@ -51591,7 +51594,7 @@ msgstr "Pokrenut je pozadinski zadatak za stvaranje {1} {0}. {2}" #: erpnext/public/js/bulk_transaction_processing.js:29 msgid "Starting a background job to create {0} {1}" -msgstr "" +msgstr "Pokretanje pozadinskog zadatka za stvaranje {0} {1}" #. Label of the date_dist_from_left_edge (Float) field in DocType 'Cheque Print #. Template' @@ -51802,7 +51805,7 @@ msgstr "Unos Zaključanih Zaliha {0} već postoji za odabrani vremenski raspon" #: erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py:100 msgid "Stock Closing Entry {0} has been queued for processing, the system will take some time to complete it." -msgstr "" +msgstr "Završni Unos Zaliha {0} je stavljen u red za obradu, sustavu će trebati neko vrijeme da ga dovrši." #: erpnext/stock/doctype/stock_closing_entry/stock_closing_entry_dashboard.py:9 msgid "Stock Closing Log" @@ -51885,11 +51888,11 @@ msgstr "Tip Unosa Zaliha" #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.py:65 msgid "Stock Entry Type {0} cannot be set as standard" -msgstr "" +msgstr "Tip Unosa Zaliha {0} ne može se postaviti kao standard" #: erpnext/stock/doctype/pick_list/mapper.py:289 msgid "Stock Entry has already been created against this Pick List" -msgstr "" +msgstr "Unos Zaliha je već izrađen naspram ove Liste Odabira" #: erpnext/stock/doctype/batch/batch.js:138 msgid "Stock Entry {0} created" @@ -51897,7 +51900,7 @@ msgstr "Unos Zaliha {0} je kreiran" #: erpnext/manufacturing/doctype/job_card/job_card.py:1639 msgid "Stock Entry {0} has been created" -msgstr "" +msgstr "Unos Zaliha {0} je izrađen" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:997 msgid "Stock Entry {0} is not submitted" @@ -52510,7 +52513,7 @@ msgstr "Zaliha nije dostupna za Artikal {0} u Skladištu {1}." #: erpnext/selling/page/point_of_sale/pos_controller.js:826 msgid "Stock quantity is not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}." -msgstr "" +msgstr "Količina na zalihi nije dovoljna za Artikal Kod: {0} u skladištu {1}. Dostupna količina {2} {3}." #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:255 msgid "Stock transactions before {0} are frozen" @@ -53980,7 +53983,7 @@ msgstr "Ciljna Imovina {0} ne pripada tvrtki {1}" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:189 msgid "Target Asset {0} needs to be a composite asset" -msgstr "" +msgstr "Ciljana Imovina {0} mora biti složena imovina" #. Name of a DocType #: erpnext/setup/doctype/target_detail/target_detail.json @@ -55090,7 +55093,7 @@ msgstr "Tekst prikazan u financijskom izvješću (npr. 'Ukupni Prihod', 'Gotovin #: erpnext/stock/doctype/packing_slip/packing_slip.py:89 msgid "The 'From Package No.' field must not be empty or have a value less than 1." -msgstr "" +msgstr "\"Od Paketa Broj.\" polje ne smije biti prazno niti njegova vrijednost manja od 1." #. Description of the 'Current BOM' (Link) field in DocType 'BOM Update Tool' #: erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.json @@ -55099,7 +55102,7 @@ msgstr "Sastavnica koja će biti zamijenjena" #: erpnext/controllers/subcontracting_controller.py:1056 msgid "The Batch No {0} has not been supplied against the {1} {2}" -msgstr "" +msgstr "Broj Šarže {0} nije dostavljen naspram {1} {2}" #: erpnext/stock/serial_batch_bundle.py:1557 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." @@ -55107,7 +55110,7 @@ msgstr "Šarža {0} ima negativnu količinu {1}. Da biste to riješili, idite na #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1590 msgid "The Batch {0} of item {1} has negative stock in the warehouse {2}{3}. Please add a stock quantity of {4} to proceed with this entry. If it is not possible to make an adjustment entry, please enable 'Allow Negative Stock for Batch' in the batch {0} or in the Stock Settings to proceed. However, enabling this setting may lead to negative stock in the system. So please ensure the stock levels are adjusted as soon as possible to maintain the correct valuation rate." -msgstr "" +msgstr "Šarža {0} artikla {1} ima negativne zalihe u skladištu {2}{3}. Dodaj količinu zaliha od {4} da biste nastavili s ovim unosom. Ako nije moguće izvršiti unos prilagođavanja, omogućite 'Dozvoli Negativne Zalihe za Šaržu' za Šaržu {0} ili u Postavkama Zaliha da biste nastavili. Međutim, omogućavanje ove postavke može dovesti do negativnih zaliha u sustavu. Stoga, molimo vas da osigurate da se razina zaliha što prije prilagode kako bi se održala ispravna stopa vrednovanja." #: erpnext/crm/doctype/email_campaign/email_campaign.py:71 msgid "The Campaign '{0}' already exists for the {1} '{2}'" @@ -55135,7 +55138,7 @@ msgstr "Knjigovodstveni Unosi će biti otkazani u pozadini, može potrajati neko #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1156 msgid "The Item {0} does not have Serial No or Batch No" -msgstr "" +msgstr "Artikal {0} nema Serijski niti Šaržni Broj" #: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:179 msgid "The Loyalty Program isn't valid for the selected company" @@ -55155,11 +55158,11 @@ msgstr "Lista Odabira koja ima Unose Rezervacije Zaliha ne može se ažurirati. #: erpnext/stock/doctype/stock_entry/services/manufacturing.py:127 msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" -msgstr "" +msgstr "Količina gubitaka procesa poništena je prema količini gubitaka procesa na radnoj kartici" #: erpnext/stock/doctype/stock_entry/stock_entry.py:1375 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" -msgstr "" +msgstr "Količina gubitaka procesa poništena je prema količini gubitaka procesa na radnoj kartici" #: erpnext/setup/doctype/sales_person/sales_person.py:102 msgid "The Sales Person is linked with {0}" @@ -55175,7 +55178,7 @@ msgstr "Serijski Broj {0} je rezervisan naspram {1} {2} i ne može se koristiti #: erpnext/controllers/subcontracting_controller.py:1071 msgid "The Serial Nos {0} have not been supplied against the {1} {2}" -msgstr "" +msgstr "Serijski Brojevi {0} nisu dostavljeni naspram {1} {2}" #: erpnext/stock/doctype/stock_entry/stock_entry.py:950 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}" @@ -55231,7 +55234,7 @@ msgstr "Završena količina {0} operacije {1} ne može biti veća od završene k #: erpnext/accounts/doctype/dunning/dunning.py:87 msgid "The currency of invoice {0} ({1}) is different from the currency of this dunning ({2})." -msgstr "" +msgstr "Valuta Fakture {0} ({1}) razlikuje se od valute ove opomene ({2})." #: erpnext/selling/page/point_of_sale/pos_controller.js:200 msgid "The current POS opening entry is outdated. Please close it and create a new one." @@ -55284,7 +55287,7 @@ msgstr "Polje {0} u redu {1} nije postavljeno" #: erpnext/stock/stock_ledger.py:369 msgid "The field {0} is required for reposting" -msgstr "" +msgstr "Polje {0} je obavezno za ponovno knjiženje" #: erpnext/accounts/doctype/share_transfer/share_transfer.py:188 msgid "The fields From Shareholder and To Shareholder cannot be blank" @@ -55309,7 +55312,7 @@ msgstr "Brojevi Folija nisu usklađeni" #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:306 msgid "The following Items, having Putaway Rules, could not be accommodated:" -msgstr "" +msgstr "Sljedeći artikli, koji imaju Pravila Odlaganja na Stranu, nisu mogli biti primjenjene:" #: erpnext/assets/doctype/asset_repair/asset_repair.py:137 msgid "The following Purchase Invoices are not submitted:" @@ -55337,7 +55340,7 @@ msgstr "Sljedeće osoblje još uvijek podnosi izvješća {0}:" #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.py:185 msgid "The following invalid Pricing Rules are deleted:{0}" -msgstr "" +msgstr "Sljedeća nevažeća pravila određivanja cijena se brišu:{0}" #: erpnext/accounts/doctype/payment_request/payment_request.py:782 msgid "The following payment schedule(s) already exist:\n" @@ -55386,7 +55389,7 @@ msgstr "Artikli {items} nisu označeni kao {type_of} artikli. Možete ih omoguć #: erpnext/manufacturing/doctype/workstation/workstation.py:595 msgid "The job card {0} is in {1} state and you cannot complete it." -msgstr "" +msgstr "Radna Kartica {0} je u {1} stanju i ne možete je dovršiti." #: erpnext/manufacturing/doctype/workstation/workstation.py:589 msgid "The job card {0} is in {1} state and you cannot start it again." @@ -55424,11 +55427,11 @@ msgstr "Početno stanje možda ne odgovara vašem bankovnom izvodu. Želite li i #: erpnext/manufacturing/doctype/operation/operation.py:43 msgid "The operation {0} cannot be added multiple times" -msgstr "" +msgstr "Operacija {0} ne može se dodati više puta" #: erpnext/manufacturing/doctype/operation/operation.py:48 msgid "The operation {0} cannot be its own sub-operation" -msgstr "" +msgstr "Operacija {0} ne može biti vlastita podoperacija" #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:107 msgid "The original invoice should be consolidated before or along with the return invoice." @@ -55478,7 +55481,7 @@ msgstr "Procenat kojim vam je dozvoljeno prenijeti više naspram naručene koli #: erpnext/stock/doctype/item_price/item_price.py:71 msgid "The price list {0} does not exist or is disabled" -msgstr "" +msgstr "Cjenik {0} ne postoji ili je onemogućen" #. Description of the 'Last Purchase Rate' (Float) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -55507,7 +55510,7 @@ msgstr "Odabrane Sastavnice nisu za istu artikal" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:544 msgid "The selected change account {0} does not belong to Company {1}." -msgstr "" +msgstr "Odabrani račun povrata {0} ne pripada {1}." #: erpnext/stock/doctype/batch/batch.py:157 msgid "The selected item cannot have Batch" @@ -55524,7 +55527,7 @@ msgstr "Prodavač i Kupac ne mogu biti isti" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:186 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:198 msgid "The serial and batch bundle {0} is not linked to {1} {2}" -msgstr "" +msgstr "Serijski i Šaržni Paket {0} nije povezan sa {1} {2}" #: erpnext/stock/doctype/batch/batch.py:386 msgid "The serial no {0} does not belong to item {1}" @@ -55578,7 +55581,7 @@ msgstr "Zadatak je stavljen u red kao pozadinski posao. U slučaju da postoji bi #: erpnext/stock/doctype/material_request/material_request.py:352 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}" -msgstr "" +msgstr "Ukupna količina izdavanja / prijenosa {0} u Materijalnom Nalogu {1} ne može biti veća od dopuštene tražene količine {2} za artikal {3}" #: erpnext/stock/doctype/material_request/material_request.py:359 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" @@ -55658,7 +55661,7 @@ msgstr "{0} {1} se ne poklapa s {0} {2} u {3} {4}" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1730 msgid "The {0} {1} is in submitted state, please cancel it first" -msgstr "" +msgstr "{0} {1} je u podnešenom stanju, prvo ga otkažite" #: erpnext/manufacturing/doctype/job_card/job_card.py:1075 msgid "The {0} {1} is used to calculate the valuation cost for the finished good {2}." @@ -55699,7 +55702,7 @@ msgstr "U sustavu nema unosa kod kojih je datum odobravanja prije datuma knjiže #: erpnext/stock/report/item_variant_details/item_variant_details.py:25 msgid "There are no item variants for the selected item" -msgstr "" +msgstr "Nema varijanti artikla za odabrani artikal" #: erpnext/www/book_appointment/index.js:95 msgid "There are no slots available on this date" @@ -55747,7 +55750,7 @@ msgstr "Postoji jedna neusklađena transakcija prije {0}." #: erpnext/stock/doctype/stock_entry/stock_entry.py:887 msgid "There must be at least 1 Finished Good in this Stock Entry" -msgstr "" +msgstr "U ovom unosu zaliha mora biti barem jedan gotov proizvod" #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:152 msgid "There was an error creating Bank Account while linking with Plaid." @@ -55759,7 +55762,7 @@ msgstr "Došlo je do greške pri sinhronizaciji transakcija." #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:174 msgid "There was an error updating Bank Account {0} while linking with Plaid." -msgstr "" +msgstr "Došlo je do pogreške prilikom ažuriranja bankovnog računa {0} prilikom povezivanja s Plaidom." #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:81 msgid "There was an error while importing the bank statement." @@ -55815,7 +55818,7 @@ msgstr "Ovaj unos plaćanja usklađen je s {0}. Otkazivanje će ga automatski po #: erpnext/selling/doctype/product_bundle/product_bundle.py:121 msgid "This Product Bundle is linked with {0}. You will have to cancel these documents in order to delete this Product Bundle" -msgstr "" +msgstr "Ovaj Artikal Paket je povezan sa {0}. Morat ćete otkazati ove dokumente kako biste izbrisali ovaj Artikal Paket" #: erpnext/buying/doctype/purchase_order/mapper.py:251 msgid "This Purchase Order has been fully subcontracted." @@ -56156,7 +56159,7 @@ msgstr "Ovo će ograničiti pristup korisnika drugim zapisima zaposlenih" #: erpnext/controllers/selling_controller.py:901 msgid "This {0} will be treated as material transfer." -msgstr "" +msgstr "Ovo {0} će se tretirati kao prijenos materijala." #. Option for the 'Under Withheld Reason' (Select) field in DocType 'Tax #. Withholding Entry' @@ -56288,7 +56291,7 @@ msgstr "Vremenska Linija" #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "Timeout (in seconds) for each background job enqueued by Process Period Closing Voucher" -msgstr "" +msgstr "Vremensko ograničenje (u sekundama) za svaki pozadinski zadatak stavljen u red čekanja prema verifikatu za zatvaranje knjigovodstvenog razdoblja" #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:36 #: erpnext/public/js/projects/timer.js:5 @@ -56577,7 +56580,7 @@ msgstr "Do Vremena" #: erpnext/projects/doctype/timesheet_detail/timesheet_detail.py:108 msgid "To Time cannot be before From Time" -msgstr "" +msgstr "Do Vremena ne može biti prije Od Vremena" #. Description of the 'Referral Code' (Data) field in DocType 'Sales Partner' #: erpnext/setup/doctype/sales_partner/sales_partner.json @@ -56633,7 +56636,7 @@ msgstr "Dostava Klijentu" #: erpnext/accounts/doctype/sales_invoice/services/pos.py:276 msgid "To cancel a {0} you need to cancel the POS Closing Entry {1}." -msgstr "" +msgstr "Za otkazivanje {0} morate otkazati unos zatvaranja Blagajne {1}." #: erpnext/accounts/doctype/sales_invoice/services/pos.py:290 msgid "To cancel this Sales Invoice you need to cancel the POS Closing Entry {0}." @@ -56645,7 +56648,7 @@ msgstr "Za kreiranje Zahtjeva Plaćanja obavezan je referentni dokument" #: erpnext/assets/doctype/asset_category/asset_category.py:120 msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" -msgstr "" +msgstr "Da biste omogućili knjigovodstvo nedovršenih kapitalnih radova, morate odabrati Račun nedovršenih kapitalnih radova u tablici računa" #: erpnext/manufacturing/doctype/production_plan/production_plan.js:734 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." @@ -56824,19 +56827,19 @@ msgstr "Ukupni Predujam" #: erpnext/public/js/utils.js:250 msgid "Total Advance Paid" -msgstr "" +msgstr "Ukupno Plaćeno Unaprijed" #: erpnext/public/js/utils.js:195 msgid "Total Advance Paid: {0}" -msgstr "" +msgstr "Ukupno Plaćeno Unaprijed: {0}" #: erpnext/public/js/utils.js:252 msgid "Total Advance Received" -msgstr "" +msgstr "Ukupno Primljeno Unaprijed" #: erpnext/public/js/utils.js:198 msgid "Total Advance Received: {0}" -msgstr "" +msgstr "Ukupno Primljeno Unaprijed: {0}" #. Label of the total_allocated_amount (Currency) field in DocType 'Payment #. Entry' @@ -57495,7 +57498,7 @@ msgstr "Ukupno Vrijeme u minutama" #: erpnext/public/js/utils.js:253 msgid "Total Unpaid" -msgstr "" +msgstr "Ukupno Neplaćeno" #: erpnext/public/js/utils.js:200 msgid "Total Unpaid: {0}" @@ -57595,7 +57598,7 @@ msgstr "Ukupno sati: {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:574 #: erpnext/accounts/doctype/sales_invoice/services/pos.py:190 msgid "Total payments amount can't be greater than {0}" -msgstr "" +msgstr "Ukupni iznos plaćanja ne može biti veći od {0}" #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py:66 msgid "Total percentage against cost centers should be 100" @@ -57614,7 +57617,7 @@ msgstr "Ukupno {0} ({1})" #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:248 msgid "Total {0} for all items is zero, maybe you should change 'Distribute Charges Based On'" -msgstr "" +msgstr "Ukupno {0} za sve artikle je nula, možda biste trebali promijeniti 'Raspodjeli Naknade na Temelju'" #: erpnext/controllers/trends.py:25 erpnext/controllers/trends.py:32 msgid "Total(Amt)" @@ -58155,7 +58158,7 @@ msgstr "Probna Bilanca Stranke" #: erpnext/accounts/report/trial_balance/trial_balance.py:595 msgid "Trial Balance requires {0} to be synced to DuckDB" -msgstr "" +msgstr "Probna Bilanca zahtijeva sinhronizaciju {0} sa DuckDB-om" #. Label of the trial_period_end (Date) field in DocType 'Subscription' #: erpnext/accounts/doctype/subscription/subscription.json @@ -59399,7 +59402,7 @@ msgstr "Korisnik nije primijenio pravilo na fakturi {0}" #: erpnext/crm/frappe_crm_api.py:175 msgid "User not allowed to synchronize data from Frappe CRM on ERPNext. Contact System Manager of ERPNext." -msgstr "" +msgstr "Korisniku nije dopuštena sinkronizacija podataka iz Prodajne Podrške u Sustav. Obratite se Upravitelju Sustava." #: erpnext/setup/doctype/employee/employee.py:298 msgid "User {0} does not exist" @@ -59415,7 +59418,7 @@ msgstr "Korisnik {0} je već dodijeljen {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:62 msgid "User {0} is disabled. Please select valid user/cashier" -msgstr "" +msgstr "Korisnik {0} je onemogućen. Odaberi valjanog korisnika/blagajnika" #: erpnext/setup/doctype/employee/employee.py:365 msgid "User {0}: Removed Employee Self Service role as there is no mapped employee." @@ -59763,7 +59766,7 @@ msgstr "Naknade za tip vrijednovanja ne mogu biti označene kao Inkluzivne" #: erpnext/public/js/controllers/accounts.js:228 msgid "Valuation type charges cannot be marked as Inclusive" -msgstr "" +msgstr "Naknade tipa procjene vrijednosti ne mogu biti označene kao uključene" #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:58 msgid "Value (G - D)" @@ -61329,11 +61332,11 @@ msgstr "Sažetka Izvješća Radnog Naloga" #: erpnext/stock/doctype/material_request/material_request.py:579 msgid "Work Order cannot be created for the following reason:
{0}" -msgstr "" +msgstr "Radni Nalog se ne može izraditi iz sljedećeg razloga:
{0}" #: erpnext/manufacturing/doctype/work_order/work_order.py:857 msgid "Work Order cannot be raised against an Item Template" -msgstr "" +msgstr "Radni Nalog ne može se pokrenuti na temelju Predloška Artikla" #: erpnext/manufacturing/doctype/work_order/work_order.py:1123 #: erpnext/manufacturing/doctype/work_order/work_order.py:1170 @@ -61686,7 +61689,7 @@ msgstr "Uvoziš podatke za Listu Koda:" #: erpnext/accounts/services/child_item_update.py:232 msgid "You are not allowed to update as per the conditions set in {0} Workflow." -msgstr "" +msgstr "Nije vam dopušteno ažuriranje prema uvjetima postavljenim u {0} Radnom Tijeku." #: erpnext/accounts/services/gl_validator.py:114 msgid "You are not authorized to add or update entries before {0}" @@ -61706,7 +61709,7 @@ msgstr "Birate više od potrebne količine za artikal {0}. Provjerite postoji li #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:111 msgid "You can add the original invoice {0} manually to proceed." -msgstr "" +msgstr "Izvornu Fakturu {0} možete dodati ručno da biste nastavili." #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:743 msgid "You can also add credit or debit values to pre-fill - these support both static values (like 200) or formulas (like transaction_amount * 0.25)." @@ -61718,7 +61721,7 @@ msgstr "Takođe možete kopirati i zalijepiti ovu vezu u svoj pretraživač" #: erpnext/assets/doctype/asset_category/asset_category.py:124 msgid "You can also set default CWIP account in Company {0}" -msgstr "" +msgstr "Također možete postaviti standard Račun Kapitalnog Posla u Toku u {0}" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 msgid "You can change the parent account to a Balance Sheet account or select a different account." @@ -61747,7 +61750,7 @@ msgstr "Možete odabrati samo jedan način plaćanja kao standard" #: erpnext/selling/page/point_of_sale/pos_payment.js:595 msgid "You can redeem up to {0}." -msgstr "" +msgstr "Možete iskoristiti do {0}." #: banking/src/components/features/BankReconciliation/IncorrectlyClearedEntries.tsx:193 msgid "You can reset the clearing dates of these entries here." @@ -61779,11 +61782,11 @@ msgstr "Ne možete kreirati {0} unutar zatvorenog Knjigovodstvenog Perioda {1}" #: erpnext/accounts/services/gl_validator.py:64 msgid "You cannot create or cancel any accounting entries within the closed Accounting Period {0}" -msgstr "" +msgstr "Ne možete izraditi niti otkazati nikakve knjigovodstvene zapise unutar zatvorenog knjigovodstvenog perioda. {0}" #: erpnext/accounts/services/gl_validator.py:145 msgid "You cannot create/amend any accounting entries until this date." -msgstr "" +msgstr "Ne možete izraditi/izmijeniti bilo koje knjigovodstvene unose do ovog datuma." #: erpnext/accounts/doctype/journal_entry/journal_entry.py:675 msgid "You cannot credit and debit same account at the same time" @@ -61795,7 +61798,7 @@ msgstr "Ne možete izbrisati tip projekta 'Eksterni'" #: erpnext/setup/doctype/department/department.js:19 msgid "You cannot edit the root node." -msgstr "" +msgstr "Ne možete uređivati korijenski čvor." #: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 msgid "You cannot enable both the settings '{0}' and '{1}'." @@ -61803,15 +61806,15 @@ msgstr "Ne možete omogućiti i '{0}' i '{1} postavke." #: erpnext/manufacturing/doctype/job_card/job_card.py:1441 msgid "You cannot make any changes to Job Card since Work Order is closed." -msgstr "" +msgstr "Ne možete unositi nikakve promjene na Radnoj Kartici jer je Radni Nalog zatvoren." #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:167 msgid "You cannot outward the following {0} as they are either Delivered, Inactive or located in a different warehouse." -msgstr "" +msgstr "Ne možete poslati sljedeće {0} jer su ili Isporučeno, Neaktivno ili se nalaze u drugom skladištu." #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:229 msgid "You cannot process the serial number {0} as it has already been used in the SABB {1}. {2} If you want to inward the same serial number multiple times, then enable 'Allow existing Serial No to be Manufactured/Received again' in the {3}" -msgstr "" +msgstr "Ne možete obraditi serijski broj {0} jer je već korišten u Serijskom i Šaržnom Paketu {1}. {2} ako želite da primite isti serijski broj više puta, tada omogućite 'Dozvoli da se postojeći Serijski Broj ponovo Proizvede/Primi' u {3}" #: erpnext/selling/page/point_of_sale/pos_payment.js:625 msgid "You cannot redeem more than {0}." @@ -61819,7 +61822,7 @@ msgstr "Ne možete iskoristiti više od {0}." #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 msgid "You cannot repost item valuation before {0}" -msgstr "" +msgstr "Ne možete ponovo knjižiti procjenu vrijednosti artikla prije {0}" #: erpnext/accounts/doctype/subscription/subscription.py:832 msgid "You cannot restart a Subscription that is not cancelled." @@ -61827,7 +61830,7 @@ msgstr "Ne možete ponovo pokrenuti Pretplatu koja nije otkazana." #: erpnext/selling/page/point_of_sale/pos_payment.js:281 msgid "You cannot submit an empty order." -msgstr "" +msgstr "Ne možete podnijeti prazan nalog." #: erpnext/selling/page/point_of_sale/pos_payment.js:280 msgid "You cannot submit the order without payment." @@ -61843,7 +61846,7 @@ msgstr "Ne možete {0} ovaj dokument jer postoji drugi Unos Zatvaranje Perioda { #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:165 msgid "You do not have enough permission to access {0}: {1}" -msgstr "" +msgstr "Nemate dovoljno dopuštenja za pristup {0}: {1}" #: erpnext/accounts/doctype/bank_statement_import_log/bank_statement_import_log.py:82 msgid "You do not have permission to import and submit bank transactions" @@ -61856,7 +61859,7 @@ msgstr "Nemate dopuštenje za uvoz bankovnih transakcija" #: erpnext/accounts/services/child_item_update.py:210 msgid "You do not have permissions to {0} items in a {1}." -msgstr "" +msgstr "Nemate dopuštenja za {0} artikala u {1}." #: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:187 msgid "You don't have enough Loyalty Points to redeem" @@ -61884,7 +61887,7 @@ msgstr "Nemate dopuštenje za ažuriranje ovog dokumenta. Obratite se Upravitelj #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.py:310 msgid "You had {0} errors while creating opening invoices. Check {1} for more details" -msgstr "" +msgstr "Imali ste {0} pogrešaka prilikom izrade početnih računa. Pogledajte {1} za više detalja" #: erpnext/public/js/utils.js:1055 msgid "You have already selected items from {0} {1}" @@ -61904,7 +61907,7 @@ msgstr "Omogućili ste {0} i {1} u {2}. To može dovesti do umetanja cijena iz z #: erpnext/stock/doctype/shipment/shipment.js:442 msgid "You have entered a duplicate Delivery Note on row {0}. Please rectify and try again." -msgstr "" +msgstr "Unijeli ste duplikat Dostavnice u red {0}. Ispravi grešku i pokušaj ponovo." #: banking/src/components/features/BankReconciliation/BankPicker.tsx:64 msgid "You have not added any bank accounts to your company." @@ -61928,7 +61931,7 @@ msgstr "Morate odabrati Klijenta prije dodavanja Artikla." #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:282 msgid "You need to cancel POS Closing Entry {0} to be able to cancel this document." -msgstr "" +msgstr "Morate otkazati Unos Zatvaranje Blagajne {0} da biste mogli otkazati ovaj dokument." #: erpnext/accounts/services/taxes.py:277 msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account." @@ -61984,7 +61987,7 @@ msgstr "Nulto Stanje" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:353 msgid "Zero Balance Journal: {0}" -msgstr "" +msgstr "Žurnal Nultog Stanja: {0}" #: erpnext/regional/report/uae_vat_201/uae_vat_201.py:78 msgid "Zero Rated" @@ -62108,7 +62111,7 @@ msgstr "naziv polja" #: erpnext/setup/doctype/item_group/item_group.py:49 msgid "for tax category {0}" -msgstr "" +msgstr "za PDV kategoriju {0}" #. Option for the 'Service Provider' (Select) field in DocType 'Currency #. Exchange Settings' @@ -62467,7 +62470,7 @@ msgstr "{0} ne može biti negativan" #: erpnext/accounts/doctype/sales_invoice/services/loyalty.py:77 msgid "{0} cannot be cancelled since the Loyalty Points earned has been redeemed. First cancel the {1} No {2}" -msgstr "" +msgstr "{0} se ne može otkazati jer su osvojeni bodovi vjernosti iskorišteni. Prvo otkažite {1} Ne {2}" #: erpnext/accounts/doctype/pos_settings/pos_settings.py:53 msgid "{0} cannot be changed with opened Opening Entries." @@ -62475,7 +62478,7 @@ msgstr "{0} se ne može mijenjati s otvorenim Početnim Unosima." #: erpnext/public/js/utils/sales_common.js:336 msgid "{0} cannot be greater than 100" -msgstr "" +msgstr "{0} ne može biti veće od 100" #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py:136 msgid "{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}" @@ -62544,7 +62547,7 @@ msgstr "{0} je uspješno podnešen" #: erpnext/controllers/buying_controller.py:289 msgid "{0} has submitted assets linked to it. You need to cancel the assets to create purchase return." -msgstr "" +msgstr "{0} je podnio/la imovinu povezanu s njim/njom. Morate otkazati imovinu da biste izradili povrat." #: erpnext/projects/doctype/project/project_dashboard.html:15 msgid "{0} hours" @@ -62556,7 +62559,7 @@ msgstr "{0} u redu {1}" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:66 msgid "{0} is a child company." -msgstr "" +msgstr "{0} je podređena tvrtka." #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:465 msgid "{0} is a child table and will be deleted automatically with its parent" @@ -62639,7 +62642,7 @@ msgstr "{0} nije omogućen u {1}" #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:649 msgid "{0} is not running. Cannot trigger events for this document" -msgstr "" +msgstr "{0} se ne izvršava. Ne može pokrenuti događaje za ovaj dokument" #: erpnext/stock/doctype/material_request/material_request.py:478 msgid "{0} is not the default supplier for any items." @@ -62647,7 +62650,7 @@ msgstr "{0} nije standard dobavljač za bilo koji artikal." #: erpnext/accounts/doctype/payment_entry/payment_entry.py:2686 msgid "{0} is on hold until {1}" -msgstr "" +msgstr "{0} je na čekanju do {1}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:68 msgid "{0} is open. Close the POS or cancel the existing POS Opening Entry to create a new POS Opening Entry." @@ -62822,11 +62825,11 @@ msgstr "{0} {1} je već povezan sa Zajedničkim Kodom {2}." #: erpnext/accounts/doctype/party_link/party_link.py:53 #: erpnext/accounts/doctype/party_link/party_link.py:63 msgid "{0} {1} is already linked with another {2}" -msgstr "" +msgstr "{0} {1} je već povezan s drugim {2}" #: erpnext/accounts/doctype/party_link/party_link.py:40 msgid "{0} {1} is already linked with {2} {3}" -msgstr "" +msgstr "{0} {1} je već povezan s {2} {3}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:711 msgid "{0} {1} is associated with {2}, but Party Account is {3}" @@ -62867,7 +62870,7 @@ msgstr "{0} {1} nije aktivan" #: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:452 msgid "{0} {1} is not affecting bank account {2}" -msgstr "" +msgstr "{0} {1} ne utječe na bankovni račun {2}" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:688 msgid "{0} {1} is not associated with {2} {3}" diff --git a/erpnext/locale/sv.po b/erpnext/locale/sv.po index 13dd28de655..5c7e61ce3b7 100644 --- a/erpnext/locale/sv.po +++ b/erpnext/locale/sv.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" "POT-Creation-Date: 2026-06-28 10:20+0000\n" -"PO-Revision-Date: 2026-06-29 20:08\n" +"PO-Revision-Date: 2026-07-01 20:39\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" @@ -8227,7 +8227,7 @@ msgstr "Saldo Historik per Parti" #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:183 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:86 msgid "Batchwise Valuation" -msgstr "Partivis Värdering" +msgstr "Partibaserad Värdering" #. Label of the section_break_3 (Section Break) field in DocType 'Stock #. Reconciliation Item' @@ -9319,7 +9319,7 @@ msgstr "Beräkna Uppskatade Ankomst Tider" #. Settings' #: erpnext/selling/doctype/selling_settings/selling_settings.json msgid "Calculate Product Bundle price based on child Item's rates" -msgstr "Beräkna Artikel Paket pris baserat på priser för underordnade artiklar" +msgstr "Beräkna Artikel Paket pris baserat på priser för paket artiklar" #. Description of the 'Hidden Line (Internal Use Only)' (Check) field in #. DocType 'Financial Report Row' @@ -15680,7 +15680,7 @@ msgstr "Avdraget från" #. Deduction Certificate' #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json msgid "Deductee Details" -msgstr "Avdragsberättigad Detaljer" +msgstr "Avdragstagare Detaljer" #. Label of a Workspace Sidebar Item #: erpnext/workspace_sidebar/taxes.json @@ -17908,7 +17908,7 @@ msgstr "Uppdatera inte Varianter vid Spara" #. Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Do not use Batch-wise Valuation" -msgstr "Använd inte Partivis Värdering" +msgstr "Använd inte Partibaserad Värdering" #: erpnext/assets/doctype/asset/asset.js:957 msgid "Do you really want to restore this scrapped asset?" @@ -19193,9 +19193,9 @@ msgid "Enabling this will do the following:\n" msgstr "Om du aktiverar detta kommer följande att hända:\n" "
    \n" "
  • Pris Kolumn i alla Artikel Paket tabeller redigerbar.
  • \n" -"
  • Beräkna priser för alla artikel paket i Artikel tabell, baserat på priser för dess underordnade artiklar, som anges i Artikel Paket tabell.
  • \n" +"
  • Beräkna priser för alla Artikel Paket i Artikel tabell, baserat på priser för paket artiklar, som anges i Artikel Paket tabell.
  • \n" "
\n" -"Observera: Om detta är aktiverat kommer uppdatering av pris för artikel paket i artikel tabell inte att ändra dess pris. Det kommer att återställas till det pris som baseras på dess underordnade artiklar när dokumentet sparas." +"Observera: Om detta är aktiverat kommer uppdatering av pris för artikel paket i artikel tabell inte att ändra deras pris. Det kommer att återställas till pris som baseras på paket artiklar när dokument sparas." #. Label of the encashment_date (Date) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json @@ -33834,7 +33834,7 @@ msgstr "Öppning Faktura Verktyg" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:832 #: erpnext/accounts/doctype/sales_invoice/services/gl_composer.py:642 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 "Öppning Fakturan har avrundning justering på {0}.

'{1}' konto erfordras för att bokföra dessa värden. Ange det i Bolag: {2}.

Eller så kan '{3}' aktiveras för att inte bokföra någon avrundning justering." +msgstr "Öppning Faktura har avrundning justering på {0}.

'{1}' konto erfordras för att bokföra dessa värden. Ange det i Bolag: {2}.

Eller så kan '{3}' aktiveras för att inte bokföra någon avrundning justering." #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool_dashboard.html:8 msgid "Opening Invoices" @@ -59194,7 +59194,7 @@ msgstr "Använd Python filter för att hämta Konton" #. Label of the use_batchwise_valuation (Check) field in DocType 'Batch' #: erpnext/stock/doctype/batch/batch.json msgid "Use Batch-wise Valuation" -msgstr "Använd Partivis Värdering" +msgstr "Använd Partibaserad Värdering" #. Label of the use_csv_sniffer (Check) field in DocType 'Bank Statement #. Import' @@ -60825,7 +60825,7 @@ msgstr "Garanti Utgång (Serienummer)" #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Warranty Expiry Date" -msgstr "Garanti Utgångsdatum" +msgstr "Garanti Utgång Datum" #. Label of the warranty_period (Int) field in DocType 'Serial No' #: erpnext/stock/doctype/serial_no/serial_no.json From ed72732bb2ccc04ce2f519aef4d2d722be0d1356 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:21:36 +0530 Subject: [PATCH 068/400] test: Accounts Payable Summary report coverage --- .../test_accounts_payable_summary.py | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 erpnext/accounts/report/accounts_payable_summary/test_accounts_payable_summary.py diff --git a/erpnext/accounts/report/accounts_payable_summary/test_accounts_payable_summary.py b/erpnext/accounts/report/accounts_payable_summary/test_accounts_payable_summary.py new file mode 100644 index 00000000000..46491b1ad37 --- /dev/null +++ b/erpnext/accounts/report/accounts_payable_summary/test_accounts_payable_summary.py @@ -0,0 +1,144 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import today + +from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice +from erpnext.accounts.report.accounts_payable_summary.accounts_payable_summary import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestAccountsPayableSummary(ERPNextTestSuite): + """Payable Summary is a thin wrapper over AccountsReceivableSummary with + account_type=Payable; these tests lock the supplier-side output: invoiced, + advance, paid, outstanding, ageing buckets and the optional GL-balance / + future-payment columns.""" + + def setUp(self): + frappe.set_user("Administrator") + self.maxDiff = None + self.company = "_Test Company" + self.supplier = "_Test Supplier" + + def _filters(self, **overrides): + filters = { + "company": self.company, + "supplier": self.supplier, + "posting_date": today(), + "range": "30, 60, 90, 120", + } + filters.update(overrides) + return filters + + def _make_invoice(self, rate=200): + return make_purchase_invoice( + company=self.company, + supplier=self.supplier, + qty=1, + rate=rate, + price_list_rate=rate, + posting_date=today(), + ) + + def _expected_row(self, pi, **overrides): + supplier_group = frappe.db.get_value("Supplier", self.supplier, "supplier_group") + row = { + "party_type": "Supplier", + "advance": 0, + "party": self.supplier, + "invoiced": 200.0, + "paid": 0.0, + "credit_note": 0.0, + "outstanding": 200.0, + "range1": 200.0, + "range2": 0.0, + "range3": 0.0, + "range4": 0.0, + "range5": 0.0, + "total_due": 200.0, + "future_amount": 0.0, + "sales_person": [], + "currency": pi.currency, + "supplier_group": supplier_group, + } + row.update(overrides) + return row + + def test_01_payable_summary_output(self): + """Invoiced -> advance -> partial payment progression for a single supplier.""" + filters = self._filters() + pi = self._make_invoice() + + expected = self._expected_row(pi) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + # advance payment: pay 50 but allocate nothing against the invoice + pe = get_payment_entry(pi.doctype, pi.name) + pe.paid_amount = 50 + pe.references[0].allocated_amount = 0 + pe.save().submit() + + expected.update({"advance": 50.0, "outstanding": 150.0, "range1": 150.0, "total_due": 150.0}) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + # partial payment allocated against the invoice + pe = get_payment_entry(pi.doctype, pi.name) + pe.paid_amount = 125 + pe.references[0].allocated_amount = 125 + pe.save().submit() + + expected.update( + {"advance": 50.0, "paid": 125.0, "outstanding": 25.0, "range1": 25.0, "total_due": 25.0} + ) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + @ERPNextTestSuite.change_settings("Buying Settings", {"supp_master_name": "Naming Series"}) + def test_02_gl_balance_and_future_payment_columns(self): + """Naming-series naming adds party_name; show_gl_balance / show_future_payments + add their columns; a fully-paid invoice drops out of the report.""" + filters = self._filters() + pi = self._make_invoice() + + pe = get_payment_entry(pi.doctype, pi.name) + pe.paid_amount = 150 + pe.references[0].allocated_amount = 150 + pe.save().submit() + + expected = self._expected_row( + pi, + party_name=frappe.db.get_value("Supplier", self.supplier, "supplier_name"), + paid=150.0, + outstanding=50.0, + range1=50.0, + total_due=50.0, + ) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + # GL balance reconciliation columns + filters.update({"show_gl_balance": True}) + expected.update({"gl_balance": 50.0, "diff": 0.0}) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + # future payment columns + filters.update({"show_future_payments": True}) + expected.update({"remaining_balance": 50.0}) + rows = execute(filters)[1] + self.assertEqual(len(rows), 1) + self.assertDictEqual(rows[0], expected) + + # clear the remaining balance -> supplier drops out of the summary entirely + get_payment_entry(pi.doctype, pi.name).save().submit() + rows = execute(filters)[1] + self.assertEqual(len(rows), 0) From 7034dc71e7f5fc5643fd4d9860b7042b91978252 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:24:12 +0530 Subject: [PATCH 069/400] test: Dimension-wise Accounts Balance report coverage --- ..._dimension_wise_accounts_balance_report.py | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 erpnext/accounts/report/dimension_wise_accounts_balance_report/test_dimension_wise_accounts_balance_report.py diff --git a/erpnext/accounts/report/dimension_wise_accounts_balance_report/test_dimension_wise_accounts_balance_report.py b/erpnext/accounts/report/dimension_wise_accounts_balance_report/test_dimension_wise_accounts_balance_report.py new file mode 100644 index 00000000000..fb87342da66 --- /dev/null +++ b/erpnext/accounts/report/dimension_wise_accounts_balance_report/test_dimension_wise_accounts_balance_report.py @@ -0,0 +1,82 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import today + +from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.accounts.report.dimension_wise_accounts_balance_report.dimension_wise_accounts_balance_report import ( + execute, +) +from erpnext.accounts.utils import get_fiscal_year +from erpnext.tests.utils import ERPNextTestSuite + + +class TestDimensionWiseAccountsBalance(ERPNextTestSuite): + """Balances accounts one column per value of an accounting dimension (here + Cost Center). Locks the two behaviours that matter: an entry lands in its + own dimension column as debit - credit, and children roll up into parents.""" + + def setUp(self): + frappe.set_user("Administrator") + self.company = "_Test Company" + self.expense_account = "_Test Account Cost for Goods Sold - _TC" + self.cash_account = "Cash - _TC" + + def _make_cost_center(self, name): + full_name = f"{name} - _TC" + if not frappe.db.exists("Cost Center", full_name): + frappe.get_doc( + { + "doctype": "Cost Center", + "cost_center_name": name, + "parent_cost_center": "_Test Company - _TC", + "company": self.company, + "is_group": 0, + } + ).insert() + return full_name + + def _filters(self, **overrides): + filters = frappe._dict( + { + "company": self.company, + "dimension": "Cost Center", + "fiscal_year": get_fiscal_year(today(), company=self.company)[0], + } + ) + filters.update(overrides) + return filters + + def test_dimension_column_and_rollup(self): + # a dedicated cost center isolates our column from any other posted data + cost_center = self._make_cost_center("Test Dimension CC") + make_journal_entry( + self.expense_account, + self.cash_account, + 300, + cost_center=cost_center, + posting_date=today(), + submit=True, + ) + + columns, data = execute(self._filters()) + column = frappe.scrub(cost_center) + self.assertIn(column, [c["fieldname"] for c in columns]) + + rows = {row["account"]: row for row in data} + + # the entry shows as debit - credit under its own dimension column + self.assertEqual(rows[self.expense_account][column], 300.0) + self.assertEqual(rows[self.cash_account][column], -300.0) + + # and rolls up into each account's parent (isolated to our cost center) + expense_parent = frappe.db.get_value("Account", self.expense_account, "parent_account") + cash_parent = frappe.db.get_value("Account", self.cash_account, "parent_account") + self.assertEqual(rows[expense_parent][column], 300.0) + self.assertEqual(rows[cash_parent][column], -300.0) + + def test_requires_fiscal_year(self): + filters = self._filters() + filters.pop("fiscal_year") + self.assertRaises(frappe.ValidationError, execute, filters) From 4feaacc649092a355fb424579d15cfd1be3bbf95 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:26:38 +0530 Subject: [PATCH 070/400] test: Custom Financial Statement report coverage --- .../test_custom_financial_statement.py | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py diff --git a/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py b/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py new file mode 100644 index 00000000000..8fa3e530fcc --- /dev/null +++ b/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py @@ -0,0 +1,92 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt + +from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.accounts.report.custom_financial_statement.custom_financial_statement import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestCustomFinancialStatement(ERPNextTestSuite): + """The report renders a Financial Report Template through FinancialReportEngine. + These tests exercise its own entry point: a template with an account-data row + and a calculated row, and the guard that returns nothing without a template.""" + + def setUp(self): + frappe.set_user("Administrator") + self.company = "_Test Company" + self.expense_account = "_Test Account Cost for Goods Sold - _TC" + self.cash_account = "Cash - _TC" + + def _make_template(self): + # rows filter by exact account name so the value is isolated from other data + template_name = f"Test Custom FS {frappe.generate_hash()[:8]}" + return frappe.get_doc( + { + "doctype": "Financial Report Template", + "template_name": template_name, + "report_type": "Profit and Loss Statement", + "rows": [ + { + "reference_code": "EXP", + "display_name": "Test Expense", + "indentation_level": 0, + "data_source": "Account Data", + "balance_type": "Closing Balance", + "calculation_formula": f'["name", "=", "{self.expense_account}"]', + }, + { + "reference_code": "EXP_X2", + "display_name": "Expense Doubled", + "indentation_level": 0, + "data_source": "Calculated Amount", + "calculation_formula": "EXP * 2", + }, + ], + } + ).insert() + + def _filters(self, template_name): + return frappe._dict( + { + "company": self.company, + "report_template": template_name, + "from_fiscal_year": "2024", + "to_fiscal_year": "2024", + "period_start_date": "2024-01-01", + "period_end_date": "2024-12-31", + "filter_based_on": "Date Range", + "periodicity": "Yearly", + "accumulated_values": 0, + } + ) + + def test_account_and_calculated_rows(self): + make_journal_entry( + self.expense_account, + self.cash_account, + 2000, + posting_date="2024-06-15", + company=self.company, + submit=True, + ) + template = self._make_template() + + columns, data = execute(self._filters(template.template_name))[:2] + self.assertTrue(columns) + + rows = {row.get("account_name"): row for row in data} + self.assertIn("Test Expense", rows) + self.assertIn("Expense Doubled", rows) + + period_key = rows["Test Expense"].get("_segment_info", {}).get("period_keys", [])[0] + + # the account-data row picks up the posted expense; the calculated row doubles it + self.assertEqual(flt(rows["Test Expense"][period_key]), 2000.0) + self.assertEqual(flt(rows["Expense Doubled"][period_key]), 4000.0) + + def test_no_template_returns_nothing(self): + """Without a report_template the report short-circuits and returns None.""" + self.assertIsNone(execute(frappe._dict({"company": self.company}))) From 0ba43a17c158a17c2e0049d77a1c2fa1cd89ac44 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:29:48 +0530 Subject: [PATCH 071/400] test: strengthen price_per_unit assertion, drop no-op quotation guard --- .../test_supplier_quotation_comparison.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py b/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py index 7eaed09cd14..d32a7cabfcc 100644 --- a/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py +++ b/erpnext/buying/report/supplier_quotation_comparison/test_supplier_quotation_comparison.py @@ -14,7 +14,10 @@ class TestSupplierQuotationComparison(ERPNextTestSuite): """The report lists Supplier Quotation item lines so quotes for the same item can be compared across suppliers.""" - def make_quotation(self, supplier, qty, rate): + def make_quotation(self, supplier, qty, rate, uom=None): + item = {"item_code": ITEM, "qty": qty, "rate": rate, "warehouse": "_Test Warehouse - _TC"} + if uom: + item["uom"] = uom sq = frappe.get_doc( { "doctype": "Supplier Quotation", @@ -22,9 +25,7 @@ class TestSupplierQuotationComparison(ERPNextTestSuite): "company": COMPANY, "currency": "INR", "transaction_date": "2026-06-01", - "items": [ - {"item_code": ITEM, "qty": qty, "rate": rate, "warehouse": "_Test Warehouse - _TC"} - ], + "items": [item], } ) sq.insert() @@ -40,7 +41,9 @@ class TestSupplierQuotationComparison(ERPNextTestSuite): self.assertEqual(execute(None)[1], []) def test_quotation_line_listed_with_price(self): - sq = self.make_quotation("_Test Supplier", qty=10, rate=100) + # _Test UOM 1 converts at 10 stock units per qty, so price_per_unit + # (amount / stock_qty) diverges from base_rate and the division path is tested + sq = self.make_quotation("_Test Supplier", qty=10, rate=100, uom="_Test UOM 1") rows = [r for r in self.run_report(item_code=ITEM) if r.get("quotation") == sq.name] self.assertTrue(rows, "Supplier Quotation line missing from report") @@ -49,13 +52,14 @@ class TestSupplierQuotationComparison(ERPNextTestSuite): self.assertEqual(row["qty"], 10) self.assertEqual(row["base_rate"], 100) self.assertEqual(row["base_amount"], 1000) - self.assertEqual(row["price_per_unit"], 100) + # 1000 amount / (10 qty * 10 conversion) = 10, distinct from the 100 base_rate + self.assertEqual(row["price_per_unit"], 10) def test_compares_multiple_suppliers_for_item(self): sq1 = self.make_quotation("_Test Supplier", qty=10, rate=100) sq2 = self.make_quotation("_Test Supplier 1", qty=10, rate=120) - quotes = {r["quotation"]: r for r in self.run_report(item_code=ITEM) if r.get("quotation")} + quotes = {r["quotation"]: r for r in self.run_report(item_code=ITEM)} self.assertIn(sq1.name, quotes) self.assertIn(sq2.name, quotes) self.assertEqual(quotes[sq1.name]["base_rate"], 100) From f0434cadd4f5899aee68ae8ccbc854b7d11d5e76 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:30:34 +0530 Subject: [PATCH 072/400] test: guard against missing owner row before subscripting --- .../report/lead_owner_efficiency/test_lead_owner_efficiency.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py b/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py index f1063c2e8e7..745fc85aec6 100644 --- a/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py +++ b/erpnext/crm/report/lead_owner_efficiency/test_lead_owner_efficiency.py @@ -64,6 +64,7 @@ class TestLeadOwnerEfficiency(ERPNextTestSuite): ).insert() row = self.owner_row(self.run_report()) + self.assertIsNotNone(row, "Lead owner missing from report") self.assertEqual(row["lead_count"], 1) self.assertEqual(row["opp_count"], 1) # one opportunity from one lead -> 100% opp/lead conversion From 21a9f2754ed1f180902ceb692b2ebd7d20bf0839 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:31:13 +0530 Subject: [PATCH 073/400] test: unpack report_summary tuple and key labels via _() --- .../report/project_summary/test_project_summary.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/erpnext/projects/report/project_summary/test_project_summary.py b/erpnext/projects/report/project_summary/test_project_summary.py index 9f0ef5c7a4a..66dff87e1e6 100644 --- a/erpnext/projects/report/project_summary/test_project_summary.py +++ b/erpnext/projects/report/project_summary/test_project_summary.py @@ -2,6 +2,7 @@ # See license.txt import frappe +from frappe import _ from erpnext.projects.report.project_summary.project_summary import execute from erpnext.tests.utils import ERPNextTestSuite @@ -57,8 +58,8 @@ class TestProjectSummary(ERPNextTestSuite): self.make_task(project, "Completed") self.make_task(project, "Open") - report_summary = self.run_report(project)[4] + _columns, _data, _message, _chart, report_summary = self.run_report(project) summary = {s["label"]: s["value"] for s in report_summary} - self.assertEqual(summary["Total Tasks"], 2) - self.assertEqual(summary["Completed Tasks"], 1) - self.assertEqual(summary["Overdue Tasks"], 0) + self.assertEqual(summary[_("Total Tasks")], 2) + self.assertEqual(summary[_("Completed Tasks")], 1) + self.assertEqual(summary[_("Overdue Tasks")], 0) From 9c53a91b82a3ac213271e730b188b633a661f63c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 23:32:02 +0530 Subject: [PATCH 074/400] test: add simulate=True to draft timesheet for overlap safety --- .../test_timesheet_billing_summary.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py b/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py index 5526d5db01c..c4ae6ecd9b3 100644 --- a/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py +++ b/erpnext/projects/report/timesheet_billing_summary/test_timesheet_billing_summary.py @@ -54,7 +54,9 @@ class TestTimesheetBillingSummary(ERPNextTestSuite): self.assertEqual(group_rows[0]["hours"], 2) def test_draft_excluded_unless_requested(self): - ts = make_timesheet(self.employee, is_billable=1, project=self.project.name, do_not_submit=True) + ts = make_timesheet( + self.employee, simulate=True, is_billable=1, project=self.project.name, do_not_submit=True + ) # submitted-only by default: the draft timesheet is absent self.assertNotIn(ts.name, {r.get("timesheet") for r in self.run_report()}) From 42c6768b4c6a9e0ca0a695264570fd30c49697d0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 00:16:06 +0530 Subject: [PATCH 075/400] test: guard period_keys index access for clearer failure --- .../test_custom_financial_statement.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py b/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py index 8fa3e530fcc..5d981b77c38 100644 --- a/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py +++ b/erpnext/accounts/report/custom_financial_statement/test_custom_financial_statement.py @@ -81,7 +81,9 @@ class TestCustomFinancialStatement(ERPNextTestSuite): self.assertIn("Test Expense", rows) self.assertIn("Expense Doubled", rows) - period_key = rows["Test Expense"].get("_segment_info", {}).get("period_keys", [])[0] + period_keys = rows["Test Expense"].get("_segment_info", {}).get("period_keys", []) + self.assertTrue(period_keys, "expected at least one period key in _segment_info") + period_key = period_keys[0] # the account-data row picks up the posted expense; the calculated row doubles it self.assertEqual(flt(rows["Test Expense"][period_key]), 2000.0) From e60a4679721caf69d0da69b195267c93d6778736 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Fri, 3 Jul 2026 02:16:59 +0530 Subject: [PATCH 076/400] fix: render letter head footer in print formats --- .../pos_invoice_standard/pos_invoice_standard.json | 4 ++-- .../pos_invoice_with_item_image.json | 4 ++-- .../purchase_invoice_standard/purchase_invoice_standard.json | 4 ++-- .../purchase_invoice_with_item_image.json | 4 ++-- .../sales_invoice_standard/sales_invoice_standard.json | 4 ++-- .../sales_invoice_with_item_image.json | 4 ++-- .../purchase_order_standard/purchase_order_standard.json | 4 ++-- .../purchase_order_with_item_image.json | 4 ++-- .../request_for_quotation_with_item_image.json | 4 ++-- .../print_format/quotation_standard/quotation_standard.json | 4 ++-- .../quotation_with_item_image/quotation_with_item_image.json | 4 ++-- .../sales_order_standard/sales_order_standard.json | 4 ++-- .../sales_order_with_item_image.json | 4 ++-- .../delivery_note_standard/delivery_note_standard.json | 4 ++-- .../delivery_note_with_item_image.json | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json b/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json index 0386801ffc3..fc5df2b44fc 100644 --- a/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json +++ b/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 16:58:32.571054", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice Standard", diff --git a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json index ae878a47c77..be48c3a9f8f 100644 --- a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Number:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Payment Due Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 17:22:25.000765", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice with Item Image", diff --git a/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json index 4e4d3d0575f..ed7feebfe8b 100644 --- a/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json +++ b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 00:46:57.038144", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Standard", diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json index ddcd4b48d5a..f66e3b2989f 100644 --- a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Invoice:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Due By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 12:58:12.227646", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice with Item Image", diff --git a/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json index f66861078d3..403d8c3cad9 100644 --- a/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json +++ b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-10-12 17:18:38.613066", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice Standard", diff --git a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json index 1d3b4dac309..01d9d6a4a16 100644 --- a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Number:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Payment Due Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-10-10 18:20:55.546151", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice with Item Image", diff --git a/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json b/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json index c5ee7381d5f..22a678c31a2 100644 --- a/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json +++ b/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 16:55:52.799647", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Standard", diff --git a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json index b70401ea0a2..02d7eb8cf1c 100644 --- a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json +++ b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 14:15:59.698407", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order with Item Image", diff --git a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json index 26f131aec5b..460fda987f6 100644 --- a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json +++ b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Shipping Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.vendor }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
\n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Shipping Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.vendor }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
\n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-23 14:29:41.591636", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation with Item Image", diff --git a/erpnext/selling/print_format/quotation_standard/quotation_standard.json b/erpnext/selling/print_format/quotation_standard/quotation_standard.json index e719f52b150..8e7bd303cc5 100644 --- a/erpnext/selling/print_format/quotation_standard/quotation_standard.json +++ b/erpnext/selling/print_format/quotation_standard/quotation_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t\t
\n\t
\n
\n{% endfor %}\n", + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-23 16:14:39.728914", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Selling", "name": "Quotation Standard", diff --git a/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json b/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json index 2d195632178..256ec5cefaf 100644 --- a/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json +++ b/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Quotation:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Valid Till:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.valid_till) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-03-18 11:57:39.954918", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Selling", "name": "Quotation with Item Image", diff --git a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json index 0df19107c1b..5242383b5db 100644 --- a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json +++ b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 13:04:24.036955", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Standard", diff --git a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json index 25cd22bcf66..c4f73603055 100644 --- a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json +++ b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Sales Order:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.delivery_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-02-23 13:00:02.496058", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order with Item Image", diff --git a/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json b/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json index 691c0403f72..39345cdaca7 100644 --- a/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json +++ b/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n
\n{% endfor %}\n", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 16:53:24.456411", + "modified": "2026-07-03 02:13:38.336447", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Standard", diff --git a/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json b/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json index d59b9bcba9d..85bad75c570 100644 --- a/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json +++ b/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Customer Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Note:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Status:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.status }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2025-11-30 17:17:23.062996", + "modified": "2026-07-03 02:08:39.075598", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note with Item Image", From 2d0c0a8c09591e92d9eb8e79fc6d007fbf396559 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Fri, 3 Jul 2026 02:26:52 +0530 Subject: [PATCH 077/400] fix: add page numbers to print format footer --- .../pos_invoice_standard/pos_invoice_standard.json | 4 ++-- .../pos_invoice_with_item_image.json | 4 ++-- .../purchase_invoice_standard/purchase_invoice_standard.json | 4 ++-- .../purchase_invoice_with_item_image.json | 4 ++-- .../sales_invoice_standard/sales_invoice_standard.json | 4 ++-- .../sales_invoice_with_item_image.json | 4 ++-- .../purchase_order_standard/purchase_order_standard.json | 4 ++-- .../purchase_order_with_item_image.json | 4 ++-- .../request_for_quotation_with_item_image.json | 4 ++-- .../print_format/quotation_standard/quotation_standard.json | 4 ++-- .../quotation_with_item_image/quotation_with_item_image.json | 4 ++-- .../sales_order_standard/sales_order_standard.json | 4 ++-- .../sales_order_with_item_image.json | 4 ++-- .../delivery_note_standard/delivery_note_standard.json | 4 ++-- .../delivery_note_with_item_image.json | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json b/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json index fc5df2b44fc..df8ef243ef3 100644 --- a/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json +++ b/erpnext/accounts/print_format/pos_invoice_standard/pos_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice Standard", diff --git a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json index be48c3a9f8f..a9d81808a78 100644 --- a/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/pos_invoice_with_item_image/pos_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Number:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Payment Due Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice with Item Image", diff --git a/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json index ed7feebfe8b..058c5747ad3 100644 --- a/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json +++ b/erpnext/accounts/print_format/purchase_invoice_standard/purchase_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Standard", diff --git a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json index f66e3b2989f..f3677f07639 100644 --- a/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/purchase_invoice_with_item_image/purchase_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Supplier Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.supplier_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.supplier_address %}\n \t\t\t\t\t\t{% set supplier_address = frappe.db.get_value(\"Address\", doc.supplier_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.supplier_name }}
\n \t\t\t\t\t\t{{ supplier_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if supplier_address.address_line2 %}{{ supplier_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ supplier_address.city or \"\" }} {{ supplier_address.state or \"\" }} {{ supplier_address.pincode or \"\" }} {{ supplier_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Purchase Invoice:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Due By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice with Item Image", diff --git a/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json index 403d8c3cad9..83a26fc8ab5 100644 --- a/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json +++ b/erpnext/accounts/print_format/sales_invoice_standard/sales_invoice_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice Standard", diff --git a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json index 01d9d6a4a16..5f19124c267 100644 --- a/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json +++ b/erpnext/accounts/print_format/sales_invoice_with_item_image/sales_invoice_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Number:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Invoice Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Payment Due Date:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.due_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice with Item Image", diff --git a/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json b/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json index 22a678c31a2..20e847440b4 100644 --- a/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json +++ b/erpnext/buying/print_format/purchase_order_standard/purchase_order_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Standard", diff --git a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json index 02d7eb8cf1c..c8f9f43bb0b 100644 --- a/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json +++ b/erpnext/buying/print_format/purchase_order_with_item_image/purchase_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

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

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order with Item Image", diff --git a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json index 460fda987f6..8ec8d02c73c 100644 --- a/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json +++ b/erpnext/buying/print_format/request_for_quotation_with_item_image/request_for_quotation_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Shipping Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.vendor }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
\n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Supplier Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Shipping Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.vendor }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.shipping_address %}\n \t\t\t\t\t\t{% set shipping_address = frappe.db.get_value(\"Address\", doc.shipping_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n {{ doc.shipping_address }}
\n \t\t\t\t\t\t{{ shipping_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if shipping_address.address_line2 %}{{ shipping_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ shipping_address.city or \"\" }} {{ shipping_address.state or \"\" }} {{ shipping_address.pincode or \"\" }} {{ shipping_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Order Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Required By:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.schedule_date) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation with Item Image", diff --git a/erpnext/selling/print_format/quotation_standard/quotation_standard.json b/erpnext/selling/print_format/quotation_standard/quotation_standard.json index 8e7bd303cc5..9b23e3cce2b 100644 --- a/erpnext/selling/print_format/quotation_standard/quotation_standard.json +++ b/erpnext/selling/print_format/quotation_standard/quotation_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t\t
\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Selling", "name": "Quotation Standard", diff --git a/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json b/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json index 256ec5cefaf..ba1474a8173 100644 --- a/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json +++ b/erpnext/selling/print_format/quotation_with_item_image/quotation_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
Customer Name:
\n\t\t\t\t\t\t
Bill to:
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Quotation:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Posting Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.transaction_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Valid Till:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.valid_till) }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Selling", "name": "Quotation with Item Image", diff --git a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json index 5242383b5db..7298cef9505 100644 --- a/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json +++ b/erpnext/selling/print_format/sales_order_standard/sales_order_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "\n\n{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Standard", diff --git a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json index c4f73603055..47c89caccc0 100644 --- a/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json +++ b/erpnext/selling/print_format/sales_order_with_item_image/sales_order_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

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

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order with Item Image", diff --git a/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json b/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json index 39345cdaca7..9aeea1d16d9 100644 --- a/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json +++ b/erpnext/stock/print_format/delivery_note_standard/delivery_note_standard.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", + "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\t{% if letter_head and not no_letterhead %}\n\t\t
{{ letter_head }}
\n\t{% endif %}\n\t{% if print_heading_template %}\n\t\t{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n\t{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

\n\t\t\t\t
{{ doc.in_words }}
\n\t\t\t
\n\t\t\t\t \n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t{%- endfor -%}\n\t\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
{{ _(\"Sub Total:\") }}
{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):
{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t\t
{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t\t
{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ _(\"Grand Total:\") }}{{ doc.get_formatted(\"grand_total\", doc) }}
\n\t\t\t
\n\n\t\t\n\t\t
\n\t\t\t{% if doc.terms %}\n\t\t\t
\n\t\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t\t{{ doc.terms}}\n\t\t\t
\n\t\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:13:38.336447", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Standard", diff --git a/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json b/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json index 85bad75c570..b3dc2dbb580 100644 --- a/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json +++ b/erpnext/stock/print_format/delivery_note_with_item_image/delivery_note_with_item_image.json @@ -9,14 +9,14 @@ "docstatus": 0, "doctype": "Print Format", "font_size": 14, - "html": "{%- macro add_header(page_num, max_pages, doc, letter_head, no_letterhead, footer, print_settings=None, print_heading_template=None) -%}\n\n{% if letter_head and not no_letterhead %}\n
{{ letter_head }}
\n{% endif %}\n{% if print_heading_template %}\n{{ frappe.render_template(print_heading_template, {\"doc\":doc}) }}\n{% endif %}\n{%- endmacro -%}\n\n{% for page in layout %}\n
\n\t
\n\t\t{{ add_header(loop.index, layout|len, doc, letter_head, no_letterhead, footer, print_settings) }}\n\t
\n\t{%- if doc.meta.is_submittable and doc.docstatus==2-%}\n\t\t
\n\t\t\t

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

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

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

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

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

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

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

\n\t\t
\n\t{%- endif -%}\n\n\t\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\n\t\t\t\t\n\t\t\t\n\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Customer Name:\") }}
\n\t\t\t\t\t\t
{{ _(\"Address:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.customer_name }}
\n\t\t\t\t\t\t
\n \t\t\t\t\t{% if doc.customer_address %}\n \t\t\t\t\t\t{% set customer_address = frappe.db.get_value(\"Address\", doc.customer_address, [\"address_line1\", \"address_line2\", \"city\", \"state\", \"pincode\", \"country\"], as_dict=True) %}\n \t\t\t\t\t\t{{ customer_address.address_line1 or \"\" }}
\n \t\t\t\t\t\t{% if customer_address.address_line2 %}{{ customer_address.address_line2 }}
{% endif %}\n \t\t\t\t\t\t{{ customer_address.city or \"\" }} {{ customer_address.state or \"\" }} {{ customer_address.pincode or \"\" }} {{ customer_address.country or \"\" }}
\n \t\t\t\t\t{% endif %}\n\t\t\t\t\t\t
\n\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Note:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.name }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Delivery Date:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ frappe.utils.format_date(doc.posting_date) }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ _(\"Status:\") }}
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
{{ doc.status }}
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\n\t\t{% set item_naming_by = frappe.db.get_single_value(\"Stock Settings\", \"item_naming_by\") %}\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t{% for item in doc.items %}\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{% if item_naming_by != \"Item Code\" %}\n\t\t\t\t\t\t\n\t\t\t\t\t{% endif %}\n\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t{% endfor %}\n\t\t\t\n\t\t
{{ _(\"No\") }}{{ _(\"Item\") }}{{ _(\"Item Code\") }}{{ _(\"Quantity\") }}{{ _(\"Rate\") }}{{ _(\"Amount\") }}
{{ loop.index }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% if item.image %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t{{ item.item_name }}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
\n\t\t\t\t\t
{{ item.item_code }}{{ item.get_formatted(\"qty\", 0) }} {{ item.uom }}{{ item.get_formatted(\"net_rate\", doc) }}{{ item.get_formatted(\"net_amount\", doc) }}
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\n\t\t\t\t{%- if doc.apply_discount_on == \"Net Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t\t{%- for tax in doc.taxes -%}\n\t\t\t\t\t{%- if (tax.tax_amount or print_settings.print_taxes_with_zero_amount) and (not tax.included_in_print_rate or doc.flags.show_inclusive_tax_in_print) -%}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t{%- endif -%}\n\t\t\t\t{%- endfor -%}\n\t\t\t\t{%- if doc.apply_discount_on == \"Grand Total\" -%}\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t{%- endif -%}\n\t\t\t
{{ _(\"Sub Total:\") }}{{ doc.get_formatted(\"total\", doc) }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
{{ tax.get_formatted(\"description\") }} ({{ tax.get_formatted(\"rate\") }}%):{{ tax.get_formatted(\"tax_amount\") }}
\n\t\t\t\t\t\t\t{{ _(\"Discount\") }} ({{ doc.additional_discount_percentage }}%):\n\t\t\t\t\t\t{{ doc.get_formatted(\"discount_amount\", doc) }}
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t {{ _(\"In Words: \") }}{{ doc.in_words }}\n\t\t\t\t\t\t
\n\t\t\t\t\t
{{ _(\"Grand Total:\") }}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{ doc.get_formatted(\"grand_total\", doc) }}\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t
\n\n\n\t\t\n\t\t{% if doc.terms %}\n\t\t
\n\t\t\t
{{ _(\"Terms and Conditions\") }}
\n\t\t\t{{ doc.terms}}\n\t\t
\n\t\t{% endif %}\n\t
\n\t
\n\t\t{% if not no_letterhead and footer %}\n\t\t
\n\t\t\t{{ footer }}\n\t\t
\n\t\t{% endif %}\n\t\t{% if print_settings.repeat_header_footer %}\n\t\t

\n\t\t\t{{ _(\"Page {0} of {1}\").format('', '') }}\n\t\t

\n\t\t{% endif %}\n\t
\n
\n{% endfor %}", "idx": 0, "line_breaks": 0, "margin_bottom": 15.0, "margin_left": 15.0, "margin_right": 15.0, "margin_top": 15.0, - "modified": "2026-07-03 02:08:39.075598", + "modified": "2026-07-03 02:26:31.243291", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note with Item Image", From 41000ea109f534c93a1d1f3d9b8af9457532adc3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:14:54 +0530 Subject: [PATCH 078/400] test: add coverage for Bank Guarantee --- .../bank_guarantee/test_bank_guarantee.py | 74 ++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py index c5ad4d20940..b3f17748f79 100644 --- a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py +++ b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py @@ -1,8 +1,78 @@ -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import unittest + +import frappe +from frappe.utils import flt + +from erpnext.accounts.doctype.bank_guarantee.bank_guarantee import get_voucher_details +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.tests.utils import ERPNextTestSuite +BANK = "_Test BG Bank" + class TestBankGuarantee(ERPNextTestSuite): - pass + """Bank Guarantee records a guarantee issued/received against a customer or + supplier. validate() needs a party; on_submit() needs the bank details filled in.""" + + def setUp(self): + frappe.set_user("Administrator") + if not frappe.db.exists("Bank", BANK): + frappe.get_doc({"doctype": "Bank", "bank_name": BANK}).insert() + + def make_bg(self, **args): + args = frappe._dict(args) + doc = frappe.new_doc("Bank Guarantee") + doc.bg_type = args.bg_type or "Receiving" + doc.amount = args.amount if args.amount is not None else 1000 + doc.start_date = args.start_date or "2026-06-01" + if args.end_date: + doc.end_date = args.end_date + doc.customer = args.get("customer", "_Test Customer") + doc.supplier = args.get("supplier") + # fields on_submit requires — present by default, cleared per-test to assert the guard + doc.bank_guarantee_number = args.get("bank_guarantee_number", "BG-001") + doc.name_of_beneficiary = args.get("name_of_beneficiary", "Test Beneficiary") + doc.bank = args.get("bank", BANK) + return doc + + def test_validate_requires_customer_or_supplier(self): + doc = self.make_bg(customer=None) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_submit_requires_guarantee_number(self): + doc = self.make_bg(bank_guarantee_number="") + doc.insert() + self.assertRaises(frappe.ValidationError, doc.submit) + + def test_submit_requires_beneficiary_name(self): + doc = self.make_bg(name_of_beneficiary="") + doc.insert() + self.assertRaises(frappe.ValidationError, doc.submit) + + def test_submit_requires_bank(self): + doc = self.make_bg(bank="") + doc.insert() + self.assertRaises(frappe.ValidationError, doc.submit) + + def test_valid_guarantee_submits(self): + doc = self.make_bg() + doc.insert() + doc.submit() + self.assertEqual(doc.docstatus, 1) + + def test_get_voucher_details_for_receiving(self): + so = make_sales_order() + details = get_voucher_details("Receiving", so.name) + self.assertEqual(details.customer, so.customer) + self.assertEqual(flt(details.grand_total), flt(so.grand_total)) + + @unittest.expectedFailure + def test_end_date_before_start_date_is_rejected(self): + # SUSPECTED BUG: validate() never checks that end_date >= start_date, so a + # guarantee that expires before it starts submits cleanly. This asserts the + # behaviour we'd expect; remove the xfail once validate() enforces it. + doc = self.make_bg(start_date="2026-06-30", end_date="2026-06-01") + self.assertRaises(frappe.ValidationError, doc.insert) From ccd2aae481285e666eaa811d4c07ed73492115d2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:18:11 +0530 Subject: [PATCH 079/400] test: add coverage for Monthly Distribution --- .../test_monthly_distribution.py | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py index 29d148b4e92..6bd09e342ae 100644 --- a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py +++ b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py @@ -1,8 +1,67 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import frappe +from frappe.utils import getdate + +from erpnext.accounts.doctype.monthly_distribution.monthly_distribution import ( + get_percentage, + get_periodwise_distribution_data, +) from erpnext.tests.utils import ERPNextTestSuite class TestMonthlyDistribution(ERPNextTestSuite): - pass + """Monthly Distribution spreads an amount across months. validate() enforces a + 100% total; get_percentage() sums the months that fall inside a period window.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_distribution(self, allocations): + doc = frappe.new_doc("Monthly Distribution") + doc.distribution_id = f"_Test MD {frappe.generate_hash(length=6)}" + for month, pct in allocations: + doc.append("percentages", {"month": month, "percentage_allocation": pct}) + return doc + + def test_get_months_populates_twelve_even_rows(self): + doc = frappe.new_doc("Monthly Distribution") + doc.distribution_id = "_Test MD Even" + doc.get_months() + + self.assertEqual(len(doc.percentages), 12) + self.assertEqual(doc.percentages[0].month, "January") + self.assertEqual(doc.percentages[-1].month, "December") + self.assertEqual([d.idx for d in doc.percentages], list(range(1, 13))) + for d in doc.percentages: + self.assertAlmostEqual(d.percentage_allocation, 100.0 / 12, places=4) + # the auto-populated rows round to exactly 100 and pass validation + doc.validate() + + def test_validate_rejects_total_other_than_100(self): + doc = self.make_distribution([("January", 50), ("February", 30)]) # sums to 80 + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_get_percentage_sums_period_window(self): + doc = self.make_distribution([("January", 50), ("February", 30), ("March", 20)]) + doc.insert() # total is 100, so validate passes + + # a quarter starting in January covers Jan+Feb+Mar + self.assertEqual(get_percentage(doc, getdate("2026-01-01"), 3), 100) + # a single month picks up only that month + self.assertEqual(get_percentage(doc, getdate("2026-02-01"), 1), 30) + # months with no row simply contribute 0 (there is no guard that all 12 exist) + self.assertEqual(get_percentage(doc, getdate("2026-04-01"), 1), 0) + + def test_periodwise_distribution_maps_each_period(self): + doc = self.make_distribution([("January", 50), ("February", 30), ("March", 20)]) + doc.insert() + + period_list = [ + frappe._dict(key="q1", from_date=getdate("2026-01-01")), + frappe._dict(key="q2", from_date=getdate("2026-04-01")), + ] + data = get_periodwise_distribution_data(doc.name, period_list, "Quarterly") + self.assertEqual(data["q1"], 100) # Jan+Feb+Mar + self.assertEqual(data["q2"], 0) # Apr+May+Jun carry no allocation From 3e9843059e6afe7111072551f9bc05e7b9eb535e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:19:56 +0530 Subject: [PATCH 080/400] test: add coverage for Item Tax Template --- .../test_item_tax_template.py | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py index f180c324a6d..a655d52422d 100644 --- a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py +++ b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py @@ -1,8 +1,65 @@ -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import unittest + +import frappe + from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" +TAX_ACCOUNT = "_Test Account VAT - _TC" +RECEIVABLE_ACCOUNT = "Debtors - _TC" + class TestItemTaxTemplate(ERPNextTestSuite): - pass + """Item Tax Template validates its tax rows: each account must belong to the + company, be a tax-like account type, and appear only once.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_template(self, rows, title="_Test ITT"): + doc = frappe.new_doc("Item Tax Template") + doc.title = f"{title} {frappe.generate_hash(length=6)}" + doc.company = COMPANY + for account, rate, not_applicable in rows: + doc.append( + "taxes", + {"tax_type": account, "tax_rate": rate, "not_applicable": not_applicable}, + ) + return doc + + def test_valid_template_saves_and_is_named_with_abbr(self): + doc = self.make_template([(TAX_ACCOUNT, 9, 0)]) + doc.insert() + self.assertTrue(doc.name.endswith(" - _TC")) + self.assertTrue(doc.name.startswith(doc.title)) + + def test_duplicate_tax_type_throws(self): + doc = self.make_template([(TAX_ACCOUNT, 9, 0), (TAX_ACCOUNT, 5, 0)]) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_account_of_wrong_company_throws(self): + other_account = frappe.get_all( + "Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name" + )[0] + doc = self.make_template([(other_account, 9, 0)]) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_disallowed_account_type_throws(self): + # a Receivable account is not Tax/Chargeable/Income/Expense + doc = self.make_template([(RECEIVABLE_ACCOUNT, 9, 0)]) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_not_applicable_row_has_rate_zeroed(self): + doc = self.make_template([(TAX_ACCOUNT, 18, 1)]) + doc.insert() + self.assertEqual(doc.taxes[0].tax_rate, 0) + + @unittest.expectedFailure + def test_negative_tax_rate_is_rejected(self): + # SUSPECTED BUG: validate never bounds tax_rate, so a negative (or >100) rate + # saves silently. Asserts the behaviour we'd want; drop the xfail once bounded. + doc = self.make_template([(TAX_ACCOUNT, -5, 0)]) + self.assertRaises(frappe.ValidationError, doc.insert) From df543827278cf504310f1c1d10052f0f0161198b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:23:08 +0530 Subject: [PATCH 081/400] test: add coverage for Mode of Payment --- .../mode_of_payment/test_mode_of_payment.py | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py index 679bbb53386..c68597649dc 100644 --- a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py +++ b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py @@ -1,13 +1,66 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import unittest + import frappe from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" + class TestModeofPayment(ERPNextTestSuite): - pass + """Mode of Payment validates its per-company default accounts (account company + must match the row, no company twice) and blocks disabling while a POS Profile + still references it.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_mop(self, accounts=None, enabled=1): + doc = frappe.new_doc("Mode of Payment") + doc.mode_of_payment = f"_Test MoP {frappe.generate_hash(length=6)}" + doc.type = "General" + doc.enabled = enabled + for company, account in accounts or []: + doc.append("accounts", {"company": company, "default_account": account}) + return doc + + def test_valid_mode_of_payment_saves(self): + doc = self.make_mop(accounts=[(COMPANY, "Cash - _TC")]) + doc.insert() + self.assertTrue(doc.name) + + def test_account_of_wrong_company_throws(self): + other_account = frappe.get_all( + "Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name" + )[0] + doc = self.make_mop(accounts=[(COMPANY, other_account)]) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_repeating_company_throws(self): + doc = self.make_mop(accounts=[(COMPANY, "Cash - _TC"), (COMPANY, "Debtors - _TC")]) + self.assertRaises(frappe.ValidationError, doc.insert) + + @unittest.expectedFailure + def test_disabling_mode_referenced_by_pos_profile_throws(self): + # SUSPECTED BUG: validate_pos_mode_of_payment queries "Sales Invoice Payment" + # rows with parenttype "POS Profile", but a POS Profile's payments are stored + # as "POS Payment Method" rows. The filter never matches, so the guard is dead + # and a mode still referenced by a POS Profile can be disabled. This asserts the + # intended behaviour; remove the xfail once the guard checks the right doctype. + from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile + + make_pos_profile() # its payments row references the "Cash" mode of payment + cash = frappe.get_doc("Mode of Payment", "Cash") + cash.enabled = 0 + self.assertRaises(frappe.ValidationError, cash.save) + + def test_disabling_unreferenced_mode_succeeds(self): + doc = self.make_mop(accounts=[(COMPANY, "Cash - _TC")], enabled=0) + doc.insert() + self.assertEqual(doc.enabled, 0) def set_default_account_for_mode_of_payment(mode_of_payment, company, account): From 22dc51a57a4b9fa6a9d1d7709278fca903940455 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:25:32 +0530 Subject: [PATCH 082/400] test: add coverage for Party Link --- .../doctype/party_link/test_party_link.py | 62 ++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/party_link/test_party_link.py b/erpnext/accounts/doctype/party_link/test_party_link.py index 4f488b19456..38fa64b006a 100644 --- a/erpnext/accounts/doctype/party_link/test_party_link.py +++ b/erpnext/accounts/doctype/party_link/test_party_link.py @@ -1,9 +1,65 @@ -# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe +import unittest + +import frappe + +from erpnext.accounts.doctype.party_link.party_link import create_party_link from erpnext.tests.utils import ERPNextTestSuite +CUSTOMER = "_Test Customer" +SUPPLIER = "_Test Supplier" +SUPPLIER_2 = "_Test Supplier 1" + class TestPartyLink(ERPNextTestSuite): - pass + """Party Link ties a Customer and a Supplier together as one underlying party. + validate() constrains the primary role and blocks duplicate links.""" + + def setUp(self): + frappe.set_user("Administrator") + + def test_create_party_link_with_customer_primary(self): + link = create_party_link("Customer", CUSTOMER, SUPPLIER) + self.assertEqual(link.primary_role, "Customer") + self.assertEqual(link.secondary_role, "Supplier") + self.assertEqual(link.primary_party, CUSTOMER) + self.assertEqual(link.secondary_party, SUPPLIER) + self.assertTrue(frappe.db.exists("Party Link", link.name)) + + def test_create_party_link_with_supplier_primary(self): + link = create_party_link("Supplier", SUPPLIER, CUSTOMER) + self.assertEqual(link.secondary_role, "Customer") + + def test_primary_role_must_be_customer_or_supplier(self): + doc = frappe.new_doc("Party Link") + doc.primary_role = "Employee" + doc.primary_party = CUSTOMER + doc.secondary_role = "Supplier" + doc.secondary_party = SUPPLIER + # validate() alone isolates the role rule from the dynamic-link checks + self.assertRaises(frappe.ValidationError, doc.validate) + + def test_duplicate_link_throws(self): + create_party_link("Customer", CUSTOMER, SUPPLIER) + dup = frappe.new_doc("Party Link") + dup.primary_role = "Customer" + dup.primary_party = CUSTOMER + dup.secondary_role = "Supplier" + dup.secondary_party = SUPPLIER + self.assertRaises(frappe.ValidationError, dup.insert) + + @unittest.expectedFailure + def test_party_cannot_be_primary_in_two_links(self): + # SUSPECTED BUG: the uniqueness checks are asymmetric — a party that is already + # a *primary* in another link isn't blocked, so one customer can be linked to + # two different suppliers. Asserts the 1:1 behaviour we'd expect; drop the xfail + # once validate() blocks re-using a party as primary. + create_party_link("Customer", CUSTOMER, SUPPLIER) + link2 = frappe.new_doc("Party Link") + link2.primary_role = "Customer" + link2.primary_party = CUSTOMER + link2.secondary_role = "Supplier" + link2.secondary_party = SUPPLIER_2 + self.assertRaises(frappe.ValidationError, link2.insert) From 83d821d8c470d54e3f52a6c05beacaafdd8779f9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:28:56 +0530 Subject: [PATCH 083/400] test: add coverage for Journal Entry Template --- .../test_journal_entry_template.py | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py index 616327e8493..ea1306140bd 100644 --- a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py @@ -1,9 +1,52 @@ -# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe + +import unittest + +import frappe from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" + class TestJournalEntryTemplate(ERPNextTestSuite): - pass + """Journal Entry Template's only real rule is validate_party: party_type is + allowed only on Receivable/Payable accounts, and a party needs a party_type.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_template(self, rows, company=COMPANY): + doc = frappe.new_doc("Journal Entry Template") + doc.template_title = f"_Test JET {frappe.generate_hash(length=6)}" + doc.company = company + doc.voucher_type = "Journal Entry" + doc.naming_series = frappe.get_meta("Journal Entry").get_field("naming_series").options.split("\n")[0] + for row in rows: + doc.append("accounts", row) + return doc + + def test_party_type_only_on_receivable_or_payable_account(self): + # Cash is neither Receivable nor Payable, so a party_type here is invalid + doc = self.make_template([{"account": "Cash - _TC", "party_type": "Customer"}]) + self.assertRaises(frappe.ValidationError, doc.validate) + + def test_party_requires_party_type(self): + doc = self.make_template([{"account": "Debtors - _TC", "party": "_Test Customer"}]) + self.assertRaises(frappe.ValidationError, doc.validate) + + @unittest.expectedFailure + def test_account_from_other_company_is_rejected(self): + # SUSPECTED BUG: unlike Item Tax Template / Mode of Payment, this template never + # checks that each row's account belongs to self.company, so a row pointing at + # another company's account saves. Asserts the behaviour we'd want. + other_receivable = frappe.get_all( + "Account", + {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, + pluck="name", + )[0] + doc = self.make_template( + [{"account": other_receivable, "party_type": "Customer", "party": "_Test Customer"}] + ) + self.assertRaises(frappe.ValidationError, doc.insert) From 94ab09e4a3c6af85e086c6393518a432f11a86c7 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 3 Jul 2026 11:29:44 +0530 Subject: [PATCH 084/400] fix: FIFO queue checks and incorrect entries filter in stock ledger reports - 'Show Incorrect Entries' always returned an empty result (regression from #43619); now returns entries from one row before the first incorrect one - FIFO queue columns were computed for serialized/batched SLEs that don't maintain a stock queue, showing false differences; left empty for such rows - compare value/valuation differences at currency precision, qty at float precision --- .../stock_ledger_invariant_check.py | 90 ++++++++++--------- .../test_stock_ledger_invariant_check.py | 32 +++++++ .../stock_ledger_variance.py | 32 ++++--- 3 files changed, 103 insertions(+), 51 deletions(-) diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py index 137feb5a34c..b17d3a58dcb 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py @@ -20,6 +20,7 @@ SLE_FIELDS = ( "outgoing_rate", "stock_queue", "batch_no", + "serial_no", "stock_value", "stock_value_difference", "valuation_rate", @@ -52,16 +53,16 @@ def add_invariant_check_fields(sles, filters): balance_qty = 0.0 balance_stock_value = 0.0 - incorrect_idx = 0 - precision = frappe.get_precision("Stock Ledger Entry", "actual_qty") + incorrect_idx = None + float_precision = cint(frappe.db.get_single_value("System Settings", "float_precision")) or 3 + currency_precision = ( + cint(frappe.db.get_single_value("System Settings", "currency_precision")) or float_precision + ) for idx, sle in enumerate(sles): - queue = json.loads(sle.stock_queue) if sle.stock_queue else [] - - fifo_qty = 0.0 - fifo_value = 0.0 - for qty, rate in queue: - fifo_qty += qty - fifo_value += qty * rate + if sle.batch_no: + sle.use_batchwise_valuation = frappe.db.get_value( + "Batch", sle.batch_no, "use_batchwise_valuation", cache=True + ) if sle.actual_qty < 0: sle.consumption_rate = sle.stock_value_difference / sle.actual_qty @@ -77,57 +78,66 @@ def add_invariant_check_fields(sles, filters): if balance_qty is None: balance_qty = sle.qty_after_transaction - sle.fifo_queue_qty = fifo_qty - sle.fifo_stock_value = fifo_value - sle.fifo_valuation_rate = fifo_value / fifo_qty if fifo_qty else None sle.balance_value_by_qty = ( sle.stock_value / sle.qty_after_transaction if sle.qty_after_transaction else None ) sle.expected_qty_after_transaction = balance_qty sle.stock_value_from_diff = balance_stock_value - # set difference fields sle.difference_in_qty = sle.qty_after_transaction - sle.expected_qty_after_transaction - sle.fifo_qty_diff = sle.qty_after_transaction - fifo_qty - sle.fifo_value_diff = sle.stock_value - fifo_value - sle.fifo_valuation_diff = ( - sle.valuation_rate - sle.fifo_valuation_rate if sle.fifo_valuation_rate else None - ) sle.valuation_diff = ( sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None ) sle.diff_value_diff = sle.stock_value_from_diff - sle.stock_value - if not incorrect_idx and filters.get("show_incorrect_entries"): - if is_sle_has_correct_data(sle, precision): - continue - else: - incorrect_idx = idx + if maintains_fifo_queue(sle): + add_fifo_fields(sle, sles[idx - 1] if idx else None) - if idx > 0: - sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value - sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference - - if sle.batch_no: - sle.use_batchwise_valuation = frappe.db.get_value( - "Batch", sle.batch_no, "use_batchwise_valuation", cache=True - ) + if incorrect_idx is None and not is_sle_has_correct_data(sle, float_precision, currency_precision): + incorrect_idx = idx if filters.get("show_incorrect_entries"): - if incorrect_idx > 0: - sles = sles[cint(incorrect_idx) - 1 :] - - return [] + if incorrect_idx is None: + return [] + return sles[max(incorrect_idx - 1, 0) :] return sles -def is_sle_has_correct_data(sle, precision): - if flt(sle.difference_in_qty, precision) != 0.0 or flt(sle.diff_value_diff, precision) != 0: - print(flt(sle.difference_in_qty, precision), flt(sle.diff_value_diff, precision)) - return False +def maintains_fifo_queue(sle): + # no queue is maintained for serialized/batchwise-valued stock + return not ( + sle.serial_and_batch_bundle or sle.serial_no or (sle.batch_no and sle.use_batchwise_valuation) + ) - return True + +def add_fifo_fields(sle, prev_sle): + queue = json.loads(sle.stock_queue) if sle.stock_queue else [] + + fifo_qty = 0.0 + fifo_value = 0.0 + for qty, rate in queue: + fifo_qty += qty + fifo_value += qty * rate + + sle.fifo_queue_qty = fifo_qty + sle.fifo_stock_value = fifo_value + sle.fifo_valuation_rate = fifo_value / fifo_qty if fifo_qty else None + sle.fifo_qty_diff = sle.qty_after_transaction - fifo_qty + sle.fifo_value_diff = sle.stock_value - fifo_value + sle.fifo_valuation_diff = ( + sle.valuation_rate - sle.fifo_valuation_rate if sle.fifo_valuation_rate else None + ) + if prev_sle and prev_sle.fifo_stock_value is not None: + sle.fifo_stock_diff = sle.fifo_stock_value - prev_sle.fifo_stock_value + sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference + + +def is_sle_has_correct_data(sle, float_precision, currency_precision): + return ( + flt(sle.difference_in_qty, float_precision) == 0.0 + and flt(sle.diff_value_diff, currency_precision) == 0.0 + ) def get_columns(): diff --git a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py index caec7e96579..0f71a8834b2 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py @@ -42,3 +42,35 @@ class TestStockLedgerInvariantCheck(ERPNextTestSuite): data = self.run_report(item_code=item) self.assertEqual(data[-1].qty_after_transaction, 11) + + def test_show_incorrect_entries(self): + item = self.make_movements() + + self.assertEqual(self.run_report(item_code=item, show_incorrect_entries=1), []) + + sle = frappe.get_last_doc( + "Stock Ledger Entry", {"item_code": item, "warehouse": WAREHOUSE, "is_cancelled": 0} + ) + frappe.db.set_value( + "Stock Ledger Entry", sle.name, "qty_after_transaction", sle.qty_after_transaction + 5 + ) + + data = self.run_report(item_code=item, show_incorrect_entries=1) + self.assertEqual(len(data), 2) # incorrect entry + one before it for context + self.assertEqual(data[-1].name, sle.name) + + def test_batch_item_skips_fifo_queue_checks(self): + from erpnext.stock.doctype.item.test_item import make_item + + item = make_item( + properties={"has_batch_no": 1, "create_new_batch": 1, "batch_number_series": "SLIC-BAT-.####"} + ).name + make_stock_entry(item_code=item, to_warehouse=WAREHOUSE, qty=10, rate=100) + + data = self.run_report(item_code=item) + self.assertTrue(data) + for row in data: + self.assertIsNone(row.fifo_qty_diff) + self.assertIsNone(row.fifo_value_diff) + + self.assertEqual(self.run_report(item_code=item, show_incorrect_entries=1), []) diff --git a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py index e0d39c5dc7a..c44c74d9aba 100644 --- a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py +++ b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py @@ -205,7 +205,10 @@ def get_data(filters=None): data = [] if item_warehouse_map: - precision = cint(frappe.db.get_single_value("System Settings", "float_precision")) + float_precision = cint(frappe.db.get_single_value("System Settings", "float_precision")) or 3 + currency_precision = ( + cint(frappe.db.get_single_value("System Settings", "currency_precision")) or float_precision + ) for item_warehouse in item_warehouse_map: report_data = stock_ledger_invariant_check(item_warehouse) @@ -215,7 +218,11 @@ def get_data(filters=None): for row in report_data: if has_difference( - row, precision, filters.difference_in, item_warehouse.valuation_method or valuation_method + row, + float_precision, + currency_precision, + filters.difference_in, + item_warehouse.valuation_method or valuation_method, ): row.update( { @@ -261,23 +268,26 @@ def get_item_warehouse_combinations(filters: dict | None = None) -> dict: return query.run(as_dict=1) -def has_difference(row, precision, difference_in, valuation_method): +def has_difference(row, float_precision, currency_precision, difference_in, valuation_method): if valuation_method == "Moving Average": - qty_diff = flt(row.difference_in_qty, precision) - value_diff = flt(row.diff_value_diff, precision) - valuation_diff = flt(row.valuation_diff, precision) + qty_diff = flt(row.difference_in_qty, float_precision) + value_diff = flt(row.diff_value_diff, currency_precision) + valuation_diff = flt(row.valuation_diff, currency_precision) else: - qty_diff = flt(row.difference_in_qty, precision) - value_diff = flt(row.diff_value_diff, precision) + qty_diff = flt(row.difference_in_qty, float_precision) + value_diff = flt(row.diff_value_diff, currency_precision) if row.stock_queue and json.loads(row.stock_queue): value_diff = value_diff or ( - flt(row.fifo_value_diff, precision) or flt(row.fifo_difference_diff, precision) + flt(row.fifo_value_diff, currency_precision) + or flt(row.fifo_difference_diff, currency_precision) ) - qty_diff = qty_diff or flt(row.fifo_qty_diff, precision) + qty_diff = qty_diff or flt(row.fifo_qty_diff, float_precision) - valuation_diff = flt(row.valuation_diff, precision) or flt(row.fifo_valuation_diff, precision) + valuation_diff = flt(row.valuation_diff, currency_precision) or flt( + row.fifo_valuation_diff, currency_precision + ) if difference_in == "Qty" and qty_diff: return True From 3167e8ba77c78dff76281cb67a7f6a132d0a968e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:30:35 +0530 Subject: [PATCH 085/400] test: add coverage for Subscription Plan --- .../test_subscription_plan.py | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py index 76328f9e4c3..062f924a96f 100644 --- a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py +++ b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py @@ -1,8 +1,58 @@ -# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import unittest + +import frappe + +from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_plan_rate from erpnext.tests.utils import ERPNextTestSuite class TestSubscriptionPlan(ERPNextTestSuite): - pass + """Subscription Plan validates its interval and computes a rate. The Monthly + Rate branch multiplies cost by the number of months in the billing window.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_plan(self, **args): + args = frappe._dict(args) + plan = frappe.new_doc("Subscription Plan") + plan.plan_name = f"_Test Plan {frappe.generate_hash(length=6)}" + plan.item = args.item or "_Test Item" + plan.currency = args.currency or "INR" + plan.price_determination = args.price_determination + plan.cost = args.cost or 0 + plan.billing_interval = args.billing_interval or "Month" + plan.billing_interval_count = ( + args.billing_interval_count if args.billing_interval_count is not None else 1 + ) + return plan + + def test_billing_interval_count_must_be_positive(self): + plan = self.make_plan(price_determination="Fixed Rate", cost=100, billing_interval_count=0) + self.assertRaises(frappe.ValidationError, plan.insert) + + def test_fixed_rate_applies_prorate_factor(self): + plan = self.make_plan(price_determination="Fixed Rate", cost=100) + plan.insert() + self.assertEqual(get_plan_rate(plan.name), 100) + self.assertEqual(get_plan_rate(plan.name, prorate_factor=0.5), 50) + + def test_monthly_rate_within_year(self): + plan = self.make_plan(price_determination="Monthly Rate", cost=100) + plan.insert() + # Jan 1 - Mar 31 is 3 whole months; month-aligned so proration is 0 + rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2026-03-31") + self.assertEqual(rate, 300) + + @unittest.expectedFailure + def test_monthly_rate_across_year_boundary(self): + # SUSPECTED BUG: no_of_months uses relativedelta(end, start).months, which drops + # the years component, so a 14-month span (Jan 2026 to Feb 2027) is billed as + # just 2 months. Asserts the correct 14-month total; drop the xfail once fixed. + plan = self.make_plan(price_determination="Monthly Rate", cost=100) + plan.insert() + rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2027-02-28") + self.assertEqual(rate, 1400) From 5c87e2e39811d6140320b5336c9e6d7f6d0ab3f7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:34:27 +0530 Subject: [PATCH 086/400] test: add coverage for Cashier Closing --- .../cashier_closing/test_cashier_closing.py | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py index 7a38d8a9a93..34aa85d65fc 100644 --- a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py +++ b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py @@ -1,8 +1,61 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import frappe + +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.tests.utils import ERPNextTestSuite +DATE = "2026-06-15" + class TestCashierClosing(ERPNextTestSuite): - pass + """Cashier Closing reconciles a shift: it pulls outstanding invoices in a + date/time window and rolls payments, expense, custody and returns into net_amount.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_invoice_in_window(self, rate=100): + si = create_sales_invoice(rate=rate, qty=1, posting_date=DATE, do_not_submit=True) + si.posting_time = "10:30:00" + si.submit() + return si + + def make_closing(self, user="Administrator", payments=None, **args): + doc = frappe.new_doc("Cashier Closing") + doc.user = user + doc.date = args.get("date", DATE) + doc.from_time = args.get("from_time", "09:00:00") + doc.time = args.get("time", "18:00:00") + for amount in payments or []: + doc.append("payments", {"mode_of_payment": "Cash", "amount": amount}) + doc.expense = args.get("expense", 0) + doc.custody = args.get("custody", 0) + doc.returns = args.get("returns", 0) + return doc + + def test_from_time_must_be_before_to_time(self): + doc = self.make_closing(from_time="18:00:00", time="09:00:00") + self.assertRaises(frappe.ValidationError, doc.save) + + def test_net_amount_rolls_up_outstanding_and_adjustments(self): + si = self.make_invoice_in_window(rate=100) + doc = self.make_closing(payments=[500], expense=50, custody=30, returns=20) + doc.save() + + # the in-window invoice is picked up as outstanding + self.assertEqual(doc.outstanding_amount, si.outstanding_amount) + # net = payments + outstanding + expense - custody + returns + self.assertEqual(doc.net_amount, 500 + si.outstanding_amount + 50 - 30 + 20) + + def test_outstanding_is_scoped_to_the_invoice_owner(self): + # The invoice is created by Administrator; a closing for a different user does + # not see it. NOTE: get_outstanding keys on Sales Invoice.owner (the document + # creator) rather than an explicit cashier/POS-user field, which is fragile when + # invoices are created by a shared or system user. + self.make_invoice_in_window(rate=100) + doc = self.make_closing(user="Guest", payments=[500]) + doc.save() + self.assertEqual(doc.outstanding_amount, 0) + self.assertEqual(doc.net_amount, 500) From 745f657a0e2586f6d8eec717e7295dca97c6d79b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:37:02 +0530 Subject: [PATCH 087/400] test: add coverage for Process Subscription --- .../test_process_subscription.py | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py index 8c7604b8f5c..8cfeefeb947 100644 --- a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py +++ b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py @@ -1,11 +1,47 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe +from unittest.mock import patch +import frappe +from erpnext.accounts.doctype.process_subscription.process_subscription import ( + create_subscription_process, +) +from erpnext.accounts.doctype.subscription.test_subscription import create_plan, create_subscription from erpnext.tests.utils import ERPNextTestSuite class TestProcessSubscription(ERPNextTestSuite): - pass + """Process Subscription is a batch driver: on submit it enqueues subscription.process_all + for every non-cancelled Subscription (or just one when a subscription is named).""" + + def setUp(self): + frappe.set_user("Administrator") + create_plan(plan_name="_Test Plan Name", currency="INR") + + def enqueued_subscriptions(self, subscription=None): + """Submit a Process Subscription while capturing what gets enqueued.""" + calls = [] + + def capture(*args, **kwargs): + calls.append(kwargs) + + with patch("frappe.enqueue", side_effect=capture): + create_subscription_process(subscription=subscription, posting_date="2026-06-15") + + # each enqueue is handed a batch (list) of subscription names + return [name for call in calls for name in call.get("subscription", [])] + + def test_named_subscription_is_the_only_one_enqueued(self): + sub = create_subscription(start_date="2026-01-01") + self.assertEqual(self.enqueued_subscriptions(subscription=sub.name), [sub.name]) + + def test_cancelled_subscriptions_are_skipped(self): + active = create_subscription(start_date="2026-01-01") + cancelled = create_subscription(start_date="2026-01-01") + cancelled.cancel_subscription() + + enqueued = self.enqueued_subscriptions() + self.assertIn(active.name, enqueued) + self.assertNotIn(cancelled.name, enqueued) From c51edbd88eb6ce78f7cd9b3c58d41daefdd070f4 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:39:50 +0530 Subject: [PATCH 088/400] test: add coverage for Account Closing Balance --- .../test_account_closing_balance.py | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py index a39bd00579e..ca9bfd5731d 100644 --- a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py +++ b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py @@ -1,10 +1,56 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe - +from erpnext.accounts.doctype.account_closing_balance.account_closing_balance import ( + aggregate_with_last_account_closing_balance, + generate_key, +) from erpnext.tests.utils import ERPNextTestSuite +def entry(**overrides): + row = {"debit": 0, "credit": 0, "debit_in_account_currency": 0, "credit_in_account_currency": 0} + row.update(overrides) + return row + + class TestAccountClosingBalance(ERPNextTestSuite): - pass + """The closing-balance snapshot is built by merging this period's entries with the + previous period's. These lock the merge/key logic that drives that carry-forward.""" + + def test_matching_entries_are_summed(self): + # this is how a prior-period balance carries forward into the current one + merged = aggregate_with_last_account_closing_balance( + [ + entry(account="Cash - _TC", debit=100, debit_in_account_currency=100), + entry( + account="Cash - _TC", + debit=50, + credit=20, + debit_in_account_currency=50, + credit_in_account_currency=20, + ), + ], + [], + ) + self.assertEqual(len(merged), 1) + row = next(iter(merged.values())) + self.assertEqual(row["debit"], 150) + self.assertEqual(row["credit"], 20) + + def test_entries_are_kept_separate_per_dimension(self): + merged = aggregate_with_last_account_closing_balance( + [ + entry(account="Cash - _TC", cost_center="CC1", debit=100, debit_in_account_currency=100), + entry(account="Cash - _TC", cost_center="CC2", debit=40, debit_in_account_currency=40), + ], + [], + ) + self.assertEqual(len(merged), 2) + + def test_period_closing_flag_is_part_of_the_key(self): + # a P&L reversal (flag 0) and a closing-account entry (flag 1) for the same + # account must not merge, so the flag has to distinguish their keys + key_reversal, _ = generate_key(entry(account="Sales - _TC", is_period_closing_voucher_entry=0), []) + key_closing, _ = generate_key(entry(account="Sales - _TC", is_period_closing_voucher_entry=1), []) + self.assertNotEqual(key_reversal, key_closing) From ef5f47fafdc7e81122f0e335be7d2faff8a730a9 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 3 Jul 2026 11:39:51 +0530 Subject: [PATCH 089/400] fix: address review comments - restore mutated SLE after test via addCleanup - explicit return False in has_difference - comment the fifo_stock_diff guard for non-queue predecessors --- .../stock_ledger_invariant_check.py | 1 + .../test_stock_ledger_invariant_check.py | 7 +++++++ .../report/stock_ledger_variance/stock_ledger_variance.py | 2 ++ 3 files changed, 10 insertions(+) diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py index b17d3a58dcb..02bdcf17cd8 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py @@ -128,6 +128,7 @@ def add_fifo_fields(sle, prev_sle): sle.fifo_valuation_diff = ( sle.valuation_rate - sle.fifo_valuation_rate if sle.fifo_valuation_rate else None ) + # prev row may not maintain a queue; H and H - F stay blank across the gap if prev_sle and prev_sle.fifo_stock_value is not None: sle.fifo_stock_diff = sle.fifo_stock_value - prev_sle.fifo_stock_value sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference diff --git a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py index 0f71a8834b2..49504b31207 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py @@ -51,6 +51,13 @@ class TestStockLedgerInvariantCheck(ERPNextTestSuite): sle = frappe.get_last_doc( "Stock Ledger Entry", {"item_code": item, "warehouse": WAREHOUSE, "is_cancelled": 0} ) + self.addCleanup( + frappe.db.set_value, + "Stock Ledger Entry", + sle.name, + "qty_after_transaction", + sle.qty_after_transaction, + ) frappe.db.set_value( "Stock Ledger Entry", sle.name, "qty_after_transaction", sle.qty_after_transaction + 5 ) diff --git a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py index c44c74d9aba..e72ab8cee4a 100644 --- a/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py +++ b/erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py @@ -297,3 +297,5 @@ def has_difference(row, float_precision, currency_precision, difference_in, valu return True elif difference_in not in ["Qty", "Value", "Valuation"] and (qty_diff or value_diff or valuation_diff): return True + + return False From 97794b7ded1ec3a8e2b52190609332312170c15a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:41:21 +0530 Subject: [PATCH 090/400] test: add coverage for Process Payment Reconciliation --- .../test_process_payment_reconciliation.py | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py index eff49ecadc5..659c8ab86c5 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py @@ -1,11 +1,64 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe - +import frappe +from erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation import ( + get_pr_instance, +) from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" + class TestProcessPaymentReconciliation(ERPNextTestSuite): - pass + """Process Payment Reconciliation validates its accounts against the company, + moves to Queued on submit, and hands its filters to a Payment Reconciliation run.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_ppr(self, **args): + args = frappe._dict(args) + doc = frappe.new_doc("Process Payment Reconciliation") + doc.company = COMPANY + doc.party_type = "Customer" + doc.party = "_Test Customer" + doc.receivable_payable_account = args.get("receivable_payable_account", "Debtors - _TC") + doc.bank_cash_account = args.get("bank_cash_account") + doc.from_invoice_date = args.get("from_invoice_date") + doc.to_invoice_date = args.get("to_invoice_date") + return doc + + def test_receivable_account_must_belong_to_company(self): + other = frappe.get_all( + "Account", + {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, + pluck="name", + )[0] + doc = self.make_ppr(receivable_payable_account=other) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_bank_cash_account_must_belong_to_company(self): + other = frappe.get_all("Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name")[0] + doc = self.make_ppr(bank_cash_account=other) + self.assertRaises(frappe.ValidationError, doc.insert) + + def test_submit_sets_status_to_queued(self): + doc = self.make_ppr() + doc.insert() + doc.submit() + self.assertEqual(doc.status, "Queued") + + def test_get_pr_instance_copies_filters_and_caps_limits(self): + doc = self.make_ppr(from_invoice_date="2026-01-01", to_invoice_date="2026-06-30") + doc.insert() + + pr = get_pr_instance(doc.name) + self.assertEqual(pr.company, COMPANY) + self.assertEqual(pr.party, "_Test Customer") + self.assertEqual(pr.receivable_payable_account, "Debtors - _TC") + self.assertEqual(str(pr.from_invoice_date), "2026-01-01") + # the tool run is capped so a single process can't fetch unbounded rows + self.assertEqual(pr.invoice_limit, 1000) + self.assertEqual(pr.payment_limit, 1000) From 9980d47524e38ad58c0699f0969373fd3f6c54fb Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:00:45 +0530 Subject: [PATCH 091/400] test: lock current end-date behaviour and assert persisted state --- .../doctype/bank_guarantee/test_bank_guarantee.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py index b3f17748f79..971db6aeddf 100644 --- a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py +++ b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py @@ -1,8 +1,6 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from frappe.utils import flt @@ -61,7 +59,7 @@ class TestBankGuarantee(ERPNextTestSuite): doc = self.make_bg() doc.insert() doc.submit() - self.assertEqual(doc.docstatus, 1) + self.assertEqual(frappe.db.get_value("Bank Guarantee", doc.name, "docstatus"), 1) def test_get_voucher_details_for_receiving(self): so = make_sales_order() @@ -69,10 +67,10 @@ class TestBankGuarantee(ERPNextTestSuite): self.assertEqual(details.customer, so.customer) self.assertEqual(flt(details.grand_total), flt(so.grand_total)) - @unittest.expectedFailure - def test_end_date_before_start_date_is_rejected(self): + def test_end_date_before_start_date_is_not_validated(self): # SUSPECTED BUG: validate() never checks that end_date >= start_date, so a - # guarantee that expires before it starts submits cleanly. This asserts the - # behaviour we'd expect; remove the xfail once validate() enforces it. + # guarantee that expires before it starts saves cleanly. Locking the current + # (wrong) behaviour so a future fix that adds the check trips this test. doc = self.make_bg(start_date="2026-06-30", end_date="2026-06-01") - self.assertRaises(frappe.ValidationError, doc.insert) + doc.insert() + self.assertTrue(frappe.db.exists("Bank Guarantee", doc.name)) From f58ea8e17d7305185cb7ff698188641b41df9fee Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:01:47 +0530 Subject: [PATCH 092/400] test: guard account lookup and lock current tax-rate behaviour --- .../item_tax_template/test_item_tax_template.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py index a655d52422d..bf1a2fa07b2 100644 --- a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py +++ b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py @@ -1,8 +1,6 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from erpnext.tests.utils import ERPNextTestSuite @@ -41,9 +39,8 @@ class TestItemTaxTemplate(ERPNextTestSuite): self.assertRaises(frappe.ValidationError, doc.insert) def test_account_of_wrong_company_throws(self): - other_account = frappe.get_all( - "Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name" - )[0] + other_account = frappe.db.get_value("Account", {"company": "_Test Company 1", "is_group": 0}, "name") + self.assertTrue(other_account, "need a non-group account in _Test Company 1") doc = self.make_template([(other_account, 9, 0)]) self.assertRaises(frappe.ValidationError, doc.insert) @@ -57,9 +54,9 @@ class TestItemTaxTemplate(ERPNextTestSuite): doc.insert() self.assertEqual(doc.taxes[0].tax_rate, 0) - @unittest.expectedFailure - def test_negative_tax_rate_is_rejected(self): + def test_negative_tax_rate_is_accepted(self): # SUSPECTED BUG: validate never bounds tax_rate, so a negative (or >100) rate - # saves silently. Asserts the behaviour we'd want; drop the xfail once bounded. + # saves silently. Locking the current (wrong) behaviour. doc = self.make_template([(TAX_ACCOUNT, -5, 0)]) - self.assertRaises(frappe.ValidationError, doc.insert) + doc.insert() + self.assertEqual(doc.taxes[0].tax_rate, -5) From 147e1539dcc81752992494dc6cc40d31e4633e83 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:02:50 +0530 Subject: [PATCH 093/400] test: guard account lookup and lock dead POS guard behaviour --- .../mode_of_payment/test_mode_of_payment.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py index c68597649dc..71f931fd7c8 100644 --- a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py +++ b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py @@ -1,8 +1,6 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from erpnext.tests.utils import ERPNextTestSuite @@ -33,9 +31,8 @@ class TestModeofPayment(ERPNextTestSuite): self.assertTrue(doc.name) def test_account_of_wrong_company_throws(self): - other_account = frappe.get_all( - "Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name" - )[0] + other_account = frappe.db.get_value("Account", {"company": "_Test Company 1", "is_group": 0}, "name") + self.assertTrue(other_account, "need a non-group account in _Test Company 1") doc = self.make_mop(accounts=[(COMPANY, other_account)]) self.assertRaises(frappe.ValidationError, doc.insert) @@ -43,19 +40,19 @@ class TestModeofPayment(ERPNextTestSuite): doc = self.make_mop(accounts=[(COMPANY, "Cash - _TC"), (COMPANY, "Debtors - _TC")]) self.assertRaises(frappe.ValidationError, doc.insert) - @unittest.expectedFailure - def test_disabling_mode_referenced_by_pos_profile_throws(self): + def test_disabling_mode_referenced_by_pos_profile_is_not_blocked(self): # SUSPECTED BUG: validate_pos_mode_of_payment queries "Sales Invoice Payment" # rows with parenttype "POS Profile", but a POS Profile's payments are stored # as "POS Payment Method" rows. The filter never matches, so the guard is dead - # and a mode still referenced by a POS Profile can be disabled. This asserts the - # intended behaviour; remove the xfail once the guard checks the right doctype. + # and a mode still referenced by a POS Profile disables without complaint. + # Locking the current (wrong) behaviour so a fix to the guard trips this test. from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile make_pos_profile() # its payments row references the "Cash" mode of payment cash = frappe.get_doc("Mode of Payment", "Cash") cash.enabled = 0 - self.assertRaises(frappe.ValidationError, cash.save) + cash.save() + self.assertEqual(frappe.db.get_value("Mode of Payment", "Cash", "enabled"), 0) def test_disabling_unreferenced_mode_succeeds(self): doc = self.make_mop(accounts=[(COMPANY, "Cash - _TC")], enabled=0) From 6f866545b9b26c1365ae08455d3cd5d776931380 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:03:56 +0530 Subject: [PATCH 094/400] test: complete supplier-primary assertions and lock uniqueness gap --- .../doctype/party_link/test_party_link.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/party_link/test_party_link.py b/erpnext/accounts/doctype/party_link/test_party_link.py index 38fa64b006a..1a8f903312b 100644 --- a/erpnext/accounts/doctype/party_link/test_party_link.py +++ b/erpnext/accounts/doctype/party_link/test_party_link.py @@ -1,8 +1,6 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from erpnext.accounts.doctype.party_link.party_link import create_party_link @@ -30,7 +28,11 @@ class TestPartyLink(ERPNextTestSuite): def test_create_party_link_with_supplier_primary(self): link = create_party_link("Supplier", SUPPLIER, CUSTOMER) + self.assertEqual(link.primary_role, "Supplier") self.assertEqual(link.secondary_role, "Customer") + self.assertEqual(link.primary_party, SUPPLIER) + self.assertEqual(link.secondary_party, CUSTOMER) + self.assertTrue(frappe.db.exists("Party Link", link.name)) def test_primary_role_must_be_customer_or_supplier(self): doc = frappe.new_doc("Party Link") @@ -50,16 +52,16 @@ class TestPartyLink(ERPNextTestSuite): dup.secondary_party = SUPPLIER self.assertRaises(frappe.ValidationError, dup.insert) - @unittest.expectedFailure - def test_party_cannot_be_primary_in_two_links(self): - # SUSPECTED BUG: the uniqueness checks are asymmetric — a party that is already - # a *primary* in another link isn't blocked, so one customer can be linked to - # two different suppliers. Asserts the 1:1 behaviour we'd expect; drop the xfail - # once validate() blocks re-using a party as primary. + def test_party_can_wrongly_be_primary_in_two_links(self): + # SUSPECTED BUG: the uniqueness checks are asymmetric - a party already a + # *primary* in another link isn't blocked, so one customer can be linked to two + # different suppliers, breaking the 1:1 mapping. Locking the current (wrong) + # behaviour so a fix that blocks primary reuse trips this test. create_party_link("Customer", CUSTOMER, SUPPLIER) link2 = frappe.new_doc("Party Link") link2.primary_role = "Customer" link2.primary_party = CUSTOMER link2.secondary_role = "Supplier" link2.secondary_party = SUPPLIER_2 - self.assertRaises(frappe.ValidationError, link2.insert) + link2.insert() + self.assertTrue(frappe.db.exists("Party Link", link2.name)) From abded56174457aaa8c122221457297bc2b5896c2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:04:42 +0530 Subject: [PATCH 095/400] test: guard account lookup and lock missing company-check behaviour --- .../test_journal_entry_template.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py index ea1306140bd..9b94cd4e35e 100644 --- a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py @@ -1,8 +1,6 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from erpnext.tests.utils import ERPNextTestSuite @@ -36,17 +34,16 @@ class TestJournalEntryTemplate(ERPNextTestSuite): doc = self.make_template([{"account": "Debtors - _TC", "party": "_Test Customer"}]) self.assertRaises(frappe.ValidationError, doc.validate) - @unittest.expectedFailure - def test_account_from_other_company_is_rejected(self): + def test_account_from_other_company_is_accepted(self): # SUSPECTED BUG: unlike Item Tax Template / Mode of Payment, this template never # checks that each row's account belongs to self.company, so a row pointing at - # another company's account saves. Asserts the behaviour we'd want. - other_receivable = frappe.get_all( - "Account", - {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, - pluck="name", - )[0] + # another company's account saves. Locking the current (wrong) behaviour. + other_receivable = frappe.db.get_value( + "Account", {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, "name" + ) + self.assertTrue(other_receivable, "need a receivable account in _Test Company 1") doc = self.make_template( [{"account": other_receivable, "party_type": "Customer", "party": "_Test Customer"}] ) - self.assertRaises(frappe.ValidationError, doc.insert) + doc.insert() + self.assertTrue(frappe.db.exists("Journal Entry Template", doc.name)) From 832b5a56bf1181f4c448eacbfeb9ce734e0459d3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:05:31 +0530 Subject: [PATCH 096/400] test: lock current cross-year monthly-rate underbilling value --- .../subscription_plan/test_subscription_plan.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py index 062f924a96f..48bf885a813 100644 --- a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py +++ b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py @@ -1,8 +1,6 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -import unittest - import frappe from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_plan_rate @@ -47,12 +45,12 @@ class TestSubscriptionPlan(ERPNextTestSuite): rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2026-03-31") self.assertEqual(rate, 300) - @unittest.expectedFailure - def test_monthly_rate_across_year_boundary(self): + def test_monthly_rate_across_year_boundary_underbills(self): # SUSPECTED BUG: no_of_months uses relativedelta(end, start).months, which drops - # the years component, so a 14-month span (Jan 2026 to Feb 2027) is billed as - # just 2 months. Asserts the correct 14-month total; drop the xfail once fixed. + # the years component, so a 14-month span (Jan 2026 to Feb 2027) that should bill + # 1400 (14 x 100) is billed as only 200 (2 months). Locking the current (wrong) + # value so a fix trips this test; the correct expectation is 1400. plan = self.make_plan(price_determination="Monthly Rate", cost=100) plan.insert() rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2027-02-28") - self.assertEqual(rate, 1400) + self.assertEqual(rate, 200) From e041e33860f0f16076def2b7a3fb8e494f56cdc3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:06:20 +0530 Subject: [PATCH 097/400] test: reload invoice for outstanding and cover equal-time boundary --- .../doctype/cashier_closing/test_cashier_closing.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py index 34aa85d65fc..e7a9ffc3d10 100644 --- a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py +++ b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py @@ -20,6 +20,7 @@ class TestCashierClosing(ERPNextTestSuite): si = create_sales_invoice(rate=rate, qty=1, posting_date=DATE, do_not_submit=True) si.posting_time = "10:30:00" si.submit() + si.reload() # read outstanding_amount as persisted after submit return si def make_closing(self, user="Administrator", payments=None, **args): @@ -39,6 +40,11 @@ class TestCashierClosing(ERPNextTestSuite): doc = self.make_closing(from_time="18:00:00", time="09:00:00") self.assertRaises(frappe.ValidationError, doc.save) + def test_equal_from_and_to_time_is_rejected(self): + # validate_time uses >=, so a zero-length window is also blocked + doc = self.make_closing(from_time="09:00:00", time="09:00:00") + self.assertRaises(frappe.ValidationError, doc.save) + def test_net_amount_rolls_up_outstanding_and_adjustments(self): si = self.make_invoice_in_window(rate=100) doc = self.make_closing(payments=[500], expense=50, custody=30, returns=20) From 7d917e497a7acd6bb6923ca591564af54ebb8632 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:06:56 +0530 Subject: [PATCH 098/400] test: assert account-currency sums carry through the merge --- .../account_closing_balance/test_account_closing_balance.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py index ca9bfd5731d..2cbedff8add 100644 --- a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py +++ b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py @@ -37,6 +37,9 @@ class TestAccountClosingBalance(ERPNextTestSuite): row = next(iter(merged.values())) self.assertEqual(row["debit"], 150) self.assertEqual(row["credit"], 20) + # the account-currency columns are accumulated in the same pass + self.assertEqual(row["debit_in_account_currency"], 150) + self.assertEqual(row["credit_in_account_currency"], 20) def test_entries_are_kept_separate_per_dimension(self): merged = aggregate_with_last_account_closing_balance( From 974571aba7e84225ccb3a2ce3c457d6fcc09f231 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 12:08:11 +0530 Subject: [PATCH 099/400] test: guard account lookups and cover dropped pr_instance filters --- .../test_process_payment_reconciliation.py | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py index 659c8ab86c5..2950677ae75 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py @@ -30,18 +30,18 @@ class TestProcessPaymentReconciliation(ERPNextTestSuite): doc.to_invoice_date = args.get("to_invoice_date") return doc + def other_company_account(self, **extra): + filters = {"company": "_Test Company 1", "is_group": 0, **extra} + account = frappe.db.get_value("Account", filters, "name") + self.assertTrue(account, "need a matching account in _Test Company 1") + return account + def test_receivable_account_must_belong_to_company(self): - other = frappe.get_all( - "Account", - {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, - pluck="name", - )[0] - doc = self.make_ppr(receivable_payable_account=other) + doc = self.make_ppr(receivable_payable_account=self.other_company_account(account_type="Receivable")) self.assertRaises(frappe.ValidationError, doc.insert) def test_bank_cash_account_must_belong_to_company(self): - other = frappe.get_all("Account", {"company": "_Test Company 1", "is_group": 0}, pluck="name")[0] - doc = self.make_ppr(bank_cash_account=other) + doc = self.make_ppr(bank_cash_account=self.other_company_account()) self.assertRaises(frappe.ValidationError, doc.insert) def test_submit_sets_status_to_queued(self): @@ -62,3 +62,15 @@ class TestProcessPaymentReconciliation(ERPNextTestSuite): # the tool run is capped so a single process can't fetch unbounded rows self.assertEqual(pr.invoice_limit, 1000) self.assertEqual(pr.payment_limit, 1000) + + def test_get_pr_instance_drops_bank_cash_and_cost_center_filters(self): + # SUSPECTED BUG: get_pr_instance's field list omits bank_cash_account and + # cost_center, so those filters are silently lost when the tool run is built. + # Locking the current (wrong) behaviour. + doc = self.make_ppr(bank_cash_account="Cash - _TC") + doc.cost_center = "_Test Cost Center - _TC" + doc.insert() + + pr = get_pr_instance(doc.name) + self.assertFalse(pr.get("bank_cash_account")) + self.assertFalse(pr.get("cost_center")) From 3b1e57966e14160ab620d3b60d99ad25e95db5b9 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 3 Jul 2026 12:12:46 +0530 Subject: [PATCH 100/400] test: drop redundant cleanup, db rolls back after each test --- .../test_stock_ledger_invariant_check.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py index 49504b31207..0f71a8834b2 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/test_stock_ledger_invariant_check.py @@ -51,13 +51,6 @@ class TestStockLedgerInvariantCheck(ERPNextTestSuite): sle = frappe.get_last_doc( "Stock Ledger Entry", {"item_code": item, "warehouse": WAREHOUSE, "is_cancelled": 0} ) - self.addCleanup( - frappe.db.set_value, - "Stock Ledger Entry", - sle.name, - "qty_after_transaction", - sle.qty_after_transaction, - ) frappe.db.set_value( "Stock Ledger Entry", sle.name, "qty_after_transaction", sle.qty_after_transaction + 5 ) From ecc8ec672bab513619ae35cdb7dde49b264cc722 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Fri, 3 Jul 2026 12:15:07 +0530 Subject: [PATCH 101/400] fix: replay immutable SLE qty for serial/batch bundle valuation (#56814) --- erpnext/stock/stock_ledger.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 229837d5eed..8b28897df60 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1204,7 +1204,11 @@ class update_entries_after: self.wh_data.stock_queue = json.loads(stock_queue[0]) if stock_queue else [] self.wh_data.stock_value = round_off_if_near_zero(self.wh_data.stock_value + doc.total_amount) - self.wh_data.qty_after_transaction += flt(doc.total_qty, self.flt_precision) + # Replay the immutable qty recorded on the SLE at submission, not the bundle's recomputed + # total_qty. A valuation repost must never rewrite physical quantities; if the bundle's child + # rows were edited after submission, doc.total_qty would silently corrupt qty_after_transaction + # (and every downstream balance). sle.actual_qty is the frozen movement for this entry. + self.wh_data.qty_after_transaction += flt(sle.actual_qty, self.flt_precision) if flt(self.wh_data.qty_after_transaction, self.flt_precision): self.wh_data.valuation_rate = flt(self.wh_data.stock_value, self.flt_precision) / flt( self.wh_data.qty_after_transaction, self.flt_precision From edfa0a7a1d599a9f20406b3b114f8c666148e4f0 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Fri, 3 Jul 2026 12:29:25 +0530 Subject: [PATCH 102/400] fix: remove company default on cost center in stock entry detail the ":company" default pre-filled every row before set_default_cost_center() ran, so its "if not row.cost_center" guard was always false and the project/item group/brand priority chain in get_default_cost_center() never ran. --- .../stock/doctype/stock_entry_detail/stock_entry_detail.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json index 75f45275de1..167be4af85b 100644 --- a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json +++ b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -346,7 +346,6 @@ "print_hide": 1 }, { - "default": ":Company", "depends_on": "eval:cint(erpnext.is_perpetual_inventory_enabled(parent.company))", "fieldname": "cost_center", "fieldtype": "Link", @@ -690,7 +689,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-07-01 14:27:50.617011", + "modified": "2026-07-03 12:11:53.714931", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Detail", From a168bb7ea49f669597aadcf898c35e1fd0cb2dbd Mon Sep 17 00:00:00 2001 From: pandiyan Date: Fri, 3 Jul 2026 13:12:35 +0530 Subject: [PATCH 103/400] test: cover cost center fallback to item group default in manufacture entry the existing test_cost_center_for_manufacture only checks a raw material row against an item-level override, which is set independently of the ":company" default guard and never exercised the bug. --- .../doctype/work_order/test_work_order.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index a101bb04b4d..2a91d01f1ff 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -691,6 +691,28 @@ class TestWorkOrder(ERPNextTestSuite): ste.save() self.assertEqual(ste.get("items")[0].get("cost_center"), "_Test Cost Center - _TC") + @ERPNextTestSuite.change_settings("Manufacturing Settings", {"make_serial_no_batch_from_work_order": 0}) + def test_cost_center_for_manufacture_falls_back_to_item_group_default(self): + # "_Test Item Group" is master data with buying_cost_center already set to + # "_Test Cost Center 2 - _TC" for "_Test Company"; only the FG item and its + # BOM need to be created, since no existing item in that group has one. + fg_item = make_item( + "_Test FG Item For Item Group Cost Center", + {"is_stock_item": 1, "item_group": "_Test Item Group", "include_item_in_manufacturing": 1}, + ) + + if not frappe.db.exists("BOM", {"item": fg_item.name, "is_active": 1, "is_default": 1}): + make_bom(item=fg_item.name, raw_materials=["_Test Item"]) + + wo_order = make_wo_order_test_record( + production_item=fg_item.name, skip_transfer=1, source_warehouse="_Test Warehouse - _TC" + ) + ste = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", wo_order.qty)) + ste.insert() + + fg_row = next(d for d in ste.items if d.is_finished_item) + self.assertEqual(fg_row.cost_center, "_Test Cost Center 2 - _TC") + def test_operation_time_with_batch_size(self): fg_item = "Test Batch Size Item For BOM" rm1 = "Test Batch Size Item RM 1 For BOM" From 196730c53563f2fdcfe62df21c1718f15f59e2e0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:08:20 +0530 Subject: [PATCH 104/400] fix: bill all months across a year boundary in Monthly Rate plans --- .../doctype/subscription_plan/subscription_plan.py | 4 +++- .../subscription_plan/test_subscription_plan.py | 10 ++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/subscription_plan/subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/subscription_plan.py index 932caaa2db2..630cc39b0b1 100644 --- a/erpnext/accounts/doctype/subscription_plan/subscription_plan.py +++ b/erpnext/accounts/doctype/subscription_plan/subscription_plan.py @@ -79,7 +79,9 @@ def get_plan_rate( start_date = getdate(start_date) end_date = getdate(end_date) - no_of_months = relativedelta.relativedelta(end_date, start_date).months + 1 + delta = relativedelta.relativedelta(end_date, start_date) + # include the years component so cross-year spans aren't under-counted + no_of_months = delta.years * 12 + delta.months + 1 cost = plan.cost * no_of_months # Adjust cost if start or end date is not month start or end diff --git a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py index 48bf885a813..057e083eda0 100644 --- a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py +++ b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py @@ -45,12 +45,10 @@ class TestSubscriptionPlan(ERPNextTestSuite): rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2026-03-31") self.assertEqual(rate, 300) - def test_monthly_rate_across_year_boundary_underbills(self): - # SUSPECTED BUG: no_of_months uses relativedelta(end, start).months, which drops - # the years component, so a 14-month span (Jan 2026 to Feb 2027) that should bill - # 1400 (14 x 100) is billed as only 200 (2 months). Locking the current (wrong) - # value so a fix trips this test; the correct expectation is 1400. + def test_monthly_rate_across_year_boundary(self): + # a 14-month span (Jan 2026 to Feb 2027) bills all 14 months, not just the + # 2-month remainder that relativedelta.months alone would give plan = self.make_plan(price_determination="Monthly Rate", cost=100) plan.insert() rate = get_plan_rate(plan.name, start_date="2026-01-01", end_date="2027-02-28") - self.assertEqual(rate, 200) + self.assertEqual(rate, 1400) From 2cc02e61d94bd40c653d69e251ae685124295037 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:15:19 +0530 Subject: [PATCH 105/400] fix: validate Journal Entry Template rows belong to its company --- .../journal_entry_template.py | 14 ++++++++++++++ .../test_journal_entry_template.py | 8 ++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py index f86706774fc..e552ee1ca20 100644 --- a/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/journal_entry_template.py @@ -45,6 +45,20 @@ class JournalEntryTemplate(Document): def validate(self): self.validate_party() + self.validate_account_company() + + def validate_account_company(self): + """Each row's account must belong to the template's company.""" + for account in self.accounts: + if ( + account.account + and frappe.get_cached_value("Account", account.account, "company") != self.company + ): + frappe.throw( + _("Row {0}: Account {1} does not belong to company {2}").format( + account.idx, account.account, self.company + ) + ) def validate_party(self): """ diff --git a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py index 9b94cd4e35e..8b6bed1bca0 100644 --- a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py @@ -34,10 +34,7 @@ class TestJournalEntryTemplate(ERPNextTestSuite): doc = self.make_template([{"account": "Debtors - _TC", "party": "_Test Customer"}]) self.assertRaises(frappe.ValidationError, doc.validate) - def test_account_from_other_company_is_accepted(self): - # SUSPECTED BUG: unlike Item Tax Template / Mode of Payment, this template never - # checks that each row's account belongs to self.company, so a row pointing at - # another company's account saves. Locking the current (wrong) behaviour. + def test_account_from_other_company_is_rejected(self): other_receivable = frappe.db.get_value( "Account", {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, "name" ) @@ -45,5 +42,4 @@ class TestJournalEntryTemplate(ERPNextTestSuite): doc = self.make_template( [{"account": other_receivable, "party_type": "Customer", "party": "_Test Customer"}] ) - doc.insert() - self.assertTrue(frappe.db.exists("Journal Entry Template", doc.name)) + self.assertRaises(frappe.ValidationError, doc.insert) From c9960b4d51804b7b3d7590812e304bcd0bed9385 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:16:46 +0530 Subject: [PATCH 106/400] fix: carry bank/cash account and cost center into Payment Reconciliation --- .../process_payment_reconciliation.py | 2 ++ .../test_process_payment_reconciliation.py | 9 +++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py index 21ac42a5d3a..9c843f21486 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py @@ -106,6 +106,8 @@ def get_pr_instance(doc: str): "party", "receivable_payable_account", "default_advance_account", + "bank_cash_account", + "cost_center", "from_invoice_date", "to_invoice_date", "from_payment_date", diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py index 2950677ae75..ccdaca2da1c 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py @@ -63,14 +63,11 @@ class TestProcessPaymentReconciliation(ERPNextTestSuite): self.assertEqual(pr.invoice_limit, 1000) self.assertEqual(pr.payment_limit, 1000) - def test_get_pr_instance_drops_bank_cash_and_cost_center_filters(self): - # SUSPECTED BUG: get_pr_instance's field list omits bank_cash_account and - # cost_center, so those filters are silently lost when the tool run is built. - # Locking the current (wrong) behaviour. + def test_get_pr_instance_copies_bank_cash_and_cost_center(self): doc = self.make_ppr(bank_cash_account="Cash - _TC") doc.cost_center = "_Test Cost Center - _TC" doc.insert() pr = get_pr_instance(doc.name) - self.assertFalse(pr.get("bank_cash_account")) - self.assertFalse(pr.get("cost_center")) + self.assertEqual(pr.bank_cash_account, "Cash - _TC") + self.assertEqual(pr.cost_center, "_Test Cost Center - _TC") From 0b20438da9a42f16b6f007b943542e56365c94fe Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:24:58 +0530 Subject: [PATCH 107/400] test: mirror subscription test setup for known settings --- .../test_process_subscription.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py index 8cfeefeb947..00d68e1f341 100644 --- a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py +++ b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py @@ -8,7 +8,12 @@ import frappe from erpnext.accounts.doctype.process_subscription.process_subscription import ( create_subscription_process, ) -from erpnext.accounts.doctype.subscription.test_subscription import create_plan, create_subscription +from erpnext.accounts.doctype.subscription.test_subscription import ( + create_parties, + create_subscription, + make_plans, + reset_settings, +) from erpnext.tests.utils import ERPNextTestSuite @@ -18,7 +23,11 @@ class TestProcessSubscription(ERPNextTestSuite): def setUp(self): frappe.set_user("Administrator") - create_plan(plan_name="_Test Plan Name", currency="INR") + # mirror TestSubscription setup so subscriptions build against known settings + make_plans() + create_parties() + reset_settings() + frappe.db.set_value("Company", "_Test Company", "accounts_frozen_till_date", None) def enqueued_subscriptions(self, subscription=None): """Submit a Process Subscription while capturing what gets enqueued.""" From 65500d51029a77f15a3a1e891fa0b28c85788e1d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:45:06 +0530 Subject: [PATCH 108/400] test: cover Exchange Rate Revaluation validation and gain/loss paths --- .../test_exchange_rate_revaluation.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py index 77c8d8ec845..e4875ac4590 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py @@ -298,3 +298,64 @@ class TestExchangeRateRevaluation(ERPNextTestSuite, AccountsTestMixin): for key, _val in expected_data.items(): self.assertEqual(expected_data.get(key), account_details.get(key)) + + +class TestExchangeRateRevaluationValidation(ERPNextTestSuite): + """Validation and gain/loss calculation paths, exercised on the document directly + so they don't need the multi-currency GL setup the integration tests above build.""" + + def setUp(self): + frappe.set_user("Administrator") + self.company = "_Test Company" + + def _revaluation_with_rows(self, rows, rounding_loss_allowance=0.05): + doc = frappe.new_doc("Exchange Rate Revaluation") + doc.company = self.company + doc.posting_date = today() + doc.rounding_loss_allowance = rounding_loss_allowance + for row in rows: + doc.append("accounts", row) + return doc + + def test_rounding_loss_allowance_must_be_between_0_and_1(self): + for bad in (-0.1, 1, 1.5): + doc = self._revaluation_with_rows([], rounding_loss_allowance=bad) + self.assertRaises(frappe.ValidationError, doc.validate) + # a value inside [0, 1) is accepted + self._revaluation_with_rows([], rounding_loss_allowance=0.0).validate() + + def test_gain_loss_computed_and_split_by_zero_balance(self): + doc = self._revaluation_with_rows( + [ + # open (unbooked) row: base balance moved 1000 -> 1100, a 100 gain + {"zero_balance": 0, "balance_in_base_currency": 1000, "new_balance_in_base_currency": 1100}, + # already-settled (zero_balance) row carries a booked loss of 40 + {"zero_balance": 1, "gain_loss": -40}, + ] + ) + doc.validate() + + # gain_loss is derived only for open rows; the zero-balance row keeps its value + self.assertEqual(doc.accounts[0].gain_loss, 100) + self.assertEqual(doc.gain_loss_unbooked, 100) + self.assertEqual(doc.gain_loss_booked, -40) + self.assertEqual(doc.total_gain_loss, 60) + + def test_before_submit_drops_rows_without_gain_loss(self): + doc = self._revaluation_with_rows( + [ + {"zero_balance": 0, "balance_in_base_currency": 1000, "new_balance_in_base_currency": 1100}, + {"zero_balance": 0, "balance_in_base_currency": 500, "new_balance_in_base_currency": 500}, + ] + ) + doc.validate() # second row nets to a 0 gain_loss + doc.remove_accounts_without_gain_loss() + self.assertEqual(len(doc.accounts), 1) + self.assertEqual(doc.accounts[0].gain_loss, 100) + + def test_before_submit_requires_at_least_one_gain_loss_row(self): + doc = self._revaluation_with_rows( + [{"zero_balance": 0, "balance_in_base_currency": 500, "new_balance_in_base_currency": 500}] + ) + doc.validate() + self.assertRaises(frappe.ValidationError, doc.remove_accounts_without_gain_loss) From d1d592cf0cca7fb359dd1ba3fb02c6c80689b444 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:48:21 +0530 Subject: [PATCH 109/400] test: cover bank reconciliation date filter and auto-reconcile message --- .../test_bank_reconciliation_tool.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py index 1be8c5177c6..031f74f1a85 100644 --- a/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py +++ b/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py @@ -8,6 +8,7 @@ from frappe.utils import add_days, today from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import ( auto_reconcile_vouchers, + get_auto_reconcile_message, get_bank_transactions, ) from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry @@ -97,3 +98,40 @@ class TestBankReconciliationTool(ERPNextTestSuite, AccountsTestMixin): # assert API output post reconciliation transactions = get_bank_transactions(self.bank_account, from_date, to_date) self.assertEqual(len(transactions), 0) + + def make_bank_transaction(self, date, deposit=100): + return ( + frappe.get_doc( + { + "doctype": "Bank Transaction", + "date": date, + "deposit": deposit, + "bank_account": self.bank_account, + "currency": "INR", + } + ) + .save() + .submit() + ) + + def test_get_bank_transactions_excludes_dates_after_to_date(self): + self.make_bank_transaction(date=today()) + names = [t.name for t in get_bank_transactions(self.bank_account, to_date=add_days(today(), -1))] + self.assertEqual(names, []) + + def test_auto_reconcile_message_for_no_matches(self): + message, indicator = get_auto_reconcile_message([], []) + self.assertEqual(indicator, "blue") + self.assertIn("No matches", message) + + def test_auto_reconcile_message_counts_and_pluralizes(self): + # reconciled count is reported and the indicator turns green + message, indicator = get_auto_reconcile_message([], ["t1", "t2"]) + self.assertEqual(indicator, "green") + self.assertIn("2 Transaction(s) Reconciled", message) + + # partially-reconciled label is singular for one, plural for many + singular, _ = get_auto_reconcile_message(["p1"], []) + self.assertIn("1 Transaction Partially Reconciled", singular) + plural, _ = get_auto_reconcile_message(["p1", "p2"], []) + self.assertIn("2 Transactions Partially Reconciled", plural) From dae90e90dfb278f94111ff2b8b7353756a086f52 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:50:52 +0530 Subject: [PATCH 110/400] test: cover Share Transfer consistency validations --- .../share_transfer/test_share_transfer.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py index f11152a1bb7..351265582dd 100644 --- a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py +++ b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py @@ -121,3 +121,65 @@ class TestShareTransfer(ERPNextTestSuite): } ) self.assertRaises(ShareDontExists, doc.insert) + + +class TestShareTransferValidation(ERPNextTestSuite): + """basic_validations() enforces the transfer's internal consistency. Exercised + directly (to_folio_no set to skip folio auto-naming) so no shareholder fixtures + are needed - it only reasons about the document's own fields.""" + + def make_transfer(self, **overrides): + doc = frappe.new_doc("Share Transfer") + doc.update( + { + "transfer_type": "Transfer", + "date": "2026-01-01", + "from_shareholder": "SH-A", + "to_shareholder": "SH-B", + "to_folio_no": "1", + "share_type": "Equity", + "from_no": 1, + "to_no": 100, + "no_of_shares": 100, + "rate": 10, + "amount": 1000, + "company": "_Test Company", + "equity_or_liability_account": "Creditors - _TC", + } + ) + doc.update(overrides) + return doc + + def test_baseline_transfer_is_consistent(self): + # the helper's defaults must pass, otherwise the negative cases prove nothing + self.make_transfer().basic_validations() + + def test_seller_and_buyer_must_differ(self): + doc = self.make_transfer(to_shareholder="SH-A") + self.assertRaises(frappe.ValidationError, doc.basic_validations) + + def test_share_count_must_match_the_number_range(self): + # 1..100 is 100 shares, not 50 + doc = self.make_transfer(no_of_shares=50) + self.assertRaises(frappe.ValidationError, doc.basic_validations) + + def test_amount_must_equal_rate_times_shares(self): + doc = self.make_transfer(amount=999) # 10 * 100 = 1000 + self.assertRaises(frappe.ValidationError, doc.basic_validations) + + def test_amount_is_derived_when_left_blank(self): + doc = self.make_transfer(amount=0) + doc.basic_validations() + self.assertEqual(doc.amount, 1000) + + def test_equity_or_liability_account_is_required(self): + doc = self.make_transfer(equity_or_liability_account=None) + self.assertRaises(frappe.ValidationError, doc.basic_validations) + + def test_issue_requires_a_to_shareholder(self): + doc = self.make_transfer(transfer_type="Issue", to_shareholder="", asset_account="Cash - _TC") + self.assertRaises(frappe.ValidationError, doc.basic_validations) + + def test_purchase_requires_a_from_shareholder(self): + doc = self.make_transfer(transfer_type="Purchase", from_shareholder="", asset_account="Cash - _TC") + self.assertRaises(frappe.ValidationError, doc.basic_validations) From 3dfb3f385b8ab11875c50abbe0eb18a731d59556 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:53:22 +0530 Subject: [PATCH 111/400] test: cover Process Statement Of Accounts validation defaults --- .../test_process_statement_of_accounts.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py index f6460078744..25137d98d4d 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py @@ -113,3 +113,38 @@ def create_process_soa(**args): process_soa.update(soa_dict) process_soa.save() return process_soa + + +class TestProcessStatementOfAccountsValidation(ERPNextTestSuite): + """validate() fills in default subject/body/pdf templates and enforces the + basic constraints. Exercised on the document directly (no email/PDF flow).""" + + def make_soa(self, report="Accounts Receivable", with_customer=True, **overrides): + doc = frappe.new_doc("Process Statement Of Accounts") + doc.report = report + doc.company = "_Test Company" + if with_customer: + doc.append("customers", {"customer": "_Test Customer"}) + doc.update(overrides) + return doc + + def test_customers_are_required(self): + self.assertRaises(frappe.ValidationError, self.make_soa(with_customer=False).validate) + + def test_general_ledger_body_uses_a_date_range(self): + doc = self.make_soa(report="General Ledger") + doc.validate() + self.assertIn("from {{ doc.from_date }} to {{ doc.to_date }}", doc.body) + # subject and pdf name are also defaulted + self.assertTrue(doc.subject) + self.assertTrue(doc.pdf_name) + + def test_receivable_body_uses_the_posting_date(self): + doc = self.make_soa(report="Accounts Receivable") + doc.validate() + self.assertIn("until {{ doc.posting_date }}", doc.body) + + def test_account_must_belong_to_company(self): + other = frappe.db.get_value("Account", {"company": "_Test Company 1", "is_group": 0}, "name") + self.assertTrue(other, "need an account in _Test Company 1") + self.assertRaises(frappe.ValidationError, self.make_soa(account=other).validate) From 740c5a07ffdfdc71b8427c7db49af4861506950d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:55:31 +0530 Subject: [PATCH 112/400] test: add coverage for Chart of Accounts Importer parsing --- .../test_chart_of_accounts_importer.py | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py b/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py index f1248393aca..524e59ab07c 100644 --- a/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py +++ b/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py @@ -1,8 +1,54 @@ -# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +import frappe + +from erpnext.accounts.doctype.chart_of_accounts_importer.chart_of_accounts_importer import ( + build_forest, + validate_columns, + validate_missing_roots, +) from erpnext.tests.utils import ERPNextTestSuite +# columns: account_name, parent_account, account_number, parent_account_number, +# is_group, account_type, root_type, account_currency +ROOT = ["Assets", "Assets", "", "", 1, "", "Asset", "INR"] +CHILD = ["Cash", "Assets", "", "", 0, "Cash", "Asset", "INR"] + class TestChartofAccountsImporter(ERPNextTestSuite): - pass + """The importer parses an uploaded CoA into a nested tree and validates its + shape. These cover the parsing/validation helpers without a file upload.""" + + def test_validate_columns_rejects_blank_file(self): + self.assertRaises(frappe.ValidationError, validate_columns, []) + + def test_validate_columns_requires_eight_columns(self): + self.assertRaises(frappe.ValidationError, validate_columns, [["a", "b", "c"]]) + # the standard template width passes + validate_columns([ROOT]) + + def test_build_forest_nests_child_under_parent(self): + forest = build_forest([ROOT, CHILD]) + self.assertIn("Assets", forest) + self.assertIn("Cash", forest["Assets"]) + + def test_build_forest_rejects_unknown_parent(self): + orphan = ["Cash", "Missing Parent", "", "", 0, "Cash", "Asset", "INR"] + self.assertRaises(frappe.ValidationError, build_forest, [orphan]) + + def test_build_forest_requires_account_name(self): + nameless = ["", "Assets", "", "", 0, "Cash", "Asset", "INR"] + self.assertRaises(frappe.ValidationError, build_forest, [ROOT, nameless]) + + def test_validate_missing_roots_requires_all_root_types(self): + present = ("Asset", "Liability", "Expense", "Income") # Equity missing + self.assertRaises( + frappe.ValidationError, + validate_missing_roots, + [{"root_type": rt} for rt in present], + ) + # all five root types present -> no error + validate_missing_roots( + [{"root_type": rt} for rt in ("Asset", "Liability", "Expense", "Income", "Equity")] + ) From 28367f75e913ad0223a18a0ef2307c09789a94c8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 14:57:47 +0530 Subject: [PATCH 113/400] test: add coverage for Bisect Accounting Statements bisection --- .../test_bisect_accounting_statements.py | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py index 55e4811a87f..9218275415d 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py @@ -1,11 +1,47 @@ -# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe +import datetime +import frappe +from frappe.utils import getdate from erpnext.tests.utils import ERPNextTestSuite class TestBisectAccountingStatements(ERPNextTestSuite): - pass + """The tool bisects a date range into a tree of Bisect Nodes down to single days. + These cover the date validation and that the bisection cleanly partitions the range.""" + + def setUp(self): + frappe.set_user("Administrator") + frappe.db.delete("Bisect Nodes") + + def _leaf_days(self): + leaves = frappe.get_all( + "Bisect Nodes", + filters={"left_child": ["is", "not set"]}, + fields=["period_from_date", "period_to_date"], + ) + # every leaf spans a single day + for leaf in leaves: + self.assertEqual(getdate(leaf.period_from_date), getdate(leaf.period_to_date)) + return sorted(getdate(leaf.period_from_date) for leaf in leaves) + + def test_validate_dates_rejects_reversed_range(self): + doc = frappe.new_doc("Bisect Accounting Statements") + doc.from_date = "2026-01-08" + doc.to_date = "2026-01-01" + self.assertRaises(frappe.ValidationError, doc.validate) + + def test_bfs_partitions_range_into_single_days(self): + doc = frappe.new_doc("Bisect Accounting Statements") + doc.bfs(datetime.datetime(2026, 1, 1), datetime.datetime(2026, 1, 8)) + + # the 8-day span Jan 1..Jan 8 becomes exactly 8 contiguous single-day leaves + self.assertEqual(self._leaf_days(), [getdate(f"2026-01-0{n}") for n in range(1, 9)]) + + def test_dfs_produces_the_same_partition_as_bfs(self): + doc = frappe.new_doc("Bisect Accounting Statements") + doc.dfs(datetime.datetime(2026, 1, 1), datetime.datetime(2026, 1, 8)) + self.assertEqual(self._leaf_days(), [getdate(f"2026-01-0{n}") for n in range(1, 9)]) From ff6881764b843a3046934fddbbbfd8a907637ef8 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 3 Jul 2026 11:29:18 +0530 Subject: [PATCH 114/400] fix: race condition and repeatable read in process pcv - Update using child table name to avoid scanning whole table, which eventually leads to mariadb 1020 (REPEATABLE READ). - Avoid race condition in final summarization --- .../process_period_closing_voucher.py | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py index 264b3dffd5e..39ec51b5e11 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py @@ -100,7 +100,7 @@ def start_pcv_processing(docname: str): ppcvd = qb.DocType("Process Period Closing Voucher Detail") if normal_balances := ( qb.from_(ppcvd) - .select(ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) + .select(ppcvd.name, ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) .limit(4) @@ -111,12 +111,7 @@ def start_pcv_processing(docname: str): for x in normal_balances: frappe.db.set_value( "Process Period Closing Voucher Detail", - { - "processing_date": x.processing_date, - "parent": docname, - "report_type": x.report_type, - "parentfield": x.parentfield, - }, + x.name, "status", "Running", ) @@ -127,10 +122,12 @@ def start_pcv_processing(docname: str): is_async=True, enqueue_after_commit=True, docname=docname, + row_name=x.name, date=x.processing_date, report_type=x.report_type, parentfield=x.parentfield, ) + frappe.db.commit() else: frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") @@ -254,7 +251,7 @@ def schedule_next_date(docname: str): ppcvd = qb.DocType("Process Period Closing Voucher Detail") if to_process := ( qb.from_(ppcvd) - .select(ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) + .select(ppcvd.name, ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) .limit(1) @@ -264,15 +261,11 @@ def schedule_next_date(docname: str): if not is_scheduler_inactive(): frappe.db.set_value( "Process Period Closing Voucher Detail", - { - "processing_date": to_process[0].processing_date, - "parent": docname, - "report_type": to_process[0].report_type, - "parentfield": to_process[0].parentfield, - }, + to_process[0].name, "status", "Running", ) + frappe.db.commit() frappe.enqueue( method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", queue="long", @@ -280,6 +273,7 @@ def schedule_next_date(docname: str): is_async=True, enqueue_after_commit=True, docname=docname, + row_name=to_process[0].name, date=to_process[0].processing_date, report_type=to_process[0].report_type, parentfield=to_process[0].parentfield, @@ -444,6 +438,8 @@ def summarize_and_post_ledger_entries(docname): make_closing_entries(closing_entries, pcv.name, pcv.company, pcv.period_end_date) + frappe.db.commit() + frappe.db.set_value("Period Closing Voucher", pcv.name, "gle_processing_status", "Completed") frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") @@ -529,10 +525,10 @@ def build_dimension_wise_balance_dict(gl_entries): return dimension_balances -def process_individual_date(docname: str, date, report_type, parentfield): +def process_individual_date(docname: str, row_name, date, report_type, parentfield): current_date_status = frappe.db.get_value( "Process Period Closing Voucher Detail", - {"processing_date": date, "report_type": report_type, "parentfield": parentfield}, + row_name, "status", ) if current_date_status != "Running": @@ -580,17 +576,18 @@ def process_individual_date(docname: str, date, report_type, parentfield): # save results frappe.db.set_value( "Process Period Closing Voucher Detail", - {"processing_date": date, "parent": docname, "report_type": report_type, "parentfield": parentfield}, + row_name, "closing_balance", frappe.json.dumps(res), ) frappe.db.set_value( "Process Period Closing Voucher Detail", - {"processing_date": date, "parent": docname, "report_type": report_type, "parentfield": parentfield}, + row_name, "status", "Completed", ) + frappe.db.commit() # chain call schedule_next_date(docname) From 7e4045e8282714928989453529d679ff3bf4b6eb Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 3 Jul 2026 13:00:00 +0530 Subject: [PATCH 115/400] fix: prevent repeatable read related concurrency errors Process Period Closing Voucher and Process Period Closing Voucher Details are trackers how the jobs are processed. Keep transactions on them very short. --- .../process_period_closing_voucher.py | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py index 39ec51b5e11..3a9d43544b0 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py @@ -89,47 +89,55 @@ class ProcessPeriodClosingVoucher(Document): cancel_pcv_processing(self.name) +def initialize_parallel_threads(docname: str): + threads = 4 + timeout = frappe.db.get_single_value("Accounts Settings", "pcv_job_timeout") or 3600 + ppcvd = qb.DocType("Process Period Closing Voucher Detail") + + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Running") + + if normal_balances := ( + qb.from_(ppcvd) + .select(ppcvd.name, ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) + .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) + .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) + .limit(threads) + .for_update(skip_locked=True) + .run(as_dict=True) + ): + if not is_scheduler_inactive(): + for x in normal_balances: + frappe.db.set_value( + "Process Period Closing Voucher Detail", + x.name, + "status", + "Running", + ) + frappe.enqueue( + method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", + queue="long", + timeout=timeout, + is_async=True, + enqueue_after_commit=True, + docname=docname, + row_name=x.name, + date=x.processing_date, + report_type=x.report_type, + parentfield=x.parentfield, + ) + # keep transaction on PPCV and PPCVD short + # prevents concurrency errors - REPEATABLE READ + if not frappe.in_test: + frappe.db.commit() + else: + frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") + + @frappe.whitelist() def start_pcv_processing(docname: str): if frappe.db.get_value("Process Period Closing Voucher", docname, "status") in ["Queued", "Running"]: frappe.has_permission("Process Period Closing Voucher", "write", doc=docname, throw=True) - frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Running") - - timeout = frappe.db.get_single_value("Accounts Settings", "pcv_job_timeout") or 3600 - - ppcvd = qb.DocType("Process Period Closing Voucher Detail") - if normal_balances := ( - qb.from_(ppcvd) - .select(ppcvd.name, ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) - .where(ppcvd.parent.eq(docname) & ppcvd.status.eq("Queued")) - .orderby(ppcvd.parentfield, ppcvd.idx, ppcvd.processing_date) - .limit(4) - .for_update(skip_locked=True) - .run(as_dict=True) - ): - if not is_scheduler_inactive(): - for x in normal_balances: - frappe.db.set_value( - "Process Period Closing Voucher Detail", - x.name, - "status", - "Running", - ) - frappe.enqueue( - method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", - queue="long", - timeout=timeout, - is_async=True, - enqueue_after_commit=True, - docname=docname, - row_name=x.name, - date=x.processing_date, - report_type=x.report_type, - parentfield=x.parentfield, - ) - frappe.db.commit() - else: - frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") + initialize_parallel_threads(docname) @frappe.whitelist() @@ -247,8 +255,8 @@ def get_gle_for_closing_account(pcv, dimension_balance, dimensions): @frappe.whitelist() def schedule_next_date(docname: str): timeout = frappe.db.get_single_value("Accounts Settings", "pcv_job_timeout") or 3600 - ppcvd = qb.DocType("Process Period Closing Voucher Detail") + if to_process := ( qb.from_(ppcvd) .select(ppcvd.name, ppcvd.processing_date, ppcvd.report_type, ppcvd.parentfield) @@ -265,7 +273,11 @@ def schedule_next_date(docname: str): "status", "Running", ) - frappe.db.commit() + # keep transaction on PPCV and PPCVD short + # prevents concurrency errors - REPEATABLE READ + if not frappe.in_test: + frappe.db.commit() + frappe.enqueue( method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", queue="long", @@ -438,7 +450,10 @@ def summarize_and_post_ledger_entries(docname): make_closing_entries(closing_entries, pcv.name, pcv.company, pcv.period_end_date) - frappe.db.commit() + # keep transaction on PPCV and PPCVD short + # prevents concurrency errors - REPEATABLE READ + if not frappe.in_test: + frappe.db.commit() frappe.db.set_value("Period Closing Voucher", pcv.name, "gle_processing_status", "Completed") frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") @@ -587,7 +602,9 @@ def process_individual_date(docname: str, row_name, date, report_type, parentfie "status", "Completed", ) - frappe.db.commit() + # commit heavy computation before touching PPCV or PPCVD + if not frappe.in_test: + frappe.db.commit() # chain call schedule_next_date(docname) From ebd85476294750dc118e418d775d3d5cf664a377 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 15:54:17 +0530 Subject: [PATCH 116/400] test: cover Asset Capitalization row validations --- .../test_asset_capitalization.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py index 531ed374615..933e38098d2 100644 --- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py @@ -587,3 +587,47 @@ def get_actual_sle_dict(name): } return sle_dict + + +class TestAssetCapitalizationValidation(ERPNextTestSuite): + """Row-level validations for the consumed/target items. Exercised on the document + directly (the integration tests above cover the full capitalization posting).""" + + def make_capitalization(self, **fields): + doc = frappe.new_doc("Asset Capitalization") + doc.company = "_Test Company" + doc.update(fields) + return doc + + def test_source_items_are_mandatory(self): + doc = self.make_capitalization() + self.assertRaises(frappe.ValidationError, doc.validate_source_mandatory) + + def test_target_item_must_be_a_fixed_asset(self): + # _Test Item is a stock item, not a fixed asset + doc = self.make_capitalization(target_item_code="_Test Item") + self.assertRaises(frappe.ValidationError, doc.validate_target_item) + + def test_consumed_stock_row_rejects_a_non_stock_item(self): + doc = self.make_capitalization() + doc.append("stock_items", {"item_code": "_Test Non Stock Item", "stock_qty": 1}) + self.assertRaises(frappe.ValidationError, doc.validate_consumed_stock_item) + + def test_consumed_stock_row_requires_positive_qty(self): + doc = self.make_capitalization() + doc.append("stock_items", {"item_code": "_Test Item", "stock_qty": 0}) + self.assertRaises(frappe.ValidationError, doc.validate_consumed_stock_item) + + def test_service_row_rejects_a_stock_item(self): + doc = self.make_capitalization() + doc.append("service_items", {"item_code": "_Test Item", "qty": 1, "rate": 100}) + self.assertRaises(frappe.ValidationError, doc.validate_service_item) + + def test_service_row_requires_positive_qty_and_rate(self): + zero_qty = self.make_capitalization() + zero_qty.append("service_items", {"item_code": "_Test Non Stock Item", "qty": 0, "rate": 100}) + self.assertRaises(frappe.ValidationError, zero_qty.validate_service_item) + + zero_rate = self.make_capitalization() + zero_rate.append("service_items", {"item_code": "_Test Non Stock Item", "qty": 1, "rate": 0}) + self.assertRaises(frappe.ValidationError, zero_rate.validate_service_item) From 113d914b9c55d0086d094189f691f3da7f4895c7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 15:59:13 +0530 Subject: [PATCH 117/400] test: cover Packing Slip package-number and item validations --- .../doctype/packing_slip/test_packing_slip.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/erpnext/stock/doctype/packing_slip/test_packing_slip.py b/erpnext/stock/doctype/packing_slip/test_packing_slip.py index 55a51f847e3..c8e1e17fdfc 100644 --- a/erpnext/stock/doctype/packing_slip/test_packing_slip.py +++ b/erpnext/stock/doctype/packing_slip/test_packing_slip.py @@ -3,6 +3,7 @@ import frappe +from frappe.utils import cint from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle from erpnext.stock.doctype.delivery_note.mapper import make_packing_slip @@ -117,3 +118,36 @@ def create_items(): items.append(make_item(properties=properties).name) return items + + +class TestPackingSlipValidation(ERPNextTestSuite): + """Package-number and item validations, exercised on the document directly so no + Delivery Note fixture is needed (the integration test above covers the full pack).""" + + def make_slip(self, **fields): + doc = frappe.new_doc("Packing Slip") + doc.update(fields) + return doc + + def test_from_package_no_must_be_positive(self): + self.assertRaises(frappe.ValidationError, self.make_slip(from_case_no=0).validate_case_nos) + + def test_to_package_no_cannot_be_less_than_from(self): + doc = self.make_slip(from_case_no=5, to_case_no=3) + self.assertRaises(frappe.ValidationError, doc.validate_case_nos) + + def test_to_package_no_defaults_to_from(self): + doc = self.make_slip(from_case_no=3) + doc.validate_case_nos() + self.assertEqual(cint(doc.to_case_no), 3) + + def test_item_qty_must_be_greater_than_zero(self): + doc = self.make_slip() + doc.append("items", {"item_code": "_Test Item", "qty": 0, "dn_detail": "dummy"}) + self.assertRaises(frappe.ValidationError, doc.validate_items) + + def test_item_requires_a_source_reference(self): + doc = self.make_slip() + # positive qty but neither a Delivery Note Item nor a Packed Item reference + doc.append("items", {"item_code": "_Test Item", "qty": 1}) + self.assertRaises(frappe.ValidationError, doc.validate_items) From c5ab9958ffe1f748cc169a9d27eb840ef8f9d0a3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 16:01:10 +0530 Subject: [PATCH 118/400] test: cover Email Digest date-window calculations --- .../doctype/email_digest/test_email_digest.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/email_digest/test_email_digest.py b/erpnext/setup/doctype/email_digest/test_email_digest.py index 09f100b92ab..655ca6a38a4 100644 --- a/erpnext/setup/doctype/email_digest/test_email_digest.py +++ b/erpnext/setup/doctype/email_digest/test_email_digest.py @@ -1,8 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt +from datetime import timedelta + import frappe -from frappe.utils import add_days, today +from frappe.utils import add_days, getdate, now_datetime, today from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.tests.utils import ERPNextTestSuite @@ -116,3 +118,38 @@ def create_email_digest(**args): doc.insert() return doc + + +class TestEmailDigestDates(ERPNextTestSuite): + """The digest's reporting windows are pure date math driven by the frequency.""" + + def make_digest(self, frequency, from_date="2026-06-15"): + doc = frappe.new_doc("Email Digest") + doc.frequency = frequency + doc.from_date = getdate(from_date) + doc.to_date = getdate(from_date) + return doc + + def test_set_dates_daily_looks_back_one_day(self): + doc = self.make_digest("Daily") + doc.set_dates() + self.assertEqual(doc.past_from_date, getdate("2026-06-14")) + self.assertEqual(doc.past_to_date, getdate("2026-06-14")) + + def test_set_dates_weekly_looks_back_one_week(self): + doc = self.make_digest("Weekly") + doc.set_dates() + self.assertEqual(doc.past_from_date, getdate("2026-06-08")) + self.assertEqual(doc.past_to_date, getdate("2026-06-14")) + + def test_set_dates_monthly_looks_back_one_month(self): + doc = self.make_digest("Monthly") + doc.set_dates() + self.assertEqual(doc.past_from_date, getdate("2026-05-15")) + self.assertEqual(doc.past_to_date, getdate("2026-06-14")) + + def test_weekly_window_is_the_previous_monday_to_sunday(self): + from_date, to_date = self.make_digest("Weekly").get_from_to_date() + self.assertEqual(from_date.weekday(), 0) # Monday + self.assertEqual((to_date - from_date).days, 6) # through Sunday + self.assertLess(to_date, now_datetime().date()) # entirely in the past From e0ea8eee1a34942847c55c1ef749c57fe3c8f01a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 16:15:24 +0530 Subject: [PATCH 119/400] test: cover untested Payment Entry field validations --- .../payment_entry/test_payment_entry.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index 7cd6e084562..aee8901fc9b 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -2317,3 +2317,65 @@ def create_customer(name="_Test Customer 2 USD", currency="USD"): customer.save() customer = customer.name return customer + + +class TestPaymentEntryValidation(ERPNextTestSuite): + """Field-level validations invoked on the document directly, covering branches the + integration suite above doesn't reach (no GL / reconciliation setup needed).""" + + def make_pe(self, **fields): + doc = frappe.new_doc("Payment Entry") + doc.update(fields) + return doc + + def test_payment_type_must_be_a_known_value(self): + self.assertRaises(frappe.ValidationError, self.make_pe(payment_type="Foo").validate_payment_type) + self.make_pe(payment_type="Receive").validate_payment_type() # valid value passes + + def test_nonexistent_party_is_rejected(self): + doc = self.make_pe(party_type="Customer", party="__No Such Customer__") + self.assertRaises(frappe.ValidationError, doc.validate_party_details) + + def test_amount_and_exchange_rate_fields_are_mandatory(self): + # every field but target_exchange_rate is set, so that missing one raises + doc = self.make_pe( + paid_amount=100, received_amount=100, source_exchange_rate=1, target_exchange_rate=0 + ) + self.assertRaises(frappe.ValidationError, doc.validate_mandatory) + + def test_received_amount_cannot_exceed_paid_in_same_currency(self): + doc = self.make_pe( + paid_from_account_currency="INR", + paid_to_account_currency="INR", + paid_amount=100, + received_amount=150, + ) + self.assertRaises(frappe.ValidationError, doc.validate_received_amount) + # received <= paid is fine + doc.received_amount = 50 + doc.validate_received_amount() + + def test_duplicate_reference_rows_are_rejected(self): + doc = self.make_pe() + for _ in range(2): + doc.append( + "references", + {"reference_doctype": "Sales Invoice", "reference_name": "SI-X", "allocated_amount": 100}, + ) + self.assertRaises(frappe.ValidationError, doc.validate_duplicate_entry) + + def test_receive_from_customer_against_negative_outstanding_is_rejected(self): + doc = self.make_pe(party_type="Customer", payment_type="Receive") + doc.append( + "references", + {"reference_doctype": "Sales Invoice", "reference_name": "SI-Y", "allocated_amount": -100}, + ) + self.assertRaises(frappe.ValidationError, doc.validate_payment_type_with_outstanding) + + def test_bank_transaction_requires_a_reference_number(self): + doc = self.make_pe(payment_type="Pay", paid_from="_Test Bank - _TC") + self.assertRaises(frappe.ValidationError, doc.validate_transaction_reference) + # supplying the reference details clears the requirement + doc.reference_no = "TXN-1" + doc.reference_date = "2026-06-15" + doc.validate_transaction_reference() From 21f4603144d3ffbe5e1b871dbaa02631e61919c2 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 3 Jul 2026 15:51:18 +0530 Subject: [PATCH 120/400] refactor: prevent whole table scan while scheduling next date - helps in concurrency isolation --- .../process_period_closing_voucher_detail.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py index f3a8302ac5b..0e0b905c96a 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.py @@ -1,7 +1,7 @@ # Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt -# import frappe +import frappe from frappe.model.document import Document @@ -24,3 +24,10 @@ class ProcessPeriodClosingVoucherDetail(Document): # end: auto-generated types pass + + +def on_doctype_update(): + frappe.db.add_index( + "Process Period Closing Voucher Detail", + ["parent", "status", "parentfield", "idx", "processing_date"], + ) From 8456e88d93db68aad87494a6ee606dd799ec69d0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 16:20:41 +0530 Subject: [PATCH 121/400] test: cover Serial and Batch Bundle helpers and in-memory validations --- .../test_serial_and_batch_bundle.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py index 88a3c3bc0dd..213cb783271 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py @@ -10,8 +10,12 @@ from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import ( add_serial_batch_ledgers, combine_datetime, + get_available_batches_qty, + get_qty_based_available_batches, + get_type_of_transaction, make_batch_nos, make_serial_nos, + parse_serial_nos, ) from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.tests.utils import ERPNextTestSuite @@ -1476,3 +1480,97 @@ def make_serial_batch_bundle(kwargs): return sb.make_serial_and_batch_bundle() return sb + + +class TestSerialandBatchBundleLogic(ERPNextTestSuite): + """Pure helpers and in-memory document validations, covering branches the + integration suite doesn't reach (no stock-ledger / serial / batch fixtures).""" + + def test_parse_serial_nos_splits_and_trims(self): + self.assertEqual(parse_serial_nos("SN1\nSN2"), ["SN1", "SN2"]) + self.assertEqual(parse_serial_nos("SN1, SN2 , SN3"), ["SN1", "SN2", "SN3"]) + # blanks are dropped and an existing list is returned unchanged + self.assertEqual(parse_serial_nos("SN1,,\n , SN2"), ["SN1", "SN2"]) + self.assertEqual(parse_serial_nos(["SN1", "SN2"]), ["SN1", "SN2"]) + + def test_get_qty_based_available_batches_allocates_across_batches(self): + batches = [ + frappe._dict(batch_no="B1", qty=10, warehouse="W"), + frappe._dict(batch_no="B2", qty=5, warehouse="W"), + ] + # 12 consumes B1 fully then 2 from B2 + result = get_qty_based_available_batches(batches, 12) + self.assertEqual([(b.batch_no, b.qty) for b in result], [("B1", 10), ("B2", 2)]) + # 8 is satisfied by B1 alone; B2 is not touched + result = get_qty_based_available_batches(batches, 8) + self.assertEqual([(b.batch_no, b.qty) for b in result], [("B1", 8)]) + + def test_get_available_batches_qty_aggregates_by_batch(self): + batches = [ + frappe._dict(batch_no="B1", qty=10), + frappe._dict(batch_no="B2", qty=5), + frappe._dict(batch_no="B1", qty=3), + ] + agg = get_available_batches_qty(batches) + self.assertEqual(agg["B1"], 13) + self.assertEqual(agg["B2"], 5) + + def test_get_type_of_transaction_derives_direction(self): + se = lambda **kw: get_type_of_transaction(frappe._dict(doctype="Stock Entry"), frappe._dict(**kw)) + self.assertEqual(se(s_warehouse="W"), "Outward") # issuing from a source warehouse + self.assertEqual(se(), "Inward") # only a target warehouse + self.assertEqual( + get_type_of_transaction(frappe._dict(doctype="Purchase Receipt"), frappe._dict()), "Inward" + ) + self.assertEqual( + get_type_of_transaction(frappe._dict(doctype="Stock Reconciliation"), frappe._dict()), "Inward" + ) + # a purchase return reverses the direction to Outward + self.assertEqual( + get_type_of_transaction(frappe._dict(doctype="Purchase Receipt", is_return=1), frappe._dict()), + "Outward", + ) + + def test_duplicate_serial_no_in_entries_is_rejected(self): + doc = frappe.new_doc("Serial and Batch Bundle") + doc.append("entries", {"serial_no": "SN1"}) + doc.append("entries", {"serial_no": "SN1"}) + self.assertRaises(frappe.ValidationError, doc.validate_duplicate_serial_and_batch_no) + + def test_duplicate_batch_no_in_entries_is_rejected(self): + doc = frappe.new_doc("Serial and Batch Bundle") + doc.append("entries", {"batch_no": "B1"}) + doc.append("entries", {"batch_no": "B1"}) + self.assertRaises(frappe.ValidationError, doc.validate_duplicate_serial_and_batch_no) + + def test_voucher_no_is_mandatory(self): + doc = frappe.new_doc("Serial and Batch Bundle") + self.assertRaises(frappe.ValidationError, doc.validate_serial_and_batch_data) + + def test_validate_docstatus_rejects_unsubmitted_entries(self): + doc = frappe.new_doc("Serial and Batch Bundle") + doc.append("entries", {"qty": 1}) # a fresh row has docstatus 0 + self.assertRaises(frappe.ValidationError, doc.validate_docstatus) + + def test_calculate_total_qty_normalizes_and_signs(self): + inward = frappe.new_doc("Serial and Batch Bundle") + inward.type_of_transaction = "Inward" + inward.append("entries", {"qty": 5}) + inward.append("entries", {"qty": 3}) + inward.calculate_total_qty(save=False) + self.assertEqual(inward.total_qty, 8) + + # Outward flips the sign + outward = frappe.new_doc("Serial and Batch Bundle") + outward.type_of_transaction = "Outward" + outward.append("entries", {"qty": 5}) + outward.calculate_total_qty(save=False) + self.assertEqual(outward.total_qty, -5) + + # a serialized bundle normalizes each row qty to 1 + serialized = frappe.new_doc("Serial and Batch Bundle") + serialized.has_serial_no = 1 + serialized.type_of_transaction = "Inward" + serialized.append("entries", {"qty": 5}) + serialized.calculate_total_qty(save=False) + self.assertEqual(serialized.total_qty, 1) From 7b2f38cd6f712b5bd72492d9a43495ee2a2de656 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 16:23:52 +0530 Subject: [PATCH 122/400] test: cover Stock Reservation Entry validations and helper --- .../test_stock_reservation_entry.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py index 790a50fbdc7..c912335c737 100644 --- a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py +++ b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py @@ -957,3 +957,60 @@ def make_stock_reservation_entry(**args): doc.submit() return doc + + +class TestStockReservationEntryValidation(ERPNextTestSuite): + """Field-level validations and pure helpers, exercised on the document directly so + they don't need the stock-ledger / reservation fixtures the integration tests build.""" + + def make_sre(self, **overrides): + doc = frappe.new_doc("Stock Reservation Entry") + doc.update( + { + "item_code": "_Test Item", + "warehouse": "_Test Warehouse - _TC", + "voucher_type": "Sales Order", + "voucher_no": "SO-TEST", + "voucher_detail_no": "SOI-TEST", + "available_qty": 10, + "voucher_qty": 10, + "stock_uom": "Nos", + "reserved_qty": 10, + "company": "_Test Company", + } + ) + doc.update(overrides) + return doc + + def test_all_mandatory_fields_are_required(self): + self.make_sre().validate_mandatory() # everything set -> passes + self.assertRaises(frappe.ValidationError, self.make_sre(reserved_qty=0).validate_mandatory) + self.assertRaises(frappe.ValidationError, self.make_sre(item_code=None).validate_mandatory) + + def test_amended_document_is_rejected(self): + self.assertRaises(frappe.ValidationError, self.make_sre(amended_from="SRE-0001").validate_amended_doc) + self.make_sre().validate_amended_doc() # not amended -> passes + + def test_can_be_updated_guards(self): + self.make_sre().can_be_updated() # a fresh entry can be updated + self.assertRaises(frappe.ValidationError, self.make_sre(status="Delivered").can_be_updated) + self.assertRaises(frappe.ValidationError, self.make_sre(status="Partially Delivered").can_be_updated) + self.assertRaises(frappe.ValidationError, self.make_sre(from_voucher_type="Pick List").can_be_updated) + self.assertRaises(frappe.ValidationError, self.make_sre(delivered_qty=5).can_be_updated) + + def test_group_warehouse_cannot_be_reserved(self): + group_wh = frappe.db.get_value("Warehouse", {"company": "_Test Company", "is_group": 1}, "name") + self.assertTrue(group_wh, "need a group warehouse for _Test Company") + self.assertRaises(frappe.ValidationError, self.make_sre(warehouse=group_wh).validate_group_warehouse) + self.make_sre().validate_group_warehouse() # leaf warehouse -> passes + + def test_get_serial_batch_entries_aggregates(self): + doc = self.make_sre(reservation_based_on="Serial and Batch") + doc.append("sb_entries", {"serial_no": "SN1"}) + doc.append("sb_entries", {"serial_no": "SN2"}) + doc.append("sb_entries", {"batch_no": "B1", "qty": 5}) + doc.append("sb_entries", {"batch_no": "B1", "qty": 3}) + + result = doc.get_serial_batch_entries() + self.assertEqual(result.serial_nos, ["SN1", "SN2"]) + self.assertEqual(result.batches["B1"], 8) From 8f96e5f2aada5f56427d7fd6e5e3809e9dcd836c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 17:03:51 +0530 Subject: [PATCH 123/400] test: replace lambda with nested def (ruff E731) --- .../serial_and_batch_bundle/test_serial_and_batch_bundle.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py index 213cb783271..4ad8a4f4136 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py @@ -1516,7 +1516,9 @@ class TestSerialandBatchBundleLogic(ERPNextTestSuite): self.assertEqual(agg["B2"], 5) def test_get_type_of_transaction_derives_direction(self): - se = lambda **kw: get_type_of_transaction(frappe._dict(doctype="Stock Entry"), frappe._dict(**kw)) + def se(**kw): + return get_type_of_transaction(frappe._dict(doctype="Stock Entry"), frappe._dict(**kw)) + self.assertEqual(se(s_warehouse="W"), "Outward") # issuing from a source warehouse self.assertEqual(se(), "Inward") # only a target warehouse self.assertEqual( From 3240411876ec5379ea242080d80d2e464c478b46 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 17:05:53 +0530 Subject: [PATCH 124/400] test: drop unused timedelta import --- erpnext/setup/doctype/email_digest/test_email_digest.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/erpnext/setup/doctype/email_digest/test_email_digest.py b/erpnext/setup/doctype/email_digest/test_email_digest.py index 655ca6a38a4..5ca1caf1d7b 100644 --- a/erpnext/setup/doctype/email_digest/test_email_digest.py +++ b/erpnext/setup/doctype/email_digest/test_email_digest.py @@ -1,8 +1,6 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from datetime import timedelta - import frappe from frappe.utils import add_days, getdate, now_datetime, today From ed7739274148aaa64cd6ea05be410d8ca567bad6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 17:07:31 +0530 Subject: [PATCH 125/400] test: also accept a mid-range rounding loss allowance --- .../test_exchange_rate_revaluation.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py index e4875ac4590..e794311c2cd 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py @@ -321,8 +321,9 @@ class TestExchangeRateRevaluationValidation(ERPNextTestSuite): for bad in (-0.1, 1, 1.5): doc = self._revaluation_with_rows([], rounding_loss_allowance=bad) self.assertRaises(frappe.ValidationError, doc.validate) - # a value inside [0, 1) is accepted - self._revaluation_with_rows([], rounding_loss_allowance=0.0).validate() + # values inside [0, 1) are accepted, at the lower bound and mid-range + for good in (0.0, 0.5): + self._revaluation_with_rows([], rounding_loss_allowance=good).validate() def test_gain_loss_computed_and_split_by_zero_balance(self): doc = self._revaluation_with_rows( From 008742bdbe906ba1f0d48870f59e40c2e9918464 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 17:08:27 +0530 Subject: [PATCH 126/400] test: exercise every mandatory field in the Stock Reservation Entry check --- .../test_stock_reservation_entry.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py index c912335c737..a8529efcd19 100644 --- a/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py +++ b/erpnext/stock/doctype/stock_reservation_entry/test_stock_reservation_entry.py @@ -984,8 +984,22 @@ class TestStockReservationEntryValidation(ERPNextTestSuite): def test_all_mandatory_fields_are_required(self): self.make_sre().validate_mandatory() # everything set -> passes - self.assertRaises(frappe.ValidationError, self.make_sre(reserved_qty=0).validate_mandatory) - self.assertRaises(frappe.ValidationError, self.make_sre(item_code=None).validate_mandatory) + # clearing any single mandatory field is rejected + mandatory = [ + "item_code", + "warehouse", + "voucher_type", + "voucher_no", + "voucher_detail_no", + "available_qty", + "voucher_qty", + "stock_uom", + "reserved_qty", + "company", + ] + for field in mandatory: + with self.subTest(field=field): + self.assertRaises(frappe.ValidationError, self.make_sre(**{field: None}).validate_mandatory) def test_amended_document_is_rejected(self): self.assertRaises(frappe.ValidationError, self.make_sre(amended_from="SRE-0001").validate_amended_doc) From dbc409736a4069d66d110da73aacd3bab1fac371 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 3 Jul 2026 17:02:32 +0530 Subject: [PATCH 127/400] refactor(test): row name based utility methods --- .../test_process_period_closing_voucher.py | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py index f34c1dbedfe..5de93ef1bdd 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py @@ -48,18 +48,27 @@ class TestProcessPeriodClosingVoucher(ERPNextTestSuite): ppcv.save() return ppcv - def set_processing_date_status(self, date, ppcv, rpt_type, parentfield, status): + def set_processing_date_status(self, row_name, status): frappe.db.set_value( "Process Period Closing Voucher Detail", - {"processing_date": date, "parent": ppcv, "report_type": rpt_type, "parentfield": parentfield}, + row_name, "status", status, ) - def get_processing_date_closing_balance(self, date, ppcv, rpt_type, parentfield): + def get_row_name(self, ppcv_name, rpt_type, parentfield): + return frappe.db.get_all( + "Process Period Closing Voucher Detail", + filters={"parent": ppcv_name, "report_type": rpt_type, "parentfield": parentfield}, + order_by="report_type, idx", + pluck="name", + limit=1, + )[0] + + def get_processing_date_closing_balance(self, row_name): return frappe.db.get_value( "Process Period Closing Voucher Detail", - {"processing_date": date, "parent": ppcv, "report_type": rpt_type, "parentfield": parentfield}, + row_name, "closing_balance", ) @@ -97,11 +106,10 @@ class TestProcessPeriodClosingVoucher(ERPNextTestSuite): parentfield = "normal_balances" rpt_type = "Profit and Loss" # status has to be set to 'Running' for logic to run - self.set_processing_date_status(today(), ppcv.name, rpt_type, parentfield, "Running") - process_individual_date(ppcv.name, today(), rpt_type, parentfield) - bal = frappe.parse_json( - self.get_processing_date_closing_balance(today(), ppcv.name, rpt_type, parentfield) - ) + row_name = self.get_row_name(ppcv.name, rpt_type, parentfield) + self.set_processing_date_status(row_name, "Running") + process_individual_date(ppcv.name, row_name, today(), rpt_type, parentfield) + bal = frappe.parse_json(self.get_processing_date_closing_balance(row_name)) self.assertEqual(len(bal), 1) expected_pl = { "account": "Sales - _TC", @@ -117,11 +125,10 @@ class TestProcessPeriodClosingVoucher(ERPNextTestSuite): # Balance sheet balance rpt_type = "Balance Sheet" - self.set_processing_date_status(today(), ppcv.name, rpt_type, parentfield, "Running") - process_individual_date(ppcv.name, today(), rpt_type, parentfield) - bal = frappe.parse_json( - self.get_processing_date_closing_balance(today(), ppcv.name, rpt_type, parentfield) - ) + row_name = self.get_row_name(ppcv.name, rpt_type, parentfield) + self.set_processing_date_status(row_name, "Running") + process_individual_date(ppcv.name, row_name, today(), rpt_type, parentfield) + bal = frappe.parse_json(self.get_processing_date_closing_balance(row_name)) self.assertEqual(len(bal), 1) expected_bs = { "account": "Debtors - _TC", @@ -138,11 +145,10 @@ class TestProcessPeriodClosingVoucher(ERPNextTestSuite): # Opening balance parentfield = "z_opening_balances" rpt_type = "Balance Sheet" - self.set_processing_date_status(today(), ppcv.name, rpt_type, parentfield, "Running") - process_individual_date(ppcv.name, today(), rpt_type, parentfield) - bal = frappe.parse_json( - self.get_processing_date_closing_balance(today(), ppcv.name, rpt_type, parentfield) - ) + row_name = self.get_row_name(ppcv.name, rpt_type, parentfield) + self.set_processing_date_status(row_name, "Running") + process_individual_date(ppcv.name, row_name, today(), rpt_type, parentfield) + bal = frappe.parse_json(self.get_processing_date_closing_balance(row_name)) self.assertEqual(len(bal), 2) opening_cash = next(x for x in bal if x["account"] == "Cash - _TC") expected_opening_cash = { From a9ffdac8062de9b2e2e68a9c457e9e96e8ced37b Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 3 Jul 2026 17:04:51 +0530 Subject: [PATCH 128/400] chore: linter fix --- .../process_period_closing_voucher.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py index 3a9d43544b0..d2cea78a8f0 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/process_period_closing_voucher.py @@ -128,7 +128,7 @@ def initialize_parallel_threads(docname: str): # keep transaction on PPCV and PPCVD short # prevents concurrency errors - REPEATABLE READ if not frappe.in_test: - frappe.db.commit() + frappe.db.commit() # nosemgrep else: frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") @@ -276,7 +276,7 @@ def schedule_next_date(docname: str): # keep transaction on PPCV and PPCVD short # prevents concurrency errors - REPEATABLE READ if not frappe.in_test: - frappe.db.commit() + frappe.db.commit() # nosemgrep frappe.enqueue( method="erpnext.accounts.doctype.process_period_closing_voucher.process_period_closing_voucher.process_individual_date", @@ -453,7 +453,7 @@ def summarize_and_post_ledger_entries(docname): # keep transaction on PPCV and PPCVD short # prevents concurrency errors - REPEATABLE READ if not frappe.in_test: - frappe.db.commit() + frappe.db.commit() # nosemgrep frappe.db.set_value("Period Closing Voucher", pcv.name, "gle_processing_status", "Completed") frappe.db.set_value("Process Period Closing Voucher", docname, "status", "Completed") @@ -604,7 +604,7 @@ def process_individual_date(docname: str, row_name, date, report_type, parentfie ) # commit heavy computation before touching PPCV or PPCVD if not frappe.in_test: - frappe.db.commit() + frappe.db.commit() # nosemgrep # chain call schedule_next_date(docname) From 9c911438f107a8441852d56af5f2bd14f00b510f Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Fri, 3 Jul 2026 17:17:38 +0530 Subject: [PATCH 129/400] fix: do not rebook standard cost variance on non-update-stock purchase invoice (#56799) --- .../purchase_invoice/services/gl_composer.py | 135 +----- .../item_standard_cost.json | 4 +- .../item_standard_cost/item_standard_cost.py | 78 +++- .../test_item_standard_cost.py | 390 ++++++++++++++++-- .../stock_entry/services/gl_composer.py | 132 ++++-- .../stock_reconciliation.js | 2 +- .../stock_reconciliation.py | 128 +++++- 7 files changed, 666 insertions(+), 203 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py b/erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py index f776994a29b..8524783b033 100644 --- a/erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py +++ b/erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py @@ -3,7 +3,6 @@ import frappe from frappe import _ -from frappe.query_builder.functions import Sum from frappe.utils import cint, flt, get_link_to_form import erpnext @@ -131,7 +130,6 @@ class PurchaseInvoiceGLComposer(BaseGLComposer): from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import ( get_purchase_document_details, ) - from erpnext.stock.utils import get_valuation_method doc = self.doc tax_service = TaxService(doc) @@ -331,33 +329,25 @@ class PurchaseInvoiceGLComposer(BaseGLComposer): self.make_provisional_gl_entry(gl_entries, item) if not doc.is_internal_transfer(): - handled = False - if ( - item.item_code - and item.item_code in stock_items - and item.get("purchase_receipt") - and not doc.is_return - and get_valuation_method(item.item_code, doc.company) == "Standard Cost" - ): - handled = self.make_standard_cost_srbnb_split( - gl_entries, item, expense_account, account_currency, base_amount - ) - - if not handled: - gl_entries.append( - self.get_gl_dict( - { - "account": expense_account, - "against": doc.supplier, - "debit": base_amount, - "debit_in_transaction_currency": amount, - "cost_center": item.cost_center, - "project": item.project or doc.project, - }, - account_currency, - item=item, - ) + # When Update Stock is disabled, this invoice has no stock impact: the linked + # Purchase Receipt already booked the stock (at standard) and the Purchase Price + # Variance. Here we only clear "Stock Received But Not Billed" at the full billed + # amount against the supplier - booking PPV again would double count it and leave + # SRBNB partially uncleared. + gl_entries.append( + self.get_gl_dict( + { + "account": expense_account, + "against": doc.supplier, + "debit": base_amount, + "debit_in_transaction_currency": amount, + "cost_center": item.cost_center, + "project": item.project or doc.project, + }, + account_currency, + item=item, ) + ) # check if the exchange rate has changed if ( @@ -530,95 +520,6 @@ class PurchaseInvoiceGLComposer(BaseGLComposer): }, ) - def make_standard_cost_srbnb_split( - self, gl_entries, item, expense_account, account_currency, base_amount - ): - """For a Standard Cost item billed against a Purchase Receipt, clear SRBNB at the standard - value the receipt actually booked and post the (Net Amount - standard) difference to the - Purchase Price Variance account. Returns False (caller falls back) if the receipt value - can't be resolved.""" - from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( - get_purchase_price_variance_account, - ) - - doc = self.doc - precision = item.precision("base_net_amount") - standard_value = flt(self.get_pr_stock_value(item), precision) - if not standard_value: - return False - - gl_entries.append( - self.get_gl_dict( - { - "account": expense_account, - "against": doc.supplier, - "debit": standard_value, - "debit_in_transaction_currency": flt(standard_value / doc.conversion_rate, precision), - "remarks": doc.get("remarks") or _("Accounting Entry for Stock"), - "cost_center": item.cost_center, - "project": item.project or doc.project, - }, - account_currency, - item=item, - ) - ) - - variance = flt(base_amount - standard_value, precision) - if variance: - gl_entries.append( - self.get_gl_dict( - { - "account": get_purchase_price_variance_account(item.item_code, doc.company), - "against": doc.supplier, - "debit": variance, - "debit_in_transaction_currency": flt(variance / doc.conversion_rate, precision), - "remarks": doc.get("remarks") or _("Purchase Price Variance"), - "cost_center": item.cost_center, - "project": item.project or doc.project, - }, - item=item, - ) - ) - - return True - - def get_pr_stock_value(self, item): - """Stock value (at standard) the linked Purchase Receipt booked for the quantity this invoice - row is billing. - - Accepted and rejected stock for the same receipt row share `voucher_detail_no`, so the - warehouse filter is required: without it the accepted warehouse's SRBNB would be cleared at - accepted + rejected value and post the wrong Purchase Price Variance amount. The accepted - warehouse is read from the receipt row itself (not the invoice row, which may be unset on a - non-stock invoice). - - The receipt's full accepted value is pro-rated to the invoiced quantity, so a partial bill - clears SRBNB (and posts PPV) for only the units it covers, not the whole receipt row.""" - pr_detail = frappe.db.get_value( - "Purchase Receipt Item", item.pr_detail, ["warehouse", "stock_qty"], as_dict=True - ) - if not pr_detail or not pr_detail.warehouse: - return 0.0 - - sle = frappe.qb.DocType("Stock Ledger Entry") - result = ( - frappe.qb.from_(sle) - .select(Sum(sle.stock_value_difference)) - .where( - (sle.voucher_type == "Purchase Receipt") - & (sle.voucher_no == item.purchase_receipt) - & (sle.voucher_detail_no == item.pr_detail) - & (sle.warehouse == pr_detail.warehouse) - & (sle.is_cancelled == 0) - ) - ).run() - accepted_value = flt(result[0][0]) if result and result[0][0] else 0.0 - if not accepted_value or not flt(pr_detail.stock_qty): - return accepted_value - - # Pro-rate to the quantity being billed by this invoice row (handles partial billing). - return accepted_value * flt(item.stock_qty) / flt(pr_detail.stock_qty) - def get_stock_variance_account(self, item): """For Standard Cost items the purchase-price-vs-standard difference is a Purchase Price Variance; for all other items it keeps the existing behaviour (default expense account).""" diff --git a/erpnext/stock/doctype/item_standard_cost/item_standard_cost.json b/erpnext/stock/doctype/item_standard_cost/item_standard_cost.json index 7a0e8ab85c9..10b1cbeecaa 100644 --- a/erpnext/stock/doctype/item_standard_cost/item_standard_cost.json +++ b/erpnext/stock/doctype/item_standard_cost/item_standard_cost.json @@ -73,7 +73,7 @@ "label": "Revaluation" }, { - "description": "Stock Reconciliation auto-created to revalue on-hand stock to the new standard rate.", + "description": "Stock Reconciliation that revalues on-hand stock to this standard rate: auto-created when the rate is changed here, or the reconciliation that captured this rate (opening entry or rate change).", "fieldname": "revaluation_entry", "fieldtype": "Link", "label": "Revaluation Entry", @@ -95,7 +95,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-06-26 11:00:00.000000", + "modified": "2026-07-02 11:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Item Standard Cost", diff --git a/erpnext/stock/doctype/item_standard_cost/item_standard_cost.py b/erpnext/stock/doctype/item_standard_cost/item_standard_cost.py index 8450d10791e..62fb8e02903 100644 --- a/erpnext/stock/doctype/item_standard_cost/item_standard_cost.py +++ b/erpnext/stock/doctype/item_standard_cost/item_standard_cost.py @@ -91,13 +91,75 @@ class ItemStandardCost(Document): # previous (or missing) rate earlier in the request, so the revaluation below — and anything # else in this request — reads the newly submitted rate. clear_item_standard_rate_cache() + + # When a Stock Reconciliation captured this rate (opening entry or rate change), it has set + # revaluation_entry to itself and performs the revaluation. Don't spawn another one. + if self.revaluation_entry: + return + self.create_revaluation_entry() def before_cancel(self): - frappe.throw( - _("Item Standard Cost cannot be cancelled. Submit a new record to change the standard rate.") + self.validate_no_stock_activity_on_or_after_effective_date() + + def has_stock_activity_on_or_after_effective_date(self): + """Is there any live stock transaction for this item on or after the effective date, other than + the revaluation Stock Reconciliation this record created? Such transactions are valued at this + standard rate, so this record cannot be safely cancelled while they exist.""" + sle = frappe.qb.DocType("Stock Ledger Entry") + query = ( + frappe.qb.from_(sle) + .select(sle.name) + .where( + (sle.item_code == self.item_code) + & (sle.company == self.company) + & (sle.is_cancelled == 0) + # posting_datetime (indexed) is preferred over posting_date; get_datetime on the date gives + # the start of the effective date, so this matches everything on or after it. + & (sle.posting_datetime >= get_datetime(self.effective_date)) + ) + .limit(1) ) + # The revaluation reco this record created posts on the effective date; exclude it, it is + # reversed together with this document in on_cancel. + if self.revaluation_entry: + query = query.where(sle.voucher_no != self.revaluation_entry) + + return bool(query.run()) + + def validate_no_stock_activity_on_or_after_effective_date(self): + """A submitted Item Standard Cost can be cancelled only when no stock transaction exists for the + item on or after its effective date, other than the revaluation Stock Reconciliation it created. + Later transactions are valued at this standard rate, so cancelling it would corrupt their + valuation and force a repost.""" + if self.has_stock_activity_on_or_after_effective_date(): + frappe.throw( + _( + "Item Standard Cost cannot be cancelled because stock transactions exist for Item {0} on or after the Effective Date {1}. Cancel those transactions first." + ).format( + get_link_to_form("Item", self.item_code), + frappe.bold(frappe.format(self.effective_date, "Date")), + ) + ) + + def on_cancel(self): + # Drop the cached standard rate first: this record is now cancelled, so the revaluation reversal + # below (and anything else in this request) must re-read the previous effective rate, not this one. + clear_item_standard_rate_cache() + + # Set when this cancellation was triggered by the source reconciliation itself (it is already + # cancelling); reversing revaluation_entry would loop back into that same reconciliation. + if self.flags.from_source_reconciliation: + return + + # Reverse the revaluation this record created. + if self.revaluation_entry: + reco = frappe.get_doc("Stock Reconciliation", self.revaluation_entry) + if reco.docstatus == 1: + reco.flags.via_item_standard_cost = True + reco.cancel() + def create_revaluation_entry(self): """Revalue on-hand stock to the new standard rate via a Stock Reconciliation. @@ -230,6 +292,18 @@ def get_item_standard_rate(item_code, company, posting_date=None): return flt(rate[0]) if rate else None +def has_item_standard_cost(item_code, company): + """True if a submitted Item Standard Cost exists for the item in the company (any effective date). + Used to tell an opening Stock Reconciliation (no standard rate yet, rate is editable) apart from a + later one (standard rate owned by Item Standard Cost, only quantity may be adjusted).""" + return bool( + frappe.db.exists( + "Item Standard Cost", + {"item_code": item_code, "company": company, "docstatus": 1}, + ) + ) + + def clear_item_standard_rate_cache(): """Drop the request-cached results of `get_item_standard_rate` so reads after a new Item Standard Cost is submitted see the fresh rate instead of a value cached earlier in the same request.""" diff --git a/erpnext/stock/doctype/item_standard_cost/test_item_standard_cost.py b/erpnext/stock/doctype/item_standard_cost/test_item_standard_cost.py index 597b978b17b..a4029cffe18 100644 --- a/erpnext/stock/doctype/item_standard_cost/test_item_standard_cost.py +++ b/erpnext/stock/doctype/item_standard_cost/test_item_standard_cost.py @@ -232,29 +232,252 @@ class TestItemStandardCost(ERPNextTestSuite): self.assertFalse(frappe.db.exists("Repost Item Valuation", {"voucher_no": se0.name})) - def test_cannot_cancel(self): + def test_cancel_allowed_without_stock_activity(self): + # No stock transaction on/after the effective date -> the standard cost can be cancelled. item = create_standard_cost_item() isc = create_item_standard_cost(item.name, rate=100) + isc.cancel() + self.assertEqual(isc.docstatus, 2) + + def test_cancel_blocked_with_stock_activity(self): + # A stock transaction on/after the effective date is valued at this standard rate, so the + # standard cost cannot be cancelled while it exists. + item = create_standard_cost_item() + isc = create_item_standard_cost(item.name, rate=100) + make_stock_entry(item_code=item.name, target=TEST_WAREHOUSE, qty=5, basic_rate=100) self.assertRaises(frappe.ValidationError, isc.cancel) - def test_direct_stock_reconciliation_blocked(self): + def test_cancel_reverses_revaluation(self): + # Cancelling a rate change reverses the revaluation Stock Reconciliation it created, restoring + # the previous stock value (the movement that triggered it predates the effective date). + item = create_standard_cost_item() + create_item_standard_cost(item.name, rate=100, effective_date=add_days(today(), -10)) + make_stock_entry( + item_code=item.name, + target=TEST_WAREHOUSE, + qty=10, + basic_rate=100, + posting_date=add_days(today(), -5), + ) + + isc2 = create_item_standard_cost(item.name, rate=130, effective_date=today()) + self.assertTrue(isc2.revaluation_entry) + + def stock_value(): + return flt( + frappe.db.get_value( + "Bin", {"item_code": item.name, "warehouse": TEST_WAREHOUSE}, "stock_value" + ) + ) + + self.assertEqual(stock_value(), 1300) + + isc2.cancel() + self.assertEqual(frappe.db.get_value("Stock Reconciliation", isc2.revaluation_entry, "docstatus"), 2) + self.assertEqual(stock_value(), 1000) + + def test_stock_reconciliation_rate_change_creates_standard_cost(self): + # Editing the rate on a reconciliation creates a new Item Standard Cost and revalues on-hand + # stock to it - the reconciliation is a shortcut into the standard cost, not a manual override. + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import get_item_standard_rate from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( create_stock_reconciliation, ) item = create_standard_cost_item() - create_item_standard_cost(item.name, rate=100) - make_stock_entry(item_code=item.name, target=TEST_WAREHOUSE, qty=10, basic_rate=100) + create_item_standard_cost( + item.name, rate=100, company=PI_COMPANY, effective_date=add_days(today(), -10) + ) + make_stock_entry( + item_code=item.name, + to_warehouse=PI_STORES, + company=PI_COMPANY, + qty=10, + basic_rate=100, + posting_date=add_days(today(), -5), + ) + # Same quantity, new rate 130: a new standard cost is set and the 10 on-hand units revalue to 1300. + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=10, rate=130, company=PI_COMPANY + ) + self.assertEqual(reco.docstatus, 1) + + self.assertEqual(flt(get_item_standard_rate(item.name, PI_COMPANY)), 130) + stock_value = frappe.db.get_value( + "Bin", {"item_code": item.name, "warehouse": PI_STORES}, "stock_value" + ) + self.assertEqual(flt(stock_value), 1300) + + def test_stock_reconciliation_qty_change_allowed(self): + # A reconciliation may adjust the quantity of a Standard Cost item: stock stays valued at the + # standard rate and the value difference is booked to the Stock Adjustment account. + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() + create_item_standard_cost(item.name, rate=100, company=PI_COMPANY) + make_stock_entry( + item_code=item.name, to_warehouse=PI_STORES, company=PI_COMPANY, qty=10, basic_rate=100 + ) + + # Count down to 8 at the standard rate: value 800, a 200 reduction against Stock Adjustment. + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=8, rate=100, company=PI_COMPANY + ) + self.assertEqual(reco.docstatus, 1) + + bin_data = frappe.db.get_value( + "Bin", + {"item_code": item.name, "warehouse": PI_STORES}, + ["actual_qty", "stock_value"], + as_dict=True, + ) + self.assertEqual(flt(bin_data.actual_qty), 8) + self.assertEqual(flt(bin_data.stock_value), 800) + + sle = frappe.db.get_value( + "Stock Ledger Entry", {"voucher_no": reco.name, "is_cancelled": 0}, "valuation_rate" + ) + self.assertEqual(flt(sle), 100) + + stock_adjustment = frappe.get_cached_value("Company", PI_COMPANY, "stock_adjustment_account") + booked = flt( + frappe.db.sql( + "select sum(debit - credit) from `tabGL Entry` where voucher_no=%s and account=%s and is_cancelled=0", + (reco.name, stock_adjustment), + )[0][0] + ) + self.assertEqual(booked, 200) + + def test_opening_reconciliation_creates_standard_cost(self): + # With no Item Standard Cost yet, an opening Stock Reconciliation may set the rate; that rate is + # captured into an Item Standard Cost record so the resulting stock (and later transactions) are + # valued at it. + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( + get_item_standard_rate, + has_item_standard_cost, + ) + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() + self.assertFalse(has_item_standard_cost(item.name, PI_COMPANY)) + + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=5, rate=100, company=PI_COMPANY + ) + self.assertEqual(reco.docstatus, 1) + + # The opening rate is now the item's standard cost. + self.assertTrue(has_item_standard_cost(item.name, PI_COMPANY)) + self.assertEqual(flt(get_item_standard_rate(item.name, PI_COMPANY)), 100) + + bin_data = frappe.db.get_value( + "Bin", + {"item_code": item.name, "warehouse": PI_STORES}, + ["actual_qty", "stock_value"], + as_dict=True, + ) + self.assertEqual(flt(bin_data.actual_qty), 5) + self.assertEqual(flt(bin_data.stock_value), 500) + + def test_opening_reconciliation_requires_rate(self): + # An opening reconciliation for a Standard Cost item with no standard rate yet must carry a + # positive rate - there is nothing to value the stock at otherwise. + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() self.assertRaises( frappe.ValidationError, create_stock_reconciliation, item_code=item.name, - warehouse=TEST_WAREHOUSE, - qty=8, - rate=120, + warehouse=PI_STORES, + qty=5, + rate=0, + company=PI_COMPANY, ) + def test_opening_reconciliation_points_standard_cost_to_itself(self): + # The captured Item Standard Cost records the reconciliation as its revaluation entry (the reco is + # the revaluation) instead of spawning a second one. + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=5, rate=100, company=PI_COMPANY + ) + + isc = frappe.db.get_value( + "Item Standard Cost", + {"item_code": item.name, "company": PI_COMPANY, "docstatus": 1}, + "revaluation_entry", + ) + self.assertEqual(isc, reco.name) + + def test_opening_reconciliation_cancel_cancels_standard_cost(self): + # Cancelling an opening reconciliation removes the stock it created, so the Item Standard Cost it + # introduced is cancelled too. + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import has_item_standard_cost + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=5, rate=100, company=PI_COMPANY + ) + isc_name = frappe.db.get_value( + "Item Standard Cost", {"item_code": item.name, "company": PI_COMPANY, "docstatus": 1}, "name" + ) + + reco.cancel() + + self.assertEqual(frappe.db.get_value("Item Standard Cost", isc_name, "docstatus"), 2) + self.assertFalse(has_item_standard_cost(item.name, PI_COMPANY)) + + def test_rate_change_reconciliation_cancel_reverts_standard_cost(self): + # A rate-change reconciliation revalues on-hand stock only on/after its effective date, and that + # revaluation is reversed on cancel. The pre-existing stock sits before the effective date, so no + # live SLE is valued at the new rate once the reco's own entry is reversed. Cancelling therefore + # cancels the Item Standard Cost it created and the item falls back to the previous standard rate. + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import get_item_standard_rate + from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import ( + create_stock_reconciliation, + ) + + item = create_standard_cost_item() + create_item_standard_cost( + item.name, rate=100, company=PI_COMPANY, effective_date=add_days(today(), -10) + ) + make_stock_entry( + item_code=item.name, + to_warehouse=PI_STORES, + company=PI_COMPANY, + qty=10, + basic_rate=100, + posting_date=add_days(today(), -5), + ) + + reco = create_stock_reconciliation( + item_code=item.name, warehouse=PI_STORES, qty=10, rate=130, company=PI_COMPANY + ) + isc_name = frappe.db.get_value("Item Standard Cost", {"revaluation_entry": reco.name}, "name") + self.assertTrue(isc_name) + self.assertEqual(flt(get_item_standard_rate(item.name, PI_COMPANY)), 130) + + reco.cancel() + + # The revaluation is reverted, so the standard cost it created is cancelled and the rate reverts. + self.assertEqual(frappe.db.get_value("Item Standard Cost", isc_name, "docstatus"), 2) + self.assertEqual(flt(get_item_standard_rate(item.name, PI_COMPANY)), 100) + def test_backdated_transaction_blocked(self): item = create_standard_cost_item() create_item_standard_cost(item.name, rate=100, effective_date=today()) @@ -364,6 +587,40 @@ class TestItemStandardCost(ERPNextTestSuite): # The additional cost is credited out of its source account (it flowed into the variance). self.assertEqual(gl_net(additional_cost_account), -30) + def test_manufacturing_variance_no_stock_adjustment_entry(self): + # With an additional cost in the mix, the net-zero Stock Adjustment reclassification must not + # survive as a debit == credit entry: only the real accounts (variance, additional cost source, + # stock) should be booked. + ensure_mfg_variance_account(PI_COMPANY) + additional_cost_account = "Expenses Included In Valuation - TCP1" + stock_adjustment = frappe.get_cached_value("Company", PI_COMPANY, "stock_adjustment_account") + rm = create_standard_cost_item() + fg = create_standard_cost_item() + create_item_standard_cost(rm.name, rate=50, company=PI_COMPANY) + create_item_standard_cost(fg.name, rate=200, company=PI_COMPANY) + + make_stock_entry(item_code=rm.name, to_warehouse=PI_STORES, company=PI_COMPANY, qty=10, basic_rate=50) + + se = frappe.new_doc("Stock Entry") + se.purpose = "Repack" + se.stock_entry_type = "Repack" + se.company = PI_COMPANY + se.append("items", {"item_code": rm.name, "s_warehouse": PI_STORES, "qty": 5}) + se.append("items", {"item_code": fg.name, "t_warehouse": PI_FG, "qty": 1, "is_finished_item": 1}) + se.append( + "additional_costs", + {"expense_account": additional_cost_account, "description": "Freight", "amount": 30}, + ) + se.insert() + se.submit() + + # No Stock Adjustment entry at all - the difference is entirely the manufacturing variance. + self.assertFalse( + frappe.db.exists( + "GL Entry", {"voucher_no": se.name, "account": stock_adjustment, "is_cancelled": 0} + ) + ) + def test_manufacturing_variance_account_required(self): # Without a Manufacturing Variance account, submitting a Standard Cost Manufacture/Repack must fail. previous = frappe.get_cached_value("Company", PI_COMPANY, "default_manufacturing_variance_account") @@ -484,43 +741,6 @@ class TestItemStandardCost(ERPNextTestSuite): # The submit must have invalidated the cache, so this reads the freshly submitted rate. self.assertEqual(flt(get_item_standard_rate(item.name, TEST_COMPANY)), 100) - def test_pr_stock_value_excludes_rejected_warehouse(self): - # Accepted and rejected stock for one receipt row share voucher_detail_no. The standard-cost - # SRBNB split must clear only the accepted warehouse's value, not accepted + rejected. - from erpnext.accounts.doctype.purchase_invoice.services.gl_composer import ( - PurchaseInvoiceGLComposer, - ) - from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt - from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse - - item = create_standard_cost_item() - create_item_standard_cost(item.name, rate=100, company=PI_COMPANY) - - rejected_warehouse = create_warehouse("_Test SC Rejected Warehouse", company=PI_COMPANY) - - # Receive 10 accepted + 2 rejected at a billed rate of 150; both SLEs value at the standard 100. - pr = make_purchase_receipt( - item_code=item.name, - company=PI_COMPANY, - warehouse=PI_STORES, - qty=10, - rejected_qty=2, - rejected_warehouse=rejected_warehouse, - rate=150, - ) - - # Method body uses only `item`, so it can be called unbound. - def pr_value(stock_qty): - mock_item = frappe._dict( - purchase_receipt=pr.name, pr_detail=pr.items[0].name, stock_qty=stock_qty - ) - return flt(PurchaseInvoiceGLComposer.get_pr_stock_value(None, mock_item)) - - # Billing all 10: accepted only (10 * 100), not accepted + rejected (12 * 100). - self.assertEqual(pr_value(10), 1000) - # Billing only 4 of the 10 accepted units: pro-rated to the invoiced qty (4 * 100). - self.assertEqual(pr_value(4), 400) - def test_pr_books_variance_to_ppv_account(self): # Receiving a Standard Cost item at a rate above the standard must book the difference to the # Purchase Price Variance account, not the default expense (COGS) account. @@ -571,6 +791,88 @@ class TestItemStandardCost(ERPNextTestSuite): frappe.db.set_value("Company", PI_COMPANY, "default_purchase_price_variance_account", previous) frappe.clear_cache(doctype="Company") + def test_pi_without_update_stock_does_not_rebook_variance(self): + # The Purchase Receipt already booked the 70 variance to PPV. Billing it with a Purchase Invoice + # that has Update Stock disabled must only clear "Stock Received But Not Billed" at the full billed + # amount (200) - it must NOT re-book the variance to the Purchase Price Variance account. + from erpnext.stock.doctype.purchase_receipt.mapper import make_purchase_invoice + from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt + + ppv_account = ensure_ppv_account(PI_COMPANY) + srbnb_account = frappe.get_cached_value("Company", PI_COMPANY, "stock_received_but_not_billed") + + item = create_standard_cost_item() + create_item_standard_cost(item.name, rate=130, company=PI_COMPANY) + + pr = make_purchase_receipt( + item_code=item.name, company=PI_COMPANY, warehouse=PI_STORES, qty=1, rate=200 + ) + + pi = make_purchase_invoice(pr.name) + self.assertEqual(pi.update_stock, 0) + pi.submit() + + def booked(account): + return flt( + frappe.db.sql( + "select sum(debit - credit) from `tabGL Entry` where voucher_no=%s and account=%s and is_cancelled=0", + (pi.name, account), + )[0][0] + ) + + # No variance re-booked on the invoice; SRBNB is fully cleared at the billed value. + self.assertEqual(booked(ppv_account), 0) + self.assertEqual(booked(srbnb_account), 200) + + def test_material_receipt_books_variance_to_ppv(self): + # Receiving a Standard Cost item via Material Receipt at a manual basic rate (200) plus an + # additional cost (100) must value stock at the standard 130 and book the rest to the Purchase + # Price Variance account: (200*10 + 100) - 130*10 = 800. + ppv_account = ensure_ppv_account(PI_COMPANY) + additional_cost_account = "Expenses Included In Valuation - TCP1" + item = create_standard_cost_item() + create_item_standard_cost(item.name, rate=130, company=PI_COMPANY) + + se = frappe.new_doc("Stock Entry") + se.purpose = "Material Receipt" + se.stock_entry_type = "Material Receipt" + se.company = PI_COMPANY + se.append( + "items", + { + "item_code": item.name, + "t_warehouse": PI_STORES, + "qty": 10, + "basic_rate": 200, + }, + ) + se.append( + "additional_costs", + {"expense_account": additional_cost_account, "description": "Freight", "amount": 100}, + ) + se.insert() + se.submit() + + # Stock is valued at the standard rate, not the manual 200 + additional cost. + sle = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_no": se.name, "is_cancelled": 0}, + ["valuation_rate", "stock_value_difference"], + as_dict=True, + ) + self.assertEqual(flt(sle.valuation_rate), 130) + self.assertEqual(flt(sle.stock_value_difference), 1300) + + def booked(account): + return flt( + frappe.db.sql( + "select sum(debit - credit) from `tabGL Entry` where voucher_no=%s and account=%s and is_cancelled=0", + (se.name, account), + )[0][0] + ) + + self.assertEqual(booked(ppv_account), 800) + def test_revaluation_posted_after_same_day_movement(self): # A movement earlier on the effective date must not end up after the revaluation, otherwise the # reco would backdate the current quantity ahead of it. diff --git a/erpnext/stock/doctype/stock_entry/services/gl_composer.py b/erpnext/stock/doctype/stock_entry/services/gl_composer.py index f8b93d765ec..2893a239329 100644 --- a/erpnext/stock/doctype/stock_entry/services/gl_composer.py +++ b/erpnext/stock/doctype/stock_entry/services/gl_composer.py @@ -39,11 +39,15 @@ class StockEntryGLComposer(BaseStockGLComposer): self._append_lcv_gl_entries(gl_entries, inventory_account_map) if doc.purpose in ("Repack", "Manufacture"): - self._append_manufacturing_variance_gl_entries(gl_entries) + self._append_manufacturing_variance_gl_entries(gl_entries, inventory_account_map) + elif doc.purpose == "Material Receipt": + self._append_receipt_variance_gl_entries(gl_entries) return process_gl_map(gl_entries, from_repost=frappe.flags.through_repost_item_valuation) - def _append_manufacturing_variance_gl_entries(self, gl_entries: list) -> None: + def _append_manufacturing_variance_gl_entries( + self, gl_entries: list, inventory_account_map: dict + ) -> None: """For Standard Cost finished goods produced via Manufacture/Repack, stock is booked at the item's standard rate, while the entry consumes raw-material (plus additional/landed) cost. The difference is a manufacturing variance and is reclassified from the finished good's expense account to the @@ -52,10 +56,62 @@ class StockEntryGLComposer(BaseStockGLComposer): # Reuse the SLE map the base composer already fetched in compose() to avoid a second identical query. sle_map = self._sle_map + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( + get_manufacturing_variance_account, + ) + for d in self.doc.get("items"): variance = self._get_finished_good_variance(d, sle_map, precision) if variance: - self._append_manufacturing_variance_pair(gl_entries, d, variance) + account = get_manufacturing_variance_account(d.item_code, self.doc.company) + remarks = self.doc.get("remarks") or _("Manufacturing Variance for {0}").format(d.item_code) + self._append_standard_cost_variance_pair( + gl_entries, d, variance, account, remarks, inventory_account_map + ) + + def _append_receipt_variance_gl_entries(self, gl_entries: list) -> None: + """For a Standard Cost item received via Material Receipt, stock is booked at the item's standard + rate while the row may carry a manually-set basic rate plus additional/landed cost. The gap + between that intended cost and the standard value is a purchase price variance, reclassified from + the item's expense account to the Purchase Price Variance account.""" + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( + get_purchase_price_variance_account, + ) + + precision = self.get_debit_field_precision() + sle_map = self._sle_map + + for d in self.doc.get("items"): + variance = self._get_receipt_variance(d, sle_map, precision) + if variance: + account = get_purchase_price_variance_account(d.item_code, self.doc.company) + remarks = self.doc.get("remarks") or _("Purchase Price Variance for {0}").format(d.item_code) + self._append_standard_cost_variance_pair(gl_entries, d, variance, account, remarks) + + def _get_receipt_variance(self, item, sle_map, precision) -> float: + """Purchase price variance for a Standard Cost item on a Material Receipt: the gap between the full + computed incoming cost (basic amount + additional cost + LCV, i.e. ``amount``) and the standard + value booked into stock. 0 for anything that is not a plain Standard Cost receipt row.""" + from erpnext.stock.utils import get_valuation_method + + if not item.t_warehouse or item.s_warehouse: + return 0.0 + + if ( + item.get("is_finished_item") + or item.get("secondary_item_type") + or item.get("is_legacy_scrap_item") + ): + return 0.0 + + if get_valuation_method(item.item_code, self.doc.company) != "Standard Cost": + return 0.0 + + standard_value = sum( + flt(sle.stock_value_difference) for sle in sle_map.get(item.name, []) if flt(sle.actual_qty) > 0 + ) + + return flt(flt(item.amount) - standard_value, precision) def _get_finished_good_variance(self, item, sle_map, precision) -> float: """Manufacturing variance for a Standard Cost finished good: the gap between the full computed @@ -77,19 +133,27 @@ class StockEntryGLComposer(BaseStockGLComposer): return flt(flt(item.amount) - standard_value, precision) - def _append_manufacturing_variance_pair(self, gl_entries: list, item, variance: float) -> None: - """Reclassify ``variance`` from the finished good's expense account to its Manufacturing Variance - account, restoring the expense account to the value it would carry without Standard Cost.""" - from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( - get_manufacturing_variance_account, - ) - + def _append_standard_cost_variance_pair( + self, + gl_entries: list, + item, + variance: float, + variance_account: str, + remarks: str, + inventory_account_map: dict | None = None, + ) -> None: + """Reclassify ``variance`` from the item's expense account to the given variance account, + restoring the expense account to the value it would carry without Standard Cost.""" doc = self.doc - variance_account = get_manufacturing_variance_account(item.item_code, doc.company) cost_center = item.cost_center or frappe.get_cached_value("Company", doc.company, "cost_center") - remarks = doc.get("remarks") or _("Manufacturing Variance for {0}").format(item.item_code) project = item.project or doc.get("project") + inventory_account = None + if inventory_account_map: + inventory_account = doc.get_inventory_account_dict(item, inventory_account_map, "t_warehouse")[ + "account" + ] + gl_entries.append( self.get_gl_dict( { @@ -107,7 +171,7 @@ class StockEntryGLComposer(BaseStockGLComposer): self.get_gl_dict( { "account": item.expense_account, - "against": variance_account, + "against": inventory_account or variance_account, "cost_center": cost_center, "remarks": remarks, "debit": -1 * variance, @@ -142,6 +206,11 @@ class StockEntryGLComposer(BaseStockGLComposer): return item_account_wise_additional_cost + def get_valuation_method(self, item_code: str) -> str: + from erpnext.stock.utils import get_valuation_method + + return get_valuation_method(item_code, self.doc.company) + def _append_additional_cost_gl_entries( self, gl_entries: list, item_account_wise_additional_cost: dict ) -> None: @@ -170,18 +239,33 @@ class StockEntryGLComposer(BaseStockGLComposer): ) ) - gl_entries.append( - self.get_gl_dict( - { - "account": d.expense_account, - "against": account, - "cost_center": d.cost_center, - "remarks": doc.get("remarks") or _("Accounting Entry for Stock"), - "credit": -1 * amount["base_amount"], - }, - item=d, + if self.get_valuation_method(d.item_code) == "Standard Cost": + gl_entries.append( + self.get_gl_dict( + { + "account": d.expense_account, + "against": account, + "cost_center": d.cost_center, + "remarks": doc.get("remarks") or _("Accounting Entry for Stock"), + "debit": flt(amount["base_amount"]), + }, + item=d, + ) + ) + + else: + gl_entries.append( + self.get_gl_dict( + { + "account": d.expense_account, + "against": account, + "cost_center": d.cost_center, + "remarks": doc.get("remarks") or _("Accounting Entry for Stock"), + "credit": -1 * flt(amount["base_amount"]), + }, + item=d, + ) ) - ) def _append_lcv_gl_entries(self, gl_entries: list, inventory_account_map: dict) -> None: doc = self.doc diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js index ef4672899cc..3cbd52ffa22 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js @@ -6,7 +6,7 @@ frappe.provide("erpnext.accounts.dimensions"); frappe.ui.form.on("Stock Reconciliation", { setup(frm) { - frm.ignore_doctypes_on_cancel_all = ["Serial and Batch Bundle"]; + frm.ignore_doctypes_on_cancel_all = ["Serial and Batch Bundle", "Item Standard Cost"]; frm.barcode_scanner = new erpnext.utils.BarcodeScanner({ frm: frm, uom_field: "stock_uom", diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index 5bba06f9a67..e63a6334829 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -114,12 +114,73 @@ class StockReconciliation(StockController): ) def on_submit(self): + self.set_standard_cost_from_reconciliation() self.make_bundle_for_current_qty() self.make_bundle_using_old_serial_batch_fields() self.update_stock_ledger() self.make_gl_entries() self.repost_future_sle_and_gle() + def set_standard_cost_from_reconciliation(self): + if self.flags.via_item_standard_cost: + return + + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import ( + get_item_standard_rate, + has_item_standard_cost, + ) + + created = set() + for item in self.items: + if not item.item_code or item.item_code in created: + continue + if not is_standard_cost_item(item.item_code, self.company) or not flt(item.valuation_rate): + continue + + if has_item_standard_cost(item.item_code, self.company): + standard_rate = get_item_standard_rate(item.item_code, self.company, self.posting_date) + precision = item.precision("valuation_rate") + if flt(item.valuation_rate, precision) == flt(standard_rate, precision): + # Rate unchanged: a plain quantity adjustment, valued at the existing standard rate. + continue + + isc = frappe.new_doc("Item Standard Cost") + isc.item_code = item.item_code + isc.company = self.company + isc.effective_date = self.posting_date + isc.standard_rate = item.valuation_rate + isc.revaluation_entry = self.name + isc.insert() + isc.submit() + created.add(item.item_code) + + def cancel_created_item_standard_cost(self): + if self.flags.via_item_standard_cost: + return + + records = frappe.get_all( + "Item Standard Cost", + filters={ + "revaluation_entry": self.name, + "docstatus": 1, + "creation": [">", self.creation], + }, + fields=["name", "item_code", "company"], + ) + for record in records: + isc = frappe.get_doc("Item Standard Cost", record.name) + + # This runs after make_sle_on_cancel has already marked this reco's SLEs is_cancelled=1, so + # the only remaining activity on/after the effective date is genuine later stock (receipts, + # issues) valued at this standard rate. Skip those — cancelling would corrupt their valuation. + # Checking on-hand Bin qty instead would falsely skip a plain rate change, whose on-hand qty + # reverts on cancellation, silently leaving the standard rate out of sync with every SLE. + if isc.has_stock_activity_on_or_after_effective_date(): + continue + + isc.flags.from_source_reconciliation = True + isc.cancel() + def on_cancel(self): self.validate_reserved_stock() self.ignore_linked_doctypes = ( @@ -127,11 +188,14 @@ class StockReconciliation(StockController): "Stock Ledger Entry", "Repost Item Valuation", "Serial and Batch Bundle", + "Item Standard Cost", ) + self.make_sle_on_cancel() self.make_gl_entries_on_cancel() self.repost_future_sle_and_gle() self.delete_auto_created_batches() + self.cancel_created_item_standard_cost() def make_bundle_for_current_qty(self): from erpnext.stock.serial_batch_bundle import SerialBatchCreation @@ -174,19 +238,45 @@ class StockReconciliation(StockController): ) def validate_standard_cost_items(self): - """Stock Reconciliation is not allowed for Standard Cost items — their rate is changed - only through the Item Standard Cost doctype (which creates the revaluation reco itself).""" + """Validate the Standard Cost rows of the reconciliation. + + For a Standard Cost item the valuation rate is owned by Item Standard Cost, so a reconciliation + is primarily a quantity adjustment (the value difference is booked to Stock Adjustment at the + standard rate). Two things it may do with the rate, handled on submit: + - opening entry (no Item Standard Cost yet): the entered rate sets the item's standard cost + (set_standard_cost_for_opening_items); + - rate change (rate differs from the current standard): a new Item Standard Cost is created, + which revalues on-hand stock (apply_standard_cost_rate_changes). + + Here we only guard the inputs: an opening row needs a positive rate, and because a standard cost + is company-wide, all rows for the same item must carry the same rate.""" if self.flags.via_item_standard_cost: return + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import has_item_standard_cost + + rates = {} for item in self.items: - if item.item_code and is_standard_cost_item(item.item_code, self.company): + if not item.item_code or not is_standard_cost_item(item.item_code, self.company): + continue + + if not has_item_standard_cost(item.item_code, self.company) and flt(item.valuation_rate) <= 0: + # Opening entry with no standard cost yet: there is no rate to value the stock at. frappe.throw( _( - "Row #{0}: Stock Reconciliation is not allowed for Item {1}, which uses the Standard Cost valuation method. Change its rate through Item Standard Cost instead." + "Row #{0}: Enter a Valuation Rate for Item {1} to set up its opening Standard Cost." ).format(item.idx, get_link_to_form("Item", item.item_code)) ) + if flt(item.valuation_rate): + rate = flt(item.valuation_rate, item.precision("valuation_rate")) + if rates.setdefault(item.item_code, rate) != rate: + frappe.throw( + _( + "Row #{0}: Valuation Rate for Item {1} must be the same across all rows, as it is the item's company-wide Standard Cost." + ).format(item.idx, get_link_to_form("Item", item.item_code)) + ) + def set_current_serial_and_batch_bundle(self, voucher_detail_no=None, save=False) -> None: """Set Serial and Batch Bundle for each item""" for item in self.items: @@ -196,9 +286,9 @@ class StockReconciliation(StockController): if not item.item_code: continue - # Standard Cost revaluation recos are pure value changes: qty is unchanged and the SLE is - # revalued at the standard rate, so no serial/batch bundle is created (see update_stock_ledger, - # which routes these rows through the single revaluation SLE path). + # A Standard Cost item is valued at the standard rate regardless of serial/batch, so no + # serial/batch bundle is created; update_stock_ledger routes these rows through the single + # SLE path (qty may change, valuation always comes from the standard rate). if is_standard_cost_item(item.item_code, self.company): continue @@ -452,7 +542,7 @@ class StockReconciliation(StockController): if not item.item_code: continue - # Standard Cost revaluation recos are pure value changes; no serial/batch bundle needed. + # Standard Cost items are valued at the standard rate; no serial/batch bundle needed. if is_standard_cost_item(item.item_code, self.company): continue @@ -576,8 +666,8 @@ class StockReconciliation(StockController): if item.valuation_rate is None: item.valuation_rate = item_dict.get("rate") - # Standard Cost items are revalued by rate only; don't pull serial nos onto the row, or a - # serial/batch bundle would be built for what must stay a pure value-change SLE. + # Standard Cost items are valued at the standard rate; don't pull serial nos onto the row, + # or a serial/batch bundle would be built for what stays a single standard-rate SLE. if item_dict.get("serial_nos") and not is_standard_cost_item(item.item_code, self.company): item.current_serial_no = item_dict.get("serial_nos") if self.purpose == "Stock Reconciliation" and not item.serial_no and item.qty: @@ -794,9 +884,9 @@ class StockReconciliation(StockController): "Item", row.item_code, ["has_serial_no", "has_batch_no"], as_dict=1 ) - # A Standard Cost item is revalued by rate alone (qty unchanged, valuation from the standard - # rate), so even a serialized/batched one is posted through the single revaluation SLE path - # without a serial/batch bundle, the same as a non-serial item. + # A Standard Cost item is always valued at the standard rate (qty may change, the rate does + # not), so even a serialized/batched one is posted through the single SLE path without a + # serial/batch bundle, the same as a non-serial item. if (item.has_serial_no or item.has_batch_no) and not is_standard_cost_item( row.item_code, self.company ): @@ -1460,6 +1550,18 @@ def get_stock_balance_for( ) ) + # For a Standard Cost item with no on-hand stock to derive a rate from (an opening entry, or an + # empty warehouse), default the rate to the standard rate effective on the posting date so the form + # shows it. When stock already exists, the balance rate is already the standard rate, so it is left + # alone - overriding it with the (possibly just-changed) standard rate would hide a real value change + # from remove_items_with_no_change. + if not rate and company and is_standard_cost_item(item_code, company): + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import get_item_standard_rate + + standard_rate = get_item_standard_rate(item_code, company, posting_date) + if standard_rate is not None: + rate = standard_rate + return { "qty": qty, "rate": rate, From 8c7b2f4d3cd374d1e51e083e850c7a71de0fbd06 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Fri, 3 Jul 2026 18:25:01 +0530 Subject: [PATCH 130/400] fix: clear stray permission message when item dashboard has no warehouse access --- erpnext/stock/dashboard/item_dashboard.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/dashboard/item_dashboard.py b/erpnext/stock/dashboard/item_dashboard.py index 2acf8e3bbf3..9f628f8152f 100644 --- a/erpnext/stock/dashboard/item_dashboard.py +++ b/erpnext/stock/dashboard/item_dashboard.py @@ -17,6 +17,9 @@ def get_data( sort_order: str = "desc", ): """Return data to render the item dashboard""" + if not frappe.has_permission("Bin", "read"): + return [] + filters = [] if item_code: filters.append(["item_code", "=", item_code]) @@ -44,7 +47,10 @@ def get_data( if build_match_conditions("Warehouse", user=frappe.session.user): filters.append(["warehouse", "in", [w.name for w in frappe.get_list("Warehouse")]]) except frappe.PermissionError: - # user does not have access on warehouse + # user does not have access on warehouse; build_match_conditions already queued a + # "Not permitted" message via frappe.throw before this was caught, drop it so the + # client doesn't show a spurious error for a request that's failing gracefully here + frappe.clear_last_message() return [] items = frappe.db.get_all( From ef794f390cde3d5666aa8aa5f13d9f9049246553 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Fri, 3 Jul 2026 18:25:08 +0530 Subject: [PATCH 131/400] fix: skip item prices tab render for users without item price read access --- erpnext/stock/doctype/item/item.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 5eb7f07f4bd..b9b4eeaabba 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -828,6 +828,13 @@ $.extend(erpnext.item, { render_item_prices: function (frm) { if (frm.doc.__islocal) return; + + if (!frappe.model.can_read("Item Price")) { + frm.toggle_display("prices_html", false); + return; + } + frm.toggle_display("prices_html", true); + const requested_item = frm.doc.name; const container = frm.fields_dict["prices_html"].$wrapper; From 341a07dffac6144c7c7c69deeb5ac71fd9929895 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Fri, 3 Jul 2026 18:47:13 +0530 Subject: [PATCH 132/400] fix: restrict state-changing whitelisted endpoints to POST (#56858) Add methods=["POST"] to 50 whitelisted functions that create or modify documents (get_doc followed by insert/save/submit), so they can no longer be invoked via GET requests. Co-authored-by: Claude Fable 5 --- erpnext/accounts/doctype/bank_account/bank_account.py | 2 +- .../bank_reconciliation_tool.py | 10 +++++----- .../doctype/bank_transaction/bank_transaction.py | 2 +- .../bank_transaction/bank_transaction_upload.py | 2 +- .../bisect_accounting_statements.py | 6 +++--- erpnext/accounts/doctype/budget/budget.py | 2 +- .../cheque_print_template/cheque_print_template.py | 2 +- .../doctype/payment_request/payment_request.py | 2 +- erpnext/assets/doctype/location/location.py | 2 +- erpnext/buying/doctype/request_for_quotation/mapper.py | 2 +- .../doctype/supplier_scorecard/supplier_scorecard.py | 2 +- erpnext/controllers/accounts_controller.py | 2 +- erpnext/controllers/stock_controller.py | 2 +- erpnext/crm/doctype/lead/lead.py | 2 +- erpnext/crm/doctype/lead/mapper.py | 2 +- erpnext/crm/doctype/opportunity/mapper.py | 2 +- erpnext/crm/doctype/opportunity/opportunity.py | 2 +- .../doctype/plaid_settings/plaid_settings.py | 4 ++-- erpnext/manufacturing/doctype/work_order/work_order.py | 2 +- .../manufacturing/doctype/workstation/workstation.py | 4 ++-- erpnext/projects/doctype/project/project.py | 4 ++-- erpnext/projects/doctype/task/task.py | 6 +++--- .../doctype/quality_procedure/quality_procedure.py | 2 +- erpnext/selling/doctype/customer/customer.py | 2 +- erpnext/selling/doctype/sales_order/mapper.py | 2 +- erpnext/selling/page/point_of_sale/point_of_sale.py | 4 ++-- erpnext/setup/doctype/company/company.py | 4 ++-- erpnext/setup/doctype/department/department.py | 2 +- erpnext/setup/doctype/employee/employee.py | 2 +- erpnext/stock/doctype/batch/batch.py | 2 +- .../stock/doctype/material_request/material_request.py | 2 +- erpnext/stock/doctype/warehouse/warehouse.py | 2 +- .../stock_and_account_value_comparison.py | 2 +- .../stock_ledger_invariant_check.py | 2 +- .../doctype/subcontracting_receipt/mapper.py | 2 +- erpnext/support/doctype/issue/issue.py | 4 ++-- .../service_level_agreement/service_level_agreement.py | 2 +- erpnext/telephony/doctype/call_log/call_log.py | 2 +- 38 files changed, 52 insertions(+), 52 deletions(-) diff --git a/erpnext/accounts/doctype/bank_account/bank_account.py b/erpnext/accounts/doctype/bank_account/bank_account.py index 4c968d5791c..c5ccb70b6f8 100644 --- a/erpnext/accounts/doctype/bank_account/bank_account.py +++ b/erpnext/accounts/doctype/bank_account/bank_account.py @@ -188,7 +188,7 @@ def get_closing_balance_as_per_statement(bank_account: str, date: str): return {"balance": 0, "date": None} -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_closing_balance_as_per_statement(bank_account: str, date: str | datetime.date, balance: float): """ Set the closing balance as per statement for a bank account and date diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py index e84136a04c8..38c81232252 100644 --- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py +++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py @@ -116,7 +116,7 @@ def get_account_balance(bank_account: str, till_date: str | date, company: str): return flt(balance_as_per_system) - flt(total_debit) + flt(total_credit) + amounts_not_reflected_in_system -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def update_bank_transaction( bank_transaction_name: str, reference_number: str, party_type: str | None = None, party: str | None = None ): @@ -146,7 +146,7 @@ def update_bank_transaction( )[0] -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_journal_entry_bts( bank_transaction_name: str, reference_number: str | None = None, @@ -305,7 +305,7 @@ def create_journal_entry_bts( return reconcile_vouchers(bank_transaction_name, vouchers, is_new_voucher=True) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_payment_entry_bts( bank_transaction_name: str, reference_number: str | None = None, @@ -500,7 +500,7 @@ def create_bulk_internal_transfer(bank_transaction_names: list[str | int], bank_ return output -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_internal_transfer( bank_transaction_name: str | int, posting_date: str | date, @@ -1057,7 +1057,7 @@ def get_auto_reconcile_message(partially_reconciled, reconciled): return alert_message, indicator -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def reconcile_vouchers(bank_transaction_name: str | int, vouchers: str | list, is_new_voucher: bool = False): # updated clear date of all the vouchers based on the bank transaction vouchers = frappe.parse_json(vouchers) diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py index 4ab7db2301f..255d0b86894 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py @@ -397,7 +397,7 @@ def unreconcile_transaction(transaction_name: str | int): frappe.get_doc(voucher["doctype"], voucher["name"]).cancel() -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def unreconcile_transaction_entry(bank_transaction_id: str | int, voucher_type: str, voucher_id: str | int): """ Removes a single payment entry from a bank transaction - for example only undoing one voucher instead of undoing the entire transaction diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py index 2f88410fc26..813f4ad3589 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py @@ -34,7 +34,7 @@ def upload_bank_statement(): return {"columns": columns, "data": data} -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_bank_entries(columns: str, data: str | list, bank_account: str): header_map = get_header_mapping(columns, bank_account) diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py index ad3adadc4d6..d75b60443fa 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py @@ -184,7 +184,7 @@ class BisectAccountingStatements(Document): self.get_report_summary() self.update_node() - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def bisect_left(self): if self.current_node is not None: cur_node = frappe.get_doc("Bisect Nodes", self.current_node) @@ -198,7 +198,7 @@ class BisectAccountingStatements(Document): else: frappe.msgprint(_("No more children on Left")) - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def bisect_right(self): if self.current_node is not None: cur_node = frappe.get_doc("Bisect Nodes", self.current_node) @@ -212,7 +212,7 @@ class BisectAccountingStatements(Document): else: frappe.msgprint(_("No more children on Right")) - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def move_up(self): if self.current_node is not None: cur_node = frappe.get_doc("Bisect Nodes", self.current_node) diff --git a/erpnext/accounts/doctype/budget/budget.py b/erpnext/accounts/doctype/budget/budget.py index 01f6b172b73..bceffd3627d 100644 --- a/erpnext/accounts/doctype/budget/budget.py +++ b/erpnext/accounts/doctype/budget/budget.py @@ -878,7 +878,7 @@ def get_fiscal_year_date_range(from_fiscal_year, to_fiscal_year): return from_year.year_start_date, to_year.year_end_date -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def revise_budget(budget_name: str): old_budget = frappe.get_doc("Budget", budget_name) diff --git a/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py b/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py index 2b8ce01faea..97cdaf1915e 100644 --- a/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py +++ b/erpnext/accounts/doctype/cheque_print_template/cheque_print_template.py @@ -46,7 +46,7 @@ class ChequePrintTemplate(Document): pass -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_or_update_cheque_print_format(template_name: str): frappe.only_for("System Manager") diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 26d5c2ce833..5b6a56e69c3 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -718,7 +718,7 @@ class PaymentRequest(Document): row_number += TO_SKIP_NEW_ROW -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_payment_request(**args): """Make payment request""" diff --git a/erpnext/assets/doctype/location/location.py b/erpnext/assets/doctype/location/location.py index c6c999c4dbd..a34484f195a 100644 --- a/erpnext/assets/doctype/location/location.py +++ b/erpnext/assets/doctype/location/location.py @@ -224,7 +224,7 @@ def get_children(doctype: str, parent: str | None = None, location: str | None = ) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args diff --git a/erpnext/buying/doctype/request_for_quotation/mapper.py b/erpnext/buying/doctype/request_for_quotation/mapper.py index 77e9f02db85..cef58ad1bb6 100644 --- a/erpnext/buying/doctype/request_for_quotation/mapper.py +++ b/erpnext/buying/doctype/request_for_quotation/mapper.py @@ -55,7 +55,7 @@ def make_supplier_quotation_from_rfq( # This method is used to make supplier quotation from supplier's portal. -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_supplier_quotation(doc: str | Document | dict): doc = frappe.parse_json(doc) diff --git a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py index 26e41c8ac76..82abbb3ae09 100644 --- a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py +++ b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py @@ -185,7 +185,7 @@ def refresh_scorecards(): frappe.get_doc("Supplier Scorecard", sc_name).save() -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_all_scorecards(docname: str): sc = frappe.get_doc("Supplier Scorecard", docname) supplier = frappe.get_doc("Supplier", sc.supplier) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index e03ab72a7e1..6b477471db7 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1724,7 +1724,7 @@ def get_missing_company_details(doctype: str, docname: str): } -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def update_company_master_and_address(current_doctype: str, name: str, company: str, details: dict | str): from frappe.utils import validate_email_address diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 0fe4ada4e5c..733a7160da8 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -653,7 +653,7 @@ def check_item_quality_inspection(doctype: str, docstatus: str | int, items: str return [item for item in items if item.get("item_code") in inspection_required_items] -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_quality_inspections( company: str, doctype: str, docname: str, items: str | list, inspection_type: str ): diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 5757d20c824..18afd630636 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -380,7 +380,7 @@ def get_lead_with_phone_number(number): return lead -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_lead_to_prospect(lead: str, prospect: str): prospect = frappe.get_doc("Prospect", prospect) prospect.append("leads", {"lead": lead}) diff --git a/erpnext/crm/doctype/lead/mapper.py b/erpnext/crm/doctype/lead/mapper.py index c6e7df52557..85726e08a04 100644 --- a/erpnext/crm/doctype/lead/mapper.py +++ b/erpnext/crm/doctype/lead/mapper.py @@ -110,7 +110,7 @@ def make_quotation(source_name: str, target_doc: str | Document | None = None): return target_doc -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_lead_from_communication(communication: str, ignore_communication_links: bool = False): """raise a issue from email""" diff --git a/erpnext/crm/doctype/opportunity/mapper.py b/erpnext/crm/doctype/opportunity/mapper.py index e1bdf9a73cd..775aacd86ca 100644 --- a/erpnext/crm/doctype/opportunity/mapper.py +++ b/erpnext/crm/doctype/opportunity/mapper.py @@ -124,7 +124,7 @@ def make_supplier_quotation(source_name: str, target_doc: str | Document | None return doclist -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_opportunity_from_communication( communication: str, company: str, ignore_communication_links: bool = False ): diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 5932a35cde4..93d35a7facf 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -389,7 +389,7 @@ def get_item_details(item_code: str): } -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_multiple_status(names: str | list[str], status: str): names = frappe.parse_json(names) for name in names: diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py index bcab065bba4..a88340e6cee 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py @@ -50,7 +50,7 @@ def get_plaid_configuration(): return "disabled" -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_institution(token: str, response: str | dict): response = frappe.parse_json(response) @@ -79,7 +79,7 @@ def add_institution(token: str, response: str | dict): return bank -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_bank_accounts(response: str | dict, bank: str | dict, company: str): response = frappe.parse_json(response) bank = frappe.parse_json(bank) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 22da1a1d989..72ee04f8b17 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -1070,7 +1070,7 @@ def get_bom_operations(doctype: str, txt: str, searchfield: str, start: int, pag return frappe.get_all("BOM Operation", filters=filters, fields=["operation"], as_list=1) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_work_order_ops(name: str): po = frappe.get_doc("Work Order", name) po.set_work_order_operations() diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py index ab75ac8ef94..8069a476e15 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation.py +++ b/erpnext/manufacturing/doctype/workstation/workstation.py @@ -223,7 +223,7 @@ class Workstation(Document): return schedule_date - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def start_job(self, job_card: str, from_time: DateTimeLikeObject, employee: str): doc = frappe.get_doc("Job Card", job_card) doc.check_permission("write") @@ -233,7 +233,7 @@ class Workstation(Document): return doc - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def complete_job(self, job_card: str, qty: float, to_time: DateTimeLikeObject): doc = frappe.get_doc("Job Card", job_card) doc.check_permission("submit") diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 2b567ce44e1..14c4345ea78 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -628,7 +628,7 @@ def allow_to_make_project_update(project, time, frequency): return True -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_duplicate_project(prev_doc: str | dict, project_name: str): """Create duplicate project based on the old project""" import json @@ -779,7 +779,7 @@ def create_kanban_board_if_not_exists(project: str): return True -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_project_status(project: str, status: str): """ set status for project and all related tasks diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index c431af5cf11..3218cd49e1e 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -369,7 +369,7 @@ def get_project(doctype: str, txt: str, searchfield: str, start: int, page_len: ) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_multiple_status(names: str | list, status: str): names = frappe.parse_json(names) for name in names: @@ -451,7 +451,7 @@ def get_children( return tasks -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args @@ -465,7 +465,7 @@ def add_node(): frappe.get_doc(args).insert() -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_multiple_tasks(data: str | list, parent: str): data = frappe.parse_json(data) new_doc = {"doctype": "Task", "parent_task": parent if parent != "All Tasks" else ""} diff --git a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py index 41e4412f799..41aba7acabf 100644 --- a/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py +++ b/erpnext/quality_management/doctype/quality_procedure/quality_procedure.py @@ -148,7 +148,7 @@ def get_children( ) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index a1592d89f1e..fd16c5d7aed 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -196,7 +196,7 @@ class Customer(TransactionBase): if sum(member.allocated_percentage or 0 for member in self.sales_team) != 100: frappe.throw(_("Total contribution percentage should be equal to 100")) - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def get_customer_group_details(self): doc = frappe.get_doc("Customer Group", self.customer_group) self.accounts = [] diff --git a/erpnext/selling/doctype/sales_order/mapper.py b/erpnext/selling/doctype/sales_order/mapper.py index 5cd85b3bd6a..a9eccdd4424 100644 --- a/erpnext/selling/doctype/sales_order/mapper.py +++ b/erpnext/selling/doctype/sales_order/mapper.py @@ -840,7 +840,7 @@ def set_delivery_date(items: list, sales_order: str) -> None: item.schedule_date = delivery_by_bundle.get(item.product_bundle) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_work_orders(items: str | dict, sales_order: str, company: str, project: str | None = None): """Make Work Orders against the given Sales Order for the given `items`""" items = frappe.parse_json(items).get("items") diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.py b/erpnext/selling/page/point_of_sale/point_of_sale.py index bd96ae38cc9..39621ff9fb0 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.py +++ b/erpnext/selling/page/point_of_sale/point_of_sale.py @@ -347,7 +347,7 @@ def check_opening_entry(user: str): return open_vouchers -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_opening_voucher(pos_profile: str, company: str, balance_details: str | list): balance_details = frappe.parse_json(balance_details) @@ -438,7 +438,7 @@ def get_past_order_list(search_term: str, status: str, limit: int = 20): return invoice_list -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def set_customer_info(fieldname: str, customer: str, value: str = ""): customer_doc = frappe.get_doc("Customer", customer) customer_doc.check_permission("write") diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 5774d2cf09a..420804a552f 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -1007,7 +1007,7 @@ def get_children(doctype: str, parent: str | None = None, company: str | None = ) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args @@ -1118,7 +1118,7 @@ def get_billing_shipping_address( return {"primary_address": primary_address, "shipping_address": shipping_address} -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_transaction_deletion_request(company: str): frappe.only_for("System Manager") diff --git a/erpnext/setup/doctype/department/department.py b/erpnext/setup/doctype/department/department.py index a92c77f249d..6eda9e3510d 100644 --- a/erpnext/setup/doctype/department/department.py +++ b/erpnext/setup/doctype/department/department.py @@ -95,7 +95,7 @@ def get_children( return frappe.get_all("Department", fields=fields, filters=filters, order_by="name") -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index ca13ae74b92..8a9ad025314 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -432,7 +432,7 @@ def deactivate_sales_person(status: str, employee: str): frappe.db.set_value("Sales Person", sales_person, "enabled", 0) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_user(employee: str, email: str | None = None, create_user_permission: int = 0) -> str: emp = frappe.get_doc("Employee", employee) emp.check_permission("write") diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index 59fdd3bc0a1..4d20b25b0f7 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -301,7 +301,7 @@ def get_batches_by_oldest(item_code: str, warehouse: str): return batches_dates -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def split_batch(batch_no: str, item_code: str, warehouse: str, qty: float, new_batch_id: str | None = None): """Split the batch into a new batch""" batch = frappe.get_doc(doctype="Batch", item=item_code, batch_id=new_batch_id).insert() diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 1eb6b87e45b..219b8cee584 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -511,7 +511,7 @@ def get_material_requests_based_on_supplier( return material_requests -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def raise_work_orders(material_request: str, company: str): mr = frappe.get_doc("Material Request", material_request) errors = [] diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index 1e2d84d1b11..8a289c29591 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -191,7 +191,7 @@ def get_children( return frappe.get_list(doctype, fields=fields, filters=filters, order_by="name") -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_node(): from frappe.desk.treeview import make_tree_args diff --git a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py index d30f37211aa..b0684835c76 100644 --- a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py +++ b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py @@ -182,7 +182,7 @@ def get_columns(filters): ] -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_reposting_entries(rows: str | list, company: str): if isinstance(rows, str): rows = parse_json(rows) diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py index 02bdcf17cd8..db69923aeac 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py @@ -306,7 +306,7 @@ def get_columns(): ] -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def create_reposting_entries(rows: str | list, item_code: str | None = None, warehouse: str | None = None): if isinstance(rows, str): rows = parse_json(rows) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py b/erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py index bf5fbd5775a..bb8101a6e17 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/mapper.py @@ -22,7 +22,7 @@ def make_subcontract_return(source_name: str, target_doc: Document | str | None return make_return_doc("Subcontracting Receipt", source_name, target_doc) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_purchase_receipt( source_name: Document | str, target_doc: Document | str | None = None, diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index adf46d0d7a2..92c698e7c00 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -117,7 +117,7 @@ class Issue(Document): communication.flags.ignore_mandatory = True communication.save() - @frappe.whitelist() + @frappe.whitelist(methods=["POST"]) def split_issue(self, subject: str, communication_id: str): from copy import deepcopy @@ -273,7 +273,7 @@ def make_task(source_name: str, target_doc: str | Document | None = None): return get_mapped_doc("Issue", source_name, {"Issue": {"doctype": "Task"}}, target_doc) -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def make_issue_from_communication(communication: str, ignore_communication_links: bool = False): """raise a issue from email""" diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py index 4565ecde755..0359a6712b9 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py @@ -779,7 +779,7 @@ def get_response_and_resolution_duration(doc): return priority -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def reset_service_level_agreement(doctype: str, docname: str, reason: str, user: str): if not frappe.db.get_single_value("Support Settings", "allow_resetting_service_level_agreement"): frappe.throw(_("Allow Resetting Service Level Agreement from Support Settings.")) diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py index c932eb515db..488af305e9a 100644 --- a/erpnext/telephony/doctype/call_log/call_log.py +++ b/erpnext/telephony/doctype/call_log/call_log.py @@ -127,7 +127,7 @@ class CallLog(Document): self.employee_user_id = employees[0].get("user_id") -@frappe.whitelist() +@frappe.whitelist(methods=["POST"]) def add_call_summary_and_call_type(call_log: str, summary: str, call_type: str): doc = frappe.get_doc("Call Log", call_log) doc.type_of_call = call_type From 7b0c35caaf59aa7372dc8c672deebf045ca8ac8b Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Fri, 3 Jul 2026 20:23:33 +0530 Subject: [PATCH 133/400] fix: auto fetch serial no from previous operation output (#56445) * fix: auto fetch serial no from previous operation output * fix: order by * fix: warehouse for operations --- .../manufacturing/doctype/job_card/mapper.py | 5 + .../doctype/job_card/test_job_card.py | 297 +++++++++++++++++- .../doctype/work_order/services/operations.py | 23 ++ .../doctype/work_order/work_order.py | 4 + .../stock_entry/services/manufacturing.py | 135 ++++++++ .../stock_entry_type/stock_entry_type.py | 10 +- 6 files changed, 470 insertions(+), 4 deletions(-) diff --git a/erpnext/manufacturing/doctype/job_card/mapper.py b/erpnext/manufacturing/doctype/job_card/mapper.py index 0155229df3a..8c3a63a1d9a 100644 --- a/erpnext/manufacturing/doctype/job_card/mapper.py +++ b/erpnext/manufacturing/doctype/job_card/mapper.py @@ -86,6 +86,10 @@ def make_material_request(source_name: str, target_doc: Document | str | None = @frappe.whitelist() def make_stock_entry(source_name: str, target_doc: Document | str | None = None): + from erpnext.stock.doctype.stock_entry.services.manufacturing import ( + set_previous_operation_serial_batch, + ) + def update_item(source, target, source_parent): target.t_warehouse = source_parent.wip_warehouse @@ -125,6 +129,7 @@ def make_stock_entry(source_name: str, target_doc: Document | str | None = None) wo_allows_alternate_item and frappe.get_cached_value("Item", item.item_code, "allow_alternative_item") ) + set_previous_operation_serial_batch(target, item) doclist = get_mapped_doc( "Job Card", diff --git a/erpnext/manufacturing/doctype/job_card/test_job_card.py b/erpnext/manufacturing/doctype/job_card/test_job_card.py index 518c13450cd..bf10aa0e3f0 100644 --- a/erpnext/manufacturing/doctype/job_card/test_job_card.py +++ b/erpnext/manufacturing/doctype/job_card/test_job_card.py @@ -1061,6 +1061,9 @@ class TestJobCard(ERPNextTestSuite): job_card.submit() for row in fg_bom.items: + if row.item_code == sfg.name: + continue + make_stock_entry( item_code=row.item_code, target="Stores - _TC", @@ -1071,9 +1074,301 @@ class TestJobCard(ERPNextTestSuite): manufacturing_entry = frappe.get_doc(job_card.make_stock_entry_for_semi_fg_item()) manufacturing_entry.submit() + sfg_row = next(row for row in manufacturing_entry.items if row.item_code == sfg.name) + self.assertEqual(flt(sfg_row.basic_rate, 3), 95.0) + self.assertEqual(manufacturing_entry.items[2].item_code, scrap2.name) self.assertEqual(manufacturing_entry.items[2].qty, 9) - self.assertEqual(flt(manufacturing_entry.items[2].basic_rate, 3), 5.556) + self.assertEqual(flt(manufacturing_entry.items[2].basic_rate, 3), 5.278) + + def test_semi_fg_batch_auto_pull_on_manufacture(self): + """Batch produced by an operation should auto-pull into the next operation's + semi-finished consumption row (skip-transfer Manufacture entry).""" + from erpnext.manufacturing.doctype.operation.test_operation import make_operation + from erpnext.stock.doctype.item.test_item import make_item + from erpnext.stock.serial_batch_bundle import get_batches_from_bundle + + frappe.db.set_value("UOM", "Nos", "must_be_whole_number", 0) + frappe.db.set_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order", 0) + warehouse = "Stores - _TC" + + rm1 = make_item("Auto Pull RM 1", {"is_stock_item": 1}).name + rm2 = make_item("Auto Pull RM 2", {"is_stock_item": 1}).name + fg1 = make_item("Auto Pull FG 1", {"is_stock_item": 1}).name + sfg = make_item( + "Auto Pull SFG 1", + { + "is_stock_item": 1, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "AP-SFG-.#####", + }, + ).name + + sfg_bom = frappe.new_doc("BOM", company="_Test Company", item=sfg, quantity=1) + sfg_bom.append("items", {"item_code": rm1, "qty": 1}) + sfg_bom.insert() + sfg_bom.submit() + + fg_bom = frappe.new_doc( + "BOM", + company="_Test Company", + item=fg1, + quantity=1, + with_operations=1, + track_semi_finished_goods=1, + ) + fg_bom.append("items", {"item_code": rm2, "qty": 1}) + + operation1 = { + "operation": "Auto Pull Op A", + "workstation": "_Test Workstation A", + "finished_good": sfg, + "bom_no": sfg_bom.name, + "finished_good_qty": 1, + "sequence_id": 1, + "time_in_mins": 60, + "source_warehouse": warehouse, + "fg_warehouse": warehouse, + "skip_material_transfer": 1, + } + operation2 = { + "operation": "Auto Pull Op B", + "workstation": "_Test Workstation A", + "finished_good": fg1, + "finished_good_qty": 1, + "is_final_finished_good": 1, + "sequence_id": 2, + "time_in_mins": 60, + "source_warehouse": warehouse, + "fg_warehouse": warehouse, + "skip_material_transfer": 1, + } + + make_workstation(operation1) + make_operation(operation1) + make_operation(operation2) + + fg_bom.append("operations", operation1) + fg_bom.append("operations", operation2) + fg_bom.append("items", {"item_code": sfg, "qty": 1, "uom": "Nos", "operation_row_id": 2}) + fg_bom.insert() + fg_bom.submit() + + work_order = make_wo_order_test_record( + item=fg1, + qty=5, + source_warehouse=warehouse, + fg_warehouse=warehouse, + bom_no=fg_bom.name, + skip_transfer=1, + do_not_save=True, + ) + work_order.operations[0].time_in_mins = 60 + work_order.operations[1].time_in_mins = 60 + work_order.save() + work_order.submit() + + make_stock_entry(item_code=rm1, target=warehouse, qty=10, basic_rate=100) + make_stock_entry(item_code=rm2, target=warehouse, qty=10, basic_rate=100) + + # Operation A -> produces the SFG batch + jc_a = frappe.get_doc( + "Job Card", + frappe.db.get_value( + "Job Card", {"work_order": work_order.name, "operation": "Auto Pull Op A"}, "name" + ), + ) + jc_a.append( + "time_logs", + { + "from_time": "2024-01-01 08:00:00", + "to_time": "2024-01-01 09:00:00", + "completed_qty": jc_a.for_quantity, + }, + ) + jc_a.submit() + me_a = frappe.get_doc(jc_a.make_stock_entry_for_semi_fg_item()) + me_a.submit() + + me_a.reload() + sfg_fg_row = next(r for r in me_a.items if r.is_finished_item and r.item_code == sfg) + self.assertTrue(sfg_fg_row.serial_and_batch_bundle) + produced_batches = get_batches_from_bundle(sfg_fg_row.serial_and_batch_bundle) + + # Operation B -> consumes the SFG; its batch should be auto-pulled from Operation A + jc_b = frappe.get_doc( + "Job Card", + frappe.db.get_value( + "Job Card", {"work_order": work_order.name, "operation": "Auto Pull Op B"}, "name" + ), + ) + jc_b.append( + "time_logs", + { + "from_time": "2024-02-01 08:00:00", + "to_time": "2024-02-01 09:00:00", + "completed_qty": jc_b.for_quantity, + }, + ) + jc_b.submit() + me_b = frappe.get_doc(jc_b.make_stock_entry_for_semi_fg_item()) + + sfg_consume_row = next(r for r in me_b.items if r.item_code == sfg and r.s_warehouse) + self.assertTrue( + sfg_consume_row.serial_and_batch_bundle, + "Previous operation's batch was not auto-pulled into the semi-finished consumption row", + ) + consumed_batches = get_batches_from_bundle(sfg_consume_row.serial_and_batch_bundle) + self.assertEqual(set(consumed_batches.keys()), set(produced_batches.keys())) + + def test_semi_fg_auto_pull_with_uom_conversion(self): + from erpnext.manufacturing.doctype.operation.test_operation import make_operation + from erpnext.stock.doctype.item.test_item import make_item + from erpnext.stock.doctype.stock_entry.services.manufacturing import ( + set_previous_operation_serial_batch, + ) + from erpnext.stock.serial_batch_bundle import get_batches_from_bundle + + frappe.db.set_value("UOM", "Nos", "must_be_whole_number", 0) + frappe.db.set_single_value("Manufacturing Settings", "make_serial_no_batch_from_work_order", 0) + warehouse = "Stores - _TC" + + rm1 = make_item("UOM Pull RM 1", {"is_stock_item": 1}).name + rm2 = make_item("UOM Pull RM 2", {"is_stock_item": 1}).name + fg1 = make_item("UOM Pull FG 1", {"is_stock_item": 1}).name + sfg = make_item( + "UOM Pull SFG 1", + { + "is_stock_item": 1, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "UP-SFG-.#####", + "uoms": [{"uom": "Box", "conversion_factor": 5}], + }, + ).name + + sfg_bom = frappe.new_doc("BOM", company="_Test Company", item=sfg, quantity=1) + sfg_bom.append("items", {"item_code": rm1, "qty": 1}) + sfg_bom.insert() + sfg_bom.submit() + + fg_bom = frappe.new_doc( + "BOM", + company="_Test Company", + item=fg1, + quantity=1, + with_operations=1, + track_semi_finished_goods=1, + ) + fg_bom.append("items", {"item_code": rm2, "qty": 1}) + + operation1 = { + "operation": "UOM Pull Op A", + "workstation": "_Test Workstation A", + "finished_good": sfg, + "bom_no": sfg_bom.name, + "finished_good_qty": 1, + "sequence_id": 1, + "time_in_mins": 60, + "source_warehouse": warehouse, + "fg_warehouse": warehouse, + "skip_material_transfer": 1, + } + operation2 = { + "operation": "UOM Pull Op B", + "workstation": "_Test Workstation A", + "finished_good": fg1, + "finished_good_qty": 1, + "is_final_finished_good": 1, + "sequence_id": 2, + "time_in_mins": 60, + "source_warehouse": warehouse, + "fg_warehouse": warehouse, + "skip_material_transfer": 1, + } + + make_workstation(operation1) + make_operation(operation1) + make_operation(operation2) + + fg_bom.append("operations", operation1) + fg_bom.append("operations", operation2) + fg_bom.append("items", {"item_code": sfg, "qty": 1, "uom": "Nos", "operation_row_id": 2}) + fg_bom.insert() + fg_bom.submit() + + work_order = make_wo_order_test_record( + item=fg1, + qty=5, + source_warehouse=warehouse, + fg_warehouse=warehouse, + bom_no=fg_bom.name, + skip_transfer=1, + do_not_save=True, + ) + work_order.operations[0].time_in_mins = 60 + work_order.operations[1].time_in_mins = 60 + work_order.save() + work_order.submit() + + make_stock_entry(item_code=rm1, target=warehouse, qty=10, basic_rate=100) + make_stock_entry(item_code=sfg, target=warehouse, qty=5, basic_rate=100, posting_date="2024-01-01") + + jc_a = frappe.get_doc( + "Job Card", + frappe.db.get_value( + "Job Card", {"work_order": work_order.name, "operation": "UOM Pull Op A"}, "name" + ), + ) + jc_a.append( + "time_logs", + { + "from_time": "2024-02-01 08:00:00", + "to_time": "2024-02-01 09:00:00", + "completed_qty": jc_a.for_quantity, + }, + ) + jc_a.submit() + me_a = frappe.get_doc(jc_a.make_stock_entry_for_semi_fg_item()) + me_a.submit() + me_a.reload() + + sfg_fg_row = next(r for r in me_a.items if r.is_finished_item and r.item_code == sfg) + produced_batches = get_batches_from_bundle(sfg_fg_row.serial_and_batch_bundle) + + se = frappe.new_doc("Stock Entry") + se.company = "_Test Company" + se.purpose = "Material Transfer" + se.work_order = work_order.name + se.set_stock_entry_type() + row = se.append( + "items", + { + "item_code": sfg, + "qty": 1, + "uom": "Box", + "conversion_factor": 5, + "s_warehouse": warehouse, + "t_warehouse": "_Test Warehouse - _TC", + }, + ) + set_previous_operation_serial_batch(se, row) + + self.assertTrue(row.serial_and_batch_bundle) + self.assertEqual( + abs(frappe.db.get_value("Serial and Batch Bundle", row.serial_and_batch_bundle, "total_qty")), + 5.0, + ) + + se.save() + se.submit() + se.reload() + + row = se.items[0] + consumed_batches = get_batches_from_bundle(row.serial_and_batch_bundle) + self.assertEqual(set(consumed_batches.keys()), set(produced_batches.keys())) + self.assertEqual(abs(sum(consumed_batches.values())), 5.0) def test_secondary_items_without_sfg(self): for row in frappe.get_doc("BOM", self.work_order.bom_no).items: diff --git a/erpnext/manufacturing/doctype/work_order/services/operations.py b/erpnext/manufacturing/doctype/work_order/services/operations.py index 26bd7ee73e5..1d1d061cb38 100644 --- a/erpnext/manufacturing/doctype/work_order/services/operations.py +++ b/erpnext/manufacturing/doctype/work_order/services/operations.py @@ -169,6 +169,29 @@ class OperationsService: self.doc.set("operations", operations) self.calculate_time() + self.set_operation_warehouses() + + def set_operation_warehouses(self): + """For semi-finished goods tracking, default each operation's warehouses from the Work + Order and chain them: the first operation pulls from the WO source warehouse and every + later operation pulls from the previous operation's output; intermediate outputs go to the + WIP warehouse while the final operation outputs to the WO finished goods warehouse. + + Only empty fields are filled, so values configured on the BOM/operation are preserved.""" + if not self.doc.track_semi_finished_goods or not self.doc.operations: + return + + operations = self.doc.operations + last_idx = len(operations) - 1 + for idx, op in enumerate(operations): + if not op.source_warehouse: + op.source_warehouse = self.doc.source_warehouse + + if not op.fg_warehouse: + op.fg_warehouse = self.doc.fg_warehouse if idx == last_idx else self.doc.source_warehouse + + if not op.wip_warehouse: + op.wip_warehouse = self.doc.wip_warehouse def _collect_bom_operations(self): operations = [] diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 72ee04f8b17..68f139305a5 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -288,6 +288,7 @@ class WorkOrder(Document): self.validate_sales_order() self.set_default_warehouse() + self.set_operation_warehouses() self.validate_warehouse_belongs_to_company() self.check_wip_warehouse_skip() self.calculate_operating_cost() @@ -975,6 +976,9 @@ class WorkOrder(Document): def set_work_order_operations(self): return OperationsService(self).set_work_order_operations() + def set_operation_warehouses(self): + return OperationsService(self).set_operation_warehouses() + def update_operation_status(self): return OperationsService(self).update_operation_status() diff --git a/erpnext/stock/doctype/stock_entry/services/manufacturing.py b/erpnext/stock/doctype/stock_entry/services/manufacturing.py index 9e66e39a9e5..26a115f0186 100644 --- a/erpnext/stock/doctype/stock_entry/services/manufacturing.py +++ b/erpnext/stock/doctype/stock_entry/services/manufacturing.py @@ -15,6 +15,7 @@ from erpnext.stock.serial_batch_bundle import ( get_empty_batches_based_work_order, get_serial_nos_from_bundle, ) +from erpnext.stock.utils import get_combine_datetime from .serial_batch import create_serial_and_batch_bundle from .stock_entry_base import BaseStockEntry @@ -1032,6 +1033,140 @@ def get_secondary_items_from_job_card(work_order, jc_name=None): return secondary_items.run(as_dict=1) +def get_previous_operation_output_sn_batch(work_order, item_code, warehouse): + """Serial nos / batches that an earlier operation produced for ``item_code`` (a + semi-finished good) and are still available in ``warehouse`` -- i.e. produced by a + prior operation's Manufacture entry minus whatever later entries already pulled out + of that warehouse. Returns an empty result for ordinary raw materials.""" + result = frappe._dict(serial_nos=[], batches=defaultdict(float)) + if not (work_order and item_code and warehouse): + return result + + # Only items that are the output (finished_good) of some operation qualify. + if not frappe.db.exists("Work Order Operation", {"parent": work_order, "finished_good": item_code}): + return result + + item_details = frappe.get_cached_value("Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1) + if not item_details or not (item_details.has_serial_no or item_details.has_batch_no): + return result + + produced = _get_operation_sn_batch(work_order, item_code, warehouse, produced=True) + consumed = _get_operation_sn_batch(work_order, item_code, warehouse, produced=False) + + for serial_no in produced.serial_nos: + if serial_no not in consumed.serial_nos: + result.serial_nos.append(serial_no) + + for batch_no, qty in produced.batches.items(): + available = flt(qty) - flt(consumed.batches.get(batch_no)) + if available > 0: + result.batches[batch_no] = available + + return result + + +def _get_operation_sn_batch(work_order, item_code, warehouse, produced=True): + bundles = _get_operation_bundles(work_order, item_code, warehouse, produced) + result = frappe._dict(serial_nos=[], batches=defaultdict(float)) + if not bundles: + return result + + sbe = frappe.qb.DocType("Serial and Batch Entry") + entries = ( + frappe.qb.from_(sbe) + .select(sbe.serial_no, sbe.batch_no, sbe.qty) + .where((sbe.parent.isin(bundles)) & (sbe.is_cancelled == 0)) + .orderby(sbe.parent) + .orderby(sbe.idx) + ).run(as_dict=True) + + for row in entries: + if row.serial_no: + result.serial_nos.append(row.serial_no) + if row.batch_no: + result.batches[row.batch_no] += abs(flt(row.qty)) + + return result + + +def _get_operation_bundles(work_order, item_code, warehouse, produced): + se = frappe.qb.DocType("Stock Entry") + sed = frappe.qb.DocType("Stock Entry Detail") + warehouse_field = sed.t_warehouse if produced else sed.s_warehouse + + query = ( + frappe.qb.from_(se) + .inner_join(sed) + .on(sed.parent == se.name) + .select(sed.serial_and_batch_bundle) + .where( + (se.work_order == work_order) + & (se.docstatus == 1) + & (sed.item_code == item_code) + & (warehouse_field == warehouse) + & (sed.serial_and_batch_bundle.isnotnull()) + ) + ) + if produced: + query = query.where((se.purpose == "Manufacture") & (sed.is_finished_item == 1)) + + return [row[0] for row in query.run()] + + +def _cap_pool_to_qty(pool, qty): + """Trim the available serial/batch pool to at most ``qty`` (fill what's available).""" + serial_nos, batches = [], frappe._dict() + if pool.serial_nos: + serial_nos = pool.serial_nos[: cint(qty)] + elif pool.batches: + remaining = flt(qty) + for batch_no, batch_qty in pool.batches.items(): + if remaining <= 0: + break + use = min(flt(batch_qty), remaining) + batches[batch_no] = use + remaining -= use + return serial_nos, batches + + +def set_previous_operation_serial_batch(parent_doc, row): + """Auto-pull serial nos / batches produced by a previous operation onto a + consumption / transfer-out ``row`` of a Stock Entry, filling what is available and + leaving any shortfall blank for the user. No-op for ordinary raw materials or when + the row already carries serial/batch.""" + warehouse = row.get("s_warehouse") + qty = flt(row.get("qty")) * flt(row.get("conversion_factor") or 1) + + if not parent_doc.get("work_order") or not warehouse or qty <= 0: + return + if row.get("serial_and_batch_bundle") or row.get("serial_no") or row.get("batch_no"): + return + + pool = get_previous_operation_output_sn_batch(parent_doc.work_order, row.item_code, warehouse) + serial_nos, batches = _cap_pool_to_qty(pool, qty) + if not serial_nos and not batches: + return + + bundle = SerialBatchCreation( + { + "item_code": row.item_code, + "warehouse": warehouse, + "posting_datetime": get_combine_datetime(parent_doc.posting_date, parent_doc.posting_time), + "voucher_type": "Stock Entry", + "company": parent_doc.company, + "type_of_transaction": "Outward", + "qty": flt(qty), + "serial_nos": serial_nos, + "batches": batches, + "do_not_submit": True, + } + ).make_serial_and_batch_bundle() + + if bundle and bundle.get("name"): + row.serial_and_batch_bundle = bundle.name + row.use_serial_batch_fields = 0 + + def ceil_qty_if_uom_has_whole_number(qty, stock_uom): if cint(frappe.get_cached_value("UOM", stock_uom, "must_be_whole_number")): qty = ceil(qty) diff --git a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py index 0eb22bfc9f3..a10441106e0 100644 --- a/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py +++ b/erpnext/stock/doctype/stock_entry_type/stock_entry_type.py @@ -105,6 +105,10 @@ class ManufactureEntry: ) def add_raw_materials(self): + from erpnext.stock.doctype.stock_entry.services.manufacturing import ( + set_previous_operation_serial_batch, + ) + if self.job_card: item_dict = {} if not item_dict: @@ -127,9 +131,7 @@ class ManufactureEntry: _dict.t_warehouse = "" _dict.item_code = item_code - if backflush_based_on != "BOM" and not frappe.db.get_value( - "Job Card", self.job_card, "skip_material_transfer" - ): + if backflush_based_on != "BOM" and not self.skip_material_transfer: calculated_qty = flt(_dict.transferred_qty) - flt(_dict.consumed_qty) if calculated_qty < 0: frappe.throw( @@ -138,6 +140,8 @@ class ManufactureEntry: _dict.qty = calculated_qty self.update_available_serial_batches(_dict, available_serial_batches) + elif self.skip_material_transfer: + set_previous_operation_serial_batch(self.stock_entry, _dict) self.stock_entry.append("items", _dict) From dc09362454b2fd83d99777615f222cf87ce83199 Mon Sep 17 00:00:00 2001 From: Nikhil Kothari Date: Fri, 3 Jul 2026 23:03:28 +0530 Subject: [PATCH 134/400] fix: replace all old icons (#56864) --- .../accounting_dimension_filter.js | 2 +- .../loyalty_program/loyalty_program.js | 2 +- .../doctype/payment_entry/payment_entry.js | 26 ++++++++--------- .../period_closing_voucher.js | 26 ++++++++--------- .../doctype/pricing_rule/pricing_rule.js | 4 +-- .../accounts/workspace/banking/banking.json | 4 +-- .../workspace/budgeting/budgeting.json | 6 ++-- .../financial_reports/financial_reports.json | 4 +-- .../workspace/invoicing/invoicing.json | 10 +++---- .../accounts/workspace/payments/payments.json | 6 ++-- .../share_management/share_management.json | 6 ++-- .../subscriptions/subscriptions.json | 4 +-- erpnext/accounts/workspace/taxes/taxes.json | 6 ++-- erpnext/assets/workspace/assets/assets.json | 10 +++---- erpnext/buying/workspace/buying/buying.json | 10 +++---- erpnext/crm/doctype/campaign/campaign.js | 2 +- erpnext/crm/workspace/crm/crm.json | 12 ++++---- erpnext/desktop_icon/accounting.json | 4 +-- erpnext/desktop_icon/assets.json | 4 +-- erpnext/desktop_icon/budget.json | 4 +-- erpnext/desktop_icon/buying.json | 4 +-- erpnext/desktop_icon/crm.json | 4 +-- erpnext/desktop_icon/erpnext_settings.json | 4 +-- erpnext/desktop_icon/home.json | 4 +-- erpnext/desktop_icon/invoicing.json | 4 +-- erpnext/desktop_icon/manufacturing.json | 4 +-- erpnext/desktop_icon/projects.json | 4 +-- erpnext/desktop_icon/quality.json | 4 +-- erpnext/desktop_icon/selling.json | 4 +-- erpnext/desktop_icon/stock.json | 4 +-- erpnext/desktop_icon/subcontracting.json | 4 +-- erpnext/desktop_icon/support.json | 4 +-- .../doctype/workstation/workstation.js | 4 +-- .../workstation/workstation_job_card.html | 2 +- .../manufacturing/manufacturing.json | 14 +++++----- .../projects/workspace/projects/projects.json | 10 +++---- .../bom_configurator.bundle.js | 8 +++--- erpnext/public/js/setup_wizard.js | 1 - erpnext/public/js/telephony.js | 2 +- erpnext/public/js/templates/call_link.html | 2 +- .../public/js/templates/crm_activities.html | 4 +-- erpnext/public/js/templates/crm_notes.html | 4 +-- erpnext/public/js/utils/barcode_scanner.js | 2 +- .../workspace/quality/quality.json | 8 +++--- .../installation_note/installation_note.js | 2 +- .../page/point_of_sale/pos_item_selector.js | 4 +-- .../selling/page/sales_funnel/sales_funnel.js | 2 +- .../page/sales_funnel/sales_funnel.json | 4 +-- .../selling/workspace/selling/selling.json | 12 ++++---- .../erpnext_settings/erpnext_settings.json | 28 +++++++++---------- erpnext/setup/workspace/home/home.json | 4 +-- .../workspace/organization/organization.json | 6 ++-- erpnext/stock/doctype/item/item.js | 2 +- .../landed_cost_voucher.js | 2 +- .../stock/doctype/price_list/price_list.js | 16 ++++------- .../doctype/stock_entry/stock_entry_list.js | 2 +- erpnext/stock/workspace/stock/stock.json | 12 ++++---- .../subcontracting/subcontracting.json | 6 ++-- erpnext/support/doctype/issue/issue.js | 4 +-- .../support/workspace/support/support.json | 6 ++-- .../templates/generators/sales_partner.html | 2 +- erpnext/templates/includes/macros.html | 2 +- .../templates/includes/products_as_grid.html | 4 +-- .../includes/projects/project_search_box.html | 4 +-- .../includes/projects/project_tasks.html | 2 +- erpnext/templates/pages/task_info.html | 2 +- erpnext/templates/pages/timelog_info.html | 2 +- erpnext/workspace_sidebar/assets.json | 8 +++--- erpnext/workspace_sidebar/banking.json | 4 +-- erpnext/workspace_sidebar/budgeting.json | 4 +-- erpnext/workspace_sidebar/buying.json | 8 +++--- erpnext/workspace_sidebar/crm.json | 10 +++---- .../workspace_sidebar/erpnext_settings.json | 18 ++++++------ .../workspace_sidebar/financial_reports.json | 4 +-- erpnext/workspace_sidebar/invoicing.json | 8 +++--- erpnext/workspace_sidebar/manufacturing.json | 12 ++++---- erpnext/workspace_sidebar/organization.json | 4 +-- erpnext/workspace_sidebar/payments.json | 6 ++-- erpnext/workspace_sidebar/projects.json | 8 +++--- erpnext/workspace_sidebar/quality.json | 6 ++-- erpnext/workspace_sidebar/selling.json | 10 +++---- .../workspace_sidebar/share_management.json | 4 +-- erpnext/workspace_sidebar/stock.json | 10 +++---- erpnext/workspace_sidebar/subcontracting.json | 4 +-- erpnext/workspace_sidebar/support.json | 4 +-- erpnext/workspace_sidebar/taxes.json | 4 +-- 86 files changed, 257 insertions(+), 270 deletions(-) diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.js b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.js index 38ad1311117..cadba669f70 100644 --- a/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.js +++ b/erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.js @@ -6,7 +6,7 @@ frappe.ui.form.on("Accounting Dimension Filter", { let help_content = ` diff --git a/erpnext/accounts/doctype/loyalty_program/loyalty_program.js b/erpnext/accounts/doctype/loyalty_program/loyalty_program.js index 9c9b46c66f5..9949859638f 100644 --- a/erpnext/accounts/doctype/loyalty_program/loyalty_program.js +++ b/erpnext/accounts/doctype/loyalty_program/loyalty_program.js @@ -8,7 +8,7 @@ frappe.ui.form.on("Loyalty Program", { var help_content = `

- + {{__('Note: On checking Is Mandatory the accounting dimension will become mandatory against that specific account for all accounting transactions')}}

- + ${__("Notes")}

    diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 3a0d1d11f4c..12a6132ce43 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -414,21 +414,17 @@ frappe.ui.form.on("Payment Entry", { show_general_ledger: function (frm) { if (frm.doc.docstatus > 0) { - frm.add_custom_button( - __("Ledger"), - function () { - frappe.route_options = { - voucher_no: frm.doc.name, - from_date: frm.doc.posting_date, - to_date: moment(frm.doc.modified).format("YYYY-MM-DD"), - company: frm.doc.company, - categorize_by: "", - show_cancelled_entries: frm.doc.docstatus === 2, - }; - frappe.set_route("query-report", "General Ledger"); - }, - "fa fa-table" - ); + frm.add_custom_button(__("Ledger"), function () { + frappe.route_options = { + voucher_no: frm.doc.name, + from_date: frm.doc.posting_date, + to_date: moment(frm.doc.modified).format("YYYY-MM-DD"), + company: frm.doc.company, + categorize_by: "", + show_cancelled_entries: frm.doc.docstatus === 2, + }; + frappe.set_route("query-report", "General Ledger"); + }); } }, diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js index 7433f18c5ac..27a38912a86 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.js @@ -41,21 +41,17 @@ frappe.ui.form.on("Period Closing Voucher", { refresh: function (frm) { if (frm.doc.docstatus > 0) { - frm.add_custom_button( - __("Ledger"), - function () { - frappe.route_options = { - voucher_no: frm.doc.name, - from_date: frm.doc.period_start_date, - to_date: frm.doc.period_end_date, - company: frm.doc.company, - categorize_by: "", - show_cancelled_entries: frm.doc.docstatus === 2, - }; - frappe.set_route("query-report", "General Ledger"); - }, - "fa fa-table" - ); + frm.add_custom_button(__("Ledger"), function () { + frappe.route_options = { + voucher_no: frm.doc.name, + from_date: frm.doc.period_start_date, + to_date: frm.doc.period_end_date, + company: frm.doc.company, + categorize_by: "", + show_cancelled_entries: frm.doc.docstatus === 2, + }; + frappe.set_route("query-report", "General Ledger"); + }); } }, }); diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js index 7cce98f3323..0a4272c518d 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js @@ -40,7 +40,7 @@ frappe.ui.form.on("Pricing Rule", { var help_content = ` + + + ${show_serial ? `` : ""} + ${show_batch ? `` : ""} + + `; + } + + make_new_row_controls($tr) { + this.new_serial_control = this.make_row_link_control($tr.find(".sbie-new-serial"), { + options: "Serial No", + fieldname: "sbie_new_serial", + placeholder: __("Scan / select Serial No"), + get_query: () => ({ filters: { item_code: this.row.item_code } }), + onchange: () => this.on_new_serial_change($tr), + }); + + this.new_batch_control = this.make_row_link_control($tr.find(".sbie-new-batch"), { + options: "Batch", + fieldname: "sbie_new_batch", + placeholder: __("Select Batch No"), + get_query: () => ({ filters: { item: this.row.item_code, disabled: 0 } }), + onchange: () => this.on_new_batch_change($tr), + }); + + $tr.find(".sbie-new-check") + .on("mousedown", () => $tr.data("cancelled", 1)) + .on("change", (e) => { + $tr.data("cancelled", e.target.checked ? 1 : 0); + this.toggle_delete_button(); + }); + $tr.find("input").on("keydown", (e) => { + if (e.which === 13) this.commit_new_row($tr); + }); + $tr.find(".sbie-new-qty") + .on("input", (e) => this.restrict_to_numeric(e)) + .on("focus", (e) => e.target.select()) + .on("change", () => this.commit_new_row($tr)) + .on("blur", () => this.commit_new_row($tr)); + + let first_control = this.new_serial_control || this.new_batch_control; + first_control && first_control.$wrapper.find("input").focus(); + } + + make_row_link_control($slot, df) { + if (!$slot.length) return null; + + let control = frappe.ui.form.make_control({ + parent: $slot, + df: Object.assign({ fieldtype: "Link" }, df), + render_input: true, + }); + + this.make_control_compact(control); + return control; + } + + make_control_compact(control) { + let $wrapper = control.$wrapper; + $wrapper.find(".control-label, .help-box").hide(); + $wrapper.find(".form-group").css({ margin: "0", "min-height": "0" }); + $wrapper.find("input").css({ "min-height": "0" }); + $wrapper.css({ margin: "0", "min-height": "0" }); + } + + on_new_serial_change($tr) { + if (!this.new_serial_control || !this.new_serial_control.get_value()) return; + + if (this.new_batch_control && !this.new_batch_control.get_value()) { + this.new_batch_control.$wrapper.find("input").focus(); + return; + } + + this.commit_new_row($tr); + } + + on_new_batch_change($tr) { + if (!this.new_batch_control || !this.new_batch_control.get_value()) return; + + if (this.new_serial_control) { + if (this.new_serial_control.get_value()) { + this.commit_new_row($tr); + } + return; + } + + let committed = this.commit_new_row($tr); + committed && + committed.then(() => { + this.wrapper.find(".sbie-qty-input[data-pending-index]").last().focus(); + }); + } + + edit_batch_cell($td) { + this.edit_link_cell($td, { + options: "Batch", + field: "batch_no", + placeholder: __("Select Batch No"), + get_query: () => ({ filters: { item: this.row.item_code, disabled: 0 } }), + }); + } + + edit_serial_cell($td) { + this.edit_link_cell($td, { + options: "Serial No", + field: "serial_no", + placeholder: __("Select Serial No"), + get_query: () => ({ filters: { item_code: this.row.item_code } }), + }); + } + + edit_link_cell($td, opts) { + if ($td.data("editing")) return; + $td.data("editing", 1); + + let name = $td.data("name"); + let current = $td.text().trim(); + $td.empty().addClass("sbie-input-cell").css("cursor", "default"); + this.wrapper.find(".sbie-table").css("overflow", "visible"); + + let control = this.make_row_link_control($td, { + options: opts.options, + fieldname: "sbie_edit_link", + placeholder: opts.placeholder, + get_query: opts.get_query, + onchange: () => { + let value = control.get_value(); + if (value && value !== current) { + this.update_entry(name, { [opts.field]: value }); + this.refresh_view(); + } + }, + }); + + control.set_input(current); + control.$wrapper.find("input").focus(); + } + + commit_new_row($tr) { + if ($tr.data("committing") || $tr.data("cancelled")) return; + + let serial_no = this.new_serial_control ? this.new_serial_control.get_value() : ""; + let batch_no = this.new_batch_control ? this.new_batch_control.get_value() : ""; + if (!serial_no && !batch_no) return; + + let qty = serial_no ? 1 : flt($tr.find(".sbie-new-qty").val()) || 1; + + $tr.data("committing", 1); + this.pending.new_entries.push({ serial_no, batch_no, qty }); + this.frm.dirty(); + return this.go_to_last_page(); + } + + update_entry(name, changes) { + let updates = this.pending.updates; + if (!updates[name]) { + let entry = this.last_entries.find((d) => d.name === name) || {}; + updates[name] = { orig_qty: Math.abs(flt(entry.qty)) }; + } + + Object.assign(updates[name], changes); + this.frm.dirty(); + } + + bind_events() { + this.wrapper.find(".sbie-add-row").on("click", () => this.add_new_row()); + this.wrapper.find(".sbie-upload-csv").on("click", () => this.upload_csv()); + this.wrapper.find(".sbie-download-csv").on("click", () => this.download_csv()); + this.wrapper.find(".sbie-prev").on("click", () => this.change_page(-1)); + this.wrapper.find(".sbie-next").on("click", () => this.change_page(1)); + this.wrapper.find(".sbie-first-page").on("click", () => this.go_to_page(1)); + this.wrapper.find(".sbie-last-page").on("click", () => this.go_to_page(this.total_pages)); + this.wrapper + .find(".sbie-page-number") + .on("input", (e) => { + e.target.value = e.target.value.replace(/[^0-9]/g, ""); + e.target.style.width = (e.target.value.length + 1) * 8 + "px"; + }) + .on("keydown", (e) => { + if (e.which === 13) e.target.blur(); + }) + .on("blur", (e) => this.go_to_page(e.target.value)) + .on("focus", (e) => e.target.select()); + this.wrapper.find(".sbie-delete").on("click", () => this.delete_selected()); + this.wrapper.find(".sbie-scan-action").on("click", () => this.open_scan_dialog()); + this.wrapper.find(".sbie-range-action").on("click", () => this.open_range_dialog()); + this.wrapper.find(".sbie-auto-fetch-action").on("click", () => this.open_auto_fetch_dialog()); + } + + get_type_of_transaction() { + let doc = this.frm.doc; + if (doc.doctype === "Stock Entry") { + return this.row.s_warehouse ? "Outward" : "Inward"; + } + + let inward = + ["Purchase Receipt", "Purchase Invoice", "Stock Reconciliation"].includes(doc.doctype) || + this.cdt === "Subcontracting Receipt Item"; + + if (doc.is_return) { + inward = !inward; + } + + return inward ? "Inward" : "Outward"; + } + + async open_auto_fetch_dialog() { + let warehouse = this.row.warehouse || this.row.s_warehouse; + if (!warehouse) { + frappe.msgprint(__("Please set Warehouse first")); + return; + } + + let is_serial = cint(this.item.has_serial_no); + let based_on = await erpnext.stock.get_pick_serial_batch_based_on(); + + let dialog = new frappe.ui.Dialog({ + title: is_serial ? __("Auto Fetch Serial Nos") : __("Auto Fetch Batch Nos"), + fields: [ + { + fieldtype: "Float", + fieldname: "qty", + label: __("Qty to Fetch"), + reqd: 1, + default: Math.abs(flt(this.row[this.qty_field])) || null, + description: __("Existing entries will be replaced with the fetched entries"), + }, + { + fieldtype: "Select", + fieldname: "based_on", + label: __("Fetch Based On"), + options: ["FIFO", "LIFO", "Expiry"], + default: based_on, + }, + ], + primary_action_label: __("Fetch"), + primary_action: (values) => { + dialog.hide(); + this.auto_fetch_entries(values.qty, values.based_on, warehouse); + }, + }); + + dialog.show(); + } + + async auto_fetch_entries(qty, based_on, warehouse) { + let data = await this.call( + "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.get_auto_data", + { + item_code: this.row.item_code, + warehouse: warehouse, + has_serial_no: this.item.has_serial_no, + has_batch_no: this.item.has_batch_no, + qty: qty, + based_on: based_on, + posting_date: this.frm.doc.posting_date, + posting_time: this.frm.doc.posting_time, + } + ); + + if (!data || !data.length) { + frappe.msgprint( + __("No stock available for Item {0} in Warehouse {1}", [ + this.esc(this.row.item_code), + this.esc(warehouse), + ]) + ); + return; + } + + this.add_auto_fetched_entries(data); + } + + add_auto_fetched_entries(rows) { + let p = this.pending; + p.delete_all = 1; + p.new_entries = []; + p.updates = {}; + p.deleted = []; + + for (const row of rows) { + p.new_entries.push({ + serial_no: row.serial_no || "", + batch_no: row.batch_no || "", + qty: Math.abs(flt(row.qty)) || 1, + }); + } + + this.start = 0; + this.frm.dirty(); + this.go_to_last_page(); + frappe.show_alert({ + message: __("{0} entries fetched", [p.new_entries.length]), + indicator: "green", + }); + this.frm.save(); + } + + open_scan_dialog() { + if (this.is_rejected && !this.row.rejected_warehouse) { + frappe.msgprint(__("Please set Rejected Warehouse first")); + return; + } + + let is_serial = cint(this.item.has_serial_no); + let scanned_count = 0; + + let dialog = new frappe.ui.Dialog({ + title: is_serial ? __("Scan Serial Nos") : __("Scan Batch Nos"), + fields: [ + { + fieldtype: "Data", + fieldname: "scan_value", + options: "Barcode", + label: is_serial ? __("Scan Serial No") : __("Scan Batch No"), + description: __("Missing Serial / Batch Nos will be created on Save"), + onchange: () => { + let value = (dialog.get_value("scan_value") || "").trim(); + if (!value) return; + + if (this.add_scanned_value(value)) { + scanned_count++; + } + dialog.fields_dict.scanned_info.$wrapper.html( + `
    ${__("Scanned: {0}", [ + scanned_count, + ])} · ${frappe.utils.escape_html(value)}
    ` + ); + dialog.set_value("scan_value", ""); + }, + }, + { fieldtype: "HTML", fieldname: "scanned_info" }, + ], + on_hide: () => this.refresh_view(), + }); + + dialog.show(); + } + + get_active_server_row(field, value) { + let p = this.pending; + if (p.delete_all) return null; + + return this.last_entries.find((d) => d[field] === value && !p.deleted.some((x) => x.name === d.name)); + } + + get_known_identifiers() { + let p = this.pending; + let known = new Set(p.new_entries.map((d) => d.serial_no || d.batch_no)); + + if (!p.delete_all) { + let deleted = new Set(p.deleted.map((d) => d.name)); + for (const d of this.last_entries) { + if (!deleted.has(d.name)) { + known.add(d.serial_no || d.batch_no); + } + } + } + + return known; + } + + add_scanned_value(value) { + let p = this.pending; + + if (cint(this.item.has_serial_no)) { + if (this.get_known_identifiers().has(value)) { + frappe.show_alert({ + message: __("Serial No {0} already added", [this.esc(value)]), + indicator: "orange", + }); + return false; + } + + p.new_entries.push({ serial_no: value, batch_no: "", qty: 1 }); + } else { + let existing = p.new_entries.find((d) => d.batch_no === value); + let server_row = this.get_active_server_row("batch_no", value); + if (existing) { + existing.qty = flt(existing.qty) + 1; + } else if (server_row) { + let update = p.updates[server_row.name]; + let current = update && update.qty != null ? flt(update.qty) : Math.abs(flt(server_row.qty)); + this.update_entry(server_row.name, { qty: current + 1 }); + } else { + p.new_entries.push({ serial_no: "", batch_no: value, qty: 1 }); + } + } + + this.frm.dirty(); + this.go_to_last_page(); + return true; + } + + open_range_dialog() { + if (this.is_rejected && !this.row.rejected_warehouse) { + frappe.msgprint(__("Please set Rejected Warehouse first")); + return; + } + + let dialog = new frappe.ui.Dialog({ + title: __("Create Serial Nos from Range"), + fields: [ + { + fieldtype: "Data", + fieldname: "serial_no_range", + label: __("Serial No Range"), + reqd: 1, + description: __( + '"SN-01::10" for "SN-01" to "SN-10". Missing Serial Nos will be created on Save' + ), + }, + ], + primary_action_label: __("Add"), + primary_action: ({ serial_no_range }) => { + let serial_nos = erpnext.stock.utils.get_serial_range(serial_no_range, "::"); + if (!serial_nos || !serial_nos.length) { + frappe.throw(__("Invalid range. Use the format {0}", ["SN-01::10"])); + } + + dialog.hide(); + this.add_serial_range(serial_nos); + }, + }); + + dialog.show(); + } + + add_serial_range(serial_nos) { + let p = this.pending; + let known = this.get_known_identifiers(); + + let added = 0; + for (const serial_no of serial_nos) { + if (known.has(serial_no)) continue; + p.new_entries.push({ serial_no: serial_no, batch_no: "", qty: 1 }); + added++; + } + + this.frm.dirty(); + this.go_to_last_page(); + frappe.show_alert({ + message: __("{0} Serial Nos added. They will be saved with the document.", [added]), + indicator: "green", + }); + } + + get total_pages() { + return Math.ceil(this.get_effective_count() / this.page_length) || 1; + } + + go_to_last_page() { + this.start = (this.total_pages - 1) * this.page_length; + return this.load_page(); + } + + change_page(direction) { + let current_page = Math.floor(this.start / this.page_length) + 1; + this.go_to_page(current_page + direction); + } + + go_to_page(index) { + index = Math.min(Math.max(cint(index) || 1, 1), this.total_pages); + let new_start = (index - 1) * this.page_length; + + if (new_start === this.start) { + this.wrapper.find(".sbie-page-number").val(index); + return; + } + + this.start = new_start; + this.load_page(); + } + + async load_page() { + if (!this.bundle) { + this.server_total_count = 0; + this.server_total_qty = 0; + this.last_entries = []; + this._totals_loaded = true; + } else if (!this._totals_loaded || this.start < this.server_total_count) { + let data = await this.call( + "erpnext.stock.doctype.serial_and_batch_bundle.inline_editor.get_bundle_entries", + { + bundle: this.bundle, + start: this.start, + page_length: this.page_length, + } + ); + this.server_total_count = data.total_count; + this.server_total_qty = flt(data.total_qty); + this.last_entries = data.entries; + this._totals_loaded = true; + } else { + this.last_entries = []; + } + + this.refresh_view(); + this.reconcile_row_qty(); + } + + refresh_view() { + this.render_rows(this.last_entries); + this.update_summary(); + this.sync_row_qty(); + } + + get_effective_count() { + let p = this.pending; + if (p.delete_all) { + return p.new_entries.length; + } + + return this.server_total_count + p.new_entries.length - p.deleted.length; + } + + get_effective_qty() { + let p = this.pending; + let qty = p.delete_all ? 0 : this.server_total_qty; + + for (const row of p.new_entries) { + qty += flt(row.qty); + } + + if (!p.delete_all) { + for (const name in p.updates) { + const u = p.updates[name]; + if (u.qty != null) { + qty += flt(u.qty) - flt(u.orig_qty); + } + } + for (const d of p.deleted) { + qty -= flt(d.qty); + } + } + + return flt(qty, cint(frappe.boot.sysdefaults && frappe.boot.sysdefaults.float_precision) || 3); + } + + sync_row_qty() { + if (this.frm.doc.docstatus !== 0 || !this.has_pending()) return; + + let expected = this.get_effective_qty(); + if (flt(this.row[this.qty_field]) !== expected) { + frappe.model.set_value(this.cdt, this.cdn, this.qty_field, expected); + } + } + + reconcile_row_qty() { + if (this.frm.doc.docstatus !== 0 || this.has_pending() || !this.server_total_count) return; + + if (flt(this.row[this.qty_field]) !== this.server_total_qty) { + frappe.model.set_value(this.cdt, this.cdn, this.qty_field, this.server_total_qty); + frappe.show_alert({ + message: __( + "Qty updated to {0} to match the Serial and Batch Bundle. Please save the document.", + [this.server_total_qty] + ), + indicator: "orange", + }); + } + } + + render_rows(entries) { + let p = this.pending; + let show_batch = cint(this.item.has_batch_no); + let show_serial = cint(this.item.has_serial_no); + let column_count = 3 + show_serial + show_batch; + + let header = ` + + + ${show_serial ? `` : ""} + ${show_batch ? `` : ""} + + `; + + let visible = p.delete_all ? [] : entries.filter((d) => !p.deleted.some((x) => x.name === d.name)); + let body = visible + .map((d, i) => { + let update = p.updates[d.name] || {}; + let qty = update.qty != null ? flt(update.qty) : Math.abs(flt(d.qty)); + let batch_no = this.esc(update.batch_no || d.batch_no || ""); + let serial_no = this.esc(update.serial_no || d.serial_no || ""); + let name = this.esc(d.name); + + return ` + + + ${ + show_serial + ? `` + : "" + } + ${ + show_batch + ? `` + : "" + } + + `; + }) + .join(""); + + let base_count = p.delete_all ? 0 : this.server_total_count - p.deleted.length; + let pending_offset = Math.max(0, this.start - (p.delete_all ? 0 : this.server_total_count)); + let capacity = Math.max(this.page_length - visible.length, 0); + body += p.new_entries + .slice(pending_offset, pending_offset + capacity) + .map((d, i) => { + let index = pending_offset + i; + return ` + + + ${show_serial ? `` : ""} + ${show_batch ? `` : ""} + + `; + }) + .join(""); + + if (!visible.length && !p.new_entries.length) { + body = ``; + } + + this.wrapper + .find(".sbie-table") + .css("overflow", "") + .html(`

    - + ${__("Notes")}

      @@ -63,7 +63,7 @@ frappe.ui.form.on("Pricing Rule", {
    -

    +

    ${__("How Pricing Rule is applied?")}

      diff --git a/erpnext/accounts/workspace/banking/banking.json b/erpnext/accounts/workspace/banking/banking.json index 072af4a7193..d4ff8487759 100644 --- a/erpnext/accounts/workspace/banking/banking.json +++ b/erpnext/accounts/workspace/banking/banking.json @@ -15,7 +15,7 @@ "label": "Banking", "link_type": "DocType", "links": [], - "modified": "2026-06-14 13:43:50.924019", + "modified": "2026-07-03 13:43:50.924019", "modified_by": "Administrator", "module": "Accounts", "name": "Banking", @@ -43,7 +43,7 @@ { "child": 0, "collapsible": 1, - "icon": "tool", + "icon": "wrench", "indent": 0, "keep_closed": 0, "label": "Bank Reconciliation", diff --git a/erpnext/accounts/workspace/budgeting/budgeting.json b/erpnext/accounts/workspace/budgeting/budgeting.json index 03e1d96b6e8..c5ea717fe52 100644 --- a/erpnext/accounts/workspace/budgeting/budgeting.json +++ b/erpnext/accounts/workspace/budgeting/budgeting.json @@ -8,14 +8,14 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "accounting", + "icon": "wallet", "idx": 0, "indicator_color": "green", "is_hidden": 0, "label": "Budgeting", "link_type": "DocType", "links": [], - "modified": "2026-07-02 04:24:48.116724", + "modified": "2026-07-03 04:24:48.116724", "modified_by": "Administrator", "module": "Accounts", "name": "Budgeting", @@ -59,7 +59,7 @@ "child": 0, "collapsible": 1, "default_workspace": 0, - "icon": "accounting", + "icon": "wallet", "indent": 0, "keep_closed": 0, "label": "Accounting Dimension", diff --git a/erpnext/accounts/workspace/financial_reports/financial_reports.json b/erpnext/accounts/workspace/financial_reports/financial_reports.json index 3ad09d26e52..4e487919ac2 100644 --- a/erpnext/accounts/workspace/financial_reports/financial_reports.json +++ b/erpnext/accounts/workspace/financial_reports/financial_reports.json @@ -266,7 +266,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:08.095321", + "modified": "2026-07-03 13:44:08.095321", "modified_by": "Administrator", "module": "Accounts", "module_onboarding": "Accounting Onboarding", @@ -284,7 +284,7 @@ { "child": 0, "collapsible": 1, - "icon": "accounting", + "icon": "wallet", "indent": 1, "keep_closed": 0, "label": "Financial Reports", diff --git a/erpnext/accounts/workspace/invoicing/invoicing.json b/erpnext/accounts/workspace/invoicing/invoicing.json index f34ea417b25..7ae50b854e6 100644 --- a/erpnext/accounts/workspace/invoicing/invoicing.json +++ b/erpnext/accounts/workspace/invoicing/invoicing.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "accounting", + "icon": "wallet", "idx": 4, "indicator_color": "", "is_hidden": 0, @@ -587,7 +587,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:08.471142", + "modified": "2026-07-03 13:44:08.471142", "modified_by": "Administrator", "module": "Accounts", "module_onboarding": "Accounting Onboarding", @@ -622,7 +622,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -635,7 +635,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -786,7 +786,7 @@ { "child": 0, "collapsible": 1, - "icon": "money-coins-1", + "icon": "coins", "indent": 1, "keep_closed": 0, "label": "Payments", diff --git a/erpnext/accounts/workspace/payments/payments.json b/erpnext/accounts/workspace/payments/payments.json index 118e2961298..fc29978e9e9 100644 --- a/erpnext/accounts/workspace/payments/payments.json +++ b/erpnext/accounts/workspace/payments/payments.json @@ -15,7 +15,7 @@ "label": "Payments", "link_type": "DocType", "links": [], - "modified": "2026-06-14 13:43:50.184761", + "modified": "2026-07-03 13:43:50.184761", "modified_by": "Administrator", "module": "Accounts", "module_onboarding": "Accounting Onboarding", @@ -31,7 +31,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -44,7 +44,7 @@ { "child": 0, "collapsible": 1, - "icon": "money-coins-1", + "icon": "coins", "indent": 1, "keep_closed": 0, "label": "Payments", diff --git a/erpnext/accounts/workspace/share_management/share_management.json b/erpnext/accounts/workspace/share_management/share_management.json index 6766b4ea9a4..c48bec275ce 100644 --- a/erpnext/accounts/workspace/share_management/share_management.json +++ b/erpnext/accounts/workspace/share_management/share_management.json @@ -8,14 +8,14 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "money-coins-1", + "icon": "coins", "idx": 0, "indicator_color": "green", "is_hidden": 0, "label": "Share Management", "link_type": "DocType", "links": [], - "modified": "2026-06-14 13:43:51.040978", + "modified": "2026-07-03 13:43:51.040978", "modified_by": "Administrator", "module": "Accounts", "name": "Share Management", @@ -30,7 +30,7 @@ { "child": 1, "collapsible": 1, - "icon": "customer", + "icon": "user", "indent": 0, "keep_closed": 0, "label": "Shareholder", diff --git a/erpnext/accounts/workspace/subscriptions/subscriptions.json b/erpnext/accounts/workspace/subscriptions/subscriptions.json index 750573eb38c..f97c4a09b95 100644 --- a/erpnext/accounts/workspace/subscriptions/subscriptions.json +++ b/erpnext/accounts/workspace/subscriptions/subscriptions.json @@ -8,14 +8,14 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "accounting", + "icon": "wallet", "idx": 0, "indicator_color": "green", "is_hidden": 0, "label": "Subscriptions", "link_type": "DocType", "links": [], - "modified": "2026-06-14 14:08:36.999272", + "modified": "2026-07-03 14:08:36.999272", "modified_by": "Administrator", "module": "Accounts", "name": "Subscriptions", diff --git a/erpnext/accounts/workspace/taxes/taxes.json b/erpnext/accounts/workspace/taxes/taxes.json index f2ccf3aa7e7..e94bacb66d3 100644 --- a/erpnext/accounts/workspace/taxes/taxes.json +++ b/erpnext/accounts/workspace/taxes/taxes.json @@ -8,14 +8,14 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "money-coins-1", + "icon": "coins", "idx": 0, "indicator_color": "green", "is_hidden": 0, "label": "Taxes", "link_type": "DocType", "links": [], - "modified": "2026-06-14 13:43:50.894825", + "modified": "2026-07-03 13:43:50.894825", "modified_by": "Administrator", "module": "Accounts", "module_onboarding": "Accounting Onboarding", @@ -58,7 +58,7 @@ { "child": 0, "collapsible": 1, - "icon": "stock", + "icon": "package", "indent": 0, "keep_closed": 0, "label": "Item Tax Template", diff --git a/erpnext/assets/workspace/assets/assets.json b/erpnext/assets/workspace/assets/assets.json index fae323faad2..82864944ee9 100644 --- a/erpnext/assets/workspace/assets/assets.json +++ b/erpnext/assets/workspace/assets/assets.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "assets", + "icon": "archive", "idx": 0, "is_hidden": 0, "label": "Assets", @@ -199,7 +199,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:08.417956", + "modified": "2026-07-03 13:44:08.417956", "modified_by": "Administrator", "module": "Assets", "module_onboarding": "Asset Onboarding", @@ -217,7 +217,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -230,7 +230,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -295,7 +295,7 @@ { "child": 0, "collapsible": 1, - "icon": "getting-started", + "icon": "rocket", "indent": 1, "keep_closed": 1, "label": "Maintenance", diff --git a/erpnext/buying/workspace/buying/buying.json b/erpnext/buying/workspace/buying/buying.json index 268501949a7..cfd480b3312 100644 --- a/erpnext/buying/workspace/buying/buying.json +++ b/erpnext/buying/workspace/buying/buying.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "buying", + "icon": "shopping-cart", "idx": 0, "is_hidden": 0, "label": "Buying", @@ -501,7 +501,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:43:50.509039", + "modified": "2026-07-03 13:43:50.509039", "modified_by": "Administrator", "module": "Buying", "module_onboarding": "Buying Onboarding", @@ -532,7 +532,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -545,7 +545,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -610,7 +610,7 @@ { "child": 0, "collapsible": 1, - "icon": "liabilities", + "icon": "scale", "indent": 0, "keep_closed": 0, "label": "Purchase Invoice", diff --git a/erpnext/crm/doctype/campaign/campaign.js b/erpnext/crm/doctype/campaign/campaign.js index 933bd2dfd70..8c8fb31ca42 100644 --- a/erpnext/crm/doctype/campaign/campaign.js +++ b/erpnext/crm/doctype/campaign/campaign.js @@ -17,7 +17,7 @@ frappe.ui.form.on("Campaign", { frappe.route_options = { utm_source: "Campaign", utm_campaign: frm.doc.name }; frappe.set_route("List", "Lead"); }, - "fa fa-list", + null, true ); } diff --git a/erpnext/crm/workspace/crm/crm.json b/erpnext/crm/workspace/crm/crm.json index 52e1a1acbfb..a6835f31222 100644 --- a/erpnext/crm/workspace/crm/crm.json +++ b/erpnext/crm/workspace/crm/crm.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "crm", + "icon": "handshake", "idx": 0, "is_hidden": 0, "label": "CRM", @@ -421,7 +421,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:08.297053", + "modified": "2026-07-03 13:44:08.297053", "modified_by": "Administrator", "module": "CRM", "name": "CRM", @@ -471,7 +471,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Home", @@ -510,7 +510,7 @@ { "child": 0, "collapsible": 1, - "icon": "customer", + "icon": "user", "indent": 0, "keep_closed": 0, "label": "Customer", @@ -644,7 +644,7 @@ { "child": 0, "collapsible": 1, - "icon": "getting-started", + "icon": "rocket", "indent": 1, "keep_closed": 1, "label": "Maintenance", @@ -776,7 +776,7 @@ { "child": 0, "collapsible": 1, - "icon": "sell", + "icon": "store", "indent": 1, "keep_closed": 1, "label": "Campaign", diff --git a/erpnext/desktop_icon/accounting.json b/erpnext/desktop_icon/accounting.json index fd88cf09166..dca95c9591e 100644 --- a/erpnext/desktop_icon/accounting.json +++ b/erpnext/desktop_icon/accounting.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "accounting", + "icon": "wallet", "icon_type": "Folder", "idx": 1, "label": "Accounting", "link_to": "", "link_type": "Workspace Sidebar", - "modified": "2026-01-27 17:04:04.351402", + "modified": "2026-07-03 17:04:04.351402", "modified_by": "Administrator", "name": "Accounting", "owner": "Administrator", diff --git a/erpnext/desktop_icon/assets.json b/erpnext/desktop_icon/assets.json index b9b52466a08..8494c0b3bce 100644 --- a/erpnext/desktop_icon/assets.json +++ b/erpnext/desktop_icon/assets.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "assets", + "icon": "archive", "icon_type": "Link", "idx": 1, "label": "Assets", "link_to": "Assets", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.220411", + "modified": "2026-07-03 20:07:01.220411", "modified_by": "Administrator", "name": "Assets", "owner": "Administrator", diff --git a/erpnext/desktop_icon/budget.json b/erpnext/desktop_icon/budget.json index 6dcf9f8c3df..0d12c203699 100644 --- a/erpnext/desktop_icon/budget.json +++ b/erpnext/desktop_icon/budget.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "expenses", + "icon": "chart-pie", "icon_type": "Link", "idx": 6, "label": "Budget", "link_to": "Budget", "link_type": "Workspace Sidebar", - "modified": "2026-01-23 14:39:30.839274", + "modified": "2026-07-03 14:39:30.839274", "modified_by": "Administrator", "name": "Budget", "owner": "Administrator", diff --git a/erpnext/desktop_icon/buying.json b/erpnext/desktop_icon/buying.json index 64d6712defe..1f08e15b617 100644 --- a/erpnext/desktop_icon/buying.json +++ b/erpnext/desktop_icon/buying.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "buying", + "icon": "shopping-cart", "icon_type": "Link", "idx": 1, "label": "Buying", "link_to": "Buying", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.196163", + "modified": "2026-07-03 20:07:01.196163", "modified_by": "Administrator", "name": "Buying", "owner": "Administrator", diff --git a/erpnext/desktop_icon/crm.json b/erpnext/desktop_icon/crm.json index d9dbe85cac2..af8002dc31b 100644 --- a/erpnext/desktop_icon/crm.json +++ b/erpnext/desktop_icon/crm.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 1, - "icon": "crm", + "icon": "handshake", "icon_type": "Link", "idx": 1, "label": "CRM", "link_to": "CRM", "link_type": "Workspace Sidebar", - "modified": "2026-01-06 14:54:05.112927", + "modified": "2026-07-03 14:54:05.112927", "modified_by": "Administrator", "name": "CRM", "owner": "Administrator", diff --git a/erpnext/desktop_icon/erpnext_settings.json b/erpnext/desktop_icon/erpnext_settings.json index 247238ee502..3acdfa48706 100644 --- a/erpnext/desktop_icon/erpnext_settings.json +++ b/erpnext/desktop_icon/erpnext_settings.json @@ -4,14 +4,14 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "setting", + "icon": "settings", "icon_type": "Link", "idx": 10, "label": "ERPNext Settings", "link_to": "ERPNext Settings", "link_type": "Workspace Sidebar", "logo_url": "", - "modified": "2026-01-09 14:59:56.044037", + "modified": "2026-07-03 14:59:56.044037", "modified_by": "Administrator", "name": "ERPNext Settings", "owner": "Administrator", diff --git a/erpnext/desktop_icon/home.json b/erpnext/desktop_icon/home.json index 7245b5fe0c7..059ec0461c2 100644 --- a/erpnext/desktop_icon/home.json +++ b/erpnext/desktop_icon/home.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 1, - "icon": "home", + "icon": "house", "icon_type": "Link", "idx": 0, "label": "Home", "link_to": "Home", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.174950", + "modified": "2026-07-03 20:07:01.174950", "modified_by": "Administrator", "name": "Home", "owner": "Administrator", diff --git a/erpnext/desktop_icon/invoicing.json b/erpnext/desktop_icon/invoicing.json index ab516c0372f..51f32ce68c7 100644 --- a/erpnext/desktop_icon/invoicing.json +++ b/erpnext/desktop_icon/invoicing.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "accounting", + "icon": "wallet", "icon_type": "Link", "idx": 0, "label": "Invoicing", "link_to": "Invoicing", "link_type": "Workspace Sidebar", - "modified": "2026-01-23 15:17:23.564795", + "modified": "2026-07-03 15:17:23.564795", "modified_by": "Administrator", "name": "Invoicing", "owner": "Administrator", diff --git a/erpnext/desktop_icon/manufacturing.json b/erpnext/desktop_icon/manufacturing.json index 1f610094cac..38e411fab16 100644 --- a/erpnext/desktop_icon/manufacturing.json +++ b/erpnext/desktop_icon/manufacturing.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "organization", + "icon": "factory", "icon_type": "Link", "idx": 1, "label": "Manufacturing", "link_to": "Manufacturing", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.246693", + "modified": "2026-07-03 20:07:01.246693", "modified_by": "Administrator", "name": "Manufacturing", "owner": "Administrator", diff --git a/erpnext/desktop_icon/projects.json b/erpnext/desktop_icon/projects.json index 2fc1e054f6b..75aef112758 100644 --- a/erpnext/desktop_icon/projects.json +++ b/erpnext/desktop_icon/projects.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "project", + "icon": "folder-kanban", "icon_type": "Link", "idx": 1, "label": "Projects", "link_to": "Projects", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.226383", + "modified": "2026-07-03 20:07:01.226383", "modified_by": "Administrator", "name": "Projects", "owner": "Administrator", diff --git a/erpnext/desktop_icon/quality.json b/erpnext/desktop_icon/quality.json index d9b036198e3..e26c2fd81bb 100644 --- a/erpnext/desktop_icon/quality.json +++ b/erpnext/desktop_icon/quality.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "quality", + "icon": "shield-check", "icon_type": "Link", "idx": 1, "label": "Quality", "link_to": "Quality", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.239523", + "modified": "2026-07-03 20:07:01.239523", "modified_by": "Administrator", "name": "Quality", "owner": "Administrator", diff --git a/erpnext/desktop_icon/selling.json b/erpnext/desktop_icon/selling.json index f0041fe0116..1dfbe4344ca 100644 --- a/erpnext/desktop_icon/selling.json +++ b/erpnext/desktop_icon/selling.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "sell", + "icon": "store", "icon_type": "Link", "idx": 1, "label": "Selling", "link_to": "Selling", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.189446", + "modified": "2026-07-03 20:07:01.189446", "modified_by": "Administrator", "name": "Selling", "owner": "Administrator", diff --git a/erpnext/desktop_icon/stock.json b/erpnext/desktop_icon/stock.json index a2488c36c13..2928c8987e5 100644 --- a/erpnext/desktop_icon/stock.json +++ b/erpnext/desktop_icon/stock.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "stock", + "icon": "package", "icon_type": "Link", "idx": 1, "label": "Stock", "link_to": "Stock", "link_type": "Workspace Sidebar", - "modified": "2026-01-01 20:07:01.212940", + "modified": "2026-07-03 20:07:01.212940", "modified_by": "Administrator", "name": "Stock", "owner": "Administrator", diff --git a/erpnext/desktop_icon/subcontracting.json b/erpnext/desktop_icon/subcontracting.json index e84b34f9d88..a70ae8b894c 100644 --- a/erpnext/desktop_icon/subcontracting.json +++ b/erpnext/desktop_icon/subcontracting.json @@ -4,14 +4,14 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 0, - "icon": "getting-started", + "icon": "package-2", "icon_type": "Link", "idx": 6, "label": "Subcontracting", "link_to": "Subcontracting", "link_type": "Workspace Sidebar", "logo_url": "/assets/erpnext/desktop_icons/subcontracting.svg", - "modified": "2026-01-01 20:07:01.323508", + "modified": "2026-07-03 20:07:01.323508", "modified_by": "Administrator", "name": "Subcontracting", "owner": "Administrator", diff --git a/erpnext/desktop_icon/support.json b/erpnext/desktop_icon/support.json index 873b2a798b0..986ff81ca51 100644 --- a/erpnext/desktop_icon/support.json +++ b/erpnext/desktop_icon/support.json @@ -4,13 +4,13 @@ "docstatus": 0, "doctype": "Desktop Icon", "hidden": 1, - "icon": "support", + "icon": "headset", "icon_type": "Link", "idx": 1, "label": "Support", "link_to": "Support", "link_type": "Workspace Sidebar", - "modified": "2026-01-06 14:53:54.100467", + "modified": "2026-07-03 14:53:54.100467", "modified_by": "Administrator", "name": "Support", "owner": "Administrator", diff --git a/erpnext/manufacturing/doctype/workstation/workstation.js b/erpnext/manufacturing/doctype/workstation/workstation.js index dae339fd716..3282e4f0ca7 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation.js +++ b/erpnext/manufacturing/doctype/workstation/workstation.js @@ -232,8 +232,8 @@ class WorkstationDashboard { .find(".section-body-job-card") .hasClass("hide") ) - $(e.currentTarget).html(frappe.utils.icon("es-line-down", "sm", "mb-1")); - else $(e.currentTarget).html(frappe.utils.icon("es-line-up", "sm", "mb-1")); + $(e.currentTarget).html(frappe.utils.icon("chevron-down", "sm", "mb-1")); + else $(e.currentTarget).html(frappe.utils.icon("chevron-up", "sm", "mb-1")); }); } diff --git a/erpnext/manufacturing/doctype/workstation/workstation_job_card.html b/erpnext/manufacturing/doctype/workstation/workstation_job_card.html index 2049f3fe6a5..1931a60ec09 100644 --- a/erpnext/manufacturing/doctype/workstation/workstation_job_card.html +++ b/erpnext/manufacturing/doctype/workstation/workstation_job_card.html @@ -80,7 +80,7 @@ - + diff --git a/erpnext/manufacturing/workspace/manufacturing/manufacturing.json b/erpnext/manufacturing/workspace/manufacturing/manufacturing.json index 4586876bbc6..2e9ae99bc19 100644 --- a/erpnext/manufacturing/workspace/manufacturing/manufacturing.json +++ b/erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "organization", + "icon": "building-2", "idx": 1, "is_hidden": 0, "label": "Manufacturing", @@ -432,7 +432,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:07.420267", + "modified": "2026-07-03 13:44:07.420267", "modified_by": "Administrator", "module": "Manufacturing", "module_onboarding": "Manufacturing Onboarding", @@ -463,7 +463,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -476,7 +476,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -528,7 +528,7 @@ { "child": 0, "collapsible": 1, - "icon": "stock", + "icon": "package", "indent": 0, "keep_closed": 0, "label": "Stock Entry", @@ -541,7 +541,7 @@ { "child": 0, "collapsible": 1, - "icon": "getting-started", + "icon": "rocket", "indent": 1, "keep_closed": 1, "label": "Material Planning", @@ -627,7 +627,7 @@ { "child": 0, "collapsible": 1, - "icon": "tool", + "icon": "wrench", "indent": 1, "keep_closed": 1, "label": "Tools", diff --git a/erpnext/projects/workspace/projects/projects.json b/erpnext/projects/workspace/projects/projects.json index 55a296d4d0d..029dd077c9f 100644 --- a/erpnext/projects/workspace/projects/projects.json +++ b/erpnext/projects/workspace/projects/projects.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "project", + "icon": "folder-kanban", "idx": 1, "is_hidden": 0, "label": "Projects", @@ -367,7 +367,7 @@ "type": "Link" } ], - "modified": "2026-07-01 13:20:50.651608", + "modified": "2026-07-03 13:20:50.651608", "modified_by": "Administrator", "module": "Projects", "module_onboarding": "Projects Onboarding", @@ -399,7 +399,7 @@ "child": 0, "collapsible": 1, "default_workspace": 0, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -413,7 +413,7 @@ "child": 0, "collapsible": 1, "default_workspace": 0, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -427,7 +427,7 @@ "child": 0, "collapsible": 1, "default_workspace": 0, - "icon": "projects", + "icon": "folder-kanban", "indent": 0, "keep_closed": 0, "label": "Project", diff --git a/erpnext/public/js/bom_configurator/bom_configurator.bundle.js b/erpnext/public/js/bom_configurator/bom_configurator.bundle.js index 07871687006..b2d55dda9c4 100644 --- a/erpnext/public/js/bom_configurator/bom_configurator.bundle.js +++ b/erpnext/public/js/bom_configurator/bom_configurator.bundle.js @@ -111,7 +111,7 @@ class BOMConfigurator { this.frm?.doc.docstatus === 0 ? [ { - label: __(frappe.utils.icon("edit", "sm") + " BOM"), + label: __(frappe.utils.icon("pencil", "sm") + " BOM"), click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.edit_bom(node, view); @@ -119,7 +119,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("add", "sm") + " Raw Material"), + label: __(frappe.utils.icon("plus", "sm") + " Raw Material"), click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.add_item(node, view); @@ -130,7 +130,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("add", "sm") + " Sub Assembly"), + label: __(frappe.utils.icon("plus", "sm") + " Sub Assembly"), click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.add_sub_assembly(node, view); @@ -141,7 +141,7 @@ class BOMConfigurator { btnClass: "hidden-xs", }, { - label: __(frappe.utils.icon("add", "sm") + " Phantom Item"), + label: __(frappe.utils.icon("plus", "sm") + " Phantom Item"), click: function (node) { let view = frappe.views.trees["BOM Configurator"]; view.events.add_sub_assembly(node, view, true); diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js index 87f5bdc0a5a..0559e3786d2 100644 --- a/erpnext/public/js/setup_wizard.js +++ b/erpnext/public/js/setup_wizard.js @@ -118,7 +118,6 @@ erpnext.setup.slides_settings = [ // Organization name: "organization", title: __("Setup your organization"), - icon: "fa fa-building", fields: [ { fieldname: "company_name", diff --git a/erpnext/public/js/telephony.js b/erpnext/public/js/telephony.js index 39d9c0f2f6a..f167a5ecc78 100644 --- a/erpnext/public/js/telephony.js +++ b/erpnext/public/js/telephony.js @@ -27,7 +27,7 @@ frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlDat ` - ${frappe.utils.icon("call")} + ${frappe.utils.icon("phone")} ` ) diff --git a/erpnext/public/js/templates/call_link.html b/erpnext/public/js/templates/call_link.html index 071078c776e..2ae1be68bfd 100644 --- a/erpnext/public/js/templates/call_link.html +++ b/erpnext/public/js/templates/call_link.html @@ -10,7 +10,7 @@ - + diff --git a/erpnext/public/js/templates/crm_activities.html b/erpnext/public/js/templates/crm_activities.html index 5d0bc16ce32..30b8d0444bc 100644 --- a/erpnext/public/js/templates/crm_activities.html +++ b/erpnext/public/js/templates/crm_activities.html @@ -3,7 +3,7 @@ @@ -27,7 +27,7 @@
      - + diff --git a/erpnext/public/js/templates/crm_notes.html b/erpnext/public/js/templates/crm_notes.html index a20e6c2723c..af3c703979d 100644 --- a/erpnext/public/js/templates/crm_notes.html +++ b/erpnext/public/js/templates/crm_notes.html @@ -2,7 +2,7 @@
      @@ -33,7 +33,7 @@
      - + diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js index dd585041d71..140fbf2bf67 100644 --- a/erpnext/public/js/utils/barcode_scanner.js +++ b/erpnext/public/js/utils/barcode_scanner.js @@ -491,7 +491,7 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner { const clear_btn = ` - ${frappe.utils.icon("close", "xs", "es-icon")} + ${frappe.utils.icon("x", "xs")} `; diff --git a/erpnext/quality_management/workspace/quality/quality.json b/erpnext/quality_management/workspace/quality/quality.json index adde0e308dc..d9b8ed55b06 100644 --- a/erpnext/quality_management/workspace/quality/quality.json +++ b/erpnext/quality_management/workspace/quality/quality.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "quality", + "icon": "shield-check", "idx": 0, "is_hidden": 0, "label": "Quality", @@ -161,7 +161,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:07.920643", + "modified": "2026-07-03 13:44:07.920643", "modified_by": "Administrator", "module": "Quality Management", "name": "Quality", @@ -178,7 +178,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -217,7 +217,7 @@ { "child": 0, "collapsible": 1, - "icon": "review", + "icon": "star", "indent": 0, "keep_closed": 0, "label": "Quality Review", diff --git a/erpnext/selling/doctype/installation_note/installation_note.js b/erpnext/selling/doctype/installation_note/installation_note.js index 43badd36c06..e8125d3e300 100644 --- a/erpnext/selling/doctype/installation_note/installation_note.js +++ b/erpnext/selling/doctype/installation_note/installation_note.js @@ -74,7 +74,7 @@ erpnext.selling.InstallationNote = class InstallationNote extends frappe.ui.form }, }); }, - "fa fa-download", + null, "btn-default" ); } diff --git a/erpnext/selling/page/point_of_sale/pos_item_selector.js b/erpnext/selling/page/point_of_sale/pos_item_selector.js index f05040c6a08..e09bc3c3413 100644 --- a/erpnext/selling/page/point_of_sale/pos_item_selector.js +++ b/erpnext/selling/page/point_of_sale/pos_item_selector.js @@ -279,14 +279,14 @@ erpnext.PointOfSale.ItemSelector = class { this.search_field.$wrapper.find(".control-input").append( ` - ${frappe.utils.icon("close", "sm")} + ${frappe.utils.icon("x", "sm")} ` ); this.item_group_field.$wrapper.find(".link-btn").append( ` - ${frappe.utils.icon("close", "xs", "es-icon")} + ${frappe.utils.icon("x", "xs")} ` ); diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.js b/erpnext/selling/page/sales_funnel/sales_funnel.js index 2af2caf844c..326bd52426b 100644 --- a/erpnext/selling/page/sales_funnel/sales_funnel.js +++ b/erpnext/selling/page/sales_funnel/sales_funnel.js @@ -57,7 +57,7 @@ erpnext.SalesFunnel = class SalesFunnel { function () { me.get_data(); }, - "fa fa-refresh" + "refresh-cw" ), }); diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.json b/erpnext/selling/page/sales_funnel/sales_funnel.json index e60b97554b4..d2cd1bd232c 100644 --- a/erpnext/selling/page/sales_funnel/sales_funnel.json +++ b/erpnext/selling/page/sales_funnel/sales_funnel.json @@ -2,9 +2,9 @@ "creation": "2013-10-04 13:17:18.000000", "docstatus": 0, "doctype": "Page", - "icon": "fa fa-filter", + "icon": "funnel", "idx": 1, - "modified": "2013-10-04 13:17:18.000000", + "modified": "2026-07-03 13:17:18.000000", "modified_by": "Administrator", "module": "Selling", "name": "sales-funnel", diff --git a/erpnext/selling/workspace/selling/selling.json b/erpnext/selling/workspace/selling/selling.json index b2b81a6e07c..7bcc6264948 100644 --- a/erpnext/selling/workspace/selling/selling.json +++ b/erpnext/selling/workspace/selling/selling.json @@ -13,7 +13,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "sell", + "icon": "store", "idx": 0, "is_hidden": 0, "label": "Selling", @@ -622,7 +622,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:44:07.820564", + "modified": "2026-07-03 13:44:07.820564", "modified_by": "Administrator", "module": "Selling", "module_onboarding": "Selling Onboarding", @@ -653,7 +653,7 @@ { "child": 0, "collapsible": 1, - "icon": "home", + "icon": "house", "indent": 0, "keep_closed": 0, "label": "Home", @@ -666,7 +666,7 @@ { "child": 0, "collapsible": 1, - "icon": "chart", + "icon": "chart-column", "indent": 0, "keep_closed": 0, "label": "Dashboard", @@ -692,7 +692,7 @@ { "child": 0, "collapsible": 1, - "icon": "sell", + "icon": "store", "indent": 0, "keep_closed": 0, "label": "Sales Order", @@ -839,7 +839,7 @@ { "child": 0, "collapsible": 1, - "icon": "stock", + "icon": "package", "indent": 1, "keep_closed": 1, "label": "Items & Pricing", diff --git a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json index 7398a65b56e..57e558c0e7d 100644 --- a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json +++ b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json @@ -8,7 +8,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "setting", + "icon": "sliders-horizontal", "idx": 0, "is_hidden": 0, "label": "ERPNext Settings", @@ -69,7 +69,7 @@ "type": "Link" } ], - "modified": "2026-06-14 13:43:50.429297", + "modified": "2026-07-03 13:43:50.429297", "modified_by": "Administrator", "module": "Setup", "name": "ERPNext Settings", @@ -97,7 +97,7 @@ "type": "DocType" }, { - "icon": "accounting", + "icon": "wallet", "label": "Accounts Settings", "link_to": "Accounts Settings", "type": "DocType" @@ -110,19 +110,19 @@ "type": "DocType" }, { - "icon": "stock", + "icon": "package", "label": "Stock Settings", "link_to": "Stock Settings", "type": "DocType" }, { - "icon": "sell", + "icon": "store", "label": "Selling Settings", "link_to": "Selling Settings", "type": "DocType" }, { - "icon": "buying", + "icon": "shopping-cart", "label": "Buying Settings", "link_to": "Buying Settings", "type": "DocType" @@ -158,7 +158,7 @@ { "child": 0, "collapsible": 1, - "icon": "accounting", + "icon": "wallet", "indent": 0, "keep_closed": 0, "label": "Accounts Settings", @@ -184,7 +184,7 @@ { "child": 0, "collapsible": 1, - "icon": "sell", + "icon": "store", "indent": 0, "keep_closed": 0, "label": "Selling Settings", @@ -197,7 +197,7 @@ { "child": 0, "collapsible": 1, - "icon": "buying", + "icon": "shopping-cart", "indent": 0, "keep_closed": 0, "label": "Buying Settings", @@ -210,7 +210,7 @@ { "child": 0, "collapsible": 1, - "icon": "stock", + "icon": "package", "indent": 0, "keep_closed": 0, "label": "Stock Settings", @@ -236,7 +236,7 @@ { "child": 0, "collapsible": 1, - "icon": "projects", + "icon": "folder-kanban", "indent": 0, "keep_closed": 0, "label": "Projects Settings", @@ -249,7 +249,7 @@ { "child": 0, "collapsible": 1, - "icon": "crm", + "icon": "handshake", "indent": 0, "keep_closed": 0, "label": "CRM Settings", @@ -262,7 +262,7 @@ { "child": 0, "collapsible": 1, - "icon": "support", + "icon": "headset", "indent": 0, "keep_closed": 0, "label": "Support Settings", @@ -275,7 +275,7 @@ { "child": 0, "collapsible": 1, - "icon": "getting-started", + "icon": "rocket", "indent": 1, "keep_closed": 1, "label": "Other Settings", diff --git a/erpnext/setup/workspace/home/home.json b/erpnext/setup/workspace/home/home.json index 9b1f186e934..076c0383ffb 100644 --- a/erpnext/setup/workspace/home/home.json +++ b/erpnext/setup/workspace/home/home.json @@ -8,7 +8,7 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "home", + "icon": "house", "idx": 0, "is_hidden": 0, "label": "Home", @@ -452,7 +452,7 @@ "type": "Link" } ], - "modified": "2026-07-01 14:22:16.927245", + "modified": "2026-07-03 14:22:16.927245", "modified_by": "Administrator", "module": "Setup", "name": "Home", diff --git a/erpnext/setup/workspace/organization/organization.json b/erpnext/setup/workspace/organization/organization.json index 50cab83acdb..45ca544db31 100644 --- a/erpnext/setup/workspace/organization/organization.json +++ b/erpnext/setup/workspace/organization/organization.json @@ -79,14 +79,14 @@ "doctype": "Workspace", "for_user": "", "hide_custom": 0, - "icon": "organization", + "icon": "building-2", "idx": 0, "indicator_color": "green", "is_hidden": 0, "label": "Organization", "link_type": "DocType", "links": [], - "modified": "2026-06-16 00:45:57.595188", + "modified": "2026-07-03 00:45:57.595188", "modified_by": "Administrator", "module": "Setup", "module_onboarding": "Organization Onboarding", @@ -103,7 +103,7 @@ "child": 0, "collapsible": 1, "default_workspace": 1, - "icon": "organization", + "icon": "building-2", "indent": 0, "keep_closed": 0, "label": "Company", diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 5eb7f07f4bd..4079f973683 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -475,7 +475,7 @@ function render_serial_batch_banner(wrapper) { let banner_html = `
      +
      + `); + this.bind_events(); + } + + get_csv_columns() { + if (cint(this.item.has_serial_no) && cint(this.item.has_batch_no)) { + return ["Serial No", "Batch No", "Quantity"]; + } + + if (cint(this.item.has_batch_no)) { + return ["Batch No", "Quantity"]; + } + + return ["Serial No"]; + } + + download_csv() { + let url; + if (this.bundle) { + url = `/api/method/erpnext.stock.doctype.serial_and_batch_bundle.inline_editor.download_bundle_entries_csv?bundle=${encodeURIComponent( + this.bundle + )}`; + } else { + url = `/api/method/erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.download_blank_csv_template?content=${encodeURIComponent( + JSON.stringify(this.get_csv_columns()) + )}`; + } + + const w = window.open(frappe.urllib.get_full_url(url)); + if (!w) { + frappe.msgprint(__("Please enable pop-ups")); + } + } + + upload_csv() { + new frappe.ui.FileUploader({ + allow_multiple: false, + restrictions: { allowed_file_types: [".csv"] }, + on_success: (file) => this.import_csv_file(file.file_url), + }); + } + + async import_csv_file(file_url) { + let data = await this.call( + "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.upload_csv_file", + { item_code: this.row.item_code, file_path: file_url } + ); + + let entries = []; + if (data.serial_nos && data.serial_nos.length) { + entries = data.serial_nos; + } else if (data.batch_nos && data.batch_nos.length) { + entries = data.batch_nos; + } + + if (!entries.length) { + frappe.msgprint(__("No entries found in the uploaded file")); + return; + } + + if (this.server_total_count || this.has_pending()) { + frappe.confirm(__("This will replace the existing entries. Continue?"), () => + this.replace_entries(entries) + ); + } else { + this.replace_entries(entries); + } + } + + async replace_entries(entries) { + this.clear_pending(); + await this.upsert({ entries, replace: 1 }); + if (this.frm.is_dirty()) { + this.frm.save(); + } + } + + async add_new_row() { + if (this.is_rejected && !this.row.rejected_warehouse) { + frappe.msgprint(__("Please set Rejected Warehouse first")); + return; + } + + let $pending = this.wrapper.find(".sbie-new-row"); + if ($pending.length) { + this.commit_new_row($pending); + if (this.wrapper.find(".sbie-new-row").length) { + this.wrapper.find(".sbie-new-row input").first().focus(); + return; + } + } + + let $tbody = this.wrapper.find(".sbie-table tbody"); + if (!$tbody.length) return; + + this.wrapper.find(".sbie-empty").remove(); + this.wrapper.find(".sbie-table").css("overflow", "visible"); + let $tr = $(this.get_new_row_html()).appendTo($tbody); + this.make_new_row_controls($tr); + } + + get_new_row_html() { + let show_serial = cint(this.item.has_serial_no); + let show_batch = cint(this.item.has_batch_no); + let qty_cell = show_serial + ? this.format_float(1) + : ``; + + return `
    ${this.get_effective_count() + 1}${qty_cell}
    ${__("No")}${__("Serial No")}${__("Batch No")}${__("Qty")}
    + ${this.start + i + 1}${serial_no}${batch_no}${ + !d.serial_no && show_batch ? this.get_qty_input(d, qty) : this.format_float(qty) + }
    + ${base_count + index + 1}${this.esc(d.serial_no || "")}${this.esc(d.batch_no || "")}${ + !d.serial_no && show_batch + ? this.get_pending_qty_input(d, index) + : this.format_float(d.qty) + }
    + ${__("Click on 'Add row' to add Serial / Batch entries")}
    ${header}${body}
    `); + + this.wrapper.find(".sbie-check-all").on("change", (e) => { + this.wrapper.find(".sbie-check").prop("checked", e.target.checked); + this.toggle_delete_button(); + }); + this.wrapper.find(".sbie-check").on("change", (e) => { + if (!e.target.checked) { + this.wrapper.find(".sbie-check-all").prop("checked", false); + } + this.toggle_delete_button(); + }); + this.wrapper.find(".sbie-batch-cell").on("click", (e) => this.edit_batch_cell($(e.currentTarget))); + this.wrapper.find(".sbie-serial-cell").on("click", (e) => this.edit_serial_cell($(e.currentTarget))); + this.wrapper.find(".sbie-qty-input").on("input", (e) => this.restrict_to_numeric(e)); + this.wrapper.find(".sbie-qty-input").on("blur", (e) => this.apply_float_format(e)); + this.wrapper.find(".sbie-qty-input").on("change", (e) => this.update_qty(e)); + this.wrapper.find(".sbie-qty-input").on("focus", (e) => e.target.select()); + this.toggle_delete_button(); + } + + get_qty_input(d, qty) { + return ``; + } + + get_pending_qty_input(d, index) { + return ``; + } + + format_float(value) { + let precision = cint(frappe.boot.sysdefaults && frappe.boot.sysdefaults.float_precision) || 3; + let formatted = flt(value, precision).toFixed(precision).replace(/0+$/, ""); + if (formatted.endsWith(".")) { + formatted += "0"; + } + return formatted; + } + + restrict_to_numeric(e) { + let $input = $(e.target); + let value = $input + .val() + .replace(/[^0-9.]/g, "") + .replace(/(\..*)\./g, "$1"); + if (value !== $input.val()) { + $input.val(value); + } + } + + apply_float_format(e) { + let $input = $(e.target); + if ($input.val() !== "") { + $input.val(this.format_float($input.val())); + } + } + + toggle_delete_button() { + let checked = this.wrapper.find(".sbie-check:checked").length; + let select_all = this.wrapper.find(".sbie-check-all").prop("checked"); + this.wrapper + .find(".sbie-delete") + .toggleClass("hidden", !checked) + .text(select_all ? __("Delete All") : __("Delete row")); + } + + update_summary() { + this.total_count = this.server_total_count; + this.wrapper.find(".sbie-summary").text(__("Total Qty: {0}", [this.get_effective_qty()])); + + let current_page = Math.floor(this.start / this.page_length) + 1; + this.wrapper + .find(".sbie-pagination") + .toggleClass("hidden", this.get_effective_count() <= this.page_length); + this.wrapper + .find(".sbie-page-number") + .val(current_page) + .css("width", (String(current_page).length + 1) * 8 + "px"); + this.wrapper.find(".sbie-total-pages").text(this.total_pages); + } + + update_qty(e) { + let $input = $(e.target); + let qty = flt($input.val()) || 1; + + if ($input.data("pending-index") != null) { + this.pending.new_entries[$input.data("pending-index")].qty = qty; + } else { + this.update_entry($input.data("name"), { qty: qty }); + } + + this.update_summary(); + this.sync_row_qty(); + } + + delete_selected() { + if (this.wrapper.find(".sbie-check-all").prop("checked")) { + this.delete_all_entries(); + return; + } + + let p = this.pending; + let pending_indexes = []; + + this.wrapper.find(".sbie-check:checked").each((_, el) => { + let $el = $(el); + if ($el.data("pending-index") != null) { + pending_indexes.push($el.data("pending-index")); + } else if ($el.data("name")) { + let name = $el.data("name"); + delete p.updates[name]; + p.deleted.push({ name: name, qty: flt($el.data("qty")) }); + } + }); + + p.new_entries = p.new_entries.filter((_, i) => !pending_indexes.includes(i)); + this.frm.dirty(); + this.refresh_view(); + } + + delete_all_entries() { + frappe.confirm( + __("This will delete all {0} entries. Continue?", [this.get_effective_count()]), + () => { + let p = this.pending; + p.delete_all = 1; + p.new_entries = []; + p.updates = {}; + p.deleted = []; + this.frm.dirty(); + this.start = 0; + this.refresh_view(); + } + ); + } + + async upsert({ entries = [], deleted = [], replace = 0 }) { + let summary = await this.call( + "erpnext.stock.doctype.serial_and_batch_bundle.inline_editor.upsert_bundle_entries", + { + child_row: Object.assign({}, this.row, { is_rejected: this.is_rejected }), + doc: this.frm.doc, + entries: entries, + deleted: deleted, + replace: replace, + } + ); + + if (this.bundle !== summary.bundle) { + await frappe.model.set_value(this.cdt, this.cdn, this.bundle_field, summary.bundle); + } + await frappe.model.set_value(this.cdt, this.cdn, this.qty_field, summary.total_qty); + + this._totals_loaded = false; + await this.load_page(); + } + + call(method, args) { + return new Promise((resolve, reject) => { + frappe.call({ + method: method, + args: args, + callback: (r) => resolve(r.message), + error: reject, + }); + }); + } +}; + +erpnext.stock.SBIE_DOCTYPES = [ + { parent: "Purchase Receipt", child: "Purchase Receipt Item", table: "items" }, + { parent: "Purchase Invoice", child: "Purchase Invoice Item", table: "items" }, + { parent: "Sales Invoice", child: "Sales Invoice Item", table: "items" }, + { parent: "Sales Invoice", child: "Packed Item", table: "packed_items" }, + { parent: "POS Invoice", child: "POS Invoice Item", table: "items" }, + { parent: "POS Invoice", child: "Packed Item", table: "packed_items" }, + { parent: "Delivery Note", child: "Delivery Note Item", table: "items" }, + { parent: "Delivery Note", child: "Packed Item", table: "packed_items" }, + { parent: "Stock Entry", child: "Stock Entry Detail", table: "items" }, + { parent: "Stock Reconciliation", child: "Stock Reconciliation Item", table: "items" }, + { parent: "Subcontracting Receipt", child: "Subcontracting Receipt Item", table: "items" }, + { + parent: "Subcontracting Receipt", + child: "Subcontracting Receipt Supplied Item", + table: "supplied_items", + qty_field: "consumed_qty", + }, + { parent: "Pick List", child: "Pick List Item", table: "locations" }, + { + parent: "Asset Capitalization", + child: "Asset Capitalization Stock Item", + table: "stock_items", + qty_field: "stock_qty", + }, + { + parent: "Asset Repair", + child: "Asset Repair Consumed Item", + table: "stock_items", + qty_field: "consumed_quantity", + }, +]; + +erpnext.stock.get_sbie_config = function (doctype, child_doctype) { + return erpnext.stock.SBIE_DOCTYPES.find((d) => d.parent === doctype && d.child === child_doctype); +}; + +erpnext.stock.get_sbie_row = function (frm, cdn) { + for (let config of erpnext.stock.SBIE_DOCTYPES) { + if (config.parent !== frm.doc.doctype) continue; + + let row = (frm.doc[config.table] || []).find((d) => d.name === cdn); + if (row) return { row, config }; + } + + return {}; +}; + +erpnext.stock.get_sbie_pending_map = function (frm) { + let store = (frm._sbie_pending = frm._sbie_pending || {}); + return (store[frm.doc.name] = store[frm.doc.name] || {}); +}; + +erpnext.stock.flush_serial_batch_pending = async function (frm) { + let pending_map = erpnext.stock.get_sbie_pending_map(frm); + + for (let key of Object.keys(pending_map)) { + let p = pending_map[key]; + let has_changes = + p.delete_all || p.new_entries.length || p.deleted.length || Object.keys(p.updates).length; + if (!has_changes) { + delete pending_map[key]; + continue; + } + + let [cdn, is_rejected] = key.split("::"); + let { row, config } = erpnext.stock.get_sbie_row(frm, cdn); + if (!row) { + delete pending_map[key]; + continue; + } + + let bundle_field = cint(is_rejected) ? "rejected_serial_and_batch_bundle" : "serial_and_batch_bundle"; + if (p.delete_all && !row[bundle_field] && !p.new_entries.length) { + delete pending_map[key]; + continue; + } + + let entries = p.new_entries.concat( + Object.keys(p.updates).map((name) => { + let update = { name: name }; + if (p.updates[name].qty != null) update.qty = p.updates[name].qty; + if (p.updates[name].batch_no) update.batch_no = p.updates[name].batch_no; + if (p.updates[name].serial_no) update.serial_no = p.updates[name].serial_no; + return update; + }) + ); + + let summary = await frappe.xcall( + "erpnext.stock.doctype.serial_and_batch_bundle.inline_editor.upsert_bundle_entries", + { + child_row: Object.assign({}, row, { is_rejected: cint(is_rejected) }), + doc: frm.doc, + entries: entries, + deleted: p.deleted.map((d) => d.name), + replace: cint(p.delete_all), + } + ); + + row[bundle_field] = summary.bundle; + row[cint(is_rejected) ? "rejected_qty" : config.qty_field || "qty"] = summary.total_qty; + if (row.received_qty != null) { + row.received_qty = flt(row.qty) + flt(row.rejected_qty); + } + delete pending_map[key]; + } +}; + +erpnext.stock.mount_serial_batch_inline_editor = async function (frm, cdt, cdn) { + let config = erpnext.stock.get_sbie_config(frm.doc.doctype, cdt); + if (!config || !frm.fields_dict[config.table]) return; + + let grid_row = frm.fields_dict[config.table].grid.grid_rows_by_docname[cdn]; + let grid_form = grid_row && grid_row.grid_form; + if (!grid_form) return; + + let editors = [ + { fieldname: "serial_batch_entries_html", is_rejected: 0 }, + { fieldname: "rejected_serial_batch_entries_html", is_rejected: 1 }, + ]; + + let enabled = await erpnext.stock.is_inline_serial_batch_editor_enabled(); + let row = locals[cdt][cdn]; + let show = enabled && row && !row.use_serial_batch_fields && frm.doc.docstatus === 0; + + erpnext.stock.toggle_legacy_bundle_fields(grid_form, show); + + let editors_store = (frm._sbie_editors = frm._sbie_editors || {}); + + for (let editor of editors) { + let field = grid_form.fields_dict[editor.fieldname]; + if (!field) continue; + + if (!show) { + field.$wrapper.closest(".form-section").hide(); + continue; + } + + let key = `${cdn}::${editor.is_rejected}`; + let existing = editors_store[key]; + if ( + existing && + existing.wrapper[0] === field.$wrapper[0] && + document.body.contains(field.$wrapper[0]) && + existing.wrapper.find(".serial-batch-inline-editor").length + ) { + continue; + } + + editors_store[key] = new erpnext.stock.SerialBatchInlineEditor({ + frm, + cdt, + cdn, + wrapper: field.$wrapper, + is_rejected: editor.is_rejected, + }); + } +}; + +erpnext.stock.toggle_legacy_bundle_fields = function (grid_form, editor_active) { + let legacy_fields = [ + "add_serial_batch_bundle", + "pick_serial_and_batch", + "serial_and_batch_bundle", + "add_serial_batch_for_rejected_qty", + "rejected_serial_and_batch_bundle", + ]; + + for (let fieldname of legacy_fields) { + let field = grid_form.fields_dict[fieldname]; + if (!field) continue; + + if (editor_active) { + field.$wrapper.hide(); + } else { + field.refresh(); + } + } +}; + +erpnext.stock.setup_serial_batch_pending_flush = function (doctype) { + frappe.ui.form.on(doctype, { + validate(frm) { + return erpnext.stock.flush_serial_batch_pending(frm); + }, + }); +}; + +erpnext.stock.setup_inline_serial_batch_editor = function () { + new Set(erpnext.stock.SBIE_DOCTYPES.map((d) => d.parent)).forEach((doctype) => + erpnext.stock.setup_serial_batch_pending_flush(doctype) + ); + + new Set(erpnext.stock.SBIE_DOCTYPES.map((d) => d.child)).forEach((child_doctype) => { + frappe.ui.form.on(child_doctype, { + form_render(frm, cdt, cdn) { + erpnext.stock.mount_serial_batch_inline_editor(frm, cdt, cdn); + }, + use_serial_batch_fields(frm, cdt, cdn) { + erpnext.stock.mount_serial_batch_inline_editor(frm, cdt, cdn); + }, + }); + }); +}; + +erpnext.stock.setup_inline_serial_batch_editor(); + +erpnext.stock.is_inline_serial_batch_editor_enabled = async function () { + if (erpnext.stock._inline_editor_enabled === undefined) { + let { message } = await frappe.db.get_value( + "Stock Settings", + "Stock Settings", + "use_inline_serial_batch_editor" + ); + erpnext.stock._inline_editor_enabled = cint(message && message.use_inline_serial_batch_editor); + } + + return erpnext.stock._inline_editor_enabled; +}; + +erpnext.stock.get_pick_serial_batch_based_on = async function () { + if (erpnext.stock._pick_serial_batch_based_on === undefined) { + let { message } = await frappe.db.get_value( + "Stock Settings", + "Stock Settings", + "pick_serial_and_batch_based_on" + ); + erpnext.stock._pick_serial_batch_based_on = + (message && message.pick_serial_and_batch_based_on) || "FIFO"; + } + + return erpnext.stock._pick_serial_batch_based_on; +}; diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json index 4b38b5a5633..5dd6d3d6d5c 100644 --- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json +++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -86,6 +86,8 @@ "serial_and_batch_bundle", "use_serial_batch_fields", "column_break_eaoe", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_qyjv", "serial_no", "column_break_rxvc", @@ -923,6 +925,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_qyjv", @@ -971,7 +982,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-06-08 20:00:00.000000", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note Item", diff --git a/erpnext/stock/doctype/packed_item/packed_item.json b/erpnext/stock/doctype/packed_item/packed_item.json index 2bf4112c1a3..0a8944580c3 100644 --- a/erpnext/stock/doctype/packed_item/packed_item.json +++ b/erpnext/stock/doctype/packed_item/packed_item.json @@ -26,6 +26,8 @@ "use_serial_batch_fields", "column_break_11", "serial_and_batch_bundle", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_bgys", "serial_no", "column_break_qlha", @@ -298,6 +300,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1 && !['Sales Order', 'Quotation'].includes(parent.doctype)", "fieldname": "section_break_bgys", @@ -338,7 +349,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-06-08 15:00:00.000000", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Packed Item", diff --git a/erpnext/stock/doctype/pick_list_item/pick_list_item.json b/erpnext/stock/doctype/pick_list_item/pick_list_item.json index 658dff42d7f..50713795fd0 100644 --- a/erpnext/stock/doctype/pick_list_item/pick_list_item.json +++ b/erpnext/stock/doctype/pick_list_item/pick_list_item.json @@ -32,6 +32,8 @@ "serial_and_batch_bundle", "use_serial_batch_fields", "column_break_20", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_ecxc", "serial_no", "column_break_belw", @@ -237,6 +239,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_ecxc", @@ -296,7 +307,7 @@ ], "istable": 1, "links": [], - "modified": "2026-07-01 14:27:50.617011", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Pick List Item", diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index 6409e05724b..ce445d75470 100644 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -101,6 +101,10 @@ "col_break5", "add_serial_batch_for_rejected_qty", "rejected_serial_and_batch_bundle", + "serial_batch_entries_section", + "serial_batch_entries_html", + "rejected_serial_batch_entries_section", + "rejected_serial_batch_entries_html", "section_break_3vxt", "serial_no", "rejected_serial_no", @@ -1117,12 +1121,30 @@ "no_copy": 1, "print_hide": 1, "read_only": 1 + }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, + { + "fieldname": "rejected_serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Rejected Serial / Batch Entries" + }, + { + "fieldname": "rejected_serial_batch_entries_html", + "fieldtype": "HTML" } ], "idx": 1, "istable": 1, "links": [], - "modified": "2026-06-08 21:00:00.000000", + "modified": "2026-07-16 15:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/inline_editor.py b/erpnext/stock/doctype/serial_and_batch_bundle/inline_editor.py new file mode 100644 index 00000000000..433c2bf0016 --- /dev/null +++ b/erpnext/stock/doctype/serial_and_batch_bundle/inline_editor.py @@ -0,0 +1,221 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +import frappe +from frappe import _ +from frappe.query_builder.functions import Count, Sum +from frappe.utils import cint, flt, parse_json + +from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import ( + create_serial_batch_no_ledgers, + get_type_of_transaction, + make_batch_nos, + make_serial_nos, +) + +SUPPORTED_VOUCHER_TYPES = frozenset( + [ + "Purchase Receipt", + "Purchase Invoice", + "Sales Invoice", + "POS Invoice", + "Delivery Note", + "Stock Entry", + "Stock Reconciliation", + "Subcontracting Receipt", + "Pick List", + "Asset Capitalization", + "Asset Repair", + ] +) + + +@frappe.whitelist() +def get_bundle_entries(bundle: str, start: int = 0, page_length: int = 50, search: str | None = None): + frappe.has_permission("Serial and Batch Bundle", "read", doc=bundle, throw=True) + page_length = min(cint(page_length) or 50, 500) + + table = frappe.qb.DocType("Serial and Batch Entry") + query = ( + frappe.qb.from_(table) + .select(table.name, table.serial_no, table.batch_no, table.qty) + .where(table.parent == bundle) + .orderby(table.idx) + .limit(page_length) + .offset(cint(start)) + ) + + if search: + search_term = f"%{search}%" + query = query.where((table.serial_no.like(search_term)) | (table.batch_no.like(search_term))) + + entries = query.run(as_dict=True) + summary = get_bundle_summary(bundle) + summary["entries"] = entries + + return summary + + +def get_bundle_summary(bundle): + table = frappe.qb.DocType("Serial and Batch Entry") + row = ( + frappe.qb.from_(table) + .select(Count(table.name).as_("total_count"), Sum(table.qty).as_("total_qty")) + .where(table.parent == bundle) + ).run(as_dict=True)[0] + + return frappe._dict( + { + "bundle": bundle, + "total_count": cint(row.total_count), + "total_qty": abs(flt(row.total_qty)), + } + ) + + +@frappe.whitelist() +def download_bundle_entries_csv(bundle: str): + from frappe.utils.csvutils import build_csv_response + + frappe.has_permission("Serial and Batch Bundle", "read", doc=bundle, throw=True) + doc = frappe.get_doc("Serial and Batch Bundle", bundle) + item = frappe.get_cached_value("Item", doc.item_code, ["has_serial_no", "has_batch_no"], as_dict=True) + + rows = [get_csv_columns(item)] + for entry in doc.entries: + if item.has_serial_no and item.has_batch_no: + rows.append([entry.serial_no, entry.batch_no, abs(entry.qty)]) + elif item.has_batch_no: + rows.append([entry.batch_no, abs(entry.qty)]) + else: + rows.append([entry.serial_no]) + + build_csv_response(rows, f"{bundle}-entries") + + +def get_csv_columns(item): + if item.has_serial_no and item.has_batch_no: + return ["Serial No", "Batch No", "Quantity"] + + if item.has_batch_no: + return ["Batch No", "Quantity"] + + return ["Serial No"] + + +@frappe.whitelist(methods=["POST"]) +def upsert_bundle_entries( + child_row: dict | str, + doc: dict | str, + entries: list | str | None = None, + deleted: list | str | None = None, + replace: int = 0, +): + child_row = parse_json(child_row) + doc = parse_json(doc) + entries = parse_json(entries) or [] + deleted = parse_json(deleted) or [] + + validate_parent_document(child_row, doc) + + bundle_field = ( + "rejected_serial_and_batch_bundle" if child_row.get("is_rejected") else "serial_and_batch_bundle" + ) + bundle_name = child_row.get(bundle_field) + if bundle_name and frappe.db.exists("Serial and Batch Bundle", bundle_name): + bundle = apply_incremental_changes(bundle_name, child_row, entries, deleted, cint(replace)) + if not bundle.entries: + remove_empty_bundle(bundle, child_row, bundle_field) + return frappe._dict({"bundle": None, "total_count": 0, "total_qty": 0}) + else: + if not entries: + frappe.throw(_("Please add at least one Serial No or Batch to save")) + + frappe.has_permission(doc.get("doctype"), "write", throw=True) + if get_type_of_transaction(doc, child_row) == "Inward": + make_serial_nos(child_row.item_code, entries) + make_batch_nos(child_row.item_code, entries) + + bundle = create_serial_batch_no_ledgers(entries, child_row, doc) + + return get_bundle_summary(bundle.name) + + +def validate_parent_document(child_row, doc): + if doc.get("doctype") not in SUPPORTED_VOUCHER_TYPES: + frappe.throw( + _("{0} is not supported for the inline Serial / Batch editor").format(doc.get("doctype")) + ) + + if child_row.get("parenttype") != doc.get("doctype"): + frappe.throw(_("The selected row does not belong to the {0}").format(doc.get("doctype"))) + + +def remove_empty_bundle(bundle, child_row, bundle_field): + child_doctype, child_name = child_row.get("doctype"), child_row.get("name") + if ( + child_name + and child_doctype + and frappe.get_meta(child_doctype).has_field(bundle_field) + and frappe.db.exists(child_doctype, {"name": child_name, bundle_field: bundle.name}) + ): + frappe.db.set_value(child_doctype, child_name, bundle_field, None) + + bundle.delete(ignore_permissions=True) + + +def apply_incremental_changes(bundle_name, child_row, entries, deleted, replace=0): + frappe.has_permission("Serial and Batch Bundle", "write", doc=bundle_name, throw=True) + bundle = frappe.get_doc("Serial and Batch Bundle", bundle_name) + + if bundle.docstatus == 1: + frappe.throw( + _("Serial and Batch Bundle {0} is submitted and its entries cannot be modified.").format( + frappe.bold(bundle_name) + ) + ) + + sign = 1 if bundle.type_of_transaction == "Inward" else -1 + + if replace: + bundle.set("entries", []) + deleted = [] + entries = [{key: value for key, value in row.items() if key != "name"} for row in entries] + + if deleted: + bundle.entries = [d for d in bundle.entries if d.name not in deleted] + + existing = {d.name: d for d in bundle.entries} + new_rows = [frappe._dict(row) for row in entries if not row.get("name")] + + for row in entries: + if row.get("name") and row["name"] in existing: + entry = existing[row["name"]] + if row.get("qty") is not None: + entry.qty = (flt(row.get("qty")) or 1.0) * sign + if row.get("batch_no"): + entry.batch_no = row.get("batch_no") + if row.get("serial_no"): + entry.serial_no = row.get("serial_no") + + if entries and bundle.type_of_transaction == "Inward": + incoming = [frappe._dict(row) for row in entries] + make_serial_nos(child_row.item_code, incoming) + make_batch_nos(child_row.item_code, incoming) + + for row in new_rows: + bundle.append( + "entries", + { + "qty": (flt(row.qty) or 1.0) * sign, + "warehouse": bundle.warehouse, + "batch_no": row.batch_no, + "serial_no": row.serial_no, + }, + ) + + if not bundle.entries: + return bundle + + bundle.save(ignore_permissions=True) + return bundle 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 fe671b32801..1269dcb46dd 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 @@ -3011,6 +3011,9 @@ def get_auto_batch_nos(kwargs): picked_batches, ) + if not kwargs.ignore_reserved_stock and not kwargs.for_stock_levels: + available_batches = remove_reservation_conflict_batches(available_batches, kwargs) + if kwargs.based_on == "Expiry": available_batches = sorted(available_batches, key=lambda x: x.expiry_date or getdate("9999-12-31")) @@ -3029,6 +3032,71 @@ def get_auto_batch_nos(kwargs): return get_qty_based_available_batches(available_batches, qty) +def remove_reservation_conflict_batches(available_batches, kwargs): + if not available_batches or not frappe.db.get_single_value("Stock Settings", "enable_stock_reservation"): + return available_batches + + conflicting_batches = get_cross_warehouse_reserved_batches(kwargs) + if not conflicting_batches: + return available_batches + + return [d for d in available_batches if d.batch_no not in conflicting_batches] + + +def get_cross_warehouse_reserved_batches(kwargs) -> set: + from erpnext.stock.doctype.batch.batch import get_batch_qty + + conflicting_batches = set() + for row in get_cross_warehouse_sre_details(kwargs): + if flt(row.outstanding_qty) <= 0: + continue + + batch_qty = get_batch_qty( + row.batch_no, + row.warehouse, + posting_date=kwargs.get("posting_date"), + posting_time=kwargs.get("posting_time"), + consider_negative_batches=True, + ) + + if flt(batch_qty, 6) < flt(row.outstanding_qty, 6): + conflicting_batches.add(row.batch_no) + + return conflicting_batches + + +def get_cross_warehouse_sre_details(kwargs): + sre = frappe.qb.DocType("Stock Reservation Entry") + sb_entry = frappe.qb.DocType("Serial and Batch Entry") + query = ( + frappe.qb.from_(sre) + .inner_join(sb_entry) + .on(sre.name == sb_entry.parent) + .select( + sb_entry.batch_no, + sre.warehouse, + Sum(sb_entry.qty - sb_entry.delivered_qty).as_("outstanding_qty"), + ) + .where( + (sre.docstatus == 1) + & (sre.item_code == kwargs.item_code) + & (sre.delivered_qty < sre.reserved_qty) + & (sre.reservation_based_on == "Serial and Batch") + & (sb_entry.batch_no.isnotnull()) + ) + .groupby(sb_entry.batch_no, sre.warehouse) + ) + + if kwargs.get("company"): + query = query.where(sre.company == kwargs.get("company")) + + if kwargs.warehouse: + warehouses = kwargs.warehouse if isinstance(kwargs.warehouse, list) else [kwargs.warehouse] + query = query.where(sre.warehouse.notin(warehouses)) + + return query.run(as_dict=True) + + def get_batch_nos_from_sre(kwargs): from frappe.query_builder.functions import Sum diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_inline_editor.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_inline_editor.py new file mode 100644 index 00000000000..9c2743aa36e --- /dev/null +++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_inline_editor.py @@ -0,0 +1,346 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import json + +import frappe + +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.stock.doctype.serial_and_batch_bundle.inline_editor import ( + get_bundle_entries, + upsert_bundle_entries, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestSerialBatchInlineEditor(ERPNextTestSuite): + def make_draft_pr(self, item_code, qty=2): + return make_purchase_receipt(item_code=item_code, qty=qty, rate=100, do_not_submit=True) + + def upsert(self, pr, entries=None, deleted=None, is_rejected=0, replace=0): + child_row = pr.items[0].as_dict() + child_row["is_rejected"] = is_rejected + + return upsert_bundle_entries( + child_row=json.dumps(child_row, default=str), + doc=json.dumps(pr.as_dict(), default=str), + entries=json.dumps(entries or []), + deleted=json.dumps(deleted or []), + replace=replace, + ) + + def reload_row(self, pr): + pr.reload() + return pr.items[0] + + def test_create_bundle_with_serials(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(2)] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + + self.assertTrue(frappe.db.exists("Serial and Batch Bundle", summary.bundle)) + self.assertEqual(summary.total_count, 2) + self.assertEqual(summary.total_qty, 2) + for serial_no in serials: + self.assertTrue(frappe.db.exists("Serial No", serial_no)) + + def test_incremental_append_preserves_existing_entries(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item, qty=3) + serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(3)] + + summary = self.upsert(pr, entries=[{"serial_no": serials[0]}, {"serial_no": serials[1]}]) + pr.items[0].serial_and_batch_bundle = summary.bundle + first_entry_names = set( + frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="name") + ) + + summary = self.upsert(pr, entries=[{"serial_no": serials[2]}]) + second_entry_names = set( + frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="name") + ) + + self.assertEqual(summary.total_count, 3) + self.assertTrue(first_entry_names.issubset(second_entry_names)) + + def test_delete_entries(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(2)] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + pr.items[0].serial_and_batch_bundle = summary.bundle + + to_delete = frappe.get_all( + "Serial and Batch Entry", {"parent": summary.bundle, "serial_no": serials[0]}, pluck="name" + ) + summary = self.upsert(pr, deleted=to_delete) + + self.assertEqual(summary.total_count, 1) + remaining = frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="serial_no") + self.assertEqual(remaining, [serials[1]]) + + def test_batch_qty_update(self): + item = make_item( + properties={ + "is_stock_item": 1, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "TSTBIE-.####", + } + ).name + pr = self.make_draft_pr(item, qty=5) + batch = frappe.get_doc(doctype="Batch", item=item).insert() + + summary = self.upsert(pr, entries=[{"batch_no": batch.name, "qty": 5}]) + pr.items[0].serial_and_batch_bundle = summary.bundle + self.assertEqual(summary.total_qty, 5) + + entry_name = frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="name")[0] + summary = self.upsert(pr, entries=[{"name": entry_name, "qty": 8}]) + + self.assertEqual(summary.total_qty, 8) + self.assertEqual(summary.total_count, 1) + + def test_update_serial_no_of_existing_entry(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item, qty=1) + old_serial = f"SN-{frappe.generate_hash(length=8)}" + new_serial = f"SN-{frappe.generate_hash(length=8)}" + + summary = self.upsert(pr, entries=[{"serial_no": old_serial}]) + pr.items[0].serial_and_batch_bundle = summary.bundle + entry_name = frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="name")[0] + + self.upsert(pr, entries=[{"name": entry_name, "serial_no": new_serial}]) + + self.assertEqual(frappe.db.get_value("Serial and Batch Entry", entry_name, "serial_no"), new_serial) + self.assertTrue(frappe.db.exists("Serial No", new_serial)) + + def test_auto_create_missing_batch_no(self): + item = make_item(properties={"is_stock_item": 1, "has_batch_no": 1}).name + pr = self.make_draft_pr(item, qty=5) + batch1 = f"BNEW-{frappe.generate_hash(length=8)}" + batch2 = f"BNEW-{frappe.generate_hash(length=8)}" + + self.assertFalse(frappe.db.exists("Batch", batch1)) + summary = self.upsert(pr, entries=[{"batch_no": batch1, "qty": 4}]) + self.assertTrue(frappe.db.exists("Batch", batch1)) + + pr.items[0].serial_and_batch_bundle = summary.bundle + summary = self.upsert(pr, entries=[{"batch_no": batch2, "qty": 1}]) + + self.assertTrue(frappe.db.exists("Batch", batch2)) + self.assertEqual(summary.total_qty, 5) + + def test_update_batch_no_of_existing_entry(self): + item = make_item( + properties={ + "is_stock_item": 1, + "has_batch_no": 1, + "create_new_batch": 1, + "batch_number_series": "TSTBIE-.####", + } + ).name + pr = self.make_draft_pr(item, qty=5) + batch1 = frappe.get_doc(doctype="Batch", item=item).insert() + batch2 = frappe.get_doc(doctype="Batch", item=item).insert() + + summary = self.upsert(pr, entries=[{"batch_no": batch1.name, "qty": 5}]) + pr.items[0].serial_and_batch_bundle = summary.bundle + + entry_name = frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="name")[0] + self.upsert(pr, entries=[{"name": entry_name, "batch_no": batch2.name}]) + + entry = frappe.db.get_value("Serial and Batch Entry", entry_name, ["batch_no", "qty"], as_dict=1) + self.assertEqual(entry.batch_no, batch2.name) + self.assertEqual(entry.qty, 5) + + def test_delete_all_entries_removes_bundle(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(2)] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + bundle = summary.bundle + pr.items[0].serial_and_batch_bundle = bundle + pr.items[0].db_set("serial_and_batch_bundle", bundle) + + to_delete = frappe.get_all("Serial and Batch Entry", {"parent": bundle}, pluck="name") + summary = self.upsert(pr, deleted=to_delete) + + self.assertFalse(summary.bundle) + self.assertEqual(summary.total_count, 0) + self.assertFalse(frappe.db.exists("Serial and Batch Bundle", bundle)) + self.assertFalse( + frappe.db.get_value("Purchase Receipt Item", pr.items[0].name, "serial_and_batch_bundle") + ) + + def test_remove_empty_bundle_ignores_spoofed_child_row(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + victim_pr = self.make_draft_pr(item) + + summary = self.upsert(pr, entries=[{"serial_no": f"SN-{frappe.generate_hash(length=8)}"}]) + bundle = summary.bundle + pr.items[0].db_set("serial_and_batch_bundle", bundle) + + victim_summary = self.upsert( + victim_pr, entries=[{"serial_no": f"SN-{frappe.generate_hash(length=8)}"}] + ) + victim_bundle = victim_summary.bundle + victim_pr.items[0].db_set("serial_and_batch_bundle", victim_bundle) + + child_row = pr.items[0].as_dict() + child_row["is_rejected"] = 0 + child_row["name"] = victim_pr.items[0].name + + to_delete = frappe.get_all("Serial and Batch Entry", {"parent": bundle}, pluck="name") + upsert_bundle_entries( + child_row=json.dumps(child_row, default=str), + doc=json.dumps(pr.as_dict(), default=str), + deleted=json.dumps(to_delete), + ) + + self.assertFalse(frappe.db.exists("Serial and Batch Bundle", bundle)) + self.assertEqual( + frappe.db.get_value("Purchase Receipt Item", victim_pr.items[0].name, "serial_and_batch_bundle"), + victim_bundle, + ) + + def test_pagination(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item, qty=5) + serials = sorted(f"SN-{frappe.generate_hash(length=8)}" for _ in range(5)) + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + + page = get_bundle_entries(summary.bundle, start=0, page_length=2) + self.assertEqual(len(page["entries"]), 2) + self.assertEqual(page["total_count"], 5) + + last_page = get_bundle_entries(summary.bundle, start=4, page_length=2) + self.assertEqual(len(last_page["entries"]), 1) + + def test_search_entries(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + token = frappe.generate_hash(length=8) + serials = [f"AAA-{token}", f"BBB-{token}"] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + + page = get_bundle_entries(summary.bundle, search=f"AAA-{token}") + self.assertEqual(len(page["entries"]), 1) + self.assertEqual(page["entries"][0].serial_no, f"AAA-{token}") + + def test_rejected_bundle_created_separately(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + pr.items[0].rejected_warehouse = "_Test Warehouse 1 - _TC" + + accepted = self.upsert(pr, entries=[{"serial_no": f"SN-{frappe.generate_hash(length=8)}"}]) + pr.items[0].serial_and_batch_bundle = accepted.bundle + + rejected = self.upsert( + pr, entries=[{"serial_no": f"SN-{frappe.generate_hash(length=8)}"}], is_rejected=1 + ) + + self.assertNotEqual(accepted.bundle, rejected.bundle) + bundle = frappe.get_doc("Serial and Batch Bundle", rejected.bundle) + self.assertEqual(bundle.is_rejected, 1) + self.assertEqual(bundle.warehouse, "_Test Warehouse 1 - _TC") + + def test_replace_entries(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item, qty=3) + old_serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(2)] + new_serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(3)] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in old_serials]) + pr.items[0].serial_and_batch_bundle = summary.bundle + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in new_serials], replace=1) + + self.assertEqual(summary.total_count, 3) + remaining = frappe.get_all("Serial and Batch Entry", {"parent": summary.bundle}, pluck="serial_no") + self.assertEqual(sorted(remaining), sorted(new_serials)) + + def test_replace_with_no_entries_removes_bundle(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + serials = [f"SN-{frappe.generate_hash(length=8)}" for _ in range(2)] + + summary = self.upsert(pr, entries=[{"serial_no": d} for d in serials]) + bundle = summary.bundle + pr.items[0].serial_and_batch_bundle = bundle + + summary = self.upsert(pr, entries=[], replace=1) + + self.assertFalse(summary.bundle) + self.assertEqual(summary.total_count, 0) + self.assertFalse(frappe.db.exists("Serial and Batch Bundle", bundle)) + + def test_create_bundle_for_stock_entry(self): + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + se = make_stock_entry(item_code=item, qty=2, to_warehouse="_Test Warehouse - _TC", do_not_submit=True) + + child_row = se.items[0].as_dict() + child_row["is_rejected"] = 0 + summary = upsert_bundle_entries( + child_row=json.dumps(child_row, default=str), + doc=json.dumps(se.as_dict(), default=str), + entries=json.dumps([{"serial_no": f"SN-{frappe.generate_hash(length=8)}"} for _ in range(2)]), + deleted=json.dumps([]), + ) + + bundle = frappe.get_doc("Serial and Batch Bundle", summary.bundle) + self.assertEqual(bundle.voucher_type, "Stock Entry") + self.assertEqual(bundle.type_of_transaction, "Inward") + self.assertEqual(summary.total_qty, 2) + + def test_upsert_requires_entries_for_new_bundle(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + + self.assertRaises(frappe.ValidationError, self.upsert, pr) + + def test_upsert_rejects_mismatched_parenttype(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + + child_row = pr.items[0].as_dict() + child_row["is_rejected"] = 0 + child_row["parenttype"] = "Task" + + self.assertRaises( + frappe.ValidationError, + upsert_bundle_entries, + child_row=json.dumps(child_row, default=str), + doc=json.dumps(pr.as_dict(), default=str), + entries=json.dumps([{"serial_no": "SBIE-PT-0001"}]), + ) + + def test_upsert_rejects_unsupported_voucher_type(self): + item = make_item(properties={"is_stock_item": 1, "has_serial_no": 1}).name + pr = self.make_draft_pr(item) + + child_row = pr.items[0].as_dict() + child_row["is_rejected"] = 0 + child_row["parenttype"] = "Task" + + doc = pr.as_dict() + doc["doctype"] = "Task" + + self.assertRaises( + frappe.ValidationError, + upsert_bundle_entries, + child_row=json.dumps(child_row, default=str), + doc=json.dumps(doc, default=str), + entries=json.dumps([{"serial_no": "SBIE-PT-0002"}]), + ) diff --git a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json index 167be4af85b..126daf21389 100644 --- a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json +++ b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -54,6 +54,8 @@ "use_serial_batch_fields", "col_break4", "serial_and_batch_bundle", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_rdtg", "serial_no", "column_break_prps", @@ -615,6 +617,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_rdtg", @@ -689,7 +700,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-07-03 12:11:53.714931", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Detail", diff --git a/erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json b/erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json index 4013049476b..3515666b690 100644 --- a/erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json +++ b/erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json @@ -25,6 +25,8 @@ "column_break_11", "serial_and_batch_bundle", "current_serial_and_batch_bundle", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_lypk", "serial_no", "column_break_eefq", @@ -246,6 +248,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_lypk", @@ -266,7 +277,7 @@ "grid_page_length": 50, "istable": 1, "links": [], - "modified": "2025-11-20 15:27:13.868179", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Stock", "name": "Stock Reconciliation Item", diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index 48981955052..bdd06893828 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -47,6 +47,7 @@ "pick_serial_and_batch_based_on", "allow_existing_serial_no", "use_serial_batch_fields", + "use_inline_serial_batch_editor", "disable_serial_no_and_batch_selector", "section_break_gnhq", "allow_negative_stock_for_batch", @@ -595,6 +596,14 @@ { "fieldname": "section_break_kcvr", "fieldtype": "Section Break" + }, + { + "default": "1", + "depends_on": "eval:!doc.use_serial_batch_fields", + "description": "Show an inline editable table for serial numbers / batches on the item row instead of the dialog", + "fieldname": "use_inline_serial_batch_editor", + "fieldtype": "Check", + "label": "Use Inline Serial / Batch Editor" } ], "icon": "icon-cog", @@ -602,7 +611,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-06-26 10:00:00.000000", + "modified": "2026-07-16 17:00:00.000000", "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 139c2f26851..557c3a1d901 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -66,6 +66,7 @@ class StockSettings(Document): stock_uom: DF.Link | None update_existing_price_list_rate: DF.Check update_price_list_based_on: DF.Literal["Rate", "Price List Rate"] + use_inline_serial_batch_editor: DF.Check use_naming_series: DF.Check use_serial_batch_fields: DF.Check validate_material_transfer_warehouses: DF.Check diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json b/erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json index 71f262d7663..4a0f1176c69 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json +++ b/erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json @@ -57,6 +57,10 @@ "col_break5", "add_serial_batch_for_rejected_qty", "rejected_serial_and_batch_bundle", + "serial_batch_entries_section", + "serial_batch_entries_html", + "rejected_serial_batch_entries_section", + "rejected_serial_batch_entries_html", "section_break_jshh", "serial_no", "rejected_serial_no", @@ -548,6 +552,24 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, + { + "fieldname": "rejected_serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Rejected Serial / Batch Entries" + }, + { + "fieldname": "rejected_serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_jshh", @@ -635,7 +657,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2026-06-01 10:00:00.000000", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Subcontracting", "name": "Subcontracting Receipt Item", diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json b/erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json index ce3494e879d..8d26da40863 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json +++ b/erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json @@ -30,6 +30,8 @@ "use_serial_batch_fields", "col_break4", "subcontracting_order", + "serial_batch_entries_section", + "serial_batch_entries_html", "section_break_zwnh", "serial_no", "column_break_qibi", @@ -221,6 +223,15 @@ "fieldtype": "Check", "label": "Use Serial No / Batch Fields" }, + { + "fieldname": "serial_batch_entries_section", + "fieldtype": "Section Break", + "label": "Serial / Batch Entries" + }, + { + "fieldname": "serial_batch_entries_html", + "fieldtype": "HTML" + }, { "depends_on": "eval:doc.use_serial_batch_fields === 1", "fieldname": "section_break_zwnh", @@ -264,7 +275,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2025-05-27 12:33:58.772638", + "modified": "2026-07-18 10:00:00.000000", "modified_by": "Administrator", "module": "Subcontracting", "name": "Subcontracting Receipt Supplied Item", From b3a616c328ee4f21632f3907a9edb4558ddcfa10 Mon Sep 17 00:00:00 2001 From: Afsal Syed Date: Mon, 20 Jul 2026 10:52:00 +0530 Subject: [PATCH 333/400] fix: correct typo in allow_negative_stock parameter --- .../stock_and_account_value_comparison.py | 4 ++-- .../stock_ledger_invariant_check.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py index b0684835c76..f34a79d9a57 100644 --- a/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py +++ b/erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py @@ -219,7 +219,7 @@ def create_reposting_entries(rows: str | list, company: str): "posting_date": sle.posting_date, "posting_time": sle.posting_time, "company": company, - "allow_nagative_stock": 1, + "allow_negative_stock": 1, } ).submit() @@ -265,7 +265,7 @@ def repost_based_on_transaction(rows, company=None, entries=None): "posting_date": row.get("posting_date"), "posting_time": row.get("posting_time"), "company": company, - "allow_nagative_stock": 1, + "allow_negative_stock": 1, "recalculate_valuation_rate": 1, } ).submit() diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py index db69923aeac..ed06c27a1ef 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py +++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py @@ -326,7 +326,7 @@ def create_reposting_entries(rows: str | list, item_code: str | None = None, war "warehouse": warehouse or row.warehouse, "posting_date": row.posting_date, "posting_time": row.posting_time, - "allow_nagative_stock": 1, + "allow_negative_stock": 1, } ).submit() From 21009c18c0017e7487751688e8d45270c61ae4d3 Mon Sep 17 00:00:00 2001 From: nishkagosalia Date: Mon, 20 Jul 2026 11:24:39 +0530 Subject: [PATCH 334/400] fix: project % complete field allowing modification when manual method --- erpnext/projects/doctype/project/project.json | 4 +-- erpnext/projects/doctype/project/project.py | 2 ++ .../projects/doctype/project/test_project.py | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index b55cec332bd..ec780e63e68 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -121,7 +121,7 @@ "in_list_view": 1, "label": "% Completed", "no_copy": 1, - "read_only": 1 + "read_only_depends_on": "eval:doc.percent_complete_method != 'Manual'" }, { "fieldname": "column_break_5", @@ -484,7 +484,7 @@ "index_web_pages_for_search": 1, "links": [], "max_attachments": 4, - "modified": "2026-07-14 14:32:11.328347", + "modified": "2026-07-21 11:23:22.000000", "modified_by": "Administrator", "module": "Projects", "name": "Project", diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index fc85099bf6c..ab2dc14b518 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -278,6 +278,8 @@ class Project(Document): if self.percent_complete_method == "Manual": if self.status == "Completed": self.percent_complete = 100 + elif flt(self.percent_complete) < 0 or flt(self.percent_complete) > 100: + frappe.throw(_("% Complete must be between 0 and 100")) return total = frappe.db.count("Task", dict(project=self.name)) diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py index 96a74ec5d0d..abc5fd248b4 100644 --- a/erpnext/projects/doctype/project/test_project.py +++ b/erpnext/projects/doctype/project/test_project.py @@ -349,6 +349,34 @@ class TestProject(ERPNextTestSuite): self.assertEqual(project.percent_complete, 75) self.assertEqual(project.status, "On hold") + def test_percent_complete_manual(self): + project, tasks = self._project_with_tasks("Manual", 2) + + # manual value is preserved on save, even with linked tasks + project.percent_complete = 42 + project.save() + self.assertEqual(project.percent_complete, 42) + + # task updates do not overwrite the manual value + frappe.db.set_value("Task", tasks[0], "status", "Completed") + project.update_percent_complete() + self.assertEqual(project.percent_complete, 42) + + # out-of-range values are rejected + project.percent_complete = 150 + self.assertRaises(frappe.ValidationError, project.save) + project.reload() + + project.percent_complete = -10 + self.assertRaises(frappe.ValidationError, project.save) + project.reload() + + # Completed status forces 100 regardless of the manual value + project.percent_complete = 42 + project.status = "Completed" + project.save() + self.assertEqual(project.percent_complete, 100) + def test_percent_complete_by_task_progress(self): project, tasks = self._project_with_tasks("Task Progress", 2) From 4cdaa8dba672e5f031ed22a4dbe31719bb0e5c1c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 20 Jul 2026 13:20:10 +0530 Subject: [PATCH 335/400] fix: block changing Stock account type when stock ledger entries exist (#57283) --- erpnext/accounts/doctype/account/account.py | 31 +++++++++++++++++++ .../accounts/doctype/account/test_account.py | 25 +++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index e67b29bc1be..6ed89c22f24 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -121,6 +121,7 @@ class Account(NestedSet): self.validate_account_currency() self.validate_root_company_and_sync_account_to_children() self.validate_receivable_payable_account_type() + self.validate_stock_account_type_change() def validate_parent_child_account_type(self): if self.parent_account: @@ -212,6 +213,36 @@ class Account(NestedSet): frappe.msgprint(msg) self.add_comment("Comment", msg) + def validate_stock_account_type_change(self): + doc_before_save = self.get_doc_before_save() + if not (doc_before_save and doc_before_save.account_type == "Stock"): + return + + if self.account_type == "Stock": + return + + if self.stock_ledger_entry_exists(): + frappe.throw( + _( + "The account type of {0} cannot be changed from {1} because stock ledger entries exist against it." + ).format(frappe.bold(self.name), frappe.bold(_("Stock"))) + ) + + def stock_ledger_entry_exists(self): + from erpnext.stock import get_warehouse_account_map + + warehouse_account = get_warehouse_account_map(self.company) + warehouses = [wh for wh, details in warehouse_account.items() if details.account == self.name] + if not warehouses: + return False + + return bool( + frappe.db.count( + "Stock Ledger Entry", + filters={"warehouse": ("in", warehouses), "is_cancelled": 0}, + ) + ) + def validate_root_details(self): doc_before_save = self.get_doc_before_save() diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index cdc278567a5..be592d78b43 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -306,6 +306,31 @@ class TestAccount(ERPNextTestSuite): acc.account_currency = "USD" self.assertRaises(frappe.ValidationError, acc.save) + def test_stock_account_type_change_with_ledger_entries(self): + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + + company = "_Test Company with perpetual inventory" + warehouse = "Stores - TCP1" + stock_account = get_warehouse_account(frappe.get_doc("Warehouse", warehouse)) + + make_stock_entry( + item_code="_Test Item", + target=warehouse, + company=company, + qty=5, + basic_rate=100, + ) + + account = frappe.get_doc("Account", stock_account) + self.assertEqual(account.account_type, "Stock") + + account.account_type = "" + self.assertRaises(frappe.ValidationError, account.save) + + account.reload() + account.account_name = f"{account.account_name} Updated" + account.save() # non-type change stays allowed + def test_account_balance(self): from erpnext.accounts.utils import get_balance_on From 9a7209e66891d7638030b7587e492fff649c06be Mon Sep 17 00:00:00 2001 From: Poovetha Date: Thu, 16 Jul 2026 23:47:24 +0530 Subject: [PATCH 336/400] fix(report): handle nonetype error in timesheet billing summary grouping logic --- .../timesheet_billing_summary.py | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py b/erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py index a6e7150e410..316db1f3507 100644 --- a/erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py +++ b/erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py @@ -116,31 +116,37 @@ def get_data(filters, group_fieldname=None): def group_by(data, fieldname): - groups = {row.get(fieldname) for row in data} - grouped_data = [] - for group in sorted(groups): - group_row = { - fieldname: group, - "hours": sum(row.get("hours") for row in data if row.get(fieldname) == group), - "billing_hours": sum(row.get("billing_hours") for row in data if row.get(fieldname) == group), - "billing_amount": sum(row.get("billing_amount") for row in data if row.get(fieldname) == group), - "indent": 0, - "is_group": 1, - } - if fieldname == "employee": - group_row["employee_name"] = next( - row.get("employee_name") for row in data if row.get(fieldname) == group - ) + groups = {} + for row in data: + groups.setdefault(row.get(fieldname), []).append(row) - grouped_data.append(group_row) - for row in data: - if row.get(fieldname) != group: - continue + grouped_data = [] + for group in sorted(groups, key=lambda g: (g is None, g)): + hours = billing_hours = billing_amount = 0 + child_rows = [] + for row in groups[group]: + hours += row.get("hours") or 0 + billing_hours += row.get("billing_hours") or 0 + billing_amount += row.get("billing_amount") or 0 _row = row.copy() _row[fieldname] = None _row["indent"] = 1 _row["is_group"] = 0 - grouped_data.append(_row) + child_rows.append(_row) + + group_row = { + fieldname: group, + "hours": hours, + "billing_hours": billing_hours, + "billing_amount": billing_amount, + "indent": 0, + "is_group": 1, + } + if fieldname == "employee": + group_row["employee_name"] = groups[group][0].get("employee_name") + + grouped_data.append(group_row) + grouped_data.extend(child_rows) return grouped_data From 873bce3c4632ed69351e50bff956b7cebd12c283 Mon Sep 17 00:00:00 2001 From: sokumon Date: Mon, 20 Jul 2026 15:48:33 +0530 Subject: [PATCH 337/400] fix: mark selling as default workspace for customer --- .../selling/workspace/selling/selling.json | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/workspace/selling/selling.json b/erpnext/selling/workspace/selling/selling.json index 7bcc6264948..4fb6b805759 100644 --- a/erpnext/selling/workspace/selling/selling.json +++ b/erpnext/selling/workspace/selling/selling.json @@ -622,7 +622,7 @@ "type": "Link" } ], - "modified": "2026-07-03 13:44:07.820564", + "modified": "2026-07-20 15:48:06.603686", "modified_by": "Administrator", "module": "Selling", "module_onboarding": "Selling Onboarding", @@ -653,6 +653,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "house", "indent": 0, "keep_closed": 0, @@ -666,6 +667,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "chart-column", "indent": 0, "keep_closed": 0, @@ -679,6 +681,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "receipt-text", "indent": 0, "keep_closed": 0, @@ -692,6 +695,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "store", "indent": 0, "keep_closed": 0, @@ -705,6 +709,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "receipt", "indent": 0, "keep_closed": 0, @@ -718,6 +723,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "computer", "indent": 1, "keep_closed": 1, @@ -730,6 +736,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "icon": "", "indent": 0, "keep_closed": 0, @@ -743,6 +750,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Profile", @@ -755,6 +763,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Invoice", @@ -767,6 +776,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Opening Entry", @@ -779,6 +789,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Closing Entry", @@ -791,6 +802,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Invoice Merge Log", @@ -803,6 +815,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Settings", @@ -815,6 +828,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Loyalty Program", @@ -827,6 +841,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Loyalty Point Entry", @@ -839,6 +854,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "package", "indent": 1, "keep_closed": 1, @@ -851,6 +867,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "icon": "", "indent": 0, "keep_closed": 0, @@ -864,6 +881,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item Group", @@ -876,6 +894,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Price List", @@ -888,6 +907,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item Price", @@ -900,6 +920,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Pricing Rule", @@ -912,6 +933,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Promotional Scheme", @@ -924,6 +946,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Coupon Code", @@ -936,6 +959,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Blanket Order", @@ -948,6 +972,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "database", "indent": 1, "keep_closed": 1, @@ -960,6 +985,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 1, "icon": "", "indent": 0, "keep_closed": 0, @@ -973,6 +999,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Group", @@ -985,6 +1012,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Address", @@ -997,6 +1025,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Contact", @@ -1009,6 +1038,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Territory", @@ -1021,6 +1051,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Campaign", @@ -1033,6 +1064,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person", @@ -1045,6 +1077,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partner", @@ -1057,6 +1090,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Monthly Distribution", @@ -1069,6 +1103,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Terms Template", @@ -1081,6 +1116,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Tax Template", @@ -1093,6 +1129,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Product Bundle", @@ -1105,6 +1142,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "UTM Source", @@ -1117,6 +1155,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Shipping Rule", @@ -1129,6 +1168,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "sheet", "indent": 1, "keep_closed": 1, @@ -1141,6 +1181,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Register", @@ -1153,6 +1194,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item-wise Sales Register", @@ -1165,6 +1207,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Analytics", @@ -1177,6 +1220,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Addresses And Contacts", @@ -1189,6 +1233,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Inactive Customers", @@ -1201,6 +1246,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Invoice Trends", @@ -1213,6 +1259,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Credit Balance", @@ -1225,6 +1272,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customers Without Any Sales Transactions", @@ -1237,6 +1285,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partners Commission", @@ -1249,6 +1298,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Available Stock for Packing Items", @@ -1261,6 +1311,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Territory Target Variance Based On Item Group", @@ -1273,6 +1324,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person Target Variance Based On Item Group", @@ -1285,6 +1337,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partner Target Variance Based On Item Group", @@ -1297,6 +1350,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Pending SO Items For Purchase Request", @@ -1309,6 +1363,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Funnel", @@ -1321,6 +1376,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Order Analysis", @@ -1333,6 +1389,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Acquisition and Loyalty", @@ -1345,6 +1402,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Quotation Trends", @@ -1357,6 +1415,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Order Trends", @@ -1369,6 +1428,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item-wise Sales History", @@ -1381,6 +1441,7 @@ { "child": 1, "collapsible": 1, + "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person-wise Transaction Summary", @@ -1393,6 +1454,7 @@ { "child": 0, "collapsible": 1, + "default_workspace": 0, "icon": "settings", "indent": 0, "keep_closed": 0, From 73004c6e4be920fb9d7cf3e56e8217ba5d62ba5a Mon Sep 17 00:00:00 2001 From: Diptanil Saha Date: Mon, 20 Jul 2026 16:35:58 +0530 Subject: [PATCH 338/400] refactor: rework appointment booking lifecycle and portal verification (#57270) Co-authored-by: Claude Fable 5 --- .../crm/doctype/appointment/appointment.json | 46 +- .../crm/doctype/appointment/appointment.py | 530 ++++++++++++------ .../doctype/appointment/test_appointment.py | 527 ++++++++++++++++- .../appointment_booking_settings.json | 115 +++- .../appointment_booking_settings.py | 71 ++- .../test_appointment_booking_settings.py | 96 +++- erpnext/hooks.py | 1 + .../emails/appointment_confirmed.html | 6 + .../templates/emails/confirm_appointment.html | 1 + erpnext/www/book_appointment/index.js | 4 +- erpnext/www/book_appointment/index.py | 31 +- .../www/book_appointment/verify/index.html | 2 +- erpnext/www/book_appointment/verify/index.py | 54 +- 13 files changed, 1228 insertions(+), 256 deletions(-) create mode 100644 erpnext/templates/emails/appointment_confirmed.html diff --git a/erpnext/crm/doctype/appointment/appointment.json b/erpnext/crm/doctype/appointment/appointment.json index c600eb088c3..b7a92dba6d1 100644 --- a/erpnext/crm/doctype/appointment/appointment.json +++ b/erpnext/crm/doctype/appointment/appointment.json @@ -7,7 +7,11 @@ "engine": "InnoDB", "field_order": [ "scheduled_time", + "column_break_xaox", "status", + "created_through_portal", + "email_verified", + "verification_token", "customer_details_section", "customer_name", "customer_phone_number", @@ -54,7 +58,8 @@ "fieldtype": "Datetime", "in_list_view": 1, "label": "Scheduled Time", - "reqd": 1 + "reqd": 1, + "search_index": 1 }, { "fieldname": "status", @@ -77,8 +82,8 @@ "fieldname": "customer_email", "fieldtype": "Data", "label": "Email", - "reqd": 1, - "options": "Email" + "options": "Email", + "reqd": 1 }, { "fieldname": "linked_docs_section", @@ -100,13 +105,43 @@ "fieldtype": "Dynamic Link", "label": "Party", "options": "appointment_with" + }, + { + "default": "0", + "fieldname": "created_through_portal", + "fieldtype": "Check", + "label": "Created through Portal", + "read_only": 1, + "set_only_once": 1 + }, + { + "fieldname": "column_break_xaox", + "fieldtype": "Column Break" + }, + { + "default": "0", + "depends_on": "eval:doc.created_through_portal === 1;", + "fieldname": "email_verified", + "fieldtype": "Check", + "label": "Email Verified", + "read_only": 1 + }, + { + "fieldname": "verification_token", + "fieldtype": "Data", + "label": "Verification Token", + "hidden": 1, + "read_only": 1, + "no_copy": 1, + "search_index": 1 } ], "links": [], - "modified": "2026-06-06 13:05:59.300573", + "modified": "2026-07-20 02:00:00.000000", "modified_by": "Administrator", "module": "CRM", "name": "Appointment", + "naming_rule": "Expression (old style)", "owner": "Administrator", "permissions": [ { @@ -158,8 +193,9 @@ } ], "quick_entry": 1, + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py index 0f7c52688a3..da91a73f105 100644 --- a/erpnext/crm/doctype/appointment/appointment.py +++ b/erpnext/crm/doctype/appointment/appointment.py @@ -3,14 +3,20 @@ from collections import Counter +from datetime import timedelta +from urllib.parse import urlencode import frappe from frappe import _ from frappe.desk.form.assign_to import add as add_assignment from frappe.model.document import Document from frappe.share import add_docshare -from frappe.utils import get_url, getdate, now -from frappe.utils.verified_command import get_signed_params +from frappe.utils import add_to_date, cint, date_diff, get_datetime, get_url, getdate, now, now_datetime +from frappe.utils.data import sha256_hash + +from erpnext.setup.doctype.holiday_list.holiday_list import is_holiday + +WEEKDAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] class Appointment(Document): @@ -24,104 +30,227 @@ class Appointment(Document): appointment_with: DF.Link | None calendar_event: DF.Link | None + created_through_portal: DF.Check customer_details: DF.LongText | None customer_email: DF.Data customer_name: DF.Data customer_phone_number: DF.Data | None customer_skype: DF.Data | None + email_verified: DF.Check party: DF.DynamicLink | None scheduled_time: DF.Datetime status: DF.Literal["Open", "Unverified", "Closed"] + verification_token: DF.Data | None # end: auto-generated types - def find_lead_by_email(self): - lead_list = frappe.get_list( - "Lead", filters={"email_id": self.customer_email}, ignore_permissions=True - ) - if lead_list: - return lead_list[0].name - return None + def validate(self): + self.validate_status_update() + if not self.has_value_changed("scheduled_time"): + return - def find_customer_by_email(self): - customer_list = frappe.get_list( - "Customer", filters={"email_id": self.customer_email}, ignore_permissions=True + self.validate_backdated_booking() + + if is_appointment_scheduling_enabled(): + self.validate_advanced_booking() + self.validate_holiday() + self.validate_slot_timing() + + self.validate_available_time_slot() + + def validate_status_update(self): + if not self.has_value_changed("status"): + return + + if not self.created_through_portal: + if self.status == "Unverified": + frappe.throw(_("Appointments created manually cannot have 'Unverified' status.")) + return + + if self.status == "Unverified" and self.email_verified: + frappe.throw(_("A verified appointment cannot be moved back to 'Unverified' status.")) + + if self.status == "Open" and not self.email_verified: + frappe.throw( + _("An appointment booked through the portal can only be opened via email verification.") + ) + + def validate_backdated_booking(self): + if get_datetime(self.scheduled_time) < now_datetime(): + frappe.throw(_("Appointment cannot be scheduled for a past time.")) + + def validate_advanced_booking(self): + advance_booking_days = cint(get_booking_settings().advance_booking_days) + + if advance_booking_days and date_diff(self.scheduled_time, now_datetime()) > advance_booking_days: + frappe.throw( + _("Appointment can only be scheduled up to {0} day(s) in advance.").format( + advance_booking_days + ) + ) + + def validate_holiday(self): + holiday_list = get_booking_settings().holiday_list + + if not holiday_list: + frappe.throw(_("Please add a valid Holiday List on Appointment Booking Settings.")) + + if is_holiday(holiday_list, getdate(self.scheduled_time)): + frappe.throw(_("Appointment cannot be scheduled on a holiday.")) + + def validate_slot_timing(self): + settings = get_booking_settings() + if not settings.availability_of_slots: + frappe.throw(_("No availability of slots are found. Please add on Appointment Booking Settings.")) + + scheduled_time = get_datetime(self.scheduled_time) + day_of_week = WEEKDAYS[scheduled_time.weekday()] + slot_start = timedelta( + hours=scheduled_time.hour, minutes=scheduled_time.minute, seconds=scheduled_time.second ) - if customer_list: - return customer_list[0].name - return None + slot_end = slot_start + timedelta(minutes=cint(settings.appointment_duration)) + + for slot in settings.availability_of_slots: + if slot.day_of_week == day_of_week and slot.from_time <= slot_start and slot_end <= slot.to_time: + return + + frappe.throw(_("Appointment must be scheduled within the available slot timings.")) + + def validate_available_time_slot(self): + settings = get_booking_settings() + if not cint(settings.number_of_agents): + return + + # the locking read serializes concurrent bookings for the same window, + # so two simultaneous requests cannot both pass the capacity check + booked = count_overlapping_appointments( + self.scheduled_time, + cint(settings.appointment_duration), + exclude_appointment=self.name, + for_update=True, + ) + + if booked >= cint(settings.number_of_agents): + frappe.throw(_("Time slot is not available")) def before_insert(self): - number_of_appointments_in_same_slot = frappe.db.count( - "Appointment", filters={"scheduled_time": self.scheduled_time} - ) - number_of_agents = frappe.db.get_single_value("Appointment Booking Settings", "number_of_agents") - if number_of_agents != 0: - if number_of_appointments_in_same_slot >= number_of_agents: - frappe.throw(_("Time slot is not available")) - # Link lead - if not self.party: - lead = self.find_lead_by_email() - customer = self.find_customer_by_email() - if customer: - self.appointment_with = "Customer" - self.party = customer - else: - self.appointment_with = "Lead" - self.party = lead + # Set status to "Unverified" for new Appointments. + if self.created_through_portal: + self.status = "Unverified" + return + + self.link_customer_lead() def after_insert(self): - if self.party: - # Create Calendar event + if not self.created_through_portal and self.party: self.auto_assign() self.create_calendar_event() - else: - # Set status to unverified - self.db_set("status", "Unverified") - # Send email to confirm - self.send_confirmation_email() + return + + # Send email to confirm + self.send_confirmation_email() + + def on_update(self): + # capture transitions before nested saves during materialization + # refresh the before-save snapshot + status_changed = self.has_value_changed("status") + email_just_verified = bool( + self.created_through_portal and self.email_verified + ) and self.has_value_changed("email_verified") + + self.link_auto_assign_and_create_calendar_event() + + if email_just_verified: + self.send_appointment_confirmed_email() + + if status_changed: + self.update_event_and_assignments_status() + + def on_trash(self): + # the Event only references the party, not the appointment, + # so it must be cleaned up explicitly + if not self.calendar_event: + return + + event = self.calendar_event + self.db_set("calendar_event", None, update_modified=False) + frappe.delete_doc("Event", event, ignore_permissions=True) def send_confirmation_email(self): - verify_url = self._get_verify_url() - template = "confirm_appointment" - args = { - "link": verify_url, - "site_url": frappe.utils.get_url(), - "full_name": self.customer_name, - } + self.send_email_to_customer( + template="confirm_appointment", + subject=_("Appointment Confirmation"), + args={"link": self._get_verify_url(), "expiry_minutes": get_verification_link_expiry()}, + ) + frappe.msgprint(_("Please check your email to confirm the appointment.")) + + def send_appointment_confirmed_email(self): + self.send_email_to_customer( + template="appointment_confirmed", + subject=_("Appointment Confirmed"), + args={"scheduled_time": frappe.utils.format_datetime(self.scheduled_time)}, + reference_doctype="Appointment", + reference_name=self.name, + ) + + def send_email_to_customer(self, template, subject, args, **kwargs): frappe.sendmail( recipients=[self.customer_email], template=template, - args=args, - subject=_("Appointment Confirmation"), + args={"full_name": self.customer_name, "site_url": frappe.utils.get_url(), **args}, + subject=subject, + **kwargs, ) - if frappe.session.user == "Guest": - frappe.msgprint(_("Please check your email to confirm the appointment")) - else: - frappe.msgprint( - _("Appointment was created. But no lead was found. Please check the email to confirm") - ) - def on_change(self): - # Sync Calendar - if not self.calendar_event: + def link_auto_assign_and_create_calendar_event(self): + if self.is_new() or (self.created_through_portal and not self.email_verified): return + + if not self.calendar_event: + # first materialization: link the party, assign an agent, create the event + self.link_customer_lead() + self.auto_assign() + self.create_calendar_event() + + self.sync_calendar_event() + + def sync_calendar_event(self): + if not self.calendar_event or not self.has_value_changed("scheduled_time"): + return + cal_event = frappe.get_doc("Event", self.calendar_event) cal_event.starts_on = self.scheduled_time cal_event.save(ignore_permissions=True) - def set_verified(self, email): - if email != self.customer_email: - frappe.throw(_("Email verification failed.")) - # Create new lead + def update_event_and_assignments_status(self): + """Close or reopen the calendar event and assignments along with the appointment.""" + if self.status == "Unverified": + return + + is_closed = self.status == "Closed" + new_status = "Closed" if is_closed else "Open" + + if self.calendar_event: + frappe.db.set_value("Event", self.calendar_event, "status", new_status) + + # only move ToDos between Open and Closed - never touch Cancelled ones + todo_filters = { + "reference_type": "Appointment", + "reference_name": self.name, + "status": "Open" if is_closed else "Closed", + } + frappe.db.set_value("ToDo", todo_filters, "status", new_status) + + def link_customer_lead(self): + if not self.party: + customer = self.find_party_by_email("Customer") + self.appointment_with = "Customer" if customer else "Lead" + self.party = customer or self.find_party_by_email("Lead") + self.create_lead_and_link() - # Remove unverified status - self.status = "Open" - # Create calender event - self.auto_assign() - self.create_calendar_event() - self.save(ignore_permissions=True) - if not frappe.in_test: - frappe.db.commit() + + def find_party_by_email(self, doctype): + party = frappe.get_all(doctype, filters={"email_id": self.customer_email}, limit=1, pluck="name") + return party[0] if party else None def create_lead_and_link(self): # Return if already linked @@ -140,86 +269,39 @@ class Appointment(Document): if self.customer_details: lead.append( "notes", - { - "note": self.customer_details, - "added_by": frappe.session.user, - "added_on": now(), - }, + {"note": self.customer_details, "added_by": frappe.session.user, "added_on": now()}, ) - lead.insert(ignore_permissions=True) - - # Link lead - self.party = lead.name + self.party = lead.insert(ignore_permissions=True).name def auto_assign(self): - existing_assignee = self.get_assignee_from_latest_opportunity() - if existing_assignee: - # If the latest opportunity is assigned to someone - # Assign the appointment to the same - self.assign_agent(existing_assignee) - return if self._assign: return - available_agents = _get_agents_sorted_by_asc_workload(getdate(self.scheduled_time)) - for agent in available_agents: - if _check_agent_availability(agent, self.scheduled_time): - self.assign_agent(agent[0]) - break + + if existing_assignee := self.get_assignee_from_latest_opportunity(): + # assign to whoever handles the party's latest opportunity + self.assign_agent(existing_assignee) + return + + busy_agents = get_busy_agents(self.scheduled_time) + for agent in _get_agents_sorted_by_asc_workload(getdate(self.scheduled_time)): + if agent not in busy_agents: + self.assign_agent(agent) + break def get_assignee_from_latest_opportunity(self): - if not self.party: + if not self.party or not frappe.db.exists("Lead", self.party): return None - if not frappe.db.exists("Lead", self.party): - return None - opporutnities = frappe.get_list( + + opportunities = frappe.get_all( "Opportunity", - filters={ - "party_name": self.party, - }, - ignore_permissions=True, + filters={"party_name": self.party}, + fields=["_assign"], order_by="creation desc", + limit=1, ) - if not opporutnities: - return None - latest_opportunity = frappe.get_doc("Opportunity", opporutnities[0].name) - assignee = latest_opportunity._assign - if not assignee: - return None - assignee = frappe.parse_json(assignee)[0] - return assignee - - def create_calendar_event(self): - if self.calendar_event: - return - appointment_event = frappe.get_doc( - { - "doctype": "Event", - "subject": " ".join(["Appointment with", self.customer_name]), - "starts_on": self.scheduled_time, - "status": "Open", - "type": "Public", - "send_reminder": frappe.db.get_single_value( - "Appointment Booking Settings", "email_reminders" - ), - "event_participants": [ - dict(reference_doctype=self.appointment_with, reference_docname=self.party) - ], - } - ) - employee = _get_employee_from_user(self._assign) - if employee: - appointment_event.append( - "event_participants", dict(reference_doctype="Employee", reference_docname=employee.name) - ) - appointment_event.insert(ignore_permissions=True) - self.calendar_event = appointment_event.name - self.save(ignore_permissions=True) - - def _get_verify_url(self): - verify_route = "/book_appointment/verify" - params = {"email": self.customer_email, "appointment": self.name} - return get_url(verify_route + "?" + get_signed_params(params)) + assignees = opportunities and frappe.parse_json(opportunities[0]._assign or "[]") + return assignees[0] if assignees else None def assign_agent(self, agent): if not frappe.has_permission(doc=self, user=agent): @@ -227,45 +309,157 @@ class Appointment(Document): add_assignment({"doctype": self.doctype, "name": self.name, "assign_to": [agent]}) + def create_calendar_event(self): + if self.calendar_event: + return + + event = frappe.get_doc( + { + "doctype": "Event", + "subject": f"Appointment with {self.customer_name}", + "starts_on": self.scheduled_time, + "status": "Open", + "type": "Public", + "send_reminder": cint(get_booking_settings().email_reminders), + "event_participants": self.get_event_participants(), + } + ).insert(ignore_permissions=True) + + self.calendar_event = event.name + self.save(ignore_permissions=True) + + def get_event_participants(self): + participants = [dict(reference_doctype=self.appointment_with, reference_docname=self.party)] + + if employee := _get_employee_from_user(self._assign): + participants.append(dict(reference_doctype="Employee", reference_docname=employee.name)) + + return participants + + def _get_verify_url(self): + key = self.generate_verification_key() + return get_url("/book_appointment/verify?" + urlencode({"key": key})) + + def generate_verification_key(self): + # store only the hash; the raw key lives solely in the emailed link + key = frappe.generate_hash() + self.db_set("verification_token", sha256_hash(key), update_modified=False) + return key + + +def get_booking_settings(): + return frappe.get_cached_doc("Appointment Booking Settings") + + +def is_appointment_scheduling_enabled(): + return bool(cint(get_booking_settings().enable_scheduling)) + + +def get_verification_link_expiry(): + """Verification link expiry window in minutes.""" + return cint(get_booking_settings().verification_link_expiry_duration) + + +def count_overlapping_appointments( + scheduled_time, appointment_duration, exclude_appointment=None, for_update=False +): + """Count non-Closed appointments whose duration window overlaps `scheduled_time`. + With `for_update`, the range stays locked until commit, serializing concurrent bookings.""" + # select the rows (not COUNT) so `for_update` stays valid: PostgreSQL + # rejects `FOR UPDATE` combined with an aggregate function + appointment = frappe.qb.DocType("Appointment") + query = ( + frappe.qb.from_(appointment) + .select(appointment.name) + .where(appointment.scheduled_time > add_to_date(scheduled_time, minutes=-appointment_duration)) + .where(appointment.scheduled_time < add_to_date(scheduled_time, minutes=appointment_duration)) + .where(appointment.status != "Closed") + ) + + if exclude_appointment: + query = query.where(appointment.name != exclude_appointment) + + if for_update: + query = query.for_update() + + return len(query.run()) + + +def handle_expired_unverified_appointments(): + """Close or delete Unverified appointments whose verification link has expired.""" + expiry = get_verification_link_expiry() + if not expiry: + return + + cutoff = add_to_date(now_datetime(), minutes=-expiry) + filters = {"status": "Unverified", "creation": ("<", cutoff)} + action = get_booking_settings().action_for_expired_unverified_appointments or "Mark as Closed" + + if action == "Mark as Closed": + frappe.db.set_value("Appointment", filters, "status", "Closed") + elif action == "Delete Permanently": + for name in frappe.get_all("Appointment", filters=filters, pluck="name"): + frappe.delete_doc("Appointment", name, ignore_permissions=True) + def _get_agents_sorted_by_asc_workload(date): - appointments = frappe.get_all("Appointment", fields="*") - agent_list = _get_agent_list_as_strings() - if not appointments: - return agent_list - appointment_counter = Counter(agent_list) - for appointment in appointments: - assign_data = appointment._assign - if isinstance(assign_data, str): - assign_data = assign_data.strip() - if not assign_data: - continue - assigned_to = frappe.parse_json(assign_data) - if assigned_to and (assigned_to[0] in agent_list) and getdate(appointment.scheduled_time) == date: - appointment_counter[assigned_to[0]] += 1 - sorted_agent_list = appointment_counter.most_common() - sorted_agent_list.reverse() - return sorted_agent_list + # count only the given day's assignments; scheduled_time is indexed so the + # date range is resolved in SQL instead of scanning every appointment ever + workload = Counter(agent.user for agent in get_booking_settings().agent_list) + assigns = frappe.get_all( + "Appointment", + filters=[ + ["_assign", "is", "set"], + ["scheduled_time", ">=", getdate(date)], + ["scheduled_time", "<", add_to_date(getdate(date), days=1)], + ], + pluck="_assign", + ) + + for assign in assigns: + assignees = frappe.parse_json((assign or "").strip() or "[]") + if assignees and assignees[0] in workload: + workload[assignees[0]] += 1 + + return [agent for agent, _workload in reversed(workload.most_common())] -def _get_agent_list_as_strings(): - agent_list_as_strings = [] - agent_list = frappe.get_doc("Appointment Booking Settings").agent_list - for agent in agent_list: - agent_list_as_strings.append(agent.user) - return agent_list_as_strings +def get_busy_agents(scheduled_time): + """Agents already assigned to a non-Closed appointment overlapping `scheduled_time`.""" + duration = _get_appointment_duration() + assigns = frappe.get_all( + "Appointment", + filters=[ + ["scheduled_time", ">", add_to_date(scheduled_time, minutes=-duration)], + ["scheduled_time", "<", add_to_date(scheduled_time, minutes=duration)], + ["status", "!=", "Closed"], + ], + pluck="_assign", + ) + return {assignee for assign in assigns for assignee in frappe.parse_json(assign or "[]")} def _check_agent_availability(agent_email, scheduled_time): - appointemnts_at_scheduled_time = frappe.get_all("Appointment", filters={"scheduled_time": scheduled_time}) - for appointment in appointemnts_at_scheduled_time: - if appointment._assign == agent_email: - return False - return True + return agent_email not in get_busy_agents(scheduled_time) + + +def get_booked_slot_times(from_time, to_time): + """scheduled_times of non-Closed appointments within (from_time, to_time), for slot availability.""" + return frappe.get_all( + "Appointment", + filters=[ + ["scheduled_time", ">", from_time], + ["scheduled_time", "<", to_time], + ["status", "!=", "Closed"], + ], + pluck="scheduled_time", + ) + + +def _get_appointment_duration(): + return cint(get_booking_settings().appointment_duration) def _get_employee_from_user(user): employee_docname = frappe.db.get_value("Employee", {"user_id": user}) - if employee_docname: - return frappe.get_doc("Employee", employee_docname) - return None + return frappe.get_doc("Employee", employee_docname) if employee_docname else None diff --git a/erpnext/crm/doctype/appointment/test_appointment.py b/erpnext/crm/doctype/appointment/test_appointment.py index 83eacca83b6..80c0ced648e 100644 --- a/erpnext/crm/doctype/appointment/test_appointment.py +++ b/erpnext/crm/doctype/appointment/test_appointment.py @@ -1,36 +1,167 @@ # Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt import datetime +from unittest.mock import patch +from urllib.parse import parse_qs, urlparse import frappe +from frappe.utils import add_to_date, getdate, now_datetime, set_request +from frappe.utils.data import sha256_hash +from erpnext.crm.doctype.appointment.appointment import ( + Appointment, + _check_agent_availability, + handle_expired_unverified_appointments, +) +from erpnext.setup.doctype.holiday_list.test_holiday_list import make_holiday_list from erpnext.tests.utils import ERPNextTestSuite +from erpnext.www.book_appointment.index import create_appointment, get_appointment_slots +from erpnext.www.book_appointment.verify import index as verify_index LEAD_EMAIL = "test_appointment_lead@example.com" +VERIFICATION_EXPIRY_MINUTES = 30 +ALL_WEEKDAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] -def create_test_appointment(): - test_appointment = frappe.get_doc( - { - "doctype": "Appointment", - "status": "Open", - "customer_name": "Test Lead", - "customer_phone_number": "666", - "customer_skype": "test", - "customer_email": LEAD_EMAIL, - "scheduled_time": datetime.datetime.now(), - "customer_details": "Hello, Friend!", - } - ) +def create_test_appointment(**kwargs): + args = { + "doctype": "Appointment", + "status": "Open", + "customer_name": "Test Lead", + "customer_phone_number": "666", + "customer_skype": "test", + "customer_email": LEAD_EMAIL, + "scheduled_time": add_to_date(now_datetime(), hours=2), + "customer_details": "Hello, Friend!", + } + args.update(kwargs) + test_appointment = frappe.get_doc(args) test_appointment.insert() return test_appointment +def create_lead(email, name="Existing Lead"): + frappe.db.delete("Lead", {"email_id": email}) + return frappe.get_doc({"doctype": "Lead", "lead_name": name, "email_id": email}).insert( + ignore_permissions=True + ) + + +def set_booking_setting(field, value): + frappe.db.set_single_value("Appointment Booking Settings", field, value) + + +def slot_on(days_from_now, hour, minute=0): + day = datetime.date.today() + datetime.timedelta(days=days_from_now) + return datetime.datetime.combine(day, datetime.time(hour, minute)) + + +def backdate_creation(appointment_name, minutes): + frappe.db.set_value( + "Appointment", + appointment_name, + "creation", + add_to_date(now_datetime(), minutes=-minutes), + update_modified=False, + ) + + +def get_status(appointment_name): + return frappe.db.get_value("Appointment", appointment_name, "status") + + +def get_assignees(appointment_name): + return frappe.parse_json(frappe.db.get_value("Appointment", appointment_name, "_assign") or "[]") + + +def get_todo_statuses(appointment_name): + return frappe.get_all( + "ToDo", + filters={"reference_type": "Appointment", "reference_name": appointment_name}, + pluck="status", + ) + + +def parse_verify_url(verify_url): + parsed = urlparse(verify_url) + return parsed, {key: value[0] for key, value in parse_qs(parsed.query).items()} + + class TestAppointment(ERPNextTestSuite): def setUp(self): + set_booking_setting("verification_link_expiry_duration", VERIFICATION_EXPIRY_MINUTES) frappe.db.delete("Lead", {"email_id": LEAD_EMAIL}) self.test_appointment = create_test_appointment() - self.test_appointment.set_verified(self.test_appointment.customer_email) + + def _configure_booking_settings(self, holiday_dates=None, agents=None): + holiday_list = make_holiday_list( + "_Test Appointment Holiday List", + from_date=getdate(), + to_date=add_to_date(getdate(), days=60), + holiday_dates=holiday_dates or [], + ) + + settings = frappe.get_doc("Appointment Booking Settings") + settings.enable_scheduling = 1 + settings.enable_appointment_portal = 1 + settings.appointment_duration = 30 + settings.advance_booking_days = 30 + settings.verification_link_expiry_duration = VERIFICATION_EXPIRY_MINUTES + settings.holiday_list = holiday_list.name + settings.set("agent_list", []) + for agent in agents or ["Administrator"]: + settings.append("agent_list", {"user": agent}) + settings.set("availability_of_slots", []) + for day in ALL_WEEKDAYS: + settings.append( + "availability_of_slots", {"day_of_week": day, "from_time": "09:00:00", "to_time": "17:00:00"} + ) + settings.save() + + def _create_portal_appointment(self, email, days_from_now=7, time="10:00:00"): + """Book as Guest. The verification email is mocked and kept on + ``self._verification_email_mock`` for assertions.""" + if not getattr(self, "_booking_settings_configured", False): + self._configure_booking_settings() + self._booking_settings_configured = True + + with self.set_user("Guest"), patch.object(Appointment, "send_confirmation_email") as mock_send: + appointment = create_appointment( + date=str(datetime.date.today() + datetime.timedelta(days=days_from_now)), + time=time, + tz="UTC", + contact={"name": "Portal Visitor", "email": email, "number": "123", "skype": "", "notes": ""}, + ) + self._verification_email_mock = mock_send + return appointment + + def _request_verification(self, appointment, verify_url=None): + """Simulate the GET request made by clicking the emailed verification link. + + The confirmation email sent on successful verification is mocked and kept + on ``self._confirmed_email_mock`` for assertions. + """ + parsed, params = parse_verify_url(verify_url or appointment._get_verify_url()) + + old_request = getattr(frappe.local, "request", None) + old_form_dict = frappe.local.form_dict + old_user = frappe.session.user + try: + # the real link is clicked by an anonymous visitor; set_user resets + # form_dict, so switch the user before populating the request + frappe.set_user("Guest") + set_request(method="GET", path=f"{parsed.path}?{parsed.query}") + frappe.local.form_dict = frappe._dict(params) + context = frappe._dict() + with patch.object(Appointment, "send_appointment_confirmed_email") as mock_confirmed: + verify_index.get_context(context) + self._confirmed_email_mock = mock_confirmed + return context + finally: + frappe.set_user(old_user) + frappe.local.request = old_request + frappe.local.form_dict = old_form_dict + frappe.local.flags.commit = False def test_calendar_event_created(self): cal_event = frappe.get_doc("Event", self.test_appointment.calendar_event) @@ -38,3 +169,371 @@ class TestAppointment(ERPNextTestSuite): def test_lead_linked(self): self.assertTrue(self.test_appointment.party) + + def test_desk_created_appointment_skips_email_verification(self): + """Appointments created from the desk (created_through_portal unset) must be + linked and confirmed immediately - no verification email should be sent.""" + with patch.object(Appointment, "send_confirmation_email") as mock_send: + appointment = create_test_appointment(customer_email="another_desk_lead@example.com") + + mock_send.assert_not_called() + self.assertEqual(appointment.status, "Open") + self.assertTrue(appointment.party) + frappe.db.delete("Lead", {"email_id": "another_desk_lead@example.com"}) + + def test_portal_booking_stays_unverified_for_existing_lead(self): + """A portal booking whose email matches an existing Lead/Customer must NOT + be auto-linked - it must stay Unverified until the email is confirmed.""" + create_lead("existing_lead@example.com") + appointment = self._create_portal_appointment("existing_lead@example.com", days_from_now=5) + + self._verification_email_mock.assert_called_once() + self.assertTrue(appointment.created_through_portal) + self.assertEqual(appointment.status, "Unverified") + self.assertFalse(appointment.email_verified) + self.assertFalse(appointment.party) + + def test_verify_url_uses_opaque_token(self): + appointment = self._create_portal_appointment("portal_visitor@example.com") + parsed, params = parse_verify_url(appointment._get_verify_url()) + + # the link carries only an opaque key - no email, name or signed params + self.assertEqual(set(params), {"key"}) + self.assertNotIn("email", parsed.query) + # only the hash of that key is stored on the appointment + stored = frappe.db.get_value("Appointment", appointment.name, "verification_token") + self.assertEqual(stored, sha256_hash(params["key"])) + + def test_email_verification_within_expiry_window(self): + # Link used within the validity window - verification succeeds and the + # appointment gets linked, assigned and added to the calendar + on_time = self._create_portal_appointment("portal_visitor_on_time@example.com") + context = self._request_verification(on_time) + + self.assertTrue(context.success) + self._confirmed_email_mock.assert_called_once() + on_time.reload() + self.assertEqual(on_time.status, "Open") + self.assertTrue(on_time.email_verified) + self.assertTrue(on_time.party) + self.assertTrue(on_time.calendar_event) + + # Link used after the validity window - verification fails + late = self._create_portal_appointment("portal_visitor_late@example.com", days_from_now=10) + after_expiry = add_to_date(now_datetime(), minutes=VERIFICATION_EXPIRY_MINUTES + 1) + with patch.object(verify_index, "now_datetime", return_value=after_expiry): + context = self._request_verification(late) + + self.assertFalse(context.success) + self._confirmed_email_mock.assert_not_called() + late.reload() + self.assertEqual(late.status, "Unverified") + self.assertFalse(late.email_verified) + self.assertFalse(late.party) + + def test_verification_link_reused_after_success(self): + appointment = self._create_portal_appointment("portal_visitor_twice@example.com") + verify_url = appointment._get_verify_url() + + context = self._request_verification(appointment, verify_url=verify_url) + self.assertTrue(context.success) + self._confirmed_email_mock.assert_called_once() + + # re-clicking the link is idempotent and does not send another email + context = self._request_verification(appointment, verify_url=verify_url) + self.assertTrue(context.success) + self.assertIn("already verified", context.message) + self._confirmed_email_mock.assert_not_called() + + def test_verification_link_for_deleted_appointment(self): + """A verification link can outlive its appointment - clicking it must + render a friendly message, not crash.""" + appointment = self._create_portal_appointment("portal_visitor_gone@example.com") + verify_url = appointment._get_verify_url() + frappe.delete_doc("Appointment", appointment.name, ignore_permissions=True) + + context = self._request_verification(appointment, verify_url=verify_url) + + self.assertFalse(context.success) + self.assertIn("book the appointment again", context.message) + + def test_reschedule_syncs_calendar_event(self): + new_time = add_to_date(self.test_appointment.scheduled_time, hours=1) + self.test_appointment.scheduled_time = new_time + self.test_appointment.save() + + starts_on = frappe.db.get_value("Event", self.test_appointment.calendar_event, "starts_on") + self.assertEqual(starts_on, new_time) + + def test_portal_endpoint_disabled(self): + self._configure_booking_settings() + set_booking_setting("enable_appointment_portal", 0) + + with self.set_user("Guest"), self.assertRaises(frappe.Redirect): + create_appointment( + date=str(datetime.date.today() + datetime.timedelta(days=3)), + time="10:00:00", + tz="UTC", + contact={ + "name": "Blocked", + "email": "blocked@example.com", + "number": "1", + "skype": "", + "notes": "", + }, + ) + + def test_booked_slot_unavailable_on_portal(self): + from frappe.utils.data import get_system_timezone + + self._configure_booking_settings() + tz = get_system_timezone() + day = datetime.date.today() + datetime.timedelta(days=2) + + def get_availability(): + with self.set_user("Guest"): + slots = get_appointment_slots(str(day), tz) + return {slot["time"].strftime("%H:%M"): slot["availability"] for slot in slots} + + booked = create_test_appointment( + customer_email="slot_taken@example.com", scheduled_time=slot_on(2, 10) + ) + + availability = get_availability() + self.assertFalse(availability["10:00"]) + self.assertTrue(availability["13:00"]) + + # closing the appointment frees its slot on the portal + booked.status = "Closed" + booked.save() + self.assertTrue(get_availability()["10:00"]) + + # an off-grid desk appointment blocks every portal slot it overlaps + create_test_appointment(customer_email="off_grid@example.com", scheduled_time=slot_on(2, 13, 15)) + availability = get_availability() + self.assertFalse(availability["13:00"]) + self.assertFalse(availability["13:30"]) + self.assertTrue(availability["14:00"]) + + def test_expired_unverified_appointments_are_closed(self): + stale = self._create_portal_appointment("portal_visitor_stale@example.com", days_from_now=8) + fresh = self._create_portal_appointment("portal_visitor_fresh@example.com", days_from_now=9) + verify_url = stale._get_verify_url() + + backdate_creation(stale.name, VERIFICATION_EXPIRY_MINUTES + 15) + set_booking_setting("action_for_expired_unverified_appointments", "Mark as Closed") + + handle_expired_unverified_appointments() + + self.assertEqual(get_status(stale.name), "Closed") + self.assertEqual(get_status(fresh.name), "Unverified") + # Open appointments are never touched, regardless of age + self.assertEqual(get_status(self.test_appointment.name), "Open") + + # clicking the link of a closed appointment renders a friendly message + context = self._request_verification(stale, verify_url=verify_url) + self.assertFalse(context.success) + self.assertIn("closed", context.message) + + def test_expired_unverified_appointments_are_deleted(self): + stale = self._create_portal_appointment("portal_visitor_purged@example.com", days_from_now=8) + fresh = self._create_portal_appointment("portal_visitor_kept@example.com", days_from_now=9) + + backdate_creation(stale.name, VERIFICATION_EXPIRY_MINUTES + 15) + set_booking_setting("action_for_expired_unverified_appointments", "Delete Permanently") + + handle_expired_unverified_appointments() + + self.assertFalse(frappe.db.exists("Appointment", stale.name)) + self.assertTrue(frappe.db.exists("Appointment", fresh.name)) + self.assertTrue(frappe.db.exists("Appointment", self.test_appointment.name)) + + def test_cleanup_skipped_when_expiry_not_configured(self): + appointment = self._create_portal_appointment("portal_visitor_no_expiry@example.com") + backdate_creation(appointment.name, 5) + set_booking_setting("verification_link_expiry_duration", 0) + + handle_expired_unverified_appointments() + + self.assertEqual(get_status(appointment.name), "Unverified") + + def test_status_transition_rules(self): + # desk appointments can never be Unverified + with self.assertRaises(frappe.ValidationError): + create_test_appointment(customer_email="desk_unverified@example.com", status="Unverified") + + # portal appointments cannot be opened manually before verification + unverified = self._create_portal_appointment("manual_open@example.com") + unverified.status = "Open" + with self.assertRaises(frappe.ValidationError): + unverified.save(ignore_permissions=True) + + # verified appointments cannot be reverted to Unverified + verified = self._create_portal_appointment("revert_unverified@example.com", days_from_now=8) + self._request_verification(verified) + verified.reload() + verified.status = "Unverified" + with self.assertRaises(frappe.ValidationError): + verified.save(ignore_permissions=True) + + # both desk and verified portal appointments can be closed and reopened + for appointment in (self.test_appointment, verified): + appointment.reload() + appointment.status = "Closed" + appointment.save(ignore_permissions=True) + appointment.status = "Open" + appointment.save(ignore_permissions=True) + self.assertEqual(appointment.status, "Open") + + def test_agent_auto_assignment(self): + agent_email = "appointment_agent@example.com" + if not frappe.db.exists("User", agent_email): + frappe.get_doc( + {"doctype": "User", "email": agent_email, "first_name": "Appointment Agent"} + ).insert(ignore_permissions=True) + + self._configure_booking_settings(agents=["Administrator", agent_email]) + first = create_test_appointment( + customer_email="assigned_one@example.com", scheduled_time=slot_on(2, 11) + ) + second = create_test_appointment( + customer_email="assigned_two@example.com", scheduled_time=slot_on(2, 11) + ) + + # both appointments in the same slot get an agent, and never the same one + self.assertTrue(get_assignees(first.name)) + self.assertTrue(get_assignees(second.name)) + self.assertNotEqual(get_assignees(first.name), get_assignees(second.name)) + + # closing an assigned appointment closes its ToDo without re-assigning + first.reload() + first.status = "Closed" + first.save() + self.assertTrue(get_todo_statuses(first.name)) + self.assertTrue(all(status == "Closed" for status in get_todo_statuses(first.name))) + + # reopening brings the ToDos back + first.status = "Open" + first.save() + self.assertTrue(all(status == "Open" for status in get_todo_statuses(first.name))) + + def test_agent_busy_for_the_whole_appointment_duration(self): + self._configure_booking_settings() + slot = slot_on(3, 11) + appointment = create_test_appointment(customer_email="busy_agent@example.com", scheduled_time=slot) + assignee = get_assignees(appointment.name)[0] + + # busy anywhere inside the 30-minute appointment window, free right after it + self.assertFalse(_check_agent_availability(assignee, slot)) + self.assertFalse(_check_agent_availability(assignee, slot + datetime.timedelta(minutes=15))) + self.assertTrue(_check_agent_availability(assignee, slot + datetime.timedelta(minutes=30))) + + def test_closed_appointment_closes_calendar_event(self): + self.test_appointment.status = "Closed" + self.test_appointment.save() + event_status = frappe.db.get_value("Event", self.test_appointment.calendar_event, "status") + self.assertEqual(event_status, "Closed") + + # reopening the appointment reopens the calendar event + self.test_appointment.status = "Open" + self.test_appointment.save() + event_status = frappe.db.get_value("Event", self.test_appointment.calendar_event, "status") + self.assertEqual(event_status, "Open") + + def test_deleting_appointment_deletes_calendar_event(self): + event = self.test_appointment.calendar_event + self.assertTrue(frappe.db.exists("Event", event)) + + frappe.delete_doc("Appointment", self.test_appointment.name) + + self.assertFalse(frappe.db.exists("Event", event)) + + def test_backdated_appointment_is_rejected(self): + with self.assertRaises(frappe.ValidationError): + create_test_appointment( + customer_email="backdated@example.com", + scheduled_time=add_to_date(now_datetime(), hours=-1), + ) + + def test_booking_beyond_advance_window_is_rejected(self): + self._configure_booking_settings() + set_booking_setting("advance_booking_days", 7) + + # within the advance booking window - allowed + within = create_test_appointment( + customer_email="advance_within@example.com", scheduled_time=slot_on(5, 10) + ) + self.assertTrue(frappe.db.exists("Appointment", within.name)) + + # beyond the advance booking window - rejected + with self.assertRaises(frappe.ValidationError): + create_test_appointment( + customer_email="advance_beyond@example.com", scheduled_time=slot_on(8, 10) + ) + + def test_appointment_on_holiday_is_rejected(self): + holiday = add_to_date(getdate(), days=3) + self._configure_booking_settings( + holiday_dates=[{"holiday_date": holiday, "description": "Test Holiday"}] + ) + + with self.assertRaises(frappe.ValidationError): + create_test_appointment(customer_email="on_holiday@example.com", scheduled_time=slot_on(3, 10)) + + # the day after the holiday is bookable + after_holiday = create_test_appointment( + customer_email="after_holiday@example.com", scheduled_time=slot_on(4, 10) + ) + self.assertTrue(frappe.db.exists("Appointment", after_holiday.name)) + + def test_appointment_outside_slot_timing_is_rejected(self): + self._configure_booking_settings() + + # before the slot opens + with self.assertRaises(frappe.ValidationError): + create_test_appointment(customer_email="before_opening@example.com", scheduled_time=slot_on(2, 8)) + + # starts within the slot but would end after it closes + with self.assertRaises(frappe.ValidationError): + create_test_appointment( + customer_email="past_closing@example.com", scheduled_time=slot_on(2, 16, 45) + ) + + # within the slot timings + within = create_test_appointment( + customer_email="within_slot@example.com", scheduled_time=slot_on(2, 10) + ) + self.assertTrue(frappe.db.exists("Appointment", within.name)) + + def test_overlapping_time_slot_capacity(self): + set_booking_setting("number_of_agents", 1) + set_booking_setting("appointment_duration", 30) + + slot = slot_on(1, 10) + first = create_test_appointment(customer_email="slot_first@example.com", scheduled_time=slot) + + # a booking starting inside the first appointment's duration is rejected + with self.assertRaises(frappe.ValidationError): + create_test_appointment( + customer_email="slot_overlap@example.com", + scheduled_time=slot + datetime.timedelta(minutes=15), + ) + + # rescheduling must not count the appointment's own booked slot + first.scheduled_time = slot + datetime.timedelta(minutes=10) + first.save() + + # a booking starting exactly when the rescheduled one ends is allowed + adjacent = create_test_appointment( + customer_email="slot_adjacent@example.com", + scheduled_time=slot + datetime.timedelta(minutes=40), + ) + self.assertTrue(frappe.db.exists("Appointment", adjacent.name)) + + # a closed (cancelled) appointment frees its slot + first.status = "Closed" + first.save() + after_cancellation = create_test_appointment( + customer_email="after_cancellation@example.com", scheduled_time=slot + ) + self.assertTrue(frappe.db.exists("Appointment", after_cancellation.name)) diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json index b79e974e301..8557dcf8791 100644 --- a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json +++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json @@ -1,48 +1,56 @@ { "actions": [], + "allow_bulk_edit": 1, "creation": "2019-08-27 10:56:48.309824", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "enable_scheduling", - "agent_detail_section", - "availability_of_slots", - "number_of_agents", - "agent_list", - "holiday_list", "appointment_details_section", "appointment_duration", "email_reminders", + "column_break_ehiq", + "agent_list", + "number_of_agents", + "agent_detail_section", + "enable_scheduling", + "availability_of_slots", + "section_break_bkln", + "column_break_alwa", "advance_booking_days", + "column_break_bspp", + "holiday_list", "success_details", - "success_redirect_url" + "enable_appointment_portal", + "verification_link_expiry_duration", + "column_break_fovk", + "success_redirect_url", + "action_for_expired_unverified_appointments" ], "fields": [ { + "depends_on": "eval:doc.enable_scheduling === 1;", "fieldname": "availability_of_slots", "fieldtype": "Table", "label": "Availability Of Slots", - "options": "Appointment Booking Slots", - "reqd": 1 + "mandatory_depends_on": "eval:doc.enable_scheduling === 1;", + "options": "Appointment Booking Slots" }, { - "default": "1", "fieldname": "number_of_agents", "fieldtype": "Int", - "hidden": 1, "in_list_view": 1, "label": "Number of Concurrent Appointments", - "read_only": 1, - "reqd": 1 + "read_only": 1 }, { + "depends_on": "eval:doc.enable_scheduling === 1;", "fieldname": "holiday_list", "fieldtype": "Link", "in_list_view": 1, "label": "Holiday List", - "options": "Holiday List", - "reqd": 1 + "mandatory_depends_on": "eval:doc.enable_scheduling === 1;", + "options": "Holiday List" }, { "default": "60", @@ -60,29 +68,31 @@ }, { "default": "7", + "depends_on": "eval:doc.enable_scheduling === 1;", "fieldname": "advance_booking_days", "fieldtype": "Int", "label": "Number of days appointments can be booked in advance", - "reqd": 1 + "mandatory_depends_on": "eval:doc.enable_scheduling === 1;" }, { "fieldname": "agent_list", "fieldtype": "Table MultiSelect", "label": "Agents", - "options": "Assignment Rule User", - "reqd": 1 + "mandatory_depends_on": "eval:doc.enable_scheduling === 1;", + "options": "Assignment Rule User" }, { "default": "0", "fieldname": "enable_scheduling", "fieldtype": "Check", "label": "Enable Appointment Scheduling", - "reqd": 1 + "mandatory_depends_on": "eval:doc.enable_appointment_portal === 1;" }, { "fieldname": "agent_detail_section", "fieldtype": "Section Break", - "label": "Agent Details" + "hide_border": 1, + "label": "Appointment Scheduling" }, { "fieldname": "appointment_details_section", @@ -92,20 +102,68 @@ { "fieldname": "success_details", "fieldtype": "Section Break", - "label": "Success Settings" + "label": "Appointment Booking Portal Settings" }, { "description": "Leave blank for home.\nThis is relative to site URL, for example \"about\" will redirect to \"https://yoursitename.com/about\"", "fieldname": "success_redirect_url", "fieldtype": "Data", - "label": "Success Redirect URL" + "label": "Success Redirect URL", + "permlevel": 1 + }, + { + "default": "30", + "depends_on": "eval: doc.enable_scheduling === 1;", + "description": "In Minutes (min: 15 mins, max: 60 mins)", + "fieldname": "verification_link_expiry_duration", + "fieldtype": "Int", + "label": "Verification Link Expiry Duration", + "mandatory_depends_on": "eval:doc.enable_appointment_portal === 1;", + "max_value": 60.0, + "min_value": 15.0, + "non_negative": 1, + "permlevel": 1 + }, + { + "fieldname": "column_break_ehiq", + "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "enable_appointment_portal", + "fieldtype": "Check", + "label": "Enable Appointment Booking Through Portal", + "permlevel": 1 + }, + { + "fieldname": "column_break_fovk", + "fieldtype": "Column Break" + }, + { + "default": "Mark as Closed", + "fieldname": "action_for_expired_unverified_appointments", + "fieldtype": "Select", + "label": "Action for Expired Unverified Appointments", + "options": "Mark as Closed\nDelete Permanently", + "permlevel": 1 + }, + { + "fieldname": "section_break_bkln", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_alwa", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_bspp", + "fieldtype": "Column Break" } ], "grid_page_length": 50, - "hide_toolbar": 0, "issingle": 1, "links": [], - "modified": "2026-03-16 13:28:21.198138", + "modified": "2026-07-20 00:11:18.996384", "modified_by": "Administrator", "module": "CRM", "name": "Appointment Booking Settings", @@ -139,6 +197,15 @@ "role": "Sales Manager", "share": 1, "write": 1 + }, + { + "email": 1, + "permlevel": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 } ], "quick_entry": 1, diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py index 36eb21f0441..2d7b6cd3f7d 100644 --- a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py +++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py @@ -3,11 +3,11 @@ import datetime -import typing import frappe from frappe import _ from frappe.model.document import Document +from frappe.utils import getdate class AppointmentBookingSettings(Document): @@ -24,33 +24,43 @@ class AppointmentBookingSettings(Document): AppointmentBookingSlots, ) + action_for_expired_unverified_appointments: DF.Literal["Mark as Closed", "Delete Permanently"] advance_booking_days: DF.Int agent_list: DF.TableMultiSelect[AssignmentRuleUser] appointment_duration: DF.Int availability_of_slots: DF.Table[AppointmentBookingSlots] email_reminders: DF.Check + enable_appointment_portal: DF.Check enable_scheduling: DF.Check - holiday_list: DF.Link + holiday_list: DF.Link | None number_of_agents: DF.Int success_redirect_url: DF.Data | None + verification_link_expiry_duration: DF.Int # end: auto-generated types - agent_list: typing.ClassVar[list] = [] # Hack - min_date = "01/01/1970 " - format_string = "%d/%m/%Y %H:%M:%S" - def validate(self): - self.validate_availability_of_slots() - - def save(self): self.number_of_agents = len(self.agent_list) - super().save() + self.validate_appointment_scheduling() + self.validate_portal_booking() + + def validate_appointment_scheduling(self): + if not self.enable_scheduling: + return + + self.validate_availability_of_slots() + self.validate_holiday_list() + self.validate_advance_booking_days() def validate_availability_of_slots(self): + if not self.availability_of_slots: + frappe.throw( + _("Please fill up the Availability of Slots table to enable Appointment Scheduling.") + ) + + format_string = "%Y-%m-%d %H:%M:%S" for record in self.availability_of_slots: - from_time = datetime.datetime.strptime(self.min_date + record.from_time, self.format_string) - to_time = datetime.datetime.strptime(self.min_date + record.to_time, self.format_string) - to_time - from_time + from_time = datetime.datetime.strptime(f"1970-01-01 {record.from_time}", format_string) + to_time = datetime.datetime.strptime(f"1970-01-01 {record.to_time}", format_string) self.validate_from_and_to_time(from_time, to_time, record) self.duration_is_divisible(from_time, to_time) @@ -65,3 +75,38 @@ class AppointmentBookingSettings(Document): timedelta = to_time - from_time if timedelta.total_seconds() % (self.appointment_duration * 60): frappe.throw(_("The difference between from time and To Time must be a multiple of Appointment")) + + def validate_holiday_list(self): + if not self.holiday_list: + frappe.throw(_("Please select a Holiday List to enable Appointment Scheduling.")) + + hl_from_date, hl_to_date = frappe.get_cached_value( + "Holiday List", self.holiday_list, ["from_date", "to_date"] + ) + now = getdate() + + if not (now >= hl_from_date and now <= hl_to_date): + frappe.throw(_("Holiday List - {0} is not valid for current date.").format(self.holiday_list)) + + def validate_advance_booking_days(self): + if not self.advance_booking_days: + frappe.throw(_("Advance Booking Days is mandatory for Appointment Scheduling.")) + + def validate_portal_booking(self): + if not self.enable_appointment_portal: + return + + if not self.enable_scheduling: + frappe.throw( + _("Appointment Scheduling needs to be enabled for Appointment Booking through portal.") + ) + + self.validate_link_expiry_duration() + + def validate_link_expiry_duration(self): + if ( + not self.verification_link_expiry_duration + or self.verification_link_expiry_duration > 60 + or self.verification_link_expiry_duration < 15 + ): + frappe.throw(_("'Verification Link Expiry Duration' must be between 15 to 60 minutes.")) diff --git a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py index f4cab812daa..721eae7676d 100644 --- a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py +++ b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py @@ -4,13 +4,16 @@ import datetime import frappe +from frappe.utils import add_to_date, getdate +from erpnext.setup.doctype.holiday_list.test_holiday_list import make_holiday_list from erpnext.tests.utils import ERPNextTestSuite class TestAppointmentBookingSettings(ERPNextTestSuite): - """The settings validate each availability slot: from-time must precede to-time and - the slot length must be a whole multiple of the appointment duration.""" + def assert_invalid(self, settings): + with self.assertRaises(frappe.ValidationError): + settings.save() def make_settings(self, appointment_duration=30): doc = frappe.new_doc("Appointment Booking Settings") @@ -19,7 +22,30 @@ class TestAppointmentBookingSettings(ERPNextTestSuite): def dt(self, hms): # the controller parses times against a fixed epoch date - return datetime.datetime.strptime("01/01/1970 " + hms, "%d/%m/%Y %H:%M:%S") + return datetime.datetime.strptime("1970-01-01 " + hms, "%Y-%m-%d %H:%M:%S") + + def get_valid_scheduling_settings(self): + holiday_list = make_holiday_list( + "_Test Booking Settings Holiday List", + from_date=getdate(), + to_date=add_to_date(getdate(), days=30), + holiday_dates=[], + ) + + settings = frappe.get_doc("Appointment Booking Settings") + settings.enable_scheduling = 1 + settings.appointment_duration = 30 + settings.advance_booking_days = 7 + settings.verification_link_expiry_duration = 30 + settings.holiday_list = holiday_list.name + settings.set("agent_list", []) + settings.append("agent_list", {"user": "Administrator"}) + settings.set("availability_of_slots", []) + settings.append( + "availability_of_slots", + {"day_of_week": "Monday", "from_time": "09:00:00", "to_time": "17:00:00"}, + ) + return settings def test_from_time_must_precede_to_time(self): doc = self.make_settings() @@ -42,18 +68,58 @@ class TestAppointmentBookingSettings(ERPNextTestSuite): frappe.ValidationError, doc.duration_is_divisible, self.dt("09:00:00"), self.dt("09:45:00") ) - def test_validate_checks_every_slot(self): - bad = self.make_settings(appointment_duration=30) - bad.append( - "availability_of_slots", - {"day_of_week": "Monday", "from_time": "09:00:00", "to_time": "09:45:00"}, - ) - self.assertRaises(frappe.ValidationError, bad.validate) + def test_scheduling_requires_slots(self): + settings = self.get_valid_scheduling_settings() + settings.set("availability_of_slots", []) - # a clean 60-minute slot passes end to end - good = self.make_settings(appointment_duration=30) - good.append( + self.assert_invalid(settings) + + def test_validate_checks_every_slot(self): + settings = self.get_valid_scheduling_settings() + settings.append( "availability_of_slots", - {"day_of_week": "Monday", "from_time": "09:00:00", "to_time": "10:00:00"}, + {"day_of_week": "Tuesday", "from_time": "09:00:00", "to_time": "09:45:00"}, ) - good.validate() + + self.assert_invalid(settings) + + def test_scheduling_requires_holiday_list_covering_today(self): + settings = self.get_valid_scheduling_settings() + settings.holiday_list = None + self.assert_invalid(settings) + + expired_list = make_holiday_list( + "_Test Booking Settings Expired Holiday List", + from_date=add_to_date(getdate(), days=-60), + to_date=add_to_date(getdate(), days=-30), + holiday_dates=[], + ) + settings.holiday_list = expired_list.name + self.assert_invalid(settings) + + def test_scheduling_requires_advance_booking_days(self): + settings = self.get_valid_scheduling_settings() + settings.advance_booking_days = 0 + + self.assert_invalid(settings) + + def test_portal_requires_scheduling(self): + settings = frappe.get_doc("Appointment Booking Settings") + settings.enable_scheduling = 0 + settings.enable_appointment_portal = 1 + + self.assert_invalid(settings) + + def test_portal_expiry_duration_bounds(self): + settings = self.get_valid_scheduling_settings() + settings.enable_appointment_portal = 1 + settings.verification_link_expiry_duration = 5 + + self.assert_invalid(settings) + + def test_number_of_agents_derived_from_agent_list(self): + settings = self.get_valid_scheduling_settings() + settings.number_of_agents = 99 + settings.save() + + self.assertEqual(frappe.db.get_single_value("Appointment Booking Settings", "number_of_agents"), 1) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 0738e5ae250..7459f4b0df2 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -478,6 +478,7 @@ scheduler_events = { ], "hourly_long": [], "hourly_maintenance": [ + "erpnext.crm.doctype.appointment.appointment.handle_expired_unverified_appointments", "erpnext.stock.doctype.repost_item_valuation.repost_item_valuation.repost_entries", "erpnext.utilities.bulk_transaction.retry", "erpnext.projects.doctype.project.project.collect_project_status", diff --git a/erpnext/templates/emails/appointment_confirmed.html b/erpnext/templates/emails/appointment_confirmed.html new file mode 100644 index 00000000000..12fa2232f58 --- /dev/null +++ b/erpnext/templates/emails/appointment_confirmed.html @@ -0,0 +1,6 @@ +

    {{_("Dear")}} {{ full_name }},

    +

    {{_("Your email has been verified and your appointment has been confirmed for {0}").format(scheduled_time)}}.

    +

    {{_("We look forward to meeting you")}}.

    + +
    +

    {{_("This email was sent from {0}").format(site_url)}}

    diff --git a/erpnext/templates/emails/confirm_appointment.html b/erpnext/templates/emails/confirm_appointment.html index 6c9b28bc136..ce6a9f88a99 100644 --- a/erpnext/templates/emails/confirm_appointment.html +++ b/erpnext/templates/emails/confirm_appointment.html @@ -1,6 +1,7 @@

    {{_("Dear")}} {{ full_name }}{% if last_name %} {{ last_name}}{% endif %},

    {{_("A new appointment has been created for you with {0}").format(site_url)}}.

    {{_("Click on the link below to verify your email and confirm the appointment")}}.

    +

    {{_("This link is valid for {0} minutes").format(expiry_minutes)}}.

    {{ _("Verify Email") }} diff --git a/erpnext/www/book_appointment/index.js b/erpnext/www/book_appointment/index.js index 6564c4bc4aa..ef77115435e 100644 --- a/erpnext/www/book_appointment/index.js +++ b/erpnext/www/book_appointment/index.js @@ -237,9 +237,9 @@ async function submit() { frappe.show_alert(__("Appointment created successfully")); } setTimeout(() => { - let redirect_url = "/"; + let redirect_url = "/book_appointment"; if (window.appointment_settings.success_redirect_url) { - redirect_url += window.appointment_settings.success_redirect_url; + redirect_url = `/${window.appointment_settings.success_redirect_url}`; } window.location.href = redirect_url; }, 5000); diff --git a/erpnext/www/book_appointment/index.py b/erpnext/www/book_appointment/index.py index ef7985ed514..5f28309b872 100644 --- a/erpnext/www/book_appointment/index.py +++ b/erpnext/www/book_appointment/index.py @@ -4,6 +4,7 @@ import zoneinfo import frappe from frappe import _ +from frappe.rate_limiter import rate_limit from frappe.utils.data import get_system_timezone WEEKDAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] @@ -18,7 +19,7 @@ def get_context(context): def handle_appointment_booking_disabled(): - if not frappe.get_single_value("Appointment Booking Settings", "enable_scheduling"): + if not frappe.get_single_value("Appointment Booking Settings", "enable_appointment_portal"): frappe.redirect_to_message( _("Appointment Scheduling Disabled"), _("Appointment Scheduling has been disabled for this site"), @@ -64,6 +65,8 @@ def get_appointment_slots(date: str, timezone: str): ) holiday_list = frappe.get_doc("Holiday List", settings.holiday_list) timeslots = get_available_slots_between(query_start_time, query_end_time, settings) + # fetch the day's booked slots once instead of querying per timeslot + booked_times = get_booked_slot_times_for(timeslots, settings.appointment_duration) # Filter and convert timeslots converted_timeslots = [] @@ -74,7 +77,7 @@ def get_appointment_slots(date: str, timezone: str): converted_timeslots.append(dict(time=converted_timeslot, availability=False)) continue # Check availability - if check_availabilty(timeslot, settings) and converted_timeslot >= now: + if is_slot_available(timeslot, booked_times, settings) and converted_timeslot >= now: converted_timeslots.append(dict(time=converted_timeslot, availability=True)) else: converted_timeslots.append(dict(time=converted_timeslot, availability=False)) @@ -100,7 +103,8 @@ def get_available_slots_between(query_start_time, query_end_time, settings): return timeslots -@frappe.whitelist(allow_guest=True) +@frappe.whitelist(allow_guest=True, methods=["POST"]) +@rate_limit(limit=5, seconds=300) def create_appointment(date: str, time: str, tz: str, contact: str | dict): handle_appointment_booking_disabled() format_string = "%Y-%m-%d %H:%M:%S" @@ -118,7 +122,7 @@ def create_appointment(date: str, time: str, tz: str, contact: str | dict): appointment.customer_skype = contact.get("skype", None) appointment.customer_details = contact.get("notes", None) appointment.customer_email = contact.get("email", None) - appointment.status = "Open" + appointment.created_through_portal = 1 appointment.insert(ignore_permissions=True) return appointment @@ -148,8 +152,23 @@ def convert_to_system_timezone(guest_tz, datetimeobject): return datetimeobject -def check_availabilty(timeslot, settings): - return frappe.db.count("Appointment", {"scheduled_time": timeslot}) < settings.number_of_agents +def get_booked_slot_times_for(timeslots, appointment_duration): + if not timeslots: + return [] + + from erpnext.crm.doctype.appointment.appointment import get_booked_slot_times + + duration = datetime.timedelta(minutes=appointment_duration) + return get_booked_slot_times(min(timeslots) - duration, max(timeslots) + duration) + + +def is_slot_available(timeslot, booked_times, settings): + # mirror the server capacity check: count non-Closed appointments whose + # duration window overlaps this slot, without a per-slot query + duration = datetime.timedelta(minutes=settings.appointment_duration) + lower, upper = timeslot - duration, timeslot + duration + overlapping = sum(1 for booked in booked_times if lower < booked < upper) + return overlapping < settings.number_of_agents def _is_holiday(date, holiday_list): diff --git a/erpnext/www/book_appointment/verify/index.html b/erpnext/www/book_appointment/verify/index.html index 58c07e85ccc..8e8a1096e5e 100644 --- a/erpnext/www/book_appointment/verify/index.html +++ b/erpnext/www/book_appointment/verify/index.html @@ -12,7 +12,7 @@ {% else %}

    - {{ _("Verification failed please check the link") }} + {{ message or _("Verification failed please check the link") }}
    {% endif %} {% endblock%} diff --git a/erpnext/www/book_appointment/verify/index.py b/erpnext/www/book_appointment/verify/index.py index 3beb8667ae7..5b84a37aec7 100644 --- a/erpnext/www/book_appointment/verify/index.py +++ b/erpnext/www/book_appointment/verify/index.py @@ -1,20 +1,58 @@ import frappe -from frappe.utils.verified_command import verify_request +from frappe import _ +from frappe.utils import add_to_date, now_datetime +from frappe.utils.data import sha256_hash + +from erpnext.crm.doctype.appointment.appointment import get_verification_link_expiry def get_context(context): - if not verify_request(): + key = frappe.form_dict.get("key") + if not key: context.success = False return context - email = frappe.form_dict["email"] - appointment_name = frappe.form_dict["appointment"] + appointment_name = frappe.db.get_value("Appointment", {"verification_token": sha256_hash(key)}, "name") + if not appointment_name: + context.success = False + context.message = _("This verification link is invalid. Please book the appointment again.") + return context - if email and appointment_name: - appointment = frappe.get_doc("Appointment", appointment_name) - appointment.set_verified(email) + appointment = frappe.get_doc("Appointment", appointment_name) + + # report a settled status before expiry: a closed/verified appointment is + # more informative than a generic "expired" (and creation-based expiry would + # otherwise mask a sweeper-closed appointment) + if appointment.status == "Closed": + context.success = False + context.message = _("Appointment has been closed. Please book the appointment again.") + return context + + if appointment.status == "Open": context.success = True + context.message = _("Appointment is already verified.") return context - else: + + if now_datetime() > add_to_date(appointment.creation, minutes=get_verification_link_expiry()): context.success = False + context.message = _("Verification link has expired.") return context + + verify_appointment(appointment) + # GET requests are rolled back at the end of the request unless this flag is set + frappe.local.flags.commit = True + context.success = True + return context + + +def verify_appointment(appointment): + # the signed link is the authorization; materializing the appointment + # (agent assignment) needs system privileges the Guest visitor lacks + visitor = frappe.session.user + try: + frappe.set_user("Administrator") + appointment.email_verified = True + appointment.status = "Open" + appointment.save(ignore_permissions=True) + finally: + frappe.set_user(visitor) From b917aca361210b540bd6431c5045d270c79b1b2c Mon Sep 17 00:00:00 2001 From: Jatin3128 <140256508+Jatin3128@users.noreply.github.com> Date: Mon, 20 Jul 2026 18:14:44 +0530 Subject: [PATCH 339/400] refactor: clearer labels for the overdue billing control (#57298) refactor: clearer labels and messages, drop "threshold" wording User-facing text only, no field or behaviour changes: - Accounts Settings toggle label -> "Restrict Customer Over Billing". - Bypass role label -> "Role Allowed to Bypass Over Billing Restriction". - Customer Credit Limit field label -> "Overdue Limit". - Rewrote the descriptions and the block message to match and to stop saying "threshold". --- .../doctype/accounts_settings/accounts_settings.json | 8 ++++---- erpnext/selling/doctype/customer/customer.json | 2 +- erpnext/selling/doctype/customer/customer.py | 10 ++++------ .../customer_credit_limit/customer_credit_limit.json | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 498b8e6393d..1c7a4d488e5 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -278,17 +278,17 @@ }, { "default": "0", - "description": "Block submitting a new Sales Invoice when the customer's overdue amount exceeds the Overdue Billing Threshold set on the customer.", + "description": "Block a new Sales Invoice when the customer's overdue amount exceeds the Overdue Limit set on the customer.", "fieldname": "enable_overdue_billing_threshold", "fieldtype": "Check", - "label": "Enable Overdue Billing Threshold" + "label": "Restrict Customer Over Billing" }, { "depends_on": "eval:doc.enable_overdue_billing_threshold", - "description": "Users with this role can still submit invoices for customers over their overdue billing threshold.", + "description": "Users with this role can still submit invoices for customers who have crossed their Overdue Limit.", "fieldname": "role_allowed_to_bypass_overdue_billing", "fieldtype": "Link", - "label": "Role allowed to bypass overdue billing limit", + "label": "Role Allowed to Bypass Over Billing Restriction", "options": "Role" }, { diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index c6502200ac3..f14a0d223e8 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -471,7 +471,7 @@ "report_hide": 1 }, { - "description": "Transactions are blocked when the outstanding balance exceeds the credit limit. When the overdue billing setting is enabled, new invoices are also blocked when the customer's overdue amount exceeds the overdue billing threshold.", + "description": "Transactions are blocked when the outstanding balance exceeds the credit limit. When Restrict Customer Over Billing is enabled, new invoices are also blocked when the customer's overdue amount exceeds the Overdue Limit.", "fieldname": "credit_limits", "fieldtype": "Table", "label": "Credit & Overdue Limits", diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 1c150bb4676..6ff2b49a33e 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -602,19 +602,17 @@ def check_overdue_billing_threshold(customer: str, company: str) -> None: company_currency = frappe.get_cached_value("Company", company, "default_currency") frappe.throw( - _( - "Customer {0} has an overdue billing limit. Overdue amount {1} exceeds the allowed threshold {2}." - ).format( + _("Overdue Limit crossed for customer {0}. Overdue amount {1} exceeds the allowed limit {2}.").format( customer, fmt_money(overdue_amount, currency=company_currency), fmt_money(threshold, currency=company_currency), ), - title=_("Overdue Billing Limit Crossed"), + title=_("Overdue Limit Crossed"), ) def get_overdue_billing_threshold(customer: str, company: str) -> float: - """Threshold set on the customer, falling back to its customer group.""" + """Overdue limit set on the customer, falling back to its customer group.""" threshold = frappe.db.get_value( "Customer Credit Limit", {"parent": customer, "parenttype": "Customer", "company": company}, @@ -652,7 +650,7 @@ def get_outstanding_invoices_for_customer(customer: str, company: str) -> list[f gl_entry = frappe.qb.DocType("GL Entry") sales_invoice = frappe.qb.DocType("Sales Invoice") - # debit - credit is always booked in company currency, so this is comparable to the threshold + # debit - credit is always booked in company currency, so this is comparable to the overdue limit outstanding = Sum(gl_entry.debit) - Sum(gl_entry.credit) return ( diff --git a/erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json b/erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json index 26ac31cb98d..e208148ae08 100644 --- a/erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +++ b/erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json @@ -21,12 +21,12 @@ }, { "columns": 3, - "description": "New Sales Invoices are blocked when the customer's overdue amount exceeds this. Requires 'Enable Overdue Billing Threshold' in Accounts Settings.", + "description": "New Sales Invoices are blocked when the customer's overdue amount exceeds this. Requires 'Restrict Customer Over Billing' in Accounts Settings.", "fieldname": "overdue_billing_threshold", "fieldtype": "Currency", "hidden": 1, "in_list_view": 1, - "label": "Overdue Billing Threshold" + "label": "Overdue Limit" }, { "fieldname": "column_break_2", From 7d351153bb4be0898ad4b8273e8562781370b9c4 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 20 Jul 2026 18:23:18 +0530 Subject: [PATCH 340/400] feat: warn when a draft linked document already exists When creating a follow-up document (SO->DN, PO->PR, PI->Payment Entry, etc.), warn the user if a draft of the target doctype already linked to the source document exists, with links to the drafts and the option to proceed anyway. The target doctype comes from the make_mapped_doc response via the new frappe.model.add_mapped_doc_guard hook, so every open_mapped_doc flow is covered without per-doctype code or method-name inference. The server lookup walks parent-level and child-table Link / Dynamic Link fields of the target doctype and queries through frappe.get_list, so role and user permissions apply and docstatus filtering happens in the query itself. Payment Entry creation bypasses open_mapped_doc, so its controller runs the same guard explicitly. --- erpnext/controllers/draft_links.py | 56 ++++++++++++++++++ erpnext/controllers/tests/test_draft_links.py | 51 +++++++++++++++++ erpnext/public/js/controllers/transaction.js | 10 +++- erpnext/public/js/erpnext.bundle.js | 1 + erpnext/public/js/utils/draft_link_guard.js | 57 +++++++++++++++++++ 5 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 erpnext/controllers/draft_links.py create mode 100644 erpnext/controllers/tests/test_draft_links.py create mode 100644 erpnext/public/js/utils/draft_link_guard.js diff --git a/erpnext/controllers/draft_links.py b/erpnext/controllers/draft_links.py new file mode 100644 index 00000000000..020045e8852 --- /dev/null +++ b/erpnext/controllers/draft_links.py @@ -0,0 +1,56 @@ +from collections.abc import Iterator + +import frappe +from frappe.model.meta import Meta + + +class DraftLinkFinder: + """Finds draft documents of a target DocType that link back to a source document + through parent-level or child-table Link / Dynamic Link fields.""" + + def __init__(self, source_doctype: str, source_name: str, target_doctype: str) -> None: + self.source_doctype = source_doctype + self.source_name = source_name + self.target_doctype = target_doctype + + def find(self) -> list[str]: + if not frappe.db.exists("DocType", self.target_doctype): + return [] + if not frappe.has_permission(self.target_doctype): + return [] + + names: set[str] = set() + for filters in self._link_filters(): + names.update(frappe.get_list(self.target_doctype, filters=filters, pluck="name")) + return sorted(names) + + def _link_filters(self) -> Iterator[list]: + target_meta = frappe.get_meta(self.target_doctype) + for meta in [target_meta, *self._child_metas(target_meta)]: + yield from self._link_field_filters(meta) + yield from self._dynamic_link_field_filters(meta) + + def _child_metas(self, target_meta: Meta) -> list[Meta]: + return [frappe.get_meta(df.options) for df in target_meta.get_table_fields()] + + def _link_field_filters(self, meta: Meta) -> Iterator[list]: + for field in meta.get_link_fields(): + if field.options == self.source_doctype: + yield [self._draft_filter(), [meta.name, field.fieldname, "=", self.source_name]] + + def _dynamic_link_field_filters(self, meta: Meta) -> Iterator[list]: + for field in meta.get_dynamic_link_fields(): + yield [ + self._draft_filter(), + [meta.name, field.options, "=", self.source_doctype], + [meta.name, field.fieldname, "=", self.source_name], + ] + + def _draft_filter(self) -> list: + return [self.target_doctype, "docstatus", "=", 0] + + +@frappe.whitelist() +def get_existing_drafts(source_doctype: str, source_name: str, target_doctype: str) -> list[str]: + """Draft documents of *target_doctype* created from the given source document.""" + return DraftLinkFinder(source_doctype, source_name, target_doctype).find() diff --git a/erpnext/controllers/tests/test_draft_links.py b/erpnext/controllers/tests/test_draft_links.py new file mode 100644 index 00000000000..4c4c3ea3a22 --- /dev/null +++ b/erpnext/controllers/tests/test_draft_links.py @@ -0,0 +1,51 @@ +import frappe + +from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice +from erpnext.controllers.draft_links import get_existing_drafts +from erpnext.selling.doctype.sales_order.mapper import make_delivery_note +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.stock.doctype.delivery_note.mapper import make_packing_slip +from erpnext.tests.utils import ERPNextTestSuite + + +class TestDraftLinks(ERPNextTestSuite): + def test_finds_draft_via_child_table_link(self): + so = make_sales_order() + dn = make_delivery_note(so.name) + dn.insert() + + self.assertIn(dn.name, get_existing_drafts("Sales Order", so.name, "Delivery Note")) + + frappe.db.set_value("Delivery Note", dn.name, "docstatus", 1) + self.assertNotIn(dn.name, get_existing_drafts("Sales Order", so.name, "Delivery Note")) + + def test_finds_draft_via_dynamic_link(self): + pi = make_purchase_invoice() + pe = get_payment_entry("Purchase Invoice", pi.name) + pe.insert() + + self.assertIn(pe.name, get_existing_drafts("Purchase Invoice", pi.name, "Payment Entry")) + + def test_finds_draft_via_parent_link(self): + so = make_sales_order() + dn = make_delivery_note(so.name) + dn.insert() + packing_slip = make_packing_slip(dn.name) + packing_slip.insert() + + self.assertIn(packing_slip.name, get_existing_drafts("Delivery Note", dn.name, "Packing Slip")) + + def test_nonexistent_target_doctype_returns_empty_for_non_admin(self): + with self.set_user("test@example.com"): + drafts = get_existing_drafts("Sales Order", "SO-0001", "Inter Company Purchase Order") + self.assertEqual(drafts, []) + + def test_requires_permission_on_target_doctype(self): + so = make_sales_order() + dn = make_delivery_note(so.name) + dn.insert() + + with self.set_user("test@example.com"): + drafts = get_existing_drafts("Sales Order", so.name, "Delivery Note") + self.assertEqual(drafts, []) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 21146de9fc8..79311c9724b 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -2880,9 +2880,17 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } } - make_mapped_payment_entry(args) { + async make_mapped_payment_entry(args) { var me = this; args = args || { dt: this.frm.doc.doctype, dn: this.frm.doc.name }; + // get_method_for_payment bypasses open_mapped_doc, so run the draft guard explicitly + let via_journal_entry = this.frm.doc.__onload && this.frm.doc.__onload.make_payment_via_journal_entry; + if ( + !via_journal_entry && + !(await erpnext.utils.confirm_if_drafts_exist(this.frm.doc, "Payment Entry")) + ) { + return; + } return frappe.call({ method: me.get_method_for_payment(), args: args, diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js index ec579c459da..b40d4da2e9c 100644 --- a/erpnext/public/js/erpnext.bundle.js +++ b/erpnext/public/js/erpnext.bundle.js @@ -4,6 +4,7 @@ import "./stock_reservation"; import "./queries"; import "./sms_manager"; import "./utils/party"; +import "./utils/draft_link_guard"; import "./controllers/stock_controller"; import "./utils/serial_no_batch_selector"; import "./payment/payments"; diff --git a/erpnext/public/js/utils/draft_link_guard.js b/erpnext/public/js/utils/draft_link_guard.js new file mode 100644 index 00000000000..d4984890703 --- /dev/null +++ b/erpnext/public/js/utils/draft_link_guard.js @@ -0,0 +1,57 @@ +frappe.provide("erpnext.utils"); + +// Warns before creating a follow-up document (e.g. Delivery Note from Sales Order) +// when a draft of the target DocType already exists for the same source document. + +erpnext.utils.confirm_if_drafts_exist = async function (source_doc, target_doctype) { + // resolves true to proceed; fails open so a broken check never blocks creation + if (!source_doc || !source_doc.name || source_doc.__islocal) { + return true; + } + + let drafts; + try { + drafts = await frappe.xcall("erpnext.controllers.draft_links.get_existing_drafts", { + source_doctype: source_doc.doctype, + source_name: source_doc.name, + target_doctype: target_doctype, + }); + } catch (e) { + console.error(e); + return true; + } + + if (!drafts.length) { + return true; + } + + return new Promise((resolve) => { + frappe.confirm( + get_draft_warning(source_doc, target_doctype, drafts), + () => resolve(true), + () => resolve(false) + ); + }); +}; + +if (frappe.model.add_mapped_doc_guard) { + frappe.model.add_mapped_doc_guard((mapped_doc, opts) => + erpnext.utils.confirm_if_drafts_exist(opts.frm && opts.frm.doc, mapped_doc.doctype) + ); +} + +function get_draft_warning(source_doc, target_doctype, drafts) { + const links = drafts.map((name) => frappe.utils.get_form_link(target_doctype, name, true)).join(", "); + + if (drafts.length === 1) { + return __("A draft {0} already exists for this {1}: {2}. Do you still want to create a new one?", [ + __(target_doctype), + __(source_doc.doctype), + links, + ]); + } + return __( + "{0} draft {1} documents already exist for this {2}: {3}. Do you still want to create a new one?", + [drafts.length, __(target_doctype), __(source_doc.doctype), links] + ); +} From df79e85f53d95618e6d5c1c5ec3912b2cf3d8459 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 20 Jul 2026 19:48:10 +0530 Subject: [PATCH 341/400] feat: recalculate valuation rate and stock value from Bin Renames the Recalculate Bin Qty button to Recalculate Values and sets valuation_rate and stock_value from the last SLE (0 when none exists). --- erpnext/stock/doctype/bin/bin.js | 10 ++++----- erpnext/stock/doctype/bin/bin.py | 24 +++++++++++++--------- erpnext/stock/doctype/bin/test_bin.py | 29 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.js b/erpnext/stock/doctype/bin/bin.js index c725b691db4..5817d318965 100644 --- a/erpnext/stock/doctype/bin/bin.js +++ b/erpnext/stock/doctype/bin/bin.js @@ -3,17 +3,17 @@ frappe.ui.form.on("Bin", { refresh(frm) { - frm.trigger("recalculate_bin_quantity"); + frm.trigger("recalculate_values"); }, - recalculate_bin_quantity(frm) { - frm.add_custom_button(__("Recalculate Bin Qty"), () => { + recalculate_values(frm) { + frm.add_custom_button(__("Recalculate Values"), () => { frappe.call({ - method: "recalculate_qty", + method: "recalculate_values", freeze: true, doc: frm.doc, callback: function (r) { - frappe.show_alert(__("Bin Qty Recalculated"), 2); + frappe.show_alert(__("Bin Values Recalculated"), 2); }, }); }); diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 2b3c40b22ca..e0583533484 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -37,7 +37,7 @@ class Bin(Document): # end: auto-generated types @frappe.whitelist() - def recalculate_qty(self): + def recalculate_values(self): from erpnext.manufacturing.doctype.work_order.work_order import get_reserved_qty_for_production from erpnext.stock.stock_balance import ( get_indented_qty, @@ -46,7 +46,10 @@ class Bin(Document): get_reserved_qty, ) - self.actual_qty = get_actual_qty(self.item_code, self.warehouse) + last_sle = get_last_sle_values(self.item_code, self.warehouse) + self.actual_qty = last_sle.qty_after_transaction + self.valuation_rate = last_sle.valuation_rate + self.stock_value = last_sle.stock_value self.planned_qty = get_planned_qty(self.item_code, self.warehouse) self.indented_qty = get_indented_qty(self.item_code, self.warehouse) self.ordered_qty = get_ordered_qty(self.item_code, self.warehouse) @@ -301,20 +304,23 @@ def update_qty(bin_name, args): def get_actual_qty(item_code, warehouse): + return get_last_sle_values(item_code, warehouse).qty_after_transaction + + +def get_last_sle_values(item_code, warehouse): sle = frappe.qb.DocType("Stock Ledger Entry") - last_sle_qty = ( + last_sle = ( frappe.qb.from_(sle) - .select(sle.qty_after_transaction) + .select(sle.qty_after_transaction, sle.valuation_rate, sle.stock_value) .where((sle.item_code == item_code) & (sle.warehouse == warehouse) & (sle.is_cancelled == 0)) .orderby(sle.posting_datetime, order=Order.desc) .orderby(sle.creation, order=Order.desc) .limit(1) - .run() + .run(as_dict=True) ) - actual_qty = 0.0 - if last_sle_qty: - actual_qty = last_sle_qty[0][0] + if last_sle: + return last_sle[0] - return actual_qty + return frappe._dict(qty_after_transaction=0.0, valuation_rate=0.0, stock_value=0.0) diff --git a/erpnext/stock/doctype/bin/test_bin.py b/erpnext/stock/doctype/bin/test_bin.py index 81b60d6ce19..d668eb09763 100644 --- a/erpnext/stock/doctype/bin/test_bin.py +++ b/erpnext/stock/doctype/bin/test_bin.py @@ -28,6 +28,35 @@ class TestBin(ERPNextTestSuite): bin = _create_bin(item_code, warehouse) self.assertEqual(bin.item_code, item_code) + def test_recalculate_values(self): + from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry + + item_code = make_item("_TestBinRecalculateValues").name + warehouse = "_Test Warehouse - _TC" + make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=100) + + bin = frappe.get_doc("Bin", {"item_code": item_code, "warehouse": warehouse}) + bin.db_set({"actual_qty": 0, "valuation_rate": 0, "stock_value": 0}) + bin.reload() + bin.recalculate_values() + + self.assertEqual(bin.actual_qty, 10) + self.assertEqual(bin.valuation_rate, 100) + self.assertEqual(bin.stock_value, 1000) + + def test_recalculate_values_without_sle(self): + item_code = make_item("_TestBinRecalculateValuesNoSLE").name + warehouse = "_Test Warehouse - _TC" + + bin = _create_bin(item_code, warehouse) + bin.db_set({"actual_qty": 5, "valuation_rate": 50, "stock_value": 250}) + bin.reload() + bin.recalculate_values() + + self.assertEqual(bin.actual_qty, 0) + self.assertEqual(bin.valuation_rate, 0) + self.assertEqual(bin.stock_value, 0) + def test_index_exists(self): # has_index is db-agnostic; raw "SHOW INDEX" is MySQL-only and errors on Postgres if not frappe.db.has_index("tabBin", "unique_item_warehouse"): From 49a43aad81cfcaebdb5f69f56cace5aee49bad04 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 20 Jul 2026 19:59:13 +0530 Subject: [PATCH 342/400] fix: keep Standard Cost stock value in step with the standard rate Mirrors update_qty's Standard Cost handling and drops fixed test item names so reruns start from fresh SLE-less items. --- erpnext/stock/doctype/bin/bin.py | 9 +++++++++ erpnext/stock/doctype/bin/test_bin.py | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index e0583533484..f5417439ded 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -50,6 +50,15 @@ class Bin(Document): self.actual_qty = last_sle.qty_after_transaction self.valuation_rate = last_sle.valuation_rate self.stock_value = last_sle.stock_value + + from erpnext.stock.utils import get_valuation_method + + if get_valuation_method(self.item_code) == "Standard Cost": + from erpnext.stock.doctype.item_standard_cost.item_standard_cost import get_item_standard_rate + + self.stock_value = flt(self.actual_qty) * flt( + get_item_standard_rate(self.item_code, self.company) + ) self.planned_qty = get_planned_qty(self.item_code, self.warehouse) self.indented_qty = get_indented_qty(self.item_code, self.warehouse) self.ordered_qty = get_ordered_qty(self.item_code, self.warehouse) diff --git a/erpnext/stock/doctype/bin/test_bin.py b/erpnext/stock/doctype/bin/test_bin.py index d668eb09763..39ea4cb329d 100644 --- a/erpnext/stock/doctype/bin/test_bin.py +++ b/erpnext/stock/doctype/bin/test_bin.py @@ -31,7 +31,7 @@ class TestBin(ERPNextTestSuite): def test_recalculate_values(self): from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry - item_code = make_item("_TestBinRecalculateValues").name + item_code = make_item().name warehouse = "_Test Warehouse - _TC" make_stock_entry(item_code=item_code, target=warehouse, qty=10, rate=100) @@ -45,7 +45,7 @@ class TestBin(ERPNextTestSuite): self.assertEqual(bin.stock_value, 1000) def test_recalculate_values_without_sle(self): - item_code = make_item("_TestBinRecalculateValuesNoSLE").name + item_code = make_item().name warehouse = "_Test Warehouse - _TC" bin = _create_bin(item_code, warehouse) From 59c0c15c2ed9a82369358856cca212d8ceb4b01f Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 20 Jul 2026 20:05:37 +0530 Subject: [PATCH 343/400] feat(stock): expose all Bin qty fields in Stock Summary and Stock Projected Qty Stock Summary's sort selector only offered 5 of Bin's 10 qty fields; add the rest (ordered, requested, planned, reserved for production plan, reserved stock) and extend get_data's or_filters so bins whose only nonzero qty is one of the new fields show up when sorted by it. Sort labels now mirror Bin field labels. Stock Projected Qty report had a column for every Bin qty field except reserved_stock; add it. --- erpnext/stock/dashboard/item_dashboard.py | 5 +++++ .../stock/page/stock_balance/stock_balance.js | 18 +++++++++++++----- .../stock_projected_qty/stock_projected_qty.py | 9 +++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/erpnext/stock/dashboard/item_dashboard.py b/erpnext/stock/dashboard/item_dashboard.py index 9f628f8152f..400ff783dac 100644 --- a/erpnext/stock/dashboard/item_dashboard.py +++ b/erpnext/stock/dashboard/item_dashboard.py @@ -70,6 +70,11 @@ def get_data( "reserved_qty": ["!=", 0], "reserved_qty_for_production": ["!=", 0], "reserved_qty_for_sub_contract": ["!=", 0], + "reserved_qty_for_production_plan": ["!=", 0], + "reserved_stock": ["!=", 0], + "ordered_qty": ["!=", 0], + "indented_qty": ["!=", 0], + "planned_qty": ["!=", 0], "actual_qty": ["!=", 0], }, filters=filters, diff --git a/erpnext/stock/page/stock_balance/stock_balance.js b/erpnext/stock/page/stock_balance/stock_balance.js index a5fba9f98f3..531e335dfdb 100644 --- a/erpnext/stock/page/stock_balance/stock_balance.js +++ b/erpnext/stock/page/stock_balance/stock_balance.js @@ -48,11 +48,19 @@ frappe.pages["stock-balance"].on_page_load = function (wrapper) { sort_by: "projected_qty", sort_order: "asc", options: [ - { fieldname: "projected_qty", label: __("Projected qty") }, - { fieldname: "reserved_qty", label: __("Reserved for sale") }, - { fieldname: "reserved_qty_for_production", label: __("Reserved for manufacturing") }, - { fieldname: "reserved_qty_for_sub_contract", label: __("Reserved for sub contracting") }, - { fieldname: "actual_qty", label: __("Actual qty in stock") }, + { fieldname: "projected_qty", label: __("Projected Qty") }, + { fieldname: "reserved_qty", label: __("Reserved Qty") }, + { fieldname: "reserved_qty_for_production", label: __("Reserved Qty for Production") }, + { fieldname: "reserved_qty_for_sub_contract", label: __("Reserved Qty for Subcontract") }, + { + fieldname: "reserved_qty_for_production_plan", + label: __("Reserved Qty for Production Plan"), + }, + { fieldname: "reserved_stock", label: __("Reserved Stock") }, + { fieldname: "ordered_qty", label: __("Ordered Qty") }, + { fieldname: "indented_qty", label: __("Requested Qty") }, + { fieldname: "planned_qty", label: __("Planned Qty") }, + { fieldname: "actual_qty", label: __("Actual Qty") }, ], }, change: function (sort_by, sort_order) { diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py index 3c6571376fd..23737e7c5a1 100644 --- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py +++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py @@ -84,6 +84,7 @@ def execute(filters=None): bin.reserved_qty_for_production_plan, bin.reserved_qty_for_sub_contract, reserved_qty_for_pos, + bin.reserved_stock, bin.projected_qty, re_order_level, re_order_qty, @@ -202,6 +203,13 @@ def get_columns(): "width": 100, "convertible": "qty", }, + { + "label": _("Reserved Stock"), + "fieldname": "reserved_stock", + "fieldtype": "Float", + "width": 100, + "convertible": "qty", + }, { "label": _("Projected Qty"), "fieldname": "projected_qty", @@ -248,6 +256,7 @@ def get_bin_list(filters): bin.reserved_qty_for_production, bin.reserved_qty_for_sub_contract, bin.reserved_qty_for_production_plan, + bin.reserved_stock, bin.projected_qty, ) .orderby(bin.item_code, bin.warehouse) From 58b839eb7155ea49b2bacc443aa371801eca4c13 Mon Sep 17 00:00:00 2001 From: Soham Kulkarni <77533095+sokumon@users.noreply.github.com> Date: Mon, 20 Jul 2026 21:44:49 +0530 Subject: [PATCH 344/400] Revert "fix: mark selling as default workspace for customer" --- .../selling/workspace/selling/selling.json | 64 +------------------ 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/erpnext/selling/workspace/selling/selling.json b/erpnext/selling/workspace/selling/selling.json index 4fb6b805759..7bcc6264948 100644 --- a/erpnext/selling/workspace/selling/selling.json +++ b/erpnext/selling/workspace/selling/selling.json @@ -622,7 +622,7 @@ "type": "Link" } ], - "modified": "2026-07-20 15:48:06.603686", + "modified": "2026-07-03 13:44:07.820564", "modified_by": "Administrator", "module": "Selling", "module_onboarding": "Selling Onboarding", @@ -653,7 +653,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "house", "indent": 0, "keep_closed": 0, @@ -667,7 +666,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "chart-column", "indent": 0, "keep_closed": 0, @@ -681,7 +679,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "receipt-text", "indent": 0, "keep_closed": 0, @@ -695,7 +692,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "store", "indent": 0, "keep_closed": 0, @@ -709,7 +705,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "receipt", "indent": 0, "keep_closed": 0, @@ -723,7 +718,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "computer", "indent": 1, "keep_closed": 1, @@ -736,7 +730,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "icon": "", "indent": 0, "keep_closed": 0, @@ -750,7 +743,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Profile", @@ -763,7 +755,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Invoice", @@ -776,7 +767,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Opening Entry", @@ -789,7 +779,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Closing Entry", @@ -802,7 +791,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Invoice Merge Log", @@ -815,7 +803,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "POS Settings", @@ -828,7 +815,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Loyalty Program", @@ -841,7 +827,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Loyalty Point Entry", @@ -854,7 +839,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "package", "indent": 1, "keep_closed": 1, @@ -867,7 +851,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "icon": "", "indent": 0, "keep_closed": 0, @@ -881,7 +864,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item Group", @@ -894,7 +876,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Price List", @@ -907,7 +888,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item Price", @@ -920,7 +900,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Pricing Rule", @@ -933,7 +912,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Promotional Scheme", @@ -946,7 +924,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Coupon Code", @@ -959,7 +936,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Blanket Order", @@ -972,7 +948,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "database", "indent": 1, "keep_closed": 1, @@ -985,7 +960,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 1, "icon": "", "indent": 0, "keep_closed": 0, @@ -999,7 +973,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Group", @@ -1012,7 +985,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Address", @@ -1025,7 +997,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Contact", @@ -1038,7 +1009,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Territory", @@ -1051,7 +1021,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Campaign", @@ -1064,7 +1033,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person", @@ -1077,7 +1045,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partner", @@ -1090,7 +1057,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Monthly Distribution", @@ -1103,7 +1069,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Terms Template", @@ -1116,7 +1081,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Tax Template", @@ -1129,7 +1093,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Product Bundle", @@ -1142,7 +1105,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "UTM Source", @@ -1155,7 +1117,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Shipping Rule", @@ -1168,7 +1129,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "sheet", "indent": 1, "keep_closed": 1, @@ -1181,7 +1141,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Register", @@ -1194,7 +1153,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item-wise Sales Register", @@ -1207,7 +1165,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Analytics", @@ -1220,7 +1177,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Addresses And Contacts", @@ -1233,7 +1189,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Inactive Customers", @@ -1246,7 +1201,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Invoice Trends", @@ -1259,7 +1213,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Credit Balance", @@ -1272,7 +1225,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customers Without Any Sales Transactions", @@ -1285,7 +1237,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partners Commission", @@ -1298,7 +1249,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Available Stock for Packing Items", @@ -1311,7 +1261,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Territory Target Variance Based On Item Group", @@ -1324,7 +1273,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person Target Variance Based On Item Group", @@ -1337,7 +1285,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Partner Target Variance Based On Item Group", @@ -1350,7 +1297,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Pending SO Items For Purchase Request", @@ -1363,7 +1309,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Funnel", @@ -1376,7 +1321,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Order Analysis", @@ -1389,7 +1333,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Customer Acquisition and Loyalty", @@ -1402,7 +1345,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Quotation Trends", @@ -1415,7 +1357,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Order Trends", @@ -1428,7 +1369,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Item-wise Sales History", @@ -1441,7 +1381,6 @@ { "child": 1, "collapsible": 1, - "default_workspace": 0, "indent": 0, "keep_closed": 0, "label": "Sales Person-wise Transaction Summary", @@ -1454,7 +1393,6 @@ { "child": 0, "collapsible": 1, - "default_workspace": 0, "icon": "settings", "indent": 0, "keep_closed": 0, From ab6931279d79a96f691a4ac3acb392e675682918 Mon Sep 17 00:00:00 2001 From: MochaMind Date: Tue, 21 Jul 2026 00:41:52 +0530 Subject: [PATCH 345/400] fix: sync translations from crowdin (#57259) --- erpnext/locale/ar.po | 2031 ++-- erpnext/locale/bg.po | 2029 ++-- erpnext/locale/bs.po | 2033 ++-- erpnext/locale/cs.po | 2029 ++-- erpnext/locale/da.po | 20924 +++++++++++++++++++------------------- erpnext/locale/de.po | 2031 ++-- erpnext/locale/eo.po | 2033 ++-- erpnext/locale/es.po | 2029 ++-- erpnext/locale/fa.po | 2031 ++-- erpnext/locale/fr.po | 2029 ++-- erpnext/locale/hi.po | 2029 ++-- erpnext/locale/hr.po | 2033 ++-- erpnext/locale/hu.po | 2029 ++-- erpnext/locale/id.po | 2029 ++-- erpnext/locale/it.po | 2029 ++-- erpnext/locale/ko.po | 2029 ++-- erpnext/locale/my.po | 2029 ++-- erpnext/locale/nb.po | 2029 ++-- erpnext/locale/nl.po | 2031 ++-- erpnext/locale/pl.po | 2029 ++-- erpnext/locale/pt.po | 2029 ++-- erpnext/locale/pt_BR.po | 2029 ++-- erpnext/locale/ru.po | 2031 ++-- erpnext/locale/sl.po | 2029 ++-- erpnext/locale/sr.po | 2031 ++-- erpnext/locale/sr_CS.po | 2031 ++-- erpnext/locale/sv.po | 2033 ++-- erpnext/locale/th.po | 2031 ++-- erpnext/locale/tr.po | 2029 ++-- erpnext/locale/uz.po | 2033 ++-- erpnext/locale/vi.po | 2031 ++-- erpnext/locale/zh.po | 2029 ++-- 32 files changed, 42299 insertions(+), 41562 deletions(-) diff --git a/erpnext/locale/ar.po b/erpnext/locale/ar.po index 75a45953a59..0dd2ec9c4ad 100644 --- a/erpnext/locale/ar.po +++ b/erpnext/locale/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-07-12 10:05+0000\n" -"PO-Revision-Date: 2026-07-15 12:58\n" +"POT-Creation-Date: 2026-07-19 10:04+0000\n" +"PO-Revision-Date: 2026-07-19 13:55\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" @@ -86,15 +86,15 @@ msgstr " التجميع الفرعي" msgid " Summary" msgstr "" -#: erpnext/stock/doctype/item/item.py:281 +#: erpnext/stock/doctype/item/item.py:286 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "\"الأصناف المقدمة من العملاء\" لا يمكن شرائها" -#: erpnext/stock/doctype/item/item.py:283 +#: erpnext/stock/doctype/item/item.py:288 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "\"الأصناف المقدمة من العملاء\" لا يمكن ان تحتوي على تكلفة" -#: erpnext/stock/doctype/item/item.py:385 +#: erpnext/stock/doctype/item/item.py:390 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "\"اصل ثابت\" لا يمكن أن يكون غير محدد، حيث يوجد سجل أصول مقابل البند" @@ -284,7 +284,7 @@ msgid "'Entries' cannot be empty" msgstr "المدخلات لا يمكن أن تكون فارغة" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:132 #: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "من تاريخ (مطلوب)" @@ -293,7 +293,7 @@ msgstr "من تاريخ (مطلوب)" msgid "'From Date' must be after 'To Date'" msgstr "\"من تاريخ \" يجب أن يكون بعد \" إلى تاريخ \"" -#: erpnext/stock/doctype/item/item.py:468 +#: erpnext/stock/doctype/item/item.py:473 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" msgstr "" @@ -312,7 +312,7 @@ msgid "'Opening'" msgstr "'افتتاحي'" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:134 #: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "' إلى تاريخ ' مطلوب" @@ -337,8 +337,8 @@ msgstr "{0} الحساب مستخدم بواسطة{1} استخدم حساب آخ msgid "'{0}' has been already added." msgstr "لقد تمت إضافة '{0}' بالفعل." -#: erpnext/setup/doctype/company/company.py:376 -#: erpnext/setup/doctype/company/company.py:387 +#: erpnext/setup/doctype/company/company.py:378 +#: erpnext/setup/doctype/company/company.py:389 msgid "'{0}' should be in company currency {1}." msgstr "" @@ -864,6 +864,11 @@ msgid "
    Message Example
    \n\n" "
    \n" msgstr "" +#. Header text in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounting Overview" +msgstr "" + #. Header text in the Stock Workspace #: erpnext/stock/workspace/stock/stock.json msgid "Masters & Reports" @@ -892,11 +897,6 @@ msgstr "" msgid "Reports & Masters" msgstr "" -#. Header text in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward and Outward" -msgstr "" - #. Header text in the ERPNext Settings Workspace #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json msgid "Your Shortcuts\n" @@ -966,7 +966,7 @@ msgstr "" msgid "A - C" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:358 +#: erpnext/selling/doctype/customer/customer.py:372 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" msgstr "" @@ -1147,11 +1147,11 @@ msgstr "" msgid "Abbreviation" msgstr "اسم مختصر" -#: erpnext/setup/doctype/company/company.py:310 +#: erpnext/setup/doctype/company/company.py:312 msgid "Abbreviation already used for another company" msgstr "الاختصار يستخدم بالفعل لشركة أخرى\\n
    \\nAbbreviation already used for another company" -#: erpnext/setup/doctype/company/company.py:307 +#: erpnext/setup/doctype/company/company.py:309 msgid "Abbreviation is mandatory" msgstr "الاسم المختصر إلزامي" @@ -1273,11 +1273,9 @@ msgstr "رصيد حسابك" #. Label of the account_category (Link) field in DocType 'Account' #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:162 #: erpnext/accounts/doctype/account_category/account_category.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Account Category" msgstr "تصنيف الحساب" @@ -1380,7 +1378,7 @@ msgstr "" msgid "Account Manager" msgstr "إدارة حساب المستخدم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 #: erpnext/controllers/accounts_controller.py:1234 msgid "Account Missing" msgstr "الحساب مفقود" @@ -1520,6 +1518,12 @@ msgstr "تعذر العثور على الحساب" msgid "Account to record additional purchase expenses like freight or customs" msgstr "" +#. Description of the 'Expenses Added To Stock Account' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account to track value added to stock via Stock Entry, Stock Reconciliation or Landed Cost Voucher" +msgstr "" + #. Description of the 'COGS Account' (Link) field in DocType 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json msgid "Account where cost of goods sold will be posted when this item is sold" @@ -1572,7 +1576,7 @@ msgstr "لا يمكن تعطيل الحساب {0} لأنه تم تعيينه ب msgid "Account {0} does not belong to company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:358 +#: erpnext/setup/doctype/company/company.py:360 msgid "Account {0} does not belong to company: {1}" msgstr "الحساب {0} لا يتنمى للشركة {1}\\n
    \\nAccount {0} does not belong to company: {1}" @@ -1600,7 +1604,7 @@ msgstr "الحساب {0} موجود في الشركة الأم {1}." msgid "Account {0} is added in the child company {1}" msgstr "تتم إضافة الحساب {0} في الشركة التابعة {1}" -#: erpnext/setup/doctype/company/company.py:347 +#: erpnext/setup/doctype/company/company.py:349 msgid "Account {0} is disabled." msgstr "تم تعطيل الحساب {0}." @@ -1658,6 +1662,7 @@ msgstr "" #. Item' #. Label of the section_break_10 (Section Break) field in DocType 'Shipping #. Rule' +#. Name of a Workspace #. Label of the accounting_tab (Tab Break) field in DocType 'Supplier' #. Label of a Desktop Icon #. Label of the accounting_tab (Tab Break) field in DocType 'Customer' @@ -1669,6 +1674,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/desktop_icon/accounting.json erpnext/public/js/setup_wizard.js:91 #: erpnext/selling/doctype/customer/customer.json @@ -1727,15 +1733,12 @@ msgstr "" #. 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/budgeting.json msgid "Accounting Dimension" msgstr "البعد المحاسبي" @@ -1929,8 +1932,8 @@ msgstr "القيود المحاسبة" msgid "Accounting Entry for Asset" msgstr "المدخلات الحسابية للأصول" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:298 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:316 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:303 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:321 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1951,17 +1954,17 @@ msgstr "القيد المحاسبي للخدمة" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:430 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:675 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:696 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:430 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:234 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:249 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:263 -#: erpnext/stock/services/base_stock_gl_composer.py:65 -#: erpnext/stock/services/base_stock_gl_composer.py:80 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:439 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:239 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:254 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:268 +#: erpnext/stock/services/base_stock_gl_composer.py:72 +#: erpnext/stock/services/base_stock_gl_composer.py:87 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:67 msgid "Accounting Entry for Stock" msgstr "القيود المحاسبية للمخزون" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:268 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:276 msgid "Accounting Entry for {0}" msgstr "القيد المحاسبي لـ {0}" @@ -1970,12 +1973,12 @@ msgid "Accounting Entry for {0}: {1} can only be made in currency: {2}" msgstr "المدخل المحاسبي ل {0}: {1} يمكن أن يكون فقط بالعملة {1}.\\n
    \\nAccounting Entry for {0}: {1} can only be made in currency: {2}" #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.js:193 -#: erpnext/assets/doctype/asset/asset.js:190 -#: erpnext/assets/doctype/asset_repair/asset_repair.js:92 -#: erpnext/buying/doctype/supplier/supplier.js:123 +#: erpnext/assets/doctype/asset/asset.js:198 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:101 +#: erpnext/buying/doctype/supplier/supplier.js:132 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 -#: erpnext/selling/doctype/customer/customer.js:173 +#: erpnext/selling/doctype/customer/customer.js:182 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "موازنة دفتر الأستاذ" @@ -1992,10 +1995,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_period/accounting_period.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounting Period" msgstr "فترة المحاسبة" @@ -2035,7 +2036,7 @@ msgstr "تم تجميد القيود المحاسبية حتى هذا التار #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/assets/doctype/asset_category/asset_category.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:513 +#: erpnext/setup/doctype/company/company.py:515 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json @@ -2075,13 +2076,18 @@ msgstr "الحسابات المفقودة من التقرير" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:126 -#: erpnext/buying/doctype/supplier/supplier.js:135 +#: erpnext/buying/doctype/supplier/supplier.js:144 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Accounts Payable" msgstr "الحسابات الدائنة" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Payable Ageing" +msgstr "" + #. Name of a report #: erpnext/accounts/report/accounts_payable/accounts_payable.js:191 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.json @@ -2100,7 +2106,7 @@ msgstr "ملخص الحسابات المستحقة للدفع" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.json #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:149 -#: erpnext/selling/doctype/customer/customer.js:162 +#: erpnext/selling/doctype/customer/customer.js:171 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json @@ -2119,6 +2125,11 @@ msgstr "ضبط الحسابات المدينة/الدائنة" msgid "Accounts Receivable / Payable remarks length" msgstr "" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Receivable Ageing" +msgstr "" + #. Label of the accounts_receivable_credit (Link) field in DocType 'Invoice #. Discounting' #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.json @@ -2150,17 +2161,12 @@ msgstr "حسابات القبض غير المدفوعة" #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Accounts Settings" msgstr "إعدادات الحسابات" -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/accounts_setup/accounts_setup.json #: erpnext/desktop_icon/accounts_setup.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounts Setup" msgstr "" @@ -2198,7 +2204,7 @@ msgstr "حساب الاستهلاك المتراكم" #. Label of the accumulated_depreciation_amount (Currency) field in DocType #. 'Depreciation Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:173 -#: erpnext/assets/doctype/asset/asset.js:385 +#: erpnext/assets/doctype/asset/asset.js:393 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Accumulated Depreciation Amount" msgstr "قيمة الاستهلاك المتراكمة" @@ -2346,7 +2352,7 @@ msgstr "الإجراءات المنجزة" #. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType #. 'Stock Settings' -#: erpnext/stock/doctype/item/item.js:485 +#: erpnext/stock/doctype/item/item.js:496 #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Activate Serial / Batch No for Item" msgstr "" @@ -2360,11 +2366,6 @@ msgstr "العروض النشطة" msgid "Active Status" msgstr "الحالة النشطة" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Active Subcontracted Items" -msgstr "البنود المتعاقد عليها من الباطن النشطة" - #. Label of the activities_tab (Tab Break) field in DocType 'Lead' #. Label of the activities_tab (Tab Break) field in DocType 'Opportunity' #. Label of the activities_tab (Tab Break) field in DocType 'Prospect' @@ -2480,7 +2481,7 @@ msgstr "تاريخ النهاية الفعلي لا يمكن أن يكون قب msgid "Actual End Time" msgstr "الفعلي وقت الانتهاء" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:464 msgid "Actual Expense" msgstr "المصروفات الفعلية" @@ -2670,7 +2671,7 @@ msgstr "إضافة متعددة" msgid "Add Multiple Tasks" msgstr "إضافة مهام متعددة" -#: erpnext/stock/doctype/item/item.js:985 +#: erpnext/stock/doctype/item/item.js:1002 msgid "Add Opening Stock" msgstr "" @@ -2856,11 +2857,11 @@ msgstr "أضيف من قبل" msgid "Added On" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:135 +#: erpnext/buying/doctype/supplier/supplier.py:143 msgid "Added Supplier Role to User {0}." msgstr "" -#: erpnext/controllers/website_list_for_contact.py:311 +#: erpnext/controllers/website_list_for_contact.py:313 msgid "Added {1} role to user {0}." msgstr "" @@ -3275,7 +3276,7 @@ msgstr "العنوان المستخدم لتحديد فئة الضريبة في msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:203 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:211 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3472,7 +3473,7 @@ msgstr "مقابل الحساب" msgid "Against Blanket Order" msgstr "ضد بطانية النظام" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:838 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:844 msgid "Against Customer Order {0}" msgstr "مقابل طلب العميل {0}" @@ -3725,7 +3726,7 @@ msgstr "" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:171 -#: erpnext/accounts/utils.py:1653 erpnext/public/js/setup_wizard.js:278 +#: erpnext/accounts/utils.py:1647 erpnext/public/js/setup_wizard.js:278 msgid "All Accounts" msgstr "جميع الحسابات" @@ -3777,21 +3778,21 @@ msgstr "جميع مجموعات العملاء" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:506 -#: erpnext/setup/doctype/company/company.py:509 -#: erpnext/setup/doctype/company/company.py:514 -#: erpnext/setup/doctype/company/company.py:520 -#: erpnext/setup/doctype/company/company.py:526 -#: erpnext/setup/doctype/company/company.py:532 -#: erpnext/setup/doctype/company/company.py:538 -#: erpnext/setup/doctype/company/company.py:544 -#: erpnext/setup/doctype/company/company.py:550 -#: erpnext/setup/doctype/company/company.py:556 -#: erpnext/setup/doctype/company/company.py:562 -#: erpnext/setup/doctype/company/company.py:568 -#: erpnext/setup/doctype/company/company.py:574 -#: erpnext/setup/doctype/company/company.py:580 -#: erpnext/setup/doctype/company/company.py:586 +#: erpnext/setup/doctype/company/company.py:508 +#: erpnext/setup/doctype/company/company.py:511 +#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:522 +#: erpnext/setup/doctype/company/company.py:528 +#: erpnext/setup/doctype/company/company.py:534 +#: erpnext/setup/doctype/company/company.py:540 +#: erpnext/setup/doctype/company/company.py:546 +#: erpnext/setup/doctype/company/company.py:552 +#: erpnext/setup/doctype/company/company.py:558 +#: erpnext/setup/doctype/company/company.py:564 +#: erpnext/setup/doctype/company/company.py:570 +#: erpnext/setup/doctype/company/company.py:576 +#: erpnext/setup/doctype/company/company.py:582 +#: erpnext/setup/doctype/company/company.py:588 msgid "All Departments" msgstr "جميع الاقسام" @@ -3871,7 +3872,7 @@ msgstr "جميع مجموعات الموردين" msgid "All Territories" msgstr "جميع الأقاليم" -#: erpnext/setup/doctype/company/company.py:451 +#: erpnext/setup/doctype/company/company.py:453 msgid "All Warehouses" msgstr "جميع المخازن" @@ -3914,11 +3915,11 @@ msgstr "جميع الإصناف تم نقلها لأمر العمل" msgid "All items in this document already have a linked Quality Inspection." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:915 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:921 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "يجب ربط جميع العناصر بطلب مبيعات أو طلب توريد فرعي لهذه الفاتورة." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:926 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:932 msgid "All linked Sales Orders must be subcontracted." msgstr "" @@ -4454,6 +4455,21 @@ msgstr "" msgid "Allow transferring raw materials even after the Required Quantity is fulfilled" msgstr "" +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Supplier' +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Customer' +#. Label of the allowed_companies (Table MultiSelect) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Allowed Companies" +msgstr "" + +#: erpnext/stock/doctype/company_restriction/company_restriction.py:74 +msgid "Allowed Companies is required when Restrict to Companies is checked" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json msgid "Allowed Dimension" @@ -4534,7 +4550,7 @@ msgstr "" msgid "Already Imported" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1123 +#: erpnext/stock/doctype/pick_list/pick_list.py:1132 msgid "Already Picked" msgstr "" @@ -4542,7 +4558,7 @@ msgstr "" msgid "Already set default in pos profile {0} for user {1}, kindly disabled default" msgstr "تم تعيين الإعداد الافتراضي في الملف الشخصي لنقطة البيع {0} للمستخدم {1}، يرجى تعطيل الإعداد الافتراضي" -#: erpnext/stock/doctype/item/item.js:38 +#: erpnext/stock/doctype/item/item.js:40 msgid "Also you can't switch back to FIFO after setting the valuation method to Moving Average for this item." msgstr "" @@ -4554,7 +4570,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:158 #: erpnext/manufacturing/doctype/work_order/work_order.js:173 #: erpnext/public/js/utils.js:616 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:343 msgid "Alternate Item" msgstr "صنف بديل" @@ -4582,7 +4598,7 @@ msgstr "" msgid "Alternative item must not be same as item code" msgstr "يجب ألا يكون الصنف البديل هو نفسه رمز الصنف" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:383 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 msgid "Alternatively, you can download the template and fill your data in." msgstr "" @@ -4989,12 +5005,12 @@ msgstr "مجموعة العناصر هي طريقة لتصنيف العناصر msgid "An email will be sent to notify the User with the role 'Purchase Manager' when an automatic Material Request is created." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:617 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:766 msgid "An error has been appeared while reposting item valuation via {0}" msgstr "حدث خطأ أثناء إعادة نشر تقييم العنصر عبر {0}" #: erpnext/public/js/controllers/buying.js:378 -#: erpnext/public/js/utils/sales_common.js:495 +#: erpnext/public/js/utils/sales_common.js:493 msgid "An error occurred during the update process" msgstr "حدث خطأ أثناء عملية التحديث" @@ -5549,7 +5565,7 @@ msgstr "نظرًا لتمكين الحقل {0} ، يكون الحقل {1} إلز msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "أثناء تمكين الحقل {0} ، يجب أن تكون قيمة الحقل {1} أكثر من 1." -#: erpnext/stock/doctype/item/item.py:1122 +#: erpnext/stock/doctype/item/item.py:1127 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "بما أن هناك معاملات مقدمة بالفعل مقابل العنصر {0}، فلا يمكنك تغيير قيمة {1}." @@ -5557,7 +5573,7 @@ msgstr "بما أن هناك معاملات مقدمة بالفعل مقابل msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}." msgstr "نظرًا لوجود عناصر تجميع فرعية كافية، فإن أمر العمل غير مطلوب للمستودع {0}." -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:464 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:470 msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "نظرًا لوجود مواد خام كافية ، فإن طلب المواد ليس مطلوبًا للمستودع {0}." @@ -5699,7 +5715,7 @@ msgstr "حساب فئة الأصول" msgid "Asset Category Name" msgstr "اسم فئة الأصول" -#: erpnext/stock/doctype/item/item.py:377 +#: erpnext/stock/doctype/item/item.py:382 msgid "Asset Category is mandatory for Fixed Asset item" msgstr "فئة الموجودات إلزامية لبنود الموجودات الثابتة\\n
    \\nAsset Category is mandatory for Fixed Asset item" @@ -5890,6 +5906,7 @@ msgstr "أصل مستلم ولكن غير فاتورة" #. Label of the asset_repair (Link) field in DocType 'Stock Entry' #. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.js:113 +#: erpnext/assets/doctype/asset/asset.js:152 #: 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 @@ -5940,8 +5957,7 @@ msgstr "" #. Label of the asset_value (Currency) field in DocType 'Asset Capitalization #. Asset Item' -#: erpnext/assets/dashboard_fixtures.py:180 -#: erpnext/assets/doctype/asset/asset.js:517 +#: erpnext/assets/doctype/asset/asset.js:525 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:208 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:457 @@ -5964,7 +5980,6 @@ msgid "Asset Value Adjustment cannot be posted before Asset's purchase date { msgstr "لا يمكن نشر تسوية قيمة الأصل قبل تاريخ شراء الأصل {0} ." #. Label of a chart in the Assets Workspace -#: erpnext/assets/dashboard_fixtures.py:56 #: erpnext/assets/workspace/assets/assets.json msgid "Asset Value Analytics" msgstr "تحليلات قيمة الأصول" @@ -6001,7 +6016,7 @@ msgstr "" msgid "Asset issued to Employee {0}" msgstr "تم إصدار الأصول للموظف {0}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:181 msgid "Asset out of order due to Asset Repair {0}" msgstr "الأصل معطل بسبب إصلاح الأصل {0}" @@ -6046,7 +6061,7 @@ msgstr "تم نقل الأصل إلى الموقع {0}" msgid "Asset updated after being split into Asset {0}" msgstr "تم تحديث الأصل بعد تقسيمه إلى الأصل {0}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:335 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:338 msgid "Asset updated due to Asset Repair {0} {1}." msgstr "تم تحديث الأصل بسبب إصلاح الأصل {0} {1}." @@ -6095,7 +6110,7 @@ msgstr "لم يتم إرسال الأصل {0} . يرجى إرسال الأصل msgid "Asset {0} must be submitted" msgstr "الاصل {0} يجب تقديمه" -#: erpnext/controllers/buying_controller.py:1039 +#: erpnext/controllers/buying_controller.py:1047 msgid "Asset {assets_link} created for {item_code}" msgstr "تم إنشاء الأصل {assets_link} لـ {item_code}" @@ -6133,11 +6148,11 @@ msgstr "الأصول" msgid "Assets Setup" msgstr "" -#: erpnext/controllers/buying_controller.py:1057 +#: erpnext/controllers/buying_controller.py:1065 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "لم يتم إنشاء الأصول لـ {item_code}. سيكون عليك إنشاء الأصل يدويًا." -#: erpnext/controllers/buying_controller.py:1044 +#: erpnext/controllers/buying_controller.py:1052 msgid "Assets {assets_link} created for {item_code}" msgstr "الأصول {assets_link} التي تم إنشاؤها لـ {item_code}" @@ -6255,7 +6270,7 @@ msgstr "في الصف {0}: الكمية إلزامية للدفعة {1}" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "في الصف {0}: الرقم التسلسلي إلزامي للعنصر {1}" -#: erpnext/stock/services/serial_batch_bundle_service.py:502 +#: erpnext/stock/services/serial_batch_bundle_service.py:504 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." msgstr "" @@ -6315,11 +6330,11 @@ msgstr "السمة اسم" msgid "Attribute Value" msgstr "السمة القيمة" -#: erpnext/stock/doctype/item/item.py:888 +#: erpnext/stock/doctype/item/item.py:893 msgid "Attribute Value {0} is not valid for the selected attribute {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1034 +#: erpnext/stock/doctype/item/item.py:1039 msgid "Attribute table is mandatory" msgstr "جدول الخصائص إلزامي" @@ -6327,19 +6342,19 @@ msgstr "جدول الخصائص إلزامي" msgid "Attribute value: {0} must appear only once" msgstr "قيمة السمة: {0} يجب أن تظهر مرة واحدة فقط" -#: erpnext/stock/doctype/item/item.py:877 +#: erpnext/stock/doctype/item/item.py:882 msgid "Attribute {0} is disabled." msgstr "" -#: erpnext/stock/doctype/item/item.py:865 +#: erpnext/stock/doctype/item/item.py:870 msgid "Attribute {0} is not valid for the selected template." msgstr "" -#: erpnext/stock/doctype/item/item.py:1038 +#: erpnext/stock/doctype/item/item.py:1043 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "تم تحديد السمة {0} عدة مرات في جدول السمات\\n
    \\nAttribute {0} selected multiple times in Attributes Table" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Attributes" msgstr "سمات" @@ -6486,7 +6501,7 @@ msgstr "" msgid "Auto Reposting of Incorrect Valuation" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:202 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:209 msgid "Auto Tax Settings Error" msgstr "خطأ في إعدادات الضريبة التلقائية" @@ -6547,7 +6562,7 @@ msgid "Auto reconcile Payments" msgstr "" #: erpnext/public/js/controllers/buying.js:373 -#: erpnext/public/js/utils/sales_common.js:490 +#: erpnext/public/js/utils/sales_common.js:488 msgid "Auto repeat document updated" msgstr "تكرار تلقائي للمستندات المحدثة" @@ -6892,8 +6907,8 @@ msgstr "الكمية في الصندوق" #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:118 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order.js:1496 -#: erpnext/stock/doctype/material_request/material_request.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:810 +#: erpnext/stock/doctype/material_request/material_request.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:809 #: 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:524 @@ -7123,7 +7138,7 @@ msgstr "أداة تحديث بوم" msgid "BOM Update Tool Log with job status maintained" msgstr "سجل أداة تحديث قائمة المواد مع الاحتفاظ بحالة المهمة" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:102 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:103 msgid "BOM Updation already in progress. Please wait until {0} is complete." msgstr "" @@ -7152,8 +7167,8 @@ msgstr "يُعدّ كل من قائمة المواد وكمية المنتج ا msgid "BOM and Production" msgstr "قائمة المواد والإنتاج" -#: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:862 +#: erpnext/stock/doctype/material_request/material_request.js:387 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:861 msgid "BOM does not contain any stock item" msgstr "فاتورة الموارد لا تحتوي على أي صنف مخزون" @@ -7284,7 +7299,7 @@ msgstr "التوازن في العملة الأساسية" #: erpnext/stock/report/available_batch_report/available_batch_report.py:62 #: 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/batch_wise_balance_history/batch_wise_balance_history.py:89 #: erpnext/stock/report/stock_balance/stock_balance.py:517 #: erpnext/stock/report/stock_ledger/stock_ledger.py:331 msgid "Balance Qty" @@ -7357,7 +7372,7 @@ msgid "Balance Type" 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/batch_wise_balance_history/batch_wise_balance_history.py:91 #: erpnext/stock/report/stock_balance/stock_balance.py:525 #: erpnext/stock/report/stock_ledger/stock_ledger.py:388 msgid "Balance Value" @@ -7388,7 +7403,6 @@ msgstr "" #. Label of the bank (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace #. Option for the 'Salary Mode' (Select) field in DocType 'Employee' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/bank/bank.json #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7402,7 +7416,6 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:95 #: erpnext/setup/doctype/employee/employee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank" msgstr "مصرف" @@ -7431,7 +7444,6 @@ msgstr "رقم الحساب المصرفي." #. Label of the bank_account (Link) field in DocType 'Payment Order Reference' #. Label of the bank_account (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:141 #: banking/src/pages/BankStatementImporter.tsx:90 #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7450,7 +7462,6 @@ msgstr "رقم الحساب المصرفي." #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:16 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:16 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account" msgstr "حساب مصرفي" @@ -7486,16 +7497,12 @@ msgid "Bank Account No" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Subtype" msgstr "النوع الفرعي للحساب المصرفي" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_type/bank_account_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Type" msgstr "نوع الحساب المصرفي" @@ -7508,7 +7515,9 @@ msgstr "" msgid "Bank Accounts" msgstr "حسابات مصرفية" +#. Label of a chart in the Accounting Workspace #. Label of the bank_balance (Check) field in DocType 'Email Digest' +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/setup/doctype/email_digest/email_digest.json msgid "Bank Balance" msgstr "الرصيد المصرفي" @@ -7532,10 +7541,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Clearance" msgstr "تخليص البنك" @@ -7605,9 +7612,7 @@ msgid "Bank Fee, Salary, etc." msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Guarantee" msgstr "ضمان بنكي" @@ -7635,11 +7640,6 @@ msgstr "" msgid "Bank Overdraft Account" msgstr "حساب السحب من البنك بدون رصيد" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Bank Reconciliation" -msgstr "" - #. Name of a report #. Label of a Link in the Invoicing Workspace #: banking/src/components/features/BankReconciliation/BankReconciliationStatement.tsx:208 @@ -7785,19 +7785,15 @@ msgstr "الحساب المصرفي/النقدي {0} لا ينتمي إلى ال #. Label of the banking_section (Section Break) field in DocType 'Accounts #. Settings' -#. Name of a Workspace #. Label of a Card Break in the Invoicing Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: banking/src/pages/BankReconciliation.tsx:57 #: banking/src/pages/BankReconciliation.tsx:87 #: banking/src/pages/BankStatementImporterContainer.tsx:22 #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/workspace/banking/banking.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/banking.json #: erpnext/setup/setup_wizard/data/industry_type.txt:8 -#: erpnext/workspace_sidebar/banking.json msgid "Banking" msgstr "الخدمات المصرفية" @@ -7806,11 +7802,11 @@ msgstr "الخدمات المصرفية" msgid "Barcode Type" msgstr "نوع الباركود" -#: erpnext/stock/doctype/item/item.py:547 +#: erpnext/stock/doctype/item/item.py:552 msgid "Barcode {0} already used in Item {1}" msgstr "الباركود {0} مستخدم بالفعل في الصنف {1}" -#: erpnext/stock/doctype/item/item.py:562 +#: erpnext/stock/doctype/item/item.py:567 msgid "Barcode {0} is not a valid {1} code" msgstr "الباركود {0} ليس رمز {1} صالحًا" @@ -7965,7 +7961,7 @@ msgstr "التسعير الاساسي استنادأ لوحدة القياس" #. Label of a Link in the Stock Workspace #: erpnext/stock/doctype/batch/batch.json #: 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/batch_wise_balance_history/batch_wise_balance_history.py:85 #: 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:418 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:182 @@ -8049,7 +8045,7 @@ msgstr "" #: 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:2989 -#: erpnext/public/js/utils/barcode_scanner.js:281 +#: erpnext/public/js/utils/barcode_scanner.js:286 #: erpnext/public/js/utils/serial_no_batch_selector.js:450 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_price/item_price.json @@ -8083,7 +8079,7 @@ msgstr "رقم دفعة" msgid "Batch No is mandatory" msgstr "رقم الدفعة إلزامي" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3570 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3572 msgid "Batch No {0} does not exist" msgstr "" @@ -8277,18 +8273,16 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace #. Label of the bom_info_section (Section Break) field in DocType 'Stock Entry' -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.py:1168 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:796 +#: erpnext/stock/doctype/material_request/material_request.js:142 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:795 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "فاتورة المواد" #. Option for the 'Status' (Select) field in DocType 'Timesheet' -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/doctype/timesheet/timesheet_list.js:9 msgid "Billed" @@ -8652,6 +8646,12 @@ msgstr "حظر الفاتورة" msgid "Block Supplier" msgstr "كتلة المورد" +#. Description of the 'Enable Overdue Billing Threshold' (Check) field in +#. DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Block submitting a new Sales Invoice when the customer's overdue amount exceeds the Overdue Billing Threshold set on the customer." +msgstr "" + #. Description of the 'Is Frozen' (Check) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Blocks all further accounting entries on this customer's account. Only users with the frozen-entries role can override.\n" @@ -8729,6 +8729,12 @@ msgstr "" msgid "Book Deferred entries based on" msgstr "" +#. Label of the book_stock_expense_gl_entries (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Book Stock Expense GL Entries" +msgstr "" + #: erpnext/www/book_appointment/index.html:15 msgid "Book an appointment" msgstr "احجز موعدًا" @@ -8756,6 +8762,12 @@ msgstr "حجز" msgid "Booked Fixed Asset" msgstr "حجز الأصول الثابتة" +#. Description of the 'Book Stock Expense GL Entries' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Books Purchase Expense and Expenses Added To Stock account pairs against stock value. On enabling this, the accounts become mandatory in Company or Item Defaults for Purchase Receipt, Purchase Invoice, Stock Entry, Stock Reconciliation and Landed Cost Voucher" +msgstr "" + #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" msgstr "" @@ -8792,12 +8804,10 @@ 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 "فرع" @@ -8885,7 +8895,6 @@ msgstr "حجم الدلو" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cost_center/cost_center.js:45 @@ -8896,9 +8905,9 @@ msgstr "حجم الدلو" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:237 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:319 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:329 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:454 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budgeting.json +#: erpnext/desktop_icon/budget.json msgid "Budget" msgstr "ميزانية" @@ -8966,8 +8975,8 @@ msgstr "قائمة الميزانية" msgid "Budget Start Date" msgstr "تاريخ بدء الميزانية" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/budgeting.json +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json msgid "Budget Variance" msgstr "" @@ -8987,13 +8996,6 @@ msgstr "لايمكن أسناد الميزانية للمجموعة Account {0}" msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" msgstr "" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/budgeting/budgeting.json -#: erpnext/workspace_sidebar/budgeting.json -msgid "Budgeting" -msgstr "" - #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" msgstr "الميزانيات" @@ -9223,11 +9225,6 @@ msgstr "" msgid "CC To" msgstr "CC إلى" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "COA Importer" -msgstr "" - #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "CODE-39" @@ -9245,7 +9242,7 @@ msgstr "" msgid "COGS By Item Group" msgstr "تكلفة البضائع المباعة حسب مجموعة الأصناف" -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:44 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:55 msgid "COGS Debit" msgstr "مدين تكلفة البضائع المباعة" @@ -9561,7 +9558,7 @@ msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "لا يمكن الفلتره علي اساس (رقم الأيصال)، إذا تم وضعه في مجموعة على اساس (ايصال)" #: erpnext/accounts/doctype/journal_entry/mapper.py:32 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2617 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2615 msgid "Can only make payment against unbilled {0}" msgstr "يمكن إجراء دفعة فقط مقابل فاتورة غير مدفوعة {0}" @@ -9571,7 +9568,7 @@ msgstr "يمكن إجراء دفعة فقط مقابل فاتورة غير مد 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:278 +#: erpnext/setup/doctype/company/company.py:280 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "لا يمكن تغيير طريقة التقييم، حيث توجد معاملات على بعض البنود التي لا تملك طريقة تقييم خاصة بها." @@ -9615,7 +9612,7 @@ msgstr "" msgid "Cannot Assign Cashier" msgstr "لا يمكن تعيين أمين صندوق" -#: erpnext/setup/doctype/company/company.py:297 +#: erpnext/setup/doctype/company/company.py:299 msgid "Cannot Change Inventory Account Setting" msgstr "لا يمكن تغيير إعدادات حساب المخزون" @@ -9623,9 +9620,9 @@ msgstr "لا يمكن تغيير إعدادات حساب المخزون" msgid "Cannot Create Return" msgstr "لا يمكن إنشاء إرجاع" -#: erpnext/stock/doctype/item/item.py:690 -#: erpnext/stock/doctype/item/item.py:703 -#: erpnext/stock/doctype/item/item.py:719 +#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:708 +#: erpnext/stock/doctype/item/item.py:724 msgid "Cannot Merge" msgstr "لا يمكن الدمج" @@ -9649,7 +9646,7 @@ msgstr "لا يمكن تعديل {0} {1}، يرجى إنشاء واحد جديد msgid "Cannot apply TDS against multiple parties in one entry" msgstr "لا يمكن تطبيق ضريبة الاستقطاع على عدة أطراف في إدخال واحد" -#: erpnext/stock/doctype/item/item.py:380 +#: erpnext/stock/doctype/item/item.py:385 msgid "Cannot be a fixed asset item as Stock Ledger is created." msgstr "لا يمكن أن يكون عنصر الأصول الثابتة كما يتم إنشاء دفتر الأستاذ." @@ -9670,7 +9667,7 @@ msgstr "لا يمكن إلغاء إدخال إغلاق نقطة البيع" msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:283 msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "لا يمكن الإلغاء لأن معالجة المستندات الملغاة لا تزال قيد الانتظار." @@ -9678,7 +9675,7 @@ msgstr "لا يمكن الإلغاء لأن معالجة المستندات ال msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "لا يمكن الإلغاء لان هناك تدوينات مخزون مقدمة {0} موجوده" -#: erpnext/stock/stock_ledger.py:226 +#: erpnext/stock/stock_ledger.py:230 msgid "Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet." msgstr "لا يمكن إلغاء العملية. لم تكتمل إعادة تقييم السلعة عند الإرسال بعد." @@ -9690,7 +9687,7 @@ msgstr "لا يمكن إلغاء إدخال مخزون التصنيع هذا ل msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "" -#: erpnext/controllers/buying_controller.py:1145 +#: erpnext/controllers/buying_controller.py:1153 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "لا يمكن إلغاء هذا المستند لأنه مرتبط بالأصل المُرسَل {asset_link}. يُرجى إلغاء الأصل للمتابعة." @@ -9698,11 +9695,11 @@ msgstr "لا يمكن إلغاء هذا المستند لأنه مرتبط با msgid "Cannot cancel transaction for Completed Work Order." msgstr "لا يمكن إلغاء المعاملة لأمر العمل المكتمل." -#: erpnext/stock/doctype/item/item.py:986 +#: erpnext/stock/doctype/item/item.py:991 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "لا يمكن تغيير سمات بعد معاملة الأسهم. جعل عنصر جديد ونقل الأسهم إلى البند الجديد" -#: erpnext/stock/doctype/item/item.py:1147 +#: erpnext/stock/doctype/item/item.py:1152 msgid "Cannot change Item {0} from serialized to non-serialized because a Serial and Batch Bundle exists for it. Please delete or cancel the Serial and Batch Bundle first." msgstr "" @@ -9714,11 +9711,11 @@ msgstr "لا يمكن تغيير نوع المستند المرجعي." msgid "Cannot change Service Stop Date for item in row {0}" msgstr "لا يمكن تغيير تاريخ إيقاف الخدمة للعنصر الموجود في الصف {0}" -#: erpnext/stock/doctype/item/item.py:977 +#: erpnext/stock/doctype/item/item.py:982 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "لا يمكن تغيير خصائص المتغير بعد معاملة المخزون. سيكون عليك عمل عنصر جديد للقيام بذلك." -#: erpnext/setup/doctype/company/company.py:403 +#: erpnext/setup/doctype/company/company.py:405 msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "لا يمكن تغيير العملة الافتراضية للشركة، لأن هناك معاملات موجودة. يجب إلغاء المعاملات لتغيير العملة الافتراضية." @@ -9730,7 +9727,7 @@ msgstr "" msgid "Cannot convert Cost Center to ledger as it has child nodes" msgstr "لا يمكن تحويل مركز التكلفة إلى حساب دفتر الأستاذ لانه مرتبط بعقدة فرعية" -#: erpnext/projects/doctype/task/task.js:49 +#: erpnext/projects/doctype/task/task.js:55 msgid "Cannot convert Task to non-group because the following child Tasks exist: {0}." msgstr "لا يمكن تحويل المهمة إلى مهمة غير جماعية لوجود المهام الفرعية التالية: {0}." @@ -9809,7 +9806,7 @@ msgstr "" msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." msgstr "" -#: erpnext/setup/doctype/company/company.py:629 +#: erpnext/setup/doctype/company/company.py:631 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 "لا يمكن تعطيل الجرد الدائم، لوجود قيود دفترية للمخزون للشركة {0}. يرجى إلغاء معاملات المخزون أولاً ثم المحاولة مرة أخرى." @@ -9825,7 +9822,7 @@ msgstr "لا يمكن تفكيك كمية أكبر من الكمية المنت msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "" -#: erpnext/setup/doctype/company/company.py:294 +#: erpnext/setup/doctype/company/company.py:296 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 "لا يمكن تفعيل حساب المخزون حسب الصنف، لوجود قيود دفترية للمخزون للشركة {0} مع حساب مخزون حسب المستودع. يرجى إلغاء معاملات المخزون أولاً ثم المحاولة مرة أخرى." @@ -9842,11 +9839,11 @@ msgstr "لا يمكن ضمان التسليم بواسطة Serial No حيث أن msgid "Cannot fetch selected rows for submitted Payment Request" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:62 +#: erpnext/public/js/utils/barcode_scanner.js:67 msgid "Cannot find Item or Warehouse with this Barcode" msgstr "لا يمكن العثور على المنتج أو المستودع باستخدام هذا الرمز الشريطي" -#: erpnext/public/js/utils/barcode_scanner.js:63 +#: erpnext/public/js/utils/barcode_scanner.js:68 msgid "Cannot find Item with this Barcode" msgstr "لا يمكن العثور على عنصر بهذا الرمز الشريطي" @@ -9904,7 +9901,7 @@ msgstr "تعذر استرداد رمز الرابط للتحديث. راجع س msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "تعذر استرداد رمز الرابط. راجع سجل الأخطاء لمزيد من المعلومات." -#: erpnext/selling/doctype/customer/customer.py:371 +#: erpnext/selling/doctype/customer/customer.py:385 msgid "Cannot select a Group type Customer Group. Please select a non-group Customer Group." msgstr "" @@ -9929,7 +9926,7 @@ msgstr "لا يمكن أن تعين كخسارة لأنه تم تقديم أمر msgid "Cannot set authorization on basis of Discount for {0}" msgstr "لا يمكن تحديد التخويل على أساس الخصم ل {0}" -#: erpnext/stock/doctype/item/item.py:777 +#: erpnext/stock/doctype/item/item.py:782 msgid "Cannot set multiple Item Defaults for a company." msgstr "لا يمكن تعيين عدة عناصر افتراضية لأي شركة." @@ -10038,7 +10035,7 @@ msgstr "حساب رأس المال قيد التنفيذ" msgid "Capital Work in Progress" msgstr "العمل الرأسمالي في التقدم" -#: erpnext/assets/doctype/asset/asset.js:228 +#: erpnext/assets/doctype/asset/asset.js:236 msgid "Capitalize Asset" msgstr "رسملة الأصول" @@ -10047,7 +10044,7 @@ msgstr "رسملة الأصول" msgid "Capitalize Repair Cost" msgstr "رسملة تكلفة الإصلاح" -#: erpnext/assets/doctype/asset/asset.js:226 +#: erpnext/assets/doctype/asset/asset.js:234 msgid "Capitalize this asset before submitting." msgstr "قم برسملة هذا الأصل قبل الإرسال." @@ -10232,16 +10229,12 @@ msgstr "التصنيف حسب القسيمة (المجمعة)" msgid "Category Details" msgstr "تفاصيل التصنيف" -#: erpnext/assets/dashboard_fixtures.py:93 -msgid "Category-wise Asset Value" -msgstr "قيمة الأصول حسب الفئة" - -#: erpnext/buying/doctype/purchase_order/purchase_order.py:289 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:290 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:140 msgid "Caution" msgstr "الحذر" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:210 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:218 msgid "Caution: This might alter frozen accounts." msgstr "تنبيه: قد يؤدي هذا إلى تغيير الحسابات المجمدة." @@ -10341,7 +10334,7 @@ msgstr "تغيير تاريخ الإصدار" msgid "Change in Stock Value" msgstr "التغير في قيمة السهم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:773 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:779 msgid "Change the account type to Receivable or select a different account." msgstr "قم بتغيير نوع الحساب إلى "ذمم مدينة" أو حدد حسابًا مختلفًا." @@ -10351,7 +10344,7 @@ msgstr "قم بتغيير نوع الحساب إلى "ذمم مدينة&quo msgid "Change this date manually to setup the next synchronization start date" msgstr "قم بتغيير هذا التاريخ يدويًا لإعداد تاريخ بدء المزامنة التالي" -#: erpnext/selling/doctype/customer/customer.py:161 +#: erpnext/selling/doctype/customer/customer.py:168 msgid "Changed customer name to '{0}' as '{1}' already exists." msgstr "" @@ -10359,7 +10352,7 @@ msgstr "" msgid "Changes in {0}" msgstr "التغييرات في {0}" -#: erpnext/stock/doctype/item/item.js:451 +#: erpnext/stock/doctype/item/item.js:462 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "لا يسمح بتغيير مجموعة العملاء للعميل المحدد." @@ -10369,7 +10362,7 @@ msgstr "لا يسمح بتغيير مجموعة العملاء للعميل ال msgid "Changing the account in any transaction of the DocTypes listed below will trigger a repost. To prevent reposting, remove the relevant DocType from the list." msgstr "" -#: erpnext/stock/doctype/item/item.js:34 +#: erpnext/stock/doctype/item/item.js:36 msgid "Changing the valuation method to Moving Average will affect new transactions. If backdated entries are added, earlier FIFO-based entries will be reposted, which may change closing balances." msgstr "سيؤثر تغيير طريقة التقييم إلى المتوسط المتحرك على المعاملات الجديدة. في حال إضافة قيود مؤرخة بأثر رجعي، سيتم إعادة تسجيل القيود السابقة المستندة إلى طريقة الوارد أولاً صادر أولاً (FIFO)، مما قد يؤدي إلى تغيير الأرصدة الختامية." @@ -10434,7 +10427,6 @@ msgstr "شجرة الرسم البياني" #: erpnext/setup/doctype/company/company.js:139 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/home/home.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/invoicing.json msgid "Chart of Accounts" msgstr "الشجرة المحاسبية" @@ -10449,11 +10441,9 @@ msgid "Chart of Accounts Importer" msgstr "مخطط حسابات المستورد" #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account_tree.js:191 #: erpnext/accounts/doctype/cost_center/cost_center.js:41 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Chart of Cost Centers" msgstr "دليل مراكز التكلفة" @@ -10695,7 +10685,7 @@ msgstr "" msgid "Clauses and Conditions" msgstr "الشروط والأحكام" -#: erpnext/public/js/utils/barcode_scanner.js:493 +#: erpnext/public/js/utils/barcode_scanner.js:502 msgid "Clear Last Scanned Warehouse" msgstr "" @@ -10761,7 +10751,7 @@ msgstr "" msgid "Clearing Demo Data..." msgstr "جارٍ مسح بيانات العرض التوضيحي..." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:749 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:747 msgid "Click on 'Get Finished Goods for Manufacture' to fetch the items from the above Sales Orders. Items only for which a BOM is present will be fetched." msgstr "انقر على \"الحصول على المنتجات النهائية للتصنيع\" لجلب الأصناف من أوامر البيع المذكورة أعلاه. سيتم جلب الأصناف التي تحتوي على قائمة مكونات فقط." @@ -10769,7 +10759,7 @@ msgstr "انقر على \"الحصول على المنتجات النهائية msgid "Click on Add to Holidays. This will populate the holidays table with all the dates that fall on the selected weekly off. Repeat the process for populating the dates for all your weekly holidays" msgstr "انقر على \"إضافة إلى العطلات\". سيؤدي هذا إلى ملء جدول العطلات بجميع التواريخ التي تقع ضمن العطلة الأسبوعية المحددة. كرر العملية لإضافة تواريخ جميع عطلاتك الأسبوعية." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:744 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:742 msgid "Click on Get Sales Orders to fetch sales orders based on the above filters." msgstr "انقر على \"الحصول على أوامر المبيعات\" لجلب أوامر المبيعات بناءً على عوامل التصفية المذكورة أعلاه." @@ -11274,6 +11264,7 @@ msgstr "شركات" #. Label of the company (Link) field in DocType 'Vehicle' #. Label of a Link in the Home Workspace #. Label of the company (Link) field in DocType 'Bin' +#. Label of the company (Link) field in DocType 'Company Restriction' #. Label of the company (Link) field in DocType 'Delivery Note' #. Label of the company (Link) field in DocType 'Delivery Trip' #. Label of the company (Link) field in DocType 'Item Default' @@ -11303,7 +11294,6 @@ msgstr "شركات" #. Label of the company (Link) field in DocType 'Subcontracting Receipt' #. Label of the company (Link) field in DocType 'Issue' #. Label of the company (Link) field in DocType 'Warranty Claim' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:82 #: banking/src/pages/BankStatementImporter.tsx:84 #: erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js:8 @@ -11543,9 +11533,10 @@ msgstr "شركات" #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json +#: erpnext/stock/doctype/company_restriction/company_restriction.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.json -#: erpnext/stock/doctype/item/item.js:940 +#: erpnext/stock/doctype/item/item.js:957 #: erpnext/stock/doctype/item_default/item_default.json #: erpnext/stock/doctype/item_standard_cost/item_standard_cost.json #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json @@ -11611,8 +11602,6 @@ msgstr "شركات" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 -#: erpnext/workspace_sidebar/accounts_setup.json -#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "شركة" @@ -11771,6 +11760,23 @@ msgstr "اسم الشركة لا يمكن أن تكون شركة" msgid "Company Not Linked" msgstr "شركة غير مرتبطة" +#. Name of a DocType +#: erpnext/stock/doctype/company_restriction/company_restriction.json +msgid "Company Restriction" +msgstr "" + +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Supplier' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Customer' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Company Restrictions" +msgstr "" + #. Label of the shipping_address (Link) field in DocType 'Request for #. Quotation' #. Label of the shipping_address (Link) field in DocType 'Subcontracting Order' @@ -11796,8 +11802,8 @@ msgstr "" msgid "Company currencies of both the companies should match for Inter Company Transactions." msgstr "يجب أن تتطابق عملات الشركة لكلتا الشركتين مع معاملات Inter Inter Company." -#: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:856 +#: erpnext/stock/doctype/material_request/material_request.js:381 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:855 msgid "Company field is required" msgstr "حقل الشركة مطلوب" @@ -11908,7 +11914,7 @@ msgstr "اسم المنافس" #. Label of the competitors (Table MultiSelect) field in DocType 'Opportunity' #. Label of the competitors (Table MultiSelect) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:612 +#: erpnext/public/js/utils/sales_common.js:610 #: erpnext/selling/doctype/quotation/quotation.json msgid "Competitors" msgstr "المنافسون" @@ -11963,7 +11969,7 @@ msgstr "المشاريع المنجزة" msgid "Completed Qty" msgstr "الكمية المكتملة" -#: erpnext/manufacturing/doctype/work_order/services/operations.py:274 +#: erpnext/manufacturing/doctype/work_order/services/operations.py:294 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "لا يمكن أن تكون الكمية المكتملة أكبر من "الكمية إلى التصنيع"" @@ -12011,7 +12017,7 @@ msgstr "اكتمال بواسطة" msgid "Completion Date" msgstr "تاريخ الانتهاء" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:82 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:85 msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly." msgstr "لا يمكن أن يكون تاريخ الإنجاز قبل تاريخ الفشل. يرجى تعديل التواريخ وفقًا لذلك." @@ -12703,7 +12709,7 @@ msgstr "معامل التحويل" msgid "Conversion Rate" msgstr "معدل التحويل" -#: erpnext/stock/doctype/item/item.py:463 +#: erpnext/stock/doctype/item/item.py:468 msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "معامل التحويل الافتراضي لوحدة القياس يجب أن يكون 1 في الصف {0}" @@ -12926,7 +12932,6 @@ msgstr "" #. Item' #. Label of the cost_center (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:567 #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:626 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:1179 @@ -13020,16 +13025,13 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center" msgstr "مركز التكلفة" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center Allocation" msgstr "توزيع مركز التكلفة" @@ -13055,12 +13057,16 @@ msgstr "اسم مركز تكلفة" msgid "Cost Center Number" msgstr "رقم مركز التكلفة" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:122 +msgid "Cost Center Validation Error" +msgstr "" + #. Label of a Card Break in the Invoicing Workspace #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Cost Center and Budgeting" msgstr "مركز التكلفة والميزانية" -#: erpnext/public/js/utils/sales_common.js:546 +#: erpnext/public/js/utils/sales_common.js:544 msgid "Cost Center for Item rows has been updated to {0}" msgstr "تم تحديث مركز التكلفة لصفوف الأصناف إلى {0}" @@ -13073,7 +13079,7 @@ msgid "Cost Center is required" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:644 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:401 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:410 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "مركز التكلفة مطلوب في الصف {0} في جدول الضرائب للنوع {1}\\n
    \\nCost Center is required in row {0} in Taxes table for type {1}" @@ -13475,8 +13481,8 @@ msgstr "إنشاء زبائن محتملين" msgid "Create Ledger Entries for Change Amount" msgstr "إنشاء قيود دفتر الأستاذ لمبلغ الباقي" -#: erpnext/buying/doctype/supplier/supplier.js:257 -#: erpnext/selling/doctype/customer/customer.js:289 +#: erpnext/buying/doctype/supplier/supplier.js:266 +#: erpnext/selling/doctype/customer/customer.js:298 msgid "Create Link" msgstr "إنشاء رابط" @@ -13623,9 +13629,9 @@ msgstr "إنشاء إدخال إعادة نشر" #. Title of an Onboarding Step #. Label of an action in the Onboarding Step 'Create Sales Invoice' #: erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json -#: erpnext/projects/doctype/timesheet/timesheet.js:55 -#: erpnext/projects/doctype/timesheet/timesheet.js:231 -#: erpnext/projects/doctype/timesheet/timesheet.js:235 +#: erpnext/projects/doctype/timesheet/timesheet.js:56 +#: erpnext/projects/doctype/timesheet/timesheet.js:233 +#: erpnext/projects/doctype/timesheet/timesheet.js:237 #: erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json msgid "Create Sales Invoice" msgstr "إنشاء فاتورة مبيعات" @@ -13648,7 +13654,7 @@ msgid "Create Service Item" msgstr "" #: erpnext/stock/dashboard/item_dashboard.js:283 -#: erpnext/stock/doctype/material_request/material_request.js:478 +#: erpnext/stock/doctype/material_request/material_request.js:479 msgid "Create Stock Entry" msgstr "إنشاء إدخال المخزون" @@ -13731,12 +13737,12 @@ msgstr "إنشاء صلاحية المستخدم" msgid "Create Users" msgstr "إنشاء المستخدمين" -#: erpnext/stock/doctype/item/item.js:1398 +#: erpnext/stock/doctype/item/item.js:1415 msgid "Create Variant" msgstr "إنشاء متغير" -#: erpnext/stock/doctype/item/item.js:1210 -#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1227 +#: erpnext/stock/doctype/item/item.js:1264 msgid "Create Variants" msgstr "إنشاء المتغيرات" @@ -13771,12 +13777,12 @@ msgstr "" msgid "Create a new rule to automatically classify transactions." msgstr "" -#: erpnext/stock/doctype/item/item.js:1230 -#: erpnext/stock/doctype/item/item.js:1391 +#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1408 msgid "Create a variant with the template image." msgstr "أنشئ نسخة بديلة باستخدام صورة القالب." -#: erpnext/stock/stock_ledger.py:2157 +#: erpnext/stock/stock_ledger.py:2205 msgid "Create an incoming stock transaction for the Item." msgstr "قم بإنشاء حركة مخزون واردة للصنف." @@ -13814,7 +13820,7 @@ msgstr "تم إنشاؤه بواسطة الهجرة" msgid "Created {0} draft Grouped Payment Entries" msgstr "" -#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:230 +#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:232 msgid "Created {0} scorecards for {1} between:" msgstr "تم إنشاء {0} بطاقات تسجيل النقاط لـ {1} بين:" @@ -13855,7 +13861,7 @@ msgstr "إنشاء الأبعاد ..." msgid "Creating Journal Entries..." msgstr "" -#: erpnext/stock/doctype/item/item.js:999 +#: erpnext/stock/doctype/item/item.js:1016 msgid "Creating Opening Stock Entry..." msgstr "" @@ -13962,6 +13968,13 @@ msgstr "" msgid "Credit" msgstr "دائن" +#. Label of the credit_limits (Table) field in DocType 'Customer' +#. Label of the credit_limits (Table) field in DocType 'Customer Group' +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/setup/doctype/customer_group/customer_group.json +msgid "Credit & Overdue Limits" +msgstr "" + #: erpnext/accounts/report/general_ledger/general_ledger.py:744 msgid "Credit (Transaction)" msgstr "الائتمان (المعاملة)" @@ -14031,23 +14044,19 @@ msgstr "إدخال بطاقة إئتمان" msgid "Credit Days" msgstr "الائتمان أيام" -#. Label of the credit_limits (Table) field in DocType 'Customer' #. Label of the credit_limit (Currency) field in DocType 'Customer Credit #. Limit' #. Label of the credit_limit (Currency) field in DocType 'Company' -#. Label of the credit_limits (Table) field in DocType 'Customer Group' #. Label of the section_credit_limit (Section Break) field in DocType 'Supplier #. Group' -#: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.py:65 #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/supplier_group/supplier_group.json msgid "Credit Limit" msgstr "الحد الائتماني" -#: erpnext/selling/doctype/customer/customer.py:542 +#: erpnext/selling/doctype/customer/customer.py:559 msgid "Credit Limit Crossed" msgstr "تم تجاوز الحد الائتماني" @@ -14127,20 +14136,20 @@ msgstr "دائن الى" msgid "Credit in Company Currency" msgstr "المدين في عملة الشركة" -#: erpnext/selling/doctype/customer/customer.py:508 -#: erpnext/selling/doctype/customer/customer.py:564 +#: erpnext/selling/doctype/customer/customer.py:525 +#: erpnext/selling/doctype/customer/customer.py:581 msgid "Credit limit has been crossed for customer {0} ({1}/{2})" msgstr "تم تجاوز حد الائتمان للعميل {0} ({1} / {2})" -#: erpnext/selling/doctype/customer/customer.py:398 +#: erpnext/selling/doctype/customer/customer.py:412 msgid "Credit limit is already defined for the Company {0}" msgstr "تم تحديد حد الائتمان بالفعل للشركة {0}" -#: erpnext/selling/doctype/customer/customer.py:563 +#: erpnext/selling/doctype/customer/customer.py:580 msgid "Credit limit reached for customer {0}" msgstr "تم بلوغ حد الائتمان للعميل {0}" -#: erpnext/accounts/utils.py:2856 +#: erpnext/accounts/utils.py:2850 msgid "Credit limit warning — submission may be blocked: {0}" msgstr "" @@ -14200,7 +14209,7 @@ msgstr "معايير الوزن" msgid "Criteria weights must add up to 100%" msgstr "يجب أن يصل مجموع أوزان المعايير إلى 100%" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:189 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:196 msgid "Cron Interval should be between 1 and 59 Min" msgstr "يجب أن تكون فترة Cron بين 1 و 59 دقيقة" @@ -14257,10 +14266,8 @@ msgstr "كوب" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/doctype/currency_exchange/currency_exchange.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Currency Exchange" msgstr "تصريف العملات" @@ -14270,7 +14277,6 @@ msgstr "تصريف العملات" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Currency Exchange Settings" msgstr "إعدادات صرف العملات" @@ -14329,7 +14335,7 @@ msgstr "لا تدعم التقارير المالية المخصصة حاليً #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:215 #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:284 -#: erpnext/accounts/utils.py:2575 +#: erpnext/accounts/utils.py:2569 msgid "Currency for {0} must be {1}" msgstr "العملة ل {0} يجب أن تكون {1} \\n
    \\nCurrency for {0} must be {1}" @@ -14387,7 +14393,7 @@ msgstr "أصول متداولة" msgid "Current BOM" msgstr "قائمة المواد الحالية" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:81 msgid "Current BOM and New BOM cannot be the same" msgstr "" @@ -14628,7 +14634,7 @@ msgstr "محددات مخصصة" #: erpnext/accounts/report/sales_register/sales_register.py:201 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/supplier/supplier.js:225 +#: erpnext/buying/doctype/supplier/supplier.js:234 #: erpnext/controllers/trends.py:434 erpnext/crm/doctype/contract/contract.json #: erpnext/crm/doctype/lead/lead.js:32 #: erpnext/crm/doctype/opportunity/opportunity.js:99 @@ -14642,7 +14648,7 @@ msgstr "محددات مخصصة" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json #: erpnext/projects/doctype/project/project.json -#: erpnext/projects/doctype/timesheet/timesheet.js:223 +#: erpnext/projects/doctype/timesheet/timesheet.js:225 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:46 #: erpnext/public/js/sales_trends_filters.js:25 @@ -14690,7 +14696,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:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:493 #: 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 @@ -14710,7 +14716,6 @@ msgstr "محددات مخصصة" #: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Customer" msgstr "العميل" @@ -15115,7 +15120,7 @@ msgstr "العملاء المقدمة" msgid "Customer Provided Item Cost" msgstr "تكلفة السلعة المقدمة من العميل" -#: erpnext/setup/doctype/company/company.py:555 +#: erpnext/setup/doctype/company/company.py:557 msgid "Customer Service" msgstr "خدمة العملاء" @@ -15172,12 +15177,16 @@ msgstr "عميل أو بند" msgid "Customer required for 'Customerwise Discount'" msgstr "الزبون مطلوب للخصم المعني بالزبائن" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:885 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:891 #: erpnext/selling/doctype/sales_order/sales_order.py:392 #: erpnext/stock/doctype/delivery_note/delivery_note.py:393 msgid "Customer {0} does not belong to project {1}" msgstr "العميل {0} لا ينتمي الى المشروع {1}\\n
    \\nCustomer {0} does not belong to project {1}" +#: erpnext/selling/doctype/customer/customer.py:605 +msgid "Customer {0} has an overdue billing limit. Overdue amount {1} exceeds the allowed threshold {2}." +msgstr "" + #. Label of the customer_item_code (Data) field in DocType 'POS Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Sales Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Quotation Item' @@ -15286,7 +15295,7 @@ msgstr "د - هـ" msgid "DFS" msgstr "DFS" -#: erpnext/projects/doctype/project/project.py:751 +#: erpnext/projects/doctype/project/project.py:781 msgid "Daily Project Summary for {0}" msgstr "ملخص المشروع اليومي لـ {0}" @@ -15621,13 +15630,13 @@ msgstr "ستقوم مذكرة الخصم بتحديث المبلغ المستح #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:769 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:775 #: erpnext/controllers/accounts_controller.py:1214 msgid "Debit To" msgstr "الخصم ل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 msgid "Debit To is required" msgstr "مدين الى مطلوب" @@ -15703,7 +15712,7 @@ msgstr "دسيليتر عشر اللتر" msgid "Decimeter" msgstr "ديسيمتر" -#: erpnext/public/js/utils/sales_common.js:639 +#: erpnext/public/js/utils/sales_common.js:637 msgid "Declare Lost" msgstr "أعلن فقدت" @@ -15734,11 +15743,6 @@ msgstr "تم خصمها من" msgid "Deductee Details" msgstr "تفاصيل الخصم" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/taxes.json -msgid "Deduction Certificate" -msgstr "" - #. Label of the deductions_or_loss_section (Section Break) field in DocType #. 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -15781,14 +15785,14 @@ msgstr "الحساب الافتراضي المتقدم" #. Label of the default_advance_paid_account (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:388 +#: erpnext/setup/doctype/company/company.py:390 msgid "Default Advance Paid Account" msgstr "الحساب المدفوع مقدماً الافتراضي" #. Label of the default_advance_received_account (Link) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:377 +#: erpnext/setup/doctype/company/company.py:379 msgid "Default Advance Received Account" msgstr "الحساب الافتراضي للمقدم المستلم" @@ -15803,7 +15807,7 @@ msgstr "نطاق العمر الافتراضي" msgid "Default BOM" msgstr "الافتراضي BOM" -#: erpnext/stock/doctype/item/item.py:506 +#: erpnext/stock/doctype/item/item.py:511 msgid "Default BOM ({0}) must be active for this item or its template" msgstr "يجب أن تكون قائمة المواد الافتراضية ({0}) نشطة لهذا الصنف أو قوالبه" @@ -15874,6 +15878,11 @@ msgstr "الحساب الافتراضي لتكلفة البضائع المباع msgid "Default Costing Rate" msgstr "سعر التكلفة الافتراضي" +#. Label of the country (Link) field in DocType 'Global Defaults' +#: erpnext/setup/doctype/global_defaults/global_defaults.json +msgid "Default Country" +msgstr "" + #. Label of the default_currency (Link) field in DocType 'Company' #. Label of the default_currency (Link) field in DocType 'Global Defaults' #: erpnext/setup/doctype/company/company.json @@ -16126,15 +16135,15 @@ msgstr "الإقليم الافتراضي" msgid "Default Unit of Measure" msgstr "وحدة القياس الافتراضية" -#: erpnext/stock/doctype/item/item.py:1428 +#: erpnext/stock/doctype/item/item.py:1433 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "لا يمكن تغيير وحدة القياس الافتراضية للعنصر {0} مباشرةً لأنك أجريتَ بالفعل بعض المعاملات بوحدة قياس أخرى. عليك إما إلغاء المستندات المرتبطة أو إنشاء عنصر جديد." -#: erpnext/stock/doctype/item/item.py:1408 +#: erpnext/stock/doctype/item/item.py:1413 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "لا يمكن تغيير وحدة القياس الافتراضية للبند {0} مباشرة لأنك قمت بالفعل ببعض المعاملات (المعاملة) مع UOM أخرى. ستحتاج إلى إنشاء عنصر جديد لاستخدام واجهة مستخدم افتراضية مختلفة.\\n
    \\nDefault Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." -#: erpnext/stock/doctype/item/item.py:1012 +#: erpnext/stock/doctype/item/item.py:1017 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "وحدة القياس الافتراضية للمتغير '{0}' يجب أن تكون كما في النمودج '{1}'" @@ -16150,7 +16159,7 @@ msgstr "أسلوب التقييم الافتراضي" #. Label of the set_warehouse (Link) field in DocType 'Stock Reconciliation' #. Label of the default_warehouse (Link) field in DocType 'Stock Settings' #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/stock/doctype/item/item.js:961 +#: erpnext/stock/doctype/item/item.js:978 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -16188,8 +16197,8 @@ msgstr "الإعدادات الافتراضية لمعاملاتك المتعل msgid "Default tax templates for sales, purchase and items are created." msgstr "يتم إنشاء قوالب ضريبية افتراضية للمبيعات والمشتريات والسلع." -#: erpnext/stock/doctype/item/item.js:953 -#: erpnext/stock/doctype/item/item.js:965 +#: erpnext/stock/doctype/item/item.js:970 +#: erpnext/stock/doctype/item/item.js:982 msgid "Default warehouse from Item Defaults." msgstr "" @@ -16437,7 +16446,7 @@ msgstr "" #. Order' #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:20 -#: erpnext/controllers/website_list_for_contact.py:216 +#: erpnext/controllers/website_list_for_contact.py:218 #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -16654,7 +16663,7 @@ msgstr "إشعار التسليم - المنتج المعبأ" msgid "Delivery Note Trends" msgstr "توجهات إشعارات التسليم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 msgid "Delivery Note {0} is not submitted" msgstr "لم يتم اعتماد ملاحظه التسليم {0}\\n
    \\nDelivery Note {0} is not submitted" @@ -16874,7 +16883,7 @@ msgstr "إهلاك" #. Label of the depreciation_amount (Currency) field in DocType 'Depreciation #. Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:167 -#: erpnext/assets/doctype/asset/asset.js:384 +#: erpnext/assets/doctype/asset/asset.js:392 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Depreciation Amount" msgstr "قيمة الإهلاك" @@ -16957,7 +16966,7 @@ msgstr "خيارات الإهلاك" msgid "Depreciation Posting Date" msgstr "تاريخ ترحيل الإهلاك" -#: erpnext/assets/doctype/asset/asset.js:928 +#: erpnext/assets/doctype/asset/asset.js:936 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "لا يمكن أن يكون تاريخ ترحيل الإهلاك قبل تاريخ الإتاحة للاستخدام" @@ -17026,7 +17035,7 @@ msgstr "مصمم" #. Label of the order_lost_reason (Small Text) field in DocType 'Opportunity' #. Label of the order_lost_reason (Small Text) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:618 +#: erpnext/public/js/utils/sales_common.js:616 #: erpnext/selling/doctype/quotation/quotation.json msgid "Detailed Reason" msgstr "سبب مفصل" @@ -17389,8 +17398,8 @@ msgstr "يعطل الجلب التلقائي للكمية الموجودة" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/manufacturing/doctype/work_order/work_order.js:1081 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:392 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:435 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:391 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:434 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Disassemble" @@ -17623,7 +17632,7 @@ msgstr "لا يمكن أن يتجاوز الخصم 100%." msgid "Discount must be less than 100" msgstr "يجب أن يكون الخصم أقل من 100" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3098 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3096 msgid "Discount of {0} applied as per Payment Term" msgstr "" @@ -17695,7 +17704,7 @@ msgstr "سبب تقديري" msgid "Dislikes" msgstr "يكره" -#: erpnext/setup/doctype/company/company.py:549 +#: erpnext/setup/doctype/company/company.py:551 msgid "Dispatch" msgstr "ارسال" @@ -17935,7 +17944,7 @@ msgstr "" msgid "Do not import" msgstr "" -#. Description of the 'Hide Currency Symbol' (Select) field in DocType 'Global +#. Description of the 'Hide Currency Symbol' (Check) field in DocType 'Global #. Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Do not show any symbol like $ etc next to currencies." @@ -17959,7 +17968,7 @@ msgstr "لا تقم بتحديث المتغيرات عند الحفظ" msgid "Do not use Batch-wise Valuation" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:966 +#: erpnext/assets/doctype/asset/asset.js:974 msgid "Do you really want to restore this scrapped asset?" msgstr "هل تريد حقا استعادة هذه الأصول المخردة ؟" @@ -17967,7 +17976,7 @@ msgstr "هل تريد حقا استعادة هذه الأصول المخردة msgid "Do you still want to enable immutable ledger?" msgstr "هل ما زلت ترغب في تفعيل دفتر الأستاذ غير القابل للتغيير؟" -#: erpnext/stock/doctype/item/item.js:42 +#: erpnext/stock/doctype/item/item.js:44 msgid "Do you want to change valuation method?" msgstr "هل ترغب في تغيير طريقة التقييم؟" @@ -18227,15 +18236,13 @@ msgstr "لا يمكن أن يكون تاريخ الاستحقاق بعد {0}" msgid "Due Date cannot be before {0}" msgstr "لا يمكن أن يكون تاريخ الاستحقاق قبل {0}" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:167 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:175 msgid "Due to stock closing entry {0}, you cannot repost item valuation before {1}" msgstr "بسبب قيد إغلاق المخزون {0}، لا يمكنك إعادة نشر تقييم السلعة قبل {1}" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:158 -#: erpnext/workspace_sidebar/banking.json msgid "Dunning" msgstr "إنذار بالدفع" @@ -18267,6 +18274,14 @@ msgstr "رسالة تذكير" msgid "Dunning Letter Text" msgstr "طلب نص الرسالة" +#: erpnext/accounts/doctype/dunning/dunning.py:184 +msgid "Dunning Letter for Dunning Type {0} in language '{1}' not found." +msgstr "" + +#: erpnext/accounts/doctype/dunning/dunning.py:188 +msgid "Dunning Letter for Dunning Type {0} not found." +msgstr "" + #. Label of the dunning_level (Int) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Dunning Level" @@ -18275,10 +18290,8 @@ msgstr "مستوى الدانينج" #. Label of the dunning_type (Link) field in DocType 'Dunning' #. Name of a DocType #. Label of the dunning_type (Data) field in DocType 'Dunning Type' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/dunning_type/dunning_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Dunning Type" msgstr "نوع الطلب" @@ -18356,6 +18369,10 @@ msgstr "" msgid "Duplicate item group found in the item group table" msgstr "تم العثور علي مجموعه عناصر مكرره في جدول مجموعه الأصناف\\n
    \\nDuplicate item group found in the item group table" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:133 +msgid "Duplicate languages found on Dunning Letter Text. Keep only one of them." +msgstr "" + #: erpnext/projects/doctype/project/project.js:186 msgid "Duplicate project has been created" msgstr "تم إنشاء مشروع مكرر" @@ -18935,7 +18952,7 @@ msgstr "" msgid "Enable Accounting Dimensions" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1752 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1754 msgid "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock." msgstr "قم بتمكين خيار \"السماح بالحجز الجزئي\" في إعدادات المخزون لحجز جزء من المخزون." @@ -18951,7 +18968,7 @@ msgstr "تمكين جدولة موعد" msgid "Enable Auto Email" msgstr "تفعيل البريد الإلكتروني التلقائي" -#: erpnext/stock/doctype/item/item.py:1216 +#: erpnext/stock/doctype/item/item.py:1221 msgid "Enable Auto Re-Order" msgstr "تمكين إعادة الطلب التلقائي" @@ -19046,6 +19063,12 @@ msgstr "" msgid "Enable Opportunity Creation from Contact Us" msgstr "" +#. Label of the enable_overdue_billing_threshold (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Overdue Billing Threshold" +msgstr "" + #. Label of the enable_parallel_reposting (Check) field in DocType 'Stock #. Reposting Settings' #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -19289,7 +19312,7 @@ msgstr "" msgid "End Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:367 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:366 msgid "End Transit" msgstr "نهاية النقل" @@ -19403,7 +19426,7 @@ msgstr "أدخل اسمًا لقائمة العطلات هذه." msgid "Enter amount to be redeemed." msgstr "أدخل المبلغ المراد استرداده." -#: erpnext/stock/doctype/item/item.js:1560 +#: erpnext/stock/doctype/item/item.js:1577 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "أدخل رمز الصنف، وسيتم ملء الاسم تلقائيًا بنفس رمز الصنف عند النقر داخل حقل اسم الصنف." @@ -19415,7 +19438,7 @@ msgstr "أدخل البريد الإلكتروني الخاص بالعميل" msgid "Enter customer's phone number" msgstr "أدخل رقم هاتف العميل" -#: erpnext/assets/doctype/asset/asset.js:937 +#: erpnext/assets/doctype/asset/asset.js:945 msgid "Enter date to scrap asset" msgstr "أدخل التاريخ لإلغاء الأصل" @@ -19459,7 +19482,7 @@ msgstr "أدخل اسم المستفيد قبل الإرسال." msgid "Enter the name of the bank or lending institution before submitting." msgstr "أدخل اسم البنك أو المؤسسة المقرضة قبل الإرسال." -#: erpnext/stock/doctype/item/item.js:1586 +#: erpnext/stock/doctype/item/item.js:1603 msgid "Enter the opening stock units." msgstr "أدخل وحدات المخزون الافتتاحي." @@ -19570,7 +19593,7 @@ msgstr "حدث خطأ أثناء ترحيل قيود الإهلاك" msgid "Error while processing deferred accounting for {0}" msgstr "حدث خطأ أثناء معالجة المحاسبة المؤجلة لـ {0}" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:613 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:762 msgid "Error while reposting item valuation" msgstr "حدث خطأ أثناء إعادة نشر تقييم السلعة" @@ -19628,7 +19651,7 @@ msgstr "من المصنع" msgid "Example URL" msgstr "مثال على عنوان URL" -#: erpnext/stock/doctype/item/item.py:1128 +#: erpnext/stock/doctype/item/item.py:1133 msgid "Example of a linked document: {0}" msgstr "مثال على مستند مرتبط: {0}" @@ -19648,7 +19671,7 @@ msgstr "مثال: ABCD. #####. إذا تم ضبط المسلسل ولم يتم msgid "Example: If the transaction amount is 200, then this will be calculated as {} = {}" msgstr "" -#: erpnext/stock/stock_ledger.py:2446 +#: erpnext/stock/stock_ledger.py:2494 msgid "Example: Serial No {0} reserved in {1}." msgstr "مثال: الرقم التسلسلي {0} محجوز في {1}." @@ -19706,7 +19729,7 @@ msgstr "الربح أو الخسارة في الصرف" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:743 +#: erpnext/setup/doctype/company/company.py:745 msgid "Exchange Gain/Loss" msgstr "أرباح / خسائر الناتجة عن صرف العملة" @@ -19811,7 +19834,7 @@ msgstr "يجب أن يكون سعر الصرف نفس {0} {1} ({2})" msgid "Excise Entry" msgstr "الدخول المكوس" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1520 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1524 msgid "Excise Invoice" msgstr "المكوس الفاتورة" @@ -20025,7 +20048,7 @@ msgstr "" msgid "Expense" msgstr "نفقة" -#: erpnext/stock/services/base_stock_gl_composer.py:220 +#: erpnext/stock/services/base_stock_gl_composer.py:276 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "حساب نفقات / قروق ({0}) يجب ان يكون حساب ارباح و خسائر" @@ -20077,7 +20100,7 @@ msgstr "حساب نفقات / قروق ({0}) يجب ان يكون حساب ار msgid "Expense Account" msgstr "حساب النفقات" -#: erpnext/stock/services/base_stock_gl_composer.py:199 +#: erpnext/stock/services/base_stock_gl_composer.py:266 msgid "Expense Account Missing" msgstr "حساب المصاريف مفقود" @@ -20111,6 +20134,32 @@ msgstr "" msgid "Expenses" msgstr "النفقات" +#. Label of the expenses_added_to_stock_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_account (Link) field in DocType 'Item +#. Default' +#. Label of the vf_expenses_added_to_stock_account (Read Only) field in DocType +#. 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Account" +msgstr "" + +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Item Default' +#. Label of the vf_expenses_added_to_stock_contra_account (Read Only) field in +#. DocType 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Contra Account" +msgstr "" + +#: erpnext/stock/services/base_stock_gl_composer.py:217 +msgid "Expenses Added To Stock for Item {0}" +msgstr "" + #. Option for the 'Account Type' (Select) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:92 @@ -20128,7 +20177,7 @@ msgid "Expenses Included In Valuation" msgstr "المصروفات متضمنة في تقييم السعر" #: erpnext/stock/doctype/pick_list/pick_list.py:310 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:518 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:517 msgid "Expired Batches" msgstr "دفعات منتهية الصلاحية" @@ -20265,11 +20314,6 @@ msgstr "قائمة انتظار المخزون وفقًا لأسلوب FIFO (ا msgid "FIFO/LIFO Queue" msgstr "قائمة انتظار FIFO/LIFO" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "FX Revaluation" -msgstr "" - #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Fahrenheit" @@ -20318,7 +20362,7 @@ msgstr "فشل تحليل تنسيق MT940. الخطأ: {0}" msgid "Failed to personalize your setup" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:269 +#: erpnext/assets/doctype/asset/asset.js:277 msgid "Failed to post depreciation entries" msgstr "فشل في تسجيل قيود الإهلاك" @@ -20343,7 +20387,7 @@ msgstr "أخفق إعداد الشركة" msgid "Failed to setup defaults" msgstr "فشل في إعداد الإعدادات الافتراضية" -#: erpnext/setup/doctype/company/company.py:923 +#: erpnext/setup/doctype/company/company.py:925 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "فشل إعداد الإعدادات الافتراضية للبلد {0}. يرجى الاتصال بالدعم." @@ -20454,8 +20498,8 @@ msgstr "استخرج جدول الدوام من فاتورة المبيعات" msgid "Fetch Value From" msgstr "استرجاع القيمة من" -#: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:833 +#: erpnext/stock/doctype/material_request/material_request.js:373 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:832 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "جلب BOM انفجرت (بما في ذلك المجالس الفرعية)" @@ -20622,7 +20666,6 @@ msgstr "المنتج النهائي" #. Label of the finance_book (Link) field in DocType 'Asset Finance Book' #. Label of the finance_book (Link) field in DocType 'Asset Shift Allocation' #. Label of the finance_book (Link) field in DocType 'Asset Value Adjustment' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/finance_book/finance_book.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -20653,7 +20696,6 @@ msgstr "المنتج النهائي" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:48 #: erpnext/public/js/financial_statements.js:426 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "كتاب المالية" @@ -20850,7 +20892,7 @@ msgid "Finished Good {0} must be a sub-contracted item." msgstr "يجب أن يكون المنتج النهائي {0} عنصرًا تم التعاقد عليه من الباطن." #: erpnext/selling/doctype/sales_order/sales_order.js:1475 -#: erpnext/setup/doctype/company/company.py:454 +#: erpnext/setup/doctype/company/company.py:456 msgid "Finished Goods" msgstr "السلع تامة الصنع" @@ -20891,7 +20933,7 @@ msgstr "مستودع البضائع الجاهزة" msgid "Finished Goods based Operating Cost" msgstr "تكلفة التشغيل بناءً على المنتجات النهائية" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:887 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:900 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "المنتج النهائي {0} لا يتطابق مع أمر العمل {1}" @@ -20965,7 +21007,6 @@ msgstr "النظام المالي إلزامي ، يرجى تعيين النظا #. Certificate' #. Label of the fiscal_year (Link) field in DocType 'Target Detail' #. Label of the fiscal_year (Data) field in DocType 'Stock Ledger Entry' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json @@ -20986,7 +21027,6 @@ msgstr "النظام المالي إلزامي ، يرجى تعيين النظا #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js:15 #: erpnext/setup/doctype/target_detail/target_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Fiscal Year" msgstr "السنة المالية" @@ -21048,7 +21088,7 @@ msgstr "حساب الأصول الثابتة" msgid "Fixed Asset Defaults" msgstr "حالات التخلف عن سداد الأصول الثابتة" -#: erpnext/stock/doctype/item/item.py:374 +#: erpnext/stock/doctype/item/item.py:379 msgid "Fixed Asset Item must be a non-stock item." msgstr "يجب أن يكون بند الأصول الثابتة عنصرا غير مخزون.
    \\nFixed Asset Item must be a non-stock item." @@ -21173,7 +21213,7 @@ msgstr "قدم/ثانية" msgid "For" msgstr "لأجل" -#: erpnext/public/js/utils/sales_common.js:395 +#: erpnext/public/js/utils/sales_common.js:393 msgid "For 'Product Bundle' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Product Bundle' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table." msgstr "لبنود حزمة المنتج والمستودع والرقم المتسلسل ورقم الدفعة ستأخذ بعين الاعتبار من جدول قائمة التغليف. اذا كان للمستودع ورقم الدفعة نفس البند من بنود التغليف لأي بند من حزمة المنتج. هذه القيم يمكن ادخالها في جدول البند الرئيسي. والقيم سيتم نسخها الى جدول قائمة التغليف." @@ -21269,11 +21309,11 @@ msgstr "للمورد" #. Label of the warehouse (Link) field in DocType 'Material Request Plan Item' #. Label of the for_warehouse (Link) field in DocType 'Production Plan' #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:499 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:497 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:180 #: erpnext/selling/doctype/sales_order/sales_order.js:1488 -#: erpnext/stock/doctype/material_request/material_request.js:361 +#: erpnext/stock/doctype/material_request/material_request.js:362 #: erpnext/templates/form_grid/material_request_grid.html:36 msgid "For Warehouse" msgstr "لمستودع" @@ -21401,7 +21441,7 @@ msgctxt "Clear payment terms template and/or payment schedule when due date is c msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "لكي يسري مفعول {0} الجديد، هل ترغب في مسح {1}الحالي؟" -#: erpnext/stock/services/serial_batch_bundle_service.py:272 +#: erpnext/stock/services/serial_batch_bundle_service.py:274 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "بالنسبة لـ {0}، لا يوجد مخزون متاح للإرجاع في المستودع {1}." @@ -21618,7 +21658,7 @@ msgstr "تاريخ البدء وتاريخ الانتهاء إلزامي" msgid "From Date and To Date are required" msgstr "تاريخ البدء وتاريخ الانتهاء مطلوبان" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:30 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:40 msgid "From Date and To Date lie in different Fiscal Year" msgstr "من التاريخ والوقت تكمن في السنة المالية المختلفة" @@ -21641,9 +21681,9 @@ msgstr "تاريخ البدء إلزامي" #: erpnext/accounts/report/general_ledger/general_ledger.py:86 #: erpnext/accounts/report/pos_register/pos_register.py:124 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:32 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:25 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:34 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:38 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:35 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:39 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:49 msgid "From Date must be before To Date" msgstr "يجب أن تكون من تاريخ إلى تاريخ قبل" @@ -22100,7 +22140,7 @@ msgstr "الربح/الخسارة من إعادة التقييم" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:138 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:225 -#: erpnext/setup/doctype/company/company.py:751 +#: erpnext/setup/doctype/company/company.py:753 msgid "Gain/Loss on Asset Disposal" msgstr "الربح / الخسارة عند التخلص من الأصول" @@ -22167,7 +22207,10 @@ msgstr "" msgid "General Ledger requires {0} to be synced to DuckDB" msgstr "" +#. Label of the general_settings_section (Section Break) field in DocType +#. 'Global Defaults' #. Label of the gs (Section Break) field in DocType 'Item Group' +#: erpnext/setup/doctype/global_defaults/global_defaults.json #: erpnext/setup/doctype/item_group/item_group.json msgid "General Settings" msgstr "الإعدادات العامة" @@ -22279,7 +22322,7 @@ msgstr "استعد توازنك" msgid "Get Current Stock" msgstr "الحصول على المخزون الحالي" -#: erpnext/selling/doctype/customer/customer.js:190 +#: erpnext/selling/doctype/customer/customer.js:199 msgid "Get Customer Group Details" msgstr "احصل على تفاصيل مجموعة العملاء" @@ -22343,15 +22386,15 @@ msgstr "الحصول على مواقع البند" #: erpnext/selling/doctype/sales_order/sales_order.js:1254 #: erpnext/stock/doctype/delivery_note/delivery_note.js:187 #: erpnext/stock/doctype/delivery_note/delivery_note.js:239 -#: erpnext/stock/doctype/material_request/material_request.js:141 -#: erpnext/stock/doctype/material_request/material_request.js:238 +#: erpnext/stock/doctype/material_request/material_request.js:144 +#: erpnext/stock/doctype/material_request/material_request.js:241 #: 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:461 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:508 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:541 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:632 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:800 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:460 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:507 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:540 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:631 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:799 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "الحصول على البنود من" @@ -22366,9 +22409,9 @@ msgstr "الحصول على العناصر للشراء / التحويل" msgid "Get Items for Purchase Only" msgstr "احصل على المنتجات للشراء فقط" -#: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:836 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:849 +#: erpnext/stock/doctype/material_request/material_request.js:347 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:835 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:848 msgid "Get Items from BOM" msgstr "تنزيل الاصناف من BOM" @@ -22452,7 +22495,7 @@ msgstr "" msgid "Get Started Sections" msgstr "تبدأ الأقسام" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:581 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:579 msgid "Get Stock" msgstr "احصل على الأسهم" @@ -22462,7 +22505,7 @@ msgstr "احصل على الأسهم" msgid "Get Sub Assembly Items" msgstr "الحصول على عناصر التجميع الفرعية" -#: erpnext/buying/doctype/supplier/supplier.js:151 +#: erpnext/buying/doctype/supplier/supplier.js:160 msgid "Get Supplier Group Details" msgstr "احصل على تفاصيل مجموعة الموردين" @@ -22554,7 +22597,7 @@ msgstr "الأهداف" msgid "Goods" msgstr "البضائع" -#: erpnext/setup/doctype/company/company.py:455 +#: erpnext/setup/doctype/company/company.py:457 #: erpnext/stock/doctype/stock_entry/stock_entry_list.js:34 msgid "Goods In Transit" msgstr "البضائع في العبور" @@ -22563,7 +22606,7 @@ msgstr "البضائع في العبور" msgid "Goods Transferred" msgstr "نقل البضائع" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1335 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1348 msgid "Goods are already received against the outward entry {0}" msgstr "تم استلام البضائع بالفعل مقابل الإدخال الخارجي {0}" @@ -23195,7 +23238,7 @@ msgstr "يساعدك ذلك على توزيع الميزانية/الهدف عل msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "فيما يلي سجلات الأخطاء الخاصة بإدخالات الإهلاك الفاشلة المذكورة أعلاه: {0}" -#: erpnext/stock/stock_ledger.py:2142 +#: erpnext/stock/stock_ledger.py:2190 msgid "Here are the options to proceed:" msgstr "فيما يلي الخيارات المتاحة للمتابعة:" @@ -23223,7 +23266,7 @@ msgstr "هنا، يتم ملء أيام إجازاتك الأسبوعية مسب msgid "Hertz" msgstr "هيرتز" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:615 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:764 msgid "Hi," msgstr "أهلاً،" @@ -23238,8 +23281,7 @@ msgstr "خط مخفي (للاستخدام الداخلي فقط)" msgid "Hidden list maintaining the list of contacts linked to Shareholder" msgstr "قائمة مخفية الحفاظ على قائمة من الاتصالات المرتبطة المساهم" -#. Label of the hide_currency_symbol (Select) field in DocType 'Global -#. Defaults' +#. Label of the hide_currency_symbol (Check) field in DocType 'Global Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Hide Currency Symbol" msgstr "إخفاء رمز العملة" @@ -23427,7 +23469,7 @@ msgstr "كيفية تنسيق وعرض القيم في التقرير المال msgid "Hrs" msgstr "ساعات" -#: erpnext/setup/doctype/company/company.py:561 +#: erpnext/setup/doctype/company/company.py:563 msgid "Human Resources" msgstr "الموارد البشرية" @@ -23601,6 +23643,23 @@ msgstr "في حال تم تحديده، سيتم اعتبار مبلغ الضر msgid "If checked, the tax amount will be considered as already included in the Print Rate / Print Amount" msgstr "إذا كانت محددة، سيتم النظر في مقدار ضريبة كمدرجة بالفعل في قيم الطباعة / مقدار الطباعة" +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Customer' +#: erpnext/selling/doctype/customer/customer.json +msgid "If checked, this Customer is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "If checked, this Item is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Supplier' +#: erpnext/buying/doctype/supplier/supplier.json +msgid "If checked, this Supplier is only available for transactions in the companies listed below." +msgstr "" + #. Description of the 'Delivered by Supplier (Drop Ship)' (Check) field in #. DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -23860,7 +23919,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:2152 +#: erpnext/stock/stock_ledger.py:2200 msgid "If not, you can Cancel / Submit this entry" msgstr "وإلا يمكنك إلغاء / إرسال هذا الإدخال" @@ -23906,7 +23965,7 @@ msgstr "إذا نتج عن قائمة المواد مواد خردة، فيجب msgid "If the account is frozen, entries are allowed to restricted users." msgstr "إذا الحساب مجمد، يسمح بالدخول إلى المستخدمين المحددين." -#: erpnext/stock/stock_ledger.py:2145 +#: erpnext/stock/stock_ledger.py:2193 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 "إذا كان العنصر يتعامل كعنصر سعر تقييم صفري في هذا الإدخال ، فالرجاء تمكين "السماح بمعدل تقييم صفري" في جدول العناصر {0}." @@ -23993,7 +24052,7 @@ msgstr "إذا كانت مدة صلاحية نقاط الولاء غير محد msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "إذا كانت الإجابة بنعم، فسيتم استخدام هذا المستودع لتخزين المواد المرفوضة" -#: erpnext/stock/doctype/item/item.js:1572 +#: erpnext/stock/doctype/item/item.js:1589 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 "إذا كنت تحتفظ بمخزون من هذا الصنف في مخزونك، فسيقوم نظام ERPNext بإجراء قيد في دفتر الأستاذ للمخزون لكل معاملة لهذا الصنف." @@ -24007,7 +24066,7 @@ msgstr "إذا كنت ترغب في مطابقة معاملات محددة مع msgid "If you still want to proceed, please disable {0} checkbox." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:469 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:475 msgid "If you still want to proceed, please enable {0}." msgstr "إذا كنت لا تزال ترغب في المتابعة، يرجى تفعيل {0}." @@ -24174,7 +24233,7 @@ msgstr "تجاهل تداخل وقت محطة العمل" msgid "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports" msgstr "يتجاهل هذا النظام حقل \"هل الرصيد الافتتاحي\" القديم في إدخال دفتر الأستاذ العام، والذي يسمح بإضافة الرصيد الافتتاحي بعد استخدام النظام أثناء إنشاء التقارير." -#: erpnext/stock/doctype/item/item.py:269 +#: erpnext/stock/doctype/item/item.py:274 msgid "Image in the description has been removed. To disable this behavior, uncheck \"{0}\" in {1}." msgstr "" @@ -24339,7 +24398,7 @@ msgid "In Production" 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/batch_wise_balance_history/batch_wise_balance_history.py:87 #: erpnext/stock/report/stock_balance/stock_balance.py:547 #: erpnext/stock/report/stock_ledger/stock_ledger.py:317 msgid "In Qty" @@ -24363,11 +24422,11 @@ msgstr "في الأوراق المالية" msgid "In Transit" msgstr "في مرحلة انتقالية" -#: erpnext/stock/doctype/material_request/material_request.js:477 +#: erpnext/stock/doctype/material_request/material_request.js:478 msgid "In Transit Transfer" msgstr "النقل أثناء العبور" -#: erpnext/stock/doctype/material_request/material_request.js:446 +#: erpnext/stock/doctype/material_request/material_request.js:447 msgid "In Transit Warehouse" msgstr "مستودع النقل" @@ -24474,7 +24533,7 @@ msgstr "في حالة البرنامج متعدد المستويات، سيتم msgid "In this case, the amount will be calculated as 25% of the transaction amount. If the transaction amount is 200, then this will be calculated as 200 * 0.25 = 50." msgstr "" -#: erpnext/stock/doctype/item/item.js:1605 +#: erpnext/stock/doctype/item/item.js:1622 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "في هذا القسم، يمكنك تحديد الإعدادات الافتراضية المتعلقة بالمعاملات على مستوى الشركة لهذا العنصر. على سبيل المثال: المستودع الافتراضي، وقائمة الأسعار الافتراضية، والمورد الافتراضي، وما إلى ذلك." @@ -24743,6 +24802,10 @@ msgstr "الإيرادات" msgid "Income Account" msgstr "حساب الدخل" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:86 +msgid "Income Account Validation Error" +msgstr "" + #. Label of the income_and_expense_account (Section Break) field in DocType #. 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -24754,7 +24817,9 @@ msgstr "" msgid "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront." msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Bills" msgstr "الفواتير الواردة" @@ -24769,7 +24834,9 @@ msgstr "جدول استقبال المكالمات الواردة" msgid "Incoming Call Settings" msgstr "إعدادات المكالمات الواردة" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Payment" msgstr "دفعة واردة" @@ -24816,7 +24883,7 @@ msgstr "كمية الرصيد غير صحيحة بعد العملية" msgid "Incorrect Batch Consumed" msgstr "تم استهلاك دفعة غير صحيحة" -#: erpnext/stock/doctype/item/item.py:604 +#: erpnext/stock/doctype/item/item.py:609 msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "تسجيل دخول غير صحيح (مجموعة) إلى مستودع إعادة الطلب" @@ -25104,7 +25171,7 @@ msgstr "ملاحظة التثبيت" msgid "Installation Note Item" msgstr "ملاحظة تثبيت الإغلاق" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:635 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:640 msgid "Installation Note {0} has already been submitted" msgstr "مذكرة التسليم {0} ارسلت\\n
    \\nInstallation Note {0} has already been submitted" @@ -25154,13 +25221,13 @@ msgstr "أذونات غير كافية" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:466 #: erpnext/stock/doctype/pick_list/pick_list.py:148 #: erpnext/stock/doctype/pick_list/pick_list.py:166 -#: erpnext/stock/doctype/pick_list/pick_list.py:1130 -#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1827 -#: erpnext/stock/stock_ledger.py:2334 +#: erpnext/stock/doctype/pick_list/pick_list.py:1139 +#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1875 +#: erpnext/stock/stock_ledger.py:2382 msgid "Insufficient Stock" msgstr "المالية غير كافية" -#: erpnext/stock/stock_ledger.py:2349 +#: erpnext/stock/stock_ledger.py:2397 msgid "Insufficient Stock for Batch" msgstr "المخزون غير كافٍ للدفعة" @@ -25290,7 +25357,7 @@ msgstr "مصروفات الفائدة" msgid "Interest Income" msgstr "دخل الفوائد" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2729 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2727 msgid "Interest and/or dunning fee" msgstr "الفائدة و/أو رسوم المطالبة" @@ -25315,7 +25382,7 @@ msgstr "داخلي" msgid "Internal Customer Accounting" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:259 +#: erpnext/selling/doctype/customer/customer.py:271 msgid "Internal Customer for company {0} already exists" msgstr "يوجد بالفعل عميل داخلي للشركة {0}" @@ -25341,7 +25408,7 @@ msgstr "رقم مرجع المبيعات الداخلي مفقود" msgid "Internal Supplier Details" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:181 +#: erpnext/buying/doctype/supplier/supplier.py:190 msgid "Internal Supplier for company {0} already exists" msgstr "يوجد بالفعل مورد داخلي لشركة {0}" @@ -25402,8 +25469,8 @@ msgstr "يجب أن تكون الفترة الزمنية بين 1 و 59 دقيق #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:381 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:770 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:780 #: erpnext/accounts/services/taxes.py:271 #: erpnext/accounts/services/taxes.py:279 #: erpnext/assets/doctype/asset_category/asset_category.py:69 @@ -25428,7 +25495,7 @@ msgstr "مبلغ غير صالح" msgid "Invalid Attribute" msgstr "خاصية غير صالحة" -#: erpnext/stock/doctype/item/item.js:1199 +#: erpnext/stock/doctype/item/item.js:1216 msgid "Invalid Attribute Values" msgstr "" @@ -25465,7 +25532,7 @@ msgstr "" msgid "Invalid Company for Inter Company Transaction." msgstr "شركة غير صالحة للمعاملات بين الشركات." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:972 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:978 msgid "Invalid Configuration" msgstr "" @@ -25475,7 +25542,7 @@ msgstr "" msgid "Invalid Cost Center" msgstr "مركز تكلفة غير صالح" -#: erpnext/selling/doctype/customer/customer.py:372 +#: erpnext/selling/doctype/customer/customer.py:386 msgid "Invalid Customer Group" msgstr "" @@ -25530,7 +25597,7 @@ msgstr "تجميع غير صالح" msgid "Invalid Item" msgstr "عنصر غير صالح" -#: erpnext/stock/doctype/item/item.py:1566 +#: erpnext/stock/doctype/item/item.py:1571 msgid "Invalid Item Defaults" msgstr "القيم الافتراضية للعناصر غير صالحة" @@ -25616,7 +25683,7 @@ msgstr "جدول غير صالح" msgid "Invalid Selling Price" msgstr "سعر البيع غير صالح" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:975 msgid "Invalid Serial and Batch Bundle" msgstr "رقم تسلسلي وحزمة دفعات غير صالحة" @@ -25669,7 +25736,7 @@ msgstr "صيغة التصفية غير صالحة. يرجى التحقق من ب msgid "Invalid lost reason {0}, please create a new lost reason" msgstr "سبب ضائع غير صالح {0} ، يرجى إنشاء سبب ضائع جديد" -#: erpnext/stock/doctype/item/item.py:478 +#: erpnext/stock/doctype/item/item.py:483 msgid "Invalid naming series (. missing) for {0}" msgstr "سلسلة تسمية غير صالحة (. مفقود) لـ {0}" @@ -25697,7 +25764,7 @@ msgstr "استعلام بحث غير صالح" msgid "Invalid status group: {0}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 msgid "Invalid subcontract order field: {0}" msgstr "" @@ -25964,7 +26031,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:1198 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 #: erpnext/accounts/report/accounts_payable/accounts_payable.js:270 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:64 @@ -26003,11 +26070,6 @@ msgstr "ميزات إصدار الفواتير" msgid "Inward" msgstr "نحو الداخل" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Inward Order" -msgstr "" - #. Label of the is_account_payable (Check) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json @@ -26580,7 +26642,7 @@ msgstr "إصدار إشعار الائتمان" msgid "Issue Date" msgstr "تاريخ القضية" -#: erpnext/stock/doctype/material_request/material_request.js:180 +#: erpnext/stock/doctype/material_request/material_request.js:183 msgid "Issue Material" msgstr "قضية المواد" @@ -26654,7 +26716,7 @@ msgstr "قضايا" msgid "Issuing Date" msgstr "تاريخ الإصدار" -#: erpnext/stock/doctype/item/item.py:649 +#: erpnext/stock/doctype/item/item.py:654 msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "قد يستغرق الأمر بضع ساعات حتى تظهر قيم المخزون الدقيقة بعد دمج العناصر." @@ -26766,7 +26828,7 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/stock/report/available_serial_no/available_serial_no.py:93 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.js:24 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:32 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:76 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 #: erpnext/stock/report/item_price_stock/item_price_stock.js:8 #: erpnext/stock/report/item_prices/item_prices.py:50 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:88 @@ -26801,8 +26863,6 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Item" msgstr "السلعة" @@ -27032,7 +27092,7 @@ msgstr "سلة التسوق" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.js:27 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:128 -#: erpnext/projects/doctype/timesheet/timesheet.js:214 +#: erpnext/projects/doctype/timesheet/timesheet.js:216 #: erpnext/public/js/controllers/transaction.js:2951 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:608 @@ -27287,7 +27347,7 @@ msgstr "بيانات الصنف" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/page/stock_balance/stock_balance.js:35 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:43 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:54 #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:48 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:48 #: erpnext/stock/report/item_prices/item_prices.py:52 @@ -27321,11 +27381,11 @@ msgstr "افتراضيات مجموعة العناصر" msgid "Item Group Name" msgstr "اسم مجموعة السلعة" -#: erpnext/setup/doctype/item_group/item_group.js:119 +#: erpnext/setup/doctype/item_group/item_group.js:136 msgid "Item Group Override" msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:82 +#: erpnext/setup/doctype/item_group/item_group.js:99 msgid "Item Group Tree" msgstr "شجرة فئات البنود" @@ -27554,7 +27614,7 @@ msgstr "مادة المصنع" #: erpnext/stock/report/available_batch_report/available_batch_report.py:32 #: erpnext/stock/report/available_serial_no/available_serial_no.py:99 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:33 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:77 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:153 #: erpnext/stock/report/item_price_stock/item_price_stock.py:24 #: erpnext/stock/report/item_prices/item_prices.py:51 @@ -27628,8 +27688,8 @@ msgstr "إعدادات سعر المنتج" msgid "Item Price Stock" msgstr "سعر صنف المخزون" -#: erpnext/stock/get_item_details.py:1182 -#: erpnext/stock/get_item_details.py:1206 +#: erpnext/stock/get_item_details.py:1181 +#: erpnext/stock/get_item_details.py:1205 msgid "Item Price added for {0} in Price List - {1}" msgstr "" @@ -27637,11 +27697,11 @@ msgstr "" msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "يظهر سعر الصنف عدة مرات بناءً على قائمة الأسعار، والمورد/العميل، والعملة، والصنف، والدفعة، ووحدة القياس، والكمية، والتواريخ." -#: erpnext/stock/doctype/item/item.py:183 +#: erpnext/stock/doctype/item/item.py:187 msgid "Item Price created at rate {0}" msgstr "" -#: erpnext/stock/get_item_details.py:1165 +#: erpnext/stock/get_item_details.py:1164 msgid "Item Price updated for {0} in Price List {1}" msgstr "سعر الصنف محدث ل{0} في قائمة الأسعار {1}" @@ -27784,7 +27844,6 @@ msgstr "صف ضريبة البند {0}: يجب أن ينتمي الحساب إل #. Label of the item_tax_template (Link) field in DocType 'Item Tax' #. Label of the item_tax_template (Link) field in DocType 'Purchase Receipt #. Item' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/item_tax_template/item_tax_template.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -27797,7 +27856,6 @@ msgstr "صف ضريبة البند {0}: يجب أن ينتمي الحساب إل #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/workspace_sidebar/taxes.json msgid "Item Tax Template" msgstr "قالب الضريبة البند" @@ -27834,7 +27892,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:239 +#: erpnext/stock/doctype/item/item.js:250 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -27842,11 +27900,11 @@ msgstr "الصنف تفاصيل متغير" msgid "Item Variant Settings" msgstr "إعدادات متنوع السلعة" -#: erpnext/stock/doctype/item/item.js:1421 +#: erpnext/stock/doctype/item/item.js:1438 msgid "Item Variant {0} already exists with same attributes" msgstr "متغير الصنف {0} موجود بالفعل مع نفس الخصائص" -#: erpnext/stock/doctype/item/item.py:840 +#: erpnext/stock/doctype/item/item.py:845 msgid "Item Variants updated" msgstr "تم تحديث متغيرات العنصر" @@ -27954,7 +28012,7 @@ msgstr "البند والضمان تفاصيل" msgid "Item for row {0} does not match Material Request" msgstr "عنصر الصف {0} لا يتطابق مع طلب المواد" -#: erpnext/stock/doctype/item/item.py:899 +#: erpnext/stock/doctype/item/item.py:904 msgid "Item has variants." msgstr "البند لديه متغيرات." @@ -27980,10 +28038,14 @@ msgstr "اسم السلعة" msgid "Item operation" msgstr "عملية الصنف" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:622 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:635 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "تم تحديث سعر السلعة إلى الصفر حيث تم تحديد خيار \"السماح بسعر تقييم صفري\" للسلعة {0}" +#: erpnext/stock/doctype/material_request/material_request.py:231 +msgid "Item rates have been updated based on the selected Buying Price List {0}" +msgstr "" + #. Label of the item (Link) field in DocType 'BOM' #. Label of the finished_good (Link) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/bom/bom.json @@ -27999,7 +28061,7 @@ msgstr "يتم إعادة حساب معدل تقييم السلعة مع الأ msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "جارٍ إعادة نشر تقييم الأصناف. قد يُظهر التقرير تقييمًا غير صحيح للأصناف." -#: erpnext/stock/doctype/item/item.py:1056 +#: erpnext/stock/doctype/item/item.py:1061 msgid "Item variant {0} exists with same attributes" msgstr "متغير العنصر {0} موجود بنفس السمات\\n
    \\nItem variant {0} exists with same attributes" @@ -28024,7 +28086,7 @@ msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" msgstr "" #: erpnext/assets/doctype/asset/asset.py:347 -#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:700 msgid "Item {0} does not exist" msgstr "العنصر {0} غير موجود\\n
    \\nItem {0} does not exist" @@ -28033,7 +28095,7 @@ msgid "Item {0} does not exist in the system or has expired" msgstr "الصنف{0} غير موجود في النظام أو انتهت صلاحيته" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1489 -#: erpnext/stock/services/serial_batch_bundle_service.py:388 +#: erpnext/stock/services/serial_batch_bundle_service.py:390 msgid "Item {0} does not exist." msgstr "العنصر {0} غير موجود\\n
    \\nItem {0} does not exist." @@ -28057,15 +28119,15 @@ msgstr "العنصر {0} ليس له رقم تسلسلي. يتم تسليم ال msgid "Item {0} has no changes in delivered quantity. Please unselect the row if you do not wish to update its quantity." msgstr "" -#: erpnext/stock/doctype/item/item.py:1278 +#: erpnext/stock/doctype/item/item.py:1283 msgid "Item {0} has reached its end of life on {1}" msgstr "الصنف{0} قد وصل إلى نهاية عمره في {1}" -#: erpnext/stock/stock_ledger.py:164 +#: erpnext/stock/stock_ledger.py:168 msgid "Item {0} ignored since it is not a stock item" msgstr "تم تجاهل الصنف {0} لأنه ليس بند مخزون" -#: erpnext/stock/get_item_details.py:357 +#: erpnext/stock/get_item_details.py:356 msgid "Item {0} is a template, please select one of its variants" msgstr "" @@ -28073,11 +28135,11 @@ msgstr "" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "تم حجز/تسليم المنتج {0} بالفعل بموجب أمر البيع {1}." -#: erpnext/stock/doctype/item/item.py:1298 +#: erpnext/stock/doctype/item/item.py:1303 msgid "Item {0} is cancelled" msgstr "تم إلغاء العنصر {0}\\n
    \\nItem {0} is cancelled" -#: erpnext/stock/doctype/item/item.py:1282 +#: erpnext/stock/doctype/item/item.py:1287 msgid "Item {0} is disabled" msgstr "تم تعطيل البند {0}" @@ -28089,7 +28151,7 @@ msgstr "" msgid "Item {0} is not a serialized Item" msgstr "البند {0} ليس بند لديه رقم تسلسلي" -#: erpnext/stock/doctype/item/item.py:1290 +#: erpnext/stock/doctype/item/item.py:1295 msgid "Item {0} is not a stock Item" msgstr "العنصر {0} ليس عنصر مخزون\\n
    \\nItem {0} is not a stock Item" @@ -28097,11 +28159,11 @@ msgstr "العنصر {0} ليس عنصر مخزون\\n
    \\nItem {0} is not a s msgid "Item {0} is not a subcontracted item" msgstr "العنصر {0} ليس عنصرًا متعاقدًا عليه من الباطن" -#: erpnext/stock/doctype/item/item.py:857 +#: erpnext/stock/doctype/item/item.py:862 msgid "Item {0} is not a template item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1258 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1271 msgid "Item {0} is not active or end of life has been reached" msgstr "البند {0} غير نشط أو تم التوصل إلى نهاية الحياة" @@ -28109,7 +28171,7 @@ msgstr "البند {0} غير نشط أو تم التوصل إلى نهاية ا msgid "Item {0} must be a Fixed Asset Item" msgstr "البند {0} يجب أن يكون بند أصول ثابتة" -#: erpnext/stock/get_item_details.py:363 +#: erpnext/stock/get_item_details.py:362 msgid "Item {0} must be a Non-Stock Item" msgstr "يجب أن يكون العنصر {0} عنصرًا غير متوفر في المخزون" @@ -28125,11 +28187,11 @@ msgstr "العنصر {0} غير موجود في جدول \"المواد الخا msgid "Item {0} not found." msgstr "العنصر {0} غير موجود." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:315 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:316 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "البند {0} الكمية المطلوبة {1} لا يمكن أن تكون أقل من الحد الأدنى للطلب {2} (المحددة في البند)." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:602 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:600 msgid "Item {0}: {1} qty produced. " msgstr "العنصر {0}: {1} الكمية المنتجة." @@ -28175,7 +28237,7 @@ msgstr "سجل حركة مبيعات وفقاً للصنف" msgid "Item-wise sales Register" msgstr "" -#: erpnext/stock/get_item_details.py:767 +#: erpnext/stock/get_item_details.py:766 msgid "Item/Item Code required to get Item Tax Template." msgstr "يلزم وجود رمز الصنف/الصنف للحصول على نموذج ضريبة الصنف." @@ -28208,11 +28270,6 @@ msgstr "تصفية الاصناف" msgid "Items Required" msgstr "العناصر المطلوبة" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Items To Be Received" -msgstr "" - #. Label of a Link in the Buying Workspace #. Name of a report #. Label of a Workspace Sidebar Item @@ -28243,7 +28300,7 @@ msgstr "عناصر لطلب المواد الخام" msgid "Items not found." msgstr "لم يتم العثور على العناصر." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:618 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:631 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "تم تحديث سعر الأصناف إلى الصفر حيث تم تحديد خيار \"السماح بسعر تقييم صفري\" للأصناف التالية: {0}" @@ -28544,8 +28601,8 @@ msgstr "إدخالات قيد اليومية {0} غير مترابطة" #: 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:390 -#: erpnext/assets/doctype/asset/asset.js:399 +#: erpnext/assets/doctype/asset/asset.js:398 +#: erpnext/assets/doctype/asset/asset.js:407 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -28562,10 +28619,8 @@ msgstr "حساب إدخال القيود اليومية" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Journal Entry Template" msgstr "قالب إدخال دفتر اليومية" @@ -28842,7 +28897,7 @@ msgstr "تاريخ الانتهاء الأخير" msgid "Last Fiscal Year" msgstr "" -#: erpnext/accounts/doctype/account/account.py:673 +#: erpnext/accounts/doctype/account/account.py:680 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." msgstr "" @@ -29096,7 +29151,7 @@ msgstr "" msgid "Leave Encashed?" msgstr "إجازات مصروفة نقداً؟" -#: erpnext/stock/doctype/item/item.js:980 +#: erpnext/stock/doctype/item/item.js:997 msgid "Leave as 0 to allow zero valuation rate." msgstr "" @@ -29174,11 +29229,11 @@ msgstr "الطفل الأيسر" msgid "Left Index" msgstr "الفهرس الأيسر" -#: erpnext/stock/doctype/item/item.js:402 +#: erpnext/stock/doctype/item/item.js:413 msgid "Left column shows inherited defaults (Item Group → Company / Stock Settings). Right column is where you set overrides for this item only." msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:136 +#: erpnext/setup/doctype/item_group/item_group.js:153 msgid "Left column shows system-level defaults (Company / Stock Settings). Right column is where you set overrides for this item group." msgstr "" @@ -29325,11 +29380,11 @@ msgstr "رابط لطلب المواد" msgid "Link to Material Requests" msgstr "رابط لطلبات المواد" -#: erpnext/buying/doctype/supplier/supplier.js:164 +#: erpnext/buying/doctype/supplier/supplier.js:173 msgid "Link with Customer" msgstr "التواصل مع العميل" -#: erpnext/selling/doctype/customer/customer.js:203 +#: erpnext/selling/doctype/customer/customer.js:212 msgid "Link with Supplier" msgstr "تواصل مع المورد" @@ -29350,20 +29405,20 @@ msgstr "الفواتير المرتبطة" msgid "Linked Location" msgstr "الموقع المرتبط" -#: erpnext/stock/doctype/item/item.py:1132 +#: erpnext/stock/doctype/item/item.py:1137 msgid "Linked with submitted documents" msgstr "مرتبط بالوثائق المقدمة" -#: erpnext/buying/doctype/supplier/supplier.js:251 -#: erpnext/selling/doctype/customer/customer.js:283 +#: erpnext/buying/doctype/supplier/supplier.js:260 +#: erpnext/selling/doctype/customer/customer.js:292 msgid "Linking Failed" msgstr "فشل الربط" -#: erpnext/buying/doctype/supplier/supplier.js:250 +#: erpnext/buying/doctype/supplier/supplier.js:259 msgid "Linking to Customer Failed. Please try again." msgstr "فشل الاتصال بالعميل. يرجى المحاولة مرة أخرى." -#: erpnext/selling/doctype/customer/customer.js:282 +#: erpnext/selling/doctype/customer/customer.js:291 msgid "Linking to Supplier failed. Please try again." msgstr "" @@ -29539,7 +29594,7 @@ msgstr "تفاصيل السبب المفقود" #. 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/report/lost_opportunity/lost_opportunity.py:54 -#: erpnext/public/js/utils/sales_common.js:602 +#: erpnext/public/js/utils/sales_common.js:600 #: erpnext/selling/doctype/quotation/quotation.json msgid "Lost Reasons" msgstr "أسباب ضائعة" @@ -29726,10 +29781,10 @@ msgstr "عطل الآلة" msgid "Machine operator errors" msgstr "أخطاء مشغل الآلة" -#: erpnext/setup/doctype/company/company.py:789 -#: erpnext/setup/doctype/company/company.py:804 -#: erpnext/setup/doctype/company/company.py:805 +#: erpnext/setup/doctype/company/company.py:791 #: erpnext/setup/doctype/company/company.py:806 +#: erpnext/setup/doctype/company/company.py:807 +#: erpnext/setup/doctype/company/company.py:808 msgid "Main" msgstr "رئيسي" @@ -30053,11 +30108,11 @@ msgstr "إجراء مكالمة" msgid "Make project from a template." msgstr "جعل المشروع من قالب." -#: erpnext/stock/doctype/item/item.js:1216 +#: erpnext/stock/doctype/item/item.js:1233 msgid "Make {0} Variant" msgstr "إنشاء نسخة {0}" -#: erpnext/stock/doctype/item/item.js:1217 +#: erpnext/stock/doctype/item/item.js:1234 msgid "Make {0} Variants" msgstr "إنشاء متغيرات {0}" @@ -30080,7 +30135,7 @@ msgstr "" msgid "Manage your orders" msgstr "إدارة طلباتك" -#: erpnext/setup/doctype/company/company.py:567 +#: erpnext/setup/doctype/company/company.py:569 msgid "Management" msgstr "الإدارة" @@ -30195,8 +30250,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:721 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:738 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:734 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:751 #: 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 @@ -30417,7 +30472,7 @@ msgstr "مستخدم التصنيع" msgid "Manufacturing Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:67 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:72 msgid "Manufacturing Variance for {0}" msgstr "" @@ -30535,7 +30590,7 @@ msgstr "" msgid "Market Segment" msgstr "سوق القطاع" -#: erpnext/setup/doctype/company/company.py:519 +#: erpnext/setup/doctype/company/company.py:521 msgid "Marketing" msgstr "التسويق" @@ -30626,12 +30681,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:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:735 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "اهلاك المواد للتصنيع" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:688 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:687 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "لم يتم تعيين اهلاك المواد في إعدادات التصنيع." @@ -30661,7 +30716,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:77 -#: erpnext/stock/doctype/material_request/material_request.js:188 +#: erpnext/stock/doctype/material_request/material_request.js:191 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Receipt" @@ -30720,13 +30775,13 @@ msgstr "أستلام مواد" #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:37 #: 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:437 -#: erpnext/stock/doctype/material_request/material_request.py:454 +#: erpnext/stock/doctype/material_request/material_request.py:476 +#: erpnext/stock/doctype/material_request/material_request.py:493 #: 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:309 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:465 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:308 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:464 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:135 #: erpnext/stock/workspace/stock/stock.json @@ -30814,7 +30869,7 @@ msgstr "" msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "لم يتم إنشاء طلب المواد ، ككمية للمواد الخام المتاحة بالفعل." -#: erpnext/stock/doctype/material_request/material_request.py:149 +#: erpnext/stock/doctype/material_request/material_request.py:150 msgid "Material Request of maximum {0} can be made for Item {1} against Sales Order {2}" msgstr "المادة يمكن طلب الحد الأقصى {0} للبند {1} من أمر المبيعات {2}\\n
    \\nMaterial Request of maximum {0} can be made for Item {1} against Sales Order {2}" @@ -30882,7 +30937,7 @@ msgstr "المواد المُعادة من العمل قيد التنفيذ" #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/setup/setup_wizard/operations/install_fixtures.py:83 #: erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/material_request/material_request.js:166 +#: erpnext/stock/doctype/material_request/material_request.js:169 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -30890,7 +30945,7 @@ msgstr "المواد المُعادة من العمل قيد التنفيذ" msgid "Material Transfer" msgstr "نقل المواد" -#: erpnext/stock/doctype/material_request/material_request.js:172 +#: erpnext/stock/doctype/material_request/material_request.js:175 msgid "Material Transfer (In Transit)" msgstr "نقل المواد (أثناء النقل)" @@ -30947,11 +31002,6 @@ msgstr "" msgid "Materials Ready" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Materials To Be Transferred" -msgstr "" - #: erpnext/controllers/subcontracting_controller.py:1554 msgid "Materials are already received against the {0} {1}" msgstr "تم استلام المواد بالفعل مقابل {0} {1}" @@ -31032,7 +31082,7 @@ msgstr "الحد الأقصى للخصم المسموح به لهذا المنت #: erpnext/manufacturing/doctype/work_order/work_order.js:1072 #: erpnext/manufacturing/doctype/work_order/work_order.js:1095 #: erpnext/stock/doctype/pick_list/pick_list.js:208 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:404 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:403 msgid "Max: {0}" msgstr "الحد الأقصى: {0}" @@ -31093,7 +31143,7 @@ msgstr "" msgid "Maximum discount for Item {0} is {1}%" msgstr "الحد الأقصى للخصم على المنتج {0} هو {1}%" -#: erpnext/public/js/utils/barcode_scanner.js:120 +#: erpnext/public/js/utils/barcode_scanner.js:125 msgid "Maximum quantity scanned for item {0}." msgstr "تم مسح الحد الأقصى للكمية للعنصر {0}." @@ -31131,7 +31181,7 @@ msgstr "ميغا جول" msgid "Megawatt" msgstr "ميغاواط" -#: erpnext/stock/stock_ledger.py:2158 +#: erpnext/stock/stock_ledger.py:2206 msgid "Mention Valuation Rate in the Item master." msgstr "اذكر معدل التقييم في مدير السلعة." @@ -31414,7 +31464,7 @@ msgstr "الكمية الادنى لايمكن ان تكون اكبر من ال msgid "Min Qty should be greater than Recurse Over Qty" msgstr "يجب أن تكون الكمية الدنيا أكبر من الكمية المطلوبة للتكرار." -#: erpnext/stock/doctype/item/item.js:1372 +#: erpnext/stock/doctype/item/item.js:1389 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "القيمة الدنيا: {0}، القيمة القصوى: {1}، بزيادات قدرها: {2}" @@ -31508,7 +31558,7 @@ msgstr "" msgid "Miscellaneous Expenses" msgstr "نفقات متنوعة" -#: erpnext/controllers/buying_controller.py:729 +#: erpnext/controllers/buying_controller.py:737 msgid "Mismatch" msgstr "عدم تطابق" @@ -31554,7 +31604,7 @@ msgstr "فلاتر مفقودة" msgid "Missing Finance Book" msgstr "كتاب التمويل المفقود" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:897 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "Missing Finished Good" msgstr "مفقود، تم الانتهاء منه، جيد" @@ -31570,7 +31620,7 @@ msgstr "العنصر المفقود" msgid "Missing Parameter" msgstr "" -#: erpnext/utilities/__init__.py:57 +#: erpnext/utilities/__init__.py:84 msgid "Missing Payments App" msgstr "تطبيق المدفوعات المفقودة" @@ -31578,7 +31628,7 @@ msgstr "تطبيق المدفوعات المفقودة" msgid "Missing Required Filter" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:297 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:300 msgid "Missing Serial No Bundle" msgstr "حزمة الأرقام التسلسلية مفقودة" @@ -31639,7 +31689,6 @@ msgstr "طريقة الدفع" #. Label of the mode_of_payment (Link) field in DocType 'Purchase Invoice' #. Label of the mode_of_payment (Link) field in DocType 'Sales Invoice Payment' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:234 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:433 #: erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json @@ -31666,7 +31715,6 @@ msgstr "طريقة الدفع" #: erpnext/accounts/report/sales_register/sales_register.js:40 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/selling/page/point_of_sale/pos_controller.js:33 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Mode of Payment" msgstr "طريقة الدفع" @@ -31852,7 +31900,7 @@ msgstr "" msgid "Multiple Accounts (Journal Template)" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:443 +#: erpnext/selling/doctype/customer/customer.py:460 msgid "Multiple Loyalty Programs found for Customer {0}. Please select manually." msgstr "" @@ -31870,7 +31918,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "برنامج متعدد الطبقات" -#: erpnext/stock/doctype/item/item.js:263 +#: erpnext/stock/doctype/item/item.js:274 msgid "Multiple Variants" msgstr "متغيرات متعددة" @@ -31882,7 +31930,7 @@ msgstr "" msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year" msgstr "يوجد سنوات مالية متعددة لنفس التاريخ {0}. الرجاء تحديد الشركة لهذه السنة المالية\\n
    \\nMultiple fiscal years exist for the date {0}. Please set company in Fiscal Year" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:904 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:917 msgid "Multiple items cannot be marked as finished item" msgstr "لا يمكن وضع علامة \"منتج نهائي\" على عدة عناصر" @@ -32359,10 +32407,6 @@ msgstr "اسم الحساب الجديد" msgid "New Asset Value" msgstr "قيمة الأصول الجديدة" -#: erpnext/assets/dashboard_fixtures.py:169 -msgid "New Assets (This Year)" -msgstr "الأصول الجديدة (هذا العام)" - #. Label of the new_bom (Link) field in DocType 'BOM Update Log' #. Label of the new_bom (Link) field in DocType 'BOM Update Tool' #: erpnext/manufacturing/doctype/bom/bom_tree.js:62 @@ -32481,6 +32525,12 @@ msgstr "" msgid "New Sales Invoice" msgstr "فاتورة مبيعات جديدة" +#. Description of the 'Overdue Billing Threshold' (Currency) field in DocType +#. 'Customer Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "New Sales Invoices are blocked when the customer's overdue amount exceeds this. Requires 'Enable Overdue Billing Threshold' in Accounts Settings." +msgstr "" + #. Label of the sales_order (Check) field in DocType 'Email Digest' #: erpnext/setup/doctype/email_digest/email_digest.json msgid "New Sales Orders" @@ -32513,7 +32563,7 @@ msgstr "اسم المخزن الجديد" msgid "New Workplace" msgstr "مكان العمل الجديد" -#: erpnext/selling/doctype/customer/customer.py:408 +#: erpnext/selling/doctype/customer/customer.py:425 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}" msgstr "" @@ -32600,7 +32650,7 @@ msgstr "لا رد فعل" msgid "No Answer" msgstr "لا يوجد رد" -#: erpnext/stock/doctype/item/item.js:924 +#: erpnext/stock/doctype/item/item.js:941 msgid "No Company Found" msgstr "" @@ -32608,7 +32658,7 @@ msgstr "" msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "لم يتم العثور على زبون للمعاملات بين الشركات التي تمثل الشركة {0}" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:436 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:435 msgid "No Customers found with selected options." msgstr "لم يتم العثور على عملاء بالخيارات المحددة." @@ -32624,11 +32674,11 @@ msgstr "" msgid "No Impact on Accounting Ledger" msgstr "لا يوجد تأثير على دفتر الأستاذ المحاسبي" -#: erpnext/stock/get_item_details.py:338 +#: erpnext/stock/get_item_details.py:337 msgid "No Item with Barcode {0}" msgstr "أي عنصر مع الباركود {0}" -#: erpnext/stock/get_item_details.py:342 +#: erpnext/stock/get_item_details.py:341 msgid "No Item with Serial No {0}" msgstr "أي عنصر مع المسلسل لا {0}" @@ -32667,7 +32717,7 @@ msgstr "لم يتم العثور على ملف تعريف نقطة البيع. #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1124 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1200 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1221 -#: erpnext/stock/doctype/item/item.py:1525 +#: erpnext/stock/doctype/item/item.py:1530 msgid "No Permission" msgstr "لا يوجد تصريح" @@ -32675,7 +32725,7 @@ msgstr "لا يوجد تصريح" msgid "No Purchase Invoices selected" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:102 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:116 msgid "No Purchase Orders were created" msgstr "لم يتم إنشاء أي أوامر شراء" @@ -32691,7 +32741,7 @@ msgstr "لا يوجد اختيار" msgid "No Serial / Batches are available for return" msgstr "لا تتوفر أرقام تسلسلية/دفعات للإرجاع" -#: erpnext/stock/stock_ledger.py:928 +#: erpnext/stock/stock_ledger.py:976 msgid "No Standard Valuation Rate found for Item {0} in Company {1} as on {2}. Please create an Item Standard Cost record." msgstr "" @@ -32731,7 +32781,7 @@ msgstr "لم يتم العثور على أي فواتير أو مدفوعات غ msgid "No Unreconciled Payments found for this party" msgstr "لم يتم العثور على أي مدفوعات غير مطابقة لهذا الطرف" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:100 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:114 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:250 msgid "No Work Orders were created" msgstr "لم يتم إنشاء أي أوامر عمل" @@ -32740,7 +32790,7 @@ msgstr "لم يتم إنشاء أي أوامر عمل" msgid "No account set" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:356 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:365 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:211 msgid "No accounting entries for the following warehouses" msgstr "لا القيود المحاسبية للمستودعات التالية" @@ -32769,7 +32819,7 @@ msgstr "" msgid "No additional fields available" msgstr "لا توجد حقول إضافية متاحة" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1390 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1391 msgid "No available quantity to reserve for item {0} in warehouse {1}" msgstr "لا توجد كمية متاحة للحجز للصنف {0} في المستودع {1}" @@ -32785,7 +32835,7 @@ msgstr "" msgid "No bank transactions found" msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:502 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:501 msgid "No billing email found for customer: {0}" msgstr "لم يتم العثور على بريد إلكتروني للفواتير خاص بالعميل: {0}" @@ -32809,7 +32859,7 @@ msgstr "لا بيانات لهذه الفترة" msgid "No data found. Seems like you uploaded a blank file" msgstr "لم يتم العثور على بيانات. يبدو أنك قمت بتحميل ملف فارغ." -#: erpnext/stock/doctype/item/item.js:954 +#: erpnext/stock/doctype/item/item.js:971 msgid "No default warehouse set for this company. Entry will use Stock Settings default." msgstr "" @@ -32995,7 +33045,7 @@ msgstr "" msgid "No pending Material Requests found to link for the given items." msgstr "لم يتم العثور على طلبات المواد المعلقة للربط للعناصر المحددة." -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:509 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:508 msgid "No primary email found for customer: {0}" msgstr "لم يتم العثور على بريد إلكتروني أساسي للعميل: {0}" @@ -33100,7 +33150,7 @@ msgstr "لا توجد قيم" msgid "No vouchers found for this transaction" msgstr "" -#: erpnext/stock/doctype/item/item.py:1782 +#: erpnext/stock/doctype/item/item.py:1787 msgid "No warehouse found for company {0}. Please set a Default Warehouse in Item Defaults or Stock Settings." msgstr "" @@ -33322,7 +33372,7 @@ msgstr "ملاحظة : لن يتم إنشاء تدوين المدفوعات نظ msgid "Note: This Cost Center is a Group. Cannot make accounting entries against groups." msgstr "ملاحظة: مركز التكلفة هذا هو مجموعة. لا يمكن إجراء القيود المحاسبية مقابل المجموعات." -#: erpnext/stock/doctype/item/item.py:686 +#: erpnext/stock/doctype/item/item.py:691 msgid "Note: To merge the items, create a separate Stock Reconciliation for the old item {0}" msgstr "ملاحظة: لدمج الأصناف، أنشئ مطابقة مخزون منفصلة للصنف القديم {0}" @@ -33677,10 +33727,16 @@ msgstr "على المسار الصحيح" msgid "On enabling this cancellation entries will be posted on the actual cancellation date and reports will consider cancelled entries as well" msgstr "عند تفعيل هذه الخاصية، سيتم نشر إدخالات الإلغاء في تاريخ الإلغاء الفعلي، وستأخذ التقارير في الاعتبار الإدخالات الملغاة أيضاً." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:756 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:754 msgid "On expanding a row in the Items to Manufacture table, you'll see an option to 'Include Exploded Items'. Ticking this includes raw materials of the sub-assembly items in the production process." msgstr "عند توسيع صف في جدول \"العناصر المراد تصنيعها\"، ستجد خيار \"تضمين العناصر المفككة\". يؤدي تحديد هذا الخيار إلى تضمين المواد الخام لعناصر التجميع الفرعية في عملية الإنتاج." +#. Option for the 'Status' (Select) field in DocType 'Project' +#: erpnext/projects/doctype/project/project.json +#: erpnext/projects/doctype/project/project_list.js:8 +msgid "On hold" +msgstr "" + #. Description of the 'Excluded Fee' (Currency) field in DocType 'Bank #. Transaction' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json @@ -33821,7 +33877,7 @@ msgstr "" msgid "Only one version of a Product Bundle can be active at a time for a given Parent Item. Activating a version deactivates the previously active one." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:737 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:750 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "لا يمكن إنشاء سوى إدخال واحد {0} مقابل أمر العمل {1}" @@ -33993,9 +34049,7 @@ msgid "Opening" msgstr "افتتاحي" #. Group in POS Profile's connections -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Opening & Closing" msgstr "الافتتاح والإغلاق" @@ -34102,11 +34156,6 @@ msgstr "أداة إنشاء فاتورة بند افتتاحية" msgid "Opening Invoice Item" msgstr "فتح الفاتورة البند" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Opening Invoice Tool" -msgstr "" - #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:849 #: erpnext/accounts/doctype/sales_invoice/services/gl_composer.py:644 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." @@ -34133,7 +34182,7 @@ msgstr "عدد الإهلاكات المسجلة في بداية الفترة" msgid "Opening Purchase Invoice(s) have been created." msgstr "" -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 #: erpnext/stock/report/stock_balance/stock_balance.py:533 msgid "Opening Qty" msgstr "الكمية الافتتاحية" @@ -34144,31 +34193,31 @@ msgstr "" #. Label of the opening_stock (Float) field in DocType 'Item' #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' -#: erpnext/stock/doctype/item/item.js:969 erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/item/item.py:353 -#: erpnext/stock/doctype/item/item.py:1682 +#: erpnext/stock/doctype/item/item.js:986 erpnext/stock/doctype/item/item.json +#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:1687 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Opening Stock" msgstr "مخزون أول المدة" -#: erpnext/stock/doctype/item/item.py:1636 +#: erpnext/stock/doctype/item/item.py:1641 msgid "Opening Stock can only be set for stock items." msgstr "" -#: erpnext/stock/doctype/item/item.py:1643 +#: erpnext/stock/doctype/item/item.py:1648 msgid "Opening Stock cannot be created as stock transactions already exist for item {0}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1639 +#: erpnext/stock/doctype/item/item.py:1644 msgid "Opening Stock for serialised or batch items must be set via the Stock Reconciliation form." msgstr "" -#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:363 msgid "Opening Stock reconciliation created with zero valuation rate: {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:366 -#: erpnext/stock/doctype/item/item.py:1685 +#: erpnext/stock/doctype/item/item.py:371 +#: erpnext/stock/doctype/item/item.py:1690 msgid "Opening Stock reconciliation created: {0}" msgstr "" @@ -34190,7 +34239,7 @@ msgstr "افتتاح واختتام" msgid "Opening and Closing balance is not supported for dimension grouped cash flow statement" msgstr "" -#: erpnext/stock/doctype/item/item.py:199 +#: erpnext/stock/doctype/item/item.py:203 msgid "Opening stock creation has been queued and will be created in the background. Please check the Stock Reconciliation after some time." msgstr "" @@ -34344,7 +34393,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:334 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/public/js/shop_floor/shop_floor.js:387 -#: erpnext/setup/doctype/company/company.py:537 +#: erpnext/setup/doctype/company/company.py:539 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -34689,14 +34738,10 @@ msgstr "أوامر" #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' #. Label of a Desktop Icon -#. Name of a Workspace -#. 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/setup/workspace/organization/organization.json -#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "منظمة" @@ -34796,7 +34841,7 @@ msgid "Ounce/Gallon (US)" 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/batch_wise_balance_history/batch_wise_balance_history.py:88 #: erpnext/stock/report/stock_balance/stock_balance.py:555 #: erpnext/stock/report/stock_ledger/stock_ledger.py:324 msgid "Out Qty" @@ -34820,7 +34865,7 @@ msgstr "من AMC" msgid "Out of Order" msgstr "خارج عن السيطرة" -#: erpnext/stock/doctype/pick_list/pick_list.py:663 +#: erpnext/stock/doctype/pick_list/pick_list.py:672 msgid "Out of Stock" msgstr "إنتهى من المخزن" @@ -34841,12 +34886,16 @@ msgstr "إنتهى من المخزن" msgid "Outdated POS Opening Entry" msgstr "إدخال بيانات فتح نقاط البيع القديمة" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Bills" msgstr "الفواتير الصادرة" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Payment" msgstr "الدفعة الصادرة" @@ -34936,11 +34985,6 @@ msgstr "غير المسددة ل {0} لا يمكن أن يكون أقل من ا msgid "Outward" msgstr "نحو الخارج" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Outward Order" -msgstr "" - #. Label of the over_billing_allowance (Currency) field in DocType 'Accounts #. Settings' #. Label of the over_billing_allowance (Float) field in DocType 'Item' @@ -35023,6 +35067,16 @@ msgstr "تم تجاهل الفوترة الزائدة لـ {0} {1} للعنصر msgid "Overdue" msgstr "تأخير" +#: erpnext/selling/doctype/customer/customer.py:612 +msgid "Overdue Billing Limit Crossed" +msgstr "" + +#. Label of the overdue_billing_threshold (Currency) field in DocType 'Customer +#. Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "Overdue Billing Threshold" +msgstr "" + #. Label of the overdue_days (Data) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Overdue Days" @@ -35726,7 +35780,7 @@ msgstr "الطرود" msgid "Parent Account" msgstr "حساب اب" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:385 msgid "Parent Account Missing" msgstr "حساب الوالدين مفقود" @@ -35740,7 +35794,7 @@ msgstr "دفعة الأم" msgid "Parent Company" msgstr "الشركة الام" -#: erpnext/setup/doctype/company/company.py:672 +#: erpnext/setup/doctype/company/company.py:674 msgid "Parent Company must be a group company" msgstr "يجب أن تكون الشركة الأم شركة مجموعة" @@ -35871,7 +35925,7 @@ msgstr "تم نقل جزء من المواد" msgid "Partial Payment in POS Transactions are not allowed." msgstr "لا يُسمح بالدفع الجزئي في معاملات نقاط البيع." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1755 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1757 msgid "Partial Stock Reservation" msgstr "حجز جزئي للأسهم" @@ -36698,7 +36752,7 @@ msgstr "بوابة الدفع" msgid "Payment Gateway Account" msgstr "دفع حساب البوابة" -#: erpnext/accounts/utils.py:1528 +#: erpnext/accounts/utils.py:1522 msgid "Payment Gateway Account not created, please create one manually." msgstr "حساب بوابة الدفع لم يتم انشاءه، يرجى إنشاء واحد يدويا." @@ -36972,7 +37026,6 @@ msgstr "" #. Label of the payment_term (Link) field in DocType 'Payment Terms Template #. Detail' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -36984,7 +37037,6 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/controllers/transaction.js:559 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:32 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" msgstr "مصطلح الدفع" @@ -37292,7 +37344,7 @@ msgstr "أمر عمل معلق" msgid "Pending activities for today" msgstr "الأنشطة في انتظار لهذا اليوم" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:277 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:285 msgid "Pending processing" msgstr "في انتظار المعالجة" @@ -37438,11 +37490,9 @@ msgstr "قيد إقفال الفترة الحالية" #. Balance' #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Period Closing Voucher" msgstr "قيد إغلاق الفترة" @@ -37664,7 +37714,7 @@ msgstr "رقم الهاتف" #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sales_order/sales_order.js:1066 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 -#: erpnext/stock/doctype/material_request/material_request.js:156 +#: erpnext/stock/doctype/material_request/material_request.js:159 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -37843,10 +37893,8 @@ msgstr "سر منقوشة" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json -#: erpnext/workspace_sidebar/banking.json msgid "Plaid Settings" msgstr "إعدادات منقوشة" @@ -38001,7 +38049,7 @@ msgstr "أرضيات المصانع" msgid "Plants and Machineries" msgstr "وحدات التصنيع والآلات" -#: erpnext/stock/doctype/pick_list/pick_list.py:660 +#: erpnext/stock/doctype/pick_list/pick_list.py:669 msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List." msgstr "يرجى إعادة تخزين العناصر وتحديث قائمة الاختيار للمتابعة. للتوقف ، قم بإلغاء قائمة الاختيار." @@ -38027,7 +38075,7 @@ msgstr "يرجى تعيين مجموعة الموردين في إعدادات ا msgid "Please Specify Account" msgstr "يرجى تحديد الحساب" -#: erpnext/buying/doctype/supplier/supplier.py:129 +#: erpnext/buying/doctype/supplier/supplier.py:137 msgid "Please add 'Supplier' role to user {0}." msgstr "يرجى إضافة دور \"المورد\" إلى المستخدم {0}." @@ -38043,7 +38091,7 @@ msgstr "يرجى إضافة العمليات أولاً." msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "يرجى إضافة \"طلب عرض أسعار\" إلى الشريط الجانبي في إعدادات البوابة." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:421 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:422 msgid "Please add Root Account for - {0}" msgstr "يرجى إضافة حساب الجذر لـ - {0}" @@ -38059,7 +38107,7 @@ msgstr "" msgid "Please add at least one Serial No / Batch No" msgstr "" -#: erpnext/stock/doctype/item/item.js:925 +#: erpnext/stock/doctype/item/item.js:942 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." msgstr "" @@ -38076,7 +38124,7 @@ msgstr "يرجى إضافة عمود الحساب المصرفي" msgid "Please add the account to root level Company - {0}" msgstr "يرجى إضافة الحساب إلى مستوى الشركة الرئيسي - {0}" -#: erpnext/controllers/website_list_for_contact.py:305 +#: erpnext/controllers/website_list_for_contact.py:307 msgid "Please add {1} role to user {0}." msgstr "يرجى إضافة الدور {1} إلى المستخدم {0}." @@ -38088,7 +38136,7 @@ msgstr "يرجى تعديل الكمية أو تحرير {0} للمتابعة." msgid "Please attach CSV file" msgstr "يرجى إرفاق ملف CSV" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1257 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1263 msgid "Please cancel and amend the Payment Entry" msgstr "يرجى إلغاء وتعديل إدخال الدفع" @@ -38122,7 +38170,7 @@ msgstr "يرجى التحقق إما من قسم العمليات أو من قس msgid "Please check the 'Activate Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:621 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:770 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "يرجى مراجعة رسالة الخطأ واتخاذ الإجراءات اللازمة لإصلاح الخطأ ثم إعادة تشغيل عملية إعادة النشر مرة أخرى." @@ -38163,11 +38211,11 @@ msgstr "" msgid "Please contact any of the following users for this transaction." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:534 +#: erpnext/selling/doctype/customer/customer.py:551 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" msgstr "يرجى الاتصال بأي من المستخدمين التاليين لتمديد حدود الائتمان لـ {0}: {1}" -#: erpnext/selling/doctype/customer/customer.py:527 +#: erpnext/selling/doctype/customer/customer.py:544 msgid "Please contact your administrator to extend the credit limits for {0}." msgstr "يرجى الاتصال بمسؤول النظام لتمديد حدود الائتمان لـ {0}." @@ -38195,7 +38243,7 @@ msgstr "يرجى إنشاء عملية شراء من مستند البيع أو msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "الرجاء إنشاء إيصال شراء أو فاتورة شراء للعنصر {0}" -#: erpnext/stock/doctype/item/item.py:716 +#: erpnext/stock/doctype/item/item.py:721 msgid "Please delete Product Bundle {0}, before merging {1} into {2}" msgstr "يرجى حذف حزمة المنتج {0}قبل دمج {1} في {2}" @@ -38243,11 +38291,11 @@ msgstr "يرجى التأكد من أن الحساب {0} هو حساب في ال msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "يرجى التأكد من أن الحساب {0} {1} هو حساب قابل للدفع. يمكنك تغيير نوع الحساب إلى قابل للدفع أو اختيار حساب آخر." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 msgid "Please ensure {0} account is a Balance Sheet account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 msgid "Please ensure {0} account {1} is a Receivable account." msgstr "" @@ -38256,7 +38304,7 @@ msgid "Please enter Difference Account or set default Stock Adjustment msgstr "الرجاء إدخال حساب الفرق أو تعيين حساب تسوية المخزون الافتراضي للشركة {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:559 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:962 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 msgid "Please enter Account for Change Amount" msgstr "الرجاء إدخال الحساب لمبلغ التغيير\\n
    \\nPlease enter Account for Change Amount" @@ -38268,7 +38316,7 @@ msgstr "الرجاء إدخال صلاحية المخول بالتصديق أو msgid "Please enter Batch No" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:19 +#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:26 msgid "Please enter Cost Center" msgstr "يرجى إدخال مركز التكلفة\\n
    \\nPlease enter Cost Center" @@ -38285,7 +38333,7 @@ msgid "Please enter Expense Account" msgstr "الرجاء إدخال حساب النفقات\\n
    \\nPlease enter Expense Account" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:99 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:98 msgid "Please enter Item Code to get Batch Number" msgstr "الرجاء إدخال رمز العنصر للحصول على رقم الدفعة\\n
    \\nPlease enter Item Code to get Batch Number" @@ -38321,7 +38369,7 @@ msgstr "الرجاء إدخال مستند الاستلام\\n
    \\nPlease ente msgid "Please enter Reference date" msgstr "الرجاء إدخال تاريخ المرجع\\n
    \\nPlease enter Reference date" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:400 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:401 msgid "Please enter Root Type for account- {0}" msgstr "الرجاء إدخال نوع الجذر للحساب - {0}" @@ -38342,7 +38390,7 @@ msgid "Please enter Warehouse and Date" msgstr "الرجاء إدخال المستودع والتاريخ" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:501 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:958 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:964 msgid "Please enter Write Off Account" msgstr "الرجاء إدخال حساب الشطب" @@ -38386,7 +38434,7 @@ msgstr "يرجى إدخال رقم الهاتف المحمول أولاً." msgid "Please enter parent cost center" msgstr "الرجاء إدخال مركز تكلفة الأب" -#: erpnext/public/js/utils/barcode_scanner.js:186 +#: erpnext/public/js/utils/barcode_scanner.js:191 msgid "Please enter quantity for item {0}" msgstr "الرجاء إدخال الكمية للعنصر {0}" @@ -38410,7 +38458,7 @@ msgstr "يرجى إدخال تاريخ التسليم الأول" msgid "Please enter the phone number first" msgstr "الرجاء إدخال رقم الهاتف أولاً" -#: erpnext/controllers/buying_controller.py:1193 +#: erpnext/controllers/buying_controller.py:1201 msgid "Please enter the {schedule_date}." msgstr "الرجاء إدخال {schedule_date}." @@ -38462,7 +38510,7 @@ msgstr "" msgid "Please make sure the employees above report to another Active employee." msgstr "يرجى التأكد من أن الموظفين أعلاه يقدمون تقارير إلى موظف نشط آخر." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:379 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:380 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "" @@ -38470,7 +38518,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for {0}. Your master data will remain as it is. This action cannot be undone." msgstr "" -#: erpnext/stock/doctype/item/item.js:1036 +#: erpnext/stock/doctype/item/item.js:1053 msgid "Please mention 'Weight UOM' along with Weight." msgstr "يرجى ذكر \"وحدة قياس الوزن\" مع كلمة \"الوزن\"." @@ -38483,7 +38531,7 @@ msgstr "يرجى ذكر الرمز '{0}' في الشركة: {1}" msgid "Please mention no of visits required" msgstr "يرجى ذكر عدد الزيارات المطلوبة\\n
    \\nPlease mention no of visits required" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:73 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:74 msgid "Please mention the Current and New BOM for replacement." msgstr "يرجى ذكر قائمة المواد الحالية والجديدة للاستبدال." @@ -38571,7 +38619,7 @@ msgstr "يرجى تحديد تاريخ الانتهاء لاستكمال سجل msgid "Please select Customer first" msgstr "يرجى اختيار العميل أولا" -#: erpnext/setup/doctype/company/company.py:603 +#: erpnext/setup/doctype/company/company.py:605 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "الرجاء اختيار الشركة الحالية لإنشاء دليل الحسابات" @@ -38580,8 +38628,8 @@ msgstr "الرجاء اختيار الشركة الحالية لإنشاء دل msgid "Please select Finished Good Item for Service Item {0}" msgstr "يرجى تحديد \"المنتج النهائي\" لعنصر الخدمة {0}" -#: erpnext/assets/doctype/asset/asset.js:763 -#: erpnext/assets/doctype/asset/asset.js:778 +#: erpnext/assets/doctype/asset/asset.js:771 +#: erpnext/assets/doctype/asset/asset.js:786 msgid "Please select Item Code first" msgstr "يرجى اختيار رمز البند أولاً" @@ -38621,7 +38669,7 @@ msgstr "الرجاء اختيار قائمة الأسعار\\n
    \\nPlease sele msgid "Please select Qty against item {0}" msgstr "الرجاء اختيار الكمية ضد العنصر {0}" -#: erpnext/stock/doctype/item/item.py:390 +#: erpnext/stock/doctype/item/item.py:395 msgid "Please select Sample Retention Warehouse in Stock Settings first" msgstr "يرجى تحديد نموذج الاحتفاظ مستودع في إعدادات المخزون أولا" @@ -38637,7 +38685,7 @@ msgstr "الرجاء تحديد تاريخ البدء وتاريخ الانته msgid "Please select Stock Asset Account" msgstr "الرجاء تحديد حساب أصول الأسهم" -#: erpnext/setup/doctype/company/company.py:230 +#: erpnext/setup/doctype/company/company.py:232 msgid "Please select Stock Delivered But Not Billed Account" msgstr "" @@ -38651,7 +38699,7 @@ msgstr "يرجى تحديد بوم" #: erpnext/accounts/party.py:447 #: erpnext/selling/page/sales_funnel/sales_funnel.py:19 -#: erpnext/stock/doctype/pick_list/pick_list.py:1400 +#: erpnext/stock/doctype/pick_list/pick_list.py:1409 msgid "Please select a Company" msgstr "الرجاء اختيار الشركة" @@ -38758,7 +38806,7 @@ msgstr "" msgid "Please select a value for {0} quotation_to {1}" msgstr "يرجى اختيار قيمة ل {0} عرض مسعر إلى {1}" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:194 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:203 msgid "Please select an item code before setting the warehouse." msgstr "يرجى تحديد رمز المنتج قبل تحديد المستودع." @@ -38848,7 +38896,7 @@ msgstr "يرجى تحديد الشركة" msgid "Please select the Multiple Tier Program type for more than one collection rule." msgstr "" -#: erpnext/stock/doctype/item/item.js:437 +#: erpnext/stock/doctype/item/item.js:448 msgid "Please select the Warehouse first" msgstr "يرجى تحديد المستودع أولاً" @@ -38956,10 +39004,6 @@ msgstr "" msgid "Please set Parent Row No for item {0}" msgstr "يرجى تحديد رقم الصف الأصل للعنصر {0}" -#: erpnext/controllers/buying_controller.py:355 -msgid "Please set Purchase Expense Contra Account in Company {0}" -msgstr "يرجى تعيين حساب مصروفات الشراء المقابل في الشركة {0}" - #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:24 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:35 msgid "Please set Root Type" @@ -38997,12 +39041,12 @@ msgstr "" msgid "Please set a Purchase Price Variance Account for Item {0} or a Default Purchase Price Variance Account in Company {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:341 -#: erpnext/stock/doctype/item/item.py:1669 +#: erpnext/stock/doctype/item/item.py:346 +#: erpnext/stock/doctype/item/item.py:1674 msgid "Please set a Temporary Opening account for company {0} to create an Opening Stock reconciliation." msgstr "" -#: erpnext/projects/doctype/project/project.py:807 +#: erpnext/projects/doctype/project/project.py:837 msgid "Please set a default Holiday List for Company {0}" msgstr "يرجى تحديد قائمة العطلات الافتراضية للشركة {0}" @@ -39022,7 +39066,7 @@ msgstr "يرجى تحديد الطلب الفعلي أو توقعات المبي msgid "Please set an Address on the Company '{0}'" msgstr "يرجى تحديد عنوان في الشركة '{0}'" -#: erpnext/stock/services/base_stock_gl_composer.py:194 +#: erpnext/stock/services/base_stock_gl_composer.py:261 msgid "Please set an Expense Account in the Items table" msgstr "يرجى تحديد حساب مصروفات في جدول البنود" @@ -39051,7 +39095,7 @@ msgstr "الرجاء تحديد الحساب البنكي أو النقدي ال msgid "Please set default Cash or Bank account in Mode of Payments {0}" msgstr "" -#: erpnext/accounts/utils.py:2570 +#: erpnext/accounts/utils.py:2564 msgid "Please set default Exchange Gain/Loss Account in Company {0}" msgstr "" @@ -39063,7 +39107,7 @@ msgstr "يرجى تعيين حساب المصروفات الافتراضي في msgid "Please set default UOM in Stock Settings" msgstr "يرجى تعيين الافتراضي UOM في إعدادات الأسهم" -#: erpnext/stock/services/base_stock_gl_composer.py:107 +#: erpnext/stock/services/base_stock_gl_composer.py:114 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "يرجى تحديد حساب تكلفة البضائع المباعة الافتراضي في الشركة {0} لتسجيل مكاسب وخسائر التقريب أثناء نقل المخزون" @@ -39143,6 +39187,11 @@ msgstr "يرجى ضبط {0} للعنوان {1}" msgid "Please set {0} in BOM Creator {1}" msgstr "يرجى ضبط {0} في مُنشئ قائمة المواد {1}" +#: erpnext/controllers/buying_controller.py:347 +#: erpnext/stock/services/base_stock_gl_composer.py:209 +msgid "Please set {0} in Company {1} or in the Item Defaults of Item {2}" +msgstr "" + #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1147 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "يرجى تعيين {0} في الشركة {1} لحساب مكاسب/خسائر الصرف" @@ -39159,7 +39208,7 @@ msgstr "يرجى إعداد وتفعيل حساب مجموعة بنوع الحس msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "يرجى مشاركة هذه الرسالة الإلكترونية مع فريق الدعم الخاص بك حتى يتمكنوا من إيجاد المشكلة وحلها." -#: erpnext/stock/get_item_details.py:349 +#: erpnext/stock/get_item_details.py:348 msgid "Please specify Company" msgstr "يرجى تحديد شركة" @@ -39198,7 +39247,7 @@ msgstr "" msgid "Please submit Purchase Order {0} before proceeding." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:284 msgid "Please try again in an hour." msgstr "يرجى المحاولة مرة أخرى بعد ساعة." @@ -39206,7 +39255,7 @@ msgstr "يرجى المحاولة مرة أخرى بعد ساعة." msgid "Please uncheck 'Show in Bucket View' to create Orders" msgstr "يرجى إلغاء تحديد خيار \"إظهار في عرض المجموعة\" لإنشاء الطلبات" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:237 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:240 msgid "Please update Repair Status." msgstr "يرجى تحديث حالة الإصلاح." @@ -39509,7 +39558,7 @@ msgstr "نشر التوقيت" msgid "Posting date does not match the selected transaction" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:101 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:109 msgid "Posting date is required" msgstr "" @@ -39584,15 +39633,15 @@ msgstr "مدعوم من {0}" msgid "Pre Sales" msgstr "قبل البيع" -#: erpnext/accounts/utils.py:2808 +#: erpnext/accounts/utils.py:2802 msgid "Pre-Submit Warning" msgstr "" -#: erpnext/accounts/utils.py:2857 +#: erpnext/accounts/utils.py:2851 msgid "Pre-Submit Warning: Credit Limit" msgstr "" -#: erpnext/accounts/utils.py:2869 +#: erpnext/accounts/utils.py:2863 msgid "Pre-Submit Warning: Packed Qty" msgstr "" @@ -39869,7 +39918,7 @@ msgstr "قائمة الأسعار البلد" msgid "Price List Currency" msgstr "قائمة الأسعار العملات" -#: erpnext/stock/get_item_details.py:1384 +#: erpnext/stock/get_item_details.py:1383 msgid "Price List Currency not selected" msgstr "قائمة أسعار العملات غير محددة" @@ -40440,7 +40489,6 @@ msgstr "الاسم الكامل لصاحب العملية" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Process Payment Reconciliation" @@ -40699,7 +40747,7 @@ msgstr "معرف سعر المنتج" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:543 +#: erpnext/setup/doctype/company/company.py:545 msgid "Production" msgstr "الإنتاج" @@ -40853,11 +40901,13 @@ msgstr "الربح هذا العام" #. Option for the 'Report Type' (Select) field in DocType 'Account' #. Option for the 'Report Type' (Select) field in DocType 'Process Period #. Closing Voucher Detail' +#. Label of a chart in the Accounting Workspace #. Label of a chart in the Financial Reports Workspace #. Label of a chart in the Invoicing Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/financial_statements.js:368 @@ -40917,7 +40967,7 @@ msgstr "لا يمكن أن تتجاوز نسبة التقدم في مهمة ما msgid "Progress (%)" msgstr "تقدم (٪)" -#: erpnext/projects/doctype/project/project.py:432 +#: erpnext/projects/doctype/project/project.py:434 msgid "Project Collaboration Invitation" msgstr "دعوة للمشاركة في المشاريع" @@ -40965,7 +41015,7 @@ msgstr "حالة المشروع" msgid "Project Summary" msgstr "ملخص المشروع" -#: erpnext/projects/doctype/project/project.py:745 +#: erpnext/projects/doctype/project/project.py:775 msgid "Project Summary for {0}" msgstr "ملخص المشروع لـ {0}" @@ -41096,7 +41146,7 @@ msgstr "الكمية المتوقعة" #. Label of a Card Break in the Projects Workspace #. Title of a Workspace Sidebar #: erpnext/config/projects.py:7 erpnext/desktop_icon/projects.json -#: erpnext/projects/doctype/project/project.py:512 +#: erpnext/projects/doctype/project/project.py:542 #: erpnext/projects/workspace/projects/projects.json #: erpnext/selling/doctype/customer/customer_dashboard.py:26 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:28 @@ -41257,7 +41307,7 @@ msgstr "تزويد بعنوان البريد الإلكتروني المسجل msgid "Providing" msgstr "توفير" -#: erpnext/setup/doctype/company/company.py:642 +#: erpnext/setup/doctype/company/company.py:644 msgid "Provisional Account" msgstr "الحساب المؤقت" @@ -41337,7 +41387,7 @@ msgstr "نشر" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:531 erpnext/setup/install.py:413 +#: erpnext/setup/doctype/company/company.py:533 erpnext/setup/install.py:413 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item/item_list.js:30 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -41412,8 +41462,8 @@ msgstr "حساب مصروفات الشراء" msgid "Purchase Expense Contra Account" msgstr "حساب مقابل لمصروفات الشراء" -#: erpnext/controllers/buying_controller.py:365 -#: erpnext/controllers/buying_controller.py:379 +#: erpnext/controllers/buying_controller.py:373 +#: erpnext/controllers/buying_controller.py:387 msgid "Purchase Expense for Item {0}" msgstr "مصروفات شراء الصنف {0}" @@ -41460,7 +41510,7 @@ msgstr "مصروفات شراء الصنف {0}" #: 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:446 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:445 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -41532,7 +41582,6 @@ msgstr "فواتير الشراء" #. Label of the purchase_order (Link) field in DocType 'Stock Entry' #. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt #. Item' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:61 #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -41551,7 +41600,7 @@ msgstr "فواتير الشراء" #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js:48 #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:205 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/buying_controller.py:929 +#: erpnext/controllers/buying_controller.py:937 #: erpnext/crm/doctype/contract/contract.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:54 #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -41560,14 +41609,12 @@ msgstr "فواتير الشراء" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:196 +#: erpnext/stock/doctype/material_request/material_request.js:199 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:217 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/buying.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Purchase Order" msgstr "أمر الشراء" @@ -41668,7 +41715,7 @@ msgstr "تم إنشاء أمر الشراء {0}" msgid "Purchase Order {0} is not submitted" msgstr "طلب الشراء {0} يجب أن يعتمد\\n
    \\nPurchase Order {0} is not submitted" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:582 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:583 msgid "Purchase Orders" msgstr "طلبات الشراء" @@ -41683,7 +41730,7 @@ msgstr "عدد أوامر الشراء" msgid "Purchase Orders Items Overdue" msgstr "أوامر الشراء البنود المتأخرة" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:277 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:278 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "لا يسمح بأوامر الشراء {0} بسبب وضع بطاقة النقاط {1}." @@ -41712,7 +41759,7 @@ msgstr "قائمة أسعار الشراء" msgid "Purchase Price Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:88 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:93 msgid "Purchase Price Variance for {0}" msgstr "" @@ -41842,10 +41889,8 @@ msgid "Purchase Return" msgstr "شراء العودة" #. Label of the purchase_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:161 -#: erpnext/workspace_sidebar/taxes.json msgid "Purchase Tax Template" msgstr "قالب الضرائب على المشتريات" @@ -41945,7 +41990,7 @@ msgstr "المشتريات" #: erpnext/stock/doctype/item/item_list.js:41 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:481 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:480 #: 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 @@ -42262,7 +42307,7 @@ msgstr "الكمية المتوفرة في المخزون وحدة القياس" msgid "Qty of Finished Goods Item" msgstr "الكمية من السلع تامة الصنع" -#: erpnext/stock/doctype/pick_list/pick_list.py:707 +#: erpnext/stock/doctype/pick_list/pick_list.py:716 msgid "Qty of Finished Goods Item should be greater than 0." msgstr "يجب أن تكون كمية المنتج النهائي أكبر من صفر." @@ -42291,7 +42336,7 @@ msgstr "الكمية المطلوبة للبناء" msgid "Qty to Deliver" msgstr "الكمية للتسليم" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:401 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:400 msgid "Qty to Disassemble" msgstr "" @@ -42560,7 +42605,7 @@ msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "" #: erpnext/public/js/controllers/transaction.js:446 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:212 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:211 msgid "Quality Inspection(s)" msgstr "فحص الجودة" @@ -42569,7 +42614,7 @@ msgstr "فحص الجودة" msgid "Quality Inspections" msgstr "عمليات فحص الجودة" -#: erpnext/setup/doctype/company/company.py:573 +#: erpnext/setup/doctype/company/company.py:575 msgid "Quality Management" msgstr "إدارة الجودة" @@ -42712,11 +42757,11 @@ msgstr "" #: erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py:39 #: erpnext/stock/dashboard/item_dashboard.js:248 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:368 +#: erpnext/stock/doctype/material_request/material_request.js:369 #: 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:829 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:828 #: 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 @@ -42826,7 +42871,7 @@ msgstr "كمية وقيم" msgid "Quantity and Warehouse" msgstr "الكمية والنماذج" -#: erpnext/stock/doctype/material_request/material_request.py:214 +#: erpnext/stock/doctype/material_request/material_request.py:253 msgid "Quantity cannot be greater than {0} for Item {1}" msgstr "لا يمكن أن تتجاوز الكمية {0} للعنصر {1}" @@ -42842,7 +42887,7 @@ msgstr "الكمية المطلوبة" msgid "Quantity must be greater than zero" msgstr "" -#: erpnext/stock/doctype/item/item.py:1649 +#: erpnext/stock/doctype/item/item.py:1654 msgid "Quantity must be greater than zero." msgstr "" @@ -42877,11 +42922,11 @@ msgstr "لا يمكن أن تكون الكمية للتصنيع صفراً لل msgid "Quantity to Manufacture must be greater than 0." msgstr "\"الكمية لتصنيع\" يجب أن تكون أكبر من 0." -#: erpnext/public/js/utils/barcode_scanner.js:257 +#: erpnext/public/js/utils/barcode_scanner.js:262 msgid "Quantity to Scan" msgstr "الكمية المراد مسحها ضوئيًا" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:932 msgid "Quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -42910,7 +42955,7 @@ msgstr "الربع {0} {1}" msgid "Query Route String" msgstr "سلسلة مسار الاستعلام" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:193 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:200 msgid "Queue Size should be between 5 and 100" msgstr "يجب أن يتراوح حجم قائمة الانتظار بين 5 و 100" @@ -43560,7 +43605,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:788 #: erpnext/selling/doctype/sales_order/sales_order.js:1012 #: erpnext/selling/doctype/sales_order/sales_order_list.js:70 -#: erpnext/stock/doctype/material_request/material_request.js:243 +#: erpnext/stock/doctype/material_request/material_request.js:246 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:163 msgid "Re-open" @@ -43878,7 +43923,7 @@ msgstr "الكمية المستلمة في المخزون وحدة القياس" msgid "Received Quantity" msgstr "الكمية المستلمة" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:377 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:376 msgid "Received Stock Entries" msgstr "تلقى إدخالات الأسهم" @@ -44020,11 +44065,6 @@ msgstr "سجلات المصالحة" msgid "Reconciliation Progress" msgstr "التقدم المحرز في المصالحة" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Reconciliation Statement" -msgstr "" - #. Label of the reconciliation_takes_effect_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -44864,7 +44904,7 @@ msgstr "سجل أخطاء إعادة النشر" msgid "Repost Item Valuation" msgstr "إعادة تقييم العنصر" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:376 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:399 msgid "Repost Item Valuation restarted for selected failed records." msgstr "تمت إعادة تشغيل تقييم العناصر المعاد نشرها للسجلات الفاشلة المحددة." @@ -45049,7 +45089,7 @@ msgstr "طلب المعلومات" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:270 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/stock/doctype/material_request/material_request.js:202 +#: erpnext/stock/doctype/material_request/material_request.js:205 #: erpnext/workspace_sidebar/buying.json msgid "Request for Quotation" msgstr "طلب للحصول على الاقتباس" @@ -45224,7 +45264,7 @@ msgstr "يتطلب وفاء" msgid "Research" msgstr "ابحاث" -#: erpnext/setup/doctype/company/company.py:579 +#: erpnext/setup/doctype/company/company.py:581 msgid "Research & Development" msgstr "البحث و التطوير" @@ -45315,7 +45355,7 @@ msgstr "مخصص للتجميع الفرعي" msgid "Reserved" msgstr "محجوز" -#: erpnext/stock/services/serial_batch_bundle_service.py:665 +#: erpnext/stock/services/serial_batch_bundle_service.py:664 msgid "Reserved Batch Conflict" msgstr "تعارض الدُفعات المحجوزة" @@ -45385,7 +45425,7 @@ msgstr "الكمية المحجوزة" msgid "Reserved Quantity for Production" msgstr "الكمية المحجوزة للإنتاج" -#: erpnext/stock/stock_ledger.py:2452 +#: erpnext/stock/stock_ledger.py:2500 msgid "Reserved Serial No." msgstr "رقم تسلسلي محجوز" @@ -45401,13 +45441,13 @@ msgstr "رقم تسلسلي محجوز" #: erpnext/stock/doctype/pick_list/pick_list.js:178 #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:573 -#: erpnext/stock/stock_ledger.py:2436 +#: erpnext/stock/stock_ledger.py:2484 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:204 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:332 msgid "Reserved Stock" msgstr "المخزون المحجوز" -#: erpnext/stock/stock_ledger.py:2481 +#: erpnext/stock/stock_ledger.py:2529 msgid "Reserved Stock for Batch" msgstr "المخزون المحجوز للدفعة" @@ -45449,7 +45489,7 @@ msgstr "محجوزة للتعاقد من الباطن" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:421 -#: erpnext/stock/doctype/pick_list/pick_list.js:306 +#: erpnext/stock/doctype/pick_list/pick_list.js:307 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:292 msgid "Reserving Stock..." msgstr "حجز المخزون..." @@ -45620,7 +45660,7 @@ msgstr "إعادة تشغيل الإدخالات الفاشلة" msgid "Restart Subscription" msgstr "إعادة تشغيل الاشتراك" -#: erpnext/assets/doctype/asset/asset.js:183 +#: erpnext/assets/doctype/asset/asset.js:191 msgid "Restore Asset" msgstr "استعادة الأصول" @@ -45636,6 +45676,15 @@ msgstr "يقيد" msgid "Restrict Items Based On" msgstr "تقييد العناصر بناءً على" +#. Label of the restrict_to_companies (Check) field in DocType 'Supplier' +#. Label of the restrict_to_companies (Check) field in DocType 'Customer' +#. Label of the restrict_to_companies (Check) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Restrict to Companies" +msgstr "" + #. Label of the section_break_6 (Section Break) field in DocType 'Shipping #. Rule' #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json @@ -45678,7 +45727,7 @@ msgstr "استئنف" msgid "Resume Job" msgstr "سيرة ذاتية للوظيفة" -#: erpnext/projects/doctype/timesheet/timesheet.js:65 +#: erpnext/projects/doctype/timesheet/timesheet.js:66 msgid "Resume Timer" msgstr "مؤقت الاستئناف" @@ -46104,6 +46153,12 @@ msgstr "" msgid "Role allowed to bypass credit limit" msgstr "" +#. Label of the role_allowed_to_bypass_overdue_billing (Link) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Role allowed to bypass overdue billing limit" +msgstr "" + #. Description of the 'Exempted Role' (Link) field in DocType 'Accounting #. Period' #: erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -46165,7 +46220,7 @@ msgstr "شركة الجذر" msgid "Root Type" msgstr "نوع الجذر" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:404 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:405 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "يجب أن يكون نوع الجذر لـ {0} أحد الأصول أو الخصوم أو الإيرادات أو المصروفات أو حقوق الملكية." @@ -46329,8 +46384,8 @@ msgstr "مخصص خسائر التقريب" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "يجب أن يكون بدل خسائر التقريب بين 0 و 1" -#: erpnext/stock/services/base_stock_gl_composer.py:119 -#: erpnext/stock/services/base_stock_gl_composer.py:134 +#: erpnext/stock/services/base_stock_gl_composer.py:126 +#: erpnext/stock/services/base_stock_gl_composer.py:141 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "قيد تقريب الربح/الخسارة لنقل الأسهم" @@ -46387,7 +46442,7 @@ msgstr "الصف # {0} (جدول الدفع): يجب أن يكون المبلغ msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "الصف رقم {0} (جدول الدفع): يجب أن يكون المبلغ موجبا" -#: erpnext/stock/doctype/item/item.py:585 +#: erpnext/stock/doctype/item/item.py:590 msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "الصف #{0}: يوجد بالفعل إدخال إعادة طلب للمستودع {1} بنوع إعادة الطلب {2}." @@ -46603,11 +46658,11 @@ msgstr "" msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "الصف # {0}: تاريخ التسليم المتوقع لا يمكن أن يكون قبل تاريخ أمر الشراء" -#: erpnext/stock/services/base_stock_gl_composer.py:196 +#: erpnext/stock/services/base_stock_gl_composer.py:263 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "الصف #{0}: لم يتم تعيين حساب المصروفات للعنصر {1}. {2}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:145 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:148 msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "الصف #{0}: حساب المصروفات {1} غير صالح لفاتورة الشراء {2}. يُسمح فقط بحسابات المصروفات الخاصة بالعناصر غير المخزنة." @@ -46670,11 +46725,11 @@ msgstr "الصف #{0}: لا يمكن أن يكون تاريخ البدء قبل msgid "Row #{0}: From Time and To Time fields are required" msgstr "الصف #{0}: حقلا \"من وقت\" و\"إلى وقت\" مطلوبان." -#: erpnext/stock/doctype/pick_list/pick_list.py:680 +#: erpnext/stock/doctype/pick_list/pick_list.py:689 msgid "Row #{0}: Item Code is Mandatory" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:427 +#: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Row #{0}: Item added" msgstr "الصف # {0}: تمت إضافة العنصر" @@ -46686,7 +46741,7 @@ msgstr "الصف #{0}: لا يمكن نقل العنصر {1} إلى أكثر م msgid "Row #{0}: Item {1} does not exist" msgstr "الصف #{0}: العنصر {1} غير موجود" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1659 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1661 msgid "Row #{0}: Item {1} has been picked, please reserve stock from the Pick List." msgstr "الصف #{0}: تم اختيار العنصر {1} ، يرجى حجز المخزون من قائمة الاختيار." @@ -46763,7 +46818,7 @@ msgstr "الصف #{0}: لا يمكن أن يكون تاريخ الاستهلاك msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "الصف رقم {0}: غير مسموح تغيير المورد لأن أمر الشراء موجود مسبقاً\\n
    \\nRow #{0}: Not allowed to change Supplier as Purchase Order already exists" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1742 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1744 msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "الصف #{0}: الصف {1} فقط متاح للحجز للعنصر {2}" @@ -46816,7 +46871,7 @@ msgstr "الصف #{0}: يرجى تحديد عنصر المنتج النهائي msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "الصف #{0}: الرجاء تحديد مستودع التجميع الفرعي" -#: erpnext/stock/doctype/item/item.py:592 +#: erpnext/stock/doctype/item/item.py:597 msgid "Row #{0}: Please set reorder quantity" msgstr "الصف # {0}: يرجى تعيين إعادة ترتيب الكمية\\n
    \\nRow #{0}: Please set reorder quantity" @@ -46837,7 +46892,7 @@ msgstr "" msgid "Row #{0}: Product Bundle {1} is disabled and cannot be used in transactions." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:425 +#: erpnext/public/js/utils/barcode_scanner.js:433 msgid "Row #{0}: Qty increased by {1}" msgstr "الصف #{0}: زادت الكمية بمقدار {1}" @@ -46874,7 +46929,7 @@ msgstr "الصف # {0}: كمية البند {1} لا يمكن أن يكون صف msgid "Row #{0}: Quantity of Item {1} cannot be more than {2} {3} against Subcontracting Inward Order {4}" msgstr "الصف #{0}: لا يمكن أن تتجاوز كمية الصنف {1} الكمية {2} {3} في طلب الشراء الداخلي للتعاقد من الباطن {4}" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1727 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1729 msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "الصف #{0}: يجب أن تكون الكمية المراد حجزها للعنصر {1} أكبر من 0." @@ -46900,7 +46955,7 @@ msgstr "" msgid "Row #{0}: Rejected Warehouse is mandatory for the rejected Item {1}" msgstr "الصف #{0}: المستودع المرفوض إلزامي للعنصر المرفوض {1}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:163 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:166 msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "الصف #{0}: تكلفة الإصلاح {1} تتجاوز المبلغ المتاح {2} لفاتورة الشراء {3} والحساب {4}" @@ -46935,7 +46990,7 @@ msgstr "الصف #{0}: يجب أن يكون معرف التسلسل {1} أو {2} msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:123 +#: erpnext/stock/services/serial_batch_bundle_service.py:125 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "الصف # {0}: الرقم التسلسلي {1} لا ينتمي إلى الدُفعة {2}" @@ -47003,7 +47058,7 @@ msgstr "الصف #{0}: الحالة إلزامية" msgid "Row #{0}: Status must be {1} for Invoice Discounting {2}" msgstr "الصف # {0}: يجب أن تكون الحالة {1} بالنسبة لخصم الفاتورة {2}" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:454 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:459 msgid "Row #{0}: Stock Delivered But Not Billed account cannot be used for items linked to a Sales Invoice" msgstr "" @@ -47011,19 +47066,19 @@ msgstr "" msgid "Row #{0}: Stock cannot be reserved for Item {1} against a disabled Batch {2}." msgstr "الصف #{0}: لا يمكن حجز المخزون للصنف {1} مقابل دفعة معطلة {2}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1672 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1674 msgid "Row #{0}: Stock cannot be reserved for a non-stock Item {1}" msgstr "الصف #{0}: لا يمكن حجز المخزون لصنف غير متوفر في المخزون {1}" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1685 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1687 msgid "Row #{0}: Stock cannot be reserved in group warehouse {1}." msgstr "الصف #{0}: لا يمكن حجز المخزون في مستودع المجموعة {1}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1701 msgid "Row #{0}: Stock is already reserved for the Item {1}." msgstr "الصف #{0}: تم حجز المخزون بالفعل للصنف {1}." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:569 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:574 msgid "Row #{0}: Stock is reserved for item {1} in warehouse {2}." msgstr "الصف #{0}: تم حجز المخزون للصنف {1} في المستودع {2}." @@ -47032,11 +47087,11 @@ msgid "Row #{0}: Stock not available to reserve for Item {1} against Batch {2} i msgstr "الصف #{0}: المخزون غير متاح للحجز للصنف {1} مقابل الدفعة {2} في المستودع {3}." #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1263 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1713 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1715 msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "الصف #{0}: المخزون غير متاح للحجز للصنف {1} في المستودع {2}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:944 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:950 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "الصف #{0}: كمية المخزون {1} ({2}) للصنف {3} لا يمكن أن تتجاوز {4}" @@ -47044,7 +47099,7 @@ msgstr "الصف #{0}: كمية المخزون {1} ({2}) للصنف {3} لا ي msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "الصف #{0}: يجب أن يكون المستودع المستهدف هو نفسه مستودع العميل {1} من أمر الشراء الداخلي المرتبط بالتعاقد من الباطن" -#: erpnext/stock/services/serial_batch_bundle_service.py:141 +#: erpnext/stock/services/serial_batch_bundle_service.py:143 msgid "Row #{0}: The batch {1} has already expired." msgstr "الصف رقم {0}: انتهت صلاحية الدفعة {1} بالفعل." @@ -47056,7 +47111,7 @@ msgstr "" msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." msgstr "" -#: erpnext/stock/doctype/item/item.py:601 +#: erpnext/stock/doctype/item/item.py:606 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "الصف #{0}: المستودع {1} ليس مستودعًا فرعيًا لمستودع مجموعة {2}" @@ -47076,7 +47131,7 @@ msgstr "الصف #{0}: يجب أن يكون إجمالي عدد الاستهلا msgid "Row #{0}: Valuation Rate for Item {1} must be the same across all rows, as it is the item's company-wide Standard Cost." msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:57 +#: erpnext/stock/services/serial_batch_bundle_service.py:59 msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." msgstr "" @@ -47129,7 +47184,7 @@ msgstr "الصف رقم {0}: {1} مطلوب لإنشاء فواتير الافت msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "الصف #{0}: {1} من {2} يجب أن يكون {3}. يرجى تحديث {1} أو اختيار حساب آخر." -#: erpnext/stock/doctype/item/item.py:1557 +#: erpnext/stock/doctype/item/item.py:1562 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." msgstr "" @@ -47149,23 +47204,23 @@ msgstr "الصف #{1}: المستودع إلزامي لعنصر المخزون { msgid "Row #{idx}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor." msgstr "الصف #{idx}: لا يمكن تحديد مستودع المورد أثناء توريد المواد الخام إلى المقاول من الباطن." -#: erpnext/controllers/buying_controller.py:633 +#: erpnext/controllers/buying_controller.py:641 msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "الصف #{idx}: تم تحديث سعر الصنف وفقًا لسعر التقييم نظرًا لأنه تحويل مخزون داخلي." -#: erpnext/controllers/buying_controller.py:1069 +#: erpnext/controllers/buying_controller.py:1077 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "الصف #{idx}: الرجاء إدخال موقع عنصر الأصل {item_code}." -#: erpnext/controllers/buying_controller.py:726 +#: erpnext/controllers/buying_controller.py:734 msgid "Row #{idx}: Received Qty must be equal to Accepted + Rejected Qty for Item {item_code}." msgstr "الصف #{idx}: يجب أن تكون الكمية المستلمة مساوية للكمية المقبولة + الكمية المرفوضة للعنصر {item_code}." -#: erpnext/controllers/buying_controller.py:739 +#: erpnext/controllers/buying_controller.py:747 msgid "Row #{idx}: {field_label} can not be negative for item {item_code}." msgstr "الصف #{idx}: {field_label} لا يمكن أن يكون سالباً بالنسبة للعنصر {item_code}." -#: erpnext/controllers/buying_controller.py:692 +#: erpnext/controllers/buying_controller.py:700 msgid "Row #{idx}: {field_label} is mandatory." msgstr "الصف #{idx}: {field_label} إلزامي." @@ -47173,7 +47228,7 @@ msgstr "الصف #{idx}: {field_label} إلزامي." msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "الصف #{idx}: {from_warehouse_field} و {to_warehouse_field} لا يمكن أن يكونا متطابقين." -#: erpnext/controllers/buying_controller.py:1185 +#: erpnext/controllers/buying_controller.py:1193 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "الصف #{idx}: {schedule_date} لا يمكن أن يكون قبل {transaction_date}." @@ -47225,11 +47280,11 @@ msgstr "الصف {0}: يجب أن يكون المبلغ المخصص {1} أقل msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}" msgstr "الصف {0}: يجب أن يكون المبلغ المخصص {1} أقل من أو يساوي مبلغ الدفعة المتبقية {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:729 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "الصف {0}: بما أن {1} مُفعّل، فلا يمكن إضافة المواد الخام إلى المدخل {2} . استخدم المدخل {3} لاستهلاك المواد الخام." -#: erpnext/stock/doctype/material_request/material_request.py:556 +#: erpnext/stock/doctype/material_request/material_request.py:595 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "صف {0}: من مواد مشروع القانون لم يتم العثور على هذا البند {1}" @@ -47470,7 +47525,7 @@ msgstr "الصف {0}: المستودع المستهدف إلزامي للتحو msgid "Row {0}: Task {1} does not belong to Project {2}" msgstr "الصف {0}: المهمة {1} لا تنتمي إلى المشروع {2}" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:187 msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "الصف {0}: تم تخصيص مبلغ المصروفات بالكامل للحساب {1} في {2} بالفعل." @@ -47547,7 +47602,7 @@ msgstr "الصف {0}: {2} العنصر {1} غير موجود في {2} {3}" msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "الصف {1}: لا يمكن أن تكون الكمية ({0}) كسرًا. للسماح بذلك ، قم بتعطيل '{2}' في UOM {3}." -#: erpnext/controllers/buying_controller.py:1051 +#: erpnext/controllers/buying_controller.py:1059 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "الصف {idx}: سلسلة تسمية الأصول إلزامية لإنشاء الأصول تلقائيًا للعنصر {item_code}." @@ -47812,8 +47867,8 @@ msgstr "طريقة تحصيل الراتب" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:143 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:525 -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:527 +#: erpnext/setup/doctype/company/company.py:720 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 #: erpnext/setup/install.py:408 @@ -47828,7 +47883,7 @@ msgstr "مبيعات" msgid "Sales & Purchase" msgstr "" -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:720 msgid "Sales Account" msgstr "حساب مبيعات" @@ -48026,7 +48081,7 @@ msgstr "" msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." msgstr "تم تفعيل وضع فاتورة المبيعات في نظام نقاط البيع. يرجى إنشاء فاتورة مبيعات بدلاً من ذلك." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:626 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:631 msgid "Sales Invoice {0} has already been submitted" msgstr "سبق أن تم ترحيل فاتورة المبيعات {0}" @@ -48078,7 +48133,6 @@ msgstr "فرص المبيعات حسب المصدر" #. Label of the sales_order (Link) field in DocType 'Purchase Receipt Item' #. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation #. Entry' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json @@ -48118,7 +48172,7 @@ msgstr "فرص المبيعات حسب المصدر" #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.js:157 #: erpnext/stock/doctype/delivery_note/delivery_note.js:223 -#: erpnext/stock/doctype/material_request/material_request.js:236 +#: erpnext/stock/doctype/material_request/material_request.js:239 #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -48127,9 +48181,7 @@ msgstr "فرص المبيعات حسب المصدر" #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:159 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:30 #: erpnext/stock/report/delayed_order_report/delayed_order_report.py:74 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Sales Order" msgstr "طلب المبيعات" @@ -48232,7 +48284,7 @@ msgstr "طلب البيع مطلوب للبند {0}\\n
    \\nSales Order require msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "يوجد بالفعل أمر بيع {0} مرتبط بأمر شراء العميل {1}. للسماح بإنشاء أوامر بيع متعددة، فعّل الخيار {2} في {3}." -#: erpnext/projects/doctype/project/project.py:256 +#: erpnext/projects/doctype/project/project.py:258 msgid "Sales Order {0} is already linked to Project {1}, skipping the link." msgstr "" @@ -48241,7 +48293,7 @@ msgstr "" msgid "Sales Order {0} is not available for production" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 msgid "Sales Order {0} is not submitted" msgstr "لا يتم اعتماد أمر التوريد {0}\\n
    \\nSales Order {0} is not submitted" @@ -48525,10 +48577,8 @@ msgid "Sales Summary" msgstr "ملخص المبيعات" #. Label of the sales_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:149 -#: erpnext/workspace_sidebar/taxes.json msgid "Sales Tax Template" msgstr "قالب ضريبة المبيعات" @@ -48537,11 +48587,6 @@ msgstr "قالب ضريبة المبيعات" msgid "Sales Tax Withholding Category" msgstr "فئة اقتطاع ضريبة المبيعات" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Sales Taxes" -msgstr "" - #. Label of the taxes (Table) field in DocType 'POS Invoice' #. Label of the taxes (Table) field in DocType 'Sales Invoice' #. Name of a DocType @@ -48666,7 +48711,7 @@ msgid "Sample Quantity" msgstr "كمية العينة" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:557 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:556 msgid "Sample Retention Stock Entry" msgstr "إدخال بيانات المخزون للاحتفاظ بالعينات" @@ -48737,7 +48782,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/public/js/utils/barcode_scanner.js:236 +#: erpnext/public/js/utils/barcode_scanner.js:241 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -48769,7 +48814,7 @@ msgstr "وضع المسح" msgid "Scan Serial No" msgstr "رقم المسح التسلسلي" -#: erpnext/public/js/utils/barcode_scanner.js:200 +#: erpnext/public/js/utils/barcode_scanner.js:205 msgid "Scan barcode for item {0}" msgstr "امسح الرمز الشريطي للمنتج {0}" @@ -48791,14 +48836,14 @@ msgstr "" msgid "Scanned Cheque" msgstr "الممسوحة ضوئيا شيك" -#: erpnext/public/js/utils/barcode_scanner.js:268 +#: erpnext/public/js/utils/barcode_scanner.js:273 msgid "Scanned Quantity" 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:383 +#: erpnext/assets/doctype/asset/asset.js:391 #: 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" @@ -48934,7 +48979,7 @@ msgstr "ترتيب الترتيب" msgid "Scrap" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:168 +#: erpnext/assets/doctype/asset/asset.js:176 msgid "Scrap Asset" msgstr "أصول خردة" @@ -48995,7 +49040,7 @@ msgstr "" msgid "Search transactions" msgstr "" -#: erpnext/stock/doctype/item/item.js:1099 +#: erpnext/stock/doctype/item/item.js:1116 msgid "Search values..." msgstr "" @@ -49123,7 +49168,7 @@ msgstr "اختر البند البديل" msgid "Select Alternative Items for Sales Order" msgstr "اختر عناصر بديلة لطلب البيع" -#: erpnext/stock/doctype/item/item.js:1225 +#: erpnext/stock/doctype/item/item.js:1242 msgid "Select Attribute Values" msgstr "حدد قيم السمات" @@ -49135,9 +49180,9 @@ msgstr "حدد مكتب الإدارة" msgid "Select BOM and Qty for Production" msgstr "اختر فاتورة المواد و الكمية للانتاج" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Batch No" msgstr "حدد رقم الدفعة" @@ -49269,15 +49314,15 @@ msgstr "اختار المورد المحتمل" msgid "Select Quantity" msgstr "إختيار الكمية" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Serial No" msgstr "حدد الرقم التسلسلي" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:237 -#: erpnext/public/js/utils/sales_common.js:452 -#: erpnext/stock/doctype/pick_list/pick_list.js:401 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:246 +#: erpnext/public/js/utils/sales_common.js:450 +#: erpnext/stock/doctype/pick_list/pick_list.js:402 msgid "Select Serial and Batch" msgstr "حدد التسلسل والدفعة" @@ -49315,7 +49360,7 @@ msgstr "اختر القسائم المناسبة" msgid "Select Warehouse..." msgstr "حدد مستودع ..." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:580 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:578 msgid "Select Warehouses to get Stock for Materials Planning" msgstr "اختر المستودعات للحصول على المخزون اللازم لتخطيط المواد" @@ -49327,7 +49372,7 @@ msgstr "حدد شركة" msgid "Select a Company this Employee belongs to." msgstr "اختر الشركة التي ينتمي إليها هذا الموظف." -#: erpnext/buying/doctype/supplier/supplier.js:221 +#: erpnext/buying/doctype/supplier/supplier.js:230 msgid "Select a Customer" msgstr "اختر عميلاً" @@ -49339,7 +49384,7 @@ msgstr "حدد أولوية افتراضية." msgid "Select a Payment Method." msgstr "اختر طريقة الدفع." -#: erpnext/selling/doctype/customer/customer.js:253 +#: erpnext/selling/doctype/customer/customer.js:262 msgid "Select a Supplier" msgstr "حدد المورد" @@ -49366,7 +49411,7 @@ msgstr "" msgid "Select all" msgstr "" -#: erpnext/stock/doctype/item/item.js:1567 +#: erpnext/stock/doctype/item/item.js:1584 msgid "Select an Item Group." msgstr "حدد مجموعة عناصر." @@ -49383,7 +49428,7 @@ msgstr "حدد فاتورة لتحميل ملخص البيانات" msgid "Select an item from each set to be used in the Sales Order." msgstr "اختر عنصرًا واحدًا من كل مجموعة لاستخدامه في أمر البيع." -#: erpnext/stock/doctype/item/item.js:1239 +#: erpnext/stock/doctype/item/item.js:1256 msgid "Select at least one attribute value." msgstr "" @@ -49454,7 +49499,7 @@ msgstr "اختر المستودع" msgid "Select the customer or supplier." msgstr "حدد العميل أو المورد." -#: erpnext/assets/doctype/asset/asset.js:940 +#: erpnext/assets/doctype/asset/asset.js:948 msgid "Select the date" msgstr "حدد التاريخ" @@ -49480,7 +49525,7 @@ msgstr "حدد المواد الخام (العناصر) المطلوبة لتص msgid "Select variant item code for the template item {0}" msgstr "حدد رمز عنصر متغير لعنصر النموذج {0}" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:737 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:735 msgid "Select whether to get items from a Sales Order or a Material Request. For now select Sales Order.\n" " A Production Plan can also be created manually where you can select the Items to manufacture." msgstr "" @@ -49534,22 +49579,22 @@ msgstr "" msgid "Self delivery" msgstr "التوصيل الذاتي" -#: erpnext/assets/doctype/asset/asset.js:647 +#: erpnext/assets/doctype/asset/asset.js:655 #: 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:176 -#: erpnext/assets/doctype/asset/asset.js:636 +#: erpnext/assets/doctype/asset/asset.js:184 +#: erpnext/assets/doctype/asset/asset.js:644 msgid "Sell Asset" msgstr "بيع الأصل" -#: erpnext/assets/doctype/asset/asset.js:641 +#: erpnext/assets/doctype/asset/asset.js:649 msgid "Sell Qty" msgstr "بيع الكمية" -#: erpnext/assets/doctype/asset/asset.js:657 +#: erpnext/assets/doctype/asset/asset.js:665 msgid "Sell quantity cannot exceed the asset quantity" msgstr "لا يمكن أن تتجاوز كمية البيع كمية الأصل" @@ -49557,7 +49602,7 @@ msgstr "لا يمكن أن تتجاوز كمية البيع كمية الأصل" msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "لا يمكن أن تتجاوز كمية البيع كمية الأصل. يحتوي الأصل {0} على {1} عنصر فقط." -#: erpnext/assets/doctype/asset/asset.js:653 +#: erpnext/assets/doctype/asset/asset.js:661 msgid "Sell quantity must be greater than zero" msgstr "يجب أن تكون كمية البيع أكبر من الصفر" @@ -49863,7 +49908,7 @@ msgstr "رقم المسلسل / الدفعة" msgid "Serial No Already Assigned" msgstr "تم تخصيص الرقم التسلسلي مسبقاً" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:296 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:299 msgid "Serial No Bundle is mandatory for Item {0}" msgstr "" @@ -49884,11 +49929,11 @@ msgstr "دفتر الأستاذ ذو الرقم التسلسلي" msgid "Serial No Range" msgstr "نطاق الأرقام التسلسلية" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2766 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2768 msgid "Serial No Reserved" msgstr "الرقم التسلسلي محجوز" -#: erpnext/stock/doctype/item/item.py:496 +#: erpnext/stock/doctype/item/item.py:501 msgid "Serial No Series Overlap" msgstr "تداخل سلسلة الأرقام التسلسلية" @@ -49953,7 +49998,7 @@ msgstr "رقم المسلسل إلزامي القطعة ل {0}" msgid "Serial No {0} already exists" msgstr "الرقم التسلسلي {0} موجود بالفعل" -#: erpnext/public/js/utils/barcode_scanner.js:342 +#: erpnext/public/js/utils/barcode_scanner.js:347 msgid "Serial No {0} already scanned" msgstr "تم مسح الرقم التسلسلي {0} مسبقًا" @@ -49967,7 +50012,7 @@ msgstr "الرقم المتسلسل {0} لا ينتمي إلى البند {1}\\n #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py:52 #: erpnext/selling/doctype/installation_note/installation_note.py:84 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3564 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3566 msgid "Serial No {0} does not exist" msgstr "الرقم المتسلسل {0} غير موجود\\n
    \\nSerial No {0} does not exist" @@ -49975,7 +50020,7 @@ msgstr "الرقم المتسلسل {0} غير موجود\\n
    \\nSerial No {0} msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:435 +#: erpnext/public/js/utils/barcode_scanner.js:443 msgid "Serial No {0} is already added" msgstr "تمت إضافة الرقم التسلسلي {0} بالفعل" @@ -50003,7 +50048,7 @@ msgstr "لم يتم العثور علي الرقم التسلسلي {0}\\n
    \\ msgid "Serial No: {0} has already been transacted into another POS Invoice." msgstr "الرقم التسلسلي: تم بالفعل معاملة {0} في فاتورة نقطة بيع أخرى." -#: erpnext/public/js/utils/barcode_scanner.js:292 +#: erpnext/public/js/utils/barcode_scanner.js:297 #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:201 #: erpnext/stock/doctype/batch/batch.py:393 @@ -50026,7 +50071,7 @@ msgstr "" msgid "Serial Nos are created successfully" msgstr "تم إنشاء الأرقام التسلسلية بنجاح" -#: erpnext/stock/stock_ledger.py:2442 +#: erpnext/stock/stock_ledger.py:2490 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "يتم حجز الأرقام التسلسلية في إدخالات حجز المخزون، لذا عليك إلغاء حجزها قبل المتابعة." @@ -50107,7 +50152,7 @@ msgstr "التسلسل والدفعة" msgid "Serial and Batch Bundle" msgstr "حزمة التسلسل والدفعة" -#: erpnext/stock/doctype/item/item.py:1150 +#: erpnext/stock/doctype/item/item.py:1155 msgid "Serial and Batch Bundle Exists" msgstr "" @@ -50119,7 +50164,7 @@ msgstr "تم إنشاء حزمة التسلسل والدفعة" msgid "Serial and Batch Bundle updated" msgstr "تم تحديث حزمة التسلسل والدفعة" -#: erpnext/stock/services/serial_batch_bundle_service.py:99 +#: erpnext/stock/services/serial_batch_bundle_service.py:101 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "تم استخدام حزمة Serial and Batch {0} بالفعل في {1} {2}." @@ -50196,7 +50241,7 @@ msgstr "الأرقام التسلسلية غير متوفرة للعنصر {0} msgid "Series for Asset Depreciation Entry (Journal Entry)" msgstr "سلسلة دخول الأصول (دخول دفتر اليومية)" -#: erpnext/buying/doctype/supplier/supplier.py:143 +#: erpnext/buying/doctype/supplier/supplier.py:151 msgid "Series is mandatory" msgstr "الترقيم المتسلسل إلزامي" @@ -50476,7 +50521,7 @@ msgstr "برنامج الولاء" msgid "Set New Release Date" msgstr "تعيين تاريخ الإصدار الجديد" -#: erpnext/stock/doctype/item/item.js:207 +#: erpnext/stock/doctype/item/item.js:218 msgid "Set Opening Stock" msgstr "" @@ -50537,7 +50582,7 @@ msgstr "تحديد تسمية الحزم التسلسلية والدفعية ب #. Label of the set_warehouse (Link) field in DocType 'Sales Order' #. Label of the set_warehouse (Link) field in DocType 'Delivery Note' #. Label of the set_from_warehouse (Link) field in DocType 'Material Request' -#: erpnext/public/js/utils/sales_common.js:574 +#: erpnext/public/js/utils/sales_common.js:572 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json @@ -50555,7 +50600,7 @@ msgstr "مورد المجموعة" #. Label of the set_warehouse (Link) field in DocType 'Subcontracting Order' #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/public/js/utils/sales_common.js:571 +#: erpnext/public/js/utils/sales_common.js:569 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json @@ -50581,7 +50626,7 @@ msgstr "على النحو مغلق" msgid "Set as Completed" msgstr "تعيين كـ مكتمل" -#: erpnext/public/js/utils/sales_common.js:598 +#: erpnext/public/js/utils/sales_common.js:596 #: erpnext/selling/doctype/quotation/quotation.js:146 msgid "Set as Lost" msgstr "على النحو المفقودة" @@ -50608,11 +50653,11 @@ msgstr "تم تعيينه بواسطة قالب ضريبة الصنف" msgid "Set closing balance as per bank statement" msgstr "" -#: erpnext/setup/doctype/company/company.py:615 +#: erpnext/setup/doctype/company/company.py:617 msgid "Set default inventory account for perpetual inventory" msgstr "تعيين حساب المخزون الافتراضي للمخزون الدائم" -#: erpnext/setup/doctype/company/company.py:641 +#: erpnext/setup/doctype/company/company.py:643 msgid "Set default {0} account for non stock items" msgstr "قم بتعيين الحساب الافتراضي {0} للعناصر غير المخزنة" @@ -50826,44 +50871,34 @@ msgstr "قم بتأسيس مؤسستك" #. Label of the share_balance (Table) field in DocType 'Shareholder' #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_balance/share_balance.json #: erpnext/accounts/doctype/shareholder/shareholder.js:21 #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Balance" msgstr "رصيد السهم" #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.js:27 #: erpnext/accounts/report/share_ledger/share_ledger.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Ledger" msgstr "مشاركة دفتر الأستاذ" #. Label of a Card Break in the Invoicing Workspace -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/accounts/workspace/share_management/share_management.json #: erpnext/desktop_icon/share_management.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Management" msgstr "إدارة المشاركة" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/report/share_ledger/share_ledger.py:59 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Transfer" msgstr "نقل المشاركة" @@ -50880,14 +50915,12 @@ msgstr "نوع المشاركة" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.js:16 #: erpnext/accounts/report/share_balance/share_balance.py:55 #: erpnext/accounts/report/share_ledger/share_ledger.js:16 #: erpnext/accounts/report/share_ledger/share_ledger.py:51 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Shareholder" msgstr "المساهم" @@ -50901,7 +50934,7 @@ msgid "Shelf Life in Days" msgstr "مدة الصلاحية بالأيام" #. Label of the shift (Link) field in DocType 'Depreciation Schedule' -#: erpnext/assets/doctype/asset/asset.js:396 +#: erpnext/assets/doctype/asset/asset.js:404 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Shift" msgstr "يحول" @@ -50973,7 +51006,7 @@ msgstr "نوع الشحنة" msgid "Shipment details" msgstr "تفاصيل الشحنة" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:656 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:661 msgid "Shipments" msgstr "شحنات" @@ -51339,7 +51372,7 @@ msgstr "عرض البيانات شيخوخة الأسهم" msgid "Show Variant Attributes" msgstr "عرض سمات متغير" -#: erpnext/stock/doctype/item/item.js:231 +#: erpnext/stock/doctype/item/item.js:242 msgid "Show Variants" msgstr "اظهار المتغيرات" @@ -51530,11 +51563,11 @@ msgstr "بما أن هناك خسارة في العملية قدرها {0} وح msgid "Since you have enabled 'Track Semi Finished Goods', at least one operation must have 'Is Final Finished Good' checked. For that set the FG / Semi FG Item as {0} against an operation." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:134 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:142 msgid "Since {0} are Serial No/Batch No items, you cannot enable 'Recreate Stock Ledgers' in Repost Item Valuation." msgstr "بما أن {0} هي عناصر ذات رقم تسلسلي/رقم دفعة، فلا يمكنك تمكين \"إعادة إنشاء دفاتر المخزون\" في تقييم العناصر المعاد نشرها." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:114 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:122 msgid "Since {0} has 'Update Stock' disabled, you cannot create repost item valuation against it" msgstr "" @@ -51556,7 +51589,7 @@ msgstr "" msgid "Single Tier Program" msgstr "برنامج الطبقة الواحدة" -#: erpnext/stock/doctype/item/item.js:256 +#: erpnext/stock/doctype/item/item.js:267 msgid "Single Variant" msgstr "متغير واحد" @@ -51748,11 +51781,11 @@ msgstr "نوع المصدر" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:135 -#: erpnext/public/js/utils/sales_common.js:570 +#: erpnext/public/js/utils/sales_common.js:568 #: 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:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:819 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "مصدر مستودع" @@ -51842,15 +51875,15 @@ msgstr "تجاوز الإنفاق على الحساب {0} ({1}) بين {2} و {3 msgid "Spent" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:697 +#: erpnext/assets/doctype/asset/asset.js:705 #: erpnext/stock/doctype/batch/batch.js:104 #: erpnext/stock/doctype/batch/batch.js:185 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "انشق، مزق" -#: erpnext/assets/doctype/asset/asset.js:152 -#: erpnext/assets/doctype/asset/asset.js:681 +#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:689 msgid "Split Asset" msgstr "تقسيم الأصول" @@ -51874,7 +51907,7 @@ msgstr "انفصل عن" msgid "Split Issue" msgstr "تقسيم القضية" -#: erpnext/assets/doctype/asset/asset.js:687 +#: erpnext/assets/doctype/asset/asset.js:695 msgid "Split Qty" msgstr "تقسيم الكمية" @@ -51949,13 +51982,13 @@ msgstr "اسم المرحلة" msgid "Stale Days" msgstr "أيام قديمة" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:163 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:170 msgid "Stale Days should start from 1." msgstr "يجب أن تبدأ أيام الركود من 1." #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:485 -#: erpnext/tests/utils.py:275 +#: erpnext/tests/utils.py:276 msgid "Standard Buying" msgstr "شراء القياسية" @@ -51982,8 +52015,8 @@ msgstr "المصاريف الخاضعة للضريبة القياسية" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:493 -#: erpnext/stock/doctype/item/item.py:291 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2523 +#: erpnext/stock/doctype/item/item.py:296 erpnext/tests/utils.py:284 +#: erpnext/tests/utils.py:2524 msgid "Standard Selling" msgstr "البيع القياسية" @@ -52086,7 +52119,7 @@ msgstr "ابدأ إعادة النشر" msgid "Start Time can't be greater than or equal to End Time for {0}." msgstr "لا يمكن أن يكون وقت البدء أكبر من أو يساوي وقت الانتهاء لـ {0}." -#: erpnext/projects/doctype/timesheet/timesheet.js:62 +#: erpnext/projects/doctype/timesheet/timesheet.js:63 msgid "Start Timer" msgstr "بدء المؤقت" @@ -52211,7 +52244,7 @@ msgstr "رسم توضيحي للحالة" msgid "Status and Reference" msgstr "" -#: erpnext/projects/doctype/project/project.py:788 +#: erpnext/projects/doctype/project/project.py:818 msgid "Status must be Cancelled or Completed" msgstr "يجب إلغاء الحالة أو إكمالها" @@ -52300,7 +52333,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:170 +#: erpnext/stock/doctype/item/item.js:181 #: 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 @@ -52357,7 +52390,7 @@ msgstr "سجل إغلاق المخزون" msgid "Stock Delivered But Not Billed" msgstr "" -#: erpnext/setup/doctype/company/company.py:217 +#: erpnext/setup/doctype/company/company.py:219 msgid "Stock Delivered But Not Billed Account cannot be changed or disabled since account {0} contains outstanding Delivery Notes: {1}" msgstr "" @@ -52395,7 +52428,6 @@ msgstr "تفاصيل المخزون" #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Stock Entry" msgstr "قيد مخزون" @@ -52442,6 +52474,18 @@ msgstr "" msgid "Stock Entry {0} is not submitted" msgstr "الحركة المخزنية {0} غير مسجلة" +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Company' +#: erpnext/setup/doctype/company/company.json +msgid "Stock Expense" +msgstr "" + +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Stock Expense Accounting" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:87 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:147 msgid "Stock Expenses" @@ -52464,7 +52508,7 @@ msgstr "أصناف المخزن" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:180 +#: erpnext/stock/doctype/item/item.js:191 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -52582,7 +52626,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:190 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -52635,7 +52679,7 @@ msgstr "المخزون المتلقي ولكن غير مفوتر" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:137 #: erpnext/stock/workspace/stock/stock.json @@ -52654,7 +52698,7 @@ msgstr "جرد عناصر المخزون" msgid "Stock Reconciliation that revalues on-hand stock to this standard rate: auto-created when the rate is changed here, or the reconciliation that captured this rate (opening entry or rate change)." msgstr "" -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 msgid "Stock Reconciliations" msgstr "تسويات المخزون" @@ -52695,12 +52739,12 @@ msgstr "إعدادات إعادة نشر المخزون" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:869 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:680 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1266 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1675 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1688 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1702 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1730 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1747 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1677 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1690 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1704 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1718 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1732 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1749 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/doctype/stock_settings/stock_settings.py:225 #: erpnext/stock/doctype/stock_settings/stock_settings.py:237 @@ -52713,7 +52757,7 @@ msgstr "إعدادات إعادة نشر المخزون" msgid "Stock Reservation" msgstr "حجز الأسهم" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1858 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1860 msgid "Stock Reservation Entries Cancelled" msgstr "تم إلغاء إدخالات حجز المخزون" @@ -52721,7 +52765,7 @@ msgstr "تم إلغاء إدخالات حجز المخزون" #: erpnext/manufacturing/doctype/production_plan/services/reservation.py:152 #: erpnext/manufacturing/doctype/work_order/services/reservation.py:597 #: erpnext/selling/doctype/sales_order/services/reservation.py:133 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1808 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1810 msgid "Stock Reservation Entries Created" msgstr "تم إنشاء قيود حجز المخزون" @@ -52748,7 +52792,7 @@ msgstr "لا يمكن تحديث إدخال حجز المخزون لأنه تم msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one." msgstr "لا يمكن تعديل إدخال حجز المخزون المُنشأ مقابل قائمة الاختيار. إذا كنت ترغب في إجراء تغييرات، فننصحك بإلغاء الإدخال الحالي وإنشاء إدخال جديد." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:579 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:584 msgid "Stock Reservation Warehouse Mismatch" msgstr "عدم تطابق مستودع حجز المخزون" @@ -52788,7 +52832,7 @@ msgstr "الكمية المحجوزة من المخزون (وحدة قياس ا #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/item/item.js:486 +#: erpnext/stock/doctype/item/item.js:497 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:681 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -53025,15 +53069,15 @@ msgstr "" msgid "Stock cannot be reserved in group warehouse {0}." msgstr "لا يمكن حجز المخزون في مستودع المجموعة {0}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1620 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1622 msgid "Stock cannot be reserved in the group warehouse {0}." msgstr "لا يمكن حجز المخزون في مستودع المجموعة {0}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:906 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:912 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "لا يمكن تحديث المخزون بناءً على إشعارات التسليم التالية: {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:982 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:988 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "لا يمكن تحديث المخزون لأن الفاتورة تحتوي على منتج يتم شحنه مباشرة من المورد. يرجى تعطيل خيار \"تحديث المخزون\" أو إزالة المنتج الذي يتم شحنه مباشرة من المورد." @@ -53097,11 +53141,11 @@ msgstr "توقف السبب" msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "لا يمكن إلغاء طلب العمل المتوقف ، قم بإلغاء إيقافه أولاً للإلغاء" -#: erpnext/setup/doctype/company/company.py:452 +#: erpnext/setup/doctype/company/company.py:454 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:537 -#: erpnext/stock/doctype/item/item.py:329 -#: erpnext/stock/doctype/item/item.py:1776 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:334 +#: erpnext/stock/doctype/item/item.py:1781 erpnext/tests/utils.py:249 msgid "Stores" msgstr "مخازن" @@ -53215,12 +53259,8 @@ msgstr "طلب مقاولة فرعية" #. Name of a report #. Label of a Link in the Manufacturing Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontract Order Summary" msgstr "ملخص أمر التعاقد من الباطن" @@ -53238,16 +53278,14 @@ msgstr "البند من الباطن" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Item To Be Received" msgstr "البند المتعاقد عليه من الباطن" -#: erpnext/stock/doctype/material_request/material_request.js:224 +#: erpnext/stock/doctype/material_request/material_request.js:227 msgid "Subcontracted Purchase Order" msgstr "أمر شراء من الباطن" @@ -53263,12 +53301,10 @@ msgstr "الكمية المتعاقد عليها من الباطن" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Raw Materials To Be Transferred" msgstr "المواد الخام المتعاقد عليها من الباطن" @@ -53278,25 +53314,19 @@ msgstr "المواد الخام المتعاقد عليها من الباطن" #. 'Production Plan Sub Assembly Item' #. Label of a Card Break in the Manufacturing Workspace #. Option for the 'Purpose' (Select) field in DocType 'Material Request' -#. Name of a Workspace -#. Title of a Workspace Sidebar #: erpnext/desktop_icon/subcontracting.json #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:10 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting" msgstr "التعاقد من الباطن" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting BOM" msgstr "قائمة مواد التعاقد من الباطن" @@ -53311,14 +53341,10 @@ msgstr "معامل تحويل التعاقد من الباطن" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/setup/setup_wizard/operations/install_fixtures.py:132 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:158 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Delivery" msgstr "تسليم المشاريع عن طريق التعاقد من الباطن" @@ -53342,24 +53368,14 @@ msgstr "التعاقد من الباطن داخلياً" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Name of a DocType -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/selling/doctype/sales_order/sales_order.js:1049 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Inward Order" msgstr "طلب وارد من الباطن" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward Order Count" -msgstr "عدد الطلبات الواردة من الباطن" - #. Label of the subcontracting_inward_order_item (Data) field in DocType 'Work #. Order' #. Name of a DocType @@ -53392,7 +53408,6 @@ msgstr "بند خدمة طلب داخلي للتعاقد من الباطن" #. Receipt Item' #. Label of the subcontracting_order (Link) field in DocType 'Subcontracting #. Receipt Supplied Item' -#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:370 #: erpnext/controllers/subcontracting_controller.py:1156 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -53402,7 +53417,6 @@ msgstr "بند خدمة طلب داخلي للتعاقد من الباطن" #: 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 msgid "Subcontracting Order" msgstr "أمر التعاقد من الباطن" @@ -53436,18 +53450,6 @@ msgstr "بند مورد من طلب التعاقد من الباطن" msgid "Subcontracting Order {0} created." msgstr "تم إنشاء أمر التعاقد من الباطن {0} ." -#. Label of a chart in the Subcontracting Workspace -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order" -msgstr "التعاقد من الباطن على الطلبات الخارجية" - -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order Count" -msgstr "عدد الطلبات الخارجية المُسندة إلى مقاولين فرعيين" - #. Label of the purchase_order (Link) field in DocType 'Subcontracting Order' #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json msgid "Subcontracting Purchase Order" @@ -53463,8 +53465,6 @@ msgstr "أمر شراء تعاقد من الباطن" #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' #. Name of a DocType -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json @@ -53472,8 +53472,6 @@ msgstr "أمر شراء تعاقد من الباطن" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:637 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Receipt" msgstr "إيصال التعاقد من الباطن" @@ -53589,7 +53587,6 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_subscription/process_subscription.json @@ -53604,7 +53601,6 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation_dashboard.py:12 #: erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py:25 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py:34 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription" msgstr "اشتراك" @@ -53639,10 +53635,8 @@ msgstr "فترة الاكتتاب" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_plan/subscription_plan.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Plan" msgstr "خطة الاشتراك" @@ -53668,7 +53662,6 @@ msgstr "يعتمد سعر الاشتراك على" #: erpnext/accounts/doctype/subscription_settings/subscription_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/workspace_sidebar/erpnext_settings.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Settings" msgstr "إعدادات الاشتراك" @@ -53681,11 +53674,7 @@ msgstr "تاريخ بدء الاشتراك" msgid "Subscription for Future dates cannot be processed." msgstr "لا يمكن معالجة الاشتراكات للتواريخ المستقبلية." -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/subscriptions/subscriptions.json #: erpnext/selling/doctype/customer/customer_dashboard.py:28 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscriptions" msgstr "الاشتراكات" @@ -53724,7 +53713,7 @@ msgstr "تمت التسوية بنجاح\\n
    \\nSuccessfully Reconciled" msgid "Successfully Set Supplier" msgstr "بنجاح تعيين المورد" -#: erpnext/stock/doctype/item/item.py:409 +#: erpnext/stock/doctype/item/item.py:414 msgid "Successfully changed Stock UOM, please redefine conversion factors for new UOM." msgstr "تم تغيير وحدة قياس المخزون بنجاح، يرجى إعادة تعريف عوامل التحويل لوحدة القياس الجديدة." @@ -53744,11 +53733,11 @@ msgstr "تم استيراد {0} سجل بنجاح من أصل {1}. انقر عل msgid "Successfully imported {0} records." msgstr "تم استيراد السجلات {0} بنجاح." -#: erpnext/buying/doctype/supplier/supplier.js:243 +#: erpnext/buying/doctype/supplier/supplier.js:252 msgid "Successfully linked to Customer" msgstr "تم ربط العميل بنجاح" -#: erpnext/selling/doctype/customer/customer.js:275 +#: erpnext/selling/doctype/customer/customer.js:284 msgid "Successfully linked to Supplier" msgstr "تم الربط بنجاح مع المورد" @@ -53911,7 +53900,7 @@ msgstr "الموردة الكمية" #: erpnext/public/js/purchase_trends_filters.js:63 #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/regional/report/irs_1099/irs_1099.py:76 -#: erpnext/selling/doctype/customer/customer.js:257 +#: erpnext/selling/doctype/customer/customer.js:266 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:187 #: erpnext/selling/doctype/sales_order/sales_order.js:1741 @@ -53930,7 +53919,6 @@ msgstr "الموردة الكمية" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:524 #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Supplier" msgstr "المورد" @@ -54208,7 +54196,7 @@ msgstr "مستخدمو بوابة الموردين" #: erpnext/buying/workspace/buying/buying.json #: erpnext/crm/doctype/opportunity/opportunity.js:81 #: erpnext/selling/doctype/quotation/quotation.json -#: erpnext/stock/doctype/material_request/material_request.js:208 +#: erpnext/stock/doctype/material_request/material_request.js:211 #: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation" msgstr "التسعيرة من المورد" @@ -54464,7 +54452,7 @@ msgstr "بدأت عملية المزامنة" msgid "Synchronize all accounts every hour" msgstr "مزامنة جميع الحسابات كل ساعة" -#: erpnext/accounts/doctype/account/account.py:676 +#: erpnext/accounts/doctype/account/account.py:683 msgid "System In Use" msgstr "النظام قيد الاستخدام" @@ -54511,9 +54499,7 @@ msgid "TDS / withholding tax category applied when paying this supplier" msgstr "" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.json -#: erpnext/workspace_sidebar/taxes.json msgid "TDS Computation Summary" msgstr "ملخص حساب TDS" @@ -54668,7 +54654,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:826 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:825 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "المخزن المستهدف" @@ -54788,7 +54774,7 @@ msgstr "حساب الضرائب" #. Label of the amount (Currency) field in DocType 'Item Wise Tax Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:244 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:91 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:101 msgid "Tax Amount" msgstr "مبلغ الضريبة" @@ -54868,7 +54854,6 @@ msgstr "تفكيك الضرائب" #. Label of the tax_category (Link) field in DocType 'Delivery Note' #. Label of the tax_category (Link) field in DocType 'Item Tax' #. Label of the tax_category (Link) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -54888,7 +54873,6 @@ msgstr "تفكيك الضرائب" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Category" msgstr "الفئة الضريبية" @@ -54927,7 +54911,7 @@ msgstr "الرقم الضريبي" #: erpnext/accounts/report/sales_register/sales_register.py:229 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:67 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:205 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:57 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:67 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Tax Id" @@ -54967,7 +54951,7 @@ msgid "Tax Rate" msgstr "معدل الضريبة" #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:237 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:84 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:94 msgid "Tax Rate %" msgstr "معدل الضريبة %" @@ -54987,10 +54971,8 @@ msgstr "صف الضرائب" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Rule" msgstr "القاعدة الضريبية" @@ -55049,7 +55031,6 @@ msgstr "حساب حجب الضرائب" #. Label of the tax_withholding_category (Link) field in DocType 'Lower #. Deduction Certificate' #. Label of the tax_withholding_category (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -55057,19 +55038,16 @@ msgstr "حساب حجب الضرائب" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:199 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:72 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:82 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Category" msgstr "فئة حجب الضرائب" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Details" msgstr "تفاصيل حجب الضرائب" @@ -55114,7 +55092,6 @@ msgstr "قيد اقتطاع الضريبة" #. Rate' #. Label of the tax_withholding_group (Link) field in DocType 'Supplier' #. Label of the tax_withholding_group (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -55124,7 +55101,6 @@ msgstr "قيد اقتطاع الضريبة" #: erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Group" msgstr "مجموعة حجز الضرائب" @@ -55191,12 +55167,10 @@ msgstr "نوع المستند الخاضع للضريبة" #. Label of the taxes (Table) field in DocType 'POS Closing Entry' #. Label of the taxes_section (Section Break) field in DocType 'POS Profile' #. Label of the sb_1 (Section Break) field in DocType 'Subscription' -#. Name of a Workspace #. Label of a Desktop Icon #. Label of the taxes_section (Section Break) field in DocType 'Sales Order' #. Label of the taxes (Table) field in DocType 'Item Group' #. Label of the taxes (Table) field in DocType 'Item' -#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html:60 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -55204,10 +55178,10 @@ msgstr "نوع المستند الخاضع للضريبة" #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:12 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:27 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:43 -#: erpnext/accounts/workspace/taxes/taxes.json erpnext/desktop_icon/taxes.json +#: erpnext/desktop_icon/taxes.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/item_group/item_group.json -#: erpnext/stock/doctype/item/item.json erpnext/workspace_sidebar/taxes.json +#: erpnext/stock/doctype/item/item.json msgid "Taxes" msgstr "الضرائب" @@ -55330,7 +55304,7 @@ msgstr "خصم الضرائب والرسوم" msgid "Taxes and Charges Deducted (Company Currency)" msgstr "الضرائب والرسوم مقطوعة (عملة الشركة)" -#: erpnext/stock/doctype/item/item.py:422 +#: erpnext/stock/doctype/item/item.py:427 msgid "Taxes row #{0}: {1} cannot be smaller than {2}" msgstr "لا يمكن أن يكون صف الضرائب #{0}: {1} أصغر من {2}" @@ -55381,7 +55355,7 @@ msgstr "تلفزيون" msgid "Template Item" msgstr "عنصر القالب" -#: erpnext/stock/get_item_details.py:358 +#: erpnext/stock/get_item_details.py:357 msgid "Template Item Selected" msgstr "تم تحديد عنصر القالب" @@ -55504,7 +55478,6 @@ msgstr "نموذج الشروط" #. Name of a DocType #. Label of the terms (Text Editor) field in DocType 'Terms and Conditions' #. Label of the terms (Text Editor) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -55519,7 +55492,6 @@ msgstr "نموذج الشروط" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Terms and Conditions" msgstr "الشروط والأحكام" @@ -55763,7 +55735,7 @@ msgstr "لا يمكن تحديث قائمة الاختيار التي تحتوي msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1384 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1397 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" msgstr "" @@ -55775,7 +55747,7 @@ msgstr "يرتبط مندوب المبيعات بـ {0}" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "الرقم التسلسلي في الصف #{0}: {1} غير متوفر في المستودع {2}." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2763 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2765 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "الرقم التسلسلي {0} محجوز مقابل {1} {2} ولا يمكن استخدامه لأي معاملة أخرى." @@ -55783,7 +55755,7 @@ msgstr "الرقم التسلسلي {0} محجوز مقابل {1} {2} ولا ي msgid "The Serial Nos {0} have not been supplied against the {1} {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:959 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:972 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 "حزمة البيانات التسلسلية والدفعية {0} غير صالحة لهذه المعاملة. يجب أن يكون \"نوع المعاملة\" \"خارجي\" بدلاً من \"داخلي\" في حزمة البيانات التسلسلية والدفعية {0}" @@ -55819,9 +55791,9 @@ msgstr "" msgid "The bank account is not a company account. Please select a company account" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:654 -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 "تم حجز الدفعة {0} بالفعل في {1} {2}. لذا، لا يمكن المتابعة مع {3} {4}، والتي تم إنشاؤها مقابل {5} {6}." +#: erpnext/stock/services/serial_batch_bundle_service.py:655 +msgid "The batch {0} is reserved for {1} in the warehouse {2} and the remaining quantity is not enough to cover the reservations. So, cannot proceed with the {3} {4}." +msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:41 msgid "The company {0} is not in South Africa. VAT Audit Report is only available for companies in South Africa." @@ -55888,7 +55860,7 @@ msgstr "لا يمكن ترك الحقل للمساهم فارغا" msgid "The field {0} in row {1} is not set" msgstr "الحقل {0} في الصف {1} غير مُعيّن" -#: erpnext/stock/stock_ledger.py:445 +#: erpnext/stock/stock_ledger.py:475 msgid "The field {0} is required for reposting" msgstr "" @@ -55917,7 +55889,7 @@ msgstr "أرقام الورقة غير متطابقة" msgid "The following Items, having Putaway Rules, could not be accommodated:" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:137 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:140 msgid "The following Purchase Invoices are not submitted:" msgstr "لم يتم تقديم فواتير الشراء التالية:" @@ -55933,7 +55905,7 @@ msgstr "" msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "" -#: erpnext/stock/doctype/item/item.py:953 +#: erpnext/stock/doctype/item/item.py:958 msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "توجد السمات المحذوفة التالية في المتغيرات ولكن ليس في القالب. يمكنك إما حذف المتغيرات أو الاحتفاظ بالسمة (السمات) في القالب." @@ -55950,11 +55922,11 @@ msgid "The following payment schedule(s) already exist:\n" "{0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:111 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:114 msgid "The following rows are duplicates:" msgstr "الصفوف التالية مكررة:" -#: erpnext/stock/doctype/material_request/material_request.py:566 +#: erpnext/stock/doctype/material_request/material_request.py:605 msgid "The following {0} were created: {1}" msgstr "تم إنشاء {0} التالية: {1}" @@ -55977,15 +55949,15 @@ msgstr "عطلة على {0} ليست بين من تاريخ وإلى تاريخ" msgid "The invoice is not fully allocated as there is a difference of {0}." msgstr "" -#: erpnext/controllers/buying_controller.py:1244 +#: erpnext/controllers/buying_controller.py:1252 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "العنصر {item} غير مُصنّف كعنصر {type_of} . يمكنك تفعيله كعنصر {type_of} من قائمة العناصر الرئيسية." -#: erpnext/stock/doctype/item/item.py:679 +#: erpnext/stock/doctype/item/item.py:684 msgid "The items {0} and {1} are present in the following {2} :" msgstr "العنصران {0} و {1} موجودان في العنصر التالي {2} :" -#: erpnext/controllers/buying_controller.py:1237 +#: erpnext/controllers/buying_controller.py:1245 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "العناصر {items} غير مصنفة كعناصر {type_of} . يمكنك تفعيلها كعناصر {type_of} من قائمة العناصر الرئيسية الخاصة بها." @@ -56001,7 +55973,7 @@ msgstr "بطاقة العمل {0} في حالة {1} ولا يمكنك تشغيل msgid "The last account row must not have any debit or credit amounts set." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:533 +#: erpnext/public/js/utils/barcode_scanner.js:542 msgid "The last scanned warehouse has been cleared and won't be set in the subsequently scanned items" msgstr "تم مسح آخر مستودع تم مسحه ضوئيًا ولن يتم تعيينه في العناصر التي سيتم مسحها ضوئيًا لاحقًا" @@ -56043,7 +56015,7 @@ msgstr "ينبغي تجميع الفاتورة الأصلية قبل أو مع msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:234 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:235 msgid "The parent account {0} does not exists in the uploaded template" msgstr "الحساب الأصل {0} غير موجود في القالب الذي تم تحميله" @@ -56106,7 +56078,7 @@ msgstr "سيتم تحرير المخزون المحجوز. هل أنت متأك msgid "The root account {0} must be a group" msgstr "يجب أن يكون حساب الجذر {0} مجموعة" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:87 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:88 msgid "The selected BOMs are not for the same item" msgstr "قواائم المواد المحددة ليست لنفس البند" @@ -56118,7 +56090,7 @@ msgstr "" msgid "The selected item cannot have Batch" msgstr "العنصر المحدد لا يمكن أن يكون دفعة" -#: erpnext/assets/doctype/asset/asset.js:662 +#: erpnext/assets/doctype/asset/asset.js:670 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 "كمية البيع أقل من إجمالي كمية الأصل. سيتم تقسيم الكمية المتبقية إلى أصل جديد. لا يمكن التراجع عن هذا الإجراء.

    هل تريد المتابعة؟" @@ -56147,7 +56119,7 @@ msgstr "الأسهم موجودة بالفعل" msgid "The shares don't exist with the {0}" msgstr "الأسهم غير موجودة مع {0}" -#: erpnext/stock/stock_ledger.py:908 +#: erpnext/stock/stock_ledger.py:956 msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." msgstr "كان رصيد الصنف {0} في المستودع {1} سالبًا في {2}. يجب عليك إنشاء قيد موجب {3} قبل التاريخ {4} والوقت {5} لتسجيل معدل التقييم الصحيح. لمزيد من التفاصيل، يُرجى قراءة الوثائق ." @@ -56181,11 +56153,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:352 +#: erpnext/stock/doctype/material_request/material_request.py:391 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:359 +#: erpnext/stock/doctype/material_request/material_request.py:398 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "لا يمكن أن تتجاوز كمية الإصدار / التحويل الإجمالية {0} في طلب المواد {1} الكمية المطلوبة {2} للصنف {3}" @@ -56253,11 +56225,11 @@ msgstr "يجب أن يكون {0} ({1}) مساويًا لـ {2} ({3})" msgid "The {0} contains Unit Price Items." msgstr "يحتوي {0} على عناصر سعر الوحدة." -#: erpnext/stock/doctype/item/item.py:493 +#: erpnext/stock/doctype/item/item.py:498 msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error." msgstr "البادئة {0} '{1}' موجودة بالفعل. يُرجى تغيير رقم التسلسل، وإلا ستظهر لك رسالة خطأ \"إدخال مكرر\"." -#: erpnext/stock/doctype/material_request/material_request.py:572 +#: erpnext/stock/doctype/material_request/material_request.py:611 msgid "The {0} {1} created successfully" msgstr "تم إنشاء {0} {1} بنجاح" @@ -56318,7 +56290,7 @@ msgstr "لا توجد مواعيد متاحة في هذا التاريخ" msgid "There are no transactions in the system for the selected bank account and dates that match the filters." msgstr "" -#: erpnext/stock/doctype/item/item.js:1591 +#: erpnext/stock/doctype/item/item.js:1608 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 "هناك خياران لتقييم المخزون: طريقة الوارد أولاً يُصرف أولاً (FIFO) وطريقة المتوسط المتحرك. لفهم هذا الموضوع بالتفصيل، يُرجى زيارة تقييم الأصناف، وطريقة الوارد أولاً يُصرف أولاً، وطريقة المتوسط المتحرك." @@ -56354,7 +56326,7 @@ msgstr "لم يتم العثور على دفعة بالمقابلة مع {0}: {1 msgid "There is one unreconciled transaction before {0}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:896 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:909 msgid "There must be at least 1 Finished Good in this Stock Entry" msgstr "" @@ -56402,11 +56374,11 @@ msgstr "يحتوي هذا الحساب على رصيد \"0\" سواء بالعم msgid "This Fiscal Year" msgstr "" -#: erpnext/stock/doctype/item/item.js:224 +#: erpnext/stock/doctype/item/item.js:235 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:281 +#: erpnext/stock/doctype/item/item.js:292 msgid "This Item is a Variant of {0} (Template)." msgstr "هذا العنصر هو متغير {0} (قالب)." @@ -56533,7 +56505,7 @@ msgstr "هذه هي مجموعة العملاء الجذرية والتي لا msgid "This is a root department and cannot be edited." msgstr "هذا هو قسم الجذر ولا يمكن تحريره." -#: erpnext/setup/doctype/item_group/item_group.js:98 +#: erpnext/setup/doctype/item_group/item_group.js:115 msgid "This is a root item group and cannot be edited." msgstr "هذه هي مجموعة البند الجذرية والتي لا يمكن تحريرها." @@ -56573,7 +56545,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:1579 +#: erpnext/stock/doctype/item/item.js:1596 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 "هذا الخيار مخصص للمواد الخام التي ستُستخدم في تصنيع المنتجات النهائية. إذا كانت المادة خدمة إضافية مثل \"الغسيل\" التي ستُستخدم في قائمة المواد، فاترك هذا الخيار غير مُحدد." @@ -56656,7 +56628,7 @@ msgstr "تم إنشاء هذا الجدول عندما تم تعديل الأص msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "تم إنشاء هذا الجدول عندما تم استهلاك الأصل {0} من خلال رسملة الأصل {1}." -#: erpnext/assets/doctype/asset_repair/asset_repair.py:328 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:331 msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "تم إنشاء هذا الجدول عندما تم إصلاح الأصل {0} من خلال إصلاح الأصل {1}." @@ -57223,7 +57195,7 @@ msgstr "إلى مستودع (اختياري)" msgid "To add Operations tick the 'With Operations' checkbox." msgstr "لإضافة عمليات، حدد خانة الاختيار \"مع العمليات\"." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:770 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:768 msgid "To add subcontracted Item's raw materials if include exploded items is disabled." msgstr "لإضافة المواد الخام للعنصر المتعاقد عليه من الباطن في حالة تعطيل خيار تضمين العناصر المفككة." @@ -57267,7 +57239,7 @@ msgstr "لإنشاء مستند مرجع طلب الدفع مطلوب" msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:763 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:761 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "لإدراج الأصناف غير المخزنة في تخطيط طلب المواد. أي الأصناف التي لم يتم تحديد خانة \"الحفاظ على المخزون\" لها." @@ -57282,7 +57254,7 @@ msgstr "" msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "ل تشمل الضريبة في الصف {0} في معدل الإغلاق ، {1} ويجب أيضا تضمين الضرائب في الصفوف" -#: erpnext/stock/doctype/item/item.py:701 +#: erpnext/stock/doctype/item/item.py:706 msgid "To merge, following properties must be same for both items" msgstr "لدمج ، يجب أن يكون نفس الخصائص التالية ل كلا البندين" @@ -57542,10 +57514,6 @@ msgstr "إجمالي الأصول" msgid "Total Asset Cost" msgstr "إجمالي تكلفة الأصول" -#: erpnext/assets/dashboard_fixtures.py:158 -msgid "Total Assets" -msgstr "إجمالي الأصول" - #. Label of the total_billable_amount (Currency) field in DocType 'Timesheet' #: erpnext/projects/doctype/timesheet/timesheet.json msgid "Total Billable Amount" @@ -58057,7 +58025,7 @@ msgstr "إجمالي المهام" msgid "Total Tax" msgstr "مجموع الضرائب" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:86 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:96 msgid "Total Taxable Amount" msgstr "" @@ -58221,7 +58189,7 @@ msgstr "إجمالي وقت العمل على محطة العمل (بالساع msgid "Total allocated percentage for sales team should be 100" msgstr "مجموع النسبة المئوية المخصصة ل فريق المبيعات يجب أن يكون 100" -#: erpnext/selling/doctype/customer/customer.py:197 +#: erpnext/selling/doctype/customer/customer.py:205 msgid "Total contribution percentage should be equal to 100" msgstr "يجب أن تكون نسبة المساهمة الإجمالية مساوية 100" @@ -58380,7 +58348,7 @@ msgstr "تاريخ المعاملة" msgid "Transaction Dates" msgstr "" -#: erpnext/setup/doctype/company/company.py:1140 +#: erpnext/setup/doctype/company/company.py:1142 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "" @@ -58561,9 +58529,10 @@ msgstr "المعاملات السنوية التاريخ" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "توجد بالفعل معاملات مسجلة على الشركة! لا يمكن استيراد دليل الحسابات إلا لشركة ليس لديها أي معاملات." -#. Description of the 'Credit Limit' (Table) field in DocType 'Customer' +#. Description of the 'Credit & Overdue Limits' (Table) field in DocType +#. 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Transactions are blocked or warned when outstanding balance exceeds this amount." +msgid "Transactions are blocked when the outstanding balance exceeds the credit limit. When the overdue billing setting is enabled, new invoices are also blocked when the customer's overdue amount exceeds the overdue billing threshold." msgstr "" #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:239 @@ -58605,7 +58574,7 @@ msgstr "نقل" msgid "Transfer Account" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:168 msgid "Transfer Asset" msgstr "نقل الأصول" @@ -58615,7 +58584,7 @@ msgstr "نقل الأصول" msgid "Transfer Extra Raw Materials to WIP (%)" msgstr "تحويل المواد الخام الزائدة إلى المنتجات قيد التصنيع (%)" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:485 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:483 msgid "Transfer From Warehouses" msgstr "النقل من المستودعات" @@ -58633,7 +58602,7 @@ msgstr "نقل المواد ضد" msgid "Transfer Materials" msgstr "مواد النقل" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:479 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:477 msgid "Transfer Materials For Warehouse {0}" msgstr "نقل المواد للمستودع {0}" @@ -58712,7 +58681,7 @@ msgstr "" msgid "Transit" msgstr "عبور" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:611 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:610 msgid "Transit Entry" msgstr "مدخل النقل" @@ -59046,7 +59015,7 @@ msgstr "إعدادات ضريبة القيمة المضافة في الإمار #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:101 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:87 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:92 #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/item_where_used/item_where_used.py:69 #: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:60 @@ -59112,7 +59081,7 @@ msgstr "" msgid "UOM Conversion Factor" msgstr "عامل تحويل وحدة القياس" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:520 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:526 msgid "UOM Conversion factor ({0} -> {1}) not found for item: {2}" msgstr "معامل تحويل UOM ({0} -> {1}) غير موجود للعنصر: {2}" @@ -59131,7 +59100,7 @@ msgstr "" msgid "UOM Name" msgstr "اسم وحدة القايس" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1693 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1728 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "معامل تحويل وحدة القياس المطلوب لوحدة القياس: {0} في العنصر: {1}" @@ -59324,7 +59293,7 @@ msgstr "وحدة القياس" msgid "Unit of Measure (UOM)" msgstr "وحدة القياس" -#: erpnext/stock/doctype/item/item.py:454 +#: erpnext/stock/doctype/item/item.py:459 msgid "Unit of Measure {0} has been entered more than once in Conversion Factor Table" msgstr "وحدة القياس {0} تم إدخال أكثر من مرة واحدة في معامل التحويل الجدول" @@ -59428,7 +59397,6 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Unreconcile Payment" @@ -59492,7 +59460,7 @@ msgstr "إلغاء الحجز للتجميع الفرعي" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:552 -#: erpnext/stock/doctype/pick_list/pick_list.js:321 +#: erpnext/stock/doctype/pick_list/pick_list.js:322 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:389 msgid "Unreserving Stock..." msgstr "إلغاء الحجز على الأسهم..." @@ -59769,7 +59737,7 @@ msgstr "تم تحديث صف (صفوف) التقرير المالي {0} باسم msgid "Updating Costing and Billing fields against this Project..." msgstr "تحديث حقول التكاليف والفواتير لهذا المشروع..." -#: erpnext/stock/doctype/item/item.py:1541 +#: erpnext/stock/doctype/item/item.py:1546 msgid "Updating Variants..." msgstr "جارٍ تحديث المتغيرات ..." @@ -59967,7 +59935,7 @@ msgstr "" msgid "Use Transaction Date Exchange Rate" msgstr "استخدم سعر صرف تاريخ المعاملة" -#: erpnext/projects/doctype/project/project.py:639 +#: erpnext/projects/doctype/project/project.py:669 msgid "Use a name that is different from previous project name" msgstr "استخدم اسمًا مختلفًا عن اسم المشروع السابق" @@ -60012,6 +59980,12 @@ msgstr "" msgid "Used for items valued at Standard Cost: the difference between the purchase price and the standard rate is booked here." msgstr "" +#. Description of the 'Expenses Added To Stock Contra Account' (Link) field in +#. DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Used to balance the books when recording expenses added to stock" +msgstr "" + #. Description of the 'Purchase Expense Contra Account' (Link) field in DocType #. 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json @@ -60118,6 +60092,12 @@ msgstr "يُسمح للمستخدمين الذين لديهم هذا الدور msgid "Users with this role are allowed to over deliver/receive against orders above the allowance percentage" msgstr "يُسمح للمستخدمين الذين لديهم هذا الدور بتسليم/استلام كميات زائدة عن النسبة المسموح بها في الطلبات." +#. Description of the 'Role allowed to bypass overdue billing limit' (Link) +#. field in DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Users with this role can still submit invoices for customers over their overdue billing threshold." +msgstr "" + #. Description of the 'Role to Notify on Depreciation Failure' (Link) field in #. DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -60333,7 +60313,7 @@ msgstr "نوع حقل التقييم" msgid "Valuation Method" msgstr "طريقة التقييم" -#: erpnext/stock/doctype/item/item.py:1074 +#: erpnext/stock/doctype/item/item.py:1079 msgid "Valuation Method cannot be changed to or from 'Standard Cost' for {0} because stock transactions already exist for it." msgstr "" @@ -60370,7 +60350,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json -#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:976 +#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:993 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json @@ -60378,7 +60358,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:164 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:90 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:68 #: erpnext/stock/report/stock_balance/stock_balance.py:563 @@ -60389,19 +60369,19 @@ msgstr "سعر التقييم" msgid "Valuation Rate (In / Out)" msgstr "معدل التقييم (داخل / خارج)" -#: erpnext/stock/stock_ledger.py:2161 +#: erpnext/stock/stock_ledger.py:2209 msgid "Valuation Rate Missing" msgstr "معدل التقييم مفقود" -#: erpnext/stock/doctype/item/item.py:1652 +#: erpnext/stock/doctype/item/item.py:1657 msgid "Valuation Rate cannot be negative." msgstr "" -#: erpnext/stock/stock_ledger.py:2139 +#: erpnext/stock/stock_ledger.py:2187 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "معدل التقييم للعنصر {0} ، مطلوب لإجراء إدخالات محاسبية لـ {1} {2}." -#: erpnext/stock/doctype/item/item.py:316 +#: erpnext/stock/doctype/item/item.py:321 msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "معدل التقييم إلزامي إذا ادخلت قيمة مبدئية للمخزون\\n
    \\nValuation Rate is mandatory if Opening Stock entered" @@ -60559,13 +60539,13 @@ msgstr "فرق" msgid "Variance ({})" msgstr "التباين ({})" -#: erpnext/stock/doctype/item/item.js:271 +#: erpnext/stock/doctype/item/item.js:282 #: erpnext/stock/doctype/item/item_list.js:61 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" msgstr "مختلف" -#: erpnext/stock/doctype/item/item.py:968 +#: erpnext/stock/doctype/item/item.py:973 msgid "Variant Attribute Error" msgstr "خطأ في سمة المتغير" @@ -60584,11 +60564,11 @@ msgstr "المتغير BOM" msgid "Variant Based On" msgstr "البديل القائم على" -#: erpnext/stock/doctype/item/item.py:996 +#: erpnext/stock/doctype/item/item.py:1001 msgid "Variant Based On cannot be changed" msgstr "لا يمكن تغيير المتغير بناءً على" -#: erpnext/stock/doctype/item/item.js:247 +#: erpnext/stock/doctype/item/item.js:258 msgid "Variant Details Report" msgstr "تفاصيل تقرير التقرير" @@ -60602,7 +60582,7 @@ msgstr "الحقل البديل" msgid "Variant Item" msgstr "عنصر متغير" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Variant Items" msgstr "العناصر المتغيرة" @@ -60613,7 +60593,7 @@ msgstr "العناصر المتغيرة" msgid "Variant Of" msgstr "البديل من" -#: erpnext/stock/doctype/item/item.js:1264 +#: erpnext/stock/doctype/item/item.js:1281 msgid "Variant creation has been queued." msgstr "وقد وضعت قائمة الانتظار في قائمة الانتظار." @@ -61274,7 +61254,7 @@ msgstr "" msgid "Warehouse not found against the account {0}" msgstr "لم يتم العثور على المستودع مقابل الحساب {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:896 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:902 #: erpnext/stock/doctype/delivery_note/delivery_note.py:401 msgid "Warehouse required for stock Item {0}" msgstr "مستودع الأسهم المطلوبة لل تفاصيل {0}" @@ -61288,7 +61268,7 @@ msgstr "مستودع الحكيم البند الرصيد العمر والقي msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "مستودع {0} لا يمكن حذف كما توجد كمية القطعة ل {1}" -#: erpnext/stock/doctype/item/item.py:1657 +#: erpnext/stock/doctype/item/item.py:1662 #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:67 msgid "Warehouse {0} does not belong to Company {1}." msgstr "المستودع {0} لا ينتمي إلى الشركة {1}." @@ -61305,7 +61285,7 @@ msgstr "المستودع {0} غير موجود" msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "لا يُسمح باستخدام المستودع {0} في أمر البيع {1}، بل يجب أن يكون {2}" -#: erpnext/stock/services/base_stock_gl_composer.py:147 +#: erpnext/stock/services/base_stock_gl_composer.py:154 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 "المستودع {0} غير مرتبط بأي حساب، يرجى ذكر الحساب في سجل المستودع أو تعيين حساب المخزون الافتراضي في الشركة {1}." @@ -61315,7 +61295,7 @@ msgstr "المستودع: {0} لا ينتمي إلى {1}" #. Label of the warehouses (Table MultiSelect) field in DocType 'Production #. Plan' -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:555 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:553 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/stock/report/stock_balance/stock_balance.js:76 #: erpnext/stock/report/stock_ledger/stock_ledger.js:30 @@ -61418,7 +61398,7 @@ msgstr "" msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "تحذير - الصف {0}: ساعات الفوترة أكثر من الساعات الفعلية" -#: erpnext/stock/stock_ledger.py:918 +#: erpnext/stock/stock_ledger.py:966 msgid "Warning on Negative Stock" msgstr "تحذير بشأن الأسهم السلبية" @@ -61434,7 +61414,7 @@ msgstr "" msgid "Warning: Another {0} # {1} exists against stock entry {2}" msgstr "تحذير: {0} أخر # {1} موجود في مدخل المخزن {2}\\n
    \\nWarning: Another {0} # {1} exists against stock entry {2}" -#: erpnext/stock/doctype/material_request/material_request.js:534 +#: erpnext/stock/doctype/material_request/material_request.js:535 msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "تحذير : كمية المواد المطلوبة هي أقل من الحد الأدنى للطلب الكمية" @@ -61730,7 +61710,7 @@ 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:1598 +#: erpnext/stock/doctype/item/item.js:1615 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "عند إنشاء عنصر، سيؤدي إدخال قيمة لهذا الحقل إلى إنشاء سعر العنصر تلقائيًا في الواجهة الخلفية." @@ -61896,7 +61876,7 @@ msgstr "العمل المنجز" #: erpnext/assets/doctype/asset/asset_list.js:12 #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json -#: erpnext/setup/doctype/company/company.py:453 +#: erpnext/setup/doctype/company/company.py:455 #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Work In Progress" msgstr "التقدم في العمل" @@ -61938,9 +61918,9 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/public/js/shop_floor/shop_floor.js:230 #: erpnext/selling/doctype/sales_order/sales_order.js:1094 -#: erpnext/stock/doctype/material_request/material_request.js:216 +#: erpnext/stock/doctype/material_request/material_request.js:219 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:573 +#: erpnext/stock/doctype/material_request/material_request.py:612 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -62020,7 +62000,7 @@ msgstr "ملخص أمر العمل" msgid "Work Order Summary Report" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:579 +#: erpnext/stock/doctype/material_request/material_request.py:618 msgid "Work Order cannot be created for the following reason:
    {0}" msgstr "" @@ -62054,7 +62034,7 @@ msgid "Work Order {0} must be submitted" msgstr "" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:567 +#: erpnext/stock/doctype/material_request/material_request.py:606 msgid "Work Orders" msgstr "طلبات العمل" @@ -62219,7 +62199,7 @@ msgstr "محطات العمل" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:736 +#: erpnext/setup/doctype/company/company.py:738 msgid "Write Off" msgstr "لا تصلح" @@ -62388,6 +62368,10 @@ msgstr "أنت غير مخول بإجراء/تعديل معاملات المخز msgid "You are not authorized to set Frozen value" msgstr ".أنت غير مخول لتغيير القيم المجمدة" +#: erpnext/stock/doctype/company_restriction/company_restriction.py:93 +msgid "You are not permitted to add or remove Company {0} in Allowed Companies" +msgstr "" + #: erpnext/stock/doctype/pick_list/pick_list.py:544 msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}." msgstr "أنت تختار كمية أكبر من الكمية المطلوبة للصنف {0}. تحقق مما إذا كانت هناك أي قائمة اختيار أخرى تم إنشاؤها لطلب البيع {1}." @@ -62408,7 +62392,7 @@ msgstr "يمكنك أيضا نسخ - لصق هذا الرابط في متصفح msgid "You can also set default CWIP account in Company {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:767 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "يمكنك تغيير الحساب الرئيسي إلى حساب الميزانية العمومية أو تحديد حساب مختلف." @@ -62485,7 +62469,7 @@ msgstr "لا يمكنك حذف مشروع من نوع 'خارجي'" msgid "You cannot edit the root node." msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:205 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "لا يمكنك تفعيل كل من الإعدادين '{0}' و '{1}'." @@ -62505,7 +62489,7 @@ msgstr "" msgid "You cannot redeem more than {0}." msgstr "لا يمكنك استرداد أكثر من {0}." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:220 msgid "You cannot repost item valuation before {0}" msgstr "" @@ -62521,7 +62505,7 @@ msgstr "" msgid "You cannot submit the order without payment." msgstr "لا يمكنك تقديم الطلب بدون دفع." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:974 msgid "You cannot update stock for a Debit Note. A Debit Note is a financial document that should not affect inventory. Please disable 'Update Stock'." msgstr "" @@ -62578,7 +62562,7 @@ msgstr "" msgid "You have already selected items from {0} {1}" msgstr "لقد حددت العناصر من {0} {1}" -#: erpnext/projects/doctype/project/project.py:420 +#: erpnext/projects/doctype/project/project.py:422 msgid "You have been invited to collaborate on the project {0}." msgstr "لقد تمت دعوتك للمشاركة في المشروع {0}." @@ -62602,7 +62586,7 @@ msgstr "" msgid "You have not performed any reconciliations in this session yet." msgstr "" -#: erpnext/stock/doctype/item/item.py:1215 +#: erpnext/stock/doctype/item/item.py:1220 msgid "You have to enable auto re-order in Stock Settings to maintain re-order levels." msgstr "يجب عليك تمكين الطلب التلقائي في إعدادات الأسهم للحفاظ على مستويات إعادة الطلب." @@ -62704,7 +62688,7 @@ msgstr "[هام] [ERPNext] إعادة ترتيب الأخطاء تلقائيًا msgid "`Allow Negative rates for Items`" msgstr "السماح بأسعار سلبية للعناصر" -#: erpnext/stock/stock_ledger.py:2153 +#: erpnext/stock/stock_ledger.py:2201 msgid "after" msgstr "بعد" @@ -62741,7 +62725,7 @@ msgid "by {}" msgstr "بواسطة {}" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:338 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:840 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:846 msgid "dated {0}" msgstr "مؤرخة {0}" @@ -62875,7 +62859,7 @@ msgstr "من أصل 5" msgid "paid to" msgstr "مدفوع لـ" -#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:51 +#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:78 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "تطبيق الدفع غير مثبت. يرجى تثبيته من {0} أو {1}" @@ -62892,7 +62876,7 @@ msgstr "تطبيق الدفع غير مثبت. يرجى تثبيته من {0} أ msgid "per hour" msgstr "كل ساعة" -#: erpnext/stock/stock_ledger.py:2154 +#: erpnext/stock/stock_ledger.py:2202 msgid "performing either one below:" msgstr "أداء أحد الخيارين التاليين:" @@ -62987,7 +62971,7 @@ msgstr "عنوان" msgid "to" msgstr "إلى" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1259 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1265 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "لإلغاء تخصيص مبلغ فاتورة الإرجاع هذه قبل إلغائها." @@ -63072,7 +63056,7 @@ msgstr "{0} القسيمة المستخدمة هي {1}. الكمية المسم msgid "{0} Digest" msgstr "{0} الملخص" -#: erpnext/accounts/utils.py:1591 +#: erpnext/accounts/utils.py:1585 msgid "{0} Number {1} is already used in {2} {3}" msgstr "{0} الرقم {1} مستخدم بالفعل في {2} {3}" @@ -63084,11 +63068,11 @@ msgstr "{0} تكلفة التشغيل للعملية {1}" msgid "{0} Operations: {1}" msgstr "{0} العمليات: {1}" -#: erpnext/stock/doctype/material_request/material_request.py:232 +#: erpnext/stock/doctype/material_request/material_request.py:271 msgid "{0} Request for {1}" msgstr "{0} طلب {1}" -#: erpnext/stock/doctype/item/item.py:393 +#: erpnext/stock/doctype/item/item.py:398 msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "{0} يعتمد الاحتفاظ بالعينة على الدُفعة ، يُرجى تحديد "رقم الدُفعة" للاحتفاظ بعينة من العنصر" @@ -63138,6 +63122,9 @@ msgstr "{0} يحتوي بالفعل على إجراء الأصل {1}." #: erpnext/accounts/report/general_ledger/general_ledger.py:63 #: erpnext/accounts/report/pos_register/pos_register.py:120 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:28 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:35 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:42 msgid "{0} and {1} are mandatory" msgstr "{0} و {1} إلزاميان" @@ -63161,7 +63148,7 @@ msgstr "" msgid "{0} cannot be changed with opened Opening Entries." msgstr "لا يمكن تغيير {0} باستخدام إدخالات الفتح المفتوحة." -#: erpnext/public/js/utils/sales_common.js:336 +#: erpnext/public/js/utils/sales_common.js:334 msgid "{0} cannot be greater than 100" msgstr "" @@ -63178,7 +63165,7 @@ msgid "{0} completed job cards" msgstr "" #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:137 -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:199 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:214 #: erpnext/stock/doctype/pick_list/mapper.py:79 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:323 msgid "{0} created" @@ -63188,11 +63175,11 @@ msgstr "{0} تم انشاؤه" msgid "{0} creation for the following records will be skipped." msgstr "سيتم تخطي إنشاء السجلات التالية {0} ." -#: erpnext/setup/doctype/company/company.py:364 +#: erpnext/setup/doctype/company/company.py:366 msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:287 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "{0} لديها حاليا {1} بطاقة أداء بطاقة الموردين، ويجب إصدار أوامر الشراء إلى هذا المورد بحذر." @@ -63208,6 +63195,14 @@ msgstr "{0} لا تنتمي إلى شركة {1}" msgid "{0} does not belong to the Company {1}." msgstr "لا ينتمي {0} إلى الشركة {1}." +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:100 +msgid "{0} doesn't belong to Company {1}. Please select a Cost Center that belongs to Company {1}." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:57 +msgid "{0} doesn't belong to Company {1}. Please select an Income Account that belongs to Company {1}." +msgstr "" + #: erpnext/public/js/templates/shop_floor_template.html:880 msgid "{0} draft job cards awaiting submission" msgstr "" @@ -63217,7 +63212,7 @@ msgid "{0} entered twice in Item Tax" msgstr "{0} ادخل مرتين في ضريبة البند" #: erpnext/setup/doctype/item_group/item_group.py:47 -#: erpnext/stock/doctype/item/item.py:524 +#: erpnext/stock/doctype/item/item.py:529 msgid "{0} entered twice {1} in Item Taxes" msgstr "تم إدخال {0} مرتين {1} في ضرائب الأصناف" @@ -63258,6 +63253,14 @@ msgstr "" msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:114 +msgid "{0} is a group Cost Center. Please select a non-group Cost Center." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:78 +msgid "{0} is a group account. Please select a non-group Income Account." +msgstr "" + #: erpnext/accounts/doctype/pos_profile/pos_profile.py:95 msgid "{0} is a mandatory Accounting Dimension.
    Please set a value for {0} in Accounting Dimensions section." msgstr "{0} بُعد محاسبي إلزامي.
    يُرجى تحديد قيمة لـ {0} في قسم الأبعاد المحاسبية." @@ -63280,11 +63283,19 @@ msgstr "{0} قيد التشغيل بالفعل لـ {1}" msgid "{0} is blocked so this transaction cannot proceed" msgstr "تم حظر {0} حتى لا تتم متابعة هذه المعاملة" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:64 +msgid "{0} is disabled. Please select a valid Income Account." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:107 +msgid "{0} is disabled. Please select an enabled Cost Center." +msgstr "" + #: erpnext/assets/doctype/asset/asset.py:514 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "{0} في وضع المسودة. يرجى إرساله قبل إنشاء الأصل." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:865 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:871 msgid "{0} is mandatory for Item {1}" msgstr "{0} إلزامي للصنف {1}\\n
    \\n{0} is mandatory for Item {1}" @@ -63305,7 +63316,7 @@ msgstr "{0} إلزامي. ربما لم يتم إنشاء سجل سعر صرف msgid "{0} is not a CSV file." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:239 +#: erpnext/selling/doctype/customer/customer.py:251 msgid "{0} is not a company bank account" msgstr "{0} ليس حسابًا مصرفيًا للشركة" @@ -63337,6 +63348,10 @@ msgstr "" msgid "{0} is not added in the table" msgstr "{0} لم تتم إضافته في الجدول" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:71 +msgid "{0} is not an Income Account. Please select a valid Income Account." +msgstr "" + #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:146 msgid "{0} is not enabled in {1}" msgstr "{0} غير ممكّن في {1}" @@ -63345,11 +63360,11 @@ msgstr "{0} غير ممكّن في {1}" msgid "{0} is not running. Cannot trigger events for this document" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:478 +#: erpnext/stock/doctype/material_request/material_request.py:517 msgid "{0} is not the default supplier for any items." msgstr "{0} ليس المورد الافتراضي لأية عناصر." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2689 msgid "{0} is on hold until {1}" msgstr "" @@ -63389,6 +63404,10 @@ msgstr "" msgid "{0} job cards awaiting Manufacture entry" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:144 +msgid "{0} languages are marked as default languages. Please select only one of them." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.py:160 msgid "{0} must be a group warehouse." msgstr "" @@ -63442,11 +63461,11 @@ msgstr "" msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "تم حجز الوحدات {0} للصنف {1} في المستودع {2}، يرجى إلغاء حجزها لـ {3} في عملية مطابقة المخزون." -#: erpnext/stock/doctype/pick_list/pick_list.py:1127 +#: erpnext/stock/doctype/pick_list/pick_list.py:1136 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1120 +#: erpnext/stock/doctype/pick_list/pick_list.py:1129 msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "" @@ -63454,16 +63473,16 @@ 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 "يلزم {0} وحدة من {1} في {2} مع بُعد المخزون: {3} على {4} {5} لـ {6} لإكمال المعاملة." -#: erpnext/stock/stock_ledger.py:1800 erpnext/stock/stock_ledger.py:2325 -#: erpnext/stock/stock_ledger.py:2339 +#: erpnext/stock/stock_ledger.py:1848 erpnext/stock/stock_ledger.py:2373 +#: erpnext/stock/stock_ledger.py:2387 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "{0} وحدات من {1} لازمة ل {2} في {3} {4} ل {5} لإكمال هذه المعاملة." -#: erpnext/stock/stock_ledger.py:2429 erpnext/stock/stock_ledger.py:2474 +#: erpnext/stock/stock_ledger.py:2477 erpnext/stock/stock_ledger.py:2522 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "{0} وحدة من {1} مطلوبة في {2} على {3} {4} لإكمال هذه المعاملة." -#: erpnext/stock/stock_ledger.py:1794 +#: erpnext/stock/stock_ledger.py:1842 msgid "{0} units of {1} needed in {2} to complete this transaction." msgstr "{0} وحدات من {1} لازمة في {2} لإكمال هذه المعاملة." @@ -63475,7 +63494,7 @@ msgstr "{0} حتى {1}" msgid "{0} valid serial nos for Item {1}" msgstr "{0} أرقام تسلسلية صالحة للبند {1}" -#: erpnext/stock/doctype/item/item.js:1269 +#: erpnext/stock/doctype/item/item.js:1286 msgid "{0} variants created." msgstr "تم إنشاء المتغيرات {0}." @@ -63487,7 +63506,7 @@ msgstr "عرض {0} غير مدعوم حاليًا في التقارير الما msgid "{0} will be given as discount." msgstr "سيتم منح الخصم {0} ." -#: erpnext/public/js/utils/barcode_scanner.js:523 +#: erpnext/public/js/utils/barcode_scanner.js:532 msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "سيتم تعيين {0} كـ {1} في العناصر التي يتم مسحها ضوئيًا لاحقًا" @@ -63531,11 +63550,11 @@ msgstr "تم سداد جزء من المبلغ المستحق {0} {1} . يُرج #: erpnext/buying/doctype/purchase_order/services/status.py:35 #: erpnext/selling/doctype/sales_order/services/status.py:45 -#: erpnext/stock/doctype/material_request/material_request.py:258 +#: erpnext/stock/doctype/material_request/material_request.py:297 msgid "{0} {1} has been modified. Please refresh." msgstr "تم تعديل {0} {1}، يرجى تحديث الصفحة من المتصفح" -#: erpnext/stock/doctype/material_request/material_request.py:285 +#: erpnext/stock/doctype/material_request/material_request.py:324 msgid "{0} {1} has not been submitted so the action cannot be completed" msgstr "{0} {1} لم يتم إرسالها، ولذلك لا يمكن إكمال الإجراء" @@ -63565,11 +63584,11 @@ msgstr "{0} {1} مرتبط ب {2}، ولكن حساب الطرف هو {3}" msgid "{0} {1} is cancelled or closed" msgstr "{0} {1} تم إلغائه أو مغلق" -#: erpnext/stock/doctype/material_request/material_request.py:437 +#: erpnext/stock/doctype/material_request/material_request.py:476 msgid "{0} {1} is cancelled or stopped" msgstr "{0} {1} يتم إلغاؤه أو إيقافه\\n
    \\n{0} {1} is cancelled or stopped" -#: erpnext/stock/doctype/material_request/material_request.py:275 +#: erpnext/stock/doctype/material_request/material_request.py:314 msgid "{0} {1} is cancelled so the action cannot be completed" msgstr "{0} {1} تم إلغاؤه لذلك لا يمكن إكمال الإجراء" @@ -63653,7 +63672,7 @@ msgstr "{0} {1}: الحساب {2} غير فعال \\n
    \\n{0} {1}: Account {2} msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "{0} {1}: قيد محاسبي ل {2} يمكن ان يتم فقط بالعملة : {3}" -#: erpnext/stock/services/base_stock_gl_composer.py:226 +#: erpnext/stock/services/base_stock_gl_composer.py:282 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "{0} {1}: مركز التكلفة إلزامي للبند {2}" @@ -63685,11 +63704,11 @@ msgstr "{0} {1}: المورد مطلوب لحساب الدفع {2}\\n
    \\n{0} msgid "{0}%" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 msgid "{0}% Billed" msgstr "{0}% تم تحصيلها" -#: erpnext/controllers/website_list_for_contact.py:218 +#: erpnext/controllers/website_list_for_contact.py:220 msgid "{0}% Delivered" msgstr "" @@ -63722,11 +63741,11 @@ msgstr "" msgid "{0}: Virtual DocType (no database table)" msgstr "" -#: erpnext/stock/doctype/item/item.js:1185 +#: erpnext/stock/doctype/item/item.js:1202 msgid "{0}: remove invalid value(s) {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:1192 +#: erpnext/stock/doctype/item/item.js:1209 msgid "{0}: select the typed value {1} from the list or clear it" msgstr "" @@ -63738,7 +63757,7 @@ msgstr "{0}: {1} لا ينتمي إلى الشركة: {2}" msgid "{0}: {1} does not exist" msgstr "" -#: erpnext/setup/doctype/company/company.py:351 +#: erpnext/setup/doctype/company/company.py:353 msgid "{0}: {1} is a group account." msgstr "{0}: {1} هو حساب جماعي." @@ -63746,15 +63765,15 @@ msgstr "{0}: {1} هو حساب جماعي." msgid "{0}: {1} must be less than {2}" msgstr "{0}: {1} يجب أن يكون أقل من {2}" -#: erpnext/controllers/buying_controller.py:1028 +#: erpnext/controllers/buying_controller.py:1036 msgid "{count} Assets created for {item_code}" msgstr "{count} الأصول التي تم إنشاؤها لـ {item_code}" -#: erpnext/controllers/buying_controller.py:928 +#: erpnext/controllers/buying_controller.py:936 msgid "{doctype} {name} is cancelled or closed." msgstr "{doctype} {name} تم إلغائه أو مغلق." -#: erpnext/controllers/stock_controller.py:666 +#: erpnext/controllers/stock_controller.py:668 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "لا يمكن أن يكون حجم العينة {item_name}({sample_size}) أكبر من الكمية المقبولة ({accepted_quantity})" diff --git a/erpnext/locale/bg.po b/erpnext/locale/bg.po index a51f2bbe3a7..f017dfd3fba 100644 --- a/erpnext/locale/bg.po +++ b/erpnext/locale/bg.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-07-12 10:05+0000\n" -"PO-Revision-Date: 2026-07-15 12:58\n" +"POT-Creation-Date: 2026-07-19 10:04+0000\n" +"PO-Revision-Date: 2026-07-19 13:55\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Bulgarian\n" "MIME-Version: 1.0\n" @@ -86,15 +86,15 @@ msgstr "" msgid " Summary" msgstr "" -#: erpnext/stock/doctype/item/item.py:281 +#: erpnext/stock/doctype/item/item.py:286 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "" -#: erpnext/stock/doctype/item/item.py:283 +#: erpnext/stock/doctype/item/item.py:288 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:385 +#: erpnext/stock/doctype/item/item.py:390 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "" @@ -284,7 +284,7 @@ msgid "'Entries' cannot be empty" msgstr "" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:132 #: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "" @@ -293,7 +293,7 @@ msgstr "" msgid "'From Date' must be after 'To Date'" msgstr "" -#: erpnext/stock/doctype/item/item.py:468 +#: erpnext/stock/doctype/item/item.py:473 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" msgstr "" @@ -312,7 +312,7 @@ msgid "'Opening'" msgstr "" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:134 #: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "" @@ -337,8 +337,8 @@ msgstr "" msgid "'{0}' has been already added." msgstr "" -#: erpnext/setup/doctype/company/company.py:376 -#: erpnext/setup/doctype/company/company.py:387 +#: erpnext/setup/doctype/company/company.py:378 +#: erpnext/setup/doctype/company/company.py:389 msgid "'{0}' should be in company currency {1}." msgstr "" @@ -864,6 +864,11 @@ msgid "
    Message Example
    \n\n" "
    \n" msgstr "" +#. Header text in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounting Overview" +msgstr "" + #. Header text in the Stock Workspace #: erpnext/stock/workspace/stock/stock.json msgid "Masters & Reports" @@ -892,11 +897,6 @@ msgstr "" msgid "Reports & Masters" msgstr "" -#. Header text in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward and Outward" -msgstr "" - #. Header text in the ERPNext Settings Workspace #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json msgid "Your Shortcuts\n" @@ -966,7 +966,7 @@ msgstr "" msgid "A - C" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:358 +#: erpnext/selling/doctype/customer/customer.py:372 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" msgstr "" @@ -1147,11 +1147,11 @@ msgstr "" msgid "Abbreviation" msgstr "" -#: erpnext/setup/doctype/company/company.py:310 +#: erpnext/setup/doctype/company/company.py:312 msgid "Abbreviation already used for another company" msgstr "" -#: erpnext/setup/doctype/company/company.py:307 +#: erpnext/setup/doctype/company/company.py:309 msgid "Abbreviation is mandatory" msgstr "" @@ -1273,11 +1273,9 @@ msgstr "" #. Label of the account_category (Link) field in DocType 'Account' #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:162 #: erpnext/accounts/doctype/account_category/account_category.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Account Category" msgstr "" @@ -1380,7 +1378,7 @@ msgstr "" msgid "Account Manager" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 #: erpnext/controllers/accounts_controller.py:1234 msgid "Account Missing" msgstr "" @@ -1520,6 +1518,12 @@ msgstr "" msgid "Account to record additional purchase expenses like freight or customs" msgstr "" +#. Description of the 'Expenses Added To Stock Account' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account to track value added to stock via Stock Entry, Stock Reconciliation or Landed Cost Voucher" +msgstr "" + #. Description of the 'COGS Account' (Link) field in DocType 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json msgid "Account where cost of goods sold will be posted when this item is sold" @@ -1572,7 +1576,7 @@ msgstr "" msgid "Account {0} does not belong to company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:358 +#: erpnext/setup/doctype/company/company.py:360 msgid "Account {0} does not belong to company: {1}" msgstr "" @@ -1600,7 +1604,7 @@ msgstr "" msgid "Account {0} is added in the child company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:347 +#: erpnext/setup/doctype/company/company.py:349 msgid "Account {0} is disabled." msgstr "" @@ -1658,6 +1662,7 @@ msgstr "" #. Item' #. Label of the section_break_10 (Section Break) field in DocType 'Shipping #. Rule' +#. Name of a Workspace #. Label of the accounting_tab (Tab Break) field in DocType 'Supplier' #. Label of a Desktop Icon #. Label of the accounting_tab (Tab Break) field in DocType 'Customer' @@ -1669,6 +1674,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/desktop_icon/accounting.json erpnext/public/js/setup_wizard.js:91 #: erpnext/selling/doctype/customer/customer.json @@ -1727,15 +1733,12 @@ msgstr "" #. 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/budgeting.json msgid "Accounting Dimension" msgstr "" @@ -1929,8 +1932,8 @@ msgstr "" msgid "Accounting Entry for Asset" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:298 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:316 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:303 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:321 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1951,17 +1954,17 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:430 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:675 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:696 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:430 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:234 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:249 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:263 -#: erpnext/stock/services/base_stock_gl_composer.py:65 -#: erpnext/stock/services/base_stock_gl_composer.py:80 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:439 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:239 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:254 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:268 +#: erpnext/stock/services/base_stock_gl_composer.py:72 +#: erpnext/stock/services/base_stock_gl_composer.py:87 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:67 msgid "Accounting Entry for Stock" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:268 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:276 msgid "Accounting Entry for {0}" msgstr "" @@ -1970,12 +1973,12 @@ 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:190 -#: erpnext/assets/doctype/asset_repair/asset_repair.js:92 -#: erpnext/buying/doctype/supplier/supplier.js:123 +#: erpnext/assets/doctype/asset/asset.js:198 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:101 +#: erpnext/buying/doctype/supplier/supplier.js:132 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 -#: erpnext/selling/doctype/customer/customer.js:173 +#: erpnext/selling/doctype/customer/customer.js:182 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "" @@ -1992,10 +1995,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_period/accounting_period.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounting Period" msgstr "" @@ -2035,7 +2036,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/assets/doctype/asset_category/asset_category.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:513 +#: erpnext/setup/doctype/company/company.py:515 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json @@ -2075,13 +2076,18 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:126 -#: erpnext/buying/doctype/supplier/supplier.js:135 +#: erpnext/buying/doctype/supplier/supplier.js:144 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Accounts Payable" msgstr "" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Payable Ageing" +msgstr "" + #. Name of a report #: erpnext/accounts/report/accounts_payable/accounts_payable.js:191 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.json @@ -2100,7 +2106,7 @@ msgstr "" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.json #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:149 -#: erpnext/selling/doctype/customer/customer.js:162 +#: erpnext/selling/doctype/customer/customer.js:171 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json @@ -2119,6 +2125,11 @@ msgstr "" msgid "Accounts Receivable / Payable remarks length" msgstr "" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Receivable Ageing" +msgstr "" + #. Label of the accounts_receivable_credit (Link) field in DocType 'Invoice #. Discounting' #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.json @@ -2150,17 +2161,12 @@ msgstr "" #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Accounts Settings" msgstr "" -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/accounts_setup/accounts_setup.json #: erpnext/desktop_icon/accounts_setup.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounts Setup" msgstr "" @@ -2198,7 +2204,7 @@ msgstr "" #. Label of the accumulated_depreciation_amount (Currency) field in DocType #. 'Depreciation Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:173 -#: erpnext/assets/doctype/asset/asset.js:385 +#: erpnext/assets/doctype/asset/asset.js:393 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Accumulated Depreciation Amount" msgstr "" @@ -2346,7 +2352,7 @@ msgstr "" #. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType #. 'Stock Settings' -#: erpnext/stock/doctype/item/item.js:485 +#: erpnext/stock/doctype/item/item.js:496 #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Activate Serial / Batch No for Item" msgstr "" @@ -2360,11 +2366,6 @@ msgstr "" msgid "Active Status" msgstr "" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Active Subcontracted Items" -msgstr "" - #. Label of the activities_tab (Tab Break) field in DocType 'Lead' #. Label of the activities_tab (Tab Break) field in DocType 'Opportunity' #. Label of the activities_tab (Tab Break) field in DocType 'Prospect' @@ -2480,7 +2481,7 @@ msgstr "" msgid "Actual End Time" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:464 msgid "Actual Expense" msgstr "" @@ -2670,7 +2671,7 @@ msgstr "" msgid "Add Multiple Tasks" msgstr "" -#: erpnext/stock/doctype/item/item.js:985 +#: erpnext/stock/doctype/item/item.js:1002 msgid "Add Opening Stock" msgstr "" @@ -2856,11 +2857,11 @@ msgstr "" msgid "Added On" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:135 +#: erpnext/buying/doctype/supplier/supplier.py:143 msgid "Added Supplier Role to User {0}." msgstr "" -#: erpnext/controllers/website_list_for_contact.py:311 +#: erpnext/controllers/website_list_for_contact.py:313 msgid "Added {1} role to user {0}." msgstr "" @@ -3275,7 +3276,7 @@ msgstr "" msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:203 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:211 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3472,7 +3473,7 @@ msgstr "" msgid "Against Blanket Order" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:838 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:844 msgid "Against Customer Order {0}" msgstr "" @@ -3725,7 +3726,7 @@ msgstr "" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:171 -#: erpnext/accounts/utils.py:1653 erpnext/public/js/setup_wizard.js:278 +#: erpnext/accounts/utils.py:1647 erpnext/public/js/setup_wizard.js:278 msgid "All Accounts" msgstr "" @@ -3777,21 +3778,21 @@ msgstr "" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:506 -#: erpnext/setup/doctype/company/company.py:509 -#: erpnext/setup/doctype/company/company.py:514 -#: erpnext/setup/doctype/company/company.py:520 -#: erpnext/setup/doctype/company/company.py:526 -#: erpnext/setup/doctype/company/company.py:532 -#: erpnext/setup/doctype/company/company.py:538 -#: erpnext/setup/doctype/company/company.py:544 -#: erpnext/setup/doctype/company/company.py:550 -#: erpnext/setup/doctype/company/company.py:556 -#: erpnext/setup/doctype/company/company.py:562 -#: erpnext/setup/doctype/company/company.py:568 -#: erpnext/setup/doctype/company/company.py:574 -#: erpnext/setup/doctype/company/company.py:580 -#: erpnext/setup/doctype/company/company.py:586 +#: erpnext/setup/doctype/company/company.py:508 +#: erpnext/setup/doctype/company/company.py:511 +#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:522 +#: erpnext/setup/doctype/company/company.py:528 +#: erpnext/setup/doctype/company/company.py:534 +#: erpnext/setup/doctype/company/company.py:540 +#: erpnext/setup/doctype/company/company.py:546 +#: erpnext/setup/doctype/company/company.py:552 +#: erpnext/setup/doctype/company/company.py:558 +#: erpnext/setup/doctype/company/company.py:564 +#: erpnext/setup/doctype/company/company.py:570 +#: erpnext/setup/doctype/company/company.py:576 +#: erpnext/setup/doctype/company/company.py:582 +#: erpnext/setup/doctype/company/company.py:588 msgid "All Departments" msgstr "" @@ -3871,7 +3872,7 @@ msgstr "" msgid "All Territories" msgstr "" -#: erpnext/setup/doctype/company/company.py:451 +#: erpnext/setup/doctype/company/company.py:453 msgid "All Warehouses" msgstr "" @@ -3914,11 +3915,11 @@ msgstr "" msgid "All items in this document already have a linked Quality Inspection." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:915 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:921 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:926 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:932 msgid "All linked Sales Orders must be subcontracted." msgstr "" @@ -4454,6 +4455,21 @@ msgstr "" msgid "Allow transferring raw materials even after the Required Quantity is fulfilled" msgstr "" +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Supplier' +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Customer' +#. Label of the allowed_companies (Table MultiSelect) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Allowed Companies" +msgstr "" + +#: erpnext/stock/doctype/company_restriction/company_restriction.py:74 +msgid "Allowed Companies is required when Restrict to Companies is checked" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json msgid "Allowed Dimension" @@ -4534,7 +4550,7 @@ msgstr "" msgid "Already Imported" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1123 +#: erpnext/stock/doctype/pick_list/pick_list.py:1132 msgid "Already Picked" msgstr "" @@ -4542,7 +4558,7 @@ msgstr "" msgid "Already set default in pos profile {0} for user {1}, kindly disabled default" msgstr "" -#: erpnext/stock/doctype/item/item.js:38 +#: erpnext/stock/doctype/item/item.js:40 msgid "Also you can't switch back to FIFO after setting the valuation method to Moving Average for this item." msgstr "" @@ -4554,7 +4570,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:158 #: erpnext/manufacturing/doctype/work_order/work_order.js:173 #: erpnext/public/js/utils.js:616 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:343 msgid "Alternate Item" msgstr "" @@ -4582,7 +4598,7 @@ msgstr "" msgid "Alternative item must not be same as item code" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:383 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 msgid "Alternatively, you can download the template and fill your data in." msgstr "" @@ -4989,12 +5005,12 @@ msgstr "" msgid "An email will be sent to notify the User with the role 'Purchase Manager' when an automatic Material Request is created." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:617 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:766 msgid "An error has been appeared while reposting item valuation via {0}" msgstr "" #: erpnext/public/js/controllers/buying.js:378 -#: erpnext/public/js/utils/sales_common.js:495 +#: erpnext/public/js/utils/sales_common.js:493 msgid "An error occurred during the update process" msgstr "" @@ -5549,7 +5565,7 @@ msgstr "" msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "" -#: erpnext/stock/doctype/item/item.py:1122 +#: erpnext/stock/doctype/item/item.py:1127 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "" @@ -5557,7 +5573,7 @@ msgstr "" msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:464 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:470 msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "" @@ -5699,7 +5715,7 @@ msgstr "" msgid "Asset Category Name" msgstr "" -#: erpnext/stock/doctype/item/item.py:377 +#: erpnext/stock/doctype/item/item.py:382 msgid "Asset Category is mandatory for Fixed Asset item" msgstr "" @@ -5890,6 +5906,7 @@ msgstr "" #. Label of the asset_repair (Link) field in DocType 'Stock Entry' #. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.js:113 +#: erpnext/assets/doctype/asset/asset.js:152 #: 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 @@ -5940,8 +5957,7 @@ msgstr "" #. Label of the asset_value (Currency) field in DocType 'Asset Capitalization #. Asset Item' -#: erpnext/assets/dashboard_fixtures.py:180 -#: erpnext/assets/doctype/asset/asset.js:517 +#: erpnext/assets/doctype/asset/asset.js:525 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:208 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:457 @@ -5964,7 +5980,6 @@ msgid "Asset Value Adjustment cannot be posted before Asset's purchase date { msgstr "" #. Label of a chart in the Assets Workspace -#: erpnext/assets/dashboard_fixtures.py:56 #: erpnext/assets/workspace/assets/assets.json msgid "Asset Value Analytics" msgstr "" @@ -6001,7 +6016,7 @@ msgstr "" msgid "Asset issued to Employee {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:181 msgid "Asset out of order due to Asset Repair {0}" msgstr "" @@ -6046,7 +6061,7 @@ msgstr "" msgid "Asset updated after being split into Asset {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:335 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:338 msgid "Asset updated due to Asset Repair {0} {1}." msgstr "" @@ -6095,7 +6110,7 @@ msgstr "" msgid "Asset {0} must be submitted" msgstr "" -#: erpnext/controllers/buying_controller.py:1039 +#: erpnext/controllers/buying_controller.py:1047 msgid "Asset {assets_link} created for {item_code}" msgstr "" @@ -6133,11 +6148,11 @@ msgstr "" msgid "Assets Setup" msgstr "" -#: erpnext/controllers/buying_controller.py:1057 +#: erpnext/controllers/buying_controller.py:1065 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "" -#: erpnext/controllers/buying_controller.py:1044 +#: erpnext/controllers/buying_controller.py:1052 msgid "Assets {assets_link} created for {item_code}" msgstr "" @@ -6255,7 +6270,7 @@ msgstr "" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:502 +#: erpnext/stock/services/serial_batch_bundle_service.py:504 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." msgstr "" @@ -6315,11 +6330,11 @@ msgstr "" msgid "Attribute Value" msgstr "" -#: erpnext/stock/doctype/item/item.py:888 +#: erpnext/stock/doctype/item/item.py:893 msgid "Attribute Value {0} is not valid for the selected attribute {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1034 +#: erpnext/stock/doctype/item/item.py:1039 msgid "Attribute table is mandatory" msgstr "" @@ -6327,19 +6342,19 @@ msgstr "" msgid "Attribute value: {0} must appear only once" msgstr "" -#: erpnext/stock/doctype/item/item.py:877 +#: erpnext/stock/doctype/item/item.py:882 msgid "Attribute {0} is disabled." msgstr "" -#: erpnext/stock/doctype/item/item.py:865 +#: erpnext/stock/doctype/item/item.py:870 msgid "Attribute {0} is not valid for the selected template." msgstr "" -#: erpnext/stock/doctype/item/item.py:1038 +#: erpnext/stock/doctype/item/item.py:1043 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Attributes" msgstr "" @@ -6486,7 +6501,7 @@ msgstr "" msgid "Auto Reposting of Incorrect Valuation" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:202 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:209 msgid "Auto Tax Settings Error" msgstr "" @@ -6547,7 +6562,7 @@ msgid "Auto reconcile Payments" msgstr "" #: erpnext/public/js/controllers/buying.js:373 -#: erpnext/public/js/utils/sales_common.js:490 +#: erpnext/public/js/utils/sales_common.js:488 msgid "Auto repeat document updated" msgstr "" @@ -6892,8 +6907,8 @@ msgstr "" #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:118 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order.js:1496 -#: erpnext/stock/doctype/material_request/material_request.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:810 +#: erpnext/stock/doctype/material_request/material_request.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:809 #: 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:524 @@ -7123,7 +7138,7 @@ msgstr "" msgid "BOM Update Tool Log with job status maintained" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:102 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:103 msgid "BOM Updation already in progress. Please wait until {0} is complete." msgstr "" @@ -7152,8 +7167,8 @@ msgstr "" msgid "BOM and Production" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:862 +#: erpnext/stock/doctype/material_request/material_request.js:387 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:861 msgid "BOM does not contain any stock item" msgstr "" @@ -7284,7 +7299,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:62 #: 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/batch_wise_balance_history/batch_wise_balance_history.py:89 #: erpnext/stock/report/stock_balance/stock_balance.py:517 #: erpnext/stock/report/stock_ledger/stock_ledger.py:331 msgid "Balance Qty" @@ -7357,7 +7372,7 @@ msgid "Balance Type" 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/batch_wise_balance_history/batch_wise_balance_history.py:91 #: erpnext/stock/report/stock_balance/stock_balance.py:525 #: erpnext/stock/report/stock_ledger/stock_ledger.py:388 msgid "Balance Value" @@ -7388,7 +7403,6 @@ msgstr "" #. Label of the bank (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace #. Option for the 'Salary Mode' (Select) field in DocType 'Employee' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/bank/bank.json #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7402,7 +7416,6 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:95 #: erpnext/setup/doctype/employee/employee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank" msgstr "" @@ -7431,7 +7444,6 @@ msgstr "" #. Label of the bank_account (Link) field in DocType 'Payment Order Reference' #. Label of the bank_account (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:141 #: banking/src/pages/BankStatementImporter.tsx:90 #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7450,7 +7462,6 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:16 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:16 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account" msgstr "" @@ -7486,16 +7497,12 @@ msgid "Bank Account No" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Subtype" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_type/bank_account_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Type" msgstr "" @@ -7508,7 +7515,9 @@ msgstr "" msgid "Bank Accounts" msgstr "" +#. Label of a chart in the Accounting Workspace #. Label of the bank_balance (Check) field in DocType 'Email Digest' +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/setup/doctype/email_digest/email_digest.json msgid "Bank Balance" msgstr "" @@ -7532,10 +7541,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Clearance" msgstr "" @@ -7605,9 +7612,7 @@ msgid "Bank Fee, Salary, etc." msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Guarantee" msgstr "" @@ -7635,11 +7640,6 @@ msgstr "" msgid "Bank Overdraft Account" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Bank Reconciliation" -msgstr "" - #. Name of a report #. Label of a Link in the Invoicing Workspace #: banking/src/components/features/BankReconciliation/BankReconciliationStatement.tsx:208 @@ -7785,19 +7785,15 @@ msgstr "" #. Label of the banking_section (Section Break) field in DocType 'Accounts #. Settings' -#. Name of a Workspace #. Label of a Card Break in the Invoicing Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: banking/src/pages/BankReconciliation.tsx:57 #: banking/src/pages/BankReconciliation.tsx:87 #: banking/src/pages/BankStatementImporterContainer.tsx:22 #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/workspace/banking/banking.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/banking.json #: erpnext/setup/setup_wizard/data/industry_type.txt:8 -#: erpnext/workspace_sidebar/banking.json msgid "Banking" msgstr "" @@ -7806,11 +7802,11 @@ msgstr "" msgid "Barcode Type" msgstr "" -#: erpnext/stock/doctype/item/item.py:547 +#: erpnext/stock/doctype/item/item.py:552 msgid "Barcode {0} already used in Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:562 +#: erpnext/stock/doctype/item/item.py:567 msgid "Barcode {0} is not a valid {1} code" msgstr "" @@ -7965,7 +7961,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #: erpnext/stock/doctype/batch/batch.json #: 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/batch_wise_balance_history/batch_wise_balance_history.py:85 #: 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:418 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:182 @@ -8049,7 +8045,7 @@ msgstr "" #: 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:2989 -#: erpnext/public/js/utils/barcode_scanner.js:281 +#: erpnext/public/js/utils/barcode_scanner.js:286 #: erpnext/public/js/utils/serial_no_batch_selector.js:450 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_price/item_price.json @@ -8083,7 +8079,7 @@ msgstr "" msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3570 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3572 msgid "Batch No {0} does not exist" msgstr "" @@ -8277,18 +8273,16 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace #. Label of the bom_info_section (Section Break) field in DocType 'Stock Entry' -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.py:1168 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:796 +#: erpnext/stock/doctype/material_request/material_request.js:142 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:795 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "" #. Option for the 'Status' (Select) field in DocType 'Timesheet' -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/doctype/timesheet/timesheet_list.js:9 msgid "Billed" @@ -8652,6 +8646,12 @@ msgstr "" msgid "Block Supplier" msgstr "" +#. Description of the 'Enable Overdue Billing Threshold' (Check) field in +#. DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Block submitting a new Sales Invoice when the customer's overdue amount exceeds the Overdue Billing Threshold set on the customer." +msgstr "" + #. Description of the 'Is Frozen' (Check) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Blocks all further accounting entries on this customer's account. Only users with the frozen-entries role can override.\n" @@ -8729,6 +8729,12 @@ msgstr "" msgid "Book Deferred entries based on" msgstr "" +#. Label of the book_stock_expense_gl_entries (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Book Stock Expense GL Entries" +msgstr "" + #: erpnext/www/book_appointment/index.html:15 msgid "Book an appointment" msgstr "" @@ -8756,6 +8762,12 @@ msgstr "" msgid "Booked Fixed Asset" msgstr "" +#. Description of the 'Book Stock Expense GL Entries' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Books Purchase Expense and Expenses Added To Stock account pairs against stock value. On enabling this, the accounts become mandatory in Company or Item Defaults for Purchase Receipt, Purchase Invoice, Stock Entry, Stock Reconciliation and Landed Cost Voucher" +msgstr "" + #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" msgstr "" @@ -8792,12 +8804,10 @@ 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 "" @@ -8885,7 +8895,6 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cost_center/cost_center.js:45 @@ -8896,9 +8905,9 @@ msgstr "" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:237 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:319 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:329 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:454 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budgeting.json +#: erpnext/desktop_icon/budget.json msgid "Budget" msgstr "" @@ -8966,8 +8975,8 @@ msgstr "" msgid "Budget Start Date" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/budgeting.json +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json msgid "Budget Variance" msgstr "" @@ -8987,13 +8996,6 @@ msgstr "" msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" msgstr "" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/budgeting/budgeting.json -#: erpnext/workspace_sidebar/budgeting.json -msgid "Budgeting" -msgstr "" - #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" msgstr "" @@ -9223,11 +9225,6 @@ msgstr "" msgid "CC To" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "COA Importer" -msgstr "" - #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "CODE-39" @@ -9245,7 +9242,7 @@ msgstr "" msgid "COGS By Item Group" msgstr "" -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:44 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:55 msgid "COGS Debit" msgstr "" @@ -9561,7 +9558,7 @@ msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "" #: erpnext/accounts/doctype/journal_entry/mapper.py:32 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2617 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2615 msgid "Can only make payment against unbilled {0}" msgstr "" @@ -9571,7 +9568,7 @@ msgstr "" 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:278 +#: erpnext/setup/doctype/company/company.py:280 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "" @@ -9615,7 +9612,7 @@ msgstr "" msgid "Cannot Assign Cashier" msgstr "" -#: erpnext/setup/doctype/company/company.py:297 +#: erpnext/setup/doctype/company/company.py:299 msgid "Cannot Change Inventory Account Setting" msgstr "" @@ -9623,9 +9620,9 @@ msgstr "" msgid "Cannot Create Return" msgstr "" -#: erpnext/stock/doctype/item/item.py:690 -#: erpnext/stock/doctype/item/item.py:703 -#: erpnext/stock/doctype/item/item.py:719 +#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:708 +#: erpnext/stock/doctype/item/item.py:724 msgid "Cannot Merge" msgstr "" @@ -9649,7 +9646,7 @@ msgstr "" msgid "Cannot apply TDS against multiple parties in one entry" msgstr "" -#: erpnext/stock/doctype/item/item.py:380 +#: erpnext/stock/doctype/item/item.py:385 msgid "Cannot be a fixed asset item as Stock Ledger is created." msgstr "" @@ -9670,7 +9667,7 @@ msgstr "" msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:283 msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "" @@ -9678,7 +9675,7 @@ msgstr "" msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "" -#: erpnext/stock/stock_ledger.py:226 +#: erpnext/stock/stock_ledger.py:230 msgid "Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet." msgstr "" @@ -9690,7 +9687,7 @@ msgstr "" msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "" -#: erpnext/controllers/buying_controller.py:1145 +#: erpnext/controllers/buying_controller.py:1153 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" @@ -9698,11 +9695,11 @@ msgstr "" msgid "Cannot cancel transaction for Completed Work Order." msgstr "" -#: erpnext/stock/doctype/item/item.py:986 +#: erpnext/stock/doctype/item/item.py:991 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1147 +#: erpnext/stock/doctype/item/item.py:1152 msgid "Cannot change Item {0} from serialized to non-serialized because a Serial and Batch Bundle exists for it. Please delete or cancel the Serial and Batch Bundle first." msgstr "" @@ -9714,11 +9711,11 @@ msgstr "" msgid "Cannot change Service Stop Date for item in row {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:977 +#: erpnext/stock/doctype/item/item.py:982 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "" -#: erpnext/setup/doctype/company/company.py:403 +#: erpnext/setup/doctype/company/company.py:405 msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "" @@ -9730,7 +9727,7 @@ msgstr "" msgid "Cannot convert Cost Center to ledger as it has child nodes" msgstr "" -#: erpnext/projects/doctype/task/task.js:49 +#: erpnext/projects/doctype/task/task.js:55 msgid "Cannot convert Task to non-group because the following child Tasks exist: {0}." msgstr "" @@ -9809,7 +9806,7 @@ msgstr "" msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." msgstr "" -#: erpnext/setup/doctype/company/company.py:629 +#: erpnext/setup/doctype/company/company.py:631 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 "" @@ -9825,7 +9822,7 @@ msgstr "" msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "" -#: erpnext/setup/doctype/company/company.py:294 +#: erpnext/setup/doctype/company/company.py:296 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 "" @@ -9842,11 +9839,11 @@ msgstr "" msgid "Cannot fetch selected rows for submitted Payment Request" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:62 +#: erpnext/public/js/utils/barcode_scanner.js:67 msgid "Cannot find Item or Warehouse with this Barcode" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:63 +#: erpnext/public/js/utils/barcode_scanner.js:68 msgid "Cannot find Item with this Barcode" msgstr "" @@ -9904,7 +9901,7 @@ msgstr "" msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:371 +#: erpnext/selling/doctype/customer/customer.py:385 msgid "Cannot select a Group type Customer Group. Please select a non-group Customer Group." msgstr "" @@ -9929,7 +9926,7 @@ msgstr "" msgid "Cannot set authorization on basis of Discount for {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:777 +#: erpnext/stock/doctype/item/item.py:782 msgid "Cannot set multiple Item Defaults for a company." msgstr "" @@ -10038,7 +10035,7 @@ msgstr "" msgid "Capital Work in Progress" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:228 +#: erpnext/assets/doctype/asset/asset.js:236 msgid "Capitalize Asset" msgstr "" @@ -10047,7 +10044,7 @@ msgstr "" msgid "Capitalize Repair Cost" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:226 +#: erpnext/assets/doctype/asset/asset.js:234 msgid "Capitalize this asset before submitting." msgstr "" @@ -10232,16 +10229,12 @@ msgstr "" msgid "Category Details" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:93 -msgid "Category-wise Asset Value" -msgstr "" - -#: erpnext/buying/doctype/purchase_order/purchase_order.py:289 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:290 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:140 msgid "Caution" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:210 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:218 msgid "Caution: This might alter frozen accounts." msgstr "" @@ -10341,7 +10334,7 @@ msgstr "" msgid "Change in Stock Value" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:773 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:779 msgid "Change the account type to Receivable or select a different account." msgstr "" @@ -10351,7 +10344,7 @@ msgstr "" msgid "Change this date manually to setup the next synchronization start date" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:161 +#: erpnext/selling/doctype/customer/customer.py:168 msgid "Changed customer name to '{0}' as '{1}' already exists." msgstr "" @@ -10359,7 +10352,7 @@ msgstr "" msgid "Changes in {0}" msgstr "" -#: erpnext/stock/doctype/item/item.js:451 +#: erpnext/stock/doctype/item/item.js:462 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "" @@ -10369,7 +10362,7 @@ msgstr "" msgid "Changing the account in any transaction of the DocTypes listed below will trigger a repost. To prevent reposting, remove the relevant DocType from the list." msgstr "" -#: erpnext/stock/doctype/item/item.js:34 +#: erpnext/stock/doctype/item/item.js:36 msgid "Changing the valuation method to Moving Average will affect new transactions. If backdated entries are added, earlier FIFO-based entries will be reposted, which may change closing balances." msgstr "" @@ -10434,7 +10427,6 @@ msgstr "" #: erpnext/setup/doctype/company/company.js:139 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/home/home.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/invoicing.json msgid "Chart of Accounts" msgstr "" @@ -10449,11 +10441,9 @@ msgid "Chart of Accounts Importer" msgstr "" #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account_tree.js:191 #: erpnext/accounts/doctype/cost_center/cost_center.js:41 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Chart of Cost Centers" msgstr "" @@ -10695,7 +10685,7 @@ msgstr "" msgid "Clauses and Conditions" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:493 +#: erpnext/public/js/utils/barcode_scanner.js:502 msgid "Clear Last Scanned Warehouse" msgstr "" @@ -10761,7 +10751,7 @@ msgstr "" msgid "Clearing Demo Data..." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:749 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:747 msgid "Click on 'Get Finished Goods for Manufacture' to fetch the items from the above Sales Orders. Items only for which a BOM is present will be fetched." msgstr "" @@ -10769,7 +10759,7 @@ msgstr "" msgid "Click on Add to Holidays. This will populate the holidays table with all the dates that fall on the selected weekly off. Repeat the process for populating the dates for all your weekly holidays" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:744 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:742 msgid "Click on Get Sales Orders to fetch sales orders based on the above filters." msgstr "" @@ -11274,6 +11264,7 @@ msgstr "" #. Label of the company (Link) field in DocType 'Vehicle' #. Label of a Link in the Home Workspace #. Label of the company (Link) field in DocType 'Bin' +#. Label of the company (Link) field in DocType 'Company Restriction' #. Label of the company (Link) field in DocType 'Delivery Note' #. Label of the company (Link) field in DocType 'Delivery Trip' #. Label of the company (Link) field in DocType 'Item Default' @@ -11303,7 +11294,6 @@ msgstr "" #. Label of the company (Link) field in DocType 'Subcontracting Receipt' #. Label of the company (Link) field in DocType 'Issue' #. Label of the company (Link) field in DocType 'Warranty Claim' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:82 #: banking/src/pages/BankStatementImporter.tsx:84 #: erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js:8 @@ -11543,9 +11533,10 @@ msgstr "" #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json +#: erpnext/stock/doctype/company_restriction/company_restriction.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.json -#: erpnext/stock/doctype/item/item.js:940 +#: erpnext/stock/doctype/item/item.js:957 #: erpnext/stock/doctype/item_default/item_default.json #: erpnext/stock/doctype/item_standard_cost/item_standard_cost.json #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json @@ -11611,8 +11602,6 @@ msgstr "" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 -#: erpnext/workspace_sidebar/accounts_setup.json -#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "" @@ -11771,6 +11760,23 @@ msgstr "" msgid "Company Not Linked" msgstr "" +#. Name of a DocType +#: erpnext/stock/doctype/company_restriction/company_restriction.json +msgid "Company Restriction" +msgstr "" + +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Supplier' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Customer' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Company Restrictions" +msgstr "" + #. Label of the shipping_address (Link) field in DocType 'Request for #. Quotation' #. Label of the shipping_address (Link) field in DocType 'Subcontracting Order' @@ -11796,8 +11802,8 @@ msgstr "" 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:856 +#: erpnext/stock/doctype/material_request/material_request.js:381 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:855 msgid "Company field is required" msgstr "" @@ -11908,7 +11914,7 @@ msgstr "" #. Label of the competitors (Table MultiSelect) field in DocType 'Opportunity' #. Label of the competitors (Table MultiSelect) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:612 +#: erpnext/public/js/utils/sales_common.js:610 #: erpnext/selling/doctype/quotation/quotation.json msgid "Competitors" msgstr "" @@ -11963,7 +11969,7 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/services/operations.py:274 +#: erpnext/manufacturing/doctype/work_order/services/operations.py:294 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" @@ -12011,7 +12017,7 @@ msgstr "" msgid "Completion Date" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:82 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:85 msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly." msgstr "" @@ -12703,7 +12709,7 @@ msgstr "" msgid "Conversion Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:463 +#: erpnext/stock/doctype/item/item.py:468 msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "" @@ -12926,7 +12932,6 @@ msgstr "" #. Item' #. Label of the cost_center (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:567 #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:626 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:1179 @@ -13020,16 +13025,13 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center Allocation" msgstr "" @@ -13055,12 +13057,16 @@ msgstr "" msgid "Cost Center Number" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:122 +msgid "Cost Center Validation Error" +msgstr "" + #. Label of a Card Break in the Invoicing Workspace #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Cost Center and Budgeting" msgstr "" -#: erpnext/public/js/utils/sales_common.js:546 +#: erpnext/public/js/utils/sales_common.js:544 msgid "Cost Center for Item rows has been updated to {0}" msgstr "" @@ -13073,7 +13079,7 @@ msgid "Cost Center is required" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:644 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:401 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:410 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "" @@ -13475,8 +13481,8 @@ msgstr "" msgid "Create Ledger Entries for Change Amount" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:257 -#: erpnext/selling/doctype/customer/customer.js:289 +#: erpnext/buying/doctype/supplier/supplier.js:266 +#: erpnext/selling/doctype/customer/customer.js:298 msgid "Create Link" msgstr "" @@ -13623,9 +13629,9 @@ msgstr "" #. Title of an Onboarding Step #. Label of an action in the Onboarding Step 'Create Sales Invoice' #: erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json -#: erpnext/projects/doctype/timesheet/timesheet.js:55 -#: erpnext/projects/doctype/timesheet/timesheet.js:231 -#: erpnext/projects/doctype/timesheet/timesheet.js:235 +#: erpnext/projects/doctype/timesheet/timesheet.js:56 +#: erpnext/projects/doctype/timesheet/timesheet.js:233 +#: erpnext/projects/doctype/timesheet/timesheet.js:237 #: erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json msgid "Create Sales Invoice" msgstr "" @@ -13648,7 +13654,7 @@ msgid "Create Service Item" msgstr "" #: erpnext/stock/dashboard/item_dashboard.js:283 -#: erpnext/stock/doctype/material_request/material_request.js:478 +#: erpnext/stock/doctype/material_request/material_request.js:479 msgid "Create Stock Entry" msgstr "" @@ -13731,12 +13737,12 @@ msgstr "" msgid "Create Users" msgstr "" -#: erpnext/stock/doctype/item/item.js:1398 +#: erpnext/stock/doctype/item/item.js:1415 msgid "Create Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:1210 -#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1227 +#: erpnext/stock/doctype/item/item.js:1264 msgid "Create Variants" msgstr "" @@ -13771,12 +13777,12 @@ msgstr "" msgid "Create a new rule to automatically classify transactions." msgstr "" -#: erpnext/stock/doctype/item/item.js:1230 -#: erpnext/stock/doctype/item/item.js:1391 +#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1408 msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2157 +#: erpnext/stock/stock_ledger.py:2205 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -13814,7 +13820,7 @@ msgstr "" msgid "Created {0} draft Grouped Payment Entries" msgstr "" -#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:230 +#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:232 msgid "Created {0} scorecards for {1} between:" msgstr "" @@ -13855,7 +13861,7 @@ msgstr "" msgid "Creating Journal Entries..." msgstr "" -#: erpnext/stock/doctype/item/item.js:999 +#: erpnext/stock/doctype/item/item.js:1016 msgid "Creating Opening Stock Entry..." msgstr "" @@ -13962,6 +13968,13 @@ msgstr "" msgid "Credit" msgstr "" +#. Label of the credit_limits (Table) field in DocType 'Customer' +#. Label of the credit_limits (Table) field in DocType 'Customer Group' +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/setup/doctype/customer_group/customer_group.json +msgid "Credit & Overdue Limits" +msgstr "" + #: erpnext/accounts/report/general_ledger/general_ledger.py:744 msgid "Credit (Transaction)" msgstr "" @@ -14031,23 +14044,19 @@ msgstr "" msgid "Credit Days" msgstr "" -#. Label of the credit_limits (Table) field in DocType 'Customer' #. Label of the credit_limit (Currency) field in DocType 'Customer Credit #. Limit' #. Label of the credit_limit (Currency) field in DocType 'Company' -#. Label of the credit_limits (Table) field in DocType 'Customer Group' #. Label of the section_credit_limit (Section Break) field in DocType 'Supplier #. Group' -#: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.py:65 #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/supplier_group/supplier_group.json msgid "Credit Limit" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:542 +#: erpnext/selling/doctype/customer/customer.py:559 msgid "Credit Limit Crossed" msgstr "" @@ -14127,20 +14136,20 @@ msgstr "" msgid "Credit in Company Currency" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:508 -#: erpnext/selling/doctype/customer/customer.py:564 +#: erpnext/selling/doctype/customer/customer.py:525 +#: erpnext/selling/doctype/customer/customer.py:581 msgid "Credit limit has been crossed for customer {0} ({1}/{2})" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:398 +#: erpnext/selling/doctype/customer/customer.py:412 msgid "Credit limit is already defined for the Company {0}" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:563 +#: erpnext/selling/doctype/customer/customer.py:580 msgid "Credit limit reached for customer {0}" msgstr "" -#: erpnext/accounts/utils.py:2856 +#: erpnext/accounts/utils.py:2850 msgid "Credit limit warning — submission may be blocked: {0}" msgstr "" @@ -14200,7 +14209,7 @@ msgstr "" msgid "Criteria weights must add up to 100%" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:189 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:196 msgid "Cron Interval should be between 1 and 59 Min" msgstr "" @@ -14257,10 +14266,8 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/doctype/currency_exchange/currency_exchange.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Currency Exchange" msgstr "" @@ -14270,7 +14277,6 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Currency Exchange Settings" msgstr "" @@ -14329,7 +14335,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:215 #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:284 -#: erpnext/accounts/utils.py:2575 +#: erpnext/accounts/utils.py:2569 msgid "Currency for {0} must be {1}" msgstr "" @@ -14387,7 +14393,7 @@ msgstr "" msgid "Current BOM" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:81 msgid "Current BOM and New BOM cannot be the same" msgstr "" @@ -14628,7 +14634,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:201 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/supplier/supplier.js:225 +#: erpnext/buying/doctype/supplier/supplier.js:234 #: erpnext/controllers/trends.py:434 erpnext/crm/doctype/contract/contract.json #: erpnext/crm/doctype/lead/lead.js:32 #: erpnext/crm/doctype/opportunity/opportunity.js:99 @@ -14642,7 +14648,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json #: erpnext/projects/doctype/project/project.json -#: erpnext/projects/doctype/timesheet/timesheet.js:223 +#: erpnext/projects/doctype/timesheet/timesheet.js:225 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:46 #: erpnext/public/js/sales_trends_filters.js:25 @@ -14690,7 +14696,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:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:493 #: 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 @@ -14710,7 +14716,6 @@ msgstr "" #: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Customer" msgstr "" @@ -15115,7 +15120,7 @@ msgstr "" msgid "Customer Provided Item Cost" msgstr "" -#: erpnext/setup/doctype/company/company.py:555 +#: erpnext/setup/doctype/company/company.py:557 msgid "Customer Service" msgstr "" @@ -15172,12 +15177,16 @@ msgstr "" msgid "Customer required for 'Customerwise Discount'" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:885 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:891 #: erpnext/selling/doctype/sales_order/sales_order.py:392 #: erpnext/stock/doctype/delivery_note/delivery_note.py:393 msgid "Customer {0} does not belong to project {1}" msgstr "" +#: erpnext/selling/doctype/customer/customer.py:605 +msgid "Customer {0} has an overdue billing limit. Overdue amount {1} exceeds the allowed threshold {2}." +msgstr "" + #. Label of the customer_item_code (Data) field in DocType 'POS Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Sales Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Quotation Item' @@ -15286,7 +15295,7 @@ msgstr "" msgid "DFS" msgstr "" -#: erpnext/projects/doctype/project/project.py:751 +#: erpnext/projects/doctype/project/project.py:781 msgid "Daily Project Summary for {0}" msgstr "" @@ -15621,13 +15630,13 @@ msgstr "" #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:769 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:775 #: erpnext/controllers/accounts_controller.py:1214 msgid "Debit To" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 msgid "Debit To is required" msgstr "" @@ -15703,7 +15712,7 @@ msgstr "" msgid "Decimeter" msgstr "" -#: erpnext/public/js/utils/sales_common.js:639 +#: erpnext/public/js/utils/sales_common.js:637 msgid "Declare Lost" msgstr "" @@ -15734,11 +15743,6 @@ msgstr "" msgid "Deductee Details" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/taxes.json -msgid "Deduction Certificate" -msgstr "" - #. Label of the deductions_or_loss_section (Section Break) field in DocType #. 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -15781,14 +15785,14 @@ msgstr "" #. Label of the default_advance_paid_account (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:388 +#: erpnext/setup/doctype/company/company.py:390 msgid "Default Advance Paid Account" msgstr "" #. Label of the default_advance_received_account (Link) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:377 +#: erpnext/setup/doctype/company/company.py:379 msgid "Default Advance Received Account" msgstr "" @@ -15803,7 +15807,7 @@ msgstr "" msgid "Default BOM" msgstr "" -#: erpnext/stock/doctype/item/item.py:506 +#: erpnext/stock/doctype/item/item.py:511 msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" @@ -15874,6 +15878,11 @@ msgstr "" msgid "Default Costing Rate" msgstr "" +#. Label of the country (Link) field in DocType 'Global Defaults' +#: erpnext/setup/doctype/global_defaults/global_defaults.json +msgid "Default Country" +msgstr "" + #. Label of the default_currency (Link) field in DocType 'Company' #. Label of the default_currency (Link) field in DocType 'Global Defaults' #: erpnext/setup/doctype/company/company.json @@ -16126,15 +16135,15 @@ msgstr "" msgid "Default Unit of Measure" msgstr "" -#: erpnext/stock/doctype/item/item.py:1428 +#: erpnext/stock/doctype/item/item.py:1433 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "" -#: erpnext/stock/doctype/item/item.py:1408 +#: erpnext/stock/doctype/item/item.py:1413 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "" -#: erpnext/stock/doctype/item/item.py:1012 +#: erpnext/stock/doctype/item/item.py:1017 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "" @@ -16150,7 +16159,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Stock Reconciliation' #. Label of the default_warehouse (Link) field in DocType 'Stock Settings' #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/stock/doctype/item/item.js:961 +#: erpnext/stock/doctype/item/item.js:978 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -16188,8 +16197,8 @@ msgstr "" msgid "Default tax templates for sales, purchase and items are created." msgstr "" -#: erpnext/stock/doctype/item/item.js:953 -#: erpnext/stock/doctype/item/item.js:965 +#: erpnext/stock/doctype/item/item.js:970 +#: erpnext/stock/doctype/item/item.js:982 msgid "Default warehouse from Item Defaults." msgstr "" @@ -16437,7 +16446,7 @@ msgstr "" #. Order' #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:20 -#: erpnext/controllers/website_list_for_contact.py:216 +#: erpnext/controllers/website_list_for_contact.py:218 #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -16654,7 +16663,7 @@ msgstr "" msgid "Delivery Note Trends" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 msgid "Delivery Note {0} is not submitted" msgstr "" @@ -16874,7 +16883,7 @@ msgstr "" #. Label of the depreciation_amount (Currency) field in DocType 'Depreciation #. Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:167 -#: erpnext/assets/doctype/asset/asset.js:384 +#: erpnext/assets/doctype/asset/asset.js:392 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Depreciation Amount" msgstr "" @@ -16957,7 +16966,7 @@ msgstr "" msgid "Depreciation Posting Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:928 +#: erpnext/assets/doctype/asset/asset.js:936 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" @@ -17026,7 +17035,7 @@ msgstr "" #. Label of the order_lost_reason (Small Text) field in DocType 'Opportunity' #. Label of the order_lost_reason (Small Text) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:618 +#: erpnext/public/js/utils/sales_common.js:616 #: erpnext/selling/doctype/quotation/quotation.json msgid "Detailed Reason" msgstr "" @@ -17389,8 +17398,8 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/manufacturing/doctype/work_order/work_order.js:1081 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:392 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:435 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:391 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:434 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Disassemble" @@ -17623,7 +17632,7 @@ msgstr "" msgid "Discount must be less than 100" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3098 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3096 msgid "Discount of {0} applied as per Payment Term" msgstr "" @@ -17695,7 +17704,7 @@ msgstr "" msgid "Dislikes" msgstr "" -#: erpnext/setup/doctype/company/company.py:549 +#: erpnext/setup/doctype/company/company.py:551 msgid "Dispatch" msgstr "" @@ -17935,7 +17944,7 @@ msgstr "" msgid "Do not import" msgstr "" -#. Description of the 'Hide Currency Symbol' (Select) field in DocType 'Global +#. Description of the 'Hide Currency Symbol' (Check) field in DocType 'Global #. Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Do not show any symbol like $ etc next to currencies." @@ -17959,7 +17968,7 @@ msgstr "" msgid "Do not use Batch-wise Valuation" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:966 +#: erpnext/assets/doctype/asset/asset.js:974 msgid "Do you really want to restore this scrapped asset?" msgstr "" @@ -17967,7 +17976,7 @@ msgstr "" msgid "Do you still want to enable immutable ledger?" msgstr "" -#: erpnext/stock/doctype/item/item.js:42 +#: erpnext/stock/doctype/item/item.js:44 msgid "Do you want to change valuation method?" msgstr "" @@ -18227,15 +18236,13 @@ msgstr "" msgid "Due Date cannot be before {0}" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:167 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:175 msgid "Due to stock closing entry {0}, you cannot repost item valuation before {1}" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:158 -#: erpnext/workspace_sidebar/banking.json msgid "Dunning" msgstr "" @@ -18267,6 +18274,14 @@ msgstr "" msgid "Dunning Letter Text" msgstr "" +#: erpnext/accounts/doctype/dunning/dunning.py:184 +msgid "Dunning Letter for Dunning Type {0} in language '{1}' not found." +msgstr "" + +#: erpnext/accounts/doctype/dunning/dunning.py:188 +msgid "Dunning Letter for Dunning Type {0} not found." +msgstr "" + #. Label of the dunning_level (Int) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Dunning Level" @@ -18275,10 +18290,8 @@ msgstr "" #. Label of the dunning_type (Link) field in DocType 'Dunning' #. Name of a DocType #. Label of the dunning_type (Data) field in DocType 'Dunning Type' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/dunning_type/dunning_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Dunning Type" msgstr "" @@ -18356,6 +18369,10 @@ msgstr "" msgid "Duplicate item group found in the item group table" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:133 +msgid "Duplicate languages found on Dunning Letter Text. Keep only one of them." +msgstr "" + #: erpnext/projects/doctype/project/project.js:186 msgid "Duplicate project has been created" msgstr "" @@ -18935,7 +18952,7 @@ msgstr "" msgid "Enable Accounting Dimensions" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1752 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1754 msgid "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock." msgstr "" @@ -18951,7 +18968,7 @@ msgstr "" msgid "Enable Auto Email" msgstr "" -#: erpnext/stock/doctype/item/item.py:1216 +#: erpnext/stock/doctype/item/item.py:1221 msgid "Enable Auto Re-Order" msgstr "" @@ -19046,6 +19063,12 @@ msgstr "" msgid "Enable Opportunity Creation from Contact Us" msgstr "" +#. Label of the enable_overdue_billing_threshold (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Overdue Billing Threshold" +msgstr "" + #. Label of the enable_parallel_reposting (Check) field in DocType 'Stock #. Reposting Settings' #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -19289,7 +19312,7 @@ msgstr "" msgid "End Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:367 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:366 msgid "End Transit" msgstr "" @@ -19403,7 +19426,7 @@ msgstr "" msgid "Enter amount to be redeemed." msgstr "" -#: erpnext/stock/doctype/item/item.js:1560 +#: erpnext/stock/doctype/item/item.js:1577 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "" @@ -19415,7 +19438,7 @@ msgstr "" msgid "Enter customer's phone number" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:937 +#: erpnext/assets/doctype/asset/asset.js:945 msgid "Enter date to scrap asset" msgstr "" @@ -19458,7 +19481,7 @@ msgstr "" msgid "Enter the name of the bank or lending institution before submitting." msgstr "" -#: erpnext/stock/doctype/item/item.js:1586 +#: erpnext/stock/doctype/item/item.js:1603 msgid "Enter the opening stock units." msgstr "" @@ -19569,7 +19592,7 @@ msgstr "" msgid "Error while processing deferred accounting for {0}" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:613 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:762 msgid "Error while reposting item valuation" msgstr "" @@ -19627,7 +19650,7 @@ msgstr "" msgid "Example URL" msgstr "" -#: erpnext/stock/doctype/item/item.py:1128 +#: erpnext/stock/doctype/item/item.py:1133 msgid "Example of a linked document: {0}" msgstr "" @@ -19646,7 +19669,7 @@ msgstr "" msgid "Example: If the transaction amount is 200, then this will be calculated as {} = {}" msgstr "" -#: erpnext/stock/stock_ledger.py:2446 +#: erpnext/stock/stock_ledger.py:2494 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -19704,7 +19727,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:743 +#: erpnext/setup/doctype/company/company.py:745 msgid "Exchange Gain/Loss" msgstr "" @@ -19809,7 +19832,7 @@ msgstr "" msgid "Excise Entry" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1520 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1524 msgid "Excise Invoice" msgstr "" @@ -20023,7 +20046,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:220 +#: erpnext/stock/services/base_stock_gl_composer.py:276 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -20075,7 +20098,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:199 +#: erpnext/stock/services/base_stock_gl_composer.py:266 msgid "Expense Account Missing" msgstr "" @@ -20109,6 +20132,32 @@ msgstr "" msgid "Expenses" msgstr "" +#. Label of the expenses_added_to_stock_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_account (Link) field in DocType 'Item +#. Default' +#. Label of the vf_expenses_added_to_stock_account (Read Only) field in DocType +#. 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Account" +msgstr "" + +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Item Default' +#. Label of the vf_expenses_added_to_stock_contra_account (Read Only) field in +#. DocType 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Contra Account" +msgstr "" + +#: erpnext/stock/services/base_stock_gl_composer.py:217 +msgid "Expenses Added To Stock for Item {0}" +msgstr "" + #. Option for the 'Account Type' (Select) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:92 @@ -20126,7 +20175,7 @@ msgid "Expenses Included In Valuation" msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:310 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:518 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:517 msgid "Expired Batches" msgstr "" @@ -20263,11 +20312,6 @@ msgstr "" msgid "FIFO/LIFO Queue" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "FX Revaluation" -msgstr "" - #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Fahrenheit" @@ -20316,7 +20360,7 @@ msgstr "" msgid "Failed to personalize your setup" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:269 +#: erpnext/assets/doctype/asset/asset.js:277 msgid "Failed to post depreciation entries" msgstr "" @@ -20341,7 +20385,7 @@ msgstr "" msgid "Failed to setup defaults" msgstr "" -#: erpnext/setup/doctype/company/company.py:923 +#: erpnext/setup/doctype/company/company.py:925 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "" @@ -20452,8 +20496,8 @@ msgstr "" msgid "Fetch Value From" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:833 +#: erpnext/stock/doctype/material_request/material_request.js:373 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:832 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "" @@ -20620,7 +20664,6 @@ msgstr "" #. Label of the finance_book (Link) field in DocType 'Asset Finance Book' #. Label of the finance_book (Link) field in DocType 'Asset Shift Allocation' #. Label of the finance_book (Link) field in DocType 'Asset Value Adjustment' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/finance_book/finance_book.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -20651,7 +20694,6 @@ msgstr "" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:48 #: erpnext/public/js/financial_statements.js:426 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "" @@ -20848,7 +20890,7 @@ msgid "Finished Good {0} must be a sub-contracted item." msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1475 -#: erpnext/setup/doctype/company/company.py:454 +#: erpnext/setup/doctype/company/company.py:456 msgid "Finished Goods" msgstr "" @@ -20889,7 +20931,7 @@ msgstr "" msgid "Finished Goods based Operating Cost" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:887 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:900 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" @@ -20963,7 +21005,6 @@ msgstr "" #. Certificate' #. Label of the fiscal_year (Link) field in DocType 'Target Detail' #. Label of the fiscal_year (Data) field in DocType 'Stock Ledger Entry' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json @@ -20984,7 +21025,6 @@ msgstr "" #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js:15 #: erpnext/setup/doctype/target_detail/target_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Fiscal Year" msgstr "" @@ -21046,7 +21086,7 @@ msgstr "" msgid "Fixed Asset Defaults" msgstr "" -#: erpnext/stock/doctype/item/item.py:374 +#: erpnext/stock/doctype/item/item.py:379 msgid "Fixed Asset Item must be a non-stock item." msgstr "" @@ -21171,7 +21211,7 @@ msgstr "" msgid "For" msgstr "" -#: erpnext/public/js/utils/sales_common.js:395 +#: erpnext/public/js/utils/sales_common.js:393 msgid "For 'Product Bundle' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Product Bundle' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table." msgstr "" @@ -21267,11 +21307,11 @@ msgstr "" #. Label of the warehouse (Link) field in DocType 'Material Request Plan Item' #. Label of the for_warehouse (Link) field in DocType 'Production Plan' #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:499 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:497 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:180 #: erpnext/selling/doctype/sales_order/sales_order.js:1488 -#: erpnext/stock/doctype/material_request/material_request.js:361 +#: erpnext/stock/doctype/material_request/material_request.js:362 #: erpnext/templates/form_grid/material_request_grid.html:36 msgid "For Warehouse" msgstr "" @@ -21399,7 +21439,7 @@ msgctxt "Clear payment terms template and/or payment schedule when due date is c msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:272 +#: erpnext/stock/services/serial_batch_bundle_service.py:274 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" @@ -21616,7 +21656,7 @@ msgstr "" msgid "From Date and To Date are required" msgstr "" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:30 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:40 msgid "From Date and To Date lie in different Fiscal Year" msgstr "" @@ -21639,9 +21679,9 @@ msgstr "" #: erpnext/accounts/report/general_ledger/general_ledger.py:86 #: erpnext/accounts/report/pos_register/pos_register.py:124 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:32 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:25 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:34 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:38 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:35 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:39 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:49 msgid "From Date must be before To Date" msgstr "" @@ -22098,7 +22138,7 @@ msgstr "" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:138 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:225 -#: erpnext/setup/doctype/company/company.py:751 +#: erpnext/setup/doctype/company/company.py:753 msgid "Gain/Loss on Asset Disposal" msgstr "" @@ -22165,7 +22205,10 @@ msgstr "" msgid "General Ledger requires {0} to be synced to DuckDB" msgstr "" +#. Label of the general_settings_section (Section Break) field in DocType +#. 'Global Defaults' #. Label of the gs (Section Break) field in DocType 'Item Group' +#: erpnext/setup/doctype/global_defaults/global_defaults.json #: erpnext/setup/doctype/item_group/item_group.json msgid "General Settings" msgstr "" @@ -22277,7 +22320,7 @@ msgstr "" msgid "Get Current Stock" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:190 +#: erpnext/selling/doctype/customer/customer.js:199 msgid "Get Customer Group Details" msgstr "" @@ -22341,15 +22384,15 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1254 #: erpnext/stock/doctype/delivery_note/delivery_note.js:187 #: erpnext/stock/doctype/delivery_note/delivery_note.js:239 -#: erpnext/stock/doctype/material_request/material_request.js:141 -#: erpnext/stock/doctype/material_request/material_request.js:238 +#: erpnext/stock/doctype/material_request/material_request.js:144 +#: erpnext/stock/doctype/material_request/material_request.js:241 #: 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:461 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:508 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:541 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:632 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:800 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:460 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:507 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:540 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:631 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:799 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "" @@ -22364,9 +22407,9 @@ msgstr "" msgid "Get Items for Purchase Only" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:836 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:849 +#: erpnext/stock/doctype/material_request/material_request.js:347 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:835 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:848 msgid "Get Items from BOM" msgstr "" @@ -22450,7 +22493,7 @@ msgstr "" msgid "Get Started Sections" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:581 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:579 msgid "Get Stock" msgstr "" @@ -22460,7 +22503,7 @@ msgstr "" msgid "Get Sub Assembly Items" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:151 +#: erpnext/buying/doctype/supplier/supplier.js:160 msgid "Get Supplier Group Details" msgstr "" @@ -22552,7 +22595,7 @@ msgstr "" msgid "Goods" msgstr "" -#: erpnext/setup/doctype/company/company.py:455 +#: erpnext/setup/doctype/company/company.py:457 #: erpnext/stock/doctype/stock_entry/stock_entry_list.js:34 msgid "Goods In Transit" msgstr "" @@ -22561,7 +22604,7 @@ msgstr "" msgid "Goods Transferred" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1335 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1348 msgid "Goods are already received against the outward entry {0}" msgstr "" @@ -23193,7 +23236,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:2142 +#: erpnext/stock/stock_ledger.py:2190 msgid "Here are the options to proceed:" msgstr "" @@ -23221,7 +23264,7 @@ msgstr "" msgid "Hertz" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:615 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:764 msgid "Hi," msgstr "" @@ -23236,8 +23279,7 @@ msgstr "" msgid "Hidden list maintaining the list of contacts linked to Shareholder" msgstr "" -#. Label of the hide_currency_symbol (Select) field in DocType 'Global -#. Defaults' +#. Label of the hide_currency_symbol (Check) field in DocType 'Global Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Hide Currency Symbol" msgstr "" @@ -23425,7 +23467,7 @@ msgstr "" msgid "Hrs" msgstr "" -#: erpnext/setup/doctype/company/company.py:561 +#: erpnext/setup/doctype/company/company.py:563 msgid "Human Resources" msgstr "" @@ -23599,6 +23641,23 @@ msgstr "" msgid "If checked, the tax amount will be considered as already included in the Print Rate / Print Amount" msgstr "" +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Customer' +#: erpnext/selling/doctype/customer/customer.json +msgid "If checked, this Customer is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "If checked, this Item is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Supplier' +#: erpnext/buying/doctype/supplier/supplier.json +msgid "If checked, this Supplier is only available for transactions in the companies listed below." +msgstr "" + #. Description of the 'Delivered by Supplier (Drop Ship)' (Check) field in #. DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -23857,7 +23916,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:2152 +#: erpnext/stock/stock_ledger.py:2200 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -23903,7 +23962,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:2145 +#: erpnext/stock/stock_ledger.py:2193 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 "" @@ -23990,7 +24049,7 @@ msgstr "" msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "" -#: erpnext/stock/doctype/item/item.js:1572 +#: erpnext/stock/doctype/item/item.js:1589 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 "" @@ -24004,7 +24063,7 @@ msgstr "" msgid "If you still want to proceed, please disable {0} checkbox." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:469 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:475 msgid "If you still want to proceed, please enable {0}." msgstr "" @@ -24171,7 +24230,7 @@ msgstr "" msgid "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports" msgstr "" -#: erpnext/stock/doctype/item/item.py:269 +#: erpnext/stock/doctype/item/item.py:274 msgid "Image in the description has been removed. To disable this behavior, uncheck \"{0}\" in {1}." msgstr "" @@ -24336,7 +24395,7 @@ msgid "In Production" 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/batch_wise_balance_history/batch_wise_balance_history.py:87 #: erpnext/stock/report/stock_balance/stock_balance.py:547 #: erpnext/stock/report/stock_ledger/stock_ledger.py:317 msgid "In Qty" @@ -24360,11 +24419,11 @@ msgstr "" msgid "In Transit" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:477 +#: erpnext/stock/doctype/material_request/material_request.js:478 msgid "In Transit Transfer" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:446 +#: erpnext/stock/doctype/material_request/material_request.js:447 msgid "In Transit Warehouse" msgstr "" @@ -24471,7 +24530,7 @@ msgstr "" msgid "In this case, the amount will be calculated as 25% of the transaction amount. If the transaction amount is 200, then this will be calculated as 200 * 0.25 = 50." msgstr "" -#: erpnext/stock/doctype/item/item.js:1605 +#: erpnext/stock/doctype/item/item.js:1622 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "" @@ -24740,6 +24799,10 @@ msgstr "" msgid "Income Account" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:86 +msgid "Income Account Validation Error" +msgstr "" + #. Label of the income_and_expense_account (Section Break) field in DocType #. 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -24751,7 +24814,9 @@ msgstr "" msgid "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront." msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Bills" msgstr "" @@ -24766,7 +24831,9 @@ msgstr "" msgid "Incoming Call Settings" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Payment" msgstr "" @@ -24813,7 +24880,7 @@ msgstr "" msgid "Incorrect Batch Consumed" msgstr "" -#: erpnext/stock/doctype/item/item.py:604 +#: erpnext/stock/doctype/item/item.py:609 msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "" @@ -25101,7 +25168,7 @@ msgstr "" msgid "Installation Note Item" msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:635 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:640 msgid "Installation Note {0} has already been submitted" msgstr "" @@ -25151,13 +25218,13 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:466 #: erpnext/stock/doctype/pick_list/pick_list.py:148 #: erpnext/stock/doctype/pick_list/pick_list.py:166 -#: erpnext/stock/doctype/pick_list/pick_list.py:1130 -#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1827 -#: erpnext/stock/stock_ledger.py:2334 +#: erpnext/stock/doctype/pick_list/pick_list.py:1139 +#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1875 +#: erpnext/stock/stock_ledger.py:2382 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2349 +#: erpnext/stock/stock_ledger.py:2397 msgid "Insufficient Stock for Batch" msgstr "" @@ -25287,7 +25354,7 @@ msgstr "" msgid "Interest Income" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2729 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2727 msgid "Interest and/or dunning fee" msgstr "" @@ -25312,7 +25379,7 @@ msgstr "" msgid "Internal Customer Accounting" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:259 +#: erpnext/selling/doctype/customer/customer.py:271 msgid "Internal Customer for company {0} already exists" msgstr "" @@ -25338,7 +25405,7 @@ msgstr "" msgid "Internal Supplier Details" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:181 +#: erpnext/buying/doctype/supplier/supplier.py:190 msgid "Internal Supplier for company {0} already exists" msgstr "" @@ -25399,8 +25466,8 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:381 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:770 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:780 #: erpnext/accounts/services/taxes.py:271 #: erpnext/accounts/services/taxes.py:279 #: erpnext/assets/doctype/asset_category/asset_category.py:69 @@ -25425,7 +25492,7 @@ msgstr "" msgid "Invalid Attribute" msgstr "" -#: erpnext/stock/doctype/item/item.js:1199 +#: erpnext/stock/doctype/item/item.js:1216 msgid "Invalid Attribute Values" msgstr "" @@ -25462,7 +25529,7 @@ msgstr "" msgid "Invalid Company for Inter Company Transaction." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:972 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:978 msgid "Invalid Configuration" msgstr "" @@ -25472,7 +25539,7 @@ msgstr "" msgid "Invalid Cost Center" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:372 +#: erpnext/selling/doctype/customer/customer.py:386 msgid "Invalid Customer Group" msgstr "" @@ -25527,7 +25594,7 @@ msgstr "" msgid "Invalid Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1566 +#: erpnext/stock/doctype/item/item.py:1571 msgid "Invalid Item Defaults" msgstr "" @@ -25613,7 +25680,7 @@ msgstr "" msgid "Invalid Selling Price" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:975 msgid "Invalid Serial and Batch Bundle" msgstr "" @@ -25666,7 +25733,7 @@ msgstr "" msgid "Invalid lost reason {0}, please create a new lost reason" msgstr "" -#: erpnext/stock/doctype/item/item.py:478 +#: erpnext/stock/doctype/item/item.py:483 msgid "Invalid naming series (. missing) for {0}" msgstr "" @@ -25694,7 +25761,7 @@ msgstr "" msgid "Invalid status group: {0}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 msgid "Invalid subcontract order field: {0}" msgstr "" @@ -25961,7 +26028,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:1198 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 #: erpnext/accounts/report/accounts_payable/accounts_payable.js:270 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:64 @@ -26000,11 +26067,6 @@ msgstr "" msgid "Inward" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Inward Order" -msgstr "" - #. Label of the is_account_payable (Check) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json @@ -26577,7 +26639,7 @@ msgstr "" msgid "Issue Date" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:180 +#: erpnext/stock/doctype/material_request/material_request.js:183 msgid "Issue Material" msgstr "" @@ -26651,7 +26713,7 @@ msgstr "" msgid "Issuing Date" msgstr "" -#: erpnext/stock/doctype/item/item.py:649 +#: erpnext/stock/doctype/item/item.py:654 msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "" @@ -26763,7 +26825,7 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:93 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.js:24 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:32 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:76 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 #: erpnext/stock/report/item_price_stock/item_price_stock.js:8 #: erpnext/stock/report/item_prices/item_prices.py:50 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:88 @@ -26798,8 +26860,6 @@ msgstr "" #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Item" msgstr "" @@ -27029,7 +27089,7 @@ msgstr "" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.js:27 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:128 -#: erpnext/projects/doctype/timesheet/timesheet.js:214 +#: erpnext/projects/doctype/timesheet/timesheet.js:216 #: erpnext/public/js/controllers/transaction.js:2951 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:608 @@ -27284,7 +27344,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/page/stock_balance/stock_balance.js:35 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:43 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:54 #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:48 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:48 #: erpnext/stock/report/item_prices/item_prices.py:52 @@ -27318,11 +27378,11 @@ msgstr "" msgid "Item Group Name" msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:119 +#: erpnext/setup/doctype/item_group/item_group.js:136 msgid "Item Group Override" msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:82 +#: erpnext/setup/doctype/item_group/item_group.js:99 msgid "Item Group Tree" msgstr "" @@ -27551,7 +27611,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:32 #: erpnext/stock/report/available_serial_no/available_serial_no.py:99 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:33 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:77 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:153 #: erpnext/stock/report/item_price_stock/item_price_stock.py:24 #: erpnext/stock/report/item_prices/item_prices.py:51 @@ -27625,8 +27685,8 @@ msgstr "" msgid "Item Price Stock" msgstr "" -#: erpnext/stock/get_item_details.py:1182 -#: erpnext/stock/get_item_details.py:1206 +#: erpnext/stock/get_item_details.py:1181 +#: erpnext/stock/get_item_details.py:1205 msgid "Item Price added for {0} in Price List - {1}" msgstr "" @@ -27634,11 +27694,11 @@ msgstr "" msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "" -#: erpnext/stock/doctype/item/item.py:183 +#: erpnext/stock/doctype/item/item.py:187 msgid "Item Price created at rate {0}" msgstr "" -#: erpnext/stock/get_item_details.py:1165 +#: erpnext/stock/get_item_details.py:1164 msgid "Item Price updated for {0} in Price List {1}" msgstr "" @@ -27781,7 +27841,6 @@ msgstr "" #. Label of the item_tax_template (Link) field in DocType 'Item Tax' #. Label of the item_tax_template (Link) field in DocType 'Purchase Receipt #. Item' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/item_tax_template/item_tax_template.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -27794,7 +27853,6 @@ msgstr "" #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/workspace_sidebar/taxes.json msgid "Item Tax Template" msgstr "" @@ -27831,7 +27889,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:239 +#: erpnext/stock/doctype/item/item.js:250 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -27839,11 +27897,11 @@ msgstr "" msgid "Item Variant Settings" msgstr "" -#: erpnext/stock/doctype/item/item.js:1421 +#: erpnext/stock/doctype/item/item.js:1438 msgid "Item Variant {0} already exists with same attributes" msgstr "" -#: erpnext/stock/doctype/item/item.py:840 +#: erpnext/stock/doctype/item/item.py:845 msgid "Item Variants updated" msgstr "" @@ -27951,7 +28009,7 @@ msgstr "" msgid "Item for row {0} does not match Material Request" msgstr "" -#: erpnext/stock/doctype/item/item.py:899 +#: erpnext/stock/doctype/item/item.py:904 msgid "Item has variants." msgstr "" @@ -27977,10 +28035,14 @@ msgstr "" msgid "Item operation" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:622 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:635 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "" +#: erpnext/stock/doctype/material_request/material_request.py:231 +msgid "Item rates have been updated based on the selected Buying Price List {0}" +msgstr "" + #. Label of the item (Link) field in DocType 'BOM' #. Label of the finished_good (Link) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/bom/bom.json @@ -27996,7 +28058,7 @@ msgstr "" msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "" -#: erpnext/stock/doctype/item/item.py:1056 +#: erpnext/stock/doctype/item/item.py:1061 msgid "Item variant {0} exists with same attributes" msgstr "" @@ -28021,7 +28083,7 @@ msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" msgstr "" #: erpnext/assets/doctype/asset/asset.py:347 -#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:700 msgid "Item {0} does not exist" msgstr "" @@ -28030,7 +28092,7 @@ msgid "Item {0} does not exist in the system or has expired" msgstr "" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1489 -#: erpnext/stock/services/serial_batch_bundle_service.py:388 +#: erpnext/stock/services/serial_batch_bundle_service.py:390 msgid "Item {0} does not exist." msgstr "" @@ -28054,15 +28116,15 @@ msgstr "" msgid "Item {0} has no changes in delivered quantity. Please unselect the row if you do not wish to update its quantity." msgstr "" -#: erpnext/stock/doctype/item/item.py:1278 +#: erpnext/stock/doctype/item/item.py:1283 msgid "Item {0} has reached its end of life on {1}" msgstr "" -#: erpnext/stock/stock_ledger.py:164 +#: erpnext/stock/stock_ledger.py:168 msgid "Item {0} ignored since it is not a stock item" msgstr "" -#: erpnext/stock/get_item_details.py:357 +#: erpnext/stock/get_item_details.py:356 msgid "Item {0} is a template, please select one of its variants" msgstr "" @@ -28070,11 +28132,11 @@ msgstr "" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1298 +#: erpnext/stock/doctype/item/item.py:1303 msgid "Item {0} is cancelled" msgstr "" -#: erpnext/stock/doctype/item/item.py:1282 +#: erpnext/stock/doctype/item/item.py:1287 msgid "Item {0} is disabled" msgstr "" @@ -28086,7 +28148,7 @@ msgstr "" msgid "Item {0} is not a serialized Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1290 +#: erpnext/stock/doctype/item/item.py:1295 msgid "Item {0} is not a stock Item" msgstr "" @@ -28094,11 +28156,11 @@ msgstr "" msgid "Item {0} is not a subcontracted item" msgstr "" -#: erpnext/stock/doctype/item/item.py:857 +#: erpnext/stock/doctype/item/item.py:862 msgid "Item {0} is not a template item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1258 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1271 msgid "Item {0} is not active or end of life has been reached" msgstr "" @@ -28106,7 +28168,7 @@ msgstr "" msgid "Item {0} must be a Fixed Asset Item" msgstr "" -#: erpnext/stock/get_item_details.py:363 +#: erpnext/stock/get_item_details.py:362 msgid "Item {0} must be a Non-Stock Item" msgstr "" @@ -28122,11 +28184,11 @@ msgstr "" msgid "Item {0} not found." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:315 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:316 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:602 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:600 msgid "Item {0}: {1} qty produced. " msgstr "" @@ -28172,7 +28234,7 @@ msgstr "" msgid "Item-wise sales Register" msgstr "" -#: erpnext/stock/get_item_details.py:767 +#: erpnext/stock/get_item_details.py:766 msgid "Item/Item Code required to get Item Tax Template." msgstr "" @@ -28205,11 +28267,6 @@ msgstr "" msgid "Items Required" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Items To Be Received" -msgstr "" - #. Label of a Link in the Buying Workspace #. Name of a report #. Label of a Workspace Sidebar Item @@ -28240,7 +28297,7 @@ msgstr "" msgid "Items not found." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:618 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:631 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "" @@ -28541,8 +28598,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:390 -#: erpnext/assets/doctype/asset/asset.js:399 +#: erpnext/assets/doctype/asset/asset.js:398 +#: erpnext/assets/doctype/asset/asset.js:407 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -28559,10 +28616,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Journal Entry Template" msgstr "" @@ -28839,7 +28894,7 @@ msgstr "" msgid "Last Fiscal Year" msgstr "" -#: erpnext/accounts/doctype/account/account.py:673 +#: erpnext/accounts/doctype/account/account.py:680 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." msgstr "" @@ -29093,7 +29148,7 @@ msgstr "" msgid "Leave Encashed?" msgstr "" -#: erpnext/stock/doctype/item/item.js:980 +#: erpnext/stock/doctype/item/item.js:997 msgid "Leave as 0 to allow zero valuation rate." msgstr "" @@ -29170,11 +29225,11 @@ msgstr "" msgid "Left Index" msgstr "" -#: erpnext/stock/doctype/item/item.js:402 +#: erpnext/stock/doctype/item/item.js:413 msgid "Left column shows inherited defaults (Item Group → Company / Stock Settings). Right column is where you set overrides for this item only." msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:136 +#: erpnext/setup/doctype/item_group/item_group.js:153 msgid "Left column shows system-level defaults (Company / Stock Settings). Right column is where you set overrides for this item group." msgstr "" @@ -29321,11 +29376,11 @@ msgstr "" msgid "Link to Material Requests" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:164 +#: erpnext/buying/doctype/supplier/supplier.js:173 msgid "Link with Customer" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:203 +#: erpnext/selling/doctype/customer/customer.js:212 msgid "Link with Supplier" msgstr "" @@ -29346,20 +29401,20 @@ msgstr "" msgid "Linked Location" msgstr "" -#: erpnext/stock/doctype/item/item.py:1132 +#: erpnext/stock/doctype/item/item.py:1137 msgid "Linked with submitted documents" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:251 -#: erpnext/selling/doctype/customer/customer.js:283 +#: erpnext/buying/doctype/supplier/supplier.js:260 +#: erpnext/selling/doctype/customer/customer.js:292 msgid "Linking Failed" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:250 +#: erpnext/buying/doctype/supplier/supplier.js:259 msgid "Linking to Customer Failed. Please try again." msgstr "" -#: erpnext/selling/doctype/customer/customer.js:282 +#: erpnext/selling/doctype/customer/customer.js:291 msgid "Linking to Supplier failed. Please try again." msgstr "" @@ -29535,7 +29590,7 @@ msgstr "" #. 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/report/lost_opportunity/lost_opportunity.py:54 -#: erpnext/public/js/utils/sales_common.js:602 +#: erpnext/public/js/utils/sales_common.js:600 #: erpnext/selling/doctype/quotation/quotation.json msgid "Lost Reasons" msgstr "" @@ -29722,10 +29777,10 @@ msgstr "" msgid "Machine operator errors" msgstr "" -#: erpnext/setup/doctype/company/company.py:789 -#: erpnext/setup/doctype/company/company.py:804 -#: erpnext/setup/doctype/company/company.py:805 +#: erpnext/setup/doctype/company/company.py:791 #: erpnext/setup/doctype/company/company.py:806 +#: erpnext/setup/doctype/company/company.py:807 +#: erpnext/setup/doctype/company/company.py:808 msgid "Main" msgstr "" @@ -30049,11 +30104,11 @@ msgstr "" msgid "Make project from a template." msgstr "" -#: erpnext/stock/doctype/item/item.js:1216 +#: erpnext/stock/doctype/item/item.js:1233 msgid "Make {0} Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:1217 +#: erpnext/stock/doctype/item/item.js:1234 msgid "Make {0} Variants" msgstr "" @@ -30076,7 +30131,7 @@ msgstr "" msgid "Manage your orders" msgstr "" -#: erpnext/setup/doctype/company/company.py:567 +#: erpnext/setup/doctype/company/company.py:569 msgid "Management" msgstr "" @@ -30191,8 +30246,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:721 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:738 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:734 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:751 #: 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 @@ -30413,7 +30468,7 @@ msgstr "" msgid "Manufacturing Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:67 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:72 msgid "Manufacturing Variance for {0}" msgstr "" @@ -30531,7 +30586,7 @@ msgstr "" msgid "Market Segment" msgstr "" -#: erpnext/setup/doctype/company/company.py:519 +#: erpnext/setup/doctype/company/company.py:521 msgid "Marketing" msgstr "" @@ -30622,12 +30677,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:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:735 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:688 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:687 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "" @@ -30657,7 +30712,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:77 -#: erpnext/stock/doctype/material_request/material_request.js:188 +#: erpnext/stock/doctype/material_request/material_request.js:191 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Receipt" @@ -30716,13 +30771,13 @@ msgstr "" #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:37 #: 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:437 -#: erpnext/stock/doctype/material_request/material_request.py:454 +#: erpnext/stock/doctype/material_request/material_request.py:476 +#: erpnext/stock/doctype/material_request/material_request.py:493 #: 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:309 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:465 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:308 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:464 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:135 #: erpnext/stock/workspace/stock/stock.json @@ -30810,7 +30865,7 @@ msgstr "" msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:149 +#: erpnext/stock/doctype/material_request/material_request.py:150 msgid "Material Request of maximum {0} can be made for Item {1} against Sales Order {2}" msgstr "" @@ -30878,7 +30933,7 @@ msgstr "" #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/setup/setup_wizard/operations/install_fixtures.py:83 #: erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/material_request/material_request.js:166 +#: erpnext/stock/doctype/material_request/material_request.js:169 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -30886,7 +30941,7 @@ msgstr "" msgid "Material Transfer" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:172 +#: erpnext/stock/doctype/material_request/material_request.js:175 msgid "Material Transfer (In Transit)" msgstr "" @@ -30943,11 +30998,6 @@ msgstr "" msgid "Materials Ready" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Materials To Be Transferred" -msgstr "" - #: erpnext/controllers/subcontracting_controller.py:1554 msgid "Materials are already received against the {0} {1}" msgstr "" @@ -31028,7 +31078,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:1072 #: erpnext/manufacturing/doctype/work_order/work_order.js:1095 #: erpnext/stock/doctype/pick_list/pick_list.js:208 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:404 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:403 msgid "Max: {0}" msgstr "" @@ -31089,7 +31139,7 @@ msgstr "" msgid "Maximum discount for Item {0} is {1}%" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:120 +#: erpnext/public/js/utils/barcode_scanner.js:125 msgid "Maximum quantity scanned for item {0}." msgstr "" @@ -31127,7 +31177,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2158 +#: erpnext/stock/stock_ledger.py:2206 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -31410,7 +31460,7 @@ msgstr "" msgid "Min Qty should be greater than Recurse Over Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:1372 +#: erpnext/stock/doctype/item/item.js:1389 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "" @@ -31504,7 +31554,7 @@ msgstr "" msgid "Miscellaneous Expenses" msgstr "" -#: erpnext/controllers/buying_controller.py:729 +#: erpnext/controllers/buying_controller.py:737 msgid "Mismatch" msgstr "" @@ -31550,7 +31600,7 @@ msgstr "" msgid "Missing Finance Book" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:897 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "Missing Finished Good" msgstr "" @@ -31566,7 +31616,7 @@ msgstr "" msgid "Missing Parameter" msgstr "" -#: erpnext/utilities/__init__.py:57 +#: erpnext/utilities/__init__.py:84 msgid "Missing Payments App" msgstr "" @@ -31574,7 +31624,7 @@ msgstr "" msgid "Missing Required Filter" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:297 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:300 msgid "Missing Serial No Bundle" msgstr "" @@ -31635,7 +31685,6 @@ msgstr "" #. Label of the mode_of_payment (Link) field in DocType 'Purchase Invoice' #. Label of the mode_of_payment (Link) field in DocType 'Sales Invoice Payment' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:234 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:433 #: erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json @@ -31662,7 +31711,6 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.js:40 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/selling/page/point_of_sale/pos_controller.js:33 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Mode of Payment" msgstr "" @@ -31848,7 +31896,7 @@ msgstr "" msgid "Multiple Accounts (Journal Template)" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:443 +#: erpnext/selling/doctype/customer/customer.py:460 msgid "Multiple Loyalty Programs found for Customer {0}. Please select manually." msgstr "" @@ -31866,7 +31914,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:263 +#: erpnext/stock/doctype/item/item.js:274 msgid "Multiple Variants" msgstr "" @@ -31878,7 +31926,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:904 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:917 msgid "Multiple items cannot be marked as finished item" msgstr "" @@ -32355,10 +32403,6 @@ msgstr "" msgid "New Asset Value" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:169 -msgid "New Assets (This Year)" -msgstr "" - #. Label of the new_bom (Link) field in DocType 'BOM Update Log' #. Label of the new_bom (Link) field in DocType 'BOM Update Tool' #: erpnext/manufacturing/doctype/bom/bom_tree.js:62 @@ -32477,6 +32521,12 @@ msgstr "" msgid "New Sales Invoice" msgstr "" +#. Description of the 'Overdue Billing Threshold' (Currency) field in DocType +#. 'Customer Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "New Sales Invoices are blocked when the customer's overdue amount exceeds this. Requires 'Enable Overdue Billing Threshold' in Accounts Settings." +msgstr "" + #. Label of the sales_order (Check) field in DocType 'Email Digest' #: erpnext/setup/doctype/email_digest/email_digest.json msgid "New Sales Orders" @@ -32509,7 +32559,7 @@ msgstr "" msgid "New Workplace" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:408 +#: erpnext/selling/doctype/customer/customer.py:425 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}" msgstr "" @@ -32596,7 +32646,7 @@ msgstr "" msgid "No Answer" msgstr "" -#: erpnext/stock/doctype/item/item.js:924 +#: erpnext/stock/doctype/item/item.js:941 msgid "No Company Found" msgstr "" @@ -32604,7 +32654,7 @@ msgstr "" msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:436 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:435 msgid "No Customers found with selected options." msgstr "" @@ -32620,11 +32670,11 @@ msgstr "" msgid "No Impact on Accounting Ledger" msgstr "" -#: erpnext/stock/get_item_details.py:338 +#: erpnext/stock/get_item_details.py:337 msgid "No Item with Barcode {0}" msgstr "" -#: erpnext/stock/get_item_details.py:342 +#: erpnext/stock/get_item_details.py:341 msgid "No Item with Serial No {0}" msgstr "" @@ -32663,7 +32713,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1124 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1200 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1221 -#: erpnext/stock/doctype/item/item.py:1525 +#: erpnext/stock/doctype/item/item.py:1530 msgid "No Permission" msgstr "" @@ -32671,7 +32721,7 @@ msgstr "" msgid "No Purchase Invoices selected" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:102 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:116 msgid "No Purchase Orders were created" msgstr "" @@ -32687,7 +32737,7 @@ msgstr "" msgid "No Serial / Batches are available for return" msgstr "" -#: erpnext/stock/stock_ledger.py:928 +#: erpnext/stock/stock_ledger.py:976 msgid "No Standard Valuation Rate found for Item {0} in Company {1} as on {2}. Please create an Item Standard Cost record." msgstr "" @@ -32727,7 +32777,7 @@ msgstr "" msgid "No Unreconciled Payments found for this party" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:100 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:114 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:250 msgid "No Work Orders were created" msgstr "" @@ -32736,7 +32786,7 @@ msgstr "" msgid "No account set" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:356 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:365 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:211 msgid "No accounting entries for the following warehouses" msgstr "" @@ -32765,7 +32815,7 @@ msgstr "" msgid "No additional fields available" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1390 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1391 msgid "No available quantity to reserve for item {0} in warehouse {1}" msgstr "" @@ -32781,7 +32831,7 @@ msgstr "" msgid "No bank transactions found" msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:502 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:501 msgid "No billing email found for customer: {0}" msgstr "" @@ -32805,7 +32855,7 @@ msgstr "" msgid "No data found. Seems like you uploaded a blank file" msgstr "" -#: erpnext/stock/doctype/item/item.js:954 +#: erpnext/stock/doctype/item/item.js:971 msgid "No default warehouse set for this company. Entry will use Stock Settings default." msgstr "" @@ -32991,7 +33041,7 @@ msgstr "" msgid "No pending Material Requests found to link for the given items." msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:509 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:508 msgid "No primary email found for customer: {0}" msgstr "" @@ -33096,7 +33146,7 @@ msgstr "" msgid "No vouchers found for this transaction" msgstr "" -#: erpnext/stock/doctype/item/item.py:1782 +#: erpnext/stock/doctype/item/item.py:1787 msgid "No warehouse found for company {0}. Please set a Default Warehouse in Item Defaults or Stock Settings." msgstr "" @@ -33318,7 +33368,7 @@ msgstr "" msgid "Note: This Cost Center is a Group. Cannot make accounting entries against groups." msgstr "" -#: erpnext/stock/doctype/item/item.py:686 +#: erpnext/stock/doctype/item/item.py:691 msgid "Note: To merge the items, create a separate Stock Reconciliation for the old item {0}" msgstr "" @@ -33673,10 +33723,16 @@ msgstr "" msgid "On enabling this cancellation entries will be posted on the actual cancellation date and reports will consider cancelled entries as well" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:756 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:754 msgid "On expanding a row in the Items to Manufacture table, you'll see an option to 'Include Exploded Items'. Ticking this includes raw materials of the sub-assembly items in the production process." msgstr "" +#. Option for the 'Status' (Select) field in DocType 'Project' +#: erpnext/projects/doctype/project/project.json +#: erpnext/projects/doctype/project/project_list.js:8 +msgid "On hold" +msgstr "" + #. Description of the 'Excluded Fee' (Currency) field in DocType 'Bank #. Transaction' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json @@ -33817,7 +33873,7 @@ msgstr "" msgid "Only one version of a Product Bundle can be active at a time for a given Parent Item. Activating a version deactivates the previously active one." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:737 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:750 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "" @@ -33988,9 +34044,7 @@ msgid "Opening" msgstr "" #. Group in POS Profile's connections -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Opening & Closing" msgstr "" @@ -34097,11 +34151,6 @@ msgstr "" msgid "Opening Invoice Item" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Opening Invoice Tool" -msgstr "" - #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:849 #: erpnext/accounts/doctype/sales_invoice/services/gl_composer.py:644 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." @@ -34128,7 +34177,7 @@ msgstr "" msgid "Opening Purchase Invoice(s) have been created." msgstr "" -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 #: erpnext/stock/report/stock_balance/stock_balance.py:533 msgid "Opening Qty" msgstr "" @@ -34139,31 +34188,31 @@ msgstr "" #. Label of the opening_stock (Float) field in DocType 'Item' #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' -#: erpnext/stock/doctype/item/item.js:969 erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/item/item.py:353 -#: erpnext/stock/doctype/item/item.py:1682 +#: erpnext/stock/doctype/item/item.js:986 erpnext/stock/doctype/item/item.json +#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:1687 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Opening Stock" msgstr "" -#: erpnext/stock/doctype/item/item.py:1636 +#: erpnext/stock/doctype/item/item.py:1641 msgid "Opening Stock can only be set for stock items." msgstr "" -#: erpnext/stock/doctype/item/item.py:1643 +#: erpnext/stock/doctype/item/item.py:1648 msgid "Opening Stock cannot be created as stock transactions already exist for item {0}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1639 +#: erpnext/stock/doctype/item/item.py:1644 msgid "Opening Stock for serialised or batch items must be set via the Stock Reconciliation form." msgstr "" -#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:363 msgid "Opening Stock reconciliation created with zero valuation rate: {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:366 -#: erpnext/stock/doctype/item/item.py:1685 +#: erpnext/stock/doctype/item/item.py:371 +#: erpnext/stock/doctype/item/item.py:1690 msgid "Opening Stock reconciliation created: {0}" msgstr "" @@ -34185,7 +34234,7 @@ msgstr "" msgid "Opening and Closing balance is not supported for dimension grouped cash flow statement" msgstr "" -#: erpnext/stock/doctype/item/item.py:199 +#: erpnext/stock/doctype/item/item.py:203 msgid "Opening stock creation has been queued and will be created in the background. Please check the Stock Reconciliation after some time." msgstr "" @@ -34339,7 +34388,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:334 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/public/js/shop_floor/shop_floor.js:387 -#: erpnext/setup/doctype/company/company.py:537 +#: erpnext/setup/doctype/company/company.py:539 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -34684,14 +34733,10 @@ msgstr "" #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' #. Label of a Desktop Icon -#. Name of a Workspace -#. 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/setup/workspace/organization/organization.json -#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "" @@ -34791,7 +34836,7 @@ msgid "Ounce/Gallon (US)" 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/batch_wise_balance_history/batch_wise_balance_history.py:88 #: erpnext/stock/report/stock_balance/stock_balance.py:555 #: erpnext/stock/report/stock_ledger/stock_ledger.py:324 msgid "Out Qty" @@ -34815,7 +34860,7 @@ msgstr "" msgid "Out of Order" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:663 +#: erpnext/stock/doctype/pick_list/pick_list.py:672 msgid "Out of Stock" msgstr "" @@ -34836,12 +34881,16 @@ msgstr "" msgid "Outdated POS Opening Entry" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Bills" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Payment" msgstr "" @@ -34931,11 +34980,6 @@ msgstr "" msgid "Outward" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Outward Order" -msgstr "" - #. Label of the over_billing_allowance (Currency) field in DocType 'Accounts #. Settings' #. Label of the over_billing_allowance (Float) field in DocType 'Item' @@ -35018,6 +35062,16 @@ msgstr "" msgid "Overdue" msgstr "" +#: erpnext/selling/doctype/customer/customer.py:612 +msgid "Overdue Billing Limit Crossed" +msgstr "" + +#. Label of the overdue_billing_threshold (Currency) field in DocType 'Customer +#. Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "Overdue Billing Threshold" +msgstr "" + #. Label of the overdue_days (Data) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Overdue Days" @@ -35721,7 +35775,7 @@ msgstr "" msgid "Parent Account" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:385 msgid "Parent Account Missing" msgstr "" @@ -35735,7 +35789,7 @@ msgstr "" msgid "Parent Company" msgstr "" -#: erpnext/setup/doctype/company/company.py:672 +#: erpnext/setup/doctype/company/company.py:674 msgid "Parent Company must be a group company" msgstr "" @@ -35866,7 +35920,7 @@ msgstr "" msgid "Partial Payment in POS Transactions are not allowed." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1755 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1757 msgid "Partial Stock Reservation" msgstr "" @@ -36693,7 +36747,7 @@ msgstr "" msgid "Payment Gateway Account" msgstr "" -#: erpnext/accounts/utils.py:1528 +#: erpnext/accounts/utils.py:1522 msgid "Payment Gateway Account not created, please create one manually." msgstr "" @@ -36967,7 +37021,6 @@ msgstr "" #. Label of the payment_term (Link) field in DocType 'Payment Terms Template #. Detail' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -36979,7 +37032,6 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/controllers/transaction.js:559 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:32 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" msgstr "" @@ -37287,7 +37339,7 @@ msgstr "" msgid "Pending activities for today" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:277 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:285 msgid "Pending processing" msgstr "" @@ -37432,11 +37484,9 @@ msgstr "" #. Balance' #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Period Closing Voucher" msgstr "" @@ -37658,7 +37708,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sales_order/sales_order.js:1066 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 -#: erpnext/stock/doctype/material_request/material_request.js:156 +#: erpnext/stock/doctype/material_request/material_request.js:159 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -37837,10 +37887,8 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json -#: erpnext/workspace_sidebar/banking.json msgid "Plaid Settings" msgstr "" @@ -37995,7 +38043,7 @@ msgstr "" msgid "Plants and Machineries" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:660 +#: erpnext/stock/doctype/pick_list/pick_list.py:669 msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List." msgstr "" @@ -38021,7 +38069,7 @@ msgstr "" msgid "Please Specify Account" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:129 +#: erpnext/buying/doctype/supplier/supplier.py:137 msgid "Please add 'Supplier' role to user {0}." msgstr "" @@ -38037,7 +38085,7 @@ msgstr "" msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:421 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:422 msgid "Please add Root Account for - {0}" msgstr "" @@ -38053,7 +38101,7 @@ msgstr "" msgid "Please add at least one Serial No / Batch No" msgstr "" -#: erpnext/stock/doctype/item/item.js:925 +#: erpnext/stock/doctype/item/item.js:942 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." msgstr "" @@ -38070,7 +38118,7 @@ msgstr "" msgid "Please add the account to root level Company - {0}" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:305 +#: erpnext/controllers/website_list_for_contact.py:307 msgid "Please add {1} role to user {0}." msgstr "" @@ -38082,7 +38130,7 @@ msgstr "" msgid "Please attach CSV file" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1257 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1263 msgid "Please cancel and amend the Payment Entry" msgstr "" @@ -38116,7 +38164,7 @@ msgstr "" msgid "Please check the 'Activate Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:621 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:770 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "" @@ -38157,11 +38205,11 @@ msgstr "" msgid "Please contact any of the following users for this transaction." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:534 +#: erpnext/selling/doctype/customer/customer.py:551 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:527 +#: erpnext/selling/doctype/customer/customer.py:544 msgid "Please contact your administrator to extend the credit limits for {0}." msgstr "" @@ -38189,7 +38237,7 @@ msgstr "" msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:716 +#: erpnext/stock/doctype/item/item.py:721 msgid "Please delete Product Bundle {0}, before merging {1} into {2}" msgstr "" @@ -38237,11 +38285,11 @@ msgstr "" msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 msgid "Please ensure {0} account is a Balance Sheet account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 msgid "Please ensure {0} account {1} is a Receivable account." msgstr "" @@ -38250,7 +38298,7 @@ msgid "Please enter Difference Account or set default Stock Adjustment msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:559 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:962 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 msgid "Please enter Account for Change Amount" msgstr "" @@ -38262,7 +38310,7 @@ msgstr "" msgid "Please enter Batch No" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:19 +#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:26 msgid "Please enter Cost Center" msgstr "" @@ -38279,7 +38327,7 @@ msgid "Please enter Expense Account" msgstr "" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:99 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:98 msgid "Please enter Item Code to get Batch Number" msgstr "" @@ -38315,7 +38363,7 @@ msgstr "" msgid "Please enter Reference date" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:400 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:401 msgid "Please enter Root Type for account- {0}" msgstr "" @@ -38336,7 +38384,7 @@ msgid "Please enter Warehouse and Date" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:501 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:958 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:964 msgid "Please enter Write Off Account" msgstr "" @@ -38380,7 +38428,7 @@ msgstr "" msgid "Please enter parent cost center" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:186 +#: erpnext/public/js/utils/barcode_scanner.js:191 msgid "Please enter quantity for item {0}" msgstr "" @@ -38404,7 +38452,7 @@ msgstr "" msgid "Please enter the phone number first" msgstr "" -#: erpnext/controllers/buying_controller.py:1193 +#: erpnext/controllers/buying_controller.py:1201 msgid "Please enter the {schedule_date}." msgstr "" @@ -38456,7 +38504,7 @@ msgstr "" msgid "Please make sure the employees above report to another Active employee." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:379 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:380 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "" @@ -38464,7 +38512,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for {0}. Your master data will remain as it is. This action cannot be undone." msgstr "" -#: erpnext/stock/doctype/item/item.js:1036 +#: erpnext/stock/doctype/item/item.js:1053 msgid "Please mention 'Weight UOM' along with Weight." msgstr "" @@ -38477,7 +38525,7 @@ msgstr "" msgid "Please mention no of visits required" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:73 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:74 msgid "Please mention the Current and New BOM for replacement." msgstr "" @@ -38565,7 +38613,7 @@ msgstr "" msgid "Please select Customer first" msgstr "" -#: erpnext/setup/doctype/company/company.py:603 +#: erpnext/setup/doctype/company/company.py:605 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "" @@ -38574,8 +38622,8 @@ msgstr "" msgid "Please select Finished Good Item for Service Item {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:763 -#: erpnext/assets/doctype/asset/asset.js:778 +#: erpnext/assets/doctype/asset/asset.js:771 +#: erpnext/assets/doctype/asset/asset.js:786 msgid "Please select Item Code first" msgstr "" @@ -38615,7 +38663,7 @@ msgstr "" msgid "Please select Qty against item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:390 +#: erpnext/stock/doctype/item/item.py:395 msgid "Please select Sample Retention Warehouse in Stock Settings first" msgstr "" @@ -38631,7 +38679,7 @@ msgstr "" msgid "Please select Stock Asset Account" msgstr "" -#: erpnext/setup/doctype/company/company.py:230 +#: erpnext/setup/doctype/company/company.py:232 msgid "Please select Stock Delivered But Not Billed Account" msgstr "" @@ -38645,7 +38693,7 @@ msgstr "" #: erpnext/accounts/party.py:447 #: erpnext/selling/page/sales_funnel/sales_funnel.py:19 -#: erpnext/stock/doctype/pick_list/pick_list.py:1400 +#: erpnext/stock/doctype/pick_list/pick_list.py:1409 msgid "Please select a Company" msgstr "" @@ -38752,7 +38800,7 @@ msgstr "" msgid "Please select a value for {0} quotation_to {1}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:194 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:203 msgid "Please select an item code before setting the warehouse." msgstr "" @@ -38842,7 +38890,7 @@ msgstr "" msgid "Please select the Multiple Tier Program type for more than one collection rule." msgstr "" -#: erpnext/stock/doctype/item/item.js:437 +#: erpnext/stock/doctype/item/item.js:448 msgid "Please select the Warehouse first" msgstr "" @@ -38950,10 +38998,6 @@ msgstr "" msgid "Please set Parent Row No for item {0}" msgstr "" -#: erpnext/controllers/buying_controller.py:355 -msgid "Please set Purchase Expense Contra Account in Company {0}" -msgstr "" - #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:24 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:35 msgid "Please set Root Type" @@ -38991,12 +39035,12 @@ msgstr "" msgid "Please set a Purchase Price Variance Account for Item {0} or a Default Purchase Price Variance Account in Company {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:341 -#: erpnext/stock/doctype/item/item.py:1669 +#: erpnext/stock/doctype/item/item.py:346 +#: erpnext/stock/doctype/item/item.py:1674 msgid "Please set a Temporary Opening account for company {0} to create an Opening Stock reconciliation." msgstr "" -#: erpnext/projects/doctype/project/project.py:807 +#: erpnext/projects/doctype/project/project.py:837 msgid "Please set a default Holiday List for Company {0}" msgstr "" @@ -39016,7 +39060,7 @@ msgstr "" msgid "Please set an Address on the Company '{0}'" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:194 +#: erpnext/stock/services/base_stock_gl_composer.py:261 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -39045,7 +39089,7 @@ msgstr "" msgid "Please set default Cash or Bank account in Mode of Payments {0}" msgstr "" -#: erpnext/accounts/utils.py:2570 +#: erpnext/accounts/utils.py:2564 msgid "Please set default Exchange Gain/Loss Account in Company {0}" msgstr "" @@ -39057,7 +39101,7 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:107 +#: erpnext/stock/services/base_stock_gl_composer.py:114 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "" @@ -39137,6 +39181,11 @@ msgstr "" msgid "Please set {0} in BOM Creator {1}" msgstr "" +#: erpnext/controllers/buying_controller.py:347 +#: erpnext/stock/services/base_stock_gl_composer.py:209 +msgid "Please set {0} in Company {1} or in the Item Defaults of Item {2}" +msgstr "" + #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1147 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "" @@ -39153,7 +39202,7 @@ msgstr "" msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "" -#: erpnext/stock/get_item_details.py:349 +#: erpnext/stock/get_item_details.py:348 msgid "Please specify Company" msgstr "" @@ -39192,7 +39241,7 @@ msgstr "" msgid "Please submit Purchase Order {0} before proceeding." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:284 msgid "Please try again in an hour." msgstr "" @@ -39200,7 +39249,7 @@ msgstr "" msgid "Please uncheck 'Show in Bucket View' to create Orders" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:237 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:240 msgid "Please update Repair Status." msgstr "" @@ -39503,7 +39552,7 @@ msgstr "" msgid "Posting date does not match the selected transaction" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:101 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:109 msgid "Posting date is required" msgstr "" @@ -39578,15 +39627,15 @@ msgstr "" msgid "Pre Sales" msgstr "" -#: erpnext/accounts/utils.py:2808 +#: erpnext/accounts/utils.py:2802 msgid "Pre-Submit Warning" msgstr "" -#: erpnext/accounts/utils.py:2857 +#: erpnext/accounts/utils.py:2851 msgid "Pre-Submit Warning: Credit Limit" msgstr "" -#: erpnext/accounts/utils.py:2869 +#: erpnext/accounts/utils.py:2863 msgid "Pre-Submit Warning: Packed Qty" msgstr "" @@ -39863,7 +39912,7 @@ msgstr "" msgid "Price List Currency" msgstr "" -#: erpnext/stock/get_item_details.py:1384 +#: erpnext/stock/get_item_details.py:1383 msgid "Price List Currency not selected" msgstr "" @@ -40434,7 +40483,6 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Process Payment Reconciliation" @@ -40693,7 +40741,7 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:543 +#: erpnext/setup/doctype/company/company.py:545 msgid "Production" msgstr "" @@ -40847,11 +40895,13 @@ msgstr "" #. Option for the 'Report Type' (Select) field in DocType 'Account' #. Option for the 'Report Type' (Select) field in DocType 'Process Period #. Closing Voucher Detail' +#. Label of a chart in the Accounting Workspace #. Label of a chart in the Financial Reports Workspace #. Label of a chart in the Invoicing Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/financial_statements.js:368 @@ -40911,7 +40961,7 @@ msgstr "" msgid "Progress (%)" msgstr "" -#: erpnext/projects/doctype/project/project.py:432 +#: erpnext/projects/doctype/project/project.py:434 msgid "Project Collaboration Invitation" msgstr "" @@ -40959,7 +41009,7 @@ msgstr "" msgid "Project Summary" msgstr "" -#: erpnext/projects/doctype/project/project.py:745 +#: erpnext/projects/doctype/project/project.py:775 msgid "Project Summary for {0}" msgstr "" @@ -41090,7 +41140,7 @@ msgstr "" #. Label of a Card Break in the Projects Workspace #. Title of a Workspace Sidebar #: erpnext/config/projects.py:7 erpnext/desktop_icon/projects.json -#: erpnext/projects/doctype/project/project.py:512 +#: erpnext/projects/doctype/project/project.py:542 #: erpnext/projects/workspace/projects/projects.json #: erpnext/selling/doctype/customer/customer_dashboard.py:26 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:28 @@ -41251,7 +41301,7 @@ msgstr "" msgid "Providing" msgstr "" -#: erpnext/setup/doctype/company/company.py:642 +#: erpnext/setup/doctype/company/company.py:644 msgid "Provisional Account" msgstr "" @@ -41331,7 +41381,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:531 erpnext/setup/install.py:413 +#: erpnext/setup/doctype/company/company.py:533 erpnext/setup/install.py:413 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item/item_list.js:30 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -41406,8 +41456,8 @@ msgstr "" msgid "Purchase Expense Contra Account" msgstr "" -#: erpnext/controllers/buying_controller.py:365 -#: erpnext/controllers/buying_controller.py:379 +#: erpnext/controllers/buying_controller.py:373 +#: erpnext/controllers/buying_controller.py:387 msgid "Purchase Expense for Item {0}" msgstr "" @@ -41454,7 +41504,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:446 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:445 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -41526,7 +41576,6 @@ msgstr "" #. Label of the purchase_order (Link) field in DocType 'Stock Entry' #. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt #. Item' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:61 #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -41545,7 +41594,7 @@ msgstr "" #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js:48 #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:205 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/buying_controller.py:929 +#: erpnext/controllers/buying_controller.py:937 #: erpnext/crm/doctype/contract/contract.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:54 #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -41554,14 +41603,12 @@ msgstr "" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:196 +#: erpnext/stock/doctype/material_request/material_request.js:199 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:217 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/buying.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Purchase Order" msgstr "" @@ -41662,7 +41709,7 @@ msgstr "" msgid "Purchase Order {0} is not submitted" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:582 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:583 msgid "Purchase Orders" msgstr "" @@ -41677,7 +41724,7 @@ msgstr "" msgid "Purchase Orders Items Overdue" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:277 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:278 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "" @@ -41706,7 +41753,7 @@ msgstr "" msgid "Purchase Price Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:88 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:93 msgid "Purchase Price Variance for {0}" msgstr "" @@ -41836,10 +41883,8 @@ msgid "Purchase Return" msgstr "" #. Label of the purchase_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:161 -#: erpnext/workspace_sidebar/taxes.json msgid "Purchase Tax Template" msgstr "" @@ -41939,7 +41984,7 @@ msgstr "" #: erpnext/stock/doctype/item/item_list.js:41 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:481 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:480 #: 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 @@ -42256,7 +42301,7 @@ msgstr "" msgid "Qty of Finished Goods Item" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:707 +#: erpnext/stock/doctype/pick_list/pick_list.py:716 msgid "Qty of Finished Goods Item should be greater than 0." msgstr "" @@ -42285,7 +42330,7 @@ msgstr "" msgid "Qty to Deliver" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:401 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:400 msgid "Qty to Disassemble" msgstr "" @@ -42554,7 +42599,7 @@ msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "" #: erpnext/public/js/controllers/transaction.js:446 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:212 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:211 msgid "Quality Inspection(s)" msgstr "" @@ -42563,7 +42608,7 @@ msgstr "" msgid "Quality Inspections" msgstr "" -#: erpnext/setup/doctype/company/company.py:573 +#: erpnext/setup/doctype/company/company.py:575 msgid "Quality Management" msgstr "" @@ -42706,11 +42751,11 @@ msgstr "" #: erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py:39 #: erpnext/stock/dashboard/item_dashboard.js:248 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:368 +#: erpnext/stock/doctype/material_request/material_request.js:369 #: 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:829 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:828 #: 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 @@ -42820,7 +42865,7 @@ msgstr "" msgid "Quantity and Warehouse" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:214 +#: erpnext/stock/doctype/material_request/material_request.py:253 msgid "Quantity cannot be greater than {0} for Item {1}" msgstr "" @@ -42836,7 +42881,7 @@ msgstr "" msgid "Quantity must be greater than zero" msgstr "" -#: erpnext/stock/doctype/item/item.py:1649 +#: erpnext/stock/doctype/item/item.py:1654 msgid "Quantity must be greater than zero." msgstr "" @@ -42871,11 +42916,11 @@ msgstr "" msgid "Quantity to Manufacture must be greater than 0." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:257 +#: erpnext/public/js/utils/barcode_scanner.js:262 msgid "Quantity to Scan" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:932 msgid "Quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -42904,7 +42949,7 @@ msgstr "" msgid "Query Route String" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:193 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:200 msgid "Queue Size should be between 5 and 100" msgstr "" @@ -43554,7 +43599,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:788 #: erpnext/selling/doctype/sales_order/sales_order.js:1012 #: erpnext/selling/doctype/sales_order/sales_order_list.js:70 -#: erpnext/stock/doctype/material_request/material_request.js:243 +#: erpnext/stock/doctype/material_request/material_request.js:246 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:163 msgid "Re-open" @@ -43872,7 +43917,7 @@ msgstr "" msgid "Received Quantity" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:377 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:376 msgid "Received Stock Entries" msgstr "" @@ -44014,11 +44059,6 @@ msgstr "" msgid "Reconciliation Progress" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Reconciliation Statement" -msgstr "" - #. Label of the reconciliation_takes_effect_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -44857,7 +44897,7 @@ msgstr "" msgid "Repost Item Valuation" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:376 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:399 msgid "Repost Item Valuation restarted for selected failed records." msgstr "" @@ -45042,7 +45082,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:270 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/stock/doctype/material_request/material_request.js:202 +#: erpnext/stock/doctype/material_request/material_request.js:205 #: erpnext/workspace_sidebar/buying.json msgid "Request for Quotation" msgstr "" @@ -45217,7 +45257,7 @@ msgstr "" msgid "Research" msgstr "" -#: erpnext/setup/doctype/company/company.py:579 +#: erpnext/setup/doctype/company/company.py:581 msgid "Research & Development" msgstr "" @@ -45308,7 +45348,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:665 +#: erpnext/stock/services/serial_batch_bundle_service.py:664 msgid "Reserved Batch Conflict" msgstr "" @@ -45378,7 +45418,7 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2452 +#: erpnext/stock/stock_ledger.py:2500 msgid "Reserved Serial No." msgstr "" @@ -45394,13 +45434,13 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.js:178 #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:573 -#: erpnext/stock/stock_ledger.py:2436 +#: erpnext/stock/stock_ledger.py:2484 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:204 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:332 msgid "Reserved Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2481 +#: erpnext/stock/stock_ledger.py:2529 msgid "Reserved Stock for Batch" msgstr "" @@ -45442,7 +45482,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:421 -#: erpnext/stock/doctype/pick_list/pick_list.js:306 +#: erpnext/stock/doctype/pick_list/pick_list.js:307 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:292 msgid "Reserving Stock..." msgstr "" @@ -45613,7 +45653,7 @@ msgstr "" msgid "Restart Subscription" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:183 +#: erpnext/assets/doctype/asset/asset.js:191 msgid "Restore Asset" msgstr "" @@ -45629,6 +45669,15 @@ msgstr "" msgid "Restrict Items Based On" msgstr "" +#. Label of the restrict_to_companies (Check) field in DocType 'Supplier' +#. Label of the restrict_to_companies (Check) field in DocType 'Customer' +#. Label of the restrict_to_companies (Check) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Restrict to Companies" +msgstr "" + #. Label of the section_break_6 (Section Break) field in DocType 'Shipping #. Rule' #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json @@ -45671,7 +45720,7 @@ msgstr "" msgid "Resume Job" msgstr "" -#: erpnext/projects/doctype/timesheet/timesheet.js:65 +#: erpnext/projects/doctype/timesheet/timesheet.js:66 msgid "Resume Timer" msgstr "" @@ -46097,6 +46146,12 @@ msgstr "" msgid "Role allowed to bypass credit limit" msgstr "" +#. Label of the role_allowed_to_bypass_overdue_billing (Link) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Role allowed to bypass overdue billing limit" +msgstr "" + #. Description of the 'Exempted Role' (Link) field in DocType 'Accounting #. Period' #: erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -46158,7 +46213,7 @@ msgstr "" msgid "Root Type" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:404 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:405 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "" @@ -46322,8 +46377,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:119 -#: erpnext/stock/services/base_stock_gl_composer.py:134 +#: erpnext/stock/services/base_stock_gl_composer.py:126 +#: erpnext/stock/services/base_stock_gl_composer.py:141 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -46380,7 +46435,7 @@ msgstr "" msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "" -#: erpnext/stock/doctype/item/item.py:585 +#: erpnext/stock/doctype/item/item.py:590 msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "" @@ -46596,11 +46651,11 @@ msgstr "" msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:196 +#: erpnext/stock/services/base_stock_gl_composer.py:263 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:145 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:148 msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "" @@ -46663,11 +46718,11 @@ msgstr "" msgid "Row #{0}: From Time and To Time fields are required" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:680 +#: erpnext/stock/doctype/pick_list/pick_list.py:689 msgid "Row #{0}: Item Code is Mandatory" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:427 +#: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Row #{0}: Item added" msgstr "" @@ -46679,7 +46734,7 @@ msgstr "" msgid "Row #{0}: Item {1} does not exist" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1659 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1661 msgid "Row #{0}: Item {1} has been picked, please reserve stock from the Pick List." msgstr "" @@ -46756,7 +46811,7 @@ msgstr "" msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1742 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1744 msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "" @@ -46809,7 +46864,7 @@ msgstr "" msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "" -#: erpnext/stock/doctype/item/item.py:592 +#: erpnext/stock/doctype/item/item.py:597 msgid "Row #{0}: Please set reorder quantity" msgstr "" @@ -46830,7 +46885,7 @@ msgstr "" msgid "Row #{0}: Product Bundle {1} is disabled and cannot be used in transactions." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:425 +#: erpnext/public/js/utils/barcode_scanner.js:433 msgid "Row #{0}: Qty increased by {1}" msgstr "" @@ -46867,7 +46922,7 @@ msgstr "" msgid "Row #{0}: Quantity of Item {1} cannot be more than {2} {3} against Subcontracting Inward Order {4}" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1727 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1729 msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "" @@ -46893,7 +46948,7 @@ msgstr "" msgid "Row #{0}: Rejected Warehouse is mandatory for the rejected Item {1}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:163 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:166 msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "" @@ -46928,7 +46983,7 @@ msgstr "" msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:123 +#: erpnext/stock/services/serial_batch_bundle_service.py:125 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -46996,7 +47051,7 @@ msgstr "" msgid "Row #{0}: Status must be {1} for Invoice Discounting {2}" msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:454 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:459 msgid "Row #{0}: Stock Delivered But Not Billed account cannot be used for items linked to a Sales Invoice" msgstr "" @@ -47004,19 +47059,19 @@ msgstr "" msgid "Row #{0}: Stock cannot be reserved for Item {1} against a disabled Batch {2}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1672 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1674 msgid "Row #{0}: Stock cannot be reserved for a non-stock Item {1}" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1685 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1687 msgid "Row #{0}: Stock cannot be reserved in group warehouse {1}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1701 msgid "Row #{0}: Stock is already reserved for the Item {1}." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:569 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:574 msgid "Row #{0}: Stock is reserved for item {1} in warehouse {2}." msgstr "" @@ -47025,11 +47080,11 @@ msgid "Row #{0}: Stock not available to reserve for Item {1} against Batch {2} i msgstr "" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1263 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1713 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1715 msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:944 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:950 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "" @@ -47037,7 +47092,7 @@ msgstr "" msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:141 +#: erpnext/stock/services/serial_batch_bundle_service.py:143 msgid "Row #{0}: The batch {1} has already expired." msgstr "" @@ -47049,7 +47104,7 @@ msgstr "" msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." msgstr "" -#: erpnext/stock/doctype/item/item.py:601 +#: erpnext/stock/doctype/item/item.py:606 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "" @@ -47069,7 +47124,7 @@ msgstr "" msgid "Row #{0}: Valuation Rate for Item {1} must be the same across all rows, as it is the item's company-wide Standard Cost." msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:57 +#: erpnext/stock/services/serial_batch_bundle_service.py:59 msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." msgstr "" @@ -47122,7 +47177,7 @@ msgstr "" msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "" -#: erpnext/stock/doctype/item/item.py:1557 +#: erpnext/stock/doctype/item/item.py:1562 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." msgstr "" @@ -47142,23 +47197,23 @@ msgstr "" msgid "Row #{idx}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor." msgstr "" -#: erpnext/controllers/buying_controller.py:633 +#: erpnext/controllers/buying_controller.py:641 msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "" -#: erpnext/controllers/buying_controller.py:1069 +#: erpnext/controllers/buying_controller.py:1077 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:726 +#: erpnext/controllers/buying_controller.py:734 msgid "Row #{idx}: Received Qty must be equal to Accepted + Rejected Qty for Item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:739 +#: erpnext/controllers/buying_controller.py:747 msgid "Row #{idx}: {field_label} can not be negative for item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:692 +#: erpnext/controllers/buying_controller.py:700 msgid "Row #{idx}: {field_label} is mandatory." msgstr "" @@ -47166,7 +47221,7 @@ msgstr "" msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "" -#: erpnext/controllers/buying_controller.py:1185 +#: erpnext/controllers/buying_controller.py:1193 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "" @@ -47218,11 +47273,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:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:729 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:556 +#: erpnext/stock/doctype/material_request/material_request.py:595 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "" @@ -47463,7 +47518,7 @@ msgstr "" msgid "Row {0}: Task {1} does not belong to Project {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:187 msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "" @@ -47540,7 +47595,7 @@ msgstr "" msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "" -#: erpnext/controllers/buying_controller.py:1051 +#: erpnext/controllers/buying_controller.py:1059 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "" @@ -47805,8 +47860,8 @@ msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:143 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:525 -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:527 +#: erpnext/setup/doctype/company/company.py:720 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 #: erpnext/setup/install.py:408 @@ -47821,7 +47876,7 @@ msgstr "" msgid "Sales & Purchase" msgstr "" -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:720 msgid "Sales Account" msgstr "" @@ -48019,7 +48074,7 @@ msgstr "" msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:626 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:631 msgid "Sales Invoice {0} has already been submitted" msgstr "" @@ -48071,7 +48126,6 @@ msgstr "" #. Label of the sales_order (Link) field in DocType 'Purchase Receipt Item' #. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation #. Entry' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json @@ -48111,7 +48165,7 @@ msgstr "" #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.js:157 #: erpnext/stock/doctype/delivery_note/delivery_note.js:223 -#: erpnext/stock/doctype/material_request/material_request.js:236 +#: erpnext/stock/doctype/material_request/material_request.js:239 #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -48120,9 +48174,7 @@ msgstr "" #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:159 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:30 #: erpnext/stock/report/delayed_order_report/delayed_order_report.py:74 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Sales Order" msgstr "" @@ -48225,7 +48277,7 @@ msgstr "" msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" -#: erpnext/projects/doctype/project/project.py:256 +#: erpnext/projects/doctype/project/project.py:258 msgid "Sales Order {0} is already linked to Project {1}, skipping the link." msgstr "" @@ -48234,7 +48286,7 @@ msgstr "" msgid "Sales Order {0} is not available for production" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 msgid "Sales Order {0} is not submitted" msgstr "" @@ -48518,10 +48570,8 @@ msgid "Sales Summary" msgstr "" #. Label of the sales_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:149 -#: erpnext/workspace_sidebar/taxes.json msgid "Sales Tax Template" msgstr "" @@ -48530,11 +48580,6 @@ msgstr "" msgid "Sales Tax Withholding Category" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Sales Taxes" -msgstr "" - #. Label of the taxes (Table) field in DocType 'POS Invoice' #. Label of the taxes (Table) field in DocType 'Sales Invoice' #. Name of a DocType @@ -48659,7 +48704,7 @@ msgid "Sample Quantity" msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:557 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:556 msgid "Sample Retention Stock Entry" msgstr "" @@ -48730,7 +48775,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/public/js/utils/barcode_scanner.js:236 +#: erpnext/public/js/utils/barcode_scanner.js:241 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -48762,7 +48807,7 @@ msgstr "" msgid "Scan Serial No" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:200 +#: erpnext/public/js/utils/barcode_scanner.js:205 msgid "Scan barcode for item {0}" msgstr "" @@ -48784,14 +48829,14 @@ msgstr "" msgid "Scanned Cheque" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:268 +#: erpnext/public/js/utils/barcode_scanner.js:273 msgid "Scanned Quantity" 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:383 +#: erpnext/assets/doctype/asset/asset.js:391 #: 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" @@ -48925,7 +48970,7 @@ msgstr "" msgid "Scrap" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:168 +#: erpnext/assets/doctype/asset/asset.js:176 msgid "Scrap Asset" msgstr "" @@ -48986,7 +49031,7 @@ msgstr "" msgid "Search transactions" msgstr "" -#: erpnext/stock/doctype/item/item.js:1099 +#: erpnext/stock/doctype/item/item.js:1116 msgid "Search values..." msgstr "" @@ -49114,7 +49159,7 @@ msgstr "" msgid "Select Alternative Items for Sales Order" msgstr "" -#: erpnext/stock/doctype/item/item.js:1225 +#: erpnext/stock/doctype/item/item.js:1242 msgid "Select Attribute Values" msgstr "" @@ -49126,9 +49171,9 @@ msgstr "" msgid "Select BOM and Qty for Production" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Batch No" msgstr "" @@ -49260,15 +49305,15 @@ msgstr "" msgid "Select Quantity" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Serial No" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:237 -#: erpnext/public/js/utils/sales_common.js:452 -#: erpnext/stock/doctype/pick_list/pick_list.js:401 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:246 +#: erpnext/public/js/utils/sales_common.js:450 +#: erpnext/stock/doctype/pick_list/pick_list.js:402 msgid "Select Serial and Batch" msgstr "" @@ -49306,7 +49351,7 @@ msgstr "" msgid "Select Warehouse..." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:580 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:578 msgid "Select Warehouses to get Stock for Materials Planning" msgstr "" @@ -49318,7 +49363,7 @@ msgstr "" msgid "Select a Company this Employee belongs to." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:221 +#: erpnext/buying/doctype/supplier/supplier.js:230 msgid "Select a Customer" msgstr "" @@ -49330,7 +49375,7 @@ msgstr "" msgid "Select a Payment Method." msgstr "" -#: erpnext/selling/doctype/customer/customer.js:253 +#: erpnext/selling/doctype/customer/customer.js:262 msgid "Select a Supplier" msgstr "" @@ -49357,7 +49402,7 @@ msgstr "" msgid "Select all" msgstr "" -#: erpnext/stock/doctype/item/item.js:1567 +#: erpnext/stock/doctype/item/item.js:1584 msgid "Select an Item Group." msgstr "" @@ -49374,7 +49419,7 @@ msgstr "" msgid "Select an item from each set to be used in the Sales Order." msgstr "" -#: erpnext/stock/doctype/item/item.js:1239 +#: erpnext/stock/doctype/item/item.js:1256 msgid "Select at least one attribute value." msgstr "" @@ -49445,7 +49490,7 @@ msgstr "" msgid "Select the customer or supplier." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:940 +#: erpnext/assets/doctype/asset/asset.js:948 msgid "Select the date" msgstr "" @@ -49471,7 +49516,7 @@ msgstr "" msgid "Select variant item code for the template item {0}" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:737 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:735 msgid "Select whether to get items from a Sales Order or a Material Request. For now select Sales Order.\n" " A Production Plan can also be created manually where you can select the Items to manufacture." msgstr "" @@ -49525,22 +49570,22 @@ msgstr "" msgid "Self delivery" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:647 +#: erpnext/assets/doctype/asset/asset.js:655 #: 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:176 -#: erpnext/assets/doctype/asset/asset.js:636 +#: erpnext/assets/doctype/asset/asset.js:184 +#: erpnext/assets/doctype/asset/asset.js:644 msgid "Sell Asset" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:641 +#: erpnext/assets/doctype/asset/asset.js:649 msgid "Sell Qty" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:657 +#: erpnext/assets/doctype/asset/asset.js:665 msgid "Sell quantity cannot exceed the asset quantity" msgstr "" @@ -49548,7 +49593,7 @@ msgstr "" msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:653 +#: erpnext/assets/doctype/asset/asset.js:661 msgid "Sell quantity must be greater than zero" msgstr "" @@ -49854,7 +49899,7 @@ msgstr "" msgid "Serial No Already Assigned" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:296 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:299 msgid "Serial No Bundle is mandatory for Item {0}" msgstr "" @@ -49875,11 +49920,11 @@ msgstr "" msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2766 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2768 msgid "Serial No Reserved" msgstr "" -#: erpnext/stock/doctype/item/item.py:496 +#: erpnext/stock/doctype/item/item.py:501 msgid "Serial No Series Overlap" msgstr "" @@ -49944,7 +49989,7 @@ msgstr "" msgid "Serial No {0} already exists" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:342 +#: erpnext/public/js/utils/barcode_scanner.js:347 msgid "Serial No {0} already scanned" msgstr "" @@ -49958,7 +50003,7 @@ msgstr "" #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py:52 #: erpnext/selling/doctype/installation_note/installation_note.py:84 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3564 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3566 msgid "Serial No {0} does not exist" msgstr "" @@ -49966,7 +50011,7 @@ msgstr "" msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:435 +#: erpnext/public/js/utils/barcode_scanner.js:443 msgid "Serial No {0} is already added" msgstr "" @@ -49994,7 +50039,7 @@ msgstr "" msgid "Serial No: {0} has already been transacted into another POS Invoice." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:292 +#: erpnext/public/js/utils/barcode_scanner.js:297 #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:201 #: erpnext/stock/doctype/batch/batch.py:393 @@ -50017,7 +50062,7 @@ msgstr "" msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2442 +#: erpnext/stock/stock_ledger.py:2490 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" @@ -50098,7 +50143,7 @@ msgstr "" msgid "Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/item/item.py:1150 +#: erpnext/stock/doctype/item/item.py:1155 msgid "Serial and Batch Bundle Exists" msgstr "" @@ -50110,7 +50155,7 @@ msgstr "" msgid "Serial and Batch Bundle updated" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:99 +#: erpnext/stock/services/serial_batch_bundle_service.py:101 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "" @@ -50187,7 +50232,7 @@ msgstr "" msgid "Series for Asset Depreciation Entry (Journal Entry)" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:143 +#: erpnext/buying/doctype/supplier/supplier.py:151 msgid "Series is mandatory" msgstr "" @@ -50467,7 +50512,7 @@ msgstr "" msgid "Set New Release Date" msgstr "" -#: erpnext/stock/doctype/item/item.js:207 +#: erpnext/stock/doctype/item/item.js:218 msgid "Set Opening Stock" msgstr "" @@ -50528,7 +50573,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Sales Order' #. Label of the set_warehouse (Link) field in DocType 'Delivery Note' #. Label of the set_from_warehouse (Link) field in DocType 'Material Request' -#: erpnext/public/js/utils/sales_common.js:574 +#: erpnext/public/js/utils/sales_common.js:572 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json @@ -50546,7 +50591,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Subcontracting Order' #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/public/js/utils/sales_common.js:571 +#: erpnext/public/js/utils/sales_common.js:569 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json @@ -50572,7 +50617,7 @@ msgstr "" msgid "Set as Completed" msgstr "" -#: erpnext/public/js/utils/sales_common.js:598 +#: erpnext/public/js/utils/sales_common.js:596 #: erpnext/selling/doctype/quotation/quotation.js:146 msgid "Set as Lost" msgstr "" @@ -50599,11 +50644,11 @@ msgstr "" msgid "Set closing balance as per bank statement" msgstr "" -#: erpnext/setup/doctype/company/company.py:615 +#: erpnext/setup/doctype/company/company.py:617 msgid "Set default inventory account for perpetual inventory" msgstr "" -#: erpnext/setup/doctype/company/company.py:641 +#: erpnext/setup/doctype/company/company.py:643 msgid "Set default {0} account for non stock items" msgstr "" @@ -50817,44 +50862,34 @@ msgstr "" #. Label of the share_balance (Table) field in DocType 'Shareholder' #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_balance/share_balance.json #: erpnext/accounts/doctype/shareholder/shareholder.js:21 #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Balance" msgstr "" #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.js:27 #: erpnext/accounts/report/share_ledger/share_ledger.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Ledger" msgstr "" #. Label of a Card Break in the Invoicing Workspace -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/accounts/workspace/share_management/share_management.json #: erpnext/desktop_icon/share_management.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Management" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/report/share_ledger/share_ledger.py:59 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Transfer" msgstr "" @@ -50871,14 +50906,12 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.js:16 #: erpnext/accounts/report/share_balance/share_balance.py:55 #: erpnext/accounts/report/share_ledger/share_ledger.js:16 #: erpnext/accounts/report/share_ledger/share_ledger.py:51 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Shareholder" msgstr "" @@ -50892,7 +50925,7 @@ msgid "Shelf Life in Days" msgstr "" #. Label of the shift (Link) field in DocType 'Depreciation Schedule' -#: erpnext/assets/doctype/asset/asset.js:396 +#: erpnext/assets/doctype/asset/asset.js:404 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Shift" msgstr "" @@ -50964,7 +50997,7 @@ msgstr "" msgid "Shipment details" msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:656 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:661 msgid "Shipments" msgstr "" @@ -51330,7 +51363,7 @@ msgstr "" msgid "Show Variant Attributes" msgstr "" -#: erpnext/stock/doctype/item/item.js:231 +#: erpnext/stock/doctype/item/item.js:242 msgid "Show Variants" msgstr "" @@ -51521,11 +51554,11 @@ msgstr "" msgid "Since you have enabled 'Track Semi Finished Goods', at least one operation must have 'Is Final Finished Good' checked. For that set the FG / Semi FG Item as {0} against an operation." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:134 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:142 msgid "Since {0} are Serial No/Batch No items, you cannot enable 'Recreate Stock Ledgers' in Repost Item Valuation." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:114 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:122 msgid "Since {0} has 'Update Stock' disabled, you cannot create repost item valuation against it" msgstr "" @@ -51547,7 +51580,7 @@ msgstr "" msgid "Single Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:256 +#: erpnext/stock/doctype/item/item.js:267 msgid "Single Variant" msgstr "" @@ -51739,11 +51772,11 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:135 -#: erpnext/public/js/utils/sales_common.js:570 +#: erpnext/public/js/utils/sales_common.js:568 #: 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:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:819 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "" @@ -51833,15 +51866,15 @@ msgstr "" msgid "Spent" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:697 +#: erpnext/assets/doctype/asset/asset.js:705 #: erpnext/stock/doctype/batch/batch.js:104 #: erpnext/stock/doctype/batch/batch.js:185 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:152 -#: erpnext/assets/doctype/asset/asset.js:681 +#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:689 msgid "Split Asset" msgstr "" @@ -51865,7 +51898,7 @@ msgstr "" msgid "Split Issue" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:687 +#: erpnext/assets/doctype/asset/asset.js:695 msgid "Split Qty" msgstr "" @@ -51940,13 +51973,13 @@ msgstr "" msgid "Stale Days" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:163 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:170 msgid "Stale Days should start from 1." msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:485 -#: erpnext/tests/utils.py:275 +#: erpnext/tests/utils.py:276 msgid "Standard Buying" msgstr "" @@ -51973,8 +52006,8 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:493 -#: erpnext/stock/doctype/item/item.py:291 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2523 +#: erpnext/stock/doctype/item/item.py:296 erpnext/tests/utils.py:284 +#: erpnext/tests/utils.py:2524 msgid "Standard Selling" msgstr "" @@ -52077,7 +52110,7 @@ msgstr "" msgid "Start Time can't be greater than or equal to End Time for {0}." msgstr "" -#: erpnext/projects/doctype/timesheet/timesheet.js:62 +#: erpnext/projects/doctype/timesheet/timesheet.js:63 msgid "Start Timer" msgstr "" @@ -52202,7 +52235,7 @@ msgstr "" msgid "Status and Reference" msgstr "" -#: erpnext/projects/doctype/project/project.py:788 +#: erpnext/projects/doctype/project/project.py:818 msgid "Status must be Cancelled or Completed" msgstr "" @@ -52291,7 +52324,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:170 +#: erpnext/stock/doctype/item/item.js:181 #: 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 @@ -52348,7 +52381,7 @@ msgstr "" msgid "Stock Delivered But Not Billed" msgstr "" -#: erpnext/setup/doctype/company/company.py:217 +#: erpnext/setup/doctype/company/company.py:219 msgid "Stock Delivered But Not Billed Account cannot be changed or disabled since account {0} contains outstanding Delivery Notes: {1}" msgstr "" @@ -52386,7 +52419,6 @@ msgstr "" #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Stock Entry" msgstr "" @@ -52433,6 +52465,18 @@ msgstr "" msgid "Stock Entry {0} is not submitted" msgstr "" +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Company' +#: erpnext/setup/doctype/company/company.json +msgid "Stock Expense" +msgstr "" + +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Stock Expense Accounting" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:87 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:147 msgid "Stock Expenses" @@ -52455,7 +52499,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:180 +#: erpnext/stock/doctype/item/item.js:191 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -52573,7 +52617,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:190 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -52626,7 +52670,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:137 #: erpnext/stock/workspace/stock/stock.json @@ -52645,7 +52689,7 @@ msgstr "" msgid "Stock Reconciliation that revalues on-hand stock to this standard rate: auto-created when the rate is changed here, or the reconciliation that captured this rate (opening entry or rate change)." msgstr "" -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 msgid "Stock Reconciliations" msgstr "" @@ -52686,12 +52730,12 @@ msgstr "" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:869 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:680 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1266 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1675 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1688 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1702 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1730 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1747 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1677 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1690 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1704 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1718 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1732 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1749 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/doctype/stock_settings/stock_settings.py:225 #: erpnext/stock/doctype/stock_settings/stock_settings.py:237 @@ -52704,7 +52748,7 @@ msgstr "" msgid "Stock Reservation" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1858 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1860 msgid "Stock Reservation Entries Cancelled" msgstr "" @@ -52712,7 +52756,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/services/reservation.py:152 #: erpnext/manufacturing/doctype/work_order/services/reservation.py:597 #: erpnext/selling/doctype/sales_order/services/reservation.py:133 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1808 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1810 msgid "Stock Reservation Entries Created" msgstr "" @@ -52739,7 +52783,7 @@ msgstr "" msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:579 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:584 msgid "Stock Reservation Warehouse Mismatch" msgstr "" @@ -52779,7 +52823,7 @@ msgstr "" #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/item/item.js:486 +#: erpnext/stock/doctype/item/item.js:497 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:681 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -53016,15 +53060,15 @@ msgstr "" msgid "Stock cannot be reserved in group warehouse {0}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1620 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1622 msgid "Stock cannot be reserved in the group warehouse {0}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:906 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:912 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:982 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:988 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "" @@ -53088,11 +53132,11 @@ msgstr "" msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "" -#: erpnext/setup/doctype/company/company.py:452 +#: erpnext/setup/doctype/company/company.py:454 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:537 -#: erpnext/stock/doctype/item/item.py:329 -#: erpnext/stock/doctype/item/item.py:1776 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:334 +#: erpnext/stock/doctype/item/item.py:1781 erpnext/tests/utils.py:249 msgid "Stores" msgstr "" @@ -53206,12 +53250,8 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontract Order Summary" msgstr "" @@ -53229,16 +53269,14 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Item To Be Received" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:224 +#: erpnext/stock/doctype/material_request/material_request.js:227 msgid "Subcontracted Purchase Order" msgstr "" @@ -53254,12 +53292,10 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Raw Materials To Be Transferred" msgstr "" @@ -53269,25 +53305,19 @@ msgstr "" #. 'Production Plan Sub Assembly Item' #. Label of a Card Break in the Manufacturing Workspace #. Option for the 'Purpose' (Select) field in DocType 'Material Request' -#. Name of a Workspace -#. Title of a Workspace Sidebar #: erpnext/desktop_icon/subcontracting.json #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:10 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting" msgstr "" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting BOM" msgstr "" @@ -53302,14 +53332,10 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/setup/setup_wizard/operations/install_fixtures.py:132 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:158 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Delivery" msgstr "" @@ -53333,24 +53359,14 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Name of a DocType -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/selling/doctype/sales_order/sales_order.js:1049 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Inward Order" msgstr "" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward Order Count" -msgstr "" - #. Label of the subcontracting_inward_order_item (Data) field in DocType 'Work #. Order' #. Name of a DocType @@ -53383,7 +53399,6 @@ msgstr "" #. Receipt Item' #. Label of the subcontracting_order (Link) field in DocType 'Subcontracting #. Receipt Supplied Item' -#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:370 #: erpnext/controllers/subcontracting_controller.py:1156 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -53393,7 +53408,6 @@ msgstr "" #: 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 msgid "Subcontracting Order" msgstr "" @@ -53427,18 +53441,6 @@ msgstr "" msgid "Subcontracting Order {0} created." msgstr "" -#. Label of a chart in the Subcontracting Workspace -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order" -msgstr "" - -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order Count" -msgstr "" - #. Label of the purchase_order (Link) field in DocType 'Subcontracting Order' #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json msgid "Subcontracting Purchase Order" @@ -53454,8 +53456,6 @@ msgstr "" #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' #. Name of a DocType -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json @@ -53463,8 +53463,6 @@ msgstr "" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:637 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Receipt" msgstr "" @@ -53580,7 +53578,6 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_subscription/process_subscription.json @@ -53595,7 +53592,6 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation_dashboard.py:12 #: erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py:25 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py:34 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription" msgstr "" @@ -53630,10 +53626,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_plan/subscription_plan.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Plan" msgstr "" @@ -53659,7 +53653,6 @@ msgstr "" #: erpnext/accounts/doctype/subscription_settings/subscription_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/workspace_sidebar/erpnext_settings.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Settings" msgstr "" @@ -53672,11 +53665,7 @@ msgstr "" msgid "Subscription for Future dates cannot be processed." msgstr "" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/subscriptions/subscriptions.json #: erpnext/selling/doctype/customer/customer_dashboard.py:28 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscriptions" msgstr "" @@ -53715,7 +53704,7 @@ msgstr "" msgid "Successfully Set Supplier" msgstr "" -#: erpnext/stock/doctype/item/item.py:409 +#: erpnext/stock/doctype/item/item.py:414 msgid "Successfully changed Stock UOM, please redefine conversion factors for new UOM." msgstr "" @@ -53735,11 +53724,11 @@ msgstr "" msgid "Successfully imported {0} records." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:243 +#: erpnext/buying/doctype/supplier/supplier.js:252 msgid "Successfully linked to Customer" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:275 +#: erpnext/selling/doctype/customer/customer.js:284 msgid "Successfully linked to Supplier" msgstr "" @@ -53902,7 +53891,7 @@ msgstr "" #: erpnext/public/js/purchase_trends_filters.js:63 #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/regional/report/irs_1099/irs_1099.py:76 -#: erpnext/selling/doctype/customer/customer.js:257 +#: erpnext/selling/doctype/customer/customer.js:266 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:187 #: erpnext/selling/doctype/sales_order/sales_order.js:1741 @@ -53921,7 +53910,6 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:524 #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Supplier" msgstr "" @@ -54199,7 +54187,7 @@ msgstr "" #: erpnext/buying/workspace/buying/buying.json #: erpnext/crm/doctype/opportunity/opportunity.js:81 #: erpnext/selling/doctype/quotation/quotation.json -#: erpnext/stock/doctype/material_request/material_request.js:208 +#: erpnext/stock/doctype/material_request/material_request.js:211 #: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation" msgstr "" @@ -54455,7 +54443,7 @@ msgstr "" msgid "Synchronize all accounts every hour" msgstr "" -#: erpnext/accounts/doctype/account/account.py:676 +#: erpnext/accounts/doctype/account/account.py:683 msgid "System In Use" msgstr "" @@ -54502,9 +54490,7 @@ msgid "TDS / withholding tax category applied when paying this supplier" msgstr "" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.json -#: erpnext/workspace_sidebar/taxes.json msgid "TDS Computation Summary" msgstr "" @@ -54659,7 +54645,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:826 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:825 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "" @@ -54779,7 +54765,7 @@ msgstr "" #. Label of the amount (Currency) field in DocType 'Item Wise Tax Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:244 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:91 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:101 msgid "Tax Amount" msgstr "" @@ -54859,7 +54845,6 @@ msgstr "" #. Label of the tax_category (Link) field in DocType 'Delivery Note' #. Label of the tax_category (Link) field in DocType 'Item Tax' #. Label of the tax_category (Link) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -54879,7 +54864,6 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Category" msgstr "" @@ -54918,7 +54902,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:229 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:67 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:205 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:57 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:67 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Tax Id" @@ -54958,7 +54942,7 @@ msgid "Tax Rate" msgstr "" #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:237 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:84 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:94 msgid "Tax Rate %" msgstr "" @@ -54978,10 +54962,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Rule" msgstr "" @@ -55040,7 +55022,6 @@ msgstr "" #. Label of the tax_withholding_category (Link) field in DocType 'Lower #. Deduction Certificate' #. Label of the tax_withholding_category (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -55048,19 +55029,16 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:199 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:72 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:82 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Category" msgstr "" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Details" msgstr "" @@ -55105,7 +55083,6 @@ msgstr "" #. Rate' #. Label of the tax_withholding_group (Link) field in DocType 'Supplier' #. Label of the tax_withholding_group (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -55115,7 +55092,6 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Group" msgstr "" @@ -55181,12 +55157,10 @@ msgstr "" #. Label of the taxes (Table) field in DocType 'POS Closing Entry' #. Label of the taxes_section (Section Break) field in DocType 'POS Profile' #. Label of the sb_1 (Section Break) field in DocType 'Subscription' -#. Name of a Workspace #. Label of a Desktop Icon #. Label of the taxes_section (Section Break) field in DocType 'Sales Order' #. Label of the taxes (Table) field in DocType 'Item Group' #. Label of the taxes (Table) field in DocType 'Item' -#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html:60 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -55194,10 +55168,10 @@ msgstr "" #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:12 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:27 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:43 -#: erpnext/accounts/workspace/taxes/taxes.json erpnext/desktop_icon/taxes.json +#: erpnext/desktop_icon/taxes.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/item_group/item_group.json -#: erpnext/stock/doctype/item/item.json erpnext/workspace_sidebar/taxes.json +#: erpnext/stock/doctype/item/item.json msgid "Taxes" msgstr "" @@ -55320,7 +55294,7 @@ msgstr "" msgid "Taxes and Charges Deducted (Company Currency)" msgstr "" -#: erpnext/stock/doctype/item/item.py:422 +#: erpnext/stock/doctype/item/item.py:427 msgid "Taxes row #{0}: {1} cannot be smaller than {2}" msgstr "" @@ -55371,7 +55345,7 @@ msgstr "" msgid "Template Item" msgstr "" -#: erpnext/stock/get_item_details.py:358 +#: erpnext/stock/get_item_details.py:357 msgid "Template Item Selected" msgstr "" @@ -55494,7 +55468,6 @@ msgstr "" #. Name of a DocType #. Label of the terms (Text Editor) field in DocType 'Terms and Conditions' #. Label of the terms (Text Editor) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -55509,7 +55482,6 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Terms and Conditions" msgstr "" @@ -55753,7 +55725,7 @@ msgstr "" msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1384 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1397 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" msgstr "" @@ -55765,7 +55737,7 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2763 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2765 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" @@ -55773,7 +55745,7 @@ msgstr "" msgid "The Serial Nos {0} have not been supplied against the {1} {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:959 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:972 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 "" @@ -55809,8 +55781,8 @@ msgstr "" msgid "The bank account is not a company account. Please select a company account" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:654 -msgid "The batch {0} is already reserved in {1} {2}. So, cannot proceed with the {3} {4}, which is created against the {5} {6}." +#: erpnext/stock/services/serial_batch_bundle_service.py:655 +msgid "The batch {0} is reserved for {1} in the warehouse {2} and the remaining quantity is not enough to cover the reservations. So, cannot proceed with the {3} {4}." msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:41 @@ -55878,7 +55850,7 @@ msgstr "" msgid "The field {0} in row {1} is not set" msgstr "" -#: erpnext/stock/stock_ledger.py:445 +#: erpnext/stock/stock_ledger.py:475 msgid "The field {0} is required for reposting" msgstr "" @@ -55907,7 +55879,7 @@ msgstr "" msgid "The following Items, having Putaway Rules, could not be accommodated:" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:137 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:140 msgid "The following Purchase Invoices are not submitted:" msgstr "" @@ -55923,7 +55895,7 @@ msgstr "" msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "" -#: erpnext/stock/doctype/item/item.py:953 +#: erpnext/stock/doctype/item/item.py:958 msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "" @@ -55940,11 +55912,11 @@ msgid "The following payment schedule(s) already exist:\n" "{0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:111 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:114 msgid "The following rows are duplicates:" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:566 +#: erpnext/stock/doctype/material_request/material_request.py:605 msgid "The following {0} were created: {1}" msgstr "" @@ -55967,15 +55939,15 @@ msgstr "" msgid "The invoice is not fully allocated as there is a difference of {0}." msgstr "" -#: erpnext/controllers/buying_controller.py:1244 +#: erpnext/controllers/buying_controller.py:1252 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "" -#: erpnext/stock/doctype/item/item.py:679 +#: erpnext/stock/doctype/item/item.py:684 msgid "The items {0} and {1} are present in the following {2} :" msgstr "" -#: erpnext/controllers/buying_controller.py:1237 +#: erpnext/controllers/buying_controller.py:1245 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "" @@ -55991,7 +55963,7 @@ msgstr "" msgid "The last account row must not have any debit or credit amounts set." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:533 +#: erpnext/public/js/utils/barcode_scanner.js:542 msgid "The last scanned warehouse has been cleared and won't be set in the subsequently scanned items" msgstr "" @@ -56033,7 +56005,7 @@ msgstr "" msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:234 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:235 msgid "The parent account {0} does not exists in the uploaded template" msgstr "" @@ -56096,7 +56068,7 @@ msgstr "" msgid "The root account {0} must be a group" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:87 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:88 msgid "The selected BOMs are not for the same item" msgstr "" @@ -56108,7 +56080,7 @@ msgstr "" msgid "The selected item cannot have Batch" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:662 +#: erpnext/assets/doctype/asset/asset.js:670 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 "" @@ -56137,7 +56109,7 @@ msgstr "" msgid "The shares don't exist with the {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:908 +#: erpnext/stock/stock_ledger.py:956 msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." msgstr "" @@ -56171,11 +56143,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:352 +#: erpnext/stock/doctype/material_request/material_request.py:391 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:359 +#: erpnext/stock/doctype/material_request/material_request.py:398 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "" @@ -56243,11 +56215,11 @@ msgstr "" msgid "The {0} contains Unit Price Items." msgstr "" -#: erpnext/stock/doctype/item/item.py:493 +#: erpnext/stock/doctype/item/item.py:498 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:572 +#: erpnext/stock/doctype/material_request/material_request.py:611 msgid "The {0} {1} created successfully" msgstr "" @@ -56308,7 +56280,7 @@ msgstr "" msgid "There are no transactions in the system for the selected bank account and dates that match the filters." msgstr "" -#: erpnext/stock/doctype/item/item.js:1591 +#: erpnext/stock/doctype/item/item.js:1608 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 "" @@ -56344,7 +56316,7 @@ msgstr "" msgid "There is one unreconciled transaction before {0}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:896 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:909 msgid "There must be at least 1 Finished Good in this Stock Entry" msgstr "" @@ -56392,11 +56364,11 @@ msgstr "" msgid "This Fiscal Year" msgstr "" -#: erpnext/stock/doctype/item/item.js:224 +#: erpnext/stock/doctype/item/item.js:235 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:281 +#: erpnext/stock/doctype/item/item.js:292 msgid "This Item is a Variant of {0} (Template)." msgstr "" @@ -56523,7 +56495,7 @@ msgstr "" msgid "This is a root department and cannot be edited." msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:98 +#: erpnext/setup/doctype/item_group/item_group.js:115 msgid "This is a root item group and cannot be edited." msgstr "" @@ -56563,7 +56535,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:1579 +#: erpnext/stock/doctype/item/item.js:1596 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 "" @@ -56646,7 +56618,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:328 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:331 msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "" @@ -57213,7 +57185,7 @@ msgstr "" msgid "To add Operations tick the 'With Operations' checkbox." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:770 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:768 msgid "To add subcontracted Item's raw materials if include exploded items is disabled." msgstr "" @@ -57257,7 +57229,7 @@ msgstr "" msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:763 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:761 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "" @@ -57272,7 +57244,7 @@ msgstr "" msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" -#: erpnext/stock/doctype/item/item.py:701 +#: erpnext/stock/doctype/item/item.py:706 msgid "To merge, following properties must be same for both items" msgstr "" @@ -57532,10 +57504,6 @@ msgstr "" msgid "Total Asset Cost" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:158 -msgid "Total Assets" -msgstr "" - #. Label of the total_billable_amount (Currency) field in DocType 'Timesheet' #: erpnext/projects/doctype/timesheet/timesheet.json msgid "Total Billable Amount" @@ -58047,7 +58015,7 @@ msgstr "" msgid "Total Tax" msgstr "" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:86 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:96 msgid "Total Taxable Amount" msgstr "" @@ -58211,7 +58179,7 @@ msgstr "" msgid "Total allocated percentage for sales team should be 100" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:197 +#: erpnext/selling/doctype/customer/customer.py:205 msgid "Total contribution percentage should be equal to 100" msgstr "" @@ -58370,7 +58338,7 @@ msgstr "" msgid "Transaction Dates" msgstr "" -#: erpnext/setup/doctype/company/company.py:1140 +#: erpnext/setup/doctype/company/company.py:1142 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "" @@ -58551,9 +58519,10 @@ msgstr "" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "" -#. Description of the 'Credit Limit' (Table) field in DocType 'Customer' +#. Description of the 'Credit & Overdue Limits' (Table) field in DocType +#. 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Transactions are blocked or warned when outstanding balance exceeds this amount." +msgid "Transactions are blocked when the outstanding balance exceeds the credit limit. When the overdue billing setting is enabled, new invoices are also blocked when the customer's overdue amount exceeds the overdue billing threshold." msgstr "" #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:239 @@ -58595,7 +58564,7 @@ msgstr "" msgid "Transfer Account" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:168 msgid "Transfer Asset" msgstr "" @@ -58605,7 +58574,7 @@ msgstr "" msgid "Transfer Extra Raw Materials to WIP (%)" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:485 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:483 msgid "Transfer From Warehouses" msgstr "" @@ -58623,7 +58592,7 @@ msgstr "" msgid "Transfer Materials" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:479 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:477 msgid "Transfer Materials For Warehouse {0}" msgstr "" @@ -58702,7 +58671,7 @@ msgstr "" msgid "Transit" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:611 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:610 msgid "Transit Entry" msgstr "" @@ -59036,7 +59005,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:101 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:87 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:92 #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/item_where_used/item_where_used.py:69 #: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:60 @@ -59102,7 +59071,7 @@ msgstr "" msgid "UOM Conversion Factor" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:520 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:526 msgid "UOM Conversion factor ({0} -> {1}) not found for item: {2}" msgstr "" @@ -59121,7 +59090,7 @@ msgstr "" msgid "UOM Name" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1693 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1728 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "" @@ -59314,7 +59283,7 @@ msgstr "" msgid "Unit of Measure (UOM)" msgstr "" -#: erpnext/stock/doctype/item/item.py:454 +#: erpnext/stock/doctype/item/item.py:459 msgid "Unit of Measure {0} has been entered more than once in Conversion Factor Table" msgstr "" @@ -59418,7 +59387,6 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Unreconcile Payment" @@ -59482,7 +59450,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:552 -#: erpnext/stock/doctype/pick_list/pick_list.js:321 +#: erpnext/stock/doctype/pick_list/pick_list.js:322 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:389 msgid "Unreserving Stock..." msgstr "" @@ -59759,7 +59727,7 @@ msgstr "" msgid "Updating Costing and Billing fields against this Project..." msgstr "" -#: erpnext/stock/doctype/item/item.py:1541 +#: erpnext/stock/doctype/item/item.py:1546 msgid "Updating Variants..." msgstr "" @@ -59957,7 +59925,7 @@ msgstr "" msgid "Use Transaction Date Exchange Rate" msgstr "" -#: erpnext/projects/doctype/project/project.py:639 +#: erpnext/projects/doctype/project/project.py:669 msgid "Use a name that is different from previous project name" msgstr "" @@ -60002,6 +59970,12 @@ msgstr "" msgid "Used for items valued at Standard Cost: the difference between the purchase price and the standard rate is booked here." msgstr "" +#. Description of the 'Expenses Added To Stock Contra Account' (Link) field in +#. DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Used to balance the books when recording expenses added to stock" +msgstr "" + #. Description of the 'Purchase Expense Contra Account' (Link) field in DocType #. 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json @@ -60108,6 +60082,12 @@ msgstr "" msgid "Users with this role are allowed to over deliver/receive against orders above the allowance percentage" msgstr "" +#. Description of the 'Role allowed to bypass overdue billing limit' (Link) +#. field in DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Users with this role can still submit invoices for customers over their overdue billing threshold." +msgstr "" + #. Description of the 'Role to Notify on Depreciation Failure' (Link) field in #. DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -60323,7 +60303,7 @@ msgstr "" msgid "Valuation Method" msgstr "" -#: erpnext/stock/doctype/item/item.py:1074 +#: erpnext/stock/doctype/item/item.py:1079 msgid "Valuation Method cannot be changed to or from 'Standard Cost' for {0} because stock transactions already exist for it." msgstr "" @@ -60360,7 +60340,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json -#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:976 +#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:993 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json @@ -60368,7 +60348,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:164 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:90 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:68 #: erpnext/stock/report/stock_balance/stock_balance.py:563 @@ -60379,19 +60359,19 @@ msgstr "" msgid "Valuation Rate (In / Out)" msgstr "" -#: erpnext/stock/stock_ledger.py:2161 +#: erpnext/stock/stock_ledger.py:2209 msgid "Valuation Rate Missing" msgstr "" -#: erpnext/stock/doctype/item/item.py:1652 +#: erpnext/stock/doctype/item/item.py:1657 msgid "Valuation Rate cannot be negative." msgstr "" -#: erpnext/stock/stock_ledger.py:2139 +#: erpnext/stock/stock_ledger.py:2187 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" -#: erpnext/stock/doctype/item/item.py:316 +#: erpnext/stock/doctype/item/item.py:321 msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "" @@ -60549,13 +60529,13 @@ msgstr "" msgid "Variance ({})" msgstr "" -#: erpnext/stock/doctype/item/item.js:271 +#: erpnext/stock/doctype/item/item.js:282 #: erpnext/stock/doctype/item/item_list.js:61 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" msgstr "" -#: erpnext/stock/doctype/item/item.py:968 +#: erpnext/stock/doctype/item/item.py:973 msgid "Variant Attribute Error" msgstr "" @@ -60574,11 +60554,11 @@ msgstr "" msgid "Variant Based On" msgstr "" -#: erpnext/stock/doctype/item/item.py:996 +#: erpnext/stock/doctype/item/item.py:1001 msgid "Variant Based On cannot be changed" msgstr "" -#: erpnext/stock/doctype/item/item.js:247 +#: erpnext/stock/doctype/item/item.js:258 msgid "Variant Details Report" msgstr "" @@ -60592,7 +60572,7 @@ msgstr "" msgid "Variant Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Variant Items" msgstr "" @@ -60603,7 +60583,7 @@ msgstr "" msgid "Variant Of" msgstr "" -#: erpnext/stock/doctype/item/item.js:1264 +#: erpnext/stock/doctype/item/item.js:1281 msgid "Variant creation has been queued." msgstr "" @@ -61264,7 +61244,7 @@ msgstr "" msgid "Warehouse not found against the account {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:896 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:902 #: erpnext/stock/doctype/delivery_note/delivery_note.py:401 msgid "Warehouse required for stock Item {0}" msgstr "" @@ -61278,7 +61258,7 @@ msgstr "" msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:1657 +#: erpnext/stock/doctype/item/item.py:1662 #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:67 msgid "Warehouse {0} does not belong to Company {1}." msgstr "" @@ -61295,7 +61275,7 @@ msgstr "" msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:147 +#: erpnext/stock/services/base_stock_gl_composer.py:154 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 "" @@ -61305,7 +61285,7 @@ msgstr "" #. Label of the warehouses (Table MultiSelect) field in DocType 'Production #. Plan' -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:555 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:553 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/stock/report/stock_balance/stock_balance.js:76 #: erpnext/stock/report/stock_ledger/stock_ledger.js:30 @@ -61408,7 +61388,7 @@ msgstr "" msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "" -#: erpnext/stock/stock_ledger.py:918 +#: erpnext/stock/stock_ledger.py:966 msgid "Warning on Negative Stock" msgstr "" @@ -61424,7 +61404,7 @@ msgstr "" msgid "Warning: Another {0} # {1} exists against stock entry {2}" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:534 +#: erpnext/stock/doctype/material_request/material_request.js:535 msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "" @@ -61720,7 +61700,7 @@ 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:1598 +#: erpnext/stock/doctype/item/item.js:1615 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "" @@ -61886,7 +61866,7 @@ msgstr "" #: erpnext/assets/doctype/asset/asset_list.js:12 #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json -#: erpnext/setup/doctype/company/company.py:453 +#: erpnext/setup/doctype/company/company.py:455 #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Work In Progress" msgstr "" @@ -61928,9 +61908,9 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/public/js/shop_floor/shop_floor.js:230 #: erpnext/selling/doctype/sales_order/sales_order.js:1094 -#: erpnext/stock/doctype/material_request/material_request.js:216 +#: erpnext/stock/doctype/material_request/material_request.js:219 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:573 +#: erpnext/stock/doctype/material_request/material_request.py:612 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -62010,7 +61990,7 @@ msgstr "" msgid "Work Order Summary Report" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:579 +#: erpnext/stock/doctype/material_request/material_request.py:618 msgid "Work Order cannot be created for the following reason:
    {0}" msgstr "" @@ -62044,7 +62024,7 @@ msgid "Work Order {0} must be submitted" msgstr "" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:567 +#: erpnext/stock/doctype/material_request/material_request.py:606 msgid "Work Orders" msgstr "" @@ -62209,7 +62189,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:736 +#: erpnext/setup/doctype/company/company.py:738 msgid "Write Off" msgstr "" @@ -62378,6 +62358,10 @@ msgstr "" msgid "You are not authorized to set Frozen value" msgstr "" +#: erpnext/stock/doctype/company_restriction/company_restriction.py:93 +msgid "You are not permitted to add or remove Company {0} in Allowed Companies" +msgstr "" + #: erpnext/stock/doctype/pick_list/pick_list.py:544 msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}." msgstr "" @@ -62398,7 +62382,7 @@ msgstr "" msgid "You can also set default CWIP account in Company {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:767 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "" @@ -62475,7 +62459,7 @@ msgstr "" msgid "You cannot edit the root node." msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:205 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" @@ -62495,7 +62479,7 @@ msgstr "" msgid "You cannot redeem more than {0}." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:220 msgid "You cannot repost item valuation before {0}" msgstr "" @@ -62511,7 +62495,7 @@ msgstr "" msgid "You cannot submit the order without payment." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:974 msgid "You cannot update stock for a Debit Note. A Debit Note is a financial document that should not affect inventory. Please disable 'Update Stock'." msgstr "" @@ -62568,7 +62552,7 @@ msgstr "" msgid "You have already selected items from {0} {1}" msgstr "" -#: erpnext/projects/doctype/project/project.py:420 +#: erpnext/projects/doctype/project/project.py:422 msgid "You have been invited to collaborate on the project {0}." msgstr "" @@ -62592,7 +62576,7 @@ msgstr "" msgid "You have not performed any reconciliations in this session yet." msgstr "" -#: erpnext/stock/doctype/item/item.py:1215 +#: erpnext/stock/doctype/item/item.py:1220 msgid "You have to enable auto re-order in Stock Settings to maintain re-order levels." msgstr "" @@ -62694,7 +62678,7 @@ msgstr "" msgid "`Allow Negative rates for Items`" msgstr "" -#: erpnext/stock/stock_ledger.py:2153 +#: erpnext/stock/stock_ledger.py:2201 msgid "after" msgstr "" @@ -62731,7 +62715,7 @@ msgid "by {}" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:338 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:840 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:846 msgid "dated {0}" msgstr "" @@ -62865,7 +62849,7 @@ msgstr "" msgid "paid to" msgstr "" -#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:51 +#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:78 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "" @@ -62882,7 +62866,7 @@ msgstr "" msgid "per hour" msgstr "" -#: erpnext/stock/stock_ledger.py:2154 +#: erpnext/stock/stock_ledger.py:2202 msgid "performing either one below:" msgstr "" @@ -62977,7 +62961,7 @@ msgstr "" msgid "to" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1259 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1265 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "" @@ -63062,7 +63046,7 @@ msgstr "" msgid "{0} Digest" msgstr "" -#: erpnext/accounts/utils.py:1591 +#: erpnext/accounts/utils.py:1585 msgid "{0} Number {1} is already used in {2} {3}" msgstr "" @@ -63074,11 +63058,11 @@ msgstr "" msgid "{0} Operations: {1}" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:232 +#: erpnext/stock/doctype/material_request/material_request.py:271 msgid "{0} Request for {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:393 +#: erpnext/stock/doctype/item/item.py:398 msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "" @@ -63128,6 +63112,9 @@ msgstr "" #: erpnext/accounts/report/general_ledger/general_ledger.py:63 #: erpnext/accounts/report/pos_register/pos_register.py:120 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:28 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:35 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:42 msgid "{0} and {1} are mandatory" msgstr "" @@ -63151,7 +63138,7 @@ msgstr "" msgid "{0} cannot be changed with opened Opening Entries." msgstr "" -#: erpnext/public/js/utils/sales_common.js:336 +#: erpnext/public/js/utils/sales_common.js:334 msgid "{0} cannot be greater than 100" msgstr "" @@ -63168,7 +63155,7 @@ msgid "{0} completed job cards" msgstr "" #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:137 -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:199 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:214 #: erpnext/stock/doctype/pick_list/mapper.py:79 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:323 msgid "{0} created" @@ -63178,11 +63165,11 @@ msgstr "" msgid "{0} creation for the following records will be skipped." msgstr "" -#: erpnext/setup/doctype/company/company.py:364 +#: erpnext/setup/doctype/company/company.py:366 msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:287 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "" @@ -63198,6 +63185,14 @@ msgstr "" msgid "{0} does not belong to the Company {1}." msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:100 +msgid "{0} doesn't belong to Company {1}. Please select a Cost Center that belongs to Company {1}." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:57 +msgid "{0} doesn't belong to Company {1}. Please select an Income Account that belongs to Company {1}." +msgstr "" + #: erpnext/public/js/templates/shop_floor_template.html:880 msgid "{0} draft job cards awaiting submission" msgstr "" @@ -63207,7 +63202,7 @@ msgid "{0} entered twice in Item Tax" msgstr "" #: erpnext/setup/doctype/item_group/item_group.py:47 -#: erpnext/stock/doctype/item/item.py:524 +#: erpnext/stock/doctype/item/item.py:529 msgid "{0} entered twice {1} in Item Taxes" msgstr "" @@ -63248,6 +63243,14 @@ msgstr "" msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:114 +msgid "{0} is a group Cost Center. Please select a non-group Cost Center." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:78 +msgid "{0} is a group account. Please select a non-group Income Account." +msgstr "" + #: erpnext/accounts/doctype/pos_profile/pos_profile.py:95 msgid "{0} is a mandatory Accounting Dimension.
    Please set a value for {0} in Accounting Dimensions section." msgstr "" @@ -63270,11 +63273,19 @@ msgstr "" msgid "{0} is blocked so this transaction cannot proceed" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:64 +msgid "{0} is disabled. Please select a valid Income Account." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:107 +msgid "{0} is disabled. Please select an enabled Cost Center." +msgstr "" + #: erpnext/assets/doctype/asset/asset.py:514 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:865 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:871 msgid "{0} is mandatory for Item {1}" msgstr "" @@ -63295,7 +63306,7 @@ msgstr "" msgid "{0} is not a CSV file." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:239 +#: erpnext/selling/doctype/customer/customer.py:251 msgid "{0} is not a company bank account" msgstr "" @@ -63327,6 +63338,10 @@ msgstr "" msgid "{0} is not added in the table" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:71 +msgid "{0} is not an Income Account. Please select a valid Income Account." +msgstr "" + #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:146 msgid "{0} is not enabled in {1}" msgstr "" @@ -63335,11 +63350,11 @@ msgstr "" msgid "{0} is not running. Cannot trigger events for this document" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:478 +#: erpnext/stock/doctype/material_request/material_request.py:517 msgid "{0} is not the default supplier for any items." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2689 msgid "{0} is on hold until {1}" msgstr "" @@ -63379,6 +63394,10 @@ msgstr "" msgid "{0} job cards awaiting Manufacture entry" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:144 +msgid "{0} languages are marked as default languages. Please select only one of them." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.py:160 msgid "{0} must be a group warehouse." msgstr "" @@ -63432,11 +63451,11 @@ msgstr "" msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1127 +#: erpnext/stock/doctype/pick_list/pick_list.py:1136 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1120 +#: erpnext/stock/doctype/pick_list/pick_list.py:1129 msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "" @@ -63444,16 +63463,16 @@ 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:1800 erpnext/stock/stock_ledger.py:2325 -#: erpnext/stock/stock_ledger.py:2339 +#: erpnext/stock/stock_ledger.py:1848 erpnext/stock/stock_ledger.py:2373 +#: erpnext/stock/stock_ledger.py:2387 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:2429 erpnext/stock/stock_ledger.py:2474 +#: erpnext/stock/stock_ledger.py:2477 erpnext/stock/stock_ledger.py:2522 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1794 +#: erpnext/stock/stock_ledger.py:1842 msgid "{0} units of {1} needed in {2} to complete this transaction." msgstr "" @@ -63465,7 +63484,7 @@ msgstr "" msgid "{0} valid serial nos for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:1269 +#: erpnext/stock/doctype/item/item.js:1286 msgid "{0} variants created." msgstr "" @@ -63477,7 +63496,7 @@ msgstr "" msgid "{0} will be given as discount." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:523 +#: erpnext/public/js/utils/barcode_scanner.js:532 msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "" @@ -63521,11 +63540,11 @@ msgstr "" #: erpnext/buying/doctype/purchase_order/services/status.py:35 #: erpnext/selling/doctype/sales_order/services/status.py:45 -#: erpnext/stock/doctype/material_request/material_request.py:258 +#: erpnext/stock/doctype/material_request/material_request.py:297 msgid "{0} {1} has been modified. Please refresh." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:285 +#: erpnext/stock/doctype/material_request/material_request.py:324 msgid "{0} {1} has not been submitted so the action cannot be completed" msgstr "" @@ -63555,11 +63574,11 @@ msgstr "" msgid "{0} {1} is cancelled or closed" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:437 +#: erpnext/stock/doctype/material_request/material_request.py:476 msgid "{0} {1} is cancelled or stopped" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:275 +#: erpnext/stock/doctype/material_request/material_request.py:314 msgid "{0} {1} is cancelled so the action cannot be completed" msgstr "" @@ -63643,7 +63662,7 @@ msgstr "" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:226 +#: erpnext/stock/services/base_stock_gl_composer.py:282 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "" @@ -63675,11 +63694,11 @@ msgstr "" msgid "{0}%" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 msgid "{0}% Billed" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:218 +#: erpnext/controllers/website_list_for_contact.py:220 msgid "{0}% Delivered" msgstr "" @@ -63712,11 +63731,11 @@ msgstr "" msgid "{0}: Virtual DocType (no database table)" msgstr "" -#: erpnext/stock/doctype/item/item.js:1185 +#: erpnext/stock/doctype/item/item.js:1202 msgid "{0}: remove invalid value(s) {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:1192 +#: erpnext/stock/doctype/item/item.js:1209 msgid "{0}: select the typed value {1} from the list or clear it" msgstr "" @@ -63728,7 +63747,7 @@ msgstr "" msgid "{0}: {1} does not exist" msgstr "" -#: erpnext/setup/doctype/company/company.py:351 +#: erpnext/setup/doctype/company/company.py:353 msgid "{0}: {1} is a group account." msgstr "" @@ -63736,15 +63755,15 @@ msgstr "" msgid "{0}: {1} must be less than {2}" msgstr "" -#: erpnext/controllers/buying_controller.py:1028 +#: erpnext/controllers/buying_controller.py:1036 msgid "{count} Assets created for {item_code}" msgstr "" -#: erpnext/controllers/buying_controller.py:928 +#: erpnext/controllers/buying_controller.py:936 msgid "{doctype} {name} is cancelled or closed." msgstr "" -#: erpnext/controllers/stock_controller.py:666 +#: erpnext/controllers/stock_controller.py:668 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "" diff --git a/erpnext/locale/bs.po b/erpnext/locale/bs.po index c2ea3059e9c..5902f982ee7 100644 --- a/erpnext/locale/bs.po +++ b/erpnext/locale/bs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-07-12 10:05+0000\n" -"PO-Revision-Date: 2026-07-16 13:14\n" +"POT-Creation-Date: 2026-07-19 10:04+0000\n" +"PO-Revision-Date: 2026-07-19 13:57\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Bosnian\n" "MIME-Version: 1.0\n" @@ -86,15 +86,15 @@ msgstr " Podsklop" msgid " Summary" msgstr " Sažetak" -#: erpnext/stock/doctype/item/item.py:281 +#: erpnext/stock/doctype/item/item.py:286 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "\"Klijent Dostavljeni Artikal\" ne može biti Nabavni Artikal" -#: erpnext/stock/doctype/item/item.py:283 +#: erpnext/stock/doctype/item/item.py:288 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "\"Klijent Dostavljen Artikal\" ne može imati Stopu Vrednovanja" -#: erpnext/stock/doctype/item/item.py:385 +#: erpnext/stock/doctype/item/item.py:390 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "Ne može se poništiti izbor opcije \"Fiksna Imovina\", jer postoji zapis imovine naspram artikla" @@ -284,7 +284,7 @@ msgid "'Entries' cannot be empty" msgstr "Polje 'Unosi' ne može biti prazno" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:132 #: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "'Od datuma' je obavezan" @@ -293,7 +293,7 @@ msgstr "'Od datuma' je obavezan" msgid "'From Date' must be after 'To Date'" msgstr "'Od datuma' mora biti nakon 'Do datuma'" -#: erpnext/stock/doctype/item/item.py:468 +#: erpnext/stock/doctype/item/item.py:473 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" msgstr "'Ima Serijski Broj' ne može biti 'Da' za artikal koji nije na zalihama" @@ -312,7 +312,7 @@ msgid "'Opening'" msgstr "'Početno'" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:134 #: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "'Do Datuma' je obavezno" @@ -337,8 +337,8 @@ msgstr "Račun '{0}' već koristi {1}. Koristite drugi račun." msgid "'{0}' has been already added." msgstr "'{0}' je već dodan." -#: erpnext/setup/doctype/company/company.py:376 -#: erpnext/setup/doctype/company/company.py:387 +#: erpnext/setup/doctype/company/company.py:378 +#: erpnext/setup/doctype/company/company.py:389 msgid "'{0}' should be in company currency {1}." msgstr "'{0}' bi trebao biti u valuti {1}." @@ -937,6 +937,11 @@ msgstr "
    Primjer Poruke
    \n\n" "<a href=\"{{ payment_url }}\"> kliknite ovdje da platite </a>\n\n" "
    \n" +#. Header text in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounting Overview" +msgstr "" + #. Header text in the Stock Workspace #: erpnext/stock/workspace/stock/stock.json msgid "Masters & Reports" @@ -965,11 +970,6 @@ msgstr "Postavke & Izvještaji" msgid "Reports & Masters" msgstr "Izvještaji & Pristup" -#. Header text in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward and Outward" -msgstr "Unutrašnji i Vanjski Podugovori" - #. Header text in the ERPNext Settings Workspace #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json msgid "Your Shortcuts\n" @@ -1064,7 +1064,7 @@ msgstr "A - B" msgid "A - C" msgstr "A - C" -#: erpnext/selling/doctype/customer/customer.py:358 +#: erpnext/selling/doctype/customer/customer.py:372 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" msgstr "Grupa Klijenta postoji sa istim imenom, preimenujte klijenta ili preimenujte Grupu Klijenta" @@ -1245,11 +1245,11 @@ msgstr "Skr" msgid "Abbreviation" msgstr "Skraćenica" -#: erpnext/setup/doctype/company/company.py:310 +#: erpnext/setup/doctype/company/company.py:312 msgid "Abbreviation already used for another company" msgstr "Skraćenica se već koristi za drugo poduzeće" -#: erpnext/setup/doctype/company/company.py:307 +#: erpnext/setup/doctype/company/company.py:309 msgid "Abbreviation is mandatory" msgstr "Skraćenica je obavezna" @@ -1371,11 +1371,9 @@ msgstr "Stanje Računa" #. Label of the account_category (Link) field in DocType 'Account' #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:162 #: erpnext/accounts/doctype/account_category/account_category.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Account Category" msgstr "Kategorija Računa" @@ -1478,7 +1476,7 @@ msgstr "Račun" msgid "Account Manager" msgstr "Upravitelj Knjogovodstva" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 #: erpnext/controllers/accounts_controller.py:1234 msgid "Account Missing" msgstr "Račun Nedostaje" @@ -1618,6 +1616,12 @@ msgstr "Račun nije pronađen" msgid "Account to record additional purchase expenses like freight or customs" msgstr "Račun za evidentiranje dodatnih troškova nabave poput prijevoza ili carine" +#. Description of the 'Expenses Added To Stock Account' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account to track value added to stock via Stock Entry, Stock Reconciliation or Landed Cost Voucher" +msgstr "" + #. Description of the 'COGS Account' (Link) field in DocType 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json msgid "Account where cost of goods sold will be posted when this item is sold" @@ -1670,7 +1674,7 @@ msgstr "Račun {0} ne može biti onemogućen jer je već postavljen kao {1} za { msgid "Account {0} does not belong to company {1}" msgstr "Račun {0} ne pripada {1}" -#: erpnext/setup/doctype/company/company.py:358 +#: erpnext/setup/doctype/company/company.py:360 msgid "Account {0} does not belong to company: {1}" msgstr "Račun {0} ne pripada: {1}" @@ -1698,7 +1702,7 @@ msgstr "Račun {0} postoji u matičnom poduzeću {1}." msgid "Account {0} is added in the child company {1}" msgstr "Račun {0} je dodan u podređeno poduzeće {1}" -#: erpnext/setup/doctype/company/company.py:347 +#: erpnext/setup/doctype/company/company.py:349 msgid "Account {0} is disabled." msgstr "Račun {0} je onemogućen." @@ -1756,6 +1760,7 @@ msgstr "Knjigovođa" #. Item' #. Label of the section_break_10 (Section Break) field in DocType 'Shipping #. Rule' +#. Name of a Workspace #. Label of the accounting_tab (Tab Break) field in DocType 'Supplier' #. Label of a Desktop Icon #. Label of the accounting_tab (Tab Break) field in DocType 'Customer' @@ -1767,6 +1772,7 @@ msgstr "Knjigovođa" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/desktop_icon/accounting.json erpnext/public/js/setup_wizard.js:91 #: erpnext/selling/doctype/customer/customer.json @@ -1825,15 +1831,12 @@ msgstr "Knjigovodstveni Detalji" #. 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/budgeting.json msgid "Accounting Dimension" msgstr "Knjigovodstvena Dimenzija" @@ -2027,8 +2030,8 @@ msgstr "Knjigovodstveni Unosi" msgid "Accounting Entry for Asset" msgstr "Knjigovodstveni Unos za Imovinu" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:298 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:316 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:303 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:321 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "Knjigovodstveni Unos za Dokument Troškova Nabavke u Unosu Zaliha {0}" @@ -2049,17 +2052,17 @@ msgstr "Knjigovodstveni Unos za Servis" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:430 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:675 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:696 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:430 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:234 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:249 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:263 -#: erpnext/stock/services/base_stock_gl_composer.py:65 -#: erpnext/stock/services/base_stock_gl_composer.py:80 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:439 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:239 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:254 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:268 +#: erpnext/stock/services/base_stock_gl_composer.py:72 +#: erpnext/stock/services/base_stock_gl_composer.py:87 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:67 msgid "Accounting Entry for Stock" msgstr "Knjigovodstveni Unos za Zalihe" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:268 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:276 msgid "Accounting Entry for {0}" msgstr "Knjigovodstveni Unos za {0}" @@ -2068,12 +2071,12 @@ msgid "Accounting Entry for {0}: {1} can only be made in currency: {2}" msgstr "Knjigovodstveni Unos za {0}: {1} može se napraviti samo u valuti: {2}" #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.js:193 -#: erpnext/assets/doctype/asset/asset.js:190 -#: erpnext/assets/doctype/asset_repair/asset_repair.js:92 -#: erpnext/buying/doctype/supplier/supplier.js:123 +#: erpnext/assets/doctype/asset/asset.js:198 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:101 +#: erpnext/buying/doctype/supplier/supplier.js:132 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 -#: erpnext/selling/doctype/customer/customer.js:173 +#: erpnext/selling/doctype/customer/customer.js:182 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "Kjnigovodstveni Registar" @@ -2090,10 +2093,8 @@ msgstr "Knjigovodstveno Uvođenje" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_period/accounting_period.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounting Period" msgstr "Knjigovodstveni Period" @@ -2133,7 +2134,7 @@ msgstr "Knjigovodstveni unosi su zatvoreni do ovog datuma. Samo korisnici sa nav #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/assets/doctype/asset_category/asset_category.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:513 +#: erpnext/setup/doctype/company/company.py:515 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json @@ -2173,13 +2174,18 @@ msgstr "Računi Nedostaju u Izvještaju" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:126 -#: erpnext/buying/doctype/supplier/supplier.js:135 +#: erpnext/buying/doctype/supplier/supplier.js:144 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Accounts Payable" msgstr "Obaveze" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Payable Ageing" +msgstr "" + #. Name of a report #: erpnext/accounts/report/accounts_payable/accounts_payable.js:191 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.json @@ -2198,7 +2204,7 @@ msgstr "Sažetak Obaveza" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.json #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:149 -#: erpnext/selling/doctype/customer/customer.js:162 +#: erpnext/selling/doctype/customer/customer.js:171 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json @@ -2217,6 +2223,11 @@ msgstr "Podešavanje Potraživanja / Obaveza" msgid "Accounts Receivable / Payable remarks length" msgstr "Dužina napomena Potraživanjima / Obavezama" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Receivable Ageing" +msgstr "" + #. Label of the accounts_receivable_credit (Link) field in DocType 'Invoice #. Discounting' #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.json @@ -2248,17 +2259,12 @@ msgstr "Račun Neplaćenih Potraživanja" #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Accounts Settings" msgstr "Postavke Knjigovodstva" -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/accounts_setup/accounts_setup.json #: erpnext/desktop_icon/accounts_setup.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounts Setup" msgstr "Knjigovodstvo" @@ -2296,7 +2302,7 @@ msgstr "Račun Akumulirane Amortizacije" #. Label of the accumulated_depreciation_amount (Currency) field in DocType #. 'Depreciation Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:173 -#: erpnext/assets/doctype/asset/asset.js:385 +#: erpnext/assets/doctype/asset/asset.js:393 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Accumulated Depreciation Amount" msgstr "Iznos Akumulirane Amortizacije" @@ -2444,7 +2450,7 @@ msgstr "Izvedene Radnje" #. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType #. 'Stock Settings' -#: erpnext/stock/doctype/item/item.js:485 +#: erpnext/stock/doctype/item/item.js:496 #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Activate Serial / Batch No for Item" msgstr "Omogući Serijski / Šaržni broj za Artikal" @@ -2458,11 +2464,6 @@ msgstr "Aktivni Potencijalni Klijenti" msgid "Active Status" msgstr "Aktivan status" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Active Subcontracted Items" -msgstr "Aktivni Podugovoreni Artikli" - #. Label of the activities_tab (Tab Break) field in DocType 'Lead' #. Label of the activities_tab (Tab Break) field in DocType 'Opportunity' #. Label of the activities_tab (Tab Break) field in DocType 'Prospect' @@ -2578,7 +2579,7 @@ msgstr "Stvarni datum završetka ne može biti prije stvarnog datuma početka" msgid "Actual End Time" msgstr "Stvarno Vrijeme Završetka" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:464 msgid "Actual Expense" msgstr "Stvarni Trošak" @@ -2768,7 +2769,7 @@ msgstr "Dodaj višestruko" msgid "Add Multiple Tasks" msgstr "Dodaj više zadataka" -#: erpnext/stock/doctype/item/item.js:985 +#: erpnext/stock/doctype/item/item.js:1002 msgid "Add Opening Stock" msgstr "Dodaj Početne Zalihe" @@ -2954,11 +2955,11 @@ msgstr "Dodano Od" msgid "Added On" msgstr "Dodano" -#: erpnext/buying/doctype/supplier/supplier.py:135 +#: erpnext/buying/doctype/supplier/supplier.py:143 msgid "Added Supplier Role to User {0}." msgstr "Dodata uloga dobavljača korisniku {0}." -#: erpnext/controllers/website_list_for_contact.py:311 +#: erpnext/controllers/website_list_for_contact.py:313 msgid "Added {1} role to user {0}." msgstr "Dodana je uloga {1} korisniku {0}." @@ -3373,7 +3374,7 @@ msgstr "Adresa koja se koristi za određivanje PDV Kategorije u transakcijama" msgid "Adjustment Against" msgstr "Usaglašavanje Naspram" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:203 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:211 msgid "Adjustment based on Purchase Invoice rate" msgstr "Usklađivanje na osnovu stope fakture nabavke" @@ -3570,7 +3571,7 @@ msgstr "Naspram Računa" msgid "Against Blanket Order" msgstr "Naspram Ugovornog Naloga" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:838 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:844 msgid "Against Customer Order {0}" msgstr "Naspram Naloga Klijenta {0}" @@ -3823,7 +3824,7 @@ msgstr "Nadimak" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:171 -#: erpnext/accounts/utils.py:1653 erpnext/public/js/setup_wizard.js:278 +#: erpnext/accounts/utils.py:1647 erpnext/public/js/setup_wizard.js:278 msgid "All Accounts" msgstr "Kontni Plan" @@ -3875,21 +3876,21 @@ msgstr "Sve Grupe Klijenta" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:506 -#: erpnext/setup/doctype/company/company.py:509 -#: erpnext/setup/doctype/company/company.py:514 -#: erpnext/setup/doctype/company/company.py:520 -#: erpnext/setup/doctype/company/company.py:526 -#: erpnext/setup/doctype/company/company.py:532 -#: erpnext/setup/doctype/company/company.py:538 -#: erpnext/setup/doctype/company/company.py:544 -#: erpnext/setup/doctype/company/company.py:550 -#: erpnext/setup/doctype/company/company.py:556 -#: erpnext/setup/doctype/company/company.py:562 -#: erpnext/setup/doctype/company/company.py:568 -#: erpnext/setup/doctype/company/company.py:574 -#: erpnext/setup/doctype/company/company.py:580 -#: erpnext/setup/doctype/company/company.py:586 +#: erpnext/setup/doctype/company/company.py:508 +#: erpnext/setup/doctype/company/company.py:511 +#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:522 +#: erpnext/setup/doctype/company/company.py:528 +#: erpnext/setup/doctype/company/company.py:534 +#: erpnext/setup/doctype/company/company.py:540 +#: erpnext/setup/doctype/company/company.py:546 +#: erpnext/setup/doctype/company/company.py:552 +#: erpnext/setup/doctype/company/company.py:558 +#: erpnext/setup/doctype/company/company.py:564 +#: erpnext/setup/doctype/company/company.py:570 +#: erpnext/setup/doctype/company/company.py:576 +#: erpnext/setup/doctype/company/company.py:582 +#: erpnext/setup/doctype/company/company.py:588 msgid "All Departments" msgstr "Svi odjeli" @@ -3969,7 +3970,7 @@ msgstr "Sve grupe dobavljača" msgid "All Territories" msgstr "Sve teritorije" -#: erpnext/setup/doctype/company/company.py:451 +#: erpnext/setup/doctype/company/company.py:453 msgid "All Warehouses" msgstr "Sva skladišta" @@ -4012,11 +4013,11 @@ msgstr "Svi Artikli su već prenesen za ovaj Radni Nalog." msgid "All items in this document already have a linked Quality Inspection." msgstr "Svi Artiklie u ovom dokumentu već imaju povezanu Kontrolu Kvaliteta." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:915 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:921 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "Svi artikli moraju biti povezane s Prodajnim Nalogom ili Podizvođačkom Nalogu za ovu Prodajnu Fakturu." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:926 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:932 msgid "All linked Sales Orders must be subcontracted." msgstr "Svi povezani Prodajni Nalozi moraju biti podizvođački." @@ -4552,6 +4553,21 @@ msgstr "Dozvoli Kontrolu Kvaliteta nakon Nabave / Isporuke" msgid "Allow transferring raw materials even after the Required Quantity is fulfilled" msgstr "Dozvoli prijenos sirovina i nakon što je ispunjena Potrebna Količina" +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Supplier' +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Customer' +#. Label of the allowed_companies (Table MultiSelect) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Allowed Companies" +msgstr "" + +#: erpnext/stock/doctype/company_restriction/company_restriction.py:74 +msgid "Allowed Companies is required when Restrict to Companies is checked" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json msgid "Allowed Dimension" @@ -4632,7 +4648,7 @@ msgstr "Omogućava korisnicima da dostave ponude dobavljača s nultom količinom msgid "Already Imported" msgstr "Već Uvezeno" -#: erpnext/stock/doctype/pick_list/pick_list.py:1123 +#: erpnext/stock/doctype/pick_list/pick_list.py:1132 msgid "Already Picked" msgstr "Već odabrano" @@ -4640,7 +4656,7 @@ msgstr "Već odabrano" msgid "Already set default in pos profile {0} for user {1}, kindly disabled default" msgstr "Već postavljeni standard u Kasa profilu {0} za korisnika {1}, onemogući standard u profilu Kase" -#: erpnext/stock/doctype/item/item.js:38 +#: erpnext/stock/doctype/item/item.js:40 msgid "Also you can't switch back to FIFO after setting the valuation method to Moving Average for this item." msgstr "Također, ne možete se vratiti na FIFO nakon što ste za ovaj artikal postavili metodu vrednovanja na MA." @@ -4652,7 +4668,7 @@ msgstr "Alternativna Jedinica" #: erpnext/manufacturing/doctype/work_order/work_order.js:158 #: erpnext/manufacturing/doctype/work_order/work_order.js:173 #: erpnext/public/js/utils.js:616 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:343 msgid "Alternate Item" msgstr "Alternativni Artikal" @@ -4680,7 +4696,7 @@ msgstr "Alternativni Artikli" msgid "Alternative item must not be same as item code" msgstr "Alternativni Artikal ne smije biti isti kao Artikal Kod" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:383 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 msgid "Alternatively, you can download the template and fill your data in." msgstr "Alternativno, možete preuzeti predložak i popuniti svoje podatke." @@ -5087,12 +5103,12 @@ msgstr "Grupa Artikla je način za klasifikaciju Artikala na osnovu tipa." msgid "An email will be sent to notify the User with the role 'Purchase Manager' when an automatic Material Request is created." msgstr "Korisniku s ulogom 'Odgovorni Nabave' bit će poslana e-pošta s obavijesti kada se izradi automatski Materijalni Zahtjev." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:617 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:766 msgid "An error has been appeared while reposting item valuation via {0}" msgstr "Pojavila se greška prilikom ponovnog knjiženja vrijednosti artikla preko {0}" #: erpnext/public/js/controllers/buying.js:378 -#: erpnext/public/js/utils/sales_common.js:495 +#: erpnext/public/js/utils/sales_common.js:493 msgid "An error occurred during the update process" msgstr "Došlo je do greške tokom obrade ažuriranja" @@ -5647,7 +5663,7 @@ msgstr "Pošto je polje {0} omogućeno, polje {1} je obavezno." msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "Pošto je polje {0} omogućeno, vrijednost polja {1} bi trebala biti veća od 1." -#: erpnext/stock/doctype/item/item.py:1122 +#: erpnext/stock/doctype/item/item.py:1127 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "Pošto postoje postojeće podnešene transakcije naspram artikla {0}, ne možete promijeniti vrijednost {1}." @@ -5655,7 +5671,7 @@ msgstr "Pošto postoje postojeće podnešene transakcije naspram artikla {0}, ne msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}." msgstr "Pošto ima dovoljno artikala podsklopa, radni nalog nije potreban za Skladište {0}." -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:464 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:470 msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "Pošto ima dovoljno sirovina, Materijalni Nalog nije potreban za Skladište {0}." @@ -5797,7 +5813,7 @@ msgstr "Račun kategorije imovine" msgid "Asset Category Name" msgstr "Naziv kategorije imovine" -#: erpnext/stock/doctype/item/item.py:377 +#: erpnext/stock/doctype/item/item.py:382 msgid "Asset Category is mandatory for Fixed Asset item" msgstr "Kategorija Imovine je obavezna za Artikal Fiksne Imovine" @@ -5988,6 +6004,7 @@ msgstr "Imovina primljena, ali nije plaćena" #. Label of the asset_repair (Link) field in DocType 'Stock Entry' #. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.js:113 +#: erpnext/assets/doctype/asset/asset.js:152 #: 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 @@ -6038,8 +6055,7 @@ msgstr "Tip Imovine" #. Label of the asset_value (Currency) field in DocType 'Asset Capitalization #. Asset Item' -#: erpnext/assets/dashboard_fixtures.py:180 -#: erpnext/assets/doctype/asset/asset.js:517 +#: erpnext/assets/doctype/asset/asset.js:525 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:208 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:457 @@ -6062,7 +6078,6 @@ msgid "Asset Value Adjustment cannot be posted before Asset's purchase date { msgstr "Prilagodba Vrijednosti Imovine ne može se knjižiti prije datuma nabave sredstva {0}." #. Label of a chart in the Assets Workspace -#: erpnext/assets/dashboard_fixtures.py:56 #: erpnext/assets/workspace/assets/assets.json msgid "Asset Value Analytics" msgstr "Analiza Vrijednosti Imovine" @@ -6099,7 +6114,7 @@ msgstr "Imovina izbrisana" msgid "Asset issued to Employee {0}" msgstr "Imovina izdata {0}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:181 msgid "Asset out of order due to Asset Repair {0}" msgstr "Imovina nije u funkciji zbog popravke imovine {0}" @@ -6144,7 +6159,7 @@ msgstr "Imovina prebačena na lokaciju {0}" msgid "Asset updated after being split into Asset {0}" msgstr "Imovina je ažurirana nakon što je podijeljena na Imovinu {0}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:335 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:338 msgid "Asset updated due to Asset Repair {0} {1}." msgstr "Imovina ažurirana zbog Popravke Imovine {0} {1}." @@ -6193,7 +6208,7 @@ msgstr "Imovina {0} nije podnešena. Podnesi imovinu prije nastavka." msgid "Asset {0} must be submitted" msgstr "Imovina {0} mora biti podnešena" -#: erpnext/controllers/buying_controller.py:1039 +#: erpnext/controllers/buying_controller.py:1047 msgid "Asset {assets_link} created for {item_code}" msgstr "Imovina {assets_link} izrađena za {item_code}" @@ -6231,11 +6246,11 @@ msgstr "Imovina" msgid "Assets Setup" msgstr "Postavljanje Imovine" -#: erpnext/controllers/buying_controller.py:1057 +#: erpnext/controllers/buying_controller.py:1065 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "Imovina nije izrađena za {item_code}. Morat ćete izraditi Imovinu ručno." -#: erpnext/controllers/buying_controller.py:1044 +#: erpnext/controllers/buying_controller.py:1052 msgid "Assets {assets_link} created for {item_code}" msgstr "Imovina {assets_link} izrađena za {item_code}" @@ -6353,7 +6368,7 @@ msgstr "Red {0}: Količina je obavezna za Šaržu {1}" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "Red {0}: Serijski Broj je obavezan za Artikal {1}" -#: erpnext/stock/services/serial_batch_bundle_service.py:502 +#: erpnext/stock/services/serial_batch_bundle_service.py:504 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." msgstr "U Redu {0}: Serijski i Šaržni Paket {1} je već stvoren. Uklonite vrijednosti iz polja za serijski ili šaržni broj." @@ -6413,11 +6428,11 @@ msgstr "Naziv Atributa" msgid "Attribute Value" msgstr "Vrijednost Atributa" -#: erpnext/stock/doctype/item/item.py:888 +#: erpnext/stock/doctype/item/item.py:893 msgid "Attribute Value {0} is not valid for the selected attribute {1}." msgstr "Vrijednost atributa {0} nije važeća za odabrani atribut {1}." -#: erpnext/stock/doctype/item/item.py:1034 +#: erpnext/stock/doctype/item/item.py:1039 msgid "Attribute table is mandatory" msgstr "Tabela Atributa je obavezna" @@ -6425,19 +6440,19 @@ msgstr "Tabela Atributa je obavezna" msgid "Attribute value: {0} must appear only once" msgstr "Vrijednost Atributa: {0} se mora pojaviti samo jednom" -#: erpnext/stock/doctype/item/item.py:877 +#: erpnext/stock/doctype/item/item.py:882 msgid "Attribute {0} is disabled." msgstr "Atribut {0} je onemogućen." -#: erpnext/stock/doctype/item/item.py:865 +#: erpnext/stock/doctype/item/item.py:870 msgid "Attribute {0} is not valid for the selected template." msgstr "Atribut {0} nije valjan za odabrani predložak." -#: erpnext/stock/doctype/item/item.py:1038 +#: erpnext/stock/doctype/item/item.py:1043 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "Atribut {0} izabran više puta u Tabeli Atributa" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Attributes" msgstr "Atributi" @@ -6584,7 +6599,7 @@ msgstr "Automatsko Ponovno Knjiženje Netačnih Unosa Vrijednovanja (Sedmično)" msgid "Auto Reposting of Incorrect Valuation" msgstr "Automatsko Ponovno Knjiženje Netačnog Vrijednovanja" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:202 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:209 msgid "Auto Tax Settings Error" msgstr "Greška u Postavkama Automatskog Pdv" @@ -6645,7 +6660,7 @@ msgid "Auto reconcile Payments" msgstr "Automatski Uskladi Plaćanja" #: erpnext/public/js/controllers/buying.js:373 -#: erpnext/public/js/utils/sales_common.js:490 +#: erpnext/public/js/utils/sales_common.js:488 msgid "Auto repeat document updated" msgstr "Automatsko ponavljanje dokumenta je ažurirano" @@ -6990,8 +7005,8 @@ msgstr "Spremnička Količina" #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:118 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order.js:1496 -#: erpnext/stock/doctype/material_request/material_request.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:810 +#: erpnext/stock/doctype/material_request/material_request.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:809 #: 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:524 @@ -7221,7 +7236,7 @@ msgstr "Alat Ažuriranje Sastavnice" msgid "BOM Update Tool Log with job status maintained" msgstr "Zapisnik Alata Ažuriranja Sastavnice sa očuvanim statusom posla" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:102 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:103 msgid "BOM Updation already in progress. Please wait until {0} is complete." msgstr "Ažuriranje Sastavnica je već u toku. Pričekaj dok {0} ne završi." @@ -7250,8 +7265,8 @@ msgstr "Sastavnica i Količina Gotovog Proizvoda su obavezni za Rastavljanje" msgid "BOM and Production" msgstr "Sastavnica & Proizvodnja" -#: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:862 +#: erpnext/stock/doctype/material_request/material_request.js:387 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:861 msgid "BOM does not contain any stock item" msgstr "Sastavnica ne sadrži nijedan artikal zaliha" @@ -7382,7 +7397,7 @@ msgstr "Stanje u Osnovnoj Valuti" #: erpnext/stock/report/available_batch_report/available_batch_report.py:62 #: 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/batch_wise_balance_history/batch_wise_balance_history.py:89 #: erpnext/stock/report/stock_balance/stock_balance.py:517 #: erpnext/stock/report/stock_ledger/stock_ledger.py:331 msgid "Balance Qty" @@ -7455,7 +7470,7 @@ msgid "Balance Type" msgstr "Tip Stanja" #: 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/batch_wise_balance_history/batch_wise_balance_history.py:91 #: erpnext/stock/report/stock_balance/stock_balance.py:525 #: erpnext/stock/report/stock_ledger/stock_ledger.py:388 msgid "Balance Value" @@ -7486,7 +7501,6 @@ msgstr "Stanje prema bankovnom izvodu prije {0}" #. Label of the bank (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace #. Option for the 'Salary Mode' (Select) field in DocType 'Employee' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/bank/bank.json #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7500,7 +7514,6 @@ msgstr "Stanje prema bankovnom izvodu prije {0}" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:95 #: erpnext/setup/doctype/employee/employee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank" msgstr "Banka" @@ -7529,7 +7542,6 @@ msgstr "Bankovni Račun Broj." #. Label of the bank_account (Link) field in DocType 'Payment Order Reference' #. Label of the bank_account (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:141 #: banking/src/pages/BankStatementImporter.tsx:90 #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7548,7 +7560,6 @@ msgstr "Bankovni Račun Broj." #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:16 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:16 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account" msgstr "Bankovni Račun" @@ -7584,16 +7595,12 @@ msgid "Bank Account No" msgstr "Bankovni Račun Broj" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Subtype" msgstr "Podtip Bankovnog Računa" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_type/bank_account_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Type" msgstr "Tip Bankovnog Računa" @@ -7606,7 +7613,9 @@ msgstr "Bankovni Račun {0} u Bankovnoj Transakciji {1} nije usklađen s Bankovn msgid "Bank Accounts" msgstr "Bankovni Računi" +#. Label of a chart in the Accounting Workspace #. Label of the bank_balance (Check) field in DocType 'Email Digest' +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/setup/doctype/email_digest/email_digest.json msgid "Bank Balance" msgstr "Bankovno Stanje" @@ -7630,10 +7639,8 @@ msgstr "Bankovne Provizije, Plaća, itd." #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Clearance" msgstr "Bankovno Odobrenje" @@ -7703,9 +7710,7 @@ msgid "Bank Fee, Salary, etc." msgstr "Bankarska Provizija, Plaća, itd." #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Guarantee" msgstr "Bankarska Garancija" @@ -7733,11 +7738,6 @@ msgstr "Naziv Banke" msgid "Bank Overdraft Account" msgstr "Bankovni Račun Prekoračenja" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Bank Reconciliation" -msgstr "Bankovno Usklađivanje" - #. Name of a report #. Label of a Link in the Invoicing Workspace #: banking/src/components/features/BankReconciliation/BankReconciliationStatement.tsx:208 @@ -7883,19 +7883,15 @@ msgstr "Bankovni/Gotovinski Račun {0} ne pripada {1}" #. Label of the banking_section (Section Break) field in DocType 'Accounts #. Settings' -#. Name of a Workspace #. Label of a Card Break in the Invoicing Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: banking/src/pages/BankReconciliation.tsx:57 #: banking/src/pages/BankReconciliation.tsx:87 #: banking/src/pages/BankStatementImporterContainer.tsx:22 #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/workspace/banking/banking.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/banking.json #: erpnext/setup/setup_wizard/data/industry_type.txt:8 -#: erpnext/workspace_sidebar/banking.json msgid "Banking" msgstr "Bankarstvo" @@ -7904,11 +7900,11 @@ msgstr "Bankarstvo" msgid "Barcode Type" msgstr "Barkod Tip" -#: erpnext/stock/doctype/item/item.py:547 +#: erpnext/stock/doctype/item/item.py:552 msgid "Barcode {0} already used in Item {1}" msgstr "Barkod {0} se već koristi za artikal {1}" -#: erpnext/stock/doctype/item/item.py:562 +#: erpnext/stock/doctype/item/item.py:567 msgid "Barcode {0} is not a valid {1} code" msgstr "Barkod {0} nije važeći {1} kod" @@ -8063,7 +8059,7 @@ msgstr "Osnovna Cjena (prema Jedinici Zaliha)" #. Label of a Link in the Stock Workspace #: erpnext/stock/doctype/batch/batch.json #: 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/batch_wise_balance_history/batch_wise_balance_history.py:85 #: 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:418 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:182 @@ -8147,7 +8143,7 @@ msgstr "Postavke Artikla Šarže" #: 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:2989 -#: erpnext/public/js/utils/barcode_scanner.js:281 +#: erpnext/public/js/utils/barcode_scanner.js:286 #: erpnext/public/js/utils/serial_no_batch_selector.js:450 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_price/item_price.json @@ -8181,7 +8177,7 @@ msgstr "Broj Šarže" msgid "Batch No is mandatory" msgstr "Broj Šarže je obavezan" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3570 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3572 msgid "Batch No {0} does not exist" msgstr "Broj Šarže {0} ne postoji" @@ -8375,18 +8371,16 @@ msgstr "Faktura za odbijenu količinu na Nabavnoj Fakturi" #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace #. Label of the bom_info_section (Section Break) field in DocType 'Stock Entry' -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.py:1168 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:796 +#: erpnext/stock/doctype/material_request/material_request.js:142 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:795 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "Sastavnica" #. Option for the 'Status' (Select) field in DocType 'Timesheet' -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/doctype/timesheet/timesheet_list.js:9 msgid "Billed" @@ -8750,6 +8744,12 @@ msgstr "Blokiraj Fakturu" msgid "Block Supplier" msgstr "Blokiraj Dostavljača" +#. Description of the 'Enable Overdue Billing Threshold' (Check) field in +#. DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Block submitting a new Sales Invoice when the customer's overdue amount exceeds the Overdue Billing Threshold set on the customer." +msgstr "" + #. Description of the 'Is Frozen' (Check) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Blocks all further accounting entries on this customer's account. Only users with the frozen-entries role can override.\n" @@ -8827,6 +8827,12 @@ msgstr "Automatski knjiži unos Amortizacije Imovine" msgid "Book Deferred entries based on" msgstr "Knjiži Odložene Unose Na Osnovu" +#. Label of the book_stock_expense_gl_entries (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Book Stock Expense GL Entries" +msgstr "" + #: erpnext/www/book_appointment/index.html:15 msgid "Book an appointment" msgstr "Zakaži Termin" @@ -8854,6 +8860,12 @@ msgstr "Rezervisano" msgid "Booked Fixed Asset" msgstr "Proknjižena Osnovna Imovina" +#. Description of the 'Book Stock Expense GL Entries' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Books Purchase Expense and Expenses Added To Stock account pairs against stock value. On enabling this, the accounts become mandatory in Company or Item Defaults for Purchase Receipt, Purchase Invoice, Stock Entry, Stock Reconciliation and Landed Cost Voucher" +msgstr "" + #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" msgstr "Knjigovodstvo je zatvoreno do perioda koji se završava {0}" @@ -8890,12 +8902,10 @@ msgstr "Kutija" #. 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 "Podružnica" @@ -8983,7 +8993,6 @@ msgstr "Veličina Spremnika" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cost_center/cost_center.js:45 @@ -8994,9 +9003,9 @@ msgstr "Veličina Spremnika" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:237 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:319 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:329 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:454 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budgeting.json +#: erpnext/desktop_icon/budget.json msgid "Budget" msgstr "Proračun" @@ -9064,8 +9073,8 @@ msgstr "Proračunska Lista" msgid "Budget Start Date" msgstr "Datum Početka Proračuna" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/budgeting.json +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json msgid "Budget Variance" msgstr "Odstupanje Proračuna" @@ -9085,13 +9094,6 @@ msgstr "Proračun se ne može dodijeliti naspram Grupnog Računu {0}" msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" msgstr "Proračun se ne može dodijeliti za {0}, jer njegova kontna Klasa nije Prihod ili Rashod" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/budgeting/budgeting.json -#: erpnext/workspace_sidebar/budgeting.json -msgid "Budgeting" -msgstr "Proračun" - #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" msgstr "Proračuni" @@ -9321,11 +9323,6 @@ msgstr "Zaobiđi provjeru kreditnog ograničenja na prodajnom nalogu" msgid "CC To" msgstr "Kopija" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "COA Importer" -msgstr "Kontni Plan Uvoz" - #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "CODE-39" @@ -9343,7 +9340,7 @@ msgstr "Račun Troškova Prodanih Artikala" msgid "COGS By Item Group" msgstr "Troškovi izrade prema Arikal Grupi" -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:44 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:55 msgid "COGS Debit" msgstr "Troškovi izrade Debit" @@ -9659,7 +9656,7 @@ msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "Ne može se filtrirati na osnovu broja verifikata, ako je grupiran prema verifikatu" #: erpnext/accounts/doctype/journal_entry/mapper.py:32 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2617 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2615 msgid "Can only make payment against unbilled {0}" msgstr "Plaćanje se može izvršiti samo protiv nefakturisanog(e) {0}" @@ -9669,7 +9666,7 @@ msgstr "Plaćanje se može izvršiti samo protiv nefakturisanog(e) {0}" msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'" msgstr "Može upućivati na red samo ako je tip naplate \"Na iznos prethodnog reda\" ili \"Ukupni prethodni red\"" -#: erpnext/setup/doctype/company/company.py:278 +#: erpnext/setup/doctype/company/company.py:280 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "Ne može se promijeniti način vrijednovanja, jer postoje transakcije naspram nekih artikala koji nemaju svoj metod vrijednovanja" @@ -9713,7 +9710,7 @@ msgstr "Otkazani Radni Nalog ne može se obraditi." msgid "Cannot Assign Cashier" msgstr "Ne može se dodijeliti Blagajnik/ca" -#: erpnext/setup/doctype/company/company.py:297 +#: erpnext/setup/doctype/company/company.py:299 msgid "Cannot Change Inventory Account Setting" msgstr "Nije moguće promijeniti Postavke Računa Inventara" @@ -9721,9 +9718,9 @@ msgstr "Nije moguće promijeniti Postavke Računa Inventara" msgid "Cannot Create Return" msgstr "Nije moguće izraditi Povrat" -#: erpnext/stock/doctype/item/item.py:690 -#: erpnext/stock/doctype/item/item.py:703 -#: erpnext/stock/doctype/item/item.py:719 +#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:708 +#: erpnext/stock/doctype/item/item.py:724 msgid "Cannot Merge" msgstr "Nije moguće spojiti" @@ -9747,7 +9744,7 @@ msgstr "Nije moguće izmijeniti {0} {1}, umjesto toga izradi novi." msgid "Cannot apply TDS against multiple parties in one entry" msgstr "Ne može se primijeniti TDS naspram više strana u jednom unosu" -#: erpnext/stock/doctype/item/item.py:380 +#: erpnext/stock/doctype/item/item.py:385 msgid "Cannot be a fixed asset item as Stock Ledger is created." msgstr "Ne može biti artikal fiksne imovine jer je izrađen Registar Zaliha." @@ -9768,7 +9765,7 @@ msgstr "Ne može se otkazati Unos Zatvaranja Kase" msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" msgstr "Ne može se otkazati Unos Rezervacije Zaliha {0}, jer je korišten u radnom nalogu {1}. Molimo prvo otkazati radni nalog ili otkloniti rezervaciju zaliha" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:283 msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "Nije moguće otkazati jer je obrada otkazanih dokumenata na čekanju." @@ -9776,7 +9773,7 @@ msgstr "Nije moguće otkazati jer je obrada otkazanih dokumenata na čekanju." msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "Nije moguće otkazati jer postoji podnešeni Unos Zaliha {0}" -#: erpnext/stock/stock_ledger.py:226 +#: erpnext/stock/stock_ledger.py:230 msgid "Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet." msgstr "Nije moguće otkazati transakciju. Ponovno knjiženje procjene vrijednosti artikla prilikom podnošenja još nije završeno." @@ -9788,7 +9785,7 @@ msgstr "Nije moguće otkazati ovaj Unos Proizvodnih Zaliha jer količina proizve msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "Ne može se poništiti ovaj dokument jer je povezan s podnesenim Prilagođavanjem Vrijednosti Imovine {0}. Poništi Prilagođavanje Vrijednosti Imovine da biste nastavili." -#: erpnext/controllers/buying_controller.py:1145 +#: erpnext/controllers/buying_controller.py:1153 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "Ne može se poništiti ovaj dokument jer je povezan sa dostavljenom imovinom {asset_link}. Otkaži imovinu da nastavite." @@ -9796,11 +9793,11 @@ msgstr "Ne može se poništiti ovaj dokument jer je povezan sa dostavljenom imov msgid "Cannot cancel transaction for Completed Work Order." msgstr "Nije moguće otkazati transakciju za Završeni Radni Nalog." -#: erpnext/stock/doctype/item/item.py:986 +#: erpnext/stock/doctype/item/item.py:991 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "Nije moguće promijeniti atribute nakon transakcije zaliha. Napravi novi artikal i prebaci zalihe na novi artikal" -#: erpnext/stock/doctype/item/item.py:1147 +#: erpnext/stock/doctype/item/item.py:1152 msgid "Cannot change Item {0} from serialized to non-serialized because a Serial and Batch Bundle exists for it. Please delete or cancel the Serial and Batch Bundle first." msgstr "Nije moguće promijenuti artikal {0} iz serijaliziranog u neserijalizirani jer za njega postoji Serijski i Šaržni paket. Prvo izbrišite ili otkažite Serijski i Šaržni paket." @@ -9812,11 +9809,11 @@ msgstr "Nije moguće promijeniti tip referentnog dokumenta." msgid "Cannot change Service Stop Date for item in row {0}" msgstr "Nije moguće promijeniti datum zaustavljanja servisa za artikal u redu {0}" -#: erpnext/stock/doctype/item/item.py:977 +#: erpnext/stock/doctype/item/item.py:982 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "Ne mogu promijeniti svojstva varijante nakon transakcije zaliha. Morat ćete napraviti novi artikal da biste to učinili." -#: erpnext/setup/doctype/company/company.py:403 +#: erpnext/setup/doctype/company/company.py:405 msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "Nije moguće promijeniti standard valutu poduzeća, jer postoje postojeće transakcije. Transakcije se moraju otkazati da bi se promijenila standard valuta." @@ -9828,7 +9825,7 @@ msgstr "Ne može završiti zadatak {0} jer njegov zavisni zadatak {1} nije dovr msgid "Cannot convert Cost Center to ledger as it has child nodes" msgstr "Nije moguće pretvoriti Centar Troškova u Registar jer ima podređene članove" -#: erpnext/projects/doctype/task/task.js:49 +#: erpnext/projects/doctype/task/task.js:55 msgid "Cannot convert Task to non-group because the following child Tasks exist: {0}." msgstr "Nije moguće pretvoriti Zadatak u negrupni jer postoje sljedeći podređeni Zadaci: {0}." @@ -9907,7 +9904,7 @@ msgstr "Nije moguće izbrisati virtuelni DocType: {0}. Virtuelni DocTypes nemaju msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." msgstr "Nije moguće onemogućiti serijski i šaržni broj za artikal, jer već postoje zapisi za serijski broj/šaržu." -#: erpnext/setup/doctype/company/company.py:629 +#: erpnext/setup/doctype/company/company.py:631 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 "Ne može se onemogućiti trajna inventura, jer postoje postojeći unosi u glavnu knjigu zaliha za {0}. Molimo vas da prvo otkažete transakcije zaliha i pokušate ponovo." @@ -9923,7 +9920,7 @@ msgstr "Ne može se demontirati više od proizvedene količine." msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "Ne može se rastaviti {0} količina u odnosu na unos na zalihi {1}. Samo {2} količina dostupna za rastavljanje." -#: erpnext/setup/doctype/company/company.py:294 +#: erpnext/setup/doctype/company/company.py:296 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 "Nije moguće omogućiti račun zaliha po artiklima, jer postoje postojeći unosi u glavnu knjigu zaliha za {0} sa računom zaliha po skladištu. Molimo vas da prvo otkažete transakcije zaliha i pokušate ponovo." @@ -9940,11 +9937,11 @@ msgstr "Nije moguće osigurati dostavu serijskim brojem jer je artikal {0} dodan msgid "Cannot fetch selected rows for submitted Payment Request" msgstr "Nije moguće preuzeti odabrane redove za podnešeni zahtjev za plaćanje" -#: erpnext/public/js/utils/barcode_scanner.js:62 +#: erpnext/public/js/utils/barcode_scanner.js:67 msgid "Cannot find Item or Warehouse with this Barcode" msgstr "Ne mogu pronaći Artikal ili Skladište s ovim Barkodom" -#: erpnext/public/js/utils/barcode_scanner.js:63 +#: erpnext/public/js/utils/barcode_scanner.js:68 msgid "Cannot find Item with this Barcode" msgstr "Ne mogu pronaći artikal s ovim Barkodom" @@ -10002,7 +9999,7 @@ msgstr "Nije moguće preuzeti oznaku veze za ažuriranje. Provjeri zapisnik gre msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "Nije moguće preuzeti oznaku veze. Provjeri zapisnik grešaka za više informacija" -#: erpnext/selling/doctype/customer/customer.py:371 +#: erpnext/selling/doctype/customer/customer.py:385 msgid "Cannot select a Group type Customer Group. Please select a non-group Customer Group." msgstr "Nije moguće odabrati tip grupe \"Klijent Grupa\". Odaberi klijent grupu koja nije grupa." @@ -10027,7 +10024,7 @@ msgstr "Ne može se postaviti kao Izgubljeno pošto je Prodajni Nalog napravljen msgid "Cannot set authorization on basis of Discount for {0}" msgstr "Nije moguće postaviti autorizaciju na osnovu Popusta za {0}" -#: erpnext/stock/doctype/item/item.py:777 +#: erpnext/stock/doctype/item/item.py:782 msgid "Cannot set multiple Item Defaults for a company." msgstr "Nije moguće postaviti više Standard Artikal Postavki za poduzeće." @@ -10136,7 +10133,7 @@ msgstr "Račun Kapitalnih Radova u Toku" msgid "Capital Work in Progress" msgstr "Kapitalni Radovi u Toku" -#: erpnext/assets/doctype/asset/asset.js:228 +#: erpnext/assets/doctype/asset/asset.js:236 msgid "Capitalize Asset" msgstr "Kapitalizacija Imovine" @@ -10145,7 +10142,7 @@ msgstr "Kapitalizacija Imovine" msgid "Capitalize Repair Cost" msgstr "Kapitaliziraj Troškove Popravke" -#: erpnext/assets/doctype/asset/asset.js:226 +#: erpnext/assets/doctype/asset/asset.js:234 msgid "Capitalize this asset before submitting." msgstr "Aktiviraj imovinu prije podnošenja." @@ -10330,16 +10327,12 @@ msgstr "Kategoriziraj po Verifikatu (Konsolidovano)" msgid "Category Details" msgstr "Detalji o Kategoriji" -#: erpnext/assets/dashboard_fixtures.py:93 -msgid "Category-wise Asset Value" -msgstr "Vrijednost Imovine po Kategorijama" - -#: erpnext/buying/doctype/purchase_order/purchase_order.py:289 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:290 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:140 msgid "Caution" msgstr "Oprez" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:210 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:218 msgid "Caution: This might alter frozen accounts." msgstr "Oprez: Ovo može promijeniti zatvorene račune." @@ -10439,7 +10432,7 @@ msgstr "Promijeni Datum Izdanja" msgid "Change in Stock Value" msgstr "Promjena Vrijednosti Zaliha" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:773 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:779 msgid "Change the account type to Receivable or select a different account." msgstr "Promijenite vrstu računa u Potraživanje ili odaberi drugi račun." @@ -10449,7 +10442,7 @@ msgstr "Promijenite vrstu računa u Potraživanje ili odaberi drugi račun." msgid "Change this date manually to setup the next synchronization start date" msgstr "Ručno promijenite ovaj datum da postavi sljedeći datum početka sinhronizacije" -#: erpnext/selling/doctype/customer/customer.py:161 +#: erpnext/selling/doctype/customer/customer.py:168 msgid "Changed customer name to '{0}' as '{1}' already exists." msgstr "Ime klijenta je promijenjeno u '{0}' jer '{1}' već postoji." @@ -10457,7 +10450,7 @@ msgstr "Ime klijenta je promijenjeno u '{0}' jer '{1}' već postoji." msgid "Changes in {0}" msgstr "Promjene u {0}" -#: erpnext/stock/doctype/item/item.js:451 +#: erpnext/stock/doctype/item/item.js:462 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "Promjena Grupe Klijenta za odabranog Klijenta nije dozvoljena." @@ -10467,7 +10460,7 @@ msgstr "Promjena Grupe Klijenta za odabranog Klijenta nije dozvoljena." msgid "Changing the account in any transaction of the DocTypes listed below will trigger a repost. To prevent reposting, remove the relevant DocType from the list." msgstr "Promjena računa u bilo kojoj transakciji DocType navedenih u nastavku će pokrenuti ponovno knjiženje. Da biste spriječili ponovno knjiženje, uklonite relevantni DocType sa liste." -#: erpnext/stock/doctype/item/item.js:34 +#: erpnext/stock/doctype/item/item.js:36 msgid "Changing the valuation method to Moving Average will affect new transactions. If backdated entries are added, earlier FIFO-based entries will be reposted, which may change closing balances." msgstr "Promjena metode vrednovanja na MA uticat će na nove transakcije. Ako se dodaju retroaktivni unosi, raniji unosi zasnovani na FIFO metodi će biti ponovo knjiženi, što može promijeniti završna stanja." @@ -10532,7 +10525,6 @@ msgstr "Stablo Kontnog Plana" #: erpnext/setup/doctype/company/company.js:139 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/home/home.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/invoicing.json msgid "Chart of Accounts" msgstr "Kontni Plan" @@ -10547,11 +10539,9 @@ msgid "Chart of Accounts Importer" msgstr "Kontni Plan Uvoz" #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account_tree.js:191 #: erpnext/accounts/doctype/cost_center/cost_center.js:41 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Chart of Cost Centers" msgstr "Stablo Centara Troškova" @@ -10793,7 +10783,7 @@ msgstr "Klasificiraj tip tržišta kojem ovaj klijent pripada, koristi se za ana msgid "Clauses and Conditions" msgstr "Klauzule i Uslovi" -#: erpnext/public/js/utils/barcode_scanner.js:493 +#: erpnext/public/js/utils/barcode_scanner.js:502 msgid "Clear Last Scanned Warehouse" msgstr "Obriši posljednje skenirano skladište" @@ -10859,7 +10849,7 @@ msgstr "Obrađeno" msgid "Clearing Demo Data..." msgstr "Brisanje Demo Podataka..." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:749 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:747 msgid "Click on 'Get Finished Goods for Manufacture' to fetch the items from the above Sales Orders. Items only for which a BOM is present will be fetched." msgstr "Kliknite na 'Preuzmite Gotov Artikal za Proizvodnju' da preuzmete artikle iz gornjih Prodajnih Naloga. Preuzet će se samo artikli za koje postoji Sastavnica." @@ -10867,7 +10857,7 @@ msgstr "Kliknite na 'Preuzmite Gotov Artikal za Proizvodnju' da preuzmete artikl msgid "Click on Add to Holidays. This will populate the holidays table with all the dates that fall on the selected weekly off. Repeat the process for populating the dates for all your weekly holidays" msgstr "Kliknite na Dodaj Praznicima. Ovo će popuniti tabelu praznika sa svim datumima koji padaju na odabrani slobodan sedmični dan. Ponovite postupak za popunjavanje datuma za sve vaše sedmićne praznike" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:744 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:742 msgid "Click on Get Sales Orders to fetch sales orders based on the above filters." msgstr "Kliknite na Preuzmi Prodajne Naloge da preuzmete prodajne naloge na osnovu gornjih filtera." @@ -11372,6 +11362,7 @@ msgstr "Poduzeća" #. Label of the company (Link) field in DocType 'Vehicle' #. Label of a Link in the Home Workspace #. Label of the company (Link) field in DocType 'Bin' +#. Label of the company (Link) field in DocType 'Company Restriction' #. Label of the company (Link) field in DocType 'Delivery Note' #. Label of the company (Link) field in DocType 'Delivery Trip' #. Label of the company (Link) field in DocType 'Item Default' @@ -11401,7 +11392,6 @@ msgstr "Poduzeća" #. Label of the company (Link) field in DocType 'Subcontracting Receipt' #. Label of the company (Link) field in DocType 'Issue' #. Label of the company (Link) field in DocType 'Warranty Claim' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:82 #: banking/src/pages/BankStatementImporter.tsx:84 #: erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js:8 @@ -11641,9 +11631,10 @@ msgstr "Poduzeća" #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json +#: erpnext/stock/doctype/company_restriction/company_restriction.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.json -#: erpnext/stock/doctype/item/item.js:940 +#: erpnext/stock/doctype/item/item.js:957 #: erpnext/stock/doctype/item_default/item_default.json #: erpnext/stock/doctype/item_standard_cost/item_standard_cost.json #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json @@ -11709,8 +11700,6 @@ msgstr "Poduzeća" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 -#: erpnext/workspace_sidebar/accounts_setup.json -#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "Poduzeće" @@ -11869,6 +11858,23 @@ msgstr "Naziv Poduzeća ne može biti Poduzeće" msgid "Company Not Linked" msgstr "Poduzeće nije povezano" +#. Name of a DocType +#: erpnext/stock/doctype/company_restriction/company_restriction.json +msgid "Company Restriction" +msgstr "" + +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Supplier' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Customer' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Company Restrictions" +msgstr "" + #. Label of the shipping_address (Link) field in DocType 'Request for #. Quotation' #. Label of the shipping_address (Link) field in DocType 'Subcontracting Order' @@ -11894,8 +11900,8 @@ msgstr "Filteri poduzeća i računa nisu postavljeni!" msgid "Company currencies of both the companies should match for Inter Company Transactions." msgstr "Valute oba poduzeća treba da budu usklađeni za transakcije između poduzeća." -#: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:856 +#: erpnext/stock/doctype/material_request/material_request.js:381 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:855 msgid "Company field is required" msgstr "Poduzeće je obavezno" @@ -12006,7 +12012,7 @@ msgstr "Ime Konkurenta" #. Label of the competitors (Table MultiSelect) field in DocType 'Opportunity' #. Label of the competitors (Table MultiSelect) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:612 +#: erpnext/public/js/utils/sales_common.js:610 #: erpnext/selling/doctype/quotation/quotation.json msgid "Competitors" msgstr "Konkurenti" @@ -12061,7 +12067,7 @@ msgstr "Završeni Projekti" msgid "Completed Qty" msgstr "Proizvedena Količina" -#: erpnext/manufacturing/doctype/work_order/services/operations.py:274 +#: erpnext/manufacturing/doctype/work_order/services/operations.py:294 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "Proizvedena količina ne može biti veća od 'Količina za Proizvodnju'" @@ -12109,7 +12115,7 @@ msgstr "Odrađeno od" msgid "Completion Date" msgstr "Datum Odrade" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:82 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:85 msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly." msgstr "Datum Završetka ne može biti prije Datuma Kvara. Prilagodi datume prema tome." @@ -12801,7 +12807,7 @@ msgstr "Faktor Pretvaranja" msgid "Conversion Rate" msgstr "Stopa Pretvaranja" -#: erpnext/stock/doctype/item/item.py:463 +#: erpnext/stock/doctype/item/item.py:468 msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "Faktor pretvaranja za standard jedinicu mora biti 1 u redu {0}" @@ -13024,7 +13030,6 @@ msgstr "Raspodjela Troškova / Gubitak Procesa" #. Item' #. Label of the cost_center (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:567 #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:626 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:1179 @@ -13118,16 +13123,13 @@ msgstr "Raspodjela Troškova / Gubitak Procesa" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center" msgstr "Centar Troškova" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center Allocation" msgstr "Dodjela Centra Troškova" @@ -13153,12 +13155,16 @@ msgstr "Naziv Centra Troškova" msgid "Cost Center Number" msgstr "Broj Centra Troškova" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:122 +msgid "Cost Center Validation Error" +msgstr "" + #. Label of a Card Break in the Invoicing Workspace #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Cost Center and Budgeting" msgstr "Centar Troškova i Proračuna" -#: erpnext/public/js/utils/sales_common.js:546 +#: erpnext/public/js/utils/sales_common.js:544 msgid "Cost Center for Item rows has been updated to {0}" msgstr "Centar Troškova za artikal redove je ažuriran na {0}" @@ -13171,7 +13177,7 @@ msgid "Cost Center is required" msgstr "Centar Troškova je obavezan" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:644 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:401 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:410 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "Centar Troškova je obavezan u redu {0} u tabeli PDV za tip {1}" @@ -13573,8 +13579,8 @@ msgstr "Izradi tragove" msgid "Create Ledger Entries for Change Amount" msgstr "Izradi Unose u Registar za Kusur" -#: erpnext/buying/doctype/supplier/supplier.js:257 -#: erpnext/selling/doctype/customer/customer.js:289 +#: erpnext/buying/doctype/supplier/supplier.js:266 +#: erpnext/selling/doctype/customer/customer.js:298 msgid "Create Link" msgstr "Izradi vezu" @@ -13721,9 +13727,9 @@ msgstr "Izradi Unos Ponovnog Knjiženja" #. Title of an Onboarding Step #. Label of an action in the Onboarding Step 'Create Sales Invoice' #: erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json -#: erpnext/projects/doctype/timesheet/timesheet.js:55 -#: erpnext/projects/doctype/timesheet/timesheet.js:231 -#: erpnext/projects/doctype/timesheet/timesheet.js:235 +#: erpnext/projects/doctype/timesheet/timesheet.js:56 +#: erpnext/projects/doctype/timesheet/timesheet.js:233 +#: erpnext/projects/doctype/timesheet/timesheet.js:237 #: erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json msgid "Create Sales Invoice" msgstr "Izradi Prodajnu Fakturu" @@ -13746,7 +13752,7 @@ msgid "Create Service Item" msgstr "Izradi Artikal Usluge" #: erpnext/stock/dashboard/item_dashboard.js:283 -#: erpnext/stock/doctype/material_request/material_request.js:478 +#: erpnext/stock/doctype/material_request/material_request.js:479 msgid "Create Stock Entry" msgstr "Izradi unos Zaliha" @@ -13829,12 +13835,12 @@ msgstr "Izradi Korisničku Dozvolu" msgid "Create Users" msgstr "Izradi Korisnike" -#: erpnext/stock/doctype/item/item.js:1398 +#: erpnext/stock/doctype/item/item.js:1415 msgid "Create Variant" msgstr "Izradi Varijantu" -#: erpnext/stock/doctype/item/item.js:1210 -#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1227 +#: erpnext/stock/doctype/item/item.js:1264 msgid "Create Variants" msgstr "Izradi Varijante" @@ -13869,12 +13875,12 @@ msgstr "Izradi novi unos na osnovu pravila" msgid "Create a new rule to automatically classify transactions." msgstr "Izradi novo pravilo za automatsku klasifikaciju transakcija." -#: erpnext/stock/doctype/item/item.js:1230 -#: erpnext/stock/doctype/item/item.js:1391 +#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1408 msgid "Create a variant with the template image." msgstr "Izradi Varijantu sa slikom predloška." -#: erpnext/stock/stock_ledger.py:2157 +#: erpnext/stock/stock_ledger.py:2205 msgid "Create an incoming stock transaction for the Item." msgstr "Izradi dolaznu transakciju zaliha za artikal." @@ -13912,7 +13918,7 @@ msgstr "Izrađeno Migracijom" msgid "Created {0} draft Grouped Payment Entries" msgstr "Izrađeno {0} nacrta Grupiranih Unosa Plaćanja" -#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:230 +#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:232 msgid "Created {0} scorecards for {1} between:" msgstr "Izrađeno {0} tablica bodova za {1} između:" @@ -13953,7 +13959,7 @@ msgstr "Izrada Dimenzija u toku..." msgid "Creating Journal Entries..." msgstr "Izrada Naloga Knjiženja u toku..." -#: erpnext/stock/doctype/item/item.js:999 +#: erpnext/stock/doctype/item/item.js:1016 msgid "Creating Opening Stock Entry..." msgstr "Izrada Početnog Unosa Zaliha..." @@ -14062,6 +14068,13 @@ msgstr "Izrada {0} nije uspjelo.\n" msgid "Credit" msgstr "Kredit" +#. Label of the credit_limits (Table) field in DocType 'Customer' +#. Label of the credit_limits (Table) field in DocType 'Customer Group' +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/setup/doctype/customer_group/customer_group.json +msgid "Credit & Overdue Limits" +msgstr "" + #: erpnext/accounts/report/general_ledger/general_ledger.py:744 msgid "Credit (Transaction)" msgstr "Kredit (Transakcija)" @@ -14131,23 +14144,19 @@ msgstr "Unos Kreditne Kartice" msgid "Credit Days" msgstr "Kreditni Dani" -#. Label of the credit_limits (Table) field in DocType 'Customer' #. Label of the credit_limit (Currency) field in DocType 'Customer Credit #. Limit' #. Label of the credit_limit (Currency) field in DocType 'Company' -#. Label of the credit_limits (Table) field in DocType 'Customer Group' #. Label of the section_credit_limit (Section Break) field in DocType 'Supplier #. Group' -#: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.py:65 #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/supplier_group/supplier_group.json msgid "Credit Limit" msgstr "Kreditno Ograničenje" -#: erpnext/selling/doctype/customer/customer.py:542 +#: erpnext/selling/doctype/customer/customer.py:559 msgid "Credit Limit Crossed" msgstr "Kreditno Ograničenje je probijeno" @@ -14227,20 +14236,20 @@ msgstr "Kredit Za" msgid "Credit in Company Currency" msgstr "Kredit u Valuti Poduzeća" -#: erpnext/selling/doctype/customer/customer.py:508 -#: erpnext/selling/doctype/customer/customer.py:564 +#: erpnext/selling/doctype/customer/customer.py:525 +#: erpnext/selling/doctype/customer/customer.py:581 msgid "Credit limit has been crossed for customer {0} ({1}/{2})" msgstr "Kreditno ograničenje je premašeno za klijenta {0} ({1}/{2})" -#: erpnext/selling/doctype/customer/customer.py:398 +#: erpnext/selling/doctype/customer/customer.py:412 msgid "Credit limit is already defined for the Company {0}" msgstr "Kreditno ograničenje je već definisano za {0}" -#: erpnext/selling/doctype/customer/customer.py:563 +#: erpnext/selling/doctype/customer/customer.py:580 msgid "Credit limit reached for customer {0}" msgstr "Kreditno Ograničenje je dostignuto za Klijenta {0}" -#: erpnext/accounts/utils.py:2856 +#: erpnext/accounts/utils.py:2850 msgid "Credit limit warning — submission may be blocked: {0}" msgstr "Upozorenje o kreditnom ograničenju — slanje zahtjeva može biti blokirano: {0}" @@ -14300,7 +14309,7 @@ msgstr "Prioritet Kriterija" msgid "Criteria weights must add up to 100%" msgstr "Prioriteti Kriterija moraju iznositi do 100%" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:189 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:196 msgid "Cron Interval should be between 1 and 59 Min" msgstr "Cron interval bi trebao biti između 1 i 59 min" @@ -14357,10 +14366,8 @@ msgstr "Šolja" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/doctype/currency_exchange/currency_exchange.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Currency Exchange" msgstr "Razmjena Valuta" @@ -14370,7 +14377,6 @@ msgstr "Razmjena Valuta" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Currency Exchange Settings" msgstr "Postavke Razmjene Valuta" @@ -14429,7 +14435,7 @@ msgstr "Filteri valuta trenutno nisu podržani u Prilagođenom Finansijskom Izvj #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:215 #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:284 -#: erpnext/accounts/utils.py:2575 +#: erpnext/accounts/utils.py:2569 msgid "Currency for {0} must be {1}" msgstr "Valuta za {0} mora biti {1}" @@ -14487,7 +14493,7 @@ msgstr "Trenutna Imovina" msgid "Current BOM" msgstr "Trenutna Sastavnica" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:81 msgid "Current BOM and New BOM cannot be the same" msgstr "Trenutna i Nova Sastavnica ne mogu biti iste" @@ -14728,7 +14734,7 @@ msgstr "Prilagođeni Razdjelnici" #: erpnext/accounts/report/sales_register/sales_register.py:201 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/supplier/supplier.js:225 +#: erpnext/buying/doctype/supplier/supplier.js:234 #: erpnext/controllers/trends.py:434 erpnext/crm/doctype/contract/contract.json #: erpnext/crm/doctype/lead/lead.js:32 #: erpnext/crm/doctype/opportunity/opportunity.js:99 @@ -14742,7 +14748,7 @@ msgstr "Prilagođeni Razdjelnici" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json #: erpnext/projects/doctype/project/project.json -#: erpnext/projects/doctype/timesheet/timesheet.js:223 +#: erpnext/projects/doctype/timesheet/timesheet.js:225 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:46 #: erpnext/public/js/sales_trends_filters.js:25 @@ -14790,7 +14796,7 @@ msgstr "Prilagođeni Razdjelnici" #: 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:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:493 #: 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 @@ -14810,7 +14816,6 @@ msgstr "Prilagođeni Razdjelnici" #: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Customer" msgstr "Klijent" @@ -15215,7 +15220,7 @@ msgstr "Klijent Dostavljen Artikal" msgid "Customer Provided Item Cost" msgstr "Trošak Klijent Dostavljenog Artikala " -#: erpnext/setup/doctype/company/company.py:555 +#: erpnext/setup/doctype/company/company.py:557 msgid "Customer Service" msgstr "Podrška Klijenta" @@ -15272,12 +15277,16 @@ msgstr "Klijent ili Artikal" msgid "Customer required for 'Customerwise Discount'" msgstr "Klijent je obavezan za 'Popust na osnovu Klijenta'" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:885 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:891 #: erpnext/selling/doctype/sales_order/sales_order.py:392 #: erpnext/stock/doctype/delivery_note/delivery_note.py:393 msgid "Customer {0} does not belong to project {1}" msgstr "Klijent {0} ne pripada projektu {1}" +#: erpnext/selling/doctype/customer/customer.py:605 +msgid "Customer {0} has an overdue billing limit. Overdue amount {1} exceeds the allowed threshold {2}." +msgstr "" + #. Label of the customer_item_code (Data) field in DocType 'POS Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Sales Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Quotation Item' @@ -15386,7 +15395,7 @@ msgstr "D - E" msgid "DFS" msgstr "DFS" -#: erpnext/projects/doctype/project/project.py:751 +#: erpnext/projects/doctype/project/project.py:781 msgid "Daily Project Summary for {0}" msgstr "Dnevni sažetak projekta za {0}" @@ -15721,13 +15730,13 @@ msgstr "Debit Faktura će ažurirati svoj nepodmireni iznos, čak i ako je naved #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:769 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:775 #: erpnext/controllers/accounts_controller.py:1214 msgid "Debit To" msgstr "Debit prema" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 msgid "Debit To is required" msgstr "Debit prema je obavezan" @@ -15803,7 +15812,7 @@ msgstr "Decilitar" msgid "Decimeter" msgstr "Decimetar" -#: erpnext/public/js/utils/sales_common.js:639 +#: erpnext/public/js/utils/sales_common.js:637 msgid "Declare Lost" msgstr "Prijavi Gubitak" @@ -15834,11 +15843,6 @@ msgstr "Odbijeno od" msgid "Deductee Details" msgstr "Detalji Odbitaka" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/taxes.json -msgid "Deduction Certificate" -msgstr "Verifikat Odbitka" - #. Label of the deductions_or_loss_section (Section Break) field in DocType #. 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -15881,14 +15885,14 @@ msgstr "Standard Račun Predujma" #. Label of the default_advance_paid_account (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:388 +#: erpnext/setup/doctype/company/company.py:390 msgid "Default Advance Paid Account" msgstr "Standard Račun za Predujam Plaćanje" #. Label of the default_advance_received_account (Link) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:377 +#: erpnext/setup/doctype/company/company.py:379 msgid "Default Advance Received Account" msgstr "Standard Račun za Predujam Plaćanje" @@ -15903,7 +15907,7 @@ msgstr "Standard Raspon Starenja" msgid "Default BOM" msgstr "Standard Sastavnica" -#: erpnext/stock/doctype/item/item.py:506 +#: erpnext/stock/doctype/item/item.py:511 msgid "Default BOM ({0}) must be active for this item or its template" msgstr "Standard Sastavnica ({0}) mora biti aktivna za ovaj artikal ili njegov predložak" @@ -15974,6 +15978,11 @@ msgstr "Standard Račun Troškova Prodanih Proizvoda" msgid "Default Costing Rate" msgstr "Standard Obračunata Cjena" +#. Label of the country (Link) field in DocType 'Global Defaults' +#: erpnext/setup/doctype/global_defaults/global_defaults.json +msgid "Default Country" +msgstr "" + #. Label of the default_currency (Link) field in DocType 'Company' #. Label of the default_currency (Link) field in DocType 'Global Defaults' #: erpnext/setup/doctype/company/company.json @@ -16226,15 +16235,15 @@ msgstr "Standard Distrikt" msgid "Default Unit of Measure" msgstr "Standard Jedinica" -#: erpnext/stock/doctype/item/item.py:1428 +#: erpnext/stock/doctype/item/item.py:1433 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "Standard Jedinica za artikal {0} ne može se promijeniti direktno jer ste već izvršili neke transakcije sa drugom Jedinicom. Morate ili otkazati povezane dokumente ili izraditi novi artikal." -#: erpnext/stock/doctype/item/item.py:1408 +#: erpnext/stock/doctype/item/item.py:1413 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "Standard Jedinica za artikal {0} ne može se promijeniti direktno jer ste već izvršili neke transakcije sa drugom Jedinicom. Morat ćete izraditi novi artikal da biste koristili drugu Jedinicu." -#: erpnext/stock/doctype/item/item.py:1012 +#: erpnext/stock/doctype/item/item.py:1017 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "Standard Jedinica za Varijantu '{0}' mora biti ista kao u Predložku '{1}'" @@ -16250,7 +16259,7 @@ msgstr "Standard Metoda Vrijednovanja" #. Label of the set_warehouse (Link) field in DocType 'Stock Reconciliation' #. Label of the default_warehouse (Link) field in DocType 'Stock Settings' #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/stock/doctype/item/item.js:961 +#: erpnext/stock/doctype/item/item.js:978 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -16288,8 +16297,8 @@ msgstr "Standard postavke za vaše transakcije vezane za zalihe" msgid "Default tax templates for sales, purchase and items are created." msgstr "Standard predlošci PDV-a za prodaju, nabavu i artikle su izrađeni." -#: erpnext/stock/doctype/item/item.js:953 -#: erpnext/stock/doctype/item/item.js:965 +#: erpnext/stock/doctype/item/item.js:970 +#: erpnext/stock/doctype/item/item.js:982 msgid "Default warehouse from Item Defaults." msgstr "Standard Skladište iz Standard Postavki Artikala." @@ -16537,7 +16546,7 @@ msgstr "Dostavi Sekundarne Artikle" #. Order' #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:20 -#: erpnext/controllers/website_list_for_contact.py:216 +#: erpnext/controllers/website_list_for_contact.py:218 #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -16754,7 +16763,7 @@ msgstr "Paket Artikal Dostavnice" msgid "Delivery Note Trends" msgstr "Trendovi Dostave" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 msgid "Delivery Note {0} is not submitted" msgstr "Dostavnica {0} nije podnešena" @@ -16974,7 +16983,7 @@ msgstr "Amortizacija" #. Label of the depreciation_amount (Currency) field in DocType 'Depreciation #. Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:167 -#: erpnext/assets/doctype/asset/asset.js:384 +#: erpnext/assets/doctype/asset/asset.js:392 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Depreciation Amount" msgstr "Iznos Amortizacije" @@ -17057,7 +17066,7 @@ msgstr "Opcije Amortizacije" msgid "Depreciation Posting Date" msgstr "Datum Knjiženja Amortizacije" -#: erpnext/assets/doctype/asset/asset.js:928 +#: erpnext/assets/doctype/asset/asset.js:936 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "Datum knjiženja amortizacije ne može biti prije Datuma raspoloživosti za upotrebu" @@ -17126,7 +17135,7 @@ msgstr "Dizajner" #. Label of the order_lost_reason (Small Text) field in DocType 'Opportunity' #. Label of the order_lost_reason (Small Text) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:618 +#: erpnext/public/js/utils/sales_common.js:616 #: erpnext/selling/doctype/quotation/quotation.json msgid "Detailed Reason" msgstr "Detaljan Razlog" @@ -17489,8 +17498,8 @@ msgstr "Onemogućuje automatsko preuzimanje postojeće količine" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/manufacturing/doctype/work_order/work_order.js:1081 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:392 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:435 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:391 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:434 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Disassemble" @@ -17723,7 +17732,7 @@ msgstr "Popust ne može biti veći od 100%." msgid "Discount must be less than 100" msgstr "Popust mora biti manji od 100%" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3098 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3096 msgid "Discount of {0} applied as per Payment Term" msgstr "Popust od {0} primjenjen prema Uslovima Plaćanja" @@ -17795,7 +17804,7 @@ msgstr "Diskrecijski Razlog" msgid "Dislikes" msgstr "Ne sviđa mi se" -#: erpnext/setup/doctype/company/company.py:549 +#: erpnext/setup/doctype/company/company.py:551 msgid "Dispatch" msgstr "Otprema" @@ -18035,7 +18044,7 @@ msgstr "Ne preuzimaj nabavnu cjenu iz Serijskog Broja" msgid "Do not import" msgstr "Ne uvozi" -#. Description of the 'Hide Currency Symbol' (Select) field in DocType 'Global +#. Description of the 'Hide Currency Symbol' (Check) field in DocType 'Global #. Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Do not show any symbol like $ etc next to currencies." @@ -18059,7 +18068,7 @@ msgstr "Ne ažuriraj varijante prilikom spremanja" msgid "Do not use Batch-wise Valuation" msgstr "Ne koristi Šaržno Vrijednovanje" -#: erpnext/assets/doctype/asset/asset.js:966 +#: erpnext/assets/doctype/asset/asset.js:974 msgid "Do you really want to restore this scrapped asset?" msgstr "Da li zaista želite vratiti ovu rashodovan imovinu?" @@ -18067,7 +18076,7 @@ msgstr "Da li zaista želite vratiti ovu rashodovan imovinu?" msgid "Do you still want to enable immutable ledger?" msgstr "Želite li i dalje omogućiti nepromjenjivo knjigovodstvo?" -#: erpnext/stock/doctype/item/item.js:42 +#: erpnext/stock/doctype/item/item.js:44 msgid "Do you want to change valuation method?" msgstr "Želite li promijeniti metodu vrednovanja?" @@ -18327,15 +18336,13 @@ msgstr "Datum Dospijeća ne može biti nakon {0}" msgid "Due Date cannot be before {0}" msgstr "Datum Dospijeća ne može biti prije {0}" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:167 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:175 msgid "Due to stock closing entry {0}, you cannot repost item valuation before {1}" msgstr "Zbog unosa zatvaranja zaliha {0}, ne možete ponovo objaviti procjenu artikla prije {1}" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:158 -#: erpnext/workspace_sidebar/banking.json msgid "Dunning" msgstr "Opomena" @@ -18367,6 +18374,14 @@ msgstr "Pismo Opomene" msgid "Dunning Letter Text" msgstr "Tekst Pisma Opomene" +#: erpnext/accounts/doctype/dunning/dunning.py:184 +msgid "Dunning Letter for Dunning Type {0} in language '{1}' not found." +msgstr "" + +#: erpnext/accounts/doctype/dunning/dunning.py:188 +msgid "Dunning Letter for Dunning Type {0} not found." +msgstr "" + #. Label of the dunning_level (Int) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Dunning Level" @@ -18375,10 +18390,8 @@ msgstr "Nivo Opomene" #. Label of the dunning_type (Link) field in DocType 'Dunning' #. Name of a DocType #. Label of the dunning_type (Data) field in DocType 'Dunning Type' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/dunning_type/dunning_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Dunning Type" msgstr "Tip Opomene" @@ -18456,6 +18469,10 @@ msgstr "Dupliciraj unos: {0}{1}" msgid "Duplicate item group found in the item group table" msgstr "Dupla grupa artikalai pronađena je u tabeli grupe artikla" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:133 +msgid "Duplicate languages found on Dunning Letter Text. Keep only one of them." +msgstr "" + #: erpnext/projects/doctype/project/project.js:186 msgid "Duplicate project has been created" msgstr "Kopija Projekta je izrađena" @@ -19035,7 +19052,7 @@ msgstr "Omogući {0} u Postavkama Artikla da biste nastavili s {1} kontro msgid "Enable Accounting Dimensions" msgstr "Omogući Knjigovodstvene Dimenzije" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1752 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1754 msgid "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock." msgstr "Omogući Dozvoli Djelomičnu Rezervaciju u Postavkama Zaliha da rezervišete djelomične zalihe." @@ -19051,7 +19068,7 @@ msgstr "Omogući Zakazivanje Termina" msgid "Enable Auto Email" msgstr "Omogući Automatsku e-poštu" -#: erpnext/stock/doctype/item/item.py:1216 +#: erpnext/stock/doctype/item/item.py:1221 msgid "Enable Auto Re-Order" msgstr "Omogući Automatsku Ponovnu Naložbu" @@ -19146,6 +19163,12 @@ msgstr "Omogući Program Bodova Lojalnosti" msgid "Enable Opportunity Creation from Contact Us" msgstr "Omogući Izrada Prilika iz Kontaktiraj Nas obrasca" +#. Label of the enable_overdue_billing_threshold (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Overdue Billing Threshold" +msgstr "" + #. Label of the enable_parallel_reposting (Check) field in DocType 'Stock #. Reposting Settings' #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -19394,7 +19417,7 @@ msgstr "Završi Sesiju" msgid "End Time" msgstr "Vrijeme Završetka" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:367 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:366 msgid "End Transit" msgstr "Završi Tranzit" @@ -19508,7 +19531,7 @@ msgstr "Unesi naziv za ovu Listu Praznika." msgid "Enter amount to be redeemed." msgstr "Unesi iznos koji želite iskoristiti." -#: erpnext/stock/doctype/item/item.js:1560 +#: erpnext/stock/doctype/item/item.js:1577 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "Unesi Kod Artikla, ime će se automatski popuniti isto kao kod artikla kada kliknete unutar polja Naziv Artikla." @@ -19520,7 +19543,7 @@ msgstr "Unesi E-poštu Klijenta" msgid "Enter customer's phone number" msgstr "Unesi broj telefona Klijenta" -#: erpnext/assets/doctype/asset/asset.js:937 +#: erpnext/assets/doctype/asset/asset.js:945 msgid "Enter date to scrap asset" msgstr "Unesi datum za rashodovanje Imovine" @@ -19564,7 +19587,7 @@ msgstr "Unesi ime Korisnika prije podnošenja." msgid "Enter the name of the bank or lending institution before submitting." msgstr "Unesi naziv banke ili kreditne institucije prije podnošenja." -#: erpnext/stock/doctype/item/item.js:1586 +#: erpnext/stock/doctype/item/item.js:1603 msgid "Enter the opening stock units." msgstr "Unesi početne jedinice zaliha." @@ -19675,7 +19698,7 @@ msgstr "Greška prilikom knjiženja unosa amortizacije" msgid "Error while processing deferred accounting for {0}" msgstr "Greška prilikom obrade odgođenog knjiženja za {0}" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:613 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:762 msgid "Error while reposting item valuation" msgstr "Greška prilikom ponovnog knjiženja vrijednosti artikla" @@ -19733,7 +19756,7 @@ msgstr "Ex Works" msgid "Example URL" msgstr "Primjer URL-a" -#: erpnext/stock/doctype/item/item.py:1128 +#: erpnext/stock/doctype/item/item.py:1133 msgid "Example of a linked document: {0}" msgstr "Primjer povezanog dokumenta: {0}" @@ -19753,7 +19776,7 @@ msgstr "Primjer: ABCD.#####. Ako je serija postavljena, a broj šarže nije post msgid "Example: If the transaction amount is 200, then this will be calculated as {} = {}" msgstr "Primjer: Ako je iznos transakcije 200, onda će se ovo izračunati kao {} = {}" -#: erpnext/stock/stock_ledger.py:2446 +#: erpnext/stock/stock_ledger.py:2494 msgid "Example: Serial No {0} reserved in {1}." msgstr "Primjer: Serijski Broj {0} je rezervisan u {1}." @@ -19811,7 +19834,7 @@ msgstr "Rezultat Deviznog Kursa" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:743 +#: erpnext/setup/doctype/company/company.py:745 msgid "Exchange Gain/Loss" msgstr "Rezultat Deviznog Kursa" @@ -19916,7 +19939,7 @@ msgstr "Devizni Kurs mora biti isti kao {0} {1} ({2})" msgid "Excise Entry" msgstr "Unos Akcize" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1520 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1524 msgid "Excise Invoice" msgstr "Akcizna Faktura" @@ -20130,7 +20153,7 @@ msgstr "Očekivano: {0}" msgid "Expense" msgstr "Troškovi" -#: erpnext/stock/services/base_stock_gl_composer.py:220 +#: erpnext/stock/services/base_stock_gl_composer.py:276 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "Račun Rashoda/ Razlike ({0}) mora biti račun 'Dobitka ili Gubitka'" @@ -20182,7 +20205,7 @@ msgstr "Račun Rashoda/ Razlike ({0}) mora biti račun 'Dobitka ili Gubitka'" msgid "Expense Account" msgstr "Račun Troškova" -#: erpnext/stock/services/base_stock_gl_composer.py:199 +#: erpnext/stock/services/base_stock_gl_composer.py:266 msgid "Expense Account Missing" msgstr "Nedostaje Račun Troškova" @@ -20216,6 +20239,32 @@ msgstr "Trošak za ovaj artikal bit će priznat tokom nekoliko mjeseci. Npr: una msgid "Expenses" msgstr "Troškovi" +#. Label of the expenses_added_to_stock_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_account (Link) field in DocType 'Item +#. Default' +#. Label of the vf_expenses_added_to_stock_account (Read Only) field in DocType +#. 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Account" +msgstr "" + +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Item Default' +#. Label of the vf_expenses_added_to_stock_contra_account (Read Only) field in +#. DocType 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Contra Account" +msgstr "" + +#: erpnext/stock/services/base_stock_gl_composer.py:217 +msgid "Expenses Added To Stock for Item {0}" +msgstr "" + #. Option for the 'Account Type' (Select) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:92 @@ -20233,7 +20282,7 @@ msgid "Expenses Included In Valuation" msgstr "Troškovi uključeni u Procjenu" #: erpnext/stock/doctype/pick_list/pick_list.py:310 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:518 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:517 msgid "Expired Batches" msgstr "Istekle Šarže" @@ -20370,11 +20419,6 @@ msgstr "FIFO red Zaliha (količina, cjena)" msgid "FIFO/LIFO Queue" msgstr "FIFO/LIFO red čekanja" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "FX Revaluation" -msgstr "Revalorizacija Deviznog Kursa" - #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Fahrenheit" @@ -20423,7 +20467,7 @@ msgstr "Nije uspjelo parsiranje MT940 formata. Greška: {0}" msgid "Failed to personalize your setup" msgstr "Personalizacija vaših postavki nije uspjela" -#: erpnext/assets/doctype/asset/asset.js:269 +#: erpnext/assets/doctype/asset/asset.js:277 msgid "Failed to post depreciation entries" msgstr "Neuspješan unos amortizacije" @@ -20448,7 +20492,7 @@ msgstr "Neuspješno postavljanje poduzeća" msgid "Failed to setup defaults" msgstr "Neuspješno postavljanje standard postavki" -#: erpnext/setup/doctype/company/company.py:923 +#: erpnext/setup/doctype/company/company.py:925 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "Neuspješno postavljanje standard postavki za zemlju {0}. Kontaktiraj podršku." @@ -20559,8 +20603,8 @@ msgstr "Preuzmi Radni List u Fakturu Prodaje" msgid "Fetch Value From" msgstr "Preuzmi Vrijednost od" -#: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:833 +#: erpnext/stock/doctype/material_request/material_request.js:373 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:832 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "Pruzmi Neastavljenu Sastavnicu (uključujući podsklopove)" @@ -20727,7 +20771,6 @@ msgstr "Finalni Proizvod" #. Label of the finance_book (Link) field in DocType 'Asset Finance Book' #. Label of the finance_book (Link) field in DocType 'Asset Shift Allocation' #. Label of the finance_book (Link) field in DocType 'Asset Value Adjustment' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/finance_book/finance_book.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -20758,7 +20801,6 @@ msgstr "Finalni Proizvod" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:48 #: erpnext/public/js/financial_statements.js:426 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "Finansijski Registar" @@ -20955,7 +20997,7 @@ msgid "Finished Good {0} must be a sub-contracted item." msgstr "Gotov Proizvod {0} mora biti podizvođački artikal." #: erpnext/selling/doctype/sales_order/sales_order.js:1475 -#: erpnext/setup/doctype/company/company.py:454 +#: erpnext/setup/doctype/company/company.py:456 msgid "Finished Goods" msgstr "Gotov Proizvod" @@ -20996,7 +21038,7 @@ msgstr "Skladište Gotovog Proizvoda" msgid "Finished Goods based Operating Cost" msgstr "Operativni troškovi zasnovani na Gotovom Proizvodu" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:887 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:900 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "Gotov Proizvod {0} ne odgovara Radnom Nalogu {1}" @@ -21070,7 +21112,6 @@ msgstr "Fiskalni režim je obavezan, ljubazno postavi fiskalni režim za {0}" #. Certificate' #. Label of the fiscal_year (Link) field in DocType 'Target Detail' #. Label of the fiscal_year (Data) field in DocType 'Stock Ledger Entry' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json @@ -21091,7 +21132,6 @@ msgstr "Fiskalni režim je obavezan, ljubazno postavi fiskalni režim za {0}" #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js:15 #: erpnext/setup/doctype/target_detail/target_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Fiscal Year" msgstr "Fiskalna Godina" @@ -21153,7 +21193,7 @@ msgstr "Račun Fiksne Imovine" msgid "Fixed Asset Defaults" msgstr "Standard Postavke Fiksne Imovine" -#: erpnext/stock/doctype/item/item.py:374 +#: erpnext/stock/doctype/item/item.py:379 msgid "Fixed Asset Item must be a non-stock item." msgstr "Artikal Fiksne Imovine mora biti artikal koja nije na zalihama." @@ -21278,7 +21318,7 @@ msgstr "Foot/Second" msgid "For" msgstr "Za" -#: erpnext/public/js/utils/sales_common.js:395 +#: erpnext/public/js/utils/sales_common.js:393 msgid "For 'Product Bundle' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Product Bundle' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table." msgstr "Za artikel 'Artikal Paket ', skladište, serijski broj i šaržu će se uzeti u obzir iz tabele 'Lista Pakovanja'. Ako su Skladište i Šaržni Broj isti za sve artikle pakovanja za bilo koji 'Artikal Paket', te vrijednosti se mogu unijeti u glavnu tabelu Artikala, vrijednosti će se kopirati u tabelu 'Lista Pakovanja'." @@ -21374,11 +21414,11 @@ msgstr "Za Dobavljača" #. Label of the warehouse (Link) field in DocType 'Material Request Plan Item' #. Label of the for_warehouse (Link) field in DocType 'Production Plan' #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:499 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:497 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:180 #: erpnext/selling/doctype/sales_order/sales_order.js:1488 -#: erpnext/stock/doctype/material_request/material_request.js:361 +#: erpnext/stock/doctype/material_request/material_request.js:362 #: erpnext/templates/form_grid/material_request_grid.html:36 msgid "For Warehouse" msgstr "Za Skladište" @@ -21506,7 +21546,7 @@ msgctxt "Clear payment terms template and/or payment schedule when due date is c msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "Da bi novi {0} stupio na snagu, želite li izbrisati trenutni {1}?" -#: erpnext/stock/services/serial_batch_bundle_service.py:272 +#: erpnext/stock/services/serial_batch_bundle_service.py:274 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "Za {0} nema raspoloživih zaliha za povrat u skladištu {1}." @@ -21723,7 +21763,7 @@ msgstr "Od datuma i do datuma su obavezni" msgid "From Date and To Date are required" msgstr "Od Datuma i Do Datuma su obavezni" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:30 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:40 msgid "From Date and To Date lie in different Fiscal Year" msgstr "Od datuma i do datuma su u različitim Fiskalnim Godinama" @@ -21746,9 +21786,9 @@ msgstr "Od datuma je obavezno" #: erpnext/accounts/report/general_ledger/general_ledger.py:86 #: erpnext/accounts/report/pos_register/pos_register.py:124 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:32 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:25 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:34 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:38 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:35 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:39 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:49 msgid "From Date must be before To Date" msgstr "Od datuma mora biti prije Do datuma" @@ -22205,7 +22245,7 @@ msgstr "Rezultat od Revalorizacije" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:138 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:225 -#: erpnext/setup/doctype/company/company.py:751 +#: erpnext/setup/doctype/company/company.py:753 msgid "Gain/Loss on Asset Disposal" msgstr "Rezultat pri Odlaganju Imovine" @@ -22272,7 +22312,10 @@ msgstr "Dužina napomena Knjigovodstvenog Registra" msgid "General Ledger requires {0} to be synced to DuckDB" msgstr "Knjigovodstveni Registar zahtijeva da se {0} sinhronizira sa DuckDB-om" +#. Label of the general_settings_section (Section Break) field in DocType +#. 'Global Defaults' #. Label of the gs (Section Break) field in DocType 'Item Group' +#: erpnext/setup/doctype/global_defaults/global_defaults.json #: erpnext/setup/doctype/item_group/item_group.json msgid "General Settings" msgstr "Opšte Postavke" @@ -22384,7 +22427,7 @@ msgstr "Preuzmi Stanje" msgid "Get Current Stock" msgstr "Preuzmi Trenutne Zalihe" -#: erpnext/selling/doctype/customer/customer.js:190 +#: erpnext/selling/doctype/customer/customer.js:199 msgid "Get Customer Group Details" msgstr "Preuzmi Detalje o Grupi Klijenta" @@ -22448,15 +22491,15 @@ msgstr "Preuzmi Lokacije Artikla" #: erpnext/selling/doctype/sales_order/sales_order.js:1254 #: erpnext/stock/doctype/delivery_note/delivery_note.js:187 #: erpnext/stock/doctype/delivery_note/delivery_note.js:239 -#: erpnext/stock/doctype/material_request/material_request.js:141 -#: erpnext/stock/doctype/material_request/material_request.js:238 +#: erpnext/stock/doctype/material_request/material_request.js:144 +#: erpnext/stock/doctype/material_request/material_request.js:241 #: 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:461 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:508 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:541 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:632 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:800 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:460 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:507 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:540 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:631 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:799 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "Preuzmi Artikle iz" @@ -22471,9 +22514,9 @@ msgstr "Preuzmi Artikle za Nabavu / Prijenos" msgid "Get Items for Purchase Only" msgstr "Preuzmi Artikle samo za Nabavu" -#: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:836 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:849 +#: erpnext/stock/doctype/material_request/material_request.js:347 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:835 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:848 msgid "Get Items from BOM" msgstr "Preuzmi Artikle iz Sastavnice" @@ -22557,7 +22600,7 @@ msgstr "Preuzmi Sekundarne Artikle" msgid "Get Started Sections" msgstr "Odjeljci Prvih Koraka" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:581 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:579 msgid "Get Stock" msgstr "Preuzmi Zalihe" @@ -22567,7 +22610,7 @@ msgstr "Preuzmi Zalihe" msgid "Get Sub Assembly Items" msgstr "Preuzmi Artikle Podsklopa" -#: erpnext/buying/doctype/supplier/supplier.js:151 +#: erpnext/buying/doctype/supplier/supplier.js:160 msgid "Get Supplier Group Details" msgstr "Preuzmi Detalje o Grupi Dobavljača" @@ -22659,7 +22702,7 @@ msgstr "Ciljevi" msgid "Goods" msgstr "Proizvod" -#: erpnext/setup/doctype/company/company.py:455 +#: erpnext/setup/doctype/company/company.py:457 #: erpnext/stock/doctype/stock_entry/stock_entry_list.js:34 msgid "Goods In Transit" msgstr "Proizvod u Tranzitu" @@ -22668,7 +22711,7 @@ msgstr "Proizvod u Tranzitu" msgid "Goods Transferred" msgstr "Proizvod je Prenesen" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1335 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1348 msgid "Goods are already received against the outward entry {0}" msgstr "Proizvod je već primljen naspram unosa izlaza {0}" @@ -23300,7 +23343,7 @@ msgstr "Pomaže vam da raspodijelite Proračun/Cilj po mjesecima ako imate sezon msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "Ovdje su zapisi grešaka za gore navedene neuspjele unose amortizacije: {0}" -#: erpnext/stock/stock_ledger.py:2142 +#: erpnext/stock/stock_ledger.py:2190 msgid "Here are the options to proceed:" msgstr "Ovdje su opcije za nastavak:" @@ -23328,7 +23371,7 @@ msgstr "Ovdje su vaši sedmični neradni dani unaprijed popunjeni na osnovu pret msgid "Hertz" msgstr "Hertz" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:615 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:764 msgid "Hi," msgstr "Zdravo," @@ -23343,8 +23386,7 @@ msgstr "Skriven Red (samo za internu upotrebu)" msgid "Hidden list maintaining the list of contacts linked to Shareholder" msgstr "Skrivena lista koja održava listu kontakata povezanih sa Dioničarem" -#. Label of the hide_currency_symbol (Select) field in DocType 'Global -#. Defaults' +#. Label of the hide_currency_symbol (Check) field in DocType 'Global Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Hide Currency Symbol" msgstr "Sakrij Simbol Valute" @@ -23532,7 +23574,7 @@ msgstr "Kako formatirati i prikazati vrijednosti u finansijskom izvještaju (sam msgid "Hrs" msgstr "Sati" -#: erpnext/setup/doctype/company/company.py:561 +#: erpnext/setup/doctype/company/company.py:563 msgid "Human Resources" msgstr "Ljudski Resursi" @@ -23707,6 +23749,23 @@ msgstr "Ako je odabrano, iznos PDV-a će se smatrati već uključenim u Uplaćen msgid "If checked, the tax amount will be considered as already included in the Print Rate / Print Amount" msgstr "Ako je odabrano, iznos PDV-a će se smatrati već uključenim u Ispisanu Cjenu / Ispisani Iznos" +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Customer' +#: erpnext/selling/doctype/customer/customer.json +msgid "If checked, this Customer is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "If checked, this Item is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Supplier' +#: erpnext/buying/doctype/supplier/supplier.json +msgid "If checked, this Supplier is only available for transactions in the companies listed below." +msgstr "" + #. Description of the 'Delivered by Supplier (Drop Ship)' (Check) field in #. DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -23968,7 +24027,7 @@ msgstr "Ako se za artikl u cjenovniku postavljenom u transakciji ne pronađe cje 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 "Ako Pdv nije postavljen i Predložak Pdv i Naknada je odabran, sistem će automatski primijeniti Pdv iz odabranog predloška." -#: erpnext/stock/stock_ledger.py:2152 +#: erpnext/stock/stock_ledger.py:2200 msgid "If not, you can Cancel / Submit this entry" msgstr "Ako ne, možete Otkazati / Podnijeti ovaj unos" @@ -24014,7 +24073,7 @@ msgstr "Ako Sastavnica rezultira otpadnim materijalom, potrebno je odabrati Skla msgid "If the account is frozen, entries are allowed to restricted users." msgstr "Ako je račun zatvoren, unosi su dozvoljeni ograničenim korisnicima." -#: erpnext/stock/stock_ledger.py:2145 +#: erpnext/stock/stock_ledger.py:2193 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 "Ako se transakcije artikla vrši kao artikal nulte stope vrijednosti u ovom unosu, omogući 'Dozvoli Nultu Stopu Vrednovanja' u {0} Postavkama Artikla." @@ -24101,7 +24160,7 @@ msgstr "Ako je neograničen rok trajanja za bodove lojalnosti, ostavite trajanje msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "Ako da, onda će se ovo skladište koristiti za skladištenje odbijenog materijala" -#: erpnext/stock/doctype/item/item.js:1572 +#: erpnext/stock/doctype/item/item.js:1589 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 "Ako održavate zalihe ovog artikla u svojim zalihama, Sistem će napraviti unos u registar zaliha za svaku transakciju ovog artikla." @@ -24115,7 +24174,7 @@ msgstr "Ako trebate usaglasiti određene transakcije jedne s drugima, odaberi u msgid "If you still want to proceed, please disable {0} checkbox." msgstr "Ako i dalje želite nastaviti, molimo onemogućite \" {0}\"." -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:469 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:475 msgid "If you still want to proceed, please enable {0}." msgstr "Ako i dalje želite da nastavite, omogući {0}." @@ -24282,7 +24341,7 @@ msgstr "Zanemari preklapanje vremena Radne Stanice" msgid "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports" msgstr "Zanemaruje naslijeđe polje 'Početno' u unosu Knjigovodstva koje omogućava dodavanje početnog stanja nakon što je sistem u upotrebi prilikom izrade izvještaja" -#: erpnext/stock/doctype/item/item.py:269 +#: erpnext/stock/doctype/item/item.py:274 msgid "Image in the description has been removed. To disable this behavior, uncheck \"{0}\" in {1}." msgstr "Slika u opisu je uklonjena. Da biste onemogućili ovo ponašanje, poništite oznaku \"{0}\" u {1}." @@ -24447,7 +24506,7 @@ msgid "In Production" msgstr "U Proizvodnji" #: 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/batch_wise_balance_history/batch_wise_balance_history.py:87 #: erpnext/stock/report/stock_balance/stock_balance.py:547 #: erpnext/stock/report/stock_ledger/stock_ledger.py:317 msgid "In Qty" @@ -24471,11 +24530,11 @@ msgstr "Na Skladištu" msgid "In Transit" msgstr "U Tranzitu" -#: erpnext/stock/doctype/material_request/material_request.js:477 +#: erpnext/stock/doctype/material_request/material_request.js:478 msgid "In Transit Transfer" msgstr "U Tranzitnom Prenosu" -#: erpnext/stock/doctype/material_request/material_request.js:446 +#: erpnext/stock/doctype/material_request/material_request.js:447 msgid "In Transit Warehouse" msgstr "U Tranzitnom Skladištu" @@ -24582,7 +24641,7 @@ msgstr "U slučaju višeslojnog programa, klijenti će biti automatski raspoređ msgid "In this case, the amount will be calculated as 25% of the transaction amount. If the transaction amount is 200, then this will be calculated as 200 * 0.25 = 50." msgstr "U ovom slučaju, iznos će biti izračunat kao 25% iznosa transakcije. Ako je iznos transakcije 200, onda će se to izračunati kao 200 * 0,25 = 50." -#: erpnext/stock/doctype/item/item.js:1605 +#: erpnext/stock/doctype/item/item.js:1622 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "U ovoj sekciji možete definirati standard postavke transakcije koje se odnose na cijelo poduzeće za ovaj artikal. Npr. Standard Skladište, Standard Cjenovnik, Dobavljač itd." @@ -24851,6 +24910,10 @@ msgstr "Prihod" msgid "Income Account" msgstr "Račun Prihoda" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:86 +msgid "Income Account Validation Error" +msgstr "" + #. Label of the income_and_expense_account (Section Break) field in DocType #. 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -24862,7 +24925,9 @@ msgstr "Prihodi & Rashodi" msgid "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront." msgstr "Prihod od ovog artikla bit će priznat tokom nekoliko mjeseci umjesto odjednom. Na primjer: godišnja pretplata plaćena unaprijed." +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Bills" msgstr "Dolazne Fakture" @@ -24877,7 +24942,9 @@ msgstr "Raspored Obrade Dolaznih Poziva" msgid "Incoming Call Settings" msgstr "Postavke Dolaznog Poziva" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Payment" msgstr "Dolazna Plaćanja" @@ -24924,7 +24991,7 @@ msgstr "Netačna količina stanja nakon transakcije" msgid "Incorrect Batch Consumed" msgstr "Potrošena Pogrešna Šarža" -#: erpnext/stock/doctype/item/item.py:604 +#: erpnext/stock/doctype/item/item.py:609 msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "Netačno prijavljivanje (grupno) skladište za ponovnu narudžbu" @@ -25212,7 +25279,7 @@ msgstr "Napomena Instalacije" msgid "Installation Note Item" msgstr "Stavka Napomene Instalacije " -#: erpnext/stock/doctype/delivery_note/delivery_note.py:635 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:640 msgid "Installation Note {0} has already been submitted" msgstr "Napomena Instalacije {0} je već poslana" @@ -25262,13 +25329,13 @@ msgstr "Nedovoljne Dozvole" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:466 #: erpnext/stock/doctype/pick_list/pick_list.py:148 #: erpnext/stock/doctype/pick_list/pick_list.py:166 -#: erpnext/stock/doctype/pick_list/pick_list.py:1130 -#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1827 -#: erpnext/stock/stock_ledger.py:2334 +#: erpnext/stock/doctype/pick_list/pick_list.py:1139 +#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1875 +#: erpnext/stock/stock_ledger.py:2382 msgid "Insufficient Stock" msgstr "Nedovoljne Zalihe" -#: erpnext/stock/stock_ledger.py:2349 +#: erpnext/stock/stock_ledger.py:2397 msgid "Insufficient Stock for Batch" msgstr "Nedovoljne Zalihe za Šaržu" @@ -25398,7 +25465,7 @@ msgstr "Troškovi Kamata" msgid "Interest Income" msgstr "Prihod od Kamata" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2729 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2727 msgid "Interest and/or dunning fee" msgstr "Kamata i/ili Naknada Opomene" @@ -25423,7 +25490,7 @@ msgstr "Interni" msgid "Internal Customer Accounting" msgstr "Knjigovodstvo Internog Klijenta" -#: erpnext/selling/doctype/customer/customer.py:259 +#: erpnext/selling/doctype/customer/customer.py:271 msgid "Internal Customer for company {0} already exists" msgstr "Interni Klijent za {0} već postoji" @@ -25449,7 +25516,7 @@ msgstr "Nedostaje Interna Prodajna Referenca" msgid "Internal Supplier Details" msgstr "Detalji Internog Dobavljača" -#: erpnext/buying/doctype/supplier/supplier.py:181 +#: erpnext/buying/doctype/supplier/supplier.py:190 msgid "Internal Supplier for company {0} already exists" msgstr "Interni Dobavljač za {0} već postoji" @@ -25510,8 +25577,8 @@ msgstr "Interval bi trebao biti između 1 i 59 minuta" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:381 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:770 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:780 #: erpnext/accounts/services/taxes.py:271 #: erpnext/accounts/services/taxes.py:279 #: erpnext/assets/doctype/asset_category/asset_category.py:69 @@ -25536,7 +25603,7 @@ msgstr "Nevažeći Iznos" msgid "Invalid Attribute" msgstr "Nevažeći Atribut" -#: erpnext/stock/doctype/item/item.js:1199 +#: erpnext/stock/doctype/item/item.js:1216 msgid "Invalid Attribute Values" msgstr "Nevažeće Vrijednosti Atributa" @@ -25573,7 +25640,7 @@ msgstr "Nevažeće polje poduzeća" msgid "Invalid Company for Inter Company Transaction." msgstr "Nevažeće poduzeće za transakcije među poduzećima." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:972 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:978 msgid "Invalid Configuration" msgstr "Nevažeća Konfiguracija" @@ -25583,7 +25650,7 @@ msgstr "Nevažeća Konfiguracija" msgid "Invalid Cost Center" msgstr "Nevažeći Centar Troškova" -#: erpnext/selling/doctype/customer/customer.py:372 +#: erpnext/selling/doctype/customer/customer.py:386 msgid "Invalid Customer Group" msgstr "Nevažeća Klijent Grupa" @@ -25638,7 +25705,7 @@ msgstr "Nevažeća Grupa po" msgid "Invalid Item" msgstr "Nevažeći Artikal" -#: erpnext/stock/doctype/item/item.py:1566 +#: erpnext/stock/doctype/item/item.py:1571 msgid "Invalid Item Defaults" msgstr "Nevažeće Standard Postavke Artikla" @@ -25724,7 +25791,7 @@ msgstr "Nevažeći Raspored" msgid "Invalid Selling Price" msgstr "Nevažeća Prodajna Cjena" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:975 msgid "Invalid Serial and Batch Bundle" msgstr "Nevažeći Serijski i Šaržni Paket" @@ -25777,7 +25844,7 @@ msgstr "Nevažeća formula filtera. Provjeri sintaksu." msgid "Invalid lost reason {0}, please create a new lost reason" msgstr "Nevažeći izgubljeni razlog {0}, izradi novi izgubljeni razlog" -#: erpnext/stock/doctype/item/item.py:478 +#: erpnext/stock/doctype/item/item.py:483 msgid "Invalid naming series (. missing) for {0}" msgstr "Nevažeća serija imenovanja (. nedostaje) za {0}" @@ -25805,7 +25872,7 @@ msgstr "Nevažeći upit pretrage" msgid "Invalid status group: {0}" msgstr "Nevažeća grupa statusa: {0}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 msgid "Invalid subcontract order field: {0}" msgstr "Nevažeći nalog podizvođača: {0}" @@ -26072,7 +26139,7 @@ msgstr "Fakturisana Količina" #: 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:1198 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 #: erpnext/accounts/report/accounts_payable/accounts_payable.js:270 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:64 @@ -26111,11 +26178,6 @@ msgstr "Funkcije Fakturisanja" msgid "Inward" msgstr "Unutra" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Inward Order" -msgstr "Interni Nalog" - #. Label of the is_account_payable (Check) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json @@ -26688,7 +26750,7 @@ msgstr "Izdaj Kreditnu Fakturu" msgid "Issue Date" msgstr "Datum Izdavanja" -#: erpnext/stock/doctype/material_request/material_request.js:180 +#: erpnext/stock/doctype/material_request/material_request.js:183 msgid "Issue Material" msgstr "Izdaj Materijala" @@ -26762,7 +26824,7 @@ msgstr "Zahtjevi" msgid "Issuing Date" msgstr "Datum Izdavanja" -#: erpnext/stock/doctype/item/item.py:649 +#: erpnext/stock/doctype/item/item.py:654 msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "Može potrajati i do nekoliko sati da tačne vrijednosti zaliha budu vidljive nakon spajanja artikala." @@ -26874,7 +26936,7 @@ msgstr "Kurzivni tekst za međuzbirove ili napomene" #: erpnext/stock/report/available_serial_no/available_serial_no.py:93 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.js:24 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:32 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:76 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 #: erpnext/stock/report/item_price_stock/item_price_stock.js:8 #: erpnext/stock/report/item_prices/item_prices.py:50 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:88 @@ -26909,8 +26971,6 @@ msgstr "Kurzivni tekst za međuzbirove ili napomene" #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Item" msgstr "Artikal" @@ -27140,7 +27200,7 @@ msgstr "Artikal Korpe" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.js:27 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:128 -#: erpnext/projects/doctype/timesheet/timesheet.js:214 +#: erpnext/projects/doctype/timesheet/timesheet.js:216 #: erpnext/public/js/controllers/transaction.js:2951 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:608 @@ -27395,7 +27455,7 @@ msgstr "Detalji Artikla" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/page/stock_balance/stock_balance.js:35 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:43 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:54 #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:48 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:48 #: erpnext/stock/report/item_prices/item_prices.py:52 @@ -27429,11 +27489,11 @@ msgstr "Standard Postavke Grupe Artikla" msgid "Item Group Name" msgstr "Naziv Grupe Artikla" -#: erpnext/setup/doctype/item_group/item_group.js:119 +#: erpnext/setup/doctype/item_group/item_group.js:136 msgid "Item Group Override" msgstr "Nadjačavanje Grupe Artikla" -#: erpnext/setup/doctype/item_group/item_group.js:82 +#: erpnext/setup/doctype/item_group/item_group.js:99 msgid "Item Group Tree" msgstr "Stablo Grupe Artikla" @@ -27662,7 +27722,7 @@ msgstr "Proizvođač Artikla" #: erpnext/stock/report/available_batch_report/available_batch_report.py:32 #: erpnext/stock/report/available_serial_no/available_serial_no.py:99 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:33 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:77 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:153 #: erpnext/stock/report/item_price_stock/item_price_stock.py:24 #: erpnext/stock/report/item_prices/item_prices.py:51 @@ -27736,8 +27796,8 @@ msgstr "Postavke Cjene Artikla" msgid "Item Price Stock" msgstr "Cjena Artikla na Zalihama" -#: erpnext/stock/get_item_details.py:1182 -#: erpnext/stock/get_item_details.py:1206 +#: erpnext/stock/get_item_details.py:1181 +#: erpnext/stock/get_item_details.py:1205 msgid "Item Price added for {0} in Price List - {1}" msgstr "Cjena artikla dodana za {0} u Cjenovniku - {1}" @@ -27745,11 +27805,11 @@ msgstr "Cjena artikla dodana za {0} u Cjenovniku - {1}" msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "Cjena Artikla se pojavljuje više puta na osnovu Cjenovnika, Dobavljača/Klijenta, Valute, Artikla, Šarže, Jedinice, Količine i Datuma." -#: erpnext/stock/doctype/item/item.py:183 +#: erpnext/stock/doctype/item/item.py:187 msgid "Item Price created at rate {0}" msgstr "Cjena Artikla stvorena po stopi {0}" -#: erpnext/stock/get_item_details.py:1165 +#: erpnext/stock/get_item_details.py:1164 msgid "Item Price updated for {0} in Price List {1}" msgstr "Cjena Artikla je ažurirana za {0} u Cjenovniku {1}" @@ -27892,7 +27952,6 @@ msgstr "Artikal Pdv Red {0}: Račun mora pripadati - {1}" #. Label of the item_tax_template (Link) field in DocType 'Item Tax' #. Label of the item_tax_template (Link) field in DocType 'Purchase Receipt #. Item' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/item_tax_template/item_tax_template.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -27905,7 +27964,6 @@ msgstr "Artikal Pdv Red {0}: Račun mora pripadati - {1}" #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/workspace_sidebar/taxes.json msgid "Item Tax Template" msgstr "Predložak PDV-a za Artikal" @@ -27942,7 +28000,7 @@ msgstr "Detalji Varijante Artikla" #. Name of a DocType #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:239 +#: erpnext/stock/doctype/item/item.js:250 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -27950,11 +28008,11 @@ msgstr "Detalji Varijante Artikla" msgid "Item Variant Settings" msgstr "Postavke Varijante Artikla" -#: erpnext/stock/doctype/item/item.js:1421 +#: erpnext/stock/doctype/item/item.js:1438 msgid "Item Variant {0} already exists with same attributes" msgstr "Varijanta Artikla {0} već postoji sa istim atributima" -#: erpnext/stock/doctype/item/item.py:840 +#: erpnext/stock/doctype/item/item.py:845 msgid "Item Variants updated" msgstr "Varijante Artikla Ažurirane" @@ -28062,7 +28120,7 @@ msgstr "Detalji Artikla i Garancija" msgid "Item for row {0} does not match Material Request" msgstr "Artikal za red {0} ne odgovara Materijalnom Nalogu" -#: erpnext/stock/doctype/item/item.py:899 +#: erpnext/stock/doctype/item/item.py:904 msgid "Item has variants." msgstr "Artikal ima Varijante." @@ -28088,10 +28146,14 @@ msgstr "Naziv Artikla" msgid "Item operation" msgstr "Artikal Radnji" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:622 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:635 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "Cjena Artikla je ažurirana na nulu jer je Dozvoli Nultu Stopu Vrednovanja označena za artikal {0}" +#: erpnext/stock/doctype/material_request/material_request.py:231 +msgid "Item rates have been updated based on the selected Buying Price List {0}" +msgstr "" + #. Label of the item (Link) field in DocType 'BOM' #. Label of the finished_good (Link) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/bom/bom.json @@ -28107,7 +28169,7 @@ msgstr "Stopa vrednovanja artikla se preračunava s obzirom na iznos verifikata msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "Ponovno knjiženje vrijednosti artikla je u toku. Izvještaj može prikazati netačnu procjenu artikla." -#: erpnext/stock/doctype/item/item.py:1056 +#: erpnext/stock/doctype/item/item.py:1061 msgid "Item variant {0} exists with same attributes" msgstr "Varijanta Artikla {0} postoji sa istim atributima" @@ -28132,7 +28194,7 @@ msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" msgstr "Artikal {0} ne može biti primljen u količini većoj od {1} u odnosu na {2} {3}" #: erpnext/assets/doctype/asset/asset.py:347 -#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:700 msgid "Item {0} does not exist" msgstr "Artikal {0} ne postoji" @@ -28141,7 +28203,7 @@ msgid "Item {0} does not exist in the system or has expired" msgstr "Artikal {0} ne postoji u sistemu ili je istekao" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1489 -#: erpnext/stock/services/serial_batch_bundle_service.py:388 +#: erpnext/stock/services/serial_batch_bundle_service.py:390 msgid "Item {0} does not exist." msgstr "Artikal {0} ne postoji." @@ -28165,15 +28227,15 @@ msgstr "Artikal {0} nema serijski broj. Samo serijski artikli mogu imati dostavu msgid "Item {0} has no changes in delivered quantity. Please unselect the row if you do not wish to update its quantity." msgstr "Artikal {0} nema promjena u isporučenoj količini. Molimo vas da poništite odabir reda ako ne želite ažurirati njegovu količinu." -#: erpnext/stock/doctype/item/item.py:1278 +#: erpnext/stock/doctype/item/item.py:1283 msgid "Item {0} has reached its end of life on {1}" msgstr "Artikal {0} je dosego kraj svog vijeka trajanja {1}" -#: erpnext/stock/stock_ledger.py:164 +#: erpnext/stock/stock_ledger.py:168 msgid "Item {0} ignored since it is not a stock item" msgstr "Artikal {0} zanemaren jer nije artikal na zalihama" -#: erpnext/stock/get_item_details.py:357 +#: erpnext/stock/get_item_details.py:356 msgid "Item {0} is a template, please select one of its variants" msgstr "Artikal {0} je predložak, odaberi jednu od njenih varijanti" @@ -28181,11 +28243,11 @@ msgstr "Artikal {0} je predložak, odaberi jednu od njenih varijanti" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "Artikal {0} je već rezervisan/dostavljen naspram Prodajnog Naloga {1}." -#: erpnext/stock/doctype/item/item.py:1298 +#: erpnext/stock/doctype/item/item.py:1303 msgid "Item {0} is cancelled" msgstr "Artikal {0} je otkazan" -#: erpnext/stock/doctype/item/item.py:1282 +#: erpnext/stock/doctype/item/item.py:1287 msgid "Item {0} is disabled" msgstr "Artikal {0} je onemogućen" @@ -28197,7 +28259,7 @@ msgstr "Artikal {0} nije artikl za direktno slanje. Samo artikli za direktno sla msgid "Item {0} is not a serialized Item" msgstr "Artikal {0} nije serijalizirani Artikal" -#: erpnext/stock/doctype/item/item.py:1290 +#: erpnext/stock/doctype/item/item.py:1295 msgid "Item {0} is not a stock Item" msgstr "Artikal {0} nije artikal na zalihama" @@ -28205,11 +28267,11 @@ msgstr "Artikal {0} nije artikal na zalihama" msgid "Item {0} is not a subcontracted item" msgstr "Artikal {0} nije podizvođački artikal" -#: erpnext/stock/doctype/item/item.py:857 +#: erpnext/stock/doctype/item/item.py:862 msgid "Item {0} is not a template item." msgstr "Artikal {0} nije predložak artikal." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1258 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1271 msgid "Item {0} is not active or end of life has been reached" msgstr "Artikal {0} nije aktivan ili je dostignut kraj životnog vijeka" @@ -28217,7 +28279,7 @@ msgstr "Artikal {0} nije aktivan ili je dostignut kraj životnog vijeka" msgid "Item {0} must be a Fixed Asset Item" msgstr "Artikal {0} mora biti artikal Fiksne Imovine" -#: erpnext/stock/get_item_details.py:363 +#: erpnext/stock/get_item_details.py:362 msgid "Item {0} must be a Non-Stock Item" msgstr "Artikal {0} mora biti artikal koji nije na zalihama" @@ -28233,11 +28295,11 @@ msgstr "Artikal {0} nije pronađen u tabeli 'Dostavljene Sirovine' u {1} {2}" msgid "Item {0} not found." msgstr "Artikal {0} nije pronađen." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:315 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:316 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "Artikal {0}: Količina Naloga {1} ne može biti manja od minimalne količine naloga {2} (definisano u artiklu)." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:602 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:600 msgid "Item {0}: {1} qty produced. " msgstr "Artikal {0}: {1} količina proizvedena. " @@ -28283,7 +28345,7 @@ msgstr "Prodajni Registar po Artiklu" msgid "Item-wise sales Register" msgstr "Registar Prodaje po Artiklima" -#: erpnext/stock/get_item_details.py:767 +#: erpnext/stock/get_item_details.py:766 msgid "Item/Item Code required to get Item Tax Template." msgstr "Artikal/Artikal Šifra je obavezan pri preuzimanju PDV Predloška Artikla." @@ -28316,11 +28378,6 @@ msgstr "Filter Artikala" msgid "Items Required" msgstr "Artikli Obavezni" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Items To Be Received" -msgstr "Artikli koje treba Preuzeti" - #. Label of a Link in the Buying Workspace #. Name of a report #. Label of a Workspace Sidebar Item @@ -28351,7 +28408,7 @@ msgstr "Artikli Materijalnog Naloga Sirovina" msgid "Items not found." msgstr "Artikli nisu pronađeni." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:618 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:631 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "Cjena Artikala je ažurirana na nulu jer je Dozvoli Nultu Stopu Vrednovanja izabrana za sljedeće artikle: {0}" @@ -28652,8 +28709,8 @@ msgstr "Nalozi Knjiženja {0} nisu povezani" #: 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:390 -#: erpnext/assets/doctype/asset/asset.js:399 +#: erpnext/assets/doctype/asset/asset.js:398 +#: erpnext/assets/doctype/asset/asset.js:407 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -28670,10 +28727,8 @@ msgstr "Račun Naloga Knjiženja" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Journal Entry Template" msgstr "Račiuni Predloška Naloga Knjiženja" @@ -28950,7 +29005,7 @@ msgstr "Poslednji Datum Završetka" msgid "Last Fiscal Year" msgstr "Prošla Fiskalna Godina" -#: erpnext/accounts/doctype/account/account.py:673 +#: erpnext/accounts/doctype/account/account.py:680 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." msgstr "Posljednje ažuriranje Knjigovodstvenog Registra je obavljeno {0}. Ova radnja nije dozvoljena dok se sistem aktivno koristi. Pričekaj 5 minuta prije ponovnog pokušaja." @@ -29204,7 +29259,7 @@ msgstr "Saznajte više o
    '{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." @@ -34240,7 +34289,7 @@ msgstr "Početni broj knjiženih amortizacija" msgid "Opening Purchase Invoice(s) have been created." msgstr "Početne Nabavne Fakture su izrađene." -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 #: erpnext/stock/report/stock_balance/stock_balance.py:533 msgid "Opening Qty" msgstr "Početna Količina" @@ -34251,31 +34300,31 @@ msgstr "Početne Prodajne Fakture su izrađene." #. Label of the opening_stock (Float) field in DocType 'Item' #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' -#: erpnext/stock/doctype/item/item.js:969 erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/item/item.py:353 -#: erpnext/stock/doctype/item/item.py:1682 +#: erpnext/stock/doctype/item/item.js:986 erpnext/stock/doctype/item/item.json +#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:1687 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Opening Stock" msgstr "Početna Zaliha" -#: erpnext/stock/doctype/item/item.py:1636 +#: erpnext/stock/doctype/item/item.py:1641 msgid "Opening Stock can only be set for stock items." msgstr "Početne zalihe mogu se postaviti samo za artikle na zalihi." -#: erpnext/stock/doctype/item/item.py:1643 +#: erpnext/stock/doctype/item/item.py:1648 msgid "Opening Stock cannot be created as stock transactions already exist for item {0}." msgstr "Početne zalihe se ne mogu izraditi jer već postoje transakcije zaliha za artikal {0}." -#: erpnext/stock/doctype/item/item.py:1639 +#: erpnext/stock/doctype/item/item.py:1644 msgid "Opening Stock for serialised or batch items must be set via the Stock Reconciliation form." msgstr "Početne zalihe za serijske ili šaržne artikle mora se postaviti putem Usklađivanje Zaliha." -#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:363 msgid "Opening Stock reconciliation created with zero valuation rate: {0}" msgstr "Početno Usklađivanje Zaliha izrađeno sa nultom stopom vrednovanja: {0}" -#: erpnext/stock/doctype/item/item.py:366 -#: erpnext/stock/doctype/item/item.py:1685 +#: erpnext/stock/doctype/item/item.py:371 +#: erpnext/stock/doctype/item/item.py:1690 msgid "Opening Stock reconciliation created: {0}" msgstr "Početno Usklađivanje Zaliha izrađeno: {0}" @@ -34297,7 +34346,7 @@ msgstr "Otvaranje & Zatvaranje" msgid "Opening and Closing balance is not supported for dimension grouped cash flow statement" msgstr "Početno i Završno stanje nisu podržani za izvještaj o novčanom toku grupiran po dimenzijama" -#: erpnext/stock/doctype/item/item.py:199 +#: erpnext/stock/doctype/item/item.py:203 msgid "Opening stock creation has been queued and will be created in the background. Please check the Stock Reconciliation after some time." msgstr "Izrada početnih zaliha je stavljeno u red čekanja i bit će izrađeno u pozadini. Provjeri usklađivanje zaliha nakon nekog vremena." @@ -34451,7 +34500,7 @@ msgstr "Radnji {0} traje duže od bilo kojeg raspoloživog radnog vremena na rad #: erpnext/manufacturing/doctype/work_order/work_order.js:334 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/public/js/shop_floor/shop_floor.js:387 -#: erpnext/setup/doctype/company/company.py:537 +#: erpnext/setup/doctype/company/company.py:539 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -34796,14 +34845,10 @@ msgstr "Nalozi" #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' #. Label of a Desktop Icon -#. Name of a Workspace -#. 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/setup/workspace/organization/organization.json -#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "Poduzeće" @@ -34903,7 +34948,7 @@ msgid "Ounce/Gallon (US)" msgstr "Ounce/Gallon (US)" #: 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/batch_wise_balance_history/batch_wise_balance_history.py:88 #: erpnext/stock/report/stock_balance/stock_balance.py:555 #: erpnext/stock/report/stock_ledger/stock_ledger.py:324 msgid "Out Qty" @@ -34927,7 +34972,7 @@ msgstr "Servisni Ugovor Istekao" msgid "Out of Order" msgstr "Pokvareno" -#: erpnext/stock/doctype/pick_list/pick_list.py:663 +#: erpnext/stock/doctype/pick_list/pick_list.py:672 msgid "Out of Stock" msgstr "Nema u Zalihana" @@ -34948,12 +34993,16 @@ msgstr "Nema u Zalihana" msgid "Outdated POS Opening Entry" msgstr "Zastarjeli Unos Otvaranja Kase" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Bills" msgstr "Odlazne Fakture" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Payment" msgstr "Odlazno Plaćanje" @@ -35043,11 +35092,6 @@ msgstr "Nepodmireno za {0} ne može biti manje od nule ({1})" msgid "Outward" msgstr "Dostava" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Outward Order" -msgstr "Eksterni Nalog" - #. Label of the over_billing_allowance (Currency) field in DocType 'Accounts #. Settings' #. Label of the over_billing_allowance (Float) field in DocType 'Item' @@ -35130,6 +35174,16 @@ msgstr "Prekomjerno Fakturisanje {0} {1} zanemareno za artikal {2} jer imate {3} msgid "Overdue" msgstr "Kasni" +#: erpnext/selling/doctype/customer/customer.py:612 +msgid "Overdue Billing Limit Crossed" +msgstr "" + +#. Label of the overdue_billing_threshold (Currency) field in DocType 'Customer +#. Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "Overdue Billing Threshold" +msgstr "" + #. Label of the overdue_days (Data) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Overdue Days" @@ -35833,7 +35887,7 @@ msgstr "Paket" msgid "Parent Account" msgstr "Nadređeni Račun" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:385 msgid "Parent Account Missing" msgstr "Nedostaje Nadređeni Račun" @@ -35847,7 +35901,7 @@ msgstr "Nadređena Šarža" msgid "Parent Company" msgstr "Matično Poduzeće" -#: erpnext/setup/doctype/company/company.py:672 +#: erpnext/setup/doctype/company/company.py:674 msgid "Parent Company must be a group company" msgstr "Matično Poduzeće mora biti poduzeće grupe" @@ -35978,7 +36032,7 @@ msgstr "Djelomični Prenesen Materijal" msgid "Partial Payment in POS Transactions are not allowed." msgstr "Djelomično plaćanje u Kasa Transakcijama nije dozvoljeno." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1755 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1757 msgid "Partial Stock Reservation" msgstr "Djelomična Rezervacija Zaliha" @@ -36805,7 +36859,7 @@ msgstr "Platni Prolaz" msgid "Payment Gateway Account" msgstr "Račun Platnog Prolaza" -#: erpnext/accounts/utils.py:1528 +#: erpnext/accounts/utils.py:1522 msgid "Payment Gateway Account not created, please create one manually." msgstr "Račun Platnog Prolaza nije izrađen, izradi ga ručno." @@ -37079,7 +37133,6 @@ msgstr "Rasporedi Plaćanja" #. Label of the payment_term (Link) field in DocType 'Payment Terms Template #. Detail' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -37091,7 +37144,6 @@ msgstr "Rasporedi Plaćanja" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/controllers/transaction.js:559 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:32 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" msgstr "Uslovi Plaćanja" @@ -37399,7 +37451,7 @@ msgstr "Radni Nalog na Čekanju" msgid "Pending activities for today" msgstr "Današnje Aktivnosti na Čekanju" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:277 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:285 msgid "Pending processing" msgstr "Obrada na Čekanju" @@ -37545,11 +37597,9 @@ msgstr "Završni Unos Perioda za Tekući Period" #. Balance' #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Period Closing Voucher" msgstr "Verifikat Zatvaranje Perioda" @@ -37771,7 +37821,7 @@ msgstr "Broj Telefona" #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sales_order/sales_order.js:1066 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 -#: erpnext/stock/doctype/material_request/material_request.js:156 +#: erpnext/stock/doctype/material_request/material_request.js:159 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -37950,10 +38000,8 @@ msgstr "Plaid Tajna" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json -#: erpnext/workspace_sidebar/banking.json msgid "Plaid Settings" msgstr "Plaid Postavke" @@ -38108,7 +38156,7 @@ msgstr "Proizvodna Površina" msgid "Plants and Machineries" msgstr "Postrojenja i Mašinerije" -#: erpnext/stock/doctype/pick_list/pick_list.py:660 +#: erpnext/stock/doctype/pick_list/pick_list.py:669 msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List." msgstr "Popuni Zalihe Artikala i ažuriraj Listu Odabira da nastavite. Za prekid, otkaži Listu Odabira." @@ -38134,7 +38182,7 @@ msgstr "Podstavi Grupu Dobavljača u Postavkama Nabave." msgid "Please Specify Account" msgstr "Navedi Račun" -#: erpnext/buying/doctype/supplier/supplier.py:129 +#: erpnext/buying/doctype/supplier/supplier.py:137 msgid "Please add 'Supplier' role to user {0}." msgstr "Dodaj ulogu 'Dobavljač' korisniku {0}." @@ -38150,7 +38198,7 @@ msgstr "Prvo dodaj Radnje." msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "Dodaj Zahtjev za Ponudu na bočnu traku u Postavci Portala." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:421 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:422 msgid "Please add Root Account for - {0}" msgstr "Dodaj Root Račun za - {0}" @@ -38166,7 +38214,7 @@ msgstr "Dodaj račun za pravilo bankovnog unosa." msgid "Please add at least one Serial No / Batch No" msgstr "Dodaj barem jedan Serijski / Šaržni Broj" -#: erpnext/stock/doctype/item/item.js:925 +#: erpnext/stock/doctype/item/item.js:942 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." msgstr "Dodaj barem jedan red u Postavke Artikala sa poduzećem prije postavljanja početnih zaliha." @@ -38183,7 +38231,7 @@ msgstr "Dodaj kolonu Bankovni Račun" msgid "Please add the account to root level Company - {0}" msgstr "Dodaj Račun Matičnom Poduzeću - {0}" -#: erpnext/controllers/website_list_for_contact.py:305 +#: erpnext/controllers/website_list_for_contact.py:307 msgid "Please add {1} role to user {0}." msgstr "Dodaj {1} ulogu korisniku {0}." @@ -38195,7 +38243,7 @@ msgstr "Podesi količinu ili uredi {0} da nastavite." msgid "Please attach CSV file" msgstr "Priložite CSV datoteku" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1257 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1263 msgid "Please cancel and amend the Payment Entry" msgstr "Poništi i Izmijeni Unos Plaćanja" @@ -38229,7 +38277,7 @@ msgstr "Odaberi ili s radnjama ili operativnim troškovima zasnovanim na Gotovom msgid "Please check the 'Activate Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." msgstr "Odaberi 'Omogući Serijski i Šaržni broj za Artikal' u {0} kako biste izradili Paket Serijskih i Šaržnih brojeva za artikal." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:621 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:770 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "Provjeri poruku o grešci i poduzmite potrebne radnje da popravite grešku, a zatim ponovo pokrenite ponovno knjiženje." @@ -38270,11 +38318,11 @@ msgstr "Konfiguriraj račune za pravilo bankovnog unosa." msgid "Please contact any of the following users for this transaction." msgstr "Kontaktiraj bilo kojeg od sljedećih korisnika za ovu transakciju." -#: erpnext/selling/doctype/customer/customer.py:534 +#: erpnext/selling/doctype/customer/customer.py:551 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" msgstr "Kontaktiraj bilo kojeg od sljedećih korisnika da produžite kreditna ograničenja za {0}: {1}" -#: erpnext/selling/doctype/customer/customer.py:527 +#: erpnext/selling/doctype/customer/customer.py:544 msgid "Please contact your administrator to extend the credit limits for {0}." msgstr "Kontaktiraj administratora da produži kreditna ograničenja za {0}." @@ -38302,7 +38350,7 @@ msgstr "Izradi nabavu iz interne prodaje ili samog dokumenta dostave" msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "Izradi Nabavni Račun ili Nabavnu Fakturu za artikal {0}" -#: erpnext/stock/doctype/item/item.py:716 +#: erpnext/stock/doctype/item/item.py:721 msgid "Please delete Product Bundle {0}, before merging {1} into {2}" msgstr "Izbriši Artikal Paket {0}, prije spajanja {1} u {2}" @@ -38350,11 +38398,11 @@ msgstr "Potvrdi da je {0} račun račun Bilansa Stanja. Možete promijeniti nadr msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "Potvrdi da je {0} račun {1} Troškovni račun. Možete promijeniti vrstu računa u Troškovni ili odabrati drugi račun." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 msgid "Please ensure {0} account is a Balance Sheet account." msgstr "Provjeri da li je račun {0} račun Bilansa Stanja." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 msgid "Please ensure {0} account {1} is a Receivable account." msgstr "Provjeri da li je {0} račun {1} račun Potraživanja." @@ -38363,7 +38411,7 @@ msgid "Please enter Difference Account or set default Stock Adjustment msgstr "Unesi Račun Razlike ili postavi standard Račun Usklađvanja Zaliha za {0}" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:559 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:962 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 msgid "Please enter Account for Change Amount" msgstr "Unesi Račun za Kusur" @@ -38375,7 +38423,7 @@ msgstr "Unesi Odobravajuća Uloga ili Odobravajućeg Korisnika" msgid "Please enter Batch No" msgstr "Unesi broj Šarže" -#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:19 +#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:26 msgid "Please enter Cost Center" msgstr "Unesi Centar Troškova" @@ -38392,7 +38440,7 @@ msgid "Please enter Expense Account" msgstr "Unesi Račun Troškova" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:99 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:98 msgid "Please enter Item Code to get Batch Number" msgstr "Unesi Kod Artikla da preuzmete Broj Šarže" @@ -38428,7 +38476,7 @@ msgstr "Unesi Nabavni Račun" msgid "Please enter Reference date" msgstr "Unesi Referentni Datum" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:400 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:401 msgid "Please enter Root Type for account- {0}" msgstr "Unesi Kontnu Klasu za račun- {0}" @@ -38449,7 +38497,7 @@ msgid "Please enter Warehouse and Date" msgstr "Unesi Skladište i Datum" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:501 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:958 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:964 msgid "Please enter Write Off Account" msgstr "Unesi Otpisni Račun" @@ -38493,7 +38541,7 @@ msgstr "Unesi broj mobilnog telefona." msgid "Please enter parent cost center" msgstr "Unesi Nadređeni Centar Troškova" -#: erpnext/public/js/utils/barcode_scanner.js:186 +#: erpnext/public/js/utils/barcode_scanner.js:191 msgid "Please enter quantity for item {0}" msgstr "Unesi količinu za artikal {0}" @@ -38517,7 +38565,7 @@ msgstr "Unesi prvi datum dostave" msgid "Please enter the phone number first" msgstr "Unesi broj telefona" -#: erpnext/controllers/buying_controller.py:1193 +#: erpnext/controllers/buying_controller.py:1201 msgid "Please enter the {schedule_date}." msgstr "Unesi {schedule_date}." @@ -38569,7 +38617,7 @@ msgstr "Uvezi račune naspram matičnog poduzeća ili omogući {0} u Postavkama msgid "Please make sure the employees above report to another Active employee." msgstr "Provjeri da gore navedeni personal podneseni izvještaju drugom aktivnom personalu." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:379 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:380 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "Potvrdi da datoteka koju koristite ima kolonu 'Nadređeni Račun' u zaglavlju." @@ -38577,7 +38625,7 @@ msgstr "Potvrdi da datoteka koju koristite ima kolonu 'Nadređeni Račun' u zagl msgid "Please make sure you really want to delete all the transactions for {0}. Your master data will remain as it is. This action cannot be undone." msgstr "Da li zaista želiš izbrisati sve transakcije za {0}. Vaši glavni podaci će ostati onakvi kakvi jesu. Ova radnja se ne može poništiti." -#: erpnext/stock/doctype/item/item.js:1036 +#: erpnext/stock/doctype/item/item.js:1053 msgid "Please mention 'Weight UOM' along with Weight." msgstr "Navedi 'Jedinicu Težine' zajedno s Težinom." @@ -38590,7 +38638,7 @@ msgstr "Navedi '{0}' u: {1}" msgid "Please mention no of visits required" msgstr "Navedi broj obaveznih posjeta" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:73 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:74 msgid "Please mention the Current and New BOM for replacement." msgstr "Navedi Trenutnu i Novu Sastavnicu za zamjenu." @@ -38678,7 +38726,7 @@ msgstr "Odaberi Datum Završetka za Zapise Završenog Održavanja Imovine" msgid "Please select Customer first" msgstr "Prvo odaberi Klijenta" -#: erpnext/setup/doctype/company/company.py:603 +#: erpnext/setup/doctype/company/company.py:605 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "Odaberi Postojeće Poduzeće za izradu Kontnog Plana" @@ -38687,8 +38735,8 @@ msgstr "Odaberi Postojeće Poduzeće za izradu Kontnog Plana" msgid "Please select Finished Good Item for Service Item {0}" msgstr "Molimo odaberi Artikal Gotovog Proizvoda za servisni artikal {0}" -#: erpnext/assets/doctype/asset/asset.js:763 -#: erpnext/assets/doctype/asset/asset.js:778 +#: erpnext/assets/doctype/asset/asset.js:771 +#: erpnext/assets/doctype/asset/asset.js:786 msgid "Please select Item Code first" msgstr "Odaberi Kod Artikla" @@ -38728,7 +38776,7 @@ msgstr "Odaberi Cjenovnik" msgid "Please select Qty against item {0}" msgstr "Odaberi Količina naspram Artikla {0}" -#: erpnext/stock/doctype/item/item.py:390 +#: erpnext/stock/doctype/item/item.py:395 msgid "Please select Sample Retention Warehouse in Stock Settings first" msgstr "Odaberi Skladište za Zadržavanje Uzoraka u Postavkama Zaliha" @@ -38744,7 +38792,7 @@ msgstr "Odaberi Datum Početka i Datum Završetka za Artikal {0}" msgid "Please select Stock Asset Account" msgstr "Odaberi Račun Imovine Zaliha" -#: erpnext/setup/doctype/company/company.py:230 +#: erpnext/setup/doctype/company/company.py:232 msgid "Please select Stock Delivered But Not Billed Account" msgstr "Odaberi Zalihe Dostavljene ali ne i Fakturisane Račun" @@ -38758,7 +38806,7 @@ msgstr "Odaberi Sastavnicu" #: erpnext/accounts/party.py:447 #: erpnext/selling/page/sales_funnel/sales_funnel.py:19 -#: erpnext/stock/doctype/pick_list/pick_list.py:1400 +#: erpnext/stock/doctype/pick_list/pick_list.py:1409 msgid "Please select a Company" msgstr "Odaberi Poduzeće" @@ -38865,7 +38913,7 @@ msgstr "Odaberi važeći tip dokumenta." msgid "Please select a value for {0} quotation_to {1}" msgstr "Odaberi Vrijednost za {0} Ponuda za {1}" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:194 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:203 msgid "Please select an item code before setting the warehouse." msgstr "Odaberi kod artikla prije postavljanja skladišta." @@ -38955,7 +39003,7 @@ msgstr "Odaberi Poduzeće" msgid "Please select the Multiple Tier Program type for more than one collection rule." msgstr "Odaberi Tip Višeslojnog Programa za više od jednog pravila prikupljanja." -#: erpnext/stock/doctype/item/item.js:437 +#: erpnext/stock/doctype/item/item.js:448 msgid "Please select the Warehouse first" msgstr "Prvo odaberi skladište" @@ -39063,10 +39111,6 @@ msgstr "Postavi Račun Osnovnih Sredstava u {0} na {1}." msgid "Please set Parent Row No for item {0}" msgstr "Postavi Broj Nadređenog reda za artikal {0}" -#: erpnext/controllers/buying_controller.py:355 -msgid "Please set Purchase Expense Contra Account in Company {0}" -msgstr "Postavi Kontra Račun Ttroškova Nabave u {0}" - #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:24 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:35 msgid "Please set Root Type" @@ -39104,12 +39148,12 @@ msgstr "Postavi Račun Odstupanja Proizvodnje za artikal {0} ili Standard Račun msgid "Please set a Purchase Price Variance Account for Item {0} or a Default Purchase Price Variance Account in Company {1}." msgstr "Postavi Račun Odstupanja Nabavne Cjene za artikal {0} ili Standard Račun Odstupanja Nabavne Cjene za {1}." -#: erpnext/stock/doctype/item/item.py:341 -#: erpnext/stock/doctype/item/item.py:1669 +#: erpnext/stock/doctype/item/item.py:346 +#: erpnext/stock/doctype/item/item.py:1674 msgid "Please set a Temporary Opening account for company {0} to create an Opening Stock reconciliation." msgstr "Postavi Privremeni Početni Račun za {0} kako biste izradili početno usklađivanje zaliha." -#: erpnext/projects/doctype/project/project.py:807 +#: erpnext/projects/doctype/project/project.py:837 msgid "Please set a default Holiday List for Company {0}" msgstr "Postavi standard Listu Praznika za {0}" @@ -39129,7 +39173,7 @@ msgstr "Postavi stvarnu potražnju ili prognozu prodaje kako biste izradili Izvj msgid "Please set an Address on the Company '{0}'" msgstr "Postavi Adresu Poduzeća '{0}'" -#: erpnext/stock/services/base_stock_gl_composer.py:194 +#: erpnext/stock/services/base_stock_gl_composer.py:261 msgid "Please set an Expense Account in the Items table" msgstr "Postavi Račun Troškova u tabeli Artikala" @@ -39158,7 +39202,7 @@ msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Način Plaćanja {0}" msgid "Please set default Cash or Bank account in Mode of Payments {0}" msgstr "Postavi Standard Gotovinski ili Bankovni Račun za Načine Plaćanja {0}" -#: erpnext/accounts/utils.py:2570 +#: erpnext/accounts/utils.py:2564 msgid "Please set default Exchange Gain/Loss Account in Company {0}" msgstr "Postavi Standard Račun Rezultata od Kursnih Razlika u {0}" @@ -39170,7 +39214,7 @@ msgstr "Postavi Standard Račun Troškova u {0}" msgid "Please set default UOM in Stock Settings" msgstr "Postavi Standard Jedinicu u Postavkama Zaliha" -#: erpnext/stock/services/base_stock_gl_composer.py:107 +#: erpnext/stock/services/base_stock_gl_composer.py:114 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "Postavi standardni račun troška prodanog proizvoda u {0} za zaokruživanje knjiženja rezultata tokom prijenosa zaliha" @@ -39250,6 +39294,11 @@ msgstr "Postavi {0} za adresu {1}" msgid "Please set {0} in BOM Creator {1}" msgstr "Postavi {0} u Konstruktoru Sastavnice {1}" +#: erpnext/controllers/buying_controller.py:347 +#: erpnext/stock/services/base_stock_gl_composer.py:209 +msgid "Please set {0} in Company {1} or in the Item Defaults of Item {2}" +msgstr "" + #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1147 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "Postavi {0} u {1} kako biste knjižili Rezultat Deviznog Kursa" @@ -39266,7 +39315,7 @@ msgstr "Podesi i omogući grupni račun sa Kontnom Klasom - {0} za {1}" msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "Podijeli ovu e-poštu sa svojim timom za podršku kako bi mogli pronaći i riješiti problem." -#: erpnext/stock/get_item_details.py:349 +#: erpnext/stock/get_item_details.py:348 msgid "Please specify Company" msgstr "Navedi Poduzeće" @@ -39305,7 +39354,7 @@ msgstr "Navedi {0}. Potrebno je za preuzimanje Detalja Artikla." msgid "Please submit Purchase Order {0} before proceeding." msgstr "Podnesite Nalog Nabave {0} prije nego što nastavite." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:284 msgid "Please try again in an hour." msgstr "Pokušaj ponovo za sat vremena." @@ -39313,7 +39362,7 @@ msgstr "Pokušaj ponovo za sat vremena." msgid "Please uncheck 'Show in Bucket View' to create Orders" msgstr "Poništi odabir opcije \"Prikaži u Prikazu Spremnika\" kako biste izradili Naloge" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:237 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:240 msgid "Please update Repair Status." msgstr "Ažuriraj Status Popravke." @@ -39616,7 +39665,7 @@ msgstr "Vrijeme Knjiženja" msgid "Posting date does not match the selected transaction" msgstr "Datum knjiženja ne odgovara odabranoj transakciji" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:101 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:109 msgid "Posting date is required" msgstr "Datum registracije je obavezan" @@ -39691,15 +39740,15 @@ msgstr "Pokreće {0}" msgid "Pre Sales" msgstr "Pretprodaja" -#: erpnext/accounts/utils.py:2808 +#: erpnext/accounts/utils.py:2802 msgid "Pre-Submit Warning" msgstr "Upozorenje prije podnošenja" -#: erpnext/accounts/utils.py:2857 +#: erpnext/accounts/utils.py:2851 msgid "Pre-Submit Warning: Credit Limit" msgstr "Upozorenje prije podnošenja: Kreditno Ograničenje" -#: erpnext/accounts/utils.py:2869 +#: erpnext/accounts/utils.py:2863 msgid "Pre-Submit Warning: Packed Qty" msgstr "Upozorenje prije podnošenja: Pakirana Količina" @@ -39976,7 +40025,7 @@ msgstr "Cjenovnik Zemlje" msgid "Price List Currency" msgstr "Valuta Cjenovnika" -#: erpnext/stock/get_item_details.py:1384 +#: erpnext/stock/get_item_details.py:1383 msgid "Price List Currency not selected" msgstr "Valuta Cjenovnika nije odabrana" @@ -40547,7 +40596,6 @@ msgstr "Puno ime Odgovornog Obrade" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Process Payment Reconciliation" @@ -40806,7 +40854,7 @@ msgstr "ID Cjene Proizvoda" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:543 +#: erpnext/setup/doctype/company/company.py:545 msgid "Production" msgstr "Proizvodnja" @@ -40960,11 +41008,13 @@ msgstr "Rezultat ove Godine" #. Option for the 'Report Type' (Select) field in DocType 'Account' #. Option for the 'Report Type' (Select) field in DocType 'Process Period #. Closing Voucher Detail' +#. Label of a chart in the Accounting Workspace #. Label of a chart in the Financial Reports Workspace #. Label of a chart in the Invoicing Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/financial_statements.js:368 @@ -41024,7 +41074,7 @@ msgstr "% napretka za zadatak ne može biti veći od 100." msgid "Progress (%)" msgstr "Napredak (%)" -#: erpnext/projects/doctype/project/project.py:432 +#: erpnext/projects/doctype/project/project.py:434 msgid "Project Collaboration Invitation" msgstr "Poziv na Projektnu Saradnju" @@ -41072,7 +41122,7 @@ msgstr "Status Projekta" msgid "Project Summary" msgstr "Sažetak Projekta" -#: erpnext/projects/doctype/project/project.py:745 +#: erpnext/projects/doctype/project/project.py:775 msgid "Project Summary for {0}" msgstr "Sažetak Projekta za {0}" @@ -41203,7 +41253,7 @@ msgstr "Predviđena Količina" #. Label of a Card Break in the Projects Workspace #. Title of a Workspace Sidebar #: erpnext/config/projects.py:7 erpnext/desktop_icon/projects.json -#: erpnext/projects/doctype/project/project.py:512 +#: erpnext/projects/doctype/project/project.py:542 #: erpnext/projects/workspace/projects/projects.json #: erpnext/selling/doctype/customer/customer_dashboard.py:26 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:28 @@ -41364,7 +41414,7 @@ msgstr "Navedi Adresu E-pošte registrovanu u Poduzeću" msgid "Providing" msgstr "Odredbe" -#: erpnext/setup/doctype/company/company.py:642 +#: erpnext/setup/doctype/company/company.py:644 msgid "Provisional Account" msgstr "Privremeni Račun" @@ -41444,7 +41494,7 @@ msgstr "Izdavaštvo" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:531 erpnext/setup/install.py:413 +#: erpnext/setup/doctype/company/company.py:533 erpnext/setup/install.py:413 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item/item_list.js:30 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -41519,8 +41569,8 @@ msgstr "Račun Troškova Nabave" msgid "Purchase Expense Contra Account" msgstr "Kontraračun Troškova Nabave" -#: erpnext/controllers/buying_controller.py:365 -#: erpnext/controllers/buying_controller.py:379 +#: erpnext/controllers/buying_controller.py:373 +#: erpnext/controllers/buying_controller.py:387 msgid "Purchase Expense for Item {0}" msgstr "Trošak Nabave Artikla {0}" @@ -41567,7 +41617,7 @@ msgstr "Trošak Nabave Artikla {0}" #: 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:446 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:445 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -41639,7 +41689,6 @@ msgstr "Nabavne Fakture" #. Label of the purchase_order (Link) field in DocType 'Stock Entry' #. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt #. Item' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:61 #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -41658,7 +41707,7 @@ msgstr "Nabavne Fakture" #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js:48 #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:205 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/buying_controller.py:929 +#: erpnext/controllers/buying_controller.py:937 #: erpnext/crm/doctype/contract/contract.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:54 #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -41667,14 +41716,12 @@ msgstr "Nabavne Fakture" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:196 +#: erpnext/stock/doctype/material_request/material_request.js:199 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:217 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/buying.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Purchase Order" msgstr "Nabavni Nalog" @@ -41775,7 +41822,7 @@ msgstr "Nabavni Nalog {0} je izrađen" msgid "Purchase Order {0} is not submitted" msgstr "Nabavni Nalog {0} nije podnešen" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:582 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:583 msgid "Purchase Orders" msgstr "Nabavni Nalozi" @@ -41790,7 +41837,7 @@ msgstr "Broj Nabavnih Naloga" msgid "Purchase Orders Items Overdue" msgstr "Nabavni Nalozi Kasne" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:277 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:278 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "Nabavni Nalozi nisu dozvoljeni za {0} zbog bodovne tablice {1}." @@ -41819,7 +41866,7 @@ msgstr "Nabavni Cjenovnik" msgid "Purchase Price Variance Account" msgstr "Račun Odstupanja Nabavne Cjene" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:88 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:93 msgid "Purchase Price Variance for {0}" msgstr "Odstupanje Nabavne Cjene za {0}" @@ -41949,10 +41996,8 @@ msgid "Purchase Return" msgstr "Povrat Nabave" #. Label of the purchase_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:161 -#: erpnext/workspace_sidebar/taxes.json msgid "Purchase Tax Template" msgstr "Predložak Nabavnog PDV-a" @@ -42052,7 +42097,7 @@ msgstr "Nabava" #: erpnext/stock/doctype/item/item_list.js:41 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:481 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:480 #: 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 @@ -42369,7 +42414,7 @@ msgstr "Količina u Jedinici Zaliha" msgid "Qty of Finished Goods Item" msgstr "Količina Artikla Gotovog Proizvoda" -#: erpnext/stock/doctype/pick_list/pick_list.py:707 +#: erpnext/stock/doctype/pick_list/pick_list.py:716 msgid "Qty of Finished Goods Item should be greater than 0." msgstr "Količina Gotovog Proizvoda treba da bude veća od 0." @@ -42398,7 +42443,7 @@ msgstr "Količina za Proizvodnju" msgid "Qty to Deliver" msgstr "Količina za Dostavu" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:401 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:400 msgid "Qty to Disassemble" msgstr "Količina za Demontažu" @@ -42667,7 +42712,7 @@ msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "Kontrola kvalitete {0} je odbijena za artikal: {1}" #: erpnext/public/js/controllers/transaction.js:446 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:212 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:211 msgid "Quality Inspection(s)" msgstr "Kontrola Kvaliteta" @@ -42676,7 +42721,7 @@ msgstr "Kontrola Kvaliteta" msgid "Quality Inspections" msgstr "Kontrola Kvalitete" -#: erpnext/setup/doctype/company/company.py:573 +#: erpnext/setup/doctype/company/company.py:575 msgid "Quality Management" msgstr "Upravljanje Kvalitetom" @@ -42819,11 +42864,11 @@ msgstr "Količine su uspješno ažurirane." #: erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py:39 #: erpnext/stock/dashboard/item_dashboard.js:248 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:368 +#: erpnext/stock/doctype/material_request/material_request.js:369 #: 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:829 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:828 #: 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 @@ -42933,7 +42978,7 @@ msgstr "Količina i Cjena" msgid "Quantity and Warehouse" msgstr "Količina i Skladište" -#: erpnext/stock/doctype/material_request/material_request.py:214 +#: erpnext/stock/doctype/material_request/material_request.py:253 msgid "Quantity cannot be greater than {0} for Item {1}" msgstr "Količina ne može biti veća od {0} za artikal {1}" @@ -42949,7 +42994,7 @@ msgstr "Količina je obavezna" msgid "Quantity must be greater than zero" msgstr "Količina mora biti veća od nule" -#: erpnext/stock/doctype/item/item.py:1649 +#: erpnext/stock/doctype/item/item.py:1654 msgid "Quantity must be greater than zero." msgstr "Količina mora biti veća od nule." @@ -42984,11 +43029,11 @@ msgstr "Količina za proizvodnju ne može biti nula za radnju {0}" msgid "Quantity to Manufacture must be greater than 0." msgstr "Količina za Proizvodnju mora biti veća od 0." -#: erpnext/public/js/utils/barcode_scanner.js:257 +#: erpnext/public/js/utils/barcode_scanner.js:262 msgid "Quantity to Scan" msgstr "Količina za Skeniranje" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:932 msgid "Quantity {0} should not be greater than allowed quantity {1}" msgstr "Količina {0} ne smije biti veća od dozvoljene količine {1}" @@ -43017,7 +43062,7 @@ msgstr "Četvrtina {0} {1}" msgid "Query Route String" msgstr "Niz Rute Upita" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:193 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:200 msgid "Queue Size should be between 5 and 100" msgstr "Veličina Reda čekanja treba biti između 5 i 100" @@ -43667,7 +43712,7 @@ msgstr "Ponovno izdvajanje" #: erpnext/manufacturing/doctype/work_order/work_order.js:788 #: erpnext/selling/doctype/sales_order/sales_order.js:1012 #: erpnext/selling/doctype/sales_order/sales_order_list.js:70 -#: erpnext/stock/doctype/material_request/material_request.js:243 +#: erpnext/stock/doctype/material_request/material_request.js:246 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:163 msgid "Re-open" @@ -43985,7 +44030,7 @@ msgstr "Primljena Količina u Jedinici Zaliha" msgid "Received Quantity" msgstr "Primljena Količina" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:377 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:376 msgid "Received Stock Entries" msgstr "Primljeni Unosi Zaliha" @@ -44127,11 +44172,6 @@ msgstr "Zapisnik Usaglašavanja" msgid "Reconciliation Progress" msgstr "Napredak Usaglašavanja" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Reconciliation Statement" -msgstr "Izvještaj Usklađivanju" - #. Label of the reconciliation_takes_effect_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -44971,7 +45011,7 @@ msgstr "Zapisnik Grešaka Ponovnog Knjiženja" msgid "Repost Item Valuation" msgstr "Ponovo Knjiži Vrijednost Artikla" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:376 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:399 msgid "Repost Item Valuation restarted for selected failed records." msgstr "Ponovno knjiženje vrijednosti artikla je ponovo pokrenuto za odabrane neuspješne zapise." @@ -45156,7 +45196,7 @@ msgstr "Zahtjev za Informacijama" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:270 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/stock/doctype/material_request/material_request.js:202 +#: erpnext/stock/doctype/material_request/material_request.js:205 #: erpnext/workspace_sidebar/buying.json msgid "Request for Quotation" msgstr "Zahtjev za Ponudu" @@ -45331,7 +45371,7 @@ msgstr "Zahteva Ispunjenje" msgid "Research" msgstr "Istraživanja" -#: erpnext/setup/doctype/company/company.py:579 +#: erpnext/setup/doctype/company/company.py:581 msgid "Research & Development" msgstr "Istraživanje & Razvoj" @@ -45422,7 +45462,7 @@ msgstr "Rezerviši za Podsklop" msgid "Reserved" msgstr "Rezervisano" -#: erpnext/stock/services/serial_batch_bundle_service.py:665 +#: erpnext/stock/services/serial_batch_bundle_service.py:664 msgid "Reserved Batch Conflict" msgstr "Konflikt Rezervirane Šarže" @@ -45492,7 +45532,7 @@ msgstr "Rezervisana Količina" msgid "Reserved Quantity for Production" msgstr "Rezervisana Količina za Proizvodnju" -#: erpnext/stock/stock_ledger.py:2452 +#: erpnext/stock/stock_ledger.py:2500 msgid "Reserved Serial No." msgstr "Rezervisani Serijski Broj" @@ -45508,13 +45548,13 @@ msgstr "Rezervisani Serijski Broj" #: erpnext/stock/doctype/pick_list/pick_list.js:178 #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:573 -#: erpnext/stock/stock_ledger.py:2436 +#: erpnext/stock/stock_ledger.py:2484 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:204 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:332 msgid "Reserved Stock" msgstr "Rezervisane Zalihe" -#: erpnext/stock/stock_ledger.py:2481 +#: erpnext/stock/stock_ledger.py:2529 msgid "Reserved Stock for Batch" msgstr "Rezervisane Zalihe za Šaržu" @@ -45556,7 +45596,7 @@ msgstr "Rezervirano za Podizvođača" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:421 -#: erpnext/stock/doctype/pick_list/pick_list.js:306 +#: erpnext/stock/doctype/pick_list/pick_list.js:307 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:292 msgid "Reserving Stock..." msgstr "Rezervacija Zaliha..." @@ -45727,7 +45767,7 @@ msgstr "Ponovo pokreni neuspješne unose" msgid "Restart Subscription" msgstr "Ponovo pokreni Pretplatu" -#: erpnext/assets/doctype/asset/asset.js:183 +#: erpnext/assets/doctype/asset/asset.js:191 msgid "Restore Asset" msgstr "Vrati Imovinu" @@ -45743,6 +45783,15 @@ msgstr "Ograniči" msgid "Restrict Items Based On" msgstr "Ograniči Artikle na osnovu" +#. Label of the restrict_to_companies (Check) field in DocType 'Supplier' +#. Label of the restrict_to_companies (Check) field in DocType 'Customer' +#. Label of the restrict_to_companies (Check) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Restrict to Companies" +msgstr "" + #. Label of the section_break_6 (Section Break) field in DocType 'Shipping #. Rule' #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json @@ -45785,7 +45834,7 @@ msgstr "Nastavi" msgid "Resume Job" msgstr "Nastavi Posao" -#: erpnext/projects/doctype/timesheet/timesheet.js:65 +#: erpnext/projects/doctype/timesheet/timesheet.js:66 msgid "Resume Timer" msgstr "Nastavi Tajmer" @@ -46211,6 +46260,12 @@ msgstr "Uloga dozvoljena da prekomjerno Fakturiše " msgid "Role allowed to bypass credit limit" msgstr "Uloga dozvoljena da zaobiđe Kreditno Ograničenje" +#. Label of the role_allowed_to_bypass_overdue_billing (Link) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Role allowed to bypass overdue billing limit" +msgstr "" + #. Description of the 'Exempted Role' (Link) field in DocType 'Accounting #. Period' #: erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -46272,7 +46327,7 @@ msgstr "Matično Poduzeće" msgid "Root Type" msgstr "Kontna Klasa" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:404 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:405 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "Kontna Klasa za {0} mora biti jedna od imovine, obaveza, prihoda, rashoda i kapitala" @@ -46436,8 +46491,8 @@ msgstr "Dozvola Zaokruživanja Gubitka" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "Dozvola Zaokruživanje Gubitka treba da bude između 0 i 1" -#: erpnext/stock/services/base_stock_gl_composer.py:119 -#: erpnext/stock/services/base_stock_gl_composer.py:134 +#: erpnext/stock/services/base_stock_gl_composer.py:126 +#: erpnext/stock/services/base_stock_gl_composer.py:141 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "Unos Zaokruživanja Rezultat za Prijenos Zaliha" @@ -46494,7 +46549,7 @@ msgstr "Red #{0} (Tabela Plaćanja): Iznos mora da je negativan" msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "Red #{0} (Tabela Plaćanja): Iznos mora da je pozitivan" -#: erpnext/stock/doctype/item/item.py:585 +#: erpnext/stock/doctype/item/item.py:590 msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "Red #{0}: Unos ponovnog naručivanja već postoji za skladište {1} sa tipom ponovnog naručivanja {2}." @@ -46710,11 +46765,11 @@ msgstr "Red #{0}: Unesi Stopu Vrednovanja za artikal {1} da biste postavili poč msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "Red #{0}: Očekivani Datum Isporuke ne može biti prije datuma Nabavnog Naloga" -#: erpnext/stock/services/base_stock_gl_composer.py:196 +#: erpnext/stock/services/base_stock_gl_composer.py:263 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "Red #{0}: Račun Troškova nije postavljen za artikal {1}. {2}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:145 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:148 msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "Red #{0}: Račun troškova {1} nije važeći za Nabavnu Fakturu {2}. Dozvoljeni su samo računi troškova za artikle koji nisu na zalihama." @@ -46777,11 +46832,11 @@ msgstr "Red #{0}: Od datuma ne može biti prije Do datuma" msgid "Row #{0}: From Time and To Time fields are required" msgstr "Red #{0}: Polja Od i Do su obavezna" -#: erpnext/stock/doctype/pick_list/pick_list.py:680 +#: erpnext/stock/doctype/pick_list/pick_list.py:689 msgid "Row #{0}: Item Code is Mandatory" msgstr "Red #{0}: Šifra Artikla je obavezna" -#: erpnext/public/js/utils/barcode_scanner.js:427 +#: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Row #{0}: Item added" msgstr "Red #{0}: Artikel je dodan" @@ -46793,7 +46848,7 @@ msgstr "Red #{0}: Artikal {1} se ne može prenijeti više od {2} u odnosu na {3} msgid "Row #{0}: Item {1} does not exist" msgstr "Red #{0}: Artikel {1} ne postoji" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1659 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1661 msgid "Row #{0}: Item {1} has been picked, please reserve stock from the Pick List." msgstr "Red #{0}: Artikal {1} je odabran, rezerviši zalihe sa Liste Odabira." @@ -46870,7 +46925,7 @@ msgstr "Red #{0}: Sljedeći datum amortizacije ne može biti prije datuma nabave msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "Red #{0}: Nije dozvoljeno mijenjati dobavljača jer Nabavni Nalog već postoji" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1742 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1744 msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "Red #{0}: Samo {1} je dostupno za rezervisanje za artikal {2}" @@ -46923,7 +46978,7 @@ msgstr "Red #{0}: Odaberi Artikal Gotovog Proizvoda za koju će se koristiti ova msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "Red #{0}: Odaberi Skladište Podmontaže" -#: erpnext/stock/doctype/item/item.py:592 +#: erpnext/stock/doctype/item/item.py:597 msgid "Row #{0}: Please set reorder quantity" msgstr "Red #{0}: Postavi količinu za ponovnu narudžbu" @@ -46944,7 +46999,7 @@ msgstr "Red #{0}: Postotni Gubitak Procesa treba da bude manji od 100% za {1} ar msgid "Row #{0}: Product Bundle {1} is disabled and cannot be used in transactions." msgstr "Red #{0}: Paket Artikal {1} je onemogućen i ne može se koristiti u transakcijama." -#: erpnext/public/js/utils/barcode_scanner.js:425 +#: erpnext/public/js/utils/barcode_scanner.js:433 msgid "Row #{0}: Qty increased by {1}" msgstr "Red #{0}: Količina povećana za {1}" @@ -46981,7 +47036,7 @@ msgstr "Red #{0}: Količina za artikal {1} ne može biti nula." msgid "Row #{0}: Quantity of Item {1} cannot be more than {2} {3} against Subcontracting Inward Order {4}" msgstr "Red #{0}: Količina artikla {1} ne može biti veća od {2} {3} u odnosu na Podizvođački Nalog {4}" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1727 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1729 msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "Red #{0}: Količina koju treba rezervisati za artikal {1} treba biti veća od 0." @@ -47007,7 +47062,7 @@ msgstr "Red #{0}: Odbijena količina se ne može postaviti za Sekundarni Artikal msgid "Row #{0}: Rejected Warehouse is mandatory for the rejected Item {1}" msgstr "Red #{0}: Odbijeno Skladište je obavezno za odbijeni artikal {1}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:163 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:166 msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "Red #{0}: Trošak popravke {1} premašuje raspoloživi iznos {2} za Nabavnu Fakturu {3} i račun {4}" @@ -47045,7 +47100,7 @@ msgstr "Red #{0}: ID Sekvence mora biti {1} ili {2} za Radnju {3}." msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" msgstr "Red #{0}: Serijski Broj {1} ne može se vratiti jer nije naveden u originalnoj fakturi {2}" -#: erpnext/stock/services/serial_batch_bundle_service.py:123 +#: erpnext/stock/services/serial_batch_bundle_service.py:125 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "Red #{0}: Serijski Broj {1} ne pripada Šarži {2}" @@ -47113,7 +47168,7 @@ msgstr "Red #{0}: Status je obavezan" msgid "Row #{0}: Status must be {1} for Invoice Discounting {2}" msgstr "Red #{0}: Status mora biti {1} za popust na fakturi {2}" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:454 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:459 msgid "Row #{0}: Stock Delivered But Not Billed account cannot be used for items linked to a Sales Invoice" msgstr "Red #{0}: Račun za isporučene, ali nefakturirane zalihe ne može se koristiti za artikle povezane s prodajnom fakturom" @@ -47121,19 +47176,19 @@ msgstr "Red #{0}: Račun za isporučene, ali nefakturirane zalihe ne može se ko msgid "Row #{0}: Stock cannot be reserved for Item {1} against a disabled Batch {2}." msgstr "Red #{0}: Zaliha se ne može rezervisati za artikal {1} naspram onemogućene Šarže {2}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1672 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1674 msgid "Row #{0}: Stock cannot be reserved for a non-stock Item {1}" msgstr "Red #{0}: Zalihe se ne mogu rezervirati za artikal bez zaliha {1}" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1685 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1687 msgid "Row #{0}: Stock cannot be reserved in group warehouse {1}." msgstr "Red #{0}: Zalihe se ne mogu rezervisati u grupnom skladištu {1}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1701 msgid "Row #{0}: Stock is already reserved for the Item {1}." msgstr "Red #{0}: Zaliha je već rezervisana za artikal {1}." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:569 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:574 msgid "Row #{0}: Stock is reserved for item {1} in warehouse {2}." msgstr "Red #{0}: Zalihe su rezervisane za artikal {1} u skladištu {2}." @@ -47142,11 +47197,11 @@ msgid "Row #{0}: Stock not available to reserve for Item {1} against Batch {2} i msgstr "Red #{0}: Zaliha nije dostupna za rezervisanje za artikal {1} naspram Šarže {2} u Skladištu {3}." #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1263 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1713 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1715 msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "Red #{0}: Zaliha nije dostupna za rezervisanje za artikal {1} u skladištu {2}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:944 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:950 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "Red #{0}: Količina zaliha {1} ({2}) za artikal {3} ne može biti veća od {4}" @@ -47154,7 +47209,7 @@ msgstr "Red #{0}: Količina zaliha {1} ({2}) za artikal {3} ne može biti veća msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "Red #{0}: Ciljano skladište mora biti isto kao i skladište klijenta {1} iz povezanog Podizvođačkog Naloga" -#: erpnext/stock/services/serial_batch_bundle_service.py:141 +#: erpnext/stock/services/serial_batch_bundle_service.py:143 msgid "Row #{0}: The batch {1} has already expired." msgstr "Red #{0}: Šarža {1} je već istekla." @@ -47166,7 +47221,7 @@ msgstr "Red #{0}: Nedostaje referenca artikla na radnoj kartici. Stvori unos zal msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." msgstr "Red #{0}: Originalna Faktura {1} povratne fakture {2} nije konsolidovana." -#: erpnext/stock/doctype/item/item.py:601 +#: erpnext/stock/doctype/item/item.py:606 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "Red #{0}: Skladište {1} nije podređeno skladište grupnog skladišta {2}" @@ -47186,7 +47241,7 @@ msgstr "Red #{0}: Ukupan broj amortizacija mora biti veći od nule" msgid "Row #{0}: Valuation Rate for Item {1} must be the same across all rows, as it is the item's company-wide Standard Cost." msgstr "Red #{0}: Stopa Vrednovanja za Artikal {1} mora biti ista u svim redovima, jer predstavlja Standardne Troškove artikla na nivou poduzeća." -#: erpnext/stock/services/serial_batch_bundle_service.py:57 +#: erpnext/stock/services/serial_batch_bundle_service.py:59 msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." msgstr "Red #{0}: Skladište {1} nije usklađen sa skladištem {2} u serijskom i šaržnom paketu {3}." @@ -47239,7 +47294,7 @@ msgstr "Red #{0}: {1} je obavezno za izradu Početne Fakture {2}" msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "Red #{0}: {1} od {2} bi trebao biti {3}. Ažuriraj {1} ili odaberi drugi račun." -#: erpnext/stock/doctype/item/item.py:1557 +#: erpnext/stock/doctype/item/item.py:1562 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." msgstr "Red #{0}: {1} {2} ne pripada {3}. Odaberi važeći {4}." @@ -47259,23 +47314,23 @@ msgstr "Red #{1}: Skladište je obavezno za artikal {0}" msgid "Row #{idx}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor." msgstr "Red #{idx}: Ne može se odabrati Skladište Dobavljača dok isporučuje sirovine podizvođaču." -#: erpnext/controllers/buying_controller.py:633 +#: erpnext/controllers/buying_controller.py:641 msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "Red #{idx}: Cjena artikla je ažurirana prema stopi vrednovanja zato što je ovo interni prijenos zaliha." -#: erpnext/controllers/buying_controller.py:1069 +#: erpnext/controllers/buying_controller.py:1077 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "Red #{idx}: Unesi lokaciju za imovinski artikal {item_code}." -#: erpnext/controllers/buying_controller.py:726 +#: erpnext/controllers/buying_controller.py:734 msgid "Row #{idx}: Received Qty must be equal to Accepted + Rejected Qty for Item {item_code}." msgstr "Red #{idx}: Primljena količina mora biti jednaka Prihvaćenoj + Odbijenoj količini za Artikal {item_code}." -#: erpnext/controllers/buying_controller.py:739 +#: erpnext/controllers/buying_controller.py:747 msgid "Row #{idx}: {field_label} can not be negative for item {item_code}." msgstr "Red #{idx}: {field_label} ne može biti negativan za artikal {item_code}." -#: erpnext/controllers/buying_controller.py:692 +#: erpnext/controllers/buying_controller.py:700 msgid "Row #{idx}: {field_label} is mandatory." msgstr "Red #{idx}: {field_label} je obavezan." @@ -47283,7 +47338,7 @@ msgstr "Red #{idx}: {field_label} je obavezan." msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "Red #{idx}: {from_warehouse_field} i {to_warehouse_field} ne mogu biti isti." -#: erpnext/controllers/buying_controller.py:1185 +#: erpnext/controllers/buying_controller.py:1193 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "Red #{idx}: {schedule_date} ne može biti prije {transaction_date}." @@ -47335,11 +47390,11 @@ msgstr "Red {0}: Dodijeljeni iznos {1} mora biti manji ili jednak nepodmirenom i msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}" msgstr "Red {0}: Dodijeljeni iznos {1} mora biti manji ili jednak preostalom iznosu plaćanja {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:729 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "Red {0}: Kako je {1} omogućen, sirovine se ne mogu dodati u {2} unos. Koristite {3} unos za potrošnju sirovina." -#: erpnext/stock/doctype/material_request/material_request.py:556 +#: erpnext/stock/doctype/material_request/material_request.py:595 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "Red {0}: Sastavnica nije pronađena za Artikal {1}" @@ -47580,7 +47635,7 @@ msgstr "Red {0}: Ciljno Skladište je obavezno za interne transfere" msgid "Row {0}: Task {1} does not belong to Project {2}" msgstr "Red {0}: Zadatak {1} ne pripada Projektu {2}" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:187 msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "Red {0}: Cijeli iznos troška za račun {1} u {2} je već dodijeljen." @@ -47657,7 +47712,7 @@ msgstr "Red {0}: {2} Artikal {1} ne postoji u {2} {3}" msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "Red {1}: Količina ({0}) ne može biti razlomak. Da biste to omogućili, onemogućite '{2}' u Jedinici {3}." -#: erpnext/controllers/buying_controller.py:1051 +#: erpnext/controllers/buying_controller.py:1059 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "Red {idx}: Serija Imenovanja Imovine je obavezna za automatsku izradu sredstava za artikal {item_code}." @@ -47922,8 +47977,8 @@ msgstr "Način Plate" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:143 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:525 -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:527 +#: erpnext/setup/doctype/company/company.py:720 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 #: erpnext/setup/install.py:408 @@ -47938,7 +47993,7 @@ msgstr "Prodaja" msgid "Sales & Purchase" msgstr "Prodaja & Nabava" -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:720 msgid "Sales Account" msgstr "Prodajni Račun" @@ -48136,7 +48191,7 @@ msgstr "Prodajna Faktura nije izrađena od {0}" msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." msgstr "U Kasi je aktiviran način Prodajne Fakture. Umjesto toga izradi Prodajnu Fakturu." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:626 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:631 msgid "Sales Invoice {0} has already been submitted" msgstr "Prodajna Faktura {0} je već podnešena" @@ -48188,7 +48243,6 @@ msgstr "Mogućnos Prodaje prema Izvoru" #. Label of the sales_order (Link) field in DocType 'Purchase Receipt Item' #. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation #. Entry' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json @@ -48228,7 +48282,7 @@ msgstr "Mogućnos Prodaje prema Izvoru" #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.js:157 #: erpnext/stock/doctype/delivery_note/delivery_note.js:223 -#: erpnext/stock/doctype/material_request/material_request.js:236 +#: erpnext/stock/doctype/material_request/material_request.js:239 #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -48237,9 +48291,7 @@ msgstr "Mogućnos Prodaje prema Izvoru" #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:159 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:30 #: erpnext/stock/report/delayed_order_report/delayed_order_report.py:74 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Sales Order" msgstr "Prodajni Nalog" @@ -48342,7 +48394,7 @@ msgstr "Prodajni Nalog je obavezan za Artikal {0}" msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "Prodajni Nalog {0} već postoji naspram Nabavnog Naloga Klijenta {1}. Da dozvolite višestruke Prodajne Naloge, omogući {2} u {3}" -#: erpnext/projects/doctype/project/project.py:256 +#: erpnext/projects/doctype/project/project.py:258 msgid "Sales Order {0} is already linked to Project {1}, skipping the link." msgstr "Prodajni Nalog {0} je već povezan s projektom {1}, preskoči vezu." @@ -48351,7 +48403,7 @@ msgstr "Prodajni Nalog {0} je već povezan s projektom {1}, preskoči vezu." msgid "Sales Order {0} is not available for production" msgstr "Prodajni Nalog {0} nije dostupan za proizvodnju" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 msgid "Sales Order {0} is not submitted" msgstr "Prodajni Nalog {0} nije podnešen" @@ -48635,10 +48687,8 @@ msgid "Sales Summary" msgstr "Sažetak Prodaje" #. Label of the sales_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:149 -#: erpnext/workspace_sidebar/taxes.json msgid "Sales Tax Template" msgstr "Predložak Prodajnog PDV-a" @@ -48647,11 +48697,6 @@ msgstr "Predložak Prodajnog PDV-a" msgid "Sales Tax Withholding Category" msgstr "Kategorija PDV Odbitka" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Sales Taxes" -msgstr "PDV" - #. Label of the taxes (Table) field in DocType 'POS Invoice' #. Label of the taxes (Table) field in DocType 'Sales Invoice' #. Name of a DocType @@ -48776,7 +48821,7 @@ msgid "Sample Quantity" msgstr "Količina Uzorka" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:557 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:556 msgid "Sample Retention Stock Entry" msgstr "Unos Uzorka Zaliha" @@ -48847,7 +48892,7 @@ msgstr "Sazhen" #: 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/public/js/utils/barcode_scanner.js:236 +#: erpnext/public/js/utils/barcode_scanner.js:241 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -48879,7 +48924,7 @@ msgstr "Način Skeniranja" msgid "Scan Serial No" msgstr "Skeniraj Serijski Broj" -#: erpnext/public/js/utils/barcode_scanner.js:200 +#: erpnext/public/js/utils/barcode_scanner.js:205 msgid "Scan barcode for item {0}" msgstr "Skenirajte bar kod za artikal {0}" @@ -48901,14 +48946,14 @@ msgstr "Skeniraj ili Unesi Radnu Karticu" msgid "Scanned Cheque" msgstr "Skenirani Ček" -#: erpnext/public/js/utils/barcode_scanner.js:268 +#: erpnext/public/js/utils/barcode_scanner.js:273 msgid "Scanned Quantity" msgstr "Skenirana Količina" #. 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:383 +#: erpnext/assets/doctype/asset/asset.js:391 #: 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" @@ -49044,7 +49089,7 @@ msgstr "Poredak Bodovanja" msgid "Scrap" msgstr "Otpad" -#: erpnext/assets/doctype/asset/asset.js:168 +#: erpnext/assets/doctype/asset/asset.js:176 msgid "Scrap Asset" msgstr "Rashodovana Imovina" @@ -49105,7 +49150,7 @@ msgstr "Pretraži poduzeće..." msgid "Search transactions" msgstr "Pretražite transakcije" -#: erpnext/stock/doctype/item/item.js:1099 +#: erpnext/stock/doctype/item/item.js:1116 msgid "Search values..." msgstr "Pretraži vrijednosti..." @@ -49233,7 +49278,7 @@ msgstr "Odaberi Alternativni Artikal" msgid "Select Alternative Items for Sales Order" msgstr "Odaberi Alternativni Artikal za Prodajni Nalog" -#: erpnext/stock/doctype/item/item.js:1225 +#: erpnext/stock/doctype/item/item.js:1242 msgid "Select Attribute Values" msgstr "Odaberi Vrijednosti Atributa" @@ -49245,9 +49290,9 @@ msgstr "Odaberi Sastavnicu" msgid "Select BOM and Qty for Production" msgstr "Odaberi Sastavnicu i Količinu za Proizvodnju" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Batch No" msgstr "Odaberi Broj Šarže" @@ -49379,15 +49424,15 @@ msgstr "Odaberi Mogućeg Dobavljača" msgid "Select Quantity" msgstr "Odaberi Količinu" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Serial No" msgstr "Odaberi Serijski Broj" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:237 -#: erpnext/public/js/utils/sales_common.js:452 -#: erpnext/stock/doctype/pick_list/pick_list.js:401 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:246 +#: erpnext/public/js/utils/sales_common.js:450 +#: erpnext/stock/doctype/pick_list/pick_list.js:402 msgid "Select Serial and Batch" msgstr "Odaberi Serijski Broj I Šaržu" @@ -49425,7 +49470,7 @@ msgstr "Odaberi Verifikate za Usklađivanje" msgid "Select Warehouse..." msgstr "Odaberi Skladište..." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:580 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:578 msgid "Select Warehouses to get Stock for Materials Planning" msgstr "Odaberi Skladišta ta preuzimanje Zalihe za Planiranje Materijala" @@ -49437,7 +49482,7 @@ msgstr "Odaberi Poduzeće" msgid "Select a Company this Employee belongs to." msgstr "Odaberi Poduzeće kojoj ovo Osoblje pripada." -#: erpnext/buying/doctype/supplier/supplier.js:221 +#: erpnext/buying/doctype/supplier/supplier.js:230 msgid "Select a Customer" msgstr "Odaberi Klijenta" @@ -49449,7 +49494,7 @@ msgstr "Odaberi Standard Prioritet." msgid "Select a Payment Method." msgstr "Odaberi način plaćanja." -#: erpnext/selling/doctype/customer/customer.js:253 +#: erpnext/selling/doctype/customer/customer.js:262 msgid "Select a Supplier" msgstr "Odaberi Dobavljača" @@ -49476,7 +49521,7 @@ msgstr "Odaberi transakciju za usklađivanje i poravnanje s računima" msgid "Select all" msgstr "Odaberi sve" -#: erpnext/stock/doctype/item/item.js:1567 +#: erpnext/stock/doctype/item/item.js:1584 msgid "Select an Item Group." msgstr "Odaberi Grupu Artikla." @@ -49493,7 +49538,7 @@ msgstr "Odaberi fakturu za učitavanje sažetih podataka" msgid "Select an item from each set to be used in the Sales Order." msgstr "Odaber artikal iz svakog skupa koja će se koristiti u Prodajnom Nalogu." -#: erpnext/stock/doctype/item/item.js:1239 +#: erpnext/stock/doctype/item/item.js:1256 msgid "Select at least one attribute value." msgstr "Odaberi barem jednu vrijednost atributa." @@ -49564,7 +49609,7 @@ msgstr "Odaberi Skladište" msgid "Select the customer or supplier." msgstr "Odaberi Klijenta ili Dobavljača." -#: erpnext/assets/doctype/asset/asset.js:940 +#: erpnext/assets/doctype/asset/asset.js:948 msgid "Select the date" msgstr "Odaberi datum" @@ -49590,7 +49635,7 @@ msgstr "Odaberi Sirovine (Artikle) obavezne za proizvodnju artikla" msgid "Select variant item code for the template item {0}" msgstr "Odaberi kod varijante artikla za predložak {0}" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:737 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:735 msgid "Select whether to get items from a Sales Order or a Material Request. For now select Sales Order.\n" " A Production Plan can also be created manually where you can select the Items to manufacture." msgstr "Odaberi hoćete li preuzeti artikle iz Prodajnog Naloga ili Materijalnog Naloga. Za sada odaberi Prodajni Nalog.\n" @@ -49645,22 +49690,22 @@ msgstr "Odabrani {0} ne sadrži Šifru Artikla {1}" msgid "Self delivery" msgstr "Samostalna Dostava" -#: erpnext/assets/doctype/asset/asset.js:647 +#: erpnext/assets/doctype/asset/asset.js:655 #: erpnext/stock/doctype/batch/batch_dashboard.py:9 #: erpnext/stock/doctype/item/item_dashboard.py:20 msgid "Sell" msgstr "Prodaja" -#: erpnext/assets/doctype/asset/asset.js:176 -#: erpnext/assets/doctype/asset/asset.js:636 +#: erpnext/assets/doctype/asset/asset.js:184 +#: erpnext/assets/doctype/asset/asset.js:644 msgid "Sell Asset" msgstr "Prodaj Imovinu" -#: erpnext/assets/doctype/asset/asset.js:641 +#: erpnext/assets/doctype/asset/asset.js:649 msgid "Sell Qty" msgstr "Prodajna Količina" -#: erpnext/assets/doctype/asset/asset.js:657 +#: erpnext/assets/doctype/asset/asset.js:665 msgid "Sell quantity cannot exceed the asset quantity" msgstr "Prodajna Količina ne može premašiti količinu imovine" @@ -49668,7 +49713,7 @@ msgstr "Prodajna Količina ne može premašiti količinu imovine" msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "Prodajna Količina ne može premašiti količinu imovine. Imovina {0} ima samo {1} artikala." -#: erpnext/assets/doctype/asset/asset.js:653 +#: erpnext/assets/doctype/asset/asset.js:661 msgid "Sell quantity must be greater than zero" msgstr "Prodajna Količina mora biti veća od nule" @@ -49974,7 +50019,7 @@ msgstr "Serijski Broj / Šarža" msgid "Serial No Already Assigned" msgstr "Serijski broj je već dodijeljen" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:296 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:299 msgid "Serial No Bundle is mandatory for Item {0}" msgstr "Paket Serijskih Brojeva je obavezan za artikal {0}" @@ -49995,11 +50040,11 @@ msgstr "Serijski Broj Registar" msgid "Serial No Range" msgstr "Serijski Broj Raspon" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2766 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2768 msgid "Serial No Reserved" msgstr "Rezervisan Serijski Broj" -#: erpnext/stock/doctype/item/item.py:496 +#: erpnext/stock/doctype/item/item.py:501 msgid "Serial No Series Overlap" msgstr "Preklapa se Serijski broj Šarže" @@ -50064,7 +50109,7 @@ msgstr "Serijski Broj je obavezan za artikal {0}" msgid "Serial No {0} already exists" msgstr "Serijski Broj {0} već postoji" -#: erpnext/public/js/utils/barcode_scanner.js:342 +#: erpnext/public/js/utils/barcode_scanner.js:347 msgid "Serial No {0} already scanned" msgstr "Serijski Broj {0} je već skeniran" @@ -50078,7 +50123,7 @@ msgstr "Serijski Broj {0} ne pripada Artiklu {1}" #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py:52 #: erpnext/selling/doctype/installation_note/installation_note.py:84 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3564 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3566 msgid "Serial No {0} does not exist" msgstr "Serijski Broj {0} ne postoji" @@ -50086,7 +50131,7 @@ msgstr "Serijski Broj {0} ne postoji" msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." msgstr "Serijski broj {0} je već dostavljen. Ne možete ga ponovno koristiti u unosu Proizvodnje / Ponovnog pakiranja." -#: erpnext/public/js/utils/barcode_scanner.js:435 +#: erpnext/public/js/utils/barcode_scanner.js:443 msgid "Serial No {0} is already added" msgstr "Serijski Broj {0} je već dodan" @@ -50114,7 +50159,7 @@ msgstr "Serijski Broj {0} nije pronađen" msgid "Serial No: {0} has already been transacted into another POS Invoice." msgstr "Serijski Broj: {0} izršena transakcija u drugoj Kasa Fakturi." -#: erpnext/public/js/utils/barcode_scanner.js:292 +#: erpnext/public/js/utils/barcode_scanner.js:297 #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:201 #: erpnext/stock/doctype/batch/batch.py:393 @@ -50137,7 +50182,7 @@ msgstr "Serijski Brojevi / Šarže" msgid "Serial Nos are created successfully" msgstr "Serijski Brojevi su uspješno izrađeni" -#: erpnext/stock/stock_ledger.py:2442 +#: erpnext/stock/stock_ledger.py:2490 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "Serijski brojevi su rezervisani u unosima za rezervacije zaliha, morate ih opozvati prije nego što nastavite." @@ -50218,7 +50263,7 @@ msgstr "Serijski i Šarža" msgid "Serial and Batch Bundle" msgstr "Serijski i Šaržni Paket" -#: erpnext/stock/doctype/item/item.py:1150 +#: erpnext/stock/doctype/item/item.py:1155 msgid "Serial and Batch Bundle Exists" msgstr "Serijski i Šaržni Paket Postoji" @@ -50230,7 +50275,7 @@ msgstr "Serijski i Šaržni Paket je izrađen" msgid "Serial and Batch Bundle updated" msgstr "Serijski i Šaržni Paket je ažuriran" -#: erpnext/stock/services/serial_batch_bundle_service.py:99 +#: erpnext/stock/services/serial_batch_bundle_service.py:101 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "Serijski i Šaržni Paket {0} se već koristi u {1} {2}." @@ -50307,7 +50352,7 @@ msgstr "Serijski brojevi nedostupni za artikal {0} u skladištu {1}. Pokušaj pr msgid "Series for Asset Depreciation Entry (Journal Entry)" msgstr "Numerička Serija za unos Amortizacije Imovine (Nalog Knjiženja)" -#: erpnext/buying/doctype/supplier/supplier.py:143 +#: erpnext/buying/doctype/supplier/supplier.py:151 msgid "Series is mandatory" msgstr "Numerička Serija je obavezna" @@ -50587,7 +50632,7 @@ msgstr "Postavi Program Lojalnosti" msgid "Set New Release Date" msgstr "Postavi Novi Datum Izdavanja" -#: erpnext/stock/doctype/item/item.js:207 +#: erpnext/stock/doctype/item/item.js:218 msgid "Set Opening Stock" msgstr "Postavi Početne Zalihe" @@ -50648,7 +50693,7 @@ msgstr "Postavi Imenovanje Serijskog i Šaržnog Paketa na osnovu Imenovanja Ser #. Label of the set_warehouse (Link) field in DocType 'Sales Order' #. Label of the set_warehouse (Link) field in DocType 'Delivery Note' #. Label of the set_from_warehouse (Link) field in DocType 'Material Request' -#: erpnext/public/js/utils/sales_common.js:574 +#: erpnext/public/js/utils/sales_common.js:572 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json @@ -50666,7 +50711,7 @@ msgstr "Postavi Dobavljača" #. Label of the set_warehouse (Link) field in DocType 'Subcontracting Order' #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/public/js/utils/sales_common.js:571 +#: erpnext/public/js/utils/sales_common.js:569 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json @@ -50692,7 +50737,7 @@ msgstr "Postavi kao Zatvoreno" msgid "Set as Completed" msgstr "Postavi kao Završeno" -#: erpnext/public/js/utils/sales_common.js:598 +#: erpnext/public/js/utils/sales_common.js:596 #: erpnext/selling/doctype/quotation/quotation.js:146 msgid "Set as Lost" msgstr "Postavi kao Izgubljeno" @@ -50719,11 +50764,11 @@ msgstr "Postavljeno prema Predložku PDV-a za Artikal" msgid "Set closing balance as per bank statement" msgstr "Postavi završno stanje prema bankovnom izvodu" -#: erpnext/setup/doctype/company/company.py:615 +#: erpnext/setup/doctype/company/company.py:617 msgid "Set default inventory account for perpetual inventory" msgstr "Postavi Standard Račun Zaliha za Stalno Upravljanje Zalihama" -#: erpnext/setup/doctype/company/company.py:641 +#: erpnext/setup/doctype/company/company.py:643 msgid "Set default {0} account for non stock items" msgstr "Postavi Standard Račun {0} za artikle za koje se nevode zalihe" @@ -50937,44 +50982,34 @@ msgstr "Postavi Poduzeće" #. Label of the share_balance (Table) field in DocType 'Shareholder' #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_balance/share_balance.json #: erpnext/accounts/doctype/shareholder/shareholder.js:21 #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Balance" msgstr "Stanje Dionica" #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.js:27 #: erpnext/accounts/report/share_ledger/share_ledger.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Ledger" msgstr "Registar Dionica" #. Label of a Card Break in the Invoicing Workspace -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/accounts/workspace/share_management/share_management.json #: erpnext/desktop_icon/share_management.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Management" msgstr "Dionice" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/report/share_ledger/share_ledger.py:59 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Transfer" msgstr "Prenos Dionica" @@ -50991,14 +51026,12 @@ msgstr "Tip Dionica" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.js:16 #: erpnext/accounts/report/share_balance/share_balance.py:55 #: erpnext/accounts/report/share_ledger/share_ledger.js:16 #: erpnext/accounts/report/share_ledger/share_ledger.py:51 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Shareholder" msgstr "Dioničar" @@ -51012,7 +51045,7 @@ msgid "Shelf Life in Days" msgstr "Rok Trajanja u Danima" #. Label of the shift (Link) field in DocType 'Depreciation Schedule' -#: erpnext/assets/doctype/asset/asset.js:396 +#: erpnext/assets/doctype/asset/asset.js:404 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Shift" msgstr "Smjena" @@ -51084,7 +51117,7 @@ msgstr "Tip Pošiljke" msgid "Shipment details" msgstr "Detalji Pošiljke" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:656 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:661 msgid "Shipments" msgstr "Pošiljke" @@ -51450,7 +51483,7 @@ msgstr "Prikaži Podatke Starenja Zaliha" msgid "Show Variant Attributes" msgstr "Prikaži Atribute Varijante" -#: erpnext/stock/doctype/item/item.js:231 +#: erpnext/stock/doctype/item/item.js:242 msgid "Show Variants" msgstr "Prikaži Varijante" @@ -51643,11 +51676,11 @@ msgstr "Budući da postoji gubitak u procesu od {0} jedinica za gotov proizvod { msgid "Since you have enabled 'Track Semi Finished Goods', at least one operation must have 'Is Final Finished Good' checked. For that set the FG / Semi FG Item as {0} against an operation." msgstr "Budući da je 'Praćenje Polugotovih Proizvoda' omogućeno, barem jedna radnja mora imati odabranu opciju 'Je li Gotov Proizvod'. Za to postavi Gotov Proizvod / Polugotov Proizvod kao {0} naspram radnje." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:134 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:142 msgid "Since {0} are Serial No/Batch No items, you cannot enable 'Recreate Stock Ledgers' in Repost Item Valuation." msgstr "Budući da {0} predstavljaju artikle sa Serijskim brojem/šarža brojem, ne možete omogućiti 'Ponovno izradu Registra Zaliha' u ponovnom knjiženju procjene artikla." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:114 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:122 msgid "Since {0} has 'Update Stock' disabled, you cannot create repost item valuation against it" msgstr "Pošto je opcija 'Ažuriranje Zaliha' onemogućena za {0}, ne možete izraditi ponovnu procjenu vrijednosti artikla na osnovu nje" @@ -51669,7 +51702,7 @@ msgstr "Jedan račun" msgid "Single Tier Program" msgstr "Jednoslojni Program" -#: erpnext/stock/doctype/item/item.js:256 +#: erpnext/stock/doctype/item/item.js:267 msgid "Single Variant" msgstr "Jedna Varijanta" @@ -51861,11 +51894,11 @@ msgstr "Tip Izvora" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:135 -#: erpnext/public/js/utils/sales_common.js:570 +#: erpnext/public/js/utils/sales_common.js:568 #: 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:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:819 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "Izvorno Skladište" @@ -51955,15 +51988,15 @@ msgstr "Potrošnja za Račun {0} ({1}) između {2} i {3} je već premašila novi msgid "Spent" msgstr "Potrošeno" -#: erpnext/assets/doctype/asset/asset.js:697 +#: erpnext/assets/doctype/asset/asset.js:705 #: erpnext/stock/doctype/batch/batch.js:104 #: erpnext/stock/doctype/batch/batch.js:185 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "Razdjeli" -#: erpnext/assets/doctype/asset/asset.js:152 -#: erpnext/assets/doctype/asset/asset.js:681 +#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:689 msgid "Split Asset" msgstr "Podjeljena Imovina" @@ -51987,7 +52020,7 @@ msgstr "Podjeli od" msgid "Split Issue" msgstr "Razdjeli Zahtjev" -#: erpnext/assets/doctype/asset/asset.js:687 +#: erpnext/assets/doctype/asset/asset.js:695 msgid "Split Qty" msgstr "Podjeljena Količina" @@ -52062,13 +52095,13 @@ msgstr "Naziv Faze" msgid "Stale Days" msgstr "Neaktivni Dani" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:163 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:170 msgid "Stale Days should start from 1." msgstr "Neaktivni Dani bi trebalo da počnu od 1." #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:485 -#: erpnext/tests/utils.py:275 +#: erpnext/tests/utils.py:276 msgid "Standard Buying" msgstr "Standard Nabava" @@ -52095,8 +52128,8 @@ msgstr "Standard Ocenjeni Troškovi" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:493 -#: erpnext/stock/doctype/item/item.py:291 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2523 +#: erpnext/stock/doctype/item/item.py:296 erpnext/tests/utils.py:284 +#: erpnext/tests/utils.py:2524 msgid "Standard Selling" msgstr "Standard Prodaja" @@ -52199,7 +52232,7 @@ msgstr "Počni Ponovno Knjiženje" msgid "Start Time can't be greater than or equal to End Time for {0}." msgstr "Vrijeme Početka ne može biti veće ili jednako Vremenu Završetka za {0}." -#: erpnext/projects/doctype/timesheet/timesheet.js:62 +#: erpnext/projects/doctype/timesheet/timesheet.js:63 msgid "Start Timer" msgstr "Pokreni Brojanje Vremena" @@ -52324,7 +52357,7 @@ msgstr "Prikaz Statusa" msgid "Status and Reference" msgstr "Status i Referenca" -#: erpnext/projects/doctype/project/project.py:788 +#: erpnext/projects/doctype/project/project.py:818 msgid "Status must be Cancelled or Completed" msgstr "Status mora biti Poništen ili Dovršen" @@ -52413,7 +52446,7 @@ msgstr "Dostupne Zalihe" #. 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:170 +#: erpnext/stock/doctype/item/item.js:181 #: 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 @@ -52470,7 +52503,7 @@ msgstr "Zapisnik Zaključavanja Zaliha" msgid "Stock Delivered But Not Billed" msgstr "Zalihe Isporučene ali nisu Fakturisane" -#: erpnext/setup/doctype/company/company.py:217 +#: erpnext/setup/doctype/company/company.py:219 msgid "Stock Delivered But Not Billed Account cannot be changed or disabled since account {0} contains outstanding Delivery Notes: {1}" msgstr "Zalihe Dostavljene ali ne i Fakturisane Račun ne može se promijeniti ili deaktivirati jer račun {0} sadrži neizmirene Dostavnice: {1}" @@ -52508,7 +52541,6 @@ msgstr "Detalji Zaliha" #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Stock Entry" msgstr "Unos Zaliha" @@ -52555,6 +52587,18 @@ msgstr "Unos Zaliha {0} je stvoren" msgid "Stock Entry {0} is not submitted" msgstr "Unos Zaliha {0} nije podnešen" +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Company' +#: erpnext/setup/doctype/company/company.json +msgid "Stock Expense" +msgstr "" + +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Stock Expense Accounting" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:87 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:147 msgid "Stock Expenses" @@ -52577,7 +52621,7 @@ msgstr "Artikli Zaliha" #. 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:180 +#: erpnext/stock/doctype/item/item.js:191 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -52695,7 +52739,7 @@ msgstr "Planiranje Zaliha" #. Name of a report #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:190 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -52748,7 +52792,7 @@ msgstr "Zaliha Primljena, ali nije Fakturisana" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:137 #: erpnext/stock/workspace/stock/stock.json @@ -52767,7 +52811,7 @@ msgstr "Artikal Popisa Zaliha" msgid "Stock Reconciliation that revalues on-hand stock to this standard rate: auto-created when the rate is changed here, or the reconciliation that captured this rate (opening entry or rate change)." msgstr "Usklađivanje Zaliha koje revalorizira dostupne zalihe na ovu standardnu stopu: automatski se izradi kada se stopa ovdje promijeni ili usklađivanje koje je obuhvatilo ovu stopu (početni unos ili promjena stope)." -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 msgid "Stock Reconciliations" msgstr "Popisi Zaliha" @@ -52808,12 +52852,12 @@ msgstr "Postavke Ponovnog Knjiženja Zaliha" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:869 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:680 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1266 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1675 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1688 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1702 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1730 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1747 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1677 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1690 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1704 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1718 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1732 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1749 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/doctype/stock_settings/stock_settings.py:225 #: erpnext/stock/doctype/stock_settings/stock_settings.py:237 @@ -52826,7 +52870,7 @@ msgstr "Postavke Ponovnog Knjiženja Zaliha" msgid "Stock Reservation" msgstr "Rezervacija Zaliha" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1858 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1860 msgid "Stock Reservation Entries Cancelled" msgstr "Otkazani Unosi Rezervacije Zaliha" @@ -52834,7 +52878,7 @@ msgstr "Otkazani Unosi Rezervacije Zaliha" #: erpnext/manufacturing/doctype/production_plan/services/reservation.py:152 #: erpnext/manufacturing/doctype/work_order/services/reservation.py:597 #: erpnext/selling/doctype/sales_order/services/reservation.py:133 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1808 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1810 msgid "Stock Reservation Entries Created" msgstr "Izrađeni Unosi Rezervacija Zaliha" @@ -52861,7 +52905,7 @@ msgstr "Unos Rezervacije Zaliha ne može se ažurirati pošto je već dostavljen msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one." msgstr "Unos Rezervacije Zaliha izrađen naspram Liste Odabira ne može se ažurirati. Ako trebate napraviti promjene, preporučujemo da poništite postojeći unos i izradi novi." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:579 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:584 msgid "Stock Reservation Warehouse Mismatch" msgstr " Neusklađeno Skladišta Rezervacije Zaliha" @@ -52901,7 +52945,7 @@ msgstr "Rezervisana Količina Zaliha (u Jedinici Zaliha)" #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/item/item.js:486 +#: erpnext/stock/doctype/item/item.js:497 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:681 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -53138,15 +53182,15 @@ msgstr "Vrijednost zaliha i knjigovodstvena vrijednost nisu mogle biti usklađen msgid "Stock cannot be reserved in group warehouse {0}." msgstr "Zalihe se ne mogu rezervisati u grupnom skladištu {0}." -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1620 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1622 msgid "Stock cannot be reserved in the group warehouse {0}." msgstr "Zalihe se ne mogu rezervisati u grupnom skladištu {0}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:906 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:912 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "Zalihe se ne mogu ažurirati naspram sljedećih Dostavnica: {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:982 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:988 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "Zalihe se ne mogu ažurirati jer Faktura sadrži artikal direktne dostave. Onemogući 'Ažuriraj Zalihe' ili ukloni artikal direktne dostave." @@ -53210,11 +53254,11 @@ msgstr "Razlog Zastoja" msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "Zaustavljeni Radni Nalog se ne može otkazati, prvo ga prekini da biste otkazali" -#: erpnext/setup/doctype/company/company.py:452 +#: erpnext/setup/doctype/company/company.py:454 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:537 -#: erpnext/stock/doctype/item/item.py:329 -#: erpnext/stock/doctype/item/item.py:1776 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:334 +#: erpnext/stock/doctype/item/item.py:1781 erpnext/tests/utils.py:249 msgid "Stores" msgstr "Prodavnice" @@ -53328,12 +53372,8 @@ msgstr "Podizvođački Nalog" #. Name of a report #. Label of a Link in the Manufacturing Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontract Order Summary" msgstr "Sažetak Podizvođačkog Naloga" @@ -53351,16 +53391,14 @@ msgstr "Podizvođački Artikal" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Item To Be Received" msgstr "Podizvođački Artikal za Prijem" -#: erpnext/stock/doctype/material_request/material_request.js:224 +#: erpnext/stock/doctype/material_request/material_request.js:227 msgid "Subcontracted Purchase Order" msgstr "Podizvođački Nabavni Nalog" @@ -53376,12 +53414,10 @@ msgstr "Podizvođačka Količina" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Raw Materials To Be Transferred" msgstr "Podizvođačke Sirovine koje treba Prenijeti" @@ -53391,25 +53427,19 @@ msgstr "Podizvođačke Sirovine koje treba Prenijeti" #. 'Production Plan Sub Assembly Item' #. Label of a Card Break in the Manufacturing Workspace #. Option for the 'Purpose' (Select) field in DocType 'Material Request' -#. Name of a Workspace -#. Title of a Workspace Sidebar #: erpnext/desktop_icon/subcontracting.json #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:10 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting" msgstr "Podizvođač" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting BOM" msgstr "Sastavnica Podizvođača" @@ -53424,14 +53454,10 @@ msgstr "Faktor Konverzije Podizvođača" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/setup/setup_wizard/operations/install_fixtures.py:132 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:158 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Delivery" msgstr "Podizvođačka Dostava" @@ -53455,24 +53481,14 @@ msgstr "Podizvođačka Isporuka" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Name of a DocType -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/selling/doctype/sales_order/sales_order.js:1049 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Inward Order" msgstr "Podizvođački Nalog" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward Order Count" -msgstr "Broj unutrašnjih Podugovornih Naloga" - #. Label of the subcontracting_inward_order_item (Data) field in DocType 'Work #. Order' #. Name of a DocType @@ -53505,7 +53521,6 @@ msgstr "Servisni Artikal Podizvođačkog Naloga" #. Receipt Item' #. Label of the subcontracting_order (Link) field in DocType 'Subcontracting #. Receipt Supplied Item' -#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:370 #: erpnext/controllers/subcontracting_controller.py:1156 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -53515,7 +53530,6 @@ msgstr "Servisni Artikal Podizvođačkog Naloga" #: 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 msgid "Subcontracting Order" msgstr "Podizvođački Nalog" @@ -53549,18 +53563,6 @@ msgstr "Dostavljeni Artikal Podizvođačkog Naloga" msgid "Subcontracting Order {0} created." msgstr "Podizvođački Nalog {0} je izrađen." -#. Label of a chart in the Subcontracting Workspace -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order" -msgstr "Vanjski Podugovrni Nalog" - -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order Count" -msgstr "Broj Vanjskih Podugovornih Naloga" - #. Label of the purchase_order (Link) field in DocType 'Subcontracting Order' #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json msgid "Subcontracting Purchase Order" @@ -53576,8 +53578,6 @@ msgstr "Podizvođački Nabavni Nalog" #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' #. Name of a DocType -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json @@ -53585,8 +53585,6 @@ msgstr "Podizvođački Nabavni Nalog" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:637 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Receipt" msgstr "Podizvođački Račun" @@ -53702,7 +53700,6 @@ msgstr "Podnošenje radne kartice..." #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_subscription/process_subscription.json @@ -53717,7 +53714,6 @@ msgstr "Podnošenje radne kartice..." #: erpnext/selling/doctype/quotation/quotation_dashboard.py:12 #: erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py:25 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py:34 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription" msgstr "Pretplata" @@ -53752,10 +53748,8 @@ msgstr "Period Pretplate" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_plan/subscription_plan.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Plan" msgstr "Plan Pretplate" @@ -53781,7 +53775,6 @@ msgstr "Cjena Pretplate na osnovu" #: erpnext/accounts/doctype/subscription_settings/subscription_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/workspace_sidebar/erpnext_settings.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Settings" msgstr "Postavke Pretplate" @@ -53794,11 +53787,7 @@ msgstr "Datum Početka Pretplate" msgid "Subscription for Future dates cannot be processed." msgstr "Pretplata za buduće datume nemože se obraditi." -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/subscriptions/subscriptions.json #: erpnext/selling/doctype/customer/customer_dashboard.py:28 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscriptions" msgstr "Pretplate" @@ -53837,7 +53826,7 @@ msgstr "Uspješno Usaglašeno" msgid "Successfully Set Supplier" msgstr "Uspješno Postavljen Dobavljač" -#: erpnext/stock/doctype/item/item.py:409 +#: erpnext/stock/doctype/item/item.py:414 msgid "Successfully changed Stock UOM, please redefine conversion factors for new UOM." msgstr "Uspješno promijenjena Jedinica Zaliha, redefinirajte faktore konverzije za novu Jedinicu." @@ -53857,11 +53846,11 @@ msgstr "Uspješno uveženo {0} zapisa iz {1}. Klikni na izvezi redove s greškom msgid "Successfully imported {0} records." msgstr "Uspješno uveženo {0} zapisa." -#: erpnext/buying/doctype/supplier/supplier.js:243 +#: erpnext/buying/doctype/supplier/supplier.js:252 msgid "Successfully linked to Customer" msgstr "Uspješno povezan s Klijentom" -#: erpnext/selling/doctype/customer/customer.js:275 +#: erpnext/selling/doctype/customer/customer.js:284 msgid "Successfully linked to Supplier" msgstr "Uspješno povezan s Dobavljačem" @@ -54024,7 +54013,7 @@ msgstr "Dostavljena Količina" #: erpnext/public/js/purchase_trends_filters.js:63 #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/regional/report/irs_1099/irs_1099.py:76 -#: erpnext/selling/doctype/customer/customer.js:257 +#: erpnext/selling/doctype/customer/customer.js:266 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:187 #: erpnext/selling/doctype/sales_order/sales_order.js:1741 @@ -54043,7 +54032,6 @@ msgstr "Dostavljena Količina" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:524 #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Supplier" msgstr "Dobavljač" @@ -54321,7 +54309,7 @@ msgstr "Korisnici Portala Dobavljača" #: erpnext/buying/workspace/buying/buying.json #: erpnext/crm/doctype/opportunity/opportunity.js:81 #: erpnext/selling/doctype/quotation/quotation.json -#: erpnext/stock/doctype/material_request/material_request.js:208 +#: erpnext/stock/doctype/material_request/material_request.js:211 #: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation" msgstr "Ponuda Dobavljača" @@ -54577,7 +54565,7 @@ msgstr "Sinhronizacija Pokrenuta" msgid "Synchronize all accounts every hour" msgstr "Sinhronizuj sve račune svakih sat vremena" -#: erpnext/accounts/doctype/account/account.py:676 +#: erpnext/accounts/doctype/account/account.py:683 msgid "System In Use" msgstr "Sistem u Upotrebi" @@ -54625,9 +54613,7 @@ msgid "TDS / withholding tax category applied when paying this supplier" msgstr "Kategorija PDV koja se primjenjuje pri plaćanju ovog dobavljača" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.json -#: erpnext/workspace_sidebar/taxes.json msgid "TDS Computation Summary" msgstr "Pregled izračuna poreza po odbitku (TDS)." @@ -54782,7 +54768,7 @@ msgstr "Količina" #: 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:826 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:825 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "Ciljano Skladište" @@ -54902,7 +54888,7 @@ msgstr "PDV Račun" #. Label of the amount (Currency) field in DocType 'Item Wise Tax Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:244 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:91 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:101 msgid "Tax Amount" msgstr "PDV Iznos" @@ -54982,7 +54968,6 @@ msgstr "PDV Raspodjela" #. Label of the tax_category (Link) field in DocType 'Delivery Note' #. Label of the tax_category (Link) field in DocType 'Item Tax' #. Label of the tax_category (Link) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -55002,7 +54987,6 @@ msgstr "PDV Raspodjela" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Category" msgstr "Kategorija PDV-a" @@ -55041,7 +55025,7 @@ msgstr "Porezni Broj" #: erpnext/accounts/report/sales_register/sales_register.py:229 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:67 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:205 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:57 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:67 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Tax Id" @@ -55081,7 +55065,7 @@ msgid "Tax Rate" msgstr "PDV %" #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:237 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:84 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:94 msgid "Tax Rate %" msgstr "PDV %" @@ -55101,10 +55085,8 @@ msgstr "PDV Red" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Rule" msgstr "Pravila PDV-a" @@ -55163,7 +55145,6 @@ msgstr "Račun PDV Odbitka" #. Label of the tax_withholding_category (Link) field in DocType 'Lower #. Deduction Certificate' #. Label of the tax_withholding_category (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -55171,19 +55152,16 @@ msgstr "Račun PDV Odbitka" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:199 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:72 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:82 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Category" msgstr "Kategorija Odbitka PDV-a" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Details" msgstr "Detalji Odbitka PDV" @@ -55228,7 +55206,6 @@ msgstr "Unos Odbitka PDV-a" #. Rate' #. Label of the tax_withholding_group (Link) field in DocType 'Supplier' #. Label of the tax_withholding_group (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -55238,7 +55215,6 @@ msgstr "Unos Odbitka PDV-a" #: erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Group" msgstr "Grupa Odbitka PDV-a" @@ -55305,12 +55281,10 @@ msgstr "Tip PDV Dokumenta" #. Label of the taxes (Table) field in DocType 'POS Closing Entry' #. Label of the taxes_section (Section Break) field in DocType 'POS Profile' #. Label of the sb_1 (Section Break) field in DocType 'Subscription' -#. Name of a Workspace #. Label of a Desktop Icon #. Label of the taxes_section (Section Break) field in DocType 'Sales Order' #. Label of the taxes (Table) field in DocType 'Item Group' #. Label of the taxes (Table) field in DocType 'Item' -#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html:60 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -55318,10 +55292,10 @@ msgstr "Tip PDV Dokumenta" #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:12 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:27 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:43 -#: erpnext/accounts/workspace/taxes/taxes.json erpnext/desktop_icon/taxes.json +#: erpnext/desktop_icon/taxes.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/item_group/item_group.json -#: erpnext/stock/doctype/item/item.json erpnext/workspace_sidebar/taxes.json +#: erpnext/stock/doctype/item/item.json msgid "Taxes" msgstr "PDV" @@ -55444,7 +55418,7 @@ msgstr "Odbijeni PDV i Naknade" msgid "Taxes and Charges Deducted (Company Currency)" msgstr "Odbijeni PDV i Naknade (Valuta Poduzeća)" -#: erpnext/stock/doctype/item/item.py:422 +#: erpnext/stock/doctype/item/item.py:427 msgid "Taxes row #{0}: {1} cannot be smaller than {2}" msgstr "PDV red #{0}: {1} ne može biti manji od {2}" @@ -55495,7 +55469,7 @@ msgstr "Televizija" msgid "Template Item" msgstr "Artikal Predložak" -#: erpnext/stock/get_item_details.py:358 +#: erpnext/stock/get_item_details.py:357 msgid "Template Item Selected" msgstr "Odabrani Predložak Artikla" @@ -55618,7 +55592,6 @@ msgstr "Predložak Uslova" #. Name of a DocType #. Label of the terms (Text Editor) field in DocType 'Terms and Conditions' #. Label of the terms (Text Editor) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -55633,7 +55606,6 @@ msgstr "Predložak Uslova" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Terms and Conditions" msgstr "Odredbe i Uslovi" @@ -55877,7 +55849,7 @@ msgstr "Lista Odabira koja ima Unose Rezervacije Zaliha ne može se ažurirati. msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" msgstr "Količinski Gubitak Procesa je poništen prema Radnim Karticama Količinskog Gubitka Procesa" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1384 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1397 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" msgstr "Količinski Gubitak Procesa je poništen prema Radnim Karticama Količinskog Gubitka Procesa" @@ -55889,7 +55861,7 @@ msgstr "Prodavač je povezan sa {0}" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "Serijski Broj u redu #{0}: {1} nije dostupan u skladištu {2}." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2763 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2765 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "Serijski Broj {0} je rezervisan naspram {1} {2} i ne može se koristiti za bilo koju drugu transakciju." @@ -55897,7 +55869,7 @@ msgstr "Serijski Broj {0} je rezervisan naspram {1} {2} i ne može se koristiti msgid "The Serial Nos {0} have not been supplied against the {1} {2}" msgstr "Serijski Brojevi {0} nisu dostavljeni protiv {1} {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:959 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:972 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 "Serijski i Šaržni Paket {0} ne važi za ovu transakciju. 'Tip transakcije' bi trebao biti 'Vani' umjesto 'Unutra' u Serijskom i Šaržnom Paketu {0}" @@ -55933,9 +55905,9 @@ msgstr "Bankovni račun je onemogućen. Molimo omogućite ga" msgid "The bank account is not a company account. Please select a company account" msgstr "Bankovni račun nije račun poduzeća. Odaberi račun poduzeća" -#: erpnext/stock/services/serial_batch_bundle_service.py:654 -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 "Šarža {0} je već rezervisana u {1} {2}. Dakle, ne može se nastaviti sa {3} {4}, koja je izrađena za {5} {6}." +#: erpnext/stock/services/serial_batch_bundle_service.py:655 +msgid "The batch {0} is reserved for {1} in the warehouse {2} and the remaining quantity is not enough to cover the reservations. So, cannot proceed with the {3} {4}." +msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:41 msgid "The company {0} is not in South Africa. VAT Audit Report is only available for companies in South Africa." @@ -56002,7 +55974,7 @@ msgstr "Polje Za Dioničara ne može biti prazno" msgid "The field {0} in row {1} is not set" msgstr "Polje {0} u redu {1} nije postavljeno" -#: erpnext/stock/stock_ledger.py:445 +#: erpnext/stock/stock_ledger.py:475 msgid "The field {0} is required for reposting" msgstr "Polje {0} je obavezno za ponovno knjiženje" @@ -56031,7 +56003,7 @@ msgstr "Brojevi Folija nisu usklađeni" msgid "The following Items, having Putaway Rules, could not be accommodated:" msgstr "Sljedeći artikli, koji imaju Pravila Odlaganja na Stranu, nisu mogli biti primjenjene:" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:137 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:140 msgid "The following Purchase Invoices are not submitted:" msgstr "Sljedeće Nabavne Fakture nisu podnešene:" @@ -56047,7 +56019,7 @@ msgstr "Sljedeće šarže su istekle, obnovi zalihe:
    {0}" msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "Sljedeći otkazani unosi ponovnog objavljivanja postoje za {0}:

    {1}

    Molimo vas da izbrišete ove unose prije nego što nastavite." -#: erpnext/stock/doctype/item/item.py:953 +#: erpnext/stock/doctype/item/item.py:958 msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "Sljedeći izbrisani atributi postoje u varijantama, ali ne i u predlošku. Možete ili izbrisati Varijante ili zadržati Atribut(e) u predlošku." @@ -56065,11 +56037,11 @@ msgid "The following payment schedule(s) already exist:\n" msgstr "Sljedeći raspored(i) plaćanja već postoje:\n" "{0}" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:111 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:114 msgid "The following rows are duplicates:" msgstr "Sljedeći redovi su duplikati:" -#: erpnext/stock/doctype/material_request/material_request.py:566 +#: erpnext/stock/doctype/material_request/material_request.py:605 msgid "The following {0} were created: {1}" msgstr "Sljedeći {0} su izrađeni: {1}" @@ -56092,15 +56064,15 @@ msgstr "Praznik {0} nije između Od Datuma i Do Datuma" msgid "The invoice is not fully allocated as there is a difference of {0}." msgstr "Faktura nije u potpunosti dodijeljena jer postoji razlika od {0}." -#: erpnext/controllers/buying_controller.py:1244 +#: erpnext/controllers/buying_controller.py:1252 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "Artikal {item} nije označen kao {type_of} artikal. Možete ga omogućiti kao {type_of} Artikal u Postavkama Artikla." -#: erpnext/stock/doctype/item/item.py:679 +#: erpnext/stock/doctype/item/item.py:684 msgid "The items {0} and {1} are present in the following {2} :" msgstr "Artikli {0} i {1} se nalaze u sljedećem {2} :" -#: erpnext/controllers/buying_controller.py:1237 +#: erpnext/controllers/buying_controller.py:1245 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "Artikli {items} nisu označeni kao {type_of} artikli. Možete ih omogućiti kao {type_of} artikle u Postavkama Artikala." @@ -56116,7 +56088,7 @@ msgstr "Radna Kartica {0} je u {1} stanju i ne možete je ponovo pokrenuti." msgid "The last account row must not have any debit or credit amounts set." msgstr "Posljednji red računa ne smije imati postavljene iznose debita ili kredita." -#: erpnext/public/js/utils/barcode_scanner.js:533 +#: erpnext/public/js/utils/barcode_scanner.js:542 msgid "The last scanned warehouse has been cleared and won't be set in the subsequently scanned items" msgstr "Posljednje skenirano skladište je izbrisano i neće biti postavljeno u naredno skeniranim artiklima" @@ -56158,7 +56130,7 @@ msgstr "Originalnu fakturu treba objediniti prije ili zajedno sa povratnom faktu msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "Nepodmireni iznos {0} u {1} je manji od {2}. Ažurira se nepodmireni iznosa na ovoj fakturi." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:234 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:235 msgid "The parent account {0} does not exists in the uploaded template" msgstr "Nadređeni Rađun {0} ne postoji u otpremljenom predlošku" @@ -56221,7 +56193,7 @@ msgstr "Rezervisane Zalihe će biti puštene. Jeste li sigurni da želite nastav msgid "The root account {0} must be a group" msgstr "Kontna Klasa {0} mora biti grupa" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:87 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:88 msgid "The selected BOMs are not for the same item" msgstr "Odabrane Sastavnice nisu za istu artikal" @@ -56233,7 +56205,7 @@ msgstr "Odabrani račun povrata {0} ne pripada {1}." msgid "The selected item cannot have Batch" msgstr "Odabrani artikal ne može imati Šaržu" -#: erpnext/assets/doctype/asset/asset.js:662 +#: erpnext/assets/doctype/asset/asset.js:670 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 "Prodajna Količina je manja od ukupne količine imovine. Preostala količina će biti podijeljena u novu imovinu. Ova radnja se ne može poništiti.

    Želite li nastaviti?" @@ -56262,7 +56234,7 @@ msgstr "Dionice već postoje" msgid "The shares don't exist with the {0}" msgstr "Dionice ne postoje sa {0}" -#: erpnext/stock/stock_ledger.py:908 +#: erpnext/stock/stock_ledger.py:956 msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the
    documentation." msgstr "Zaliha za artikal {0} u {1} skladištu je bila negativna na {2}. Trebali biste izraditi pozitivan unos {3} prije datuma {4} i vremena {5} da biste knjižili ispravnu Stopu Vrednovanja. Za više detalja, molimo pročitaj dokumentaciju." @@ -56296,11 +56268,11 @@ msgstr "Zadatak je stavljen u red kao pozadinski posao. U slučaju da postoji bi 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 "Zadatak je stavljen u red kao pozadinski posao. U slučaju da postoji bilo kakav problem sa obradom u pozadini, sistem će dodati komentar o grešci na ovom usklađivanju zaliha i vratiti se na fazu Poslano" -#: erpnext/stock/doctype/material_request/material_request.py:352 +#: erpnext/stock/doctype/material_request/material_request.py:391 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}" msgstr "Ukupna količina izdavanja / prijenosa {0} u Materijalnom Nalogu {1} ne može biti veća od dozvoljene tražene količine {2} za artikal {3}" -#: erpnext/stock/doctype/material_request/material_request.py:359 +#: erpnext/stock/doctype/material_request/material_request.py:398 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "Ukupna količina Izdavanja / Prijenosa {0} u Materijalnom Nalogu {1} ne može biti veća od dozvoljene tražene količine {2} za artikal {3}" @@ -56368,11 +56340,11 @@ msgstr "{0} ({1}) mora biti jednako {2} ({3})" msgid "The {0} contains Unit Price Items." msgstr "{0} sadrži Artikle s Jediničnom Cjenom." -#: erpnext/stock/doctype/item/item.py:493 +#: erpnext/stock/doctype/item/item.py:498 msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error." msgstr "Prefiks {0} '{1}' već postoji. Molimo vas da promijenite serijski broj šarže, u suprotnom će biti grešku o dupliranom unosu." -#: erpnext/stock/doctype/material_request/material_request.py:572 +#: erpnext/stock/doctype/material_request/material_request.py:611 msgid "The {0} {1} created successfully" msgstr "{0} {1} je uspješno izrađen" @@ -56433,7 +56405,7 @@ msgstr "Za ovaj datum nema slobodnih termina" msgid "There are no transactions in the system for the selected bank account and dates that match the filters." msgstr "U sistemu nema transakcija za odabrani bankovni račun i datume koji odgovaraju filterima." -#: erpnext/stock/doctype/item/item.js:1591 +#: erpnext/stock/doctype/item/item.js:1608 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 "Postoje dvije opcije za održavanje vrijednosti artikal. FIFO (prvi ušao - prvi izašao) i Pokretni Prosijek. Da biste detaljno razumjeli ovu temu, posjetite Vrednovanje Artikla, FIFO i Pokretni Prosijek." @@ -56469,7 +56441,7 @@ msgstr "Nije pronađena Šarža naspram {0}: {1}" msgid "There is one unreconciled transaction before {0}." msgstr "Postoji jedna neusklađena transakcija prije {0}." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:896 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:909 msgid "There must be at least 1 Finished Good in this Stock Entry" msgstr "U ovom Unosu Zaliha mora biti najmanje jedan gotov proizvod" @@ -56517,11 +56489,11 @@ msgstr "Račun ima stanje '0' u Osnovnoj Valuti ili u Valuti Računa" msgid "This Fiscal Year" msgstr "Ove Fiskalne Godine" -#: erpnext/stock/doctype/item/item.js:224 +#: erpnext/stock/doctype/item/item.js:235 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 "Ovaj Artikal je predložak i ne može se koristiti u transakcijama.
    Sva polja prisutna u tabeli 'Kopiraj polja u varijantu' u Postavkama Varijante Artikla bit će kopirana u njene varijante." -#: erpnext/stock/doctype/item/item.js:281 +#: erpnext/stock/doctype/item/item.js:292 msgid "This Item is a Variant of {0} (Template)." msgstr "Artikal je Varijanta {0} (Predložak)." @@ -56648,7 +56620,7 @@ msgstr "Ovo je osnovna grupa klijenata i ne može se uređivati." msgid "This is a root department and cannot be edited." msgstr "Ovo je Matični odjel i ne može se uređivati." -#: erpnext/setup/doctype/item_group/item_group.js:98 +#: erpnext/setup/doctype/item_group/item_group.js:115 msgid "This is a root item group and cannot be edited." msgstr "Ovo je Nadređena Grupa Artikala i ne može se uređivati." @@ -56688,7 +56660,7 @@ msgstr "Ovo je urađeno da se omogući Knjigovodstvo za zahtjeve kada se Nabavni 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 "Ovo je standard omogućeno. Ako želite da planirate materijale za podsklopove artikla koji proizvodite, ostavite ovo omogućeno. Ako planirate i proizvodite podsklopove zasebno, možete onemogućiti ovo polje." -#: erpnext/stock/doctype/item/item.js:1579 +#: erpnext/stock/doctype/item/item.js:1596 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 "Ovo se odnosi na artikle sirovina koje će se koristiti za izradu gotovog proizvoda. Ako je artikal dodatna usluga kao što je 'povrat' koja će se koristiti u Sastavnici, ne odaberi ovo." @@ -56771,7 +56743,7 @@ msgstr "Ovaj raspored je izrađen kada je imovina {0} prilagođena kroz Podešav msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "Ovaj raspored je izrađen kada je imovina {0} potrošena kroz kapitalizaciju imovine {1}." -#: erpnext/assets/doctype/asset_repair/asset_repair.py:328 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:331 msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "Ovaj raspored je izrađen kada je imovina {0} popravljena putem Popravka Imovine {1}." @@ -57338,7 +57310,7 @@ msgstr "Za Skladište (Opcija)" msgid "To add Operations tick the 'With Operations' checkbox." msgstr "Da biste dodali Radnje, odaberi polje 'S Radnjima'." -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:770 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:768 msgid "To add subcontracted Item's raw materials if include exploded items is disabled." msgstr "Da se doda podizvođačka sirovina artikala ako je Uključi Rastavljene Artikle onemogućeno." @@ -57382,7 +57354,7 @@ msgstr "Za izradu Zahtjeva Plaćanja obavezan je referentni dokument" msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" msgstr "Da biste omogućili knjigovodstvo nedovršenih kapitalnih radova, morate odabrati Račun nedovršenih kapitalnih radova u tabeli računa" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:763 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:761 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "Uključivanje artikala bez zaliha u planiranje Materijalnog Naloga. tj. artikle za koje je 'Održavanje Zaliha'.polje poništeno." @@ -57397,7 +57369,7 @@ msgstr "Za uključivanje troškova podsklopova i sekundarnih artikala u gotove p msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "Da biste uključili PDV u red {0} u cjenu artikla, PDV u redovima {1} također moraju biti uključeni" -#: erpnext/stock/doctype/item/item.py:701 +#: erpnext/stock/doctype/item/item.py:706 msgid "To merge, following properties must be same for both items" msgstr "Za spajanje, sljedeća svojstva moraju biti ista za oba artikla" @@ -57657,10 +57629,6 @@ msgstr "Ukupna Imovina" msgid "Total Asset Cost" msgstr "Ukupni Trošak Imovine" -#: erpnext/assets/dashboard_fixtures.py:158 -msgid "Total Assets" -msgstr "Ukupna Imovina" - #. Label of the total_billable_amount (Currency) field in DocType 'Timesheet' #: erpnext/projects/doctype/timesheet/timesheet.json msgid "Total Billable Amount" @@ -58172,7 +58140,7 @@ msgstr "Ukupno Zadataka" msgid "Total Tax" msgstr "Ukupno PDV" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:86 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:96 msgid "Total Taxable Amount" msgstr "Ukupan Oporezivi Iznos" @@ -58336,7 +58304,7 @@ msgstr "Ukupno vrijeme rada na Radnoj Stanici (u Satima)" msgid "Total allocated percentage for sales team should be 100" msgstr "Ukupna postotna dodjela za prodajni tim treba biti 100" -#: erpnext/selling/doctype/customer/customer.py:197 +#: erpnext/selling/doctype/customer/customer.py:205 msgid "Total contribution percentage should be equal to 100" msgstr "Ukupan procenat doprinosa treba da bude jednak 100" @@ -58495,7 +58463,7 @@ msgstr "Datum Transakcije" msgid "Transaction Dates" msgstr "Datumi Transakcija" -#: erpnext/setup/doctype/company/company.py:1140 +#: erpnext/setup/doctype/company/company.py:1142 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "Dokument Brisanju Transakcije {0} je pokrenut za {1}" @@ -58676,10 +58644,11 @@ msgstr "Godišnja Historija Transakcije" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "Transakcije naspram Poduzeća već postoje! Kontni Plan se može uvesti samo za poduzeće bez transakcija." -#. Description of the 'Credit Limit' (Table) field in DocType 'Customer' +#. Description of the 'Credit & Overdue Limits' (Table) field in DocType +#. 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Transactions are blocked or warned when outstanding balance exceeds this amount." -msgstr "Transakcije se blokiraju ili upozoravaju kada nepodmireni saldo premaši ovaj iznos." +msgid "Transactions are blocked when the outstanding balance exceeds the credit limit. When the overdue billing setting is enabled, new invoices are also blocked when the customer's overdue amount exceeds the overdue billing threshold." +msgstr "" #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:239 msgid "Transactions to be imported into the system" @@ -58720,7 +58689,7 @@ msgstr "Prijenos" msgid "Transfer Account" msgstr "Račun Prijenosa" -#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:168 msgid "Transfer Asset" msgstr "Prijenos Imovine" @@ -58730,7 +58699,7 @@ msgstr "Prijenos Imovine" msgid "Transfer Extra Raw Materials to WIP (%)" msgstr "Prijenos dodatnih sirovina u Posao U Toku (%)" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:485 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:483 msgid "Transfer From Warehouses" msgstr "Prijenos iz Skladišta" @@ -58748,7 +58717,7 @@ msgstr "Prenesi Materijal Naspram" msgid "Transfer Materials" msgstr "Prenesi Materijal" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:479 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:477 msgid "Transfer Materials For Warehouse {0}" msgstr "Prijenos Materijala za Skladište {0}" @@ -58827,7 +58796,7 @@ msgstr "Preneseno u" msgid "Transit" msgstr "Tranzit" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:611 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:610 msgid "Transit Entry" msgstr "Unos Tranzita" @@ -59161,7 +59130,7 @@ msgstr "Postavke PDV-a UAE" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:101 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:87 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:92 #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/item_where_used/item_where_used.py:69 #: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:60 @@ -59227,7 +59196,7 @@ msgstr "Detalji Jedinice Konverzije" msgid "UOM Conversion Factor" msgstr "Faktor Konverzije Jedinice" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:520 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:526 msgid "UOM Conversion factor ({0} -> {1}) not found for item: {2}" msgstr "Faktor Konverzije Jedinice({0} -> {1}) nije pronađen za artikal: {2}" @@ -59246,7 +59215,7 @@ msgstr "Standard Vrijednosti Jedinice " msgid "UOM Name" msgstr "Naziv Jedinice" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1693 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1728 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "Faktor Konverzije je obavezan za Jedinicu: {0} za Artikal: {1}" @@ -59439,7 +59408,7 @@ msgstr "Jedinica Mjere" msgid "Unit of Measure (UOM)" msgstr "Jedinica Mjere" -#: erpnext/stock/doctype/item/item.py:454 +#: erpnext/stock/doctype/item/item.py:459 msgid "Unit of Measure {0} has been entered more than once in Conversion Factor Table" msgstr "Jedinica mjere {0} je unesena više puta u Tablicu Faktora Konverzije" @@ -59543,7 +59512,6 @@ msgstr "Poništi Usklađivanje" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Unreconcile Payment" @@ -59607,7 +59575,7 @@ msgstr "Poništi rezervacija za Podsklop" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:552 -#: erpnext/stock/doctype/pick_list/pick_list.js:321 +#: erpnext/stock/doctype/pick_list/pick_list.js:322 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:389 msgid "Unreserving Stock..." msgstr "Otkazivanje Zaliha u toku..." @@ -59884,7 +59852,7 @@ msgstr "Ažurirani {0} red(ovi) finansijskog izvještaja s novim nazivom kategor msgid "Updating Costing and Billing fields against this Project..." msgstr "Ažuriranje Troškova i Fakturisanje za Projekat..." -#: erpnext/stock/doctype/item/item.py:1541 +#: erpnext/stock/doctype/item/item.py:1546 msgid "Updating Variants..." msgstr "Ažuriranje Varijanti u toku..." @@ -60082,7 +60050,7 @@ msgstr "Koristi Prijedlog" msgid "Use Transaction Date Exchange Rate" msgstr "Koristi Devizni Kurs Datuma Transakcije" -#: erpnext/projects/doctype/project/project.py:639 +#: erpnext/projects/doctype/project/project.py:669 msgid "Use a name that is different from previous project name" msgstr "Koristite naziv koji se razlikuje od naziva prethodnog projekta" @@ -60127,6 +60095,12 @@ msgstr "Koristi se za transakcije između poduzeća" msgid "Used for items valued at Standard Cost: the difference between the purchase price and the standard rate is booked here." msgstr "Koristi se za artikle vrednovane po Standardnim Troškovima: ovdje se knjiži razlika između nabavne i standardne cjene." +#. Description of the 'Expenses Added To Stock Contra Account' (Link) field in +#. DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Used to balance the books when recording expenses added to stock" +msgstr "" + #. Description of the 'Purchase Expense Contra Account' (Link) field in DocType #. 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json @@ -60233,6 +60207,12 @@ msgstr "Korisnicima sa ovom ulogom je dozvoljeno da fakturišu iznad procentualn msgid "Users with this role are allowed to over deliver/receive against orders above the allowance percentage" msgstr "Korisnicima sa ovom ulogom je dozvoljena prekomjerna Dostava/Primanje naspram narudžbi iznad procentualnog odobrenja" +#. Description of the 'Role allowed to bypass overdue billing limit' (Link) +#. field in DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Users with this role can still submit invoices for customers over their overdue billing threshold." +msgstr "" + #. Description of the 'Role to Notify on Depreciation Failure' (Link) field in #. DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -60448,7 +60428,7 @@ msgstr "Tip Polja Vrijednovanja" msgid "Valuation Method" msgstr "Metoda Vrijednovanja" -#: erpnext/stock/doctype/item/item.py:1074 +#: erpnext/stock/doctype/item/item.py:1079 msgid "Valuation Method cannot be changed to or from 'Standard Cost' for {0} because stock transactions already exist for it." msgstr "Metoda vrednovanja se ne može promijeniti u ili iz 'Standardni Trošak' za {0} jer za nju već postoje transakcije zaliha." @@ -60485,7 +60465,7 @@ msgstr "Metoda Vrednovanja Artikla {0} mora biti postavljena na 'Standardni Tro #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json -#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:976 +#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:993 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json @@ -60493,7 +60473,7 @@ msgstr "Metoda Vrednovanja Artikla {0} mora biti postavljena na 'Standardni Tro #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:164 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:90 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:68 #: erpnext/stock/report/stock_balance/stock_balance.py:563 @@ -60504,19 +60484,19 @@ msgstr "Procijenjena Vrijednost" msgid "Valuation Rate (In / Out)" msgstr "Stopa Vrednovnja (Ulaz / Izlaz)" -#: erpnext/stock/stock_ledger.py:2161 +#: erpnext/stock/stock_ledger.py:2209 msgid "Valuation Rate Missing" msgstr "Nedostaje Stopa Vrednovanja" -#: erpnext/stock/doctype/item/item.py:1652 +#: erpnext/stock/doctype/item/item.py:1657 msgid "Valuation Rate cannot be negative." msgstr "Stopa Vrednovanja ne može biti negativna." -#: erpnext/stock/stock_ledger.py:2139 +#: erpnext/stock/stock_ledger.py:2187 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "Stopa Vrednovanja za artikal {0}, je obavezna za knjigovodstvene unose za {1} {2}." -#: erpnext/stock/doctype/item/item.py:316 +#: erpnext/stock/doctype/item/item.py:321 msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "Procijenjano Vrijednovanje je obavezno ako se unese Početna Zaliha" @@ -60674,13 +60654,13 @@ msgstr "Odstupanje" msgid "Variance ({})" msgstr "Odstupanje ({})" -#: erpnext/stock/doctype/item/item.js:271 +#: erpnext/stock/doctype/item/item.js:282 #: erpnext/stock/doctype/item/item_list.js:61 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" msgstr "Varijanta" -#: erpnext/stock/doctype/item/item.py:968 +#: erpnext/stock/doctype/item/item.py:973 msgid "Variant Attribute Error" msgstr "Greška Atributa Varijante" @@ -60699,11 +60679,11 @@ msgstr "Varijanta Sastavnice" msgid "Variant Based On" msgstr "Varijanta zasnovana na" -#: erpnext/stock/doctype/item/item.py:996 +#: erpnext/stock/doctype/item/item.py:1001 msgid "Variant Based On cannot be changed" msgstr "Varijanta zasnovana na nemože se promijeniti" -#: erpnext/stock/doctype/item/item.js:247 +#: erpnext/stock/doctype/item/item.js:258 msgid "Variant Details Report" msgstr "Izvještaj Detalja Varijante" @@ -60717,7 +60697,7 @@ msgstr "Polje Varijante" msgid "Variant Item" msgstr "Varijanta Artikla" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Variant Items" msgstr "Varijanta Artikli" @@ -60728,7 +60708,7 @@ msgstr "Varijanta Artikli" msgid "Variant Of" msgstr "Varijanta od" -#: erpnext/stock/doctype/item/item.js:1264 +#: erpnext/stock/doctype/item/item.js:1281 msgid "Variant creation has been queued." msgstr "Izrada varijante je stavljeno u red čekanja." @@ -61389,7 +61369,7 @@ msgstr "Skladište je obavezno za preuzimanje artikala gotovih proizvoda" msgid "Warehouse not found against the account {0}" msgstr "Skladište nije pronađeno naspram računu {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:896 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:902 #: erpnext/stock/doctype/delivery_note/delivery_note.py:401 msgid "Warehouse required for stock Item {0}" msgstr "Skladište je obavezno za artikal zaliha {0}" @@ -61403,7 +61383,7 @@ msgstr "Starost i Vrijednost stanja artikla u Skladištu" msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "Skladište {0} se ne može izbrisati jer postoji količina za artikal {1}" -#: erpnext/stock/doctype/item/item.py:1657 +#: erpnext/stock/doctype/item/item.py:1662 #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:67 msgid "Warehouse {0} does not belong to Company {1}." msgstr "Skladište {0} ne pripada {1}." @@ -61420,7 +61400,7 @@ msgstr "Skladište {0} ne postoji" msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "Skladište {0} nije dozvoljeno za Prodajni Nalog {1}, trebalo bi da bude {2}" -#: erpnext/stock/services/base_stock_gl_composer.py:147 +#: erpnext/stock/services/base_stock_gl_composer.py:154 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 "Skladište {0} nije povezano ni sa jednim računom, navedi račun u zapisu skladišta ili postavi standard račun zaliha u {1}." @@ -61430,7 +61410,7 @@ msgstr "Skladište: {0} ne pripada {1}" #. Label of the warehouses (Table MultiSelect) field in DocType 'Production #. Plan' -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:555 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:553 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/stock/report/stock_balance/stock_balance.js:76 #: erpnext/stock/report/stock_ledger/stock_ledger.js:30 @@ -61533,7 +61513,7 @@ msgstr "Upozori ili zaustavi ako se cjena artikla promijeni u fakturi ili potvrd msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "Upozorenje - Red {0}: Sati naplate su više od stvarnih sati" -#: erpnext/stock/stock_ledger.py:918 +#: erpnext/stock/stock_ledger.py:966 msgid "Warning on Negative Stock" msgstr "Upozorenje na Negativnu Zalihu" @@ -61549,7 +61529,7 @@ msgstr "Upozorenje: Račun je promijenjen za skladište" msgid "Warning: Another {0} # {1} exists against stock entry {2}" msgstr "Upozorenje: Još jedan {0} # {1} postoji naspram unosa zaliha {2}" -#: erpnext/stock/doctype/material_request/material_request.js:534 +#: erpnext/stock/doctype/material_request/material_request.js:535 msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "Upozorenje: Količina Materijalnog Naloga je manja od Minimalne Količine Nabavnog Naloga" @@ -61845,7 +61825,7 @@ msgstr "Kada je odabrano, prag transakcije će se primjenjivati samo za pojedina 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 "Kada je odabrano, sistem će za imenovanje dokumenta koristiti datum i vrijeme registracije dokumenta umjesto datuma i vremena izrade dokumenta." -#: erpnext/stock/doctype/item/item.js:1598 +#: erpnext/stock/doctype/item/item.js:1615 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "Kada izradi artikal, unosom vrijednosti za ovo polje automatski će se izraditi Cjena Artikla u pozadini." @@ -62011,7 +61991,7 @@ msgstr "Rad Završen" #: erpnext/assets/doctype/asset/asset_list.js:12 #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json -#: erpnext/setup/doctype/company/company.py:453 +#: erpnext/setup/doctype/company/company.py:455 #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Work In Progress" msgstr "Radovi u Toku" @@ -62053,9 +62033,9 @@ msgstr "Radne Upute" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/public/js/shop_floor/shop_floor.js:230 #: erpnext/selling/doctype/sales_order/sales_order.js:1094 -#: erpnext/stock/doctype/material_request/material_request.js:216 +#: erpnext/stock/doctype/material_request/material_request.js:219 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:573 +#: erpnext/stock/doctype/material_request/material_request.py:612 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -62135,7 +62115,7 @@ msgstr "Sažetak Radnog Naloga" msgid "Work Order Summary Report" msgstr "Sažetka Izvještaja Radnog Naloga" -#: erpnext/stock/doctype/material_request/material_request.py:579 +#: erpnext/stock/doctype/material_request/material_request.py:618 msgid "Work Order cannot be created for the following reason:
    {0}" msgstr "Radni Nalog se ne može izraditi iz sljedećeg razloga:
    {0}" @@ -62169,7 +62149,7 @@ msgid "Work Order {0} must be submitted" msgstr "Radni Nalog {0} mora biti podnešen" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:567 +#: erpnext/stock/doctype/material_request/material_request.py:606 msgid "Work Orders" msgstr "Radni Nalozi" @@ -62334,7 +62314,7 @@ msgstr "Radne Stanice" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:736 +#: erpnext/setup/doctype/company/company.py:738 msgid "Write Off" msgstr "Otpis" @@ -62503,6 +62483,10 @@ msgstr "Niste ovlašteni da vršite/uredite transakcije zaliha za artikal {0} u msgid "You are not authorized to set Frozen value" msgstr "Niste ovlašteni za postavljanje Zatvorene vrijednosti" +#: erpnext/stock/doctype/company_restriction/company_restriction.py:93 +msgid "You are not permitted to add or remove Company {0} in Allowed Companies" +msgstr "" + #: erpnext/stock/doctype/pick_list/pick_list.py:544 msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}." msgstr "Birate više od potrebne količine za artikal {0}. Provjeri postoji li neka druga lista odabira izrađena za prodajni nalog {1}." @@ -62523,7 +62507,7 @@ msgstr "Takođe možete kopirati i zalijepiti ovu vezu u svoj pretraživač" msgid "You can also set default CWIP account in Company {0}" msgstr "Također možete postaviti standard Račun Kapitalnog Posla u Toku za {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:767 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "Možete promijeniti nadređeni račun u račun Bilansa Stanja ili odabrati drugi račun." @@ -62600,7 +62584,7 @@ msgstr "Ne možete izbrisati tip projekta 'Eksterni'" msgid "You cannot edit the root node." msgstr "Ne možete uređivati korijenski čvor." -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:205 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "Ne možete omogućiti i '{0}' i '{1} postavke." @@ -62620,7 +62604,7 @@ msgstr "Ne možete obraditi serijski broj {0} jer je već korišten u Serijskom msgid "You cannot redeem more than {0}." msgstr "Ne možete iskoristiti više od {0}." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:220 msgid "You cannot repost item valuation before {0}" msgstr "Ne možete ponovo knjižiti procjenu vrijednosti artikla prije {0}" @@ -62636,7 +62620,7 @@ msgstr "Ne možete podnijeti prazan nalog." msgid "You cannot submit the order without payment." msgstr "Ne možete podnijeti nalog bez plaćanja." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:974 msgid "You cannot update stock for a Debit Note. A Debit Note is a financial document that should not affect inventory. Please disable 'Update Stock'." msgstr "Ne možete ažurirati zalihe za debitnu notu. Debitna nota je finansijski dokument koji ne bi trebao utjecati na zalihe. Molimo vas da onemogućite opciju 'Ažuriraj Zalihe'." @@ -62693,7 +62677,7 @@ msgstr "Imali ste {0} grešaka prilikom izrade početnih faktura. Pogledaj {1} z msgid "You have already selected items from {0} {1}" msgstr "Već ste odabrali artikle iz {0} {1}" -#: erpnext/projects/doctype/project/project.py:420 +#: erpnext/projects/doctype/project/project.py:422 msgid "You have been invited to collaborate on the project {0}." msgstr "Pozvani ste da sarađujete na projektu {0}." @@ -62717,7 +62701,7 @@ msgstr "Niste dodali nijedan bankovni račun poduzeća." msgid "You have not performed any reconciliations in this session yet." msgstr "Još niste izvršili nijedno usklađivanje u ovoj sesiji." -#: erpnext/stock/doctype/item/item.py:1215 +#: erpnext/stock/doctype/item/item.py:1220 msgid "You have to enable auto re-order in Stock Settings to maintain re-order levels." msgstr "Morate omogućiti automatsko ponovno naručivanje u Postavkama Zaliha kako biste održali nivoe ponovnog naručivanja." @@ -62819,7 +62803,7 @@ msgstr "[Važno] [ERPNext] Greške Automatskog Preuređenja" msgid "`Allow Negative rates for Items`" msgstr "`Dozvoli negativne cjene za Artikle`" -#: erpnext/stock/stock_ledger.py:2153 +#: erpnext/stock/stock_ledger.py:2201 msgid "after" msgstr "poslije" @@ -62856,7 +62840,7 @@ msgid "by {}" msgstr "od {}" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:338 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:840 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:846 msgid "dated {0}" msgstr "datirano {0}" @@ -62990,7 +62974,7 @@ msgstr "od 5 mogućih" msgid "paid to" msgstr "plaćeno" -#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:51 +#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:78 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "aplikacija za plaćanja nije instalirana. Instaliraj s {0} ili {1}" @@ -63007,7 +62991,7 @@ msgstr "aplikacija za plaćanja nije instalirana. Instaliraj s {0} ili {1}" msgid "per hour" msgstr "po satu" -#: erpnext/stock/stock_ledger.py:2154 +#: erpnext/stock/stock_ledger.py:2202 msgid "performing either one below:" msgstr "izvodi bilo koje dolje:" @@ -63102,7 +63086,7 @@ msgstr "naziv" msgid "to" msgstr "do" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1259 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1265 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "da poništite iznos ove povratne fakture prije nego što je poništite." @@ -63187,7 +63171,7 @@ msgstr "{0} Korišteni kupon je {1}. Dozvoljena količina je iskorištena" msgid "{0} Digest" msgstr "{0} Sažetak" -#: erpnext/accounts/utils.py:1591 +#: erpnext/accounts/utils.py:1585 msgid "{0} Number {1} is already used in {2} {3}" msgstr "{0} Broj {1} se već koristi u {2} {3}" @@ -63199,11 +63183,11 @@ msgstr "Operativni trošak {0} za radnju {1}" msgid "{0} Operations: {1}" msgstr "{0} Radnje: {1}" -#: erpnext/stock/doctype/material_request/material_request.py:232 +#: erpnext/stock/doctype/material_request/material_request.py:271 msgid "{0} Request for {1}" msgstr "{0} Zahtjev za {1}" -#: erpnext/stock/doctype/item/item.py:393 +#: erpnext/stock/doctype/item/item.py:398 msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "{0} Zadržani Uzorak se zasniva na Šarži, provjeri Ima Broj Šarže da zadržite uzorak artikla" @@ -63253,6 +63237,9 @@ msgstr "{0} već ima nadređenu proceduru {1}." #: erpnext/accounts/report/general_ledger/general_ledger.py:63 #: erpnext/accounts/report/pos_register/pos_register.py:120 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:28 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:35 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:42 msgid "{0} and {1} are mandatory" msgstr "{0} i {1} su obavezni" @@ -63276,7 +63263,7 @@ msgstr "{0} se ne može otkazati jer su zarađeni bodovi lojalnosti iskorišteni msgid "{0} cannot be changed with opened Opening Entries." msgstr "{0} se ne može mijenjati s otvorenim Početnim Unosima." -#: erpnext/public/js/utils/sales_common.js:336 +#: erpnext/public/js/utils/sales_common.js:334 msgid "{0} cannot be greater than 100" msgstr "{0} ne može biti veće od 100" @@ -63293,7 +63280,7 @@ msgid "{0} completed job cards" msgstr "{0} završenih radnih kartica" #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:137 -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:199 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:214 #: erpnext/stock/doctype/pick_list/mapper.py:79 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:323 msgid "{0} created" @@ -63303,11 +63290,11 @@ msgstr "{0} izrađeno" msgid "{0} creation for the following records will be skipped." msgstr "Izrada {0} za sljedeće zapise će biti preskočeno." -#: erpnext/setup/doctype/company/company.py:364 +#: erpnext/setup/doctype/company/company.py:366 msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "{0} valuta mora biti ista kao standard valuta poduzeća. Odaberi drugi račun." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:287 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "{0} trenutno ima {1} Dobavljačko Bodovno stanje, i Nabavne Naloge ovom dobavljaču treba izdavati s oprezom." @@ -63323,6 +63310,14 @@ msgstr "{0} ne pripada {1}" msgid "{0} does not belong to the Company {1}." msgstr "{0} ne pripada {1}." +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:100 +msgid "{0} doesn't belong to Company {1}. Please select a Cost Center that belongs to Company {1}." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:57 +msgid "{0} doesn't belong to Company {1}. Please select an Income Account that belongs to Company {1}." +msgstr "" + #: erpnext/public/js/templates/shop_floor_template.html:880 msgid "{0} draft job cards awaiting submission" msgstr "{0} nacrta radnih kartica koje čekaju na podnošenje" @@ -63332,7 +63327,7 @@ msgid "{0} entered twice in Item Tax" msgstr "{0} uneseno dvaput u PDV Artikla" #: erpnext/setup/doctype/item_group/item_group.py:47 -#: erpnext/stock/doctype/item/item.py:524 +#: erpnext/stock/doctype/item/item.py:529 msgid "{0} entered twice {1} in Item Taxes" msgstr "{0} uneseno dvaput {1} u PDV Artikla" @@ -63373,6 +63368,14 @@ msgstr "{0} je podređeno poduzeće." msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "{0} je podređena tabela i biće automatski izbrisana zajedno sa svojom nadređenom tabelom" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:114 +msgid "{0} is a group Cost Center. Please select a non-group Cost Center." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:78 +msgid "{0} is a group account. Please select a non-group Income Account." +msgstr "" + #: erpnext/accounts/doctype/pos_profile/pos_profile.py:95 msgid "{0} is a mandatory Accounting Dimension.
    Please set a value for {0} in Accounting Dimensions section." msgstr "{0} je obavezna knjigovodstvena dimenzija.
    Postavi vrijednost za {0} u sekciji Knjigovodstvene Dimenzije." @@ -63395,11 +63398,19 @@ msgstr "{0} već radi za {1}" msgid "{0} is blocked so this transaction cannot proceed" msgstr "{0} je blokiran tako da se ova transakcija ne može nastaviti" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:64 +msgid "{0} is disabled. Please select a valid Income Account." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:107 +msgid "{0} is disabled. Please select an enabled Cost Center." +msgstr "" + #: erpnext/assets/doctype/asset/asset.py:514 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "{0} je u Nacrtu. Podnesi prije izrade Imovine." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:865 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:871 msgid "{0} is mandatory for Item {1}" msgstr "{0} je obavezan za artikal {1}" @@ -63420,7 +63431,7 @@ msgstr "{0} je obavezan. Možda zapis o razmjeni valuta nije izrađen za {1} do msgid "{0} is not a CSV file." msgstr "{0} nije CSV datoteka." -#: erpnext/selling/doctype/customer/customer.py:239 +#: erpnext/selling/doctype/customer/customer.py:251 msgid "{0} is not a company bank account" msgstr "{0} nije bankovni račun poduzeća" @@ -63452,6 +63463,10 @@ msgstr "{0} nije važeći naziv polja {1}." msgid "{0} is not added in the table" msgstr "{0} nije dodan u tabelu" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:71 +msgid "{0} is not an Income Account. Please select a valid Income Account." +msgstr "" + #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:146 msgid "{0} is not enabled in {1}" msgstr "{0} nije omogućen u {1}" @@ -63460,11 +63475,11 @@ msgstr "{0} nije omogućen u {1}" msgid "{0} is not running. Cannot trigger events for this document" msgstr "{0} se ne izvršava. Nije moguće pokrenuti događaje za ovaj dokument" -#: erpnext/stock/doctype/material_request/material_request.py:478 +#: erpnext/stock/doctype/material_request/material_request.py:517 msgid "{0} is not the default supplier for any items." msgstr "{0} nije standard dobavljač za bilo koji artikal." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2689 msgid "{0} is on hold until {1}" msgstr "{0} je na čekanju do {1}" @@ -63504,6 +63519,10 @@ msgstr "{0} artikala za povrat" msgid "{0} job cards awaiting Manufacture entry" msgstr "{0} radnih kartica koje čekaju na Unos Proizvodnje" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:144 +msgid "{0} languages are marked as default languages. Please select only one of them." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.py:160 msgid "{0} must be a group warehouse." msgstr "{0} mora biti grupno skladište." @@ -63557,11 +63576,11 @@ msgstr "{0} transakcija će biti uvezeno u sistem. Molimo Vas da pregledate deta msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "{0} jedinica je rezervisano za artikal {1} u Skladištu {2}, poništi rezervaciju iste za {3} Popis Zaliha." -#: erpnext/stock/doctype/pick_list/pick_list.py:1127 +#: erpnext/stock/doctype/pick_list/pick_list.py:1136 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "{0} jedinica artikla {1} nije dostupan ni u jednom od skladišta." -#: erpnext/stock/doctype/pick_list/pick_list.py:1120 +#: erpnext/stock/doctype/pick_list/pick_list.py:1129 msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "{0} jedinica artikla {1} nije dostupno ni u jednom skladištu. Za ovaj artikal postoje druge liste odabira." @@ -63569,16 +63588,16 @@ msgstr "{0} jedinica artikla {1} nije dostupno ni u jednom skladištu. Za ovaj a msgid "{0} units of {1} are required in {2} with the inventory dimension: {3} on {4} {5} for {6} to complete the transaction." msgstr "{0} jedinica od {1} su potrebne u {2} sa dimenzijom inventara: {3} na {4} {5} za {6} da bi se transakcija završila." -#: erpnext/stock/stock_ledger.py:1800 erpnext/stock/stock_ledger.py:2325 -#: erpnext/stock/stock_ledger.py:2339 +#: erpnext/stock/stock_ledger.py:1848 erpnext/stock/stock_ledger.py:2373 +#: erpnext/stock/stock_ledger.py:2387 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "{0} jedinica {1} potrebnih u {2} na {3} {4} za {5} da se završi ova transakcija." -#: erpnext/stock/stock_ledger.py:2429 erpnext/stock/stock_ledger.py:2474 +#: erpnext/stock/stock_ledger.py:2477 erpnext/stock/stock_ledger.py:2522 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "{0} jedinica {1} potrebnih u {2} na {3} {4} za završetak ove transakcije." -#: erpnext/stock/stock_ledger.py:1794 +#: erpnext/stock/stock_ledger.py:1842 msgid "{0} units of {1} needed in {2} to complete this transaction." msgstr "{0} jedinica od {1} potrebnih u {2} za završetak ove transakcije." @@ -63590,7 +63609,7 @@ msgstr "{0} do {1}" msgid "{0} valid serial nos for Item {1}" msgstr "{0} važeći serijski brojevi za artikal {1}" -#: erpnext/stock/doctype/item/item.js:1269 +#: erpnext/stock/doctype/item/item.js:1286 msgid "{0} variants created." msgstr "{0} varijante izrađene." @@ -63602,7 +63621,7 @@ msgstr "Prikaz {0} trenutno nije podržan u Prilagođenom Finansijskom Izvješta msgid "{0} will be given as discount." msgstr "{0} će biti dato kao popust." -#: erpnext/public/js/utils/barcode_scanner.js:523 +#: erpnext/public/js/utils/barcode_scanner.js:532 msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "{0} će biti postavljeno kao {1} u naredno skeniranim artiklima" @@ -63646,11 +63665,11 @@ msgstr "{0} {1} je već djelimično plaćena. Koristi dugme 'Preuzmi Nepodmirene #: erpnext/buying/doctype/purchase_order/services/status.py:35 #: erpnext/selling/doctype/sales_order/services/status.py:45 -#: erpnext/stock/doctype/material_request/material_request.py:258 +#: erpnext/stock/doctype/material_request/material_request.py:297 msgid "{0} {1} has been modified. Please refresh." msgstr "{0} {1} je izmijenjeno. Osvježi." -#: erpnext/stock/doctype/material_request/material_request.py:285 +#: erpnext/stock/doctype/material_request/material_request.py:324 msgid "{0} {1} has not been submitted so the action cannot be completed" msgstr "{0} {1} nije podnešen tako da se radnja ne može završiti" @@ -63680,11 +63699,11 @@ msgstr "{0} {1} je povezan sa {2}, ali Račun Stranke je {3}" msgid "{0} {1} is cancelled or closed" msgstr "{0} {1} je otkazan ili zatvoren" -#: erpnext/stock/doctype/material_request/material_request.py:437 +#: erpnext/stock/doctype/material_request/material_request.py:476 msgid "{0} {1} is cancelled or stopped" msgstr "{0} {1} je otkazan ili zaustavljen" -#: erpnext/stock/doctype/material_request/material_request.py:275 +#: erpnext/stock/doctype/material_request/material_request.py:314 msgid "{0} {1} is cancelled so the action cannot be completed" msgstr "{0} {1} je otkazan tako da se radnja ne može dovršiti" @@ -63768,7 +63787,7 @@ msgstr "{0} {1}: Račun {2} je neaktivan" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "{0} {1}: Knjigovodstveni Unos za {2} može se izvršiti samo u valuti: {3}" -#: erpnext/stock/services/base_stock_gl_composer.py:226 +#: erpnext/stock/services/base_stock_gl_composer.py:282 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "{0} {1}: Centar Troškova je obavezan za Artikal {2}" @@ -63800,11 +63819,11 @@ msgstr "{0} {1}: Dobavljač je obavezan naspram Računa Troška {2}" msgid "{0}%" msgstr "{0}%" -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 msgid "{0}% Billed" msgstr "{0}% Fakturisano" -#: erpnext/controllers/website_list_for_contact.py:218 +#: erpnext/controllers/website_list_for_contact.py:220 msgid "{0}% Delivered" msgstr "{0}% Dostavljeno" @@ -63837,11 +63856,11 @@ msgstr "{0}: Zaštićeni DocType" msgid "{0}: Virtual DocType (no database table)" msgstr "{0}: Virtualni DocType (bez tabele baze podataka)" -#: erpnext/stock/doctype/item/item.js:1185 +#: erpnext/stock/doctype/item/item.js:1202 msgid "{0}: remove invalid value(s) {1}" msgstr "{0}: ukloni nevažeću vrijednost(i) {1}" -#: erpnext/stock/doctype/item/item.js:1192 +#: erpnext/stock/doctype/item/item.js:1209 msgid "{0}: select the typed value {1} from the list or clear it" msgstr "{0}: odaberi unesenu vrijednost {1} s liste ili je obrišite" @@ -63853,7 +63872,7 @@ msgstr "{0}: {1} ne pripada: {2}" msgid "{0}: {1} does not exist" msgstr "{0}: {1} ne postoji" -#: erpnext/setup/doctype/company/company.py:351 +#: erpnext/setup/doctype/company/company.py:353 msgid "{0}: {1} is a group account." msgstr "{0}: {1} je grupni račun." @@ -63861,15 +63880,15 @@ msgstr "{0}: {1} je grupni račun." msgid "{0}: {1} must be less than {2}" msgstr "{0}: {1} mora biti manje od {2}" -#: erpnext/controllers/buying_controller.py:1028 +#: erpnext/controllers/buying_controller.py:1036 msgid "{count} Assets created for {item_code}" msgstr "{count} Imovina izrađena za {item_code}" -#: erpnext/controllers/buying_controller.py:928 +#: erpnext/controllers/buying_controller.py:936 msgid "{doctype} {name} is cancelled or closed." msgstr "{doctype} {name} je otkazan ili zatvoren." -#: erpnext/controllers/stock_controller.py:666 +#: erpnext/controllers/stock_controller.py:668 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "{item_name} Veličina Uzorka ({sample_size}) ne može biti veća od Prihvaćene Količina ({accepted_quantity})" diff --git a/erpnext/locale/cs.po b/erpnext/locale/cs.po index 3e3517aa1fb..f4d5bb89dc7 100644 --- a/erpnext/locale/cs.po +++ b/erpnext/locale/cs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-07-12 10:05+0000\n" -"PO-Revision-Date: 2026-07-15 12:58\n" +"POT-Creation-Date: 2026-07-19 10:04+0000\n" +"PO-Revision-Date: 2026-07-19 13:55\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Czech\n" "MIME-Version: 1.0\n" @@ -86,15 +86,15 @@ msgstr "" msgid " Summary" msgstr "" -#: erpnext/stock/doctype/item/item.py:281 +#: erpnext/stock/doctype/item/item.py:286 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "" -#: erpnext/stock/doctype/item/item.py:283 +#: erpnext/stock/doctype/item/item.py:288 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:385 +#: erpnext/stock/doctype/item/item.py:390 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "" @@ -284,7 +284,7 @@ msgid "'Entries' cannot be empty" msgstr "" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:132 #: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "" @@ -293,7 +293,7 @@ msgstr "" msgid "'From Date' must be after 'To Date'" msgstr "" -#: erpnext/stock/doctype/item/item.py:468 +#: erpnext/stock/doctype/item/item.py:473 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" msgstr "" @@ -312,7 +312,7 @@ msgid "'Opening'" msgstr "" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:134 #: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "" @@ -337,8 +337,8 @@ msgstr "Účet {0} již používá {1}. Použijte jiný účet." msgid "'{0}' has been already added." msgstr "" -#: erpnext/setup/doctype/company/company.py:376 -#: erpnext/setup/doctype/company/company.py:387 +#: erpnext/setup/doctype/company/company.py:378 +#: erpnext/setup/doctype/company/company.py:389 msgid "'{0}' should be in company currency {1}." msgstr "" @@ -868,6 +868,11 @@ msgid "
    Message Example
    \n\n" "
    \n" msgstr "" +#. Header text in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounting Overview" +msgstr "" + #. Header text in the Stock Workspace #: erpnext/stock/workspace/stock/stock.json msgid "Masters & Reports" @@ -896,11 +901,6 @@ msgstr "" msgid "Reports & Masters" msgstr "" -#. Header text in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward and Outward" -msgstr "" - #. Header text in the ERPNext Settings Workspace #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json msgid "Your Shortcuts\n" @@ -970,7 +970,7 @@ msgstr "" msgid "A - C" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:358 +#: erpnext/selling/doctype/customer/customer.py:372 msgid "A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group" msgstr "" @@ -1151,11 +1151,11 @@ msgstr "" msgid "Abbreviation" msgstr "" -#: erpnext/setup/doctype/company/company.py:310 +#: erpnext/setup/doctype/company/company.py:312 msgid "Abbreviation already used for another company" msgstr "" -#: erpnext/setup/doctype/company/company.py:307 +#: erpnext/setup/doctype/company/company.py:309 msgid "Abbreviation is mandatory" msgstr "" @@ -1277,11 +1277,9 @@ msgstr "" #. Label of the account_category (Link) field in DocType 'Account' #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:162 #: erpnext/accounts/doctype/account_category/account_category.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Account Category" msgstr "" @@ -1384,7 +1382,7 @@ msgstr "" msgid "Account Manager" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 #: erpnext/controllers/accounts_controller.py:1234 msgid "Account Missing" msgstr "" @@ -1524,6 +1522,12 @@ msgstr "" msgid "Account to record additional purchase expenses like freight or customs" msgstr "" +#. Description of the 'Expenses Added To Stock Account' (Link) field in DocType +#. 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Account to track value added to stock via Stock Entry, Stock Reconciliation or Landed Cost Voucher" +msgstr "" + #. Description of the 'COGS Account' (Link) field in DocType 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json msgid "Account where cost of goods sold will be posted when this item is sold" @@ -1576,7 +1580,7 @@ msgstr "" msgid "Account {0} does not belong to company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:358 +#: erpnext/setup/doctype/company/company.py:360 msgid "Account {0} does not belong to company: {1}" msgstr "" @@ -1604,7 +1608,7 @@ msgstr "" msgid "Account {0} is added in the child company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:347 +#: erpnext/setup/doctype/company/company.py:349 msgid "Account {0} is disabled." msgstr "" @@ -1662,6 +1666,7 @@ msgstr "" #. Item' #. Label of the section_break_10 (Section Break) field in DocType 'Shipping #. Rule' +#. Name of a Workspace #. Label of the accounting_tab (Tab Break) field in DocType 'Supplier' #. Label of a Desktop Icon #. Label of the accounting_tab (Tab Break) field in DocType 'Customer' @@ -1673,6 +1678,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/desktop_icon/accounting.json erpnext/public/js/setup_wizard.js:91 #: erpnext/selling/doctype/customer/customer.json @@ -1731,15 +1737,12 @@ msgstr "" #. 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/budgeting.json msgid "Accounting Dimension" msgstr "" @@ -1933,8 +1936,8 @@ msgstr "" msgid "Accounting Entry for Asset" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:298 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:316 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:303 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:321 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1955,17 +1958,17 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:430 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:675 #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:696 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:430 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:234 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:249 -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:263 -#: erpnext/stock/services/base_stock_gl_composer.py:65 -#: erpnext/stock/services/base_stock_gl_composer.py:80 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:439 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:239 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:254 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:268 +#: erpnext/stock/services/base_stock_gl_composer.py:72 +#: erpnext/stock/services/base_stock_gl_composer.py:87 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:67 msgid "Accounting Entry for Stock" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:268 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:276 msgid "Accounting Entry for {0}" msgstr "" @@ -1974,12 +1977,12 @@ 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:190 -#: erpnext/assets/doctype/asset_repair/asset_repair.js:92 -#: erpnext/buying/doctype/supplier/supplier.js:123 +#: erpnext/assets/doctype/asset/asset.js:198 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:101 +#: erpnext/buying/doctype/supplier/supplier.js:132 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 -#: erpnext/selling/doctype/customer/customer.js:173 +#: erpnext/selling/doctype/customer/customer.js:182 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "" @@ -1996,10 +1999,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounting_period/accounting_period.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounting Period" msgstr "" @@ -2039,7 +2040,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/assets/doctype/asset_category/asset_category.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:513 +#: erpnext/setup/doctype/company/company.py:515 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json @@ -2079,13 +2080,18 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:126 -#: erpnext/buying/doctype/supplier/supplier.js:135 +#: erpnext/buying/doctype/supplier/supplier.js:144 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Accounts Payable" msgstr "" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Payable Ageing" +msgstr "" + #. Name of a report #: erpnext/accounts/report/accounts_payable/accounts_payable.js:191 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.json @@ -2104,7 +2110,7 @@ msgstr "Souhrn závazků" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.json #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:149 -#: erpnext/selling/doctype/customer/customer.js:162 +#: erpnext/selling/doctype/customer/customer.js:171 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json @@ -2123,6 +2129,11 @@ msgstr "" msgid "Accounts Receivable / Payable remarks length" msgstr "" +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json +msgid "Accounts Receivable Ageing" +msgstr "" + #. Label of the accounts_receivable_credit (Link) field in DocType 'Invoice #. Discounting' #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.json @@ -2154,17 +2165,12 @@ msgstr "" #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Accounts Settings" msgstr "" -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/accounts_setup/accounts_setup.json #: erpnext/desktop_icon/accounts_setup.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Accounts Setup" msgstr "" @@ -2202,7 +2208,7 @@ msgstr "" #. Label of the accumulated_depreciation_amount (Currency) field in DocType #. 'Depreciation Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:173 -#: erpnext/assets/doctype/asset/asset.js:385 +#: erpnext/assets/doctype/asset/asset.js:393 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Accumulated Depreciation Amount" msgstr "" @@ -2350,7 +2356,7 @@ msgstr "" #. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType #. 'Stock Settings' -#: erpnext/stock/doctype/item/item.js:485 +#: erpnext/stock/doctype/item/item.js:496 #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Activate Serial / Batch No for Item" msgstr "" @@ -2364,11 +2370,6 @@ msgstr "" msgid "Active Status" msgstr "" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Active Subcontracted Items" -msgstr "" - #. Label of the activities_tab (Tab Break) field in DocType 'Lead' #. Label of the activities_tab (Tab Break) field in DocType 'Opportunity' #. Label of the activities_tab (Tab Break) field in DocType 'Prospect' @@ -2484,7 +2485,7 @@ msgstr "" msgid "Actual End Time" msgstr "" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:464 msgid "Actual Expense" msgstr "Skutečný náklad" @@ -2674,7 +2675,7 @@ msgstr "" msgid "Add Multiple Tasks" msgstr "" -#: erpnext/stock/doctype/item/item.js:985 +#: erpnext/stock/doctype/item/item.js:1002 msgid "Add Opening Stock" msgstr "" @@ -2860,11 +2861,11 @@ msgstr "" msgid "Added On" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:135 +#: erpnext/buying/doctype/supplier/supplier.py:143 msgid "Added Supplier Role to User {0}." msgstr "" -#: erpnext/controllers/website_list_for_contact.py:311 +#: erpnext/controllers/website_list_for_contact.py:313 msgid "Added {1} role to user {0}." msgstr "" @@ -3279,7 +3280,7 @@ msgstr "" msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:203 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:211 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3476,7 +3477,7 @@ msgstr "" msgid "Against Blanket Order" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:838 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:844 msgid "Against Customer Order {0}" msgstr "" @@ -3729,7 +3730,7 @@ msgstr "" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:171 -#: erpnext/accounts/utils.py:1653 erpnext/public/js/setup_wizard.js:278 +#: erpnext/accounts/utils.py:1647 erpnext/public/js/setup_wizard.js:278 msgid "All Accounts" msgstr "" @@ -3781,21 +3782,21 @@ msgstr "" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:506 -#: erpnext/setup/doctype/company/company.py:509 -#: erpnext/setup/doctype/company/company.py:514 -#: erpnext/setup/doctype/company/company.py:520 -#: erpnext/setup/doctype/company/company.py:526 -#: erpnext/setup/doctype/company/company.py:532 -#: erpnext/setup/doctype/company/company.py:538 -#: erpnext/setup/doctype/company/company.py:544 -#: erpnext/setup/doctype/company/company.py:550 -#: erpnext/setup/doctype/company/company.py:556 -#: erpnext/setup/doctype/company/company.py:562 -#: erpnext/setup/doctype/company/company.py:568 -#: erpnext/setup/doctype/company/company.py:574 -#: erpnext/setup/doctype/company/company.py:580 -#: erpnext/setup/doctype/company/company.py:586 +#: erpnext/setup/doctype/company/company.py:508 +#: erpnext/setup/doctype/company/company.py:511 +#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:522 +#: erpnext/setup/doctype/company/company.py:528 +#: erpnext/setup/doctype/company/company.py:534 +#: erpnext/setup/doctype/company/company.py:540 +#: erpnext/setup/doctype/company/company.py:546 +#: erpnext/setup/doctype/company/company.py:552 +#: erpnext/setup/doctype/company/company.py:558 +#: erpnext/setup/doctype/company/company.py:564 +#: erpnext/setup/doctype/company/company.py:570 +#: erpnext/setup/doctype/company/company.py:576 +#: erpnext/setup/doctype/company/company.py:582 +#: erpnext/setup/doctype/company/company.py:588 msgid "All Departments" msgstr "" @@ -3875,7 +3876,7 @@ msgstr "" msgid "All Territories" msgstr "" -#: erpnext/setup/doctype/company/company.py:451 +#: erpnext/setup/doctype/company/company.py:453 msgid "All Warehouses" msgstr "" @@ -3918,11 +3919,11 @@ msgstr "" msgid "All items in this document already have a linked Quality Inspection." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:915 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:921 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:926 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:932 msgid "All linked Sales Orders must be subcontracted." msgstr "" @@ -4458,6 +4459,21 @@ msgstr "" msgid "Allow transferring raw materials even after the Required Quantity is fulfilled" msgstr "" +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Supplier' +#. Label of the allowed_companies (Table MultiSelect) field in DocType +#. 'Customer' +#. Label of the allowed_companies (Table MultiSelect) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Allowed Companies" +msgstr "" + +#: erpnext/stock/doctype/company_restriction/company_restriction.py:74 +msgid "Allowed Companies is required when Restrict to Companies is checked" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/allowed_dimension/allowed_dimension.json msgid "Allowed Dimension" @@ -4538,7 +4554,7 @@ msgstr "" msgid "Already Imported" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1123 +#: erpnext/stock/doctype/pick_list/pick_list.py:1132 msgid "Already Picked" msgstr "" @@ -4546,7 +4562,7 @@ msgstr "" msgid "Already set default in pos profile {0} for user {1}, kindly disabled default" msgstr "" -#: erpnext/stock/doctype/item/item.js:38 +#: erpnext/stock/doctype/item/item.js:40 msgid "Also you can't switch back to FIFO after setting the valuation method to Moving Average for this item." msgstr "" @@ -4558,7 +4574,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:158 #: erpnext/manufacturing/doctype/work_order/work_order.js:173 #: erpnext/public/js/utils.js:616 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:343 msgid "Alternate Item" msgstr "" @@ -4586,7 +4602,7 @@ msgstr "" msgid "Alternative item must not be same as item code" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:383 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 msgid "Alternatively, you can download the template and fill your data in." msgstr "" @@ -4993,12 +5009,12 @@ msgstr "" msgid "An email will be sent to notify the User with the role 'Purchase Manager' when an automatic Material Request is created." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:617 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:766 msgid "An error has been appeared while reposting item valuation via {0}" msgstr "" #: erpnext/public/js/controllers/buying.js:378 -#: erpnext/public/js/utils/sales_common.js:495 +#: erpnext/public/js/utils/sales_common.js:493 msgid "An error occurred during the update process" msgstr "" @@ -5553,7 +5569,7 @@ msgstr "" msgid "As the field {0} is enabled, the value of the field {1} should be more than 1." msgstr "" -#: erpnext/stock/doctype/item/item.py:1122 +#: erpnext/stock/doctype/item/item.py:1127 msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "" @@ -5561,7 +5577,7 @@ msgstr "" msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}." msgstr "Protože je k dispozici dostatek dílčích sestav, výrobní příkaz není pro sklad {0} vyžadován." -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:464 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:470 msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "" @@ -5703,7 +5719,7 @@ msgstr "" msgid "Asset Category Name" msgstr "" -#: erpnext/stock/doctype/item/item.py:377 +#: erpnext/stock/doctype/item/item.py:382 msgid "Asset Category is mandatory for Fixed Asset item" msgstr "" @@ -5894,6 +5910,7 @@ msgstr "" #. Label of the asset_repair (Link) field in DocType 'Stock Entry' #. Label of a Workspace Sidebar Item #: erpnext/assets/doctype/asset/asset.js:113 +#: erpnext/assets/doctype/asset/asset.js:152 #: 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 @@ -5944,8 +5961,7 @@ msgstr "" #. Label of the asset_value (Currency) field in DocType 'Asset Capitalization #. Asset Item' -#: erpnext/assets/dashboard_fixtures.py:180 -#: erpnext/assets/doctype/asset/asset.js:517 +#: erpnext/assets/doctype/asset/asset.js:525 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:208 #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:457 @@ -5968,7 +5984,6 @@ msgid "Asset Value Adjustment cannot be posted before Asset's purchase date { msgstr "" #. Label of a chart in the Assets Workspace -#: erpnext/assets/dashboard_fixtures.py:56 #: erpnext/assets/workspace/assets/assets.json msgid "Asset Value Analytics" msgstr "" @@ -6005,7 +6020,7 @@ msgstr "" msgid "Asset issued to Employee {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:181 msgid "Asset out of order due to Asset Repair {0}" msgstr "" @@ -6050,7 +6065,7 @@ msgstr "" msgid "Asset updated after being split into Asset {0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:335 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:338 msgid "Asset updated due to Asset Repair {0} {1}." msgstr "" @@ -6099,7 +6114,7 @@ msgstr "" msgid "Asset {0} must be submitted" msgstr "" -#: erpnext/controllers/buying_controller.py:1039 +#: erpnext/controllers/buying_controller.py:1047 msgid "Asset {assets_link} created for {item_code}" msgstr "" @@ -6137,11 +6152,11 @@ msgstr "" msgid "Assets Setup" msgstr "" -#: erpnext/controllers/buying_controller.py:1057 +#: erpnext/controllers/buying_controller.py:1065 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "" -#: erpnext/controllers/buying_controller.py:1044 +#: erpnext/controllers/buying_controller.py:1052 msgid "Assets {assets_link} created for {item_code}" msgstr "" @@ -6259,7 +6274,7 @@ msgstr "" msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:502 +#: erpnext/stock/services/serial_batch_bundle_service.py:504 msgid "At row {0}: Serial and Batch Bundle {1} has already been created. Please remove the values from the serial no or batch no fields." msgstr "" @@ -6319,11 +6334,11 @@ msgstr "" msgid "Attribute Value" msgstr "" -#: erpnext/stock/doctype/item/item.py:888 +#: erpnext/stock/doctype/item/item.py:893 msgid "Attribute Value {0} is not valid for the selected attribute {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1034 +#: erpnext/stock/doctype/item/item.py:1039 msgid "Attribute table is mandatory" msgstr "" @@ -6331,19 +6346,19 @@ msgstr "" msgid "Attribute value: {0} must appear only once" msgstr "" -#: erpnext/stock/doctype/item/item.py:877 +#: erpnext/stock/doctype/item/item.py:882 msgid "Attribute {0} is disabled." msgstr "" -#: erpnext/stock/doctype/item/item.py:865 +#: erpnext/stock/doctype/item/item.py:870 msgid "Attribute {0} is not valid for the selected template." msgstr "" -#: erpnext/stock/doctype/item/item.py:1038 +#: erpnext/stock/doctype/item/item.py:1043 msgid "Attribute {0} selected multiple times in Attributes Table" msgstr "" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Attributes" msgstr "" @@ -6490,7 +6505,7 @@ msgstr "" msgid "Auto Reposting of Incorrect Valuation" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:202 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:209 msgid "Auto Tax Settings Error" msgstr "" @@ -6551,7 +6566,7 @@ msgid "Auto reconcile Payments" msgstr "" #: erpnext/public/js/controllers/buying.js:373 -#: erpnext/public/js/utils/sales_common.js:490 +#: erpnext/public/js/utils/sales_common.js:488 msgid "Auto repeat document updated" msgstr "" @@ -6896,8 +6911,8 @@ msgstr "" #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:118 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order.js:1496 -#: erpnext/stock/doctype/material_request/material_request.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:810 +#: erpnext/stock/doctype/material_request/material_request.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:809 #: 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:524 @@ -7127,7 +7142,7 @@ msgstr "" msgid "BOM Update Tool Log with job status maintained" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:102 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:103 msgid "BOM Updation already in progress. Please wait until {0} is complete." msgstr "" @@ -7156,8 +7171,8 @@ msgstr "" msgid "BOM and Production" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:862 +#: erpnext/stock/doctype/material_request/material_request.js:387 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:861 msgid "BOM does not contain any stock item" msgstr "" @@ -7288,7 +7303,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:62 #: 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/batch_wise_balance_history/batch_wise_balance_history.py:89 #: erpnext/stock/report/stock_balance/stock_balance.py:517 #: erpnext/stock/report/stock_ledger/stock_ledger.py:331 msgid "Balance Qty" @@ -7361,7 +7376,7 @@ msgid "Balance Type" 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/batch_wise_balance_history/batch_wise_balance_history.py:91 #: erpnext/stock/report/stock_balance/stock_balance.py:525 #: erpnext/stock/report/stock_ledger/stock_ledger.py:388 msgid "Balance Value" @@ -7392,7 +7407,6 @@ msgstr "" #. Label of the bank (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace #. Option for the 'Salary Mode' (Select) field in DocType 'Employee' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/bank/bank.json #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7406,7 +7420,6 @@ msgstr "" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py:95 #: erpnext/setup/doctype/employee/employee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank" msgstr "" @@ -7435,7 +7448,6 @@ msgstr "" #. Label of the bank_account (Link) field in DocType 'Payment Order Reference' #. Label of the bank_account (Link) field in DocType 'Payment Request' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:141 #: banking/src/pages/BankStatementImporter.tsx:90 #: erpnext/accounts/doctype/bank_account/bank_account.json @@ -7454,7 +7466,6 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js:16 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.js:16 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account" msgstr "" @@ -7490,16 +7501,12 @@ msgid "Bank Account No" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_subtype/bank_account_subtype.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Subtype" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_account_type/bank_account_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Account Type" msgstr "" @@ -7512,7 +7519,9 @@ msgstr "" msgid "Bank Accounts" msgstr "" +#. Label of a chart in the Accounting Workspace #. Label of the bank_balance (Check) field in DocType 'Email Digest' +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/setup/doctype/email_digest/email_digest.json msgid "Bank Balance" msgstr "" @@ -7536,10 +7545,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_clearance/bank_clearance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Clearance" msgstr "" @@ -7609,9 +7616,7 @@ msgid "Bank Fee, Salary, etc." msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json -#: erpnext/workspace_sidebar/banking.json msgid "Bank Guarantee" msgstr "" @@ -7639,11 +7644,6 @@ msgstr "" msgid "Bank Overdraft Account" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Bank Reconciliation" -msgstr "" - #. Name of a report #. Label of a Link in the Invoicing Workspace #: banking/src/components/features/BankReconciliation/BankReconciliationStatement.tsx:208 @@ -7789,19 +7789,15 @@ msgstr "" #. Label of the banking_section (Section Break) field in DocType 'Accounts #. Settings' -#. Name of a Workspace #. Label of a Card Break in the Invoicing Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: banking/src/pages/BankReconciliation.tsx:57 #: banking/src/pages/BankReconciliation.tsx:87 #: banking/src/pages/BankStatementImporterContainer.tsx:22 #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/workspace/banking/banking.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/banking.json #: erpnext/setup/setup_wizard/data/industry_type.txt:8 -#: erpnext/workspace_sidebar/banking.json msgid "Banking" msgstr "" @@ -7810,11 +7806,11 @@ msgstr "" msgid "Barcode Type" msgstr "" -#: erpnext/stock/doctype/item/item.py:547 +#: erpnext/stock/doctype/item/item.py:552 msgid "Barcode {0} already used in Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:562 +#: erpnext/stock/doctype/item/item.py:567 msgid "Barcode {0} is not a valid {1} code" msgstr "" @@ -7969,7 +7965,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #: erpnext/stock/doctype/batch/batch.json #: 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/batch_wise_balance_history/batch_wise_balance_history.py:85 #: 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:418 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:182 @@ -8053,7 +8049,7 @@ msgstr "" #: 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:2989 -#: erpnext/public/js/utils/barcode_scanner.js:281 +#: erpnext/public/js/utils/barcode_scanner.js:286 #: erpnext/public/js/utils/serial_no_batch_selector.js:450 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_price/item_price.json @@ -8087,7 +8083,7 @@ msgstr "" msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3570 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3572 msgid "Batch No {0} does not exist" msgstr "" @@ -8281,18 +8277,16 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace #. Label of the bom_info_section (Section Break) field in DocType 'Stock Entry' -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.py:1168 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:796 +#: erpnext/stock/doctype/material_request/material_request.js:142 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:795 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "" #. Option for the 'Status' (Select) field in DocType 'Timesheet' -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/doctype/timesheet/timesheet_list.js:9 msgid "Billed" @@ -8656,6 +8650,12 @@ msgstr "" msgid "Block Supplier" msgstr "" +#. Description of the 'Enable Overdue Billing Threshold' (Check) field in +#. DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Block submitting a new Sales Invoice when the customer's overdue amount exceeds the Overdue Billing Threshold set on the customer." +msgstr "" + #. Description of the 'Is Frozen' (Check) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Blocks all further accounting entries on this customer's account. Only users with the frozen-entries role can override.\n" @@ -8733,6 +8733,12 @@ msgstr "" msgid "Book Deferred entries based on" msgstr "" +#. Label of the book_stock_expense_gl_entries (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Book Stock Expense GL Entries" +msgstr "" + #: erpnext/www/book_appointment/index.html:15 msgid "Book an appointment" msgstr "" @@ -8760,6 +8766,12 @@ msgstr "" msgid "Booked Fixed Asset" msgstr "" +#. Description of the 'Book Stock Expense GL Entries' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Books Purchase Expense and Expenses Added To Stock account pairs against stock value. On enabling this, the accounts become mandatory in Company or Item Defaults for Purchase Receipt, Purchase Invoice, Stock Entry, Stock Reconciliation and Landed Cost Voucher" +msgstr "" + #: erpnext/accounts/services/gl_validator.py:143 msgid "Books have been closed until the period ending on {0}" msgstr "" @@ -8796,12 +8808,10 @@ 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 "" @@ -8889,7 +8899,6 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cost_center/cost_center.js:45 @@ -8900,9 +8909,9 @@ msgstr "" #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:237 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:319 #: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:329 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:454 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:459 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budgeting.json +#: erpnext/desktop_icon/budget.json msgid "Budget" msgstr "" @@ -8970,8 +8979,8 @@ msgstr "" msgid "Budget Start Date" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/budgeting.json +#. Label of a chart in the Accounting Workspace +#: erpnext/accounts/workspace/accounting/accounting.json msgid "Budget Variance" msgstr "" @@ -8991,13 +9000,6 @@ msgstr "" msgid "Budget cannot be assigned against {0}, as its Root Type is not of Income or Expense" msgstr "" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/budgeting/budgeting.json -#: erpnext/workspace_sidebar/budgeting.json -msgid "Budgeting" -msgstr "" - #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:9 msgid "Budgets" msgstr "" @@ -9227,11 +9229,6 @@ msgstr "" msgid "CC To" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "COA Importer" -msgstr "" - #. Option for the 'Barcode Type' (Select) field in DocType 'Item Barcode' #: erpnext/stock/doctype/item_barcode/item_barcode.json msgid "CODE-39" @@ -9249,7 +9246,7 @@ msgstr "" msgid "COGS By Item Group" msgstr "" -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:44 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:55 msgid "COGS Debit" msgstr "" @@ -9565,7 +9562,7 @@ msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "" #: erpnext/accounts/doctype/journal_entry/mapper.py:32 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2617 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2615 msgid "Can only make payment against unbilled {0}" msgstr "" @@ -9575,7 +9572,7 @@ msgstr "" 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:278 +#: erpnext/setup/doctype/company/company.py:280 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "" @@ -9619,7 +9616,7 @@ msgstr "" msgid "Cannot Assign Cashier" msgstr "" -#: erpnext/setup/doctype/company/company.py:297 +#: erpnext/setup/doctype/company/company.py:299 msgid "Cannot Change Inventory Account Setting" msgstr "" @@ -9627,9 +9624,9 @@ msgstr "" msgid "Cannot Create Return" msgstr "" -#: erpnext/stock/doctype/item/item.py:690 -#: erpnext/stock/doctype/item/item.py:703 -#: erpnext/stock/doctype/item/item.py:719 +#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:708 +#: erpnext/stock/doctype/item/item.py:724 msgid "Cannot Merge" msgstr "" @@ -9653,7 +9650,7 @@ msgstr "" msgid "Cannot apply TDS against multiple parties in one entry" msgstr "" -#: erpnext/stock/doctype/item/item.py:380 +#: erpnext/stock/doctype/item/item.py:385 msgid "Cannot be a fixed asset item as Stock Ledger is created." msgstr "" @@ -9674,7 +9671,7 @@ msgstr "" msgid "Cannot cancel Stock Reservation Entry {0}, as it has been used in the work order {1}. Please cancel the work order first or unreserve the stock" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:275 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:283 msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "" @@ -9682,7 +9679,7 @@ msgstr "" msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "" -#: erpnext/stock/stock_ledger.py:226 +#: erpnext/stock/stock_ledger.py:230 msgid "Cannot cancel the transaction. Reposting of item valuation on submission is not completed yet." msgstr "" @@ -9694,7 +9691,7 @@ msgstr "" msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "" -#: erpnext/controllers/buying_controller.py:1145 +#: erpnext/controllers/buying_controller.py:1153 msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "" @@ -9702,11 +9699,11 @@ msgstr "" msgid "Cannot cancel transaction for Completed Work Order." msgstr "" -#: erpnext/stock/doctype/item/item.py:986 +#: erpnext/stock/doctype/item/item.py:991 msgid "Cannot change Attributes after stock transaction. Make a new Item and transfer stock to the new Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1147 +#: erpnext/stock/doctype/item/item.py:1152 msgid "Cannot change Item {0} from serialized to non-serialized because a Serial and Batch Bundle exists for it. Please delete or cancel the Serial and Batch Bundle first." msgstr "" @@ -9718,11 +9715,11 @@ msgstr "" msgid "Cannot change Service Stop Date for item in row {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:977 +#: erpnext/stock/doctype/item/item.py:982 msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "" -#: erpnext/setup/doctype/company/company.py:403 +#: erpnext/setup/doctype/company/company.py:405 msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "" @@ -9734,7 +9731,7 @@ msgstr "" msgid "Cannot convert Cost Center to ledger as it has child nodes" msgstr "" -#: erpnext/projects/doctype/task/task.js:49 +#: erpnext/projects/doctype/task/task.js:55 msgid "Cannot convert Task to non-group because the following child Tasks exist: {0}." msgstr "" @@ -9813,7 +9810,7 @@ msgstr "" msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." msgstr "" -#: erpnext/setup/doctype/company/company.py:629 +#: erpnext/setup/doctype/company/company.py:631 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 "" @@ -9829,7 +9826,7 @@ msgstr "" msgid "Cannot disassemble {0} qty against Stock Entry {1}. Only {2} qty available to disassemble." msgstr "" -#: erpnext/setup/doctype/company/company.py:294 +#: erpnext/setup/doctype/company/company.py:296 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 "" @@ -9846,11 +9843,11 @@ msgstr "" msgid "Cannot fetch selected rows for submitted Payment Request" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:62 +#: erpnext/public/js/utils/barcode_scanner.js:67 msgid "Cannot find Item or Warehouse with this Barcode" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:63 +#: erpnext/public/js/utils/barcode_scanner.js:68 msgid "Cannot find Item with this Barcode" msgstr "" @@ -9908,7 +9905,7 @@ msgstr "" msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:371 +#: erpnext/selling/doctype/customer/customer.py:385 msgid "Cannot select a Group type Customer Group. Please select a non-group Customer Group." msgstr "" @@ -9933,7 +9930,7 @@ msgstr "" msgid "Cannot set authorization on basis of Discount for {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:777 +#: erpnext/stock/doctype/item/item.py:782 msgid "Cannot set multiple Item Defaults for a company." msgstr "" @@ -10042,7 +10039,7 @@ msgstr "" msgid "Capital Work in Progress" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:228 +#: erpnext/assets/doctype/asset/asset.js:236 msgid "Capitalize Asset" msgstr "" @@ -10051,7 +10048,7 @@ msgstr "" msgid "Capitalize Repair Cost" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:226 +#: erpnext/assets/doctype/asset/asset.js:234 msgid "Capitalize this asset before submitting." msgstr "" @@ -10236,16 +10233,12 @@ msgstr "" msgid "Category Details" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:93 -msgid "Category-wise Asset Value" -msgstr "" - -#: erpnext/buying/doctype/purchase_order/purchase_order.py:289 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:290 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:140 msgid "Caution" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:210 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:218 msgid "Caution: This might alter frozen accounts." msgstr "" @@ -10345,7 +10338,7 @@ msgstr "" msgid "Change in Stock Value" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:773 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:779 msgid "Change the account type to Receivable or select a different account." msgstr "" @@ -10355,7 +10348,7 @@ msgstr "" msgid "Change this date manually to setup the next synchronization start date" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:161 +#: erpnext/selling/doctype/customer/customer.py:168 msgid "Changed customer name to '{0}' as '{1}' already exists." msgstr "" @@ -10363,7 +10356,7 @@ msgstr "" msgid "Changes in {0}" msgstr "" -#: erpnext/stock/doctype/item/item.js:451 +#: erpnext/stock/doctype/item/item.js:462 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "" @@ -10373,7 +10366,7 @@ msgstr "" msgid "Changing the account in any transaction of the DocTypes listed below will trigger a repost. To prevent reposting, remove the relevant DocType from the list." msgstr "" -#: erpnext/stock/doctype/item/item.js:34 +#: erpnext/stock/doctype/item/item.js:36 msgid "Changing the valuation method to Moving Average will affect new transactions. If backdated entries are added, earlier FIFO-based entries will be reposted, which may change closing balances." msgstr "" @@ -10438,7 +10431,6 @@ msgstr "" #: erpnext/setup/doctype/company/company.js:139 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/home/home.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/invoicing.json msgid "Chart of Accounts" msgstr "" @@ -10453,11 +10445,9 @@ msgid "Chart of Accounts Importer" msgstr "" #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account_tree.js:191 #: erpnext/accounts/doctype/cost_center/cost_center.js:41 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Chart of Cost Centers" msgstr "" @@ -10699,7 +10689,7 @@ msgstr "" msgid "Clauses and Conditions" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:493 +#: erpnext/public/js/utils/barcode_scanner.js:502 msgid "Clear Last Scanned Warehouse" msgstr "" @@ -10765,7 +10755,7 @@ msgstr "" msgid "Clearing Demo Data..." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:749 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:747 msgid "Click on 'Get Finished Goods for Manufacture' to fetch the items from the above Sales Orders. Items only for which a BOM is present will be fetched." msgstr "" @@ -10773,7 +10763,7 @@ msgstr "" msgid "Click on Add to Holidays. This will populate the holidays table with all the dates that fall on the selected weekly off. Repeat the process for populating the dates for all your weekly holidays" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:744 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:742 msgid "Click on Get Sales Orders to fetch sales orders based on the above filters." msgstr "" @@ -11278,6 +11268,7 @@ msgstr "" #. Label of the company (Link) field in DocType 'Vehicle' #. Label of a Link in the Home Workspace #. Label of the company (Link) field in DocType 'Bin' +#. Label of the company (Link) field in DocType 'Company Restriction' #. Label of the company (Link) field in DocType 'Delivery Note' #. Label of the company (Link) field in DocType 'Delivery Trip' #. Label of the company (Link) field in DocType 'Item Default' @@ -11307,7 +11298,6 @@ msgstr "" #. Label of the company (Link) field in DocType 'Subcontracting Receipt' #. Label of the company (Link) field in DocType 'Issue' #. Label of the company (Link) field in DocType 'Warranty Claim' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/Rules/RuleForm.tsx:82 #: banking/src/pages/BankStatementImporter.tsx:84 #: erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js:8 @@ -11547,9 +11537,10 @@ msgstr "" #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json +#: erpnext/stock/doctype/company_restriction/company_restriction.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.json -#: erpnext/stock/doctype/item/item.js:940 +#: erpnext/stock/doctype/item/item.js:957 #: erpnext/stock/doctype/item_default/item_default.json #: erpnext/stock/doctype/item_standard_cost/item_standard_cost.json #: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json @@ -11615,8 +11606,6 @@ msgstr "" #: erpnext/support/doctype/warranty_claim/warranty_claim.json #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 -#: erpnext/workspace_sidebar/accounts_setup.json -#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "" @@ -11775,6 +11764,23 @@ msgstr "" msgid "Company Not Linked" msgstr "" +#. Name of a DocType +#: erpnext/stock/doctype/company_restriction/company_restriction.json +msgid "Company Restriction" +msgstr "" + +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Supplier' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Customer' +#. Label of the company_restrictions_section (Section Break) field in DocType +#. 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Company Restrictions" +msgstr "" + #. Label of the shipping_address (Link) field in DocType 'Request for #. Quotation' #. Label of the shipping_address (Link) field in DocType 'Subcontracting Order' @@ -11800,8 +11806,8 @@ msgstr "" 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:856 +#: erpnext/stock/doctype/material_request/material_request.js:381 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:855 msgid "Company field is required" msgstr "" @@ -11912,7 +11918,7 @@ msgstr "" #. Label of the competitors (Table MultiSelect) field in DocType 'Opportunity' #. Label of the competitors (Table MultiSelect) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:612 +#: erpnext/public/js/utils/sales_common.js:610 #: erpnext/selling/doctype/quotation/quotation.json msgid "Competitors" msgstr "" @@ -11967,7 +11973,7 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/services/operations.py:274 +#: erpnext/manufacturing/doctype/work_order/services/operations.py:294 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" @@ -12015,7 +12021,7 @@ msgstr "" msgid "Completion Date" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:82 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:85 msgid "Completion Date can not be before Failure Date. Please adjust the dates accordingly." msgstr "" @@ -12707,7 +12713,7 @@ msgstr "" msgid "Conversion Rate" msgstr "" -#: erpnext/stock/doctype/item/item.py:463 +#: erpnext/stock/doctype/item/item.py:468 msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "" @@ -12930,7 +12936,6 @@ msgstr "" #. Item' #. Label of the cost_center (Link) field in DocType 'Subcontracting Receipt #. Supplied Item' -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:567 #: banking/src/components/features/BankReconciliation/BankEntryModalContent.tsx:626 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:1179 @@ -13024,16 +13029,13 @@ msgstr "" #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/budgeting.json msgid "Cost Center Allocation" msgstr "" @@ -13059,12 +13061,16 @@ msgstr "" msgid "Cost Center Number" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:122 +msgid "Cost Center Validation Error" +msgstr "" + #. Label of a Card Break in the Invoicing Workspace #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Cost Center and Budgeting" msgstr "" -#: erpnext/public/js/utils/sales_common.js:546 +#: erpnext/public/js/utils/sales_common.js:544 msgid "Cost Center for Item rows has been updated to {0}" msgstr "" @@ -13077,7 +13083,7 @@ msgid "Cost Center is required" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:644 -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:401 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:410 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "" @@ -13479,8 +13485,8 @@ msgstr "" msgid "Create Ledger Entries for Change Amount" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:257 -#: erpnext/selling/doctype/customer/customer.js:289 +#: erpnext/buying/doctype/supplier/supplier.js:266 +#: erpnext/selling/doctype/customer/customer.js:298 msgid "Create Link" msgstr "" @@ -13627,9 +13633,9 @@ msgstr "" #. Title of an Onboarding Step #. Label of an action in the Onboarding Step 'Create Sales Invoice' #: erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json -#: erpnext/projects/doctype/timesheet/timesheet.js:55 -#: erpnext/projects/doctype/timesheet/timesheet.js:231 -#: erpnext/projects/doctype/timesheet/timesheet.js:235 +#: erpnext/projects/doctype/timesheet/timesheet.js:56 +#: erpnext/projects/doctype/timesheet/timesheet.js:233 +#: erpnext/projects/doctype/timesheet/timesheet.js:237 #: erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json msgid "Create Sales Invoice" msgstr "" @@ -13652,7 +13658,7 @@ msgid "Create Service Item" msgstr "Vytvořit servisní položku" #: erpnext/stock/dashboard/item_dashboard.js:283 -#: erpnext/stock/doctype/material_request/material_request.js:478 +#: erpnext/stock/doctype/material_request/material_request.js:479 msgid "Create Stock Entry" msgstr "" @@ -13735,12 +13741,12 @@ msgstr "" msgid "Create Users" msgstr "" -#: erpnext/stock/doctype/item/item.js:1398 +#: erpnext/stock/doctype/item/item.js:1415 msgid "Create Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:1210 -#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1227 +#: erpnext/stock/doctype/item/item.js:1264 msgid "Create Variants" msgstr "" @@ -13775,12 +13781,12 @@ msgstr "" msgid "Create a new rule to automatically classify transactions." msgstr "" -#: erpnext/stock/doctype/item/item.js:1230 -#: erpnext/stock/doctype/item/item.js:1391 +#: erpnext/stock/doctype/item/item.js:1247 +#: erpnext/stock/doctype/item/item.js:1408 msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2157 +#: erpnext/stock/stock_ledger.py:2205 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -13818,7 +13824,7 @@ msgstr "" msgid "Created {0} draft Grouped Payment Entries" msgstr "" -#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:230 +#: erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py:232 msgid "Created {0} scorecards for {1} between:" msgstr "" @@ -13859,7 +13865,7 @@ msgstr "" msgid "Creating Journal Entries..." msgstr "" -#: erpnext/stock/doctype/item/item.js:999 +#: erpnext/stock/doctype/item/item.js:1016 msgid "Creating Opening Stock Entry..." msgstr "" @@ -13966,6 +13972,13 @@ msgstr "" msgid "Credit" msgstr "" +#. Label of the credit_limits (Table) field in DocType 'Customer' +#. Label of the credit_limits (Table) field in DocType 'Customer Group' +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/setup/doctype/customer_group/customer_group.json +msgid "Credit & Overdue Limits" +msgstr "" + #: erpnext/accounts/report/general_ledger/general_ledger.py:744 msgid "Credit (Transaction)" msgstr "" @@ -14035,23 +14048,19 @@ msgstr "" msgid "Credit Days" msgstr "" -#. Label of the credit_limits (Table) field in DocType 'Customer' #. Label of the credit_limit (Currency) field in DocType 'Customer Credit #. Limit' #. Label of the credit_limit (Currency) field in DocType 'Company' -#. Label of the credit_limits (Table) field in DocType 'Customer Group' #. Label of the section_credit_limit (Section Break) field in DocType 'Supplier #. Group' -#: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json #: erpnext/selling/report/customer_credit_balance/customer_credit_balance.py:65 #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/supplier_group/supplier_group.json msgid "Credit Limit" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:542 +#: erpnext/selling/doctype/customer/customer.py:559 msgid "Credit Limit Crossed" msgstr "" @@ -14131,20 +14140,20 @@ msgstr "" msgid "Credit in Company Currency" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:508 -#: erpnext/selling/doctype/customer/customer.py:564 +#: erpnext/selling/doctype/customer/customer.py:525 +#: erpnext/selling/doctype/customer/customer.py:581 msgid "Credit limit has been crossed for customer {0} ({1}/{2})" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:398 +#: erpnext/selling/doctype/customer/customer.py:412 msgid "Credit limit is already defined for the Company {0}" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:563 +#: erpnext/selling/doctype/customer/customer.py:580 msgid "Credit limit reached for customer {0}" msgstr "" -#: erpnext/accounts/utils.py:2856 +#: erpnext/accounts/utils.py:2850 msgid "Credit limit warning — submission may be blocked: {0}" msgstr "" @@ -14204,7 +14213,7 @@ msgstr "" msgid "Criteria weights must add up to 100%" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:189 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:196 msgid "Cron Interval should be between 1 and 59 Min" msgstr "" @@ -14261,10 +14270,8 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/setup/doctype/currency_exchange/currency_exchange.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Currency Exchange" msgstr "" @@ -14274,7 +14281,6 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json -#: erpnext/workspace_sidebar/accounts_setup.json #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Currency Exchange Settings" msgstr "" @@ -14333,7 +14339,7 @@ msgstr "Filtry měny momentálně nejsou ve vlastním finančním výkazu podpor #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:215 #: erpnext/accounts/doctype/payment_entry/services/gl_composer.py:284 -#: erpnext/accounts/utils.py:2575 +#: erpnext/accounts/utils.py:2569 msgid "Currency for {0} must be {1}" msgstr "" @@ -14391,7 +14397,7 @@ msgstr "" msgid "Current BOM" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:80 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:81 msgid "Current BOM and New BOM cannot be the same" msgstr "" @@ -14632,7 +14638,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:201 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/supplier/supplier.js:225 +#: erpnext/buying/doctype/supplier/supplier.js:234 #: erpnext/controllers/trends.py:434 erpnext/crm/doctype/contract/contract.json #: erpnext/crm/doctype/lead/lead.js:32 #: erpnext/crm/doctype/opportunity/opportunity.js:99 @@ -14646,7 +14652,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.json #: erpnext/projects/doctype/project/project.json -#: erpnext/projects/doctype/timesheet/timesheet.js:223 +#: erpnext/projects/doctype/timesheet/timesheet.js:225 #: erpnext/projects/doctype/timesheet/timesheet.json #: erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py:46 #: erpnext/public/js/sales_trends_filters.js:25 @@ -14694,7 +14700,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:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:493 #: 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 @@ -14714,7 +14720,6 @@ msgstr "" #: erpnext/workspace_sidebar/crm.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Customer" msgstr "Zákazník" @@ -15119,7 +15124,7 @@ msgstr "" msgid "Customer Provided Item Cost" msgstr "" -#: erpnext/setup/doctype/company/company.py:555 +#: erpnext/setup/doctype/company/company.py:557 msgid "Customer Service" msgstr "" @@ -15176,12 +15181,16 @@ msgstr "" msgid "Customer required for 'Customerwise Discount'" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:885 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:891 #: erpnext/selling/doctype/sales_order/sales_order.py:392 #: erpnext/stock/doctype/delivery_note/delivery_note.py:393 msgid "Customer {0} does not belong to project {1}" msgstr "" +#: erpnext/selling/doctype/customer/customer.py:605 +msgid "Customer {0} has an overdue billing limit. Overdue amount {1} exceeds the allowed threshold {2}." +msgstr "" + #. Label of the customer_item_code (Data) field in DocType 'POS Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Sales Invoice Item' #. Label of the customer_item_code (Data) field in DocType 'Quotation Item' @@ -15290,7 +15299,7 @@ msgstr "" msgid "DFS" msgstr "" -#: erpnext/projects/doctype/project/project.py:751 +#: erpnext/projects/doctype/project/project.py:781 msgid "Daily Project Summary for {0}" msgstr "" @@ -15625,13 +15634,13 @@ msgstr "" #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:769 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:775 #: erpnext/controllers/accounts_controller.py:1214 msgid "Debit To" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:754 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:760 msgid "Debit To is required" msgstr "" @@ -15707,7 +15716,7 @@ msgstr "" msgid "Decimeter" msgstr "" -#: erpnext/public/js/utils/sales_common.js:639 +#: erpnext/public/js/utils/sales_common.js:637 msgid "Declare Lost" msgstr "" @@ -15738,11 +15747,6 @@ msgstr "" msgid "Deductee Details" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/taxes.json -msgid "Deduction Certificate" -msgstr "" - #. Label of the deductions_or_loss_section (Section Break) field in DocType #. 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -15785,14 +15789,14 @@ msgstr "" #. Label of the default_advance_paid_account (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:388 +#: erpnext/setup/doctype/company/company.py:390 msgid "Default Advance Paid Account" msgstr "" #. Label of the default_advance_received_account (Link) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:377 +#: erpnext/setup/doctype/company/company.py:379 msgid "Default Advance Received Account" msgstr "" @@ -15807,7 +15811,7 @@ msgstr "" msgid "Default BOM" msgstr "" -#: erpnext/stock/doctype/item/item.py:506 +#: erpnext/stock/doctype/item/item.py:511 msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" @@ -15878,6 +15882,11 @@ msgstr "" msgid "Default Costing Rate" msgstr "" +#. Label of the country (Link) field in DocType 'Global Defaults' +#: erpnext/setup/doctype/global_defaults/global_defaults.json +msgid "Default Country" +msgstr "" + #. Label of the default_currency (Link) field in DocType 'Company' #. Label of the default_currency (Link) field in DocType 'Global Defaults' #: erpnext/setup/doctype/company/company.json @@ -16130,15 +16139,15 @@ msgstr "" msgid "Default Unit of Measure" msgstr "" -#: erpnext/stock/doctype/item/item.py:1428 +#: erpnext/stock/doctype/item/item.py:1433 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You need to either cancel the linked documents or create a new Item." msgstr "" -#: erpnext/stock/doctype/item/item.py:1408 +#: erpnext/stock/doctype/item/item.py:1413 msgid "Default Unit of Measure for Item {0} cannot be changed directly because you have already made some transaction(s) with another UOM. You will need to create a new Item to use a different Default UOM." msgstr "" -#: erpnext/stock/doctype/item/item.py:1012 +#: erpnext/stock/doctype/item/item.py:1017 msgid "Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'" msgstr "" @@ -16154,7 +16163,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Stock Reconciliation' #. Label of the default_warehouse (Link) field in DocType 'Stock Settings' #: erpnext/manufacturing/doctype/bom/bom.json -#: erpnext/stock/doctype/item/item.js:961 +#: erpnext/stock/doctype/item/item.js:978 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -16192,8 +16201,8 @@ msgstr "" msgid "Default tax templates for sales, purchase and items are created." msgstr "" -#: erpnext/stock/doctype/item/item.js:953 -#: erpnext/stock/doctype/item/item.js:965 +#: erpnext/stock/doctype/item/item.js:970 +#: erpnext/stock/doctype/item/item.js:982 msgid "Default warehouse from Item Defaults." msgstr "" @@ -16441,7 +16450,7 @@ msgstr "" #. Order' #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:20 -#: erpnext/controllers/website_list_for_contact.py:216 +#: erpnext/controllers/website_list_for_contact.py:218 #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -16658,7 +16667,7 @@ msgstr "" msgid "Delivery Note Trends" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 msgid "Delivery Note {0} is not submitted" msgstr "" @@ -16878,7 +16887,7 @@ msgstr "" #. Label of the depreciation_amount (Currency) field in DocType 'Depreciation #. Schedule' #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:167 -#: erpnext/assets/doctype/asset/asset.js:384 +#: erpnext/assets/doctype/asset/asset.js:392 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Depreciation Amount" msgstr "" @@ -16961,7 +16970,7 @@ msgstr "" msgid "Depreciation Posting Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:928 +#: erpnext/assets/doctype/asset/asset.js:936 msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "" @@ -17030,7 +17039,7 @@ msgstr "" #. Label of the order_lost_reason (Small Text) field in DocType 'Opportunity' #. Label of the order_lost_reason (Small Text) field in DocType 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json -#: erpnext/public/js/utils/sales_common.js:618 +#: erpnext/public/js/utils/sales_common.js:616 #: erpnext/selling/doctype/quotation/quotation.json msgid "Detailed Reason" msgstr "" @@ -17393,8 +17402,8 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/manufacturing/doctype/work_order/work_order.js:1081 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:392 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:435 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:391 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:434 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Disassemble" @@ -17627,7 +17636,7 @@ msgstr "" msgid "Discount must be less than 100" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3098 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3096 msgid "Discount of {0} applied as per Payment Term" msgstr "" @@ -17699,7 +17708,7 @@ msgstr "" msgid "Dislikes" msgstr "" -#: erpnext/setup/doctype/company/company.py:549 +#: erpnext/setup/doctype/company/company.py:551 msgid "Dispatch" msgstr "" @@ -17939,7 +17948,7 @@ msgstr "" msgid "Do not import" msgstr "" -#. Description of the 'Hide Currency Symbol' (Select) field in DocType 'Global +#. Description of the 'Hide Currency Symbol' (Check) field in DocType 'Global #. Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Do not show any symbol like $ etc next to currencies." @@ -17963,7 +17972,7 @@ msgstr "" msgid "Do not use Batch-wise Valuation" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:966 +#: erpnext/assets/doctype/asset/asset.js:974 msgid "Do you really want to restore this scrapped asset?" msgstr "" @@ -17971,7 +17980,7 @@ msgstr "" msgid "Do you still want to enable immutable ledger?" msgstr "" -#: erpnext/stock/doctype/item/item.js:42 +#: erpnext/stock/doctype/item/item.js:44 msgid "Do you want to change valuation method?" msgstr "" @@ -18231,15 +18240,13 @@ msgstr "" msgid "Due Date cannot be before {0}" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:167 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:175 msgid "Due to stock closing entry {0}, you cannot repost item valuation before {1}" msgstr "" #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:158 -#: erpnext/workspace_sidebar/banking.json msgid "Dunning" msgstr "" @@ -18271,6 +18278,14 @@ msgstr "" msgid "Dunning Letter Text" msgstr "" +#: erpnext/accounts/doctype/dunning/dunning.py:184 +msgid "Dunning Letter for Dunning Type {0} in language '{1}' not found." +msgstr "" + +#: erpnext/accounts/doctype/dunning/dunning.py:188 +msgid "Dunning Letter for Dunning Type {0} not found." +msgstr "" + #. Label of the dunning_level (Int) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Dunning Level" @@ -18279,10 +18294,8 @@ msgstr "" #. Label of the dunning_type (Link) field in DocType 'Dunning' #. Name of a DocType #. Label of the dunning_type (Data) field in DocType 'Dunning Type' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/dunning_type/dunning_type.json -#: erpnext/workspace_sidebar/banking.json msgid "Dunning Type" msgstr "" @@ -18360,6 +18373,10 @@ msgstr "" msgid "Duplicate item group found in the item group table" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:133 +msgid "Duplicate languages found on Dunning Letter Text. Keep only one of them." +msgstr "" + #: erpnext/projects/doctype/project/project.js:186 msgid "Duplicate project has been created" msgstr "" @@ -18939,7 +18956,7 @@ msgstr "" msgid "Enable Accounting Dimensions" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1752 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1754 msgid "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock." msgstr "" @@ -18955,7 +18972,7 @@ msgstr "" msgid "Enable Auto Email" msgstr "" -#: erpnext/stock/doctype/item/item.py:1216 +#: erpnext/stock/doctype/item/item.py:1221 msgid "Enable Auto Re-Order" msgstr "" @@ -19050,6 +19067,12 @@ msgstr "" msgid "Enable Opportunity Creation from Contact Us" msgstr "" +#. Label of the enable_overdue_billing_threshold (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Overdue Billing Threshold" +msgstr "" + #. Label of the enable_parallel_reposting (Check) field in DocType 'Stock #. Reposting Settings' #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -19293,7 +19316,7 @@ msgstr "" msgid "End Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:367 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:366 msgid "End Transit" msgstr "" @@ -19407,7 +19430,7 @@ msgstr "" msgid "Enter amount to be redeemed." msgstr "" -#: erpnext/stock/doctype/item/item.js:1560 +#: erpnext/stock/doctype/item/item.js:1577 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "" @@ -19419,7 +19442,7 @@ msgstr "" msgid "Enter customer's phone number" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:937 +#: erpnext/assets/doctype/asset/asset.js:945 msgid "Enter date to scrap asset" msgstr "" @@ -19462,7 +19485,7 @@ msgstr "" msgid "Enter the name of the bank or lending institution before submitting." msgstr "" -#: erpnext/stock/doctype/item/item.js:1586 +#: erpnext/stock/doctype/item/item.js:1603 msgid "Enter the opening stock units." msgstr "" @@ -19573,7 +19596,7 @@ msgstr "" msgid "Error while processing deferred accounting for {0}" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:613 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:762 msgid "Error while reposting item valuation" msgstr "" @@ -19631,7 +19654,7 @@ msgstr "" msgid "Example URL" msgstr "" -#: erpnext/stock/doctype/item/item.py:1128 +#: erpnext/stock/doctype/item/item.py:1133 msgid "Example of a linked document: {0}" msgstr "" @@ -19650,7 +19673,7 @@ msgstr "Příklad: ABCD.#####. Pokud je nastavena řada a v transakcích není u msgid "Example: If the transaction amount is 200, then this will be calculated as {} = {}" msgstr "" -#: erpnext/stock/stock_ledger.py:2446 +#: erpnext/stock/stock_ledger.py:2494 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -19708,7 +19731,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:743 +#: erpnext/setup/doctype/company/company.py:745 msgid "Exchange Gain/Loss" msgstr "" @@ -19813,7 +19836,7 @@ msgstr "" msgid "Excise Entry" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1520 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1524 msgid "Excise Invoice" msgstr "" @@ -20027,7 +20050,7 @@ msgstr "" msgid "Expense" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:220 +#: erpnext/stock/services/base_stock_gl_composer.py:276 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "" @@ -20079,7 +20102,7 @@ msgstr "" msgid "Expense Account" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:199 +#: erpnext/stock/services/base_stock_gl_composer.py:266 msgid "Expense Account Missing" msgstr "" @@ -20113,6 +20136,32 @@ msgstr "" msgid "Expenses" msgstr "" +#. Label of the expenses_added_to_stock_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_account (Link) field in DocType 'Item +#. Default' +#. Label of the vf_expenses_added_to_stock_account (Read Only) field in DocType +#. 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Account" +msgstr "" + +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Company' +#. Label of the expenses_added_to_stock_contra_account (Link) field in DocType +#. 'Item Default' +#. Label of the vf_expenses_added_to_stock_contra_account (Read Only) field in +#. DocType 'Item Default' +#: erpnext/setup/doctype/company/company.json +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Expenses Added To Stock Contra Account" +msgstr "" + +#: erpnext/stock/services/base_stock_gl_composer.py:217 +msgid "Expenses Added To Stock for Item {0}" +msgstr "" + #. Option for the 'Account Type' (Select) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:92 @@ -20130,7 +20179,7 @@ msgid "Expenses Included In Valuation" msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:310 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:518 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:517 msgid "Expired Batches" msgstr "" @@ -20267,11 +20316,6 @@ msgstr "" msgid "FIFO/LIFO Queue" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "FX Revaluation" -msgstr "" - #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Fahrenheit" @@ -20320,7 +20364,7 @@ msgstr "" msgid "Failed to personalize your setup" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:269 +#: erpnext/assets/doctype/asset/asset.js:277 msgid "Failed to post depreciation entries" msgstr "" @@ -20345,7 +20389,7 @@ msgstr "" msgid "Failed to setup defaults" msgstr "" -#: erpnext/setup/doctype/company/company.py:923 +#: erpnext/setup/doctype/company/company.py:925 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "" @@ -20456,8 +20500,8 @@ msgstr "" msgid "Fetch Value From" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:833 +#: erpnext/stock/doctype/material_request/material_request.js:373 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:832 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "" @@ -20624,7 +20668,6 @@ msgstr "" #. Label of the finance_book (Link) field in DocType 'Asset Finance Book' #. Label of the finance_book (Link) field in DocType 'Asset Shift Allocation' #. Label of the finance_book (Link) field in DocType 'Asset Value Adjustment' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/finance_book/finance_book.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -20655,7 +20698,6 @@ msgstr "" #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/report/fixed_asset_register/fixed_asset_register.js:48 #: erpnext/public/js/financial_statements.js:426 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Finance Book" msgstr "" @@ -20852,7 +20894,7 @@ msgid "Finished Good {0} must be a sub-contracted item." msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1475 -#: erpnext/setup/doctype/company/company.py:454 +#: erpnext/setup/doctype/company/company.py:456 msgid "Finished Goods" msgstr "" @@ -20893,7 +20935,7 @@ msgstr "" msgid "Finished Goods based Operating Cost" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:887 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:900 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "" @@ -20967,7 +21009,6 @@ msgstr "" #. Certificate' #. Label of the fiscal_year (Link) field in DocType 'Target Detail' #. Label of the fiscal_year (Data) field in DocType 'Stock Ledger Entry' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/fiscal_year/fiscal_year.json #: erpnext/accounts/doctype/gl_entry/gl_entry.json #: erpnext/accounts/doctype/monthly_distribution/monthly_distribution.json @@ -20988,7 +21029,6 @@ msgstr "" #: erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js:15 #: erpnext/setup/doctype/target_detail/target_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Fiscal Year" msgstr "" @@ -21050,7 +21090,7 @@ msgstr "" msgid "Fixed Asset Defaults" msgstr "" -#: erpnext/stock/doctype/item/item.py:374 +#: erpnext/stock/doctype/item/item.py:379 msgid "Fixed Asset Item must be a non-stock item." msgstr "" @@ -21175,7 +21215,7 @@ msgstr "" msgid "For" msgstr "" -#: erpnext/public/js/utils/sales_common.js:395 +#: erpnext/public/js/utils/sales_common.js:393 msgid "For 'Product Bundle' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Product Bundle' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table." msgstr "" @@ -21271,11 +21311,11 @@ msgstr "" #. Label of the warehouse (Link) field in DocType 'Material Request Plan Item' #. Label of the for_warehouse (Link) field in DocType 'Production Plan' #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:499 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:497 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:180 #: erpnext/selling/doctype/sales_order/sales_order.js:1488 -#: erpnext/stock/doctype/material_request/material_request.js:361 +#: erpnext/stock/doctype/material_request/material_request.js:362 #: erpnext/templates/form_grid/material_request_grid.html:36 msgid "For Warehouse" msgstr "" @@ -21403,7 +21443,7 @@ msgctxt "Clear payment terms template and/or payment schedule when due date is c msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:272 +#: erpnext/stock/services/serial_batch_bundle_service.py:274 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "" @@ -21620,7 +21660,7 @@ msgstr "" msgid "From Date and To Date are required" msgstr "" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:30 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:40 msgid "From Date and To Date lie in different Fiscal Year" msgstr "" @@ -21643,9 +21683,9 @@ msgstr "" #: erpnext/accounts/report/general_ledger/general_ledger.py:86 #: erpnext/accounts/report/pos_register/pos_register.py:124 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:32 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:25 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:34 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:38 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:35 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:39 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:49 msgid "From Date must be before To Date" msgstr "" @@ -22102,7 +22142,7 @@ msgstr "" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:138 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:225 -#: erpnext/setup/doctype/company/company.py:751 +#: erpnext/setup/doctype/company/company.py:753 msgid "Gain/Loss on Asset Disposal" msgstr "" @@ -22169,7 +22209,10 @@ msgstr "" msgid "General Ledger requires {0} to be synced to DuckDB" msgstr "" +#. Label of the general_settings_section (Section Break) field in DocType +#. 'Global Defaults' #. Label of the gs (Section Break) field in DocType 'Item Group' +#: erpnext/setup/doctype/global_defaults/global_defaults.json #: erpnext/setup/doctype/item_group/item_group.json msgid "General Settings" msgstr "Obecná nastavení" @@ -22281,7 +22324,7 @@ msgstr "" msgid "Get Current Stock" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:190 +#: erpnext/selling/doctype/customer/customer.js:199 msgid "Get Customer Group Details" msgstr "" @@ -22345,15 +22388,15 @@ msgstr "" #: erpnext/selling/doctype/sales_order/sales_order.js:1254 #: erpnext/stock/doctype/delivery_note/delivery_note.js:187 #: erpnext/stock/doctype/delivery_note/delivery_note.js:239 -#: erpnext/stock/doctype/material_request/material_request.js:141 -#: erpnext/stock/doctype/material_request/material_request.js:238 +#: erpnext/stock/doctype/material_request/material_request.js:144 +#: erpnext/stock/doctype/material_request/material_request.js:241 #: 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:461 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:508 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:541 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:632 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:800 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:460 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:507 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:540 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:631 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:799 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "" @@ -22368,9 +22411,9 @@ msgstr "" msgid "Get Items for Purchase Only" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:836 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:849 +#: erpnext/stock/doctype/material_request/material_request.js:347 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:835 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:848 msgid "Get Items from BOM" msgstr "" @@ -22454,7 +22497,7 @@ msgstr "" msgid "Get Started Sections" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:581 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:579 msgid "Get Stock" msgstr "" @@ -22464,7 +22507,7 @@ msgstr "" msgid "Get Sub Assembly Items" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:151 +#: erpnext/buying/doctype/supplier/supplier.js:160 msgid "Get Supplier Group Details" msgstr "" @@ -22556,7 +22599,7 @@ msgstr "" msgid "Goods" msgstr "" -#: erpnext/setup/doctype/company/company.py:455 +#: erpnext/setup/doctype/company/company.py:457 #: erpnext/stock/doctype/stock_entry/stock_entry_list.js:34 msgid "Goods In Transit" msgstr "" @@ -22565,7 +22608,7 @@ msgstr "" msgid "Goods Transferred" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1335 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1348 msgid "Goods are already received against the outward entry {0}" msgstr "" @@ -23197,7 +23240,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:2142 +#: erpnext/stock/stock_ledger.py:2190 msgid "Here are the options to proceed:" msgstr "" @@ -23225,7 +23268,7 @@ msgstr "Zde jsou vaše pravidelné volné dny předvyplněny podle předchozích msgid "Hertz" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:615 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:764 msgid "Hi," msgstr "" @@ -23240,8 +23283,7 @@ msgstr "" msgid "Hidden list maintaining the list of contacts linked to Shareholder" msgstr "" -#. Label of the hide_currency_symbol (Select) field in DocType 'Global -#. Defaults' +#. Label of the hide_currency_symbol (Check) field in DocType 'Global Defaults' #: erpnext/setup/doctype/global_defaults/global_defaults.json msgid "Hide Currency Symbol" msgstr "" @@ -23429,7 +23471,7 @@ msgstr "" msgid "Hrs" msgstr "" -#: erpnext/setup/doctype/company/company.py:561 +#: erpnext/setup/doctype/company/company.py:563 msgid "Human Resources" msgstr "" @@ -23603,6 +23645,23 @@ msgstr "" msgid "If checked, the tax amount will be considered as already included in the Print Rate / Print Amount" msgstr "" +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Customer' +#: erpnext/selling/doctype/customer/customer.json +msgid "If checked, this Customer is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "If checked, this Item is only available for transactions in the companies listed below." +msgstr "" + +#. Description of the 'Restrict to Companies' (Check) field in DocType +#. 'Supplier' +#: erpnext/buying/doctype/supplier/supplier.json +msgid "If checked, this Supplier is only available for transactions in the companies listed below." +msgstr "" + #. Description of the 'Delivered by Supplier (Drop Ship)' (Check) field in #. DocType 'Item' #: erpnext/stock/doctype/item/item.json @@ -23861,7 +23920,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:2152 +#: erpnext/stock/stock_ledger.py:2200 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -23907,7 +23966,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:2145 +#: erpnext/stock/stock_ledger.py:2193 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 "" @@ -23994,7 +24053,7 @@ msgstr "" msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "" -#: erpnext/stock/doctype/item/item.js:1572 +#: erpnext/stock/doctype/item/item.js:1589 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 "" @@ -24008,7 +24067,7 @@ msgstr "" msgid "If you still want to proceed, please disable {0} checkbox." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:469 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:475 msgid "If you still want to proceed, please enable {0}." msgstr "" @@ -24175,7 +24234,7 @@ msgstr "" msgid "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports" msgstr "" -#: erpnext/stock/doctype/item/item.py:269 +#: erpnext/stock/doctype/item/item.py:274 msgid "Image in the description has been removed. To disable this behavior, uncheck \"{0}\" in {1}." msgstr "" @@ -24340,7 +24399,7 @@ msgid "In Production" 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/batch_wise_balance_history/batch_wise_balance_history.py:87 #: erpnext/stock/report/stock_balance/stock_balance.py:547 #: erpnext/stock/report/stock_ledger/stock_ledger.py:317 msgid "In Qty" @@ -24364,11 +24423,11 @@ msgstr "" msgid "In Transit" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:477 +#: erpnext/stock/doctype/material_request/material_request.js:478 msgid "In Transit Transfer" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:446 +#: erpnext/stock/doctype/material_request/material_request.js:447 msgid "In Transit Warehouse" msgstr "" @@ -24475,7 +24534,7 @@ msgstr "" msgid "In this case, the amount will be calculated as 25% of the transaction amount. If the transaction amount is 200, then this will be calculated as 200 * 0.25 = 50." msgstr "" -#: erpnext/stock/doctype/item/item.js:1605 +#: erpnext/stock/doctype/item/item.js:1622 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "" @@ -24744,6 +24803,10 @@ msgstr "" msgid "Income Account" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:86 +msgid "Income Account Validation Error" +msgstr "" + #. Label of the income_and_expense_account (Section Break) field in DocType #. 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -24755,7 +24818,9 @@ msgstr "" msgid "Income from this item will be recognized over a period of months instead of all at once. Eg: annual subscription paid upfront." msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Bills" msgstr "" @@ -24770,7 +24835,9 @@ msgstr "" msgid "Incoming Call Settings" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Incoming Payment" msgstr "" @@ -24817,7 +24884,7 @@ msgstr "" msgid "Incorrect Batch Consumed" msgstr "" -#: erpnext/stock/doctype/item/item.py:604 +#: erpnext/stock/doctype/item/item.py:609 msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "" @@ -25105,7 +25172,7 @@ msgstr "" msgid "Installation Note Item" msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:635 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:640 msgid "Installation Note {0} has already been submitted" msgstr "" @@ -25155,13 +25222,13 @@ msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:466 #: erpnext/stock/doctype/pick_list/pick_list.py:148 #: erpnext/stock/doctype/pick_list/pick_list.py:166 -#: erpnext/stock/doctype/pick_list/pick_list.py:1130 -#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1827 -#: erpnext/stock/stock_ledger.py:2334 +#: erpnext/stock/doctype/pick_list/pick_list.py:1139 +#: erpnext/stock/serial_batch_bundle.py:1243 erpnext/stock/stock_ledger.py:1875 +#: erpnext/stock/stock_ledger.py:2382 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2349 +#: erpnext/stock/stock_ledger.py:2397 msgid "Insufficient Stock for Batch" msgstr "" @@ -25291,7 +25358,7 @@ msgstr "" msgid "Interest Income" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2729 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2727 msgid "Interest and/or dunning fee" msgstr "" @@ -25316,7 +25383,7 @@ msgstr "" msgid "Internal Customer Accounting" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:259 +#: erpnext/selling/doctype/customer/customer.py:271 msgid "Internal Customer for company {0} already exists" msgstr "" @@ -25342,7 +25409,7 @@ msgstr "" msgid "Internal Supplier Details" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:181 +#: erpnext/buying/doctype/supplier/supplier.py:190 msgid "Internal Supplier for company {0} already exists" msgstr "" @@ -25403,8 +25470,8 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:381 #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:770 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:780 #: erpnext/accounts/services/taxes.py:271 #: erpnext/accounts/services/taxes.py:279 #: erpnext/assets/doctype/asset_category/asset_category.py:69 @@ -25429,7 +25496,7 @@ msgstr "Neplatná částka" msgid "Invalid Attribute" msgstr "" -#: erpnext/stock/doctype/item/item.js:1199 +#: erpnext/stock/doctype/item/item.js:1216 msgid "Invalid Attribute Values" msgstr "" @@ -25466,7 +25533,7 @@ msgstr "" msgid "Invalid Company for Inter Company Transaction." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:972 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:978 msgid "Invalid Configuration" msgstr "" @@ -25476,7 +25543,7 @@ msgstr "" msgid "Invalid Cost Center" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:372 +#: erpnext/selling/doctype/customer/customer.py:386 msgid "Invalid Customer Group" msgstr "" @@ -25531,7 +25598,7 @@ msgstr "" msgid "Invalid Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1566 +#: erpnext/stock/doctype/item/item.py:1571 msgid "Invalid Item Defaults" msgstr "" @@ -25617,7 +25684,7 @@ msgstr "" msgid "Invalid Selling Price" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:975 msgid "Invalid Serial and Batch Bundle" msgstr "" @@ -25670,7 +25737,7 @@ msgstr "" msgid "Invalid lost reason {0}, please create a new lost reason" msgstr "" -#: erpnext/stock/doctype/item/item.py:478 +#: erpnext/stock/doctype/item/item.py:483 msgid "Invalid naming series (. missing) for {0}" msgstr "" @@ -25698,7 +25765,7 @@ msgstr "" msgid "Invalid status group: {0}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 msgid "Invalid subcontract order field: {0}" msgstr "" @@ -25965,7 +26032,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:1198 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 #: erpnext/accounts/report/accounts_payable/accounts_payable.js:270 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:64 @@ -26004,11 +26071,6 @@ msgstr "" msgid "Inward" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Inward Order" -msgstr "" - #. Label of the is_account_payable (Check) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json @@ -26581,7 +26643,7 @@ msgstr "" msgid "Issue Date" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:180 +#: erpnext/stock/doctype/material_request/material_request.js:183 msgid "Issue Material" msgstr "" @@ -26655,7 +26717,7 @@ msgstr "" msgid "Issuing Date" msgstr "" -#: erpnext/stock/doctype/item/item.py:649 +#: erpnext/stock/doctype/item/item.py:654 msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "" @@ -26767,7 +26829,7 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.py:93 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.js:24 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:32 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:76 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 #: erpnext/stock/report/item_price_stock/item_price_stock.js:8 #: erpnext/stock/report/item_prices/item_prices.py:50 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:88 @@ -26802,8 +26864,6 @@ msgstr "" #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Item" msgstr "" @@ -27033,7 +27093,7 @@ msgstr "" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.js:27 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:128 -#: erpnext/projects/doctype/timesheet/timesheet.js:214 +#: erpnext/projects/doctype/timesheet/timesheet.js:216 #: erpnext/public/js/controllers/transaction.js:2951 #: erpnext/public/js/stock_reservation.js:112 #: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:608 @@ -27288,7 +27348,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/page/stock_balance/stock_balance.js:35 -#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:43 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:54 #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:48 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:48 #: erpnext/stock/report/item_prices/item_prices.py:52 @@ -27322,11 +27382,11 @@ msgstr "" msgid "Item Group Name" msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:119 +#: erpnext/setup/doctype/item_group/item_group.js:136 msgid "Item Group Override" msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:82 +#: erpnext/setup/doctype/item_group/item_group.js:99 msgid "Item Group Tree" msgstr "" @@ -27555,7 +27615,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:32 #: erpnext/stock/report/available_serial_no/available_serial_no.py:99 #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:33 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:77 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:153 #: erpnext/stock/report/item_price_stock/item_price_stock.py:24 #: erpnext/stock/report/item_prices/item_prices.py:51 @@ -27629,8 +27689,8 @@ msgstr "" msgid "Item Price Stock" msgstr "" -#: erpnext/stock/get_item_details.py:1182 -#: erpnext/stock/get_item_details.py:1206 +#: erpnext/stock/get_item_details.py:1181 +#: erpnext/stock/get_item_details.py:1205 msgid "Item Price added for {0} in Price List - {1}" msgstr "" @@ -27638,11 +27698,11 @@ msgstr "" msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "" -#: erpnext/stock/doctype/item/item.py:183 +#: erpnext/stock/doctype/item/item.py:187 msgid "Item Price created at rate {0}" msgstr "" -#: erpnext/stock/get_item_details.py:1165 +#: erpnext/stock/get_item_details.py:1164 msgid "Item Price updated for {0} in Price List {1}" msgstr "" @@ -27785,7 +27845,6 @@ msgstr "" #. Label of the item_tax_template (Link) field in DocType 'Item Tax' #. Label of the item_tax_template (Link) field in DocType 'Purchase Receipt #. Item' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/item_tax_template/item_tax_template.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -27798,7 +27857,6 @@ msgstr "" #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/workspace_sidebar/taxes.json msgid "Item Tax Template" msgstr "" @@ -27835,7 +27893,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:239 +#: erpnext/stock/doctype/item/item.js:250 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -27843,11 +27901,11 @@ msgstr "" msgid "Item Variant Settings" msgstr "" -#: erpnext/stock/doctype/item/item.js:1421 +#: erpnext/stock/doctype/item/item.js:1438 msgid "Item Variant {0} already exists with same attributes" msgstr "" -#: erpnext/stock/doctype/item/item.py:840 +#: erpnext/stock/doctype/item/item.py:845 msgid "Item Variants updated" msgstr "" @@ -27955,7 +28013,7 @@ msgstr "" msgid "Item for row {0} does not match Material Request" msgstr "" -#: erpnext/stock/doctype/item/item.py:899 +#: erpnext/stock/doctype/item/item.py:904 msgid "Item has variants." msgstr "" @@ -27981,10 +28039,14 @@ msgstr "" msgid "Item operation" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:622 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:635 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "" +#: erpnext/stock/doctype/material_request/material_request.py:231 +msgid "Item rates have been updated based on the selected Buying Price List {0}" +msgstr "" + #. Label of the item (Link) field in DocType 'BOM' #. Label of the finished_good (Link) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/bom/bom.json @@ -28000,7 +28062,7 @@ msgstr "" msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "" -#: erpnext/stock/doctype/item/item.py:1056 +#: erpnext/stock/doctype/item/item.py:1061 msgid "Item variant {0} exists with same attributes" msgstr "" @@ -28025,7 +28087,7 @@ msgid "Item {0} cannot be received in more than {1} qty against the {2} {3}" msgstr "" #: erpnext/assets/doctype/asset/asset.py:347 -#: erpnext/stock/doctype/item/item.py:695 +#: erpnext/stock/doctype/item/item.py:700 msgid "Item {0} does not exist" msgstr "" @@ -28034,7 +28096,7 @@ msgid "Item {0} does not exist in the system or has expired" msgstr "" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1489 -#: erpnext/stock/services/serial_batch_bundle_service.py:388 +#: erpnext/stock/services/serial_batch_bundle_service.py:390 msgid "Item {0} does not exist." msgstr "" @@ -28058,15 +28120,15 @@ msgstr "" msgid "Item {0} has no changes in delivered quantity. Please unselect the row if you do not wish to update its quantity." msgstr "" -#: erpnext/stock/doctype/item/item.py:1278 +#: erpnext/stock/doctype/item/item.py:1283 msgid "Item {0} has reached its end of life on {1}" msgstr "" -#: erpnext/stock/stock_ledger.py:164 +#: erpnext/stock/stock_ledger.py:168 msgid "Item {0} ignored since it is not a stock item" msgstr "" -#: erpnext/stock/get_item_details.py:357 +#: erpnext/stock/get_item_details.py:356 msgid "Item {0} is a template, please select one of its variants" msgstr "" @@ -28074,11 +28136,11 @@ msgstr "" msgid "Item {0} is already reserved/delivered against Sales Order {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1298 +#: erpnext/stock/doctype/item/item.py:1303 msgid "Item {0} is cancelled" msgstr "" -#: erpnext/stock/doctype/item/item.py:1282 +#: erpnext/stock/doctype/item/item.py:1287 msgid "Item {0} is disabled" msgstr "" @@ -28090,7 +28152,7 @@ msgstr "" msgid "Item {0} is not a serialized Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:1290 +#: erpnext/stock/doctype/item/item.py:1295 msgid "Item {0} is not a stock Item" msgstr "" @@ -28098,11 +28160,11 @@ msgstr "" msgid "Item {0} is not a subcontracted item" msgstr "" -#: erpnext/stock/doctype/item/item.py:857 +#: erpnext/stock/doctype/item/item.py:862 msgid "Item {0} is not a template item." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1258 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1271 msgid "Item {0} is not active or end of life has been reached" msgstr "" @@ -28110,7 +28172,7 @@ msgstr "" msgid "Item {0} must be a Fixed Asset Item" msgstr "" -#: erpnext/stock/get_item_details.py:363 +#: erpnext/stock/get_item_details.py:362 msgid "Item {0} must be a Non-Stock Item" msgstr "" @@ -28126,11 +28188,11 @@ msgstr "" msgid "Item {0} not found." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:315 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:316 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:602 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:600 msgid "Item {0}: {1} qty produced. " msgstr "" @@ -28176,7 +28238,7 @@ msgstr "" msgid "Item-wise sales Register" msgstr "" -#: erpnext/stock/get_item_details.py:767 +#: erpnext/stock/get_item_details.py:766 msgid "Item/Item Code required to get Item Tax Template." msgstr "" @@ -28209,11 +28271,6 @@ msgstr "" msgid "Items Required" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Items To Be Received" -msgstr "" - #. Label of a Link in the Buying Workspace #. Name of a report #. Label of a Workspace Sidebar Item @@ -28244,7 +28301,7 @@ msgstr "" msgid "Items not found." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:618 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:631 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "" @@ -28545,8 +28602,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:390 -#: erpnext/assets/doctype/asset/asset.js:399 +#: erpnext/assets/doctype/asset/asset.js:398 +#: erpnext/assets/doctype/asset/asset.js:407 #: erpnext/assets/doctype/asset/asset.json #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -28563,10 +28620,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Journal Entry Template" msgstr "" @@ -28843,7 +28898,7 @@ msgstr "" msgid "Last Fiscal Year" msgstr "" -#: erpnext/accounts/doctype/account/account.py:673 +#: erpnext/accounts/doctype/account/account.py:680 msgid "Last GL Entry update was done {0}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." msgstr "" @@ -29097,7 +29152,7 @@ msgstr "" msgid "Leave Encashed?" msgstr "" -#: erpnext/stock/doctype/item/item.js:980 +#: erpnext/stock/doctype/item/item.js:997 msgid "Leave as 0 to allow zero valuation rate." msgstr "" @@ -29174,11 +29229,11 @@ msgstr "" msgid "Left Index" msgstr "" -#: erpnext/stock/doctype/item/item.js:402 +#: erpnext/stock/doctype/item/item.js:413 msgid "Left column shows inherited defaults (Item Group → Company / Stock Settings). Right column is where you set overrides for this item only." msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:136 +#: erpnext/setup/doctype/item_group/item_group.js:153 msgid "Left column shows system-level defaults (Company / Stock Settings). Right column is where you set overrides for this item group." msgstr "" @@ -29325,11 +29380,11 @@ msgstr "" msgid "Link to Material Requests" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:164 +#: erpnext/buying/doctype/supplier/supplier.js:173 msgid "Link with Customer" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:203 +#: erpnext/selling/doctype/customer/customer.js:212 msgid "Link with Supplier" msgstr "" @@ -29350,20 +29405,20 @@ msgstr "" msgid "Linked Location" msgstr "" -#: erpnext/stock/doctype/item/item.py:1132 +#: erpnext/stock/doctype/item/item.py:1137 msgid "Linked with submitted documents" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:251 -#: erpnext/selling/doctype/customer/customer.js:283 +#: erpnext/buying/doctype/supplier/supplier.js:260 +#: erpnext/selling/doctype/customer/customer.js:292 msgid "Linking Failed" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:250 +#: erpnext/buying/doctype/supplier/supplier.js:259 msgid "Linking to Customer Failed. Please try again." msgstr "" -#: erpnext/selling/doctype/customer/customer.js:282 +#: erpnext/selling/doctype/customer/customer.js:291 msgid "Linking to Supplier failed. Please try again." msgstr "" @@ -29539,7 +29594,7 @@ msgstr "" #. 'Quotation' #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/report/lost_opportunity/lost_opportunity.py:54 -#: erpnext/public/js/utils/sales_common.js:602 +#: erpnext/public/js/utils/sales_common.js:600 #: erpnext/selling/doctype/quotation/quotation.json msgid "Lost Reasons" msgstr "" @@ -29726,10 +29781,10 @@ msgstr "" msgid "Machine operator errors" msgstr "" -#: erpnext/setup/doctype/company/company.py:789 -#: erpnext/setup/doctype/company/company.py:804 -#: erpnext/setup/doctype/company/company.py:805 +#: erpnext/setup/doctype/company/company.py:791 #: erpnext/setup/doctype/company/company.py:806 +#: erpnext/setup/doctype/company/company.py:807 +#: erpnext/setup/doctype/company/company.py:808 msgid "Main" msgstr "" @@ -30053,11 +30108,11 @@ msgstr "Uskutečnit hovor" msgid "Make project from a template." msgstr "" -#: erpnext/stock/doctype/item/item.js:1216 +#: erpnext/stock/doctype/item/item.js:1233 msgid "Make {0} Variant" msgstr "" -#: erpnext/stock/doctype/item/item.js:1217 +#: erpnext/stock/doctype/item/item.js:1234 msgid "Make {0} Variants" msgstr "" @@ -30080,7 +30135,7 @@ msgstr "" msgid "Manage your orders" msgstr "" -#: erpnext/setup/doctype/company/company.py:567 +#: erpnext/setup/doctype/company/company.py:569 msgid "Management" msgstr "" @@ -30195,8 +30250,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:721 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:738 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:734 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:751 #: 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 @@ -30417,7 +30472,7 @@ msgstr "" msgid "Manufacturing Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:67 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:72 msgid "Manufacturing Variance for {0}" msgstr "" @@ -30535,7 +30590,7 @@ msgstr "" msgid "Market Segment" msgstr "" -#: erpnext/setup/doctype/company/company.py:519 +#: erpnext/setup/doctype/company/company.py:521 msgid "Marketing" msgstr "" @@ -30626,12 +30681,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:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:735 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:688 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:687 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "" @@ -30661,7 +30716,7 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:77 -#: erpnext/stock/doctype/material_request/material_request.js:188 +#: erpnext/stock/doctype/material_request/material_request.js:191 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Receipt" @@ -30720,13 +30775,13 @@ msgstr "" #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:37 #: 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:437 -#: erpnext/stock/doctype/material_request/material_request.py:454 +#: erpnext/stock/doctype/material_request/material_request.py:476 +#: erpnext/stock/doctype/material_request/material_request.py:493 #: 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:309 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:465 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:308 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:464 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:135 #: erpnext/stock/workspace/stock/stock.json @@ -30814,7 +30869,7 @@ msgstr "" msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:149 +#: erpnext/stock/doctype/material_request/material_request.py:150 msgid "Material Request of maximum {0} can be made for Item {1} against Sales Order {2}" msgstr "" @@ -30882,7 +30937,7 @@ msgstr "" #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/setup/setup_wizard/operations/install_fixtures.py:83 #: erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/material_request/material_request.js:166 +#: erpnext/stock/doctype/material_request/material_request.js:169 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -30890,7 +30945,7 @@ msgstr "" msgid "Material Transfer" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:172 +#: erpnext/stock/doctype/material_request/material_request.js:175 msgid "Material Transfer (In Transit)" msgstr "" @@ -30947,11 +31002,6 @@ msgstr "" msgid "Materials Ready" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Materials To Be Transferred" -msgstr "" - #: erpnext/controllers/subcontracting_controller.py:1554 msgid "Materials are already received against the {0} {1}" msgstr "" @@ -31032,7 +31082,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:1072 #: erpnext/manufacturing/doctype/work_order/work_order.js:1095 #: erpnext/stock/doctype/pick_list/pick_list.js:208 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:404 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:403 msgid "Max: {0}" msgstr "" @@ -31093,7 +31143,7 @@ msgstr "" msgid "Maximum discount for Item {0} is {1}%" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:120 +#: erpnext/public/js/utils/barcode_scanner.js:125 msgid "Maximum quantity scanned for item {0}." msgstr "" @@ -31131,7 +31181,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2158 +#: erpnext/stock/stock_ledger.py:2206 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -31414,7 +31464,7 @@ msgstr "" msgid "Min Qty should be greater than Recurse Over Qty" msgstr "" -#: erpnext/stock/doctype/item/item.js:1372 +#: erpnext/stock/doctype/item/item.js:1389 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "" @@ -31508,7 +31558,7 @@ msgstr "" msgid "Miscellaneous Expenses" msgstr "" -#: erpnext/controllers/buying_controller.py:729 +#: erpnext/controllers/buying_controller.py:737 msgid "Mismatch" msgstr "" @@ -31554,7 +31604,7 @@ msgstr "" msgid "Missing Finance Book" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:897 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:910 msgid "Missing Finished Good" msgstr "" @@ -31570,7 +31620,7 @@ msgstr "" msgid "Missing Parameter" msgstr "" -#: erpnext/utilities/__init__.py:57 +#: erpnext/utilities/__init__.py:84 msgid "Missing Payments App" msgstr "" @@ -31578,7 +31628,7 @@ msgstr "" msgid "Missing Required Filter" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:297 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:300 msgid "Missing Serial No Bundle" msgstr "" @@ -31639,7 +31689,6 @@ msgstr "" #. Label of the mode_of_payment (Link) field in DocType 'Purchase Invoice' #. Label of the mode_of_payment (Link) field in DocType 'Sales Invoice Payment' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:234 #: banking/src/components/features/BankReconciliation/RecordPaymentModalContent.tsx:433 #: erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json @@ -31666,7 +31715,6 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.js:40 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/selling/page/point_of_sale/pos_controller.js:33 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Mode of Payment" msgstr "" @@ -31852,7 +31900,7 @@ msgstr "" msgid "Multiple Accounts (Journal Template)" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:443 +#: erpnext/selling/doctype/customer/customer.py:460 msgid "Multiple Loyalty Programs found for Customer {0}. Please select manually." msgstr "" @@ -31870,7 +31918,7 @@ msgstr "" msgid "Multiple Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:263 +#: erpnext/stock/doctype/item/item.js:274 msgid "Multiple Variants" msgstr "" @@ -31882,7 +31930,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:904 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:917 msgid "Multiple items cannot be marked as finished item" msgstr "" @@ -32359,10 +32407,6 @@ msgstr "" msgid "New Asset Value" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:169 -msgid "New Assets (This Year)" -msgstr "" - #. Label of the new_bom (Link) field in DocType 'BOM Update Log' #. Label of the new_bom (Link) field in DocType 'BOM Update Tool' #: erpnext/manufacturing/doctype/bom/bom_tree.js:62 @@ -32481,6 +32525,12 @@ msgstr "" msgid "New Sales Invoice" msgstr "" +#. Description of the 'Overdue Billing Threshold' (Currency) field in DocType +#. 'Customer Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "New Sales Invoices are blocked when the customer's overdue amount exceeds this. Requires 'Enable Overdue Billing Threshold' in Accounts Settings." +msgstr "" + #. Label of the sales_order (Check) field in DocType 'Email Digest' #: erpnext/setup/doctype/email_digest/email_digest.json msgid "New Sales Orders" @@ -32513,7 +32563,7 @@ msgstr "" msgid "New Workplace" msgstr "Nové pracoviště" -#: erpnext/selling/doctype/customer/customer.py:408 +#: erpnext/selling/doctype/customer/customer.py:425 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}" msgstr "" @@ -32600,7 +32650,7 @@ msgstr "" msgid "No Answer" msgstr "Žádná odpověď" -#: erpnext/stock/doctype/item/item.js:924 +#: erpnext/stock/doctype/item/item.js:941 msgid "No Company Found" msgstr "" @@ -32608,7 +32658,7 @@ msgstr "" msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:436 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:435 msgid "No Customers found with selected options." msgstr "" @@ -32624,11 +32674,11 @@ msgstr "" msgid "No Impact on Accounting Ledger" msgstr "" -#: erpnext/stock/get_item_details.py:338 +#: erpnext/stock/get_item_details.py:337 msgid "No Item with Barcode {0}" msgstr "" -#: erpnext/stock/get_item_details.py:342 +#: erpnext/stock/get_item_details.py:341 msgid "No Item with Serial No {0}" msgstr "" @@ -32667,7 +32717,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1124 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1200 #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1221 -#: erpnext/stock/doctype/item/item.py:1525 +#: erpnext/stock/doctype/item/item.py:1530 msgid "No Permission" msgstr "" @@ -32675,7 +32725,7 @@ msgstr "" msgid "No Purchase Invoices selected" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:102 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:116 msgid "No Purchase Orders were created" msgstr "" @@ -32691,7 +32741,7 @@ msgstr "" msgid "No Serial / Batches are available for return" msgstr "" -#: erpnext/stock/stock_ledger.py:928 +#: erpnext/stock/stock_ledger.py:976 msgid "No Standard Valuation Rate found for Item {0} in Company {1} as on {2}. Please create an Item Standard Cost record." msgstr "" @@ -32731,7 +32781,7 @@ msgstr "" msgid "No Unreconciled Payments found for this party" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:100 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:114 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:250 msgid "No Work Orders were created" msgstr "" @@ -32740,7 +32790,7 @@ msgstr "" msgid "No account set" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:356 +#: erpnext/stock/doctype/purchase_receipt/services/gl_composer.py:365 #: erpnext/subcontracting/doctype/subcontracting_receipt/services/gl_composer.py:211 msgid "No accounting entries for the following warehouses" msgstr "" @@ -32769,7 +32819,7 @@ msgstr "" msgid "No additional fields available" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1390 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1391 msgid "No available quantity to reserve for item {0} in warehouse {1}" msgstr "" @@ -32785,7 +32835,7 @@ msgstr "" msgid "No bank transactions found" msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:502 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:501 msgid "No billing email found for customer: {0}" msgstr "" @@ -32809,7 +32859,7 @@ msgstr "" msgid "No data found. Seems like you uploaded a blank file" msgstr "" -#: erpnext/stock/doctype/item/item.js:954 +#: erpnext/stock/doctype/item/item.js:971 msgid "No default warehouse set for this company. Entry will use Stock Settings default." msgstr "" @@ -32995,7 +33045,7 @@ msgstr "" msgid "No pending Material Requests found to link for the given items." msgstr "" -#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:509 +#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:508 msgid "No primary email found for customer: {0}" msgstr "" @@ -33100,7 +33150,7 @@ msgstr "" msgid "No vouchers found for this transaction" msgstr "" -#: erpnext/stock/doctype/item/item.py:1782 +#: erpnext/stock/doctype/item/item.py:1787 msgid "No warehouse found for company {0}. Please set a Default Warehouse in Item Defaults or Stock Settings." msgstr "" @@ -33322,7 +33372,7 @@ msgstr "" msgid "Note: This Cost Center is a Group. Cannot make accounting entries against groups." msgstr "" -#: erpnext/stock/doctype/item/item.py:686 +#: erpnext/stock/doctype/item/item.py:691 msgid "Note: To merge the items, create a separate Stock Reconciliation for the old item {0}" msgstr "" @@ -33677,10 +33727,16 @@ msgstr "" msgid "On enabling this cancellation entries will be posted on the actual cancellation date and reports will consider cancelled entries as well" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:756 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:754 msgid "On expanding a row in the Items to Manufacture table, you'll see an option to 'Include Exploded Items'. Ticking this includes raw materials of the sub-assembly items in the production process." msgstr "" +#. Option for the 'Status' (Select) field in DocType 'Project' +#: erpnext/projects/doctype/project/project.json +#: erpnext/projects/doctype/project/project_list.js:8 +msgid "On hold" +msgstr "" + #. Description of the 'Excluded Fee' (Currency) field in DocType 'Bank #. Transaction' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json @@ -33821,7 +33877,7 @@ msgstr "" msgid "Only one version of a Product Bundle can be active at a time for a given Parent Item. Activating a version deactivates the previously active one." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:737 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:750 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "" @@ -33992,9 +34048,7 @@ msgid "Opening" msgstr "" #. Group in POS Profile's connections -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Opening & Closing" msgstr "" @@ -34101,11 +34155,6 @@ msgstr "" msgid "Opening Invoice Item" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Opening Invoice Tool" -msgstr "" - #: erpnext/accounts/doctype/purchase_invoice/services/gl_composer.py:849 #: erpnext/accounts/doctype/sales_invoice/services/gl_composer.py:644 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." @@ -34132,7 +34181,7 @@ msgstr "" msgid "Opening Purchase Invoice(s) have been created." msgstr "" -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 #: erpnext/stock/report/stock_balance/stock_balance.py:533 msgid "Opening Qty" msgstr "" @@ -34143,31 +34192,31 @@ msgstr "" #. Label of the opening_stock (Float) field in DocType 'Item' #. Option for the 'Purpose' (Select) field in DocType 'Stock Reconciliation' -#: erpnext/stock/doctype/item/item.js:969 erpnext/stock/doctype/item/item.json -#: erpnext/stock/doctype/item/item.py:353 -#: erpnext/stock/doctype/item/item.py:1682 +#: erpnext/stock/doctype/item/item.js:986 erpnext/stock/doctype/item/item.json +#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:1687 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Opening Stock" msgstr "" -#: erpnext/stock/doctype/item/item.py:1636 +#: erpnext/stock/doctype/item/item.py:1641 msgid "Opening Stock can only be set for stock items." msgstr "" -#: erpnext/stock/doctype/item/item.py:1643 +#: erpnext/stock/doctype/item/item.py:1648 msgid "Opening Stock cannot be created as stock transactions already exist for item {0}." msgstr "" -#: erpnext/stock/doctype/item/item.py:1639 +#: erpnext/stock/doctype/item/item.py:1644 msgid "Opening Stock for serialised or batch items must be set via the Stock Reconciliation form." msgstr "" -#: erpnext/stock/doctype/item/item.py:358 +#: erpnext/stock/doctype/item/item.py:363 msgid "Opening Stock reconciliation created with zero valuation rate: {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:366 -#: erpnext/stock/doctype/item/item.py:1685 +#: erpnext/stock/doctype/item/item.py:371 +#: erpnext/stock/doctype/item/item.py:1690 msgid "Opening Stock reconciliation created: {0}" msgstr "" @@ -34189,7 +34238,7 @@ msgstr "" msgid "Opening and Closing balance is not supported for dimension grouped cash flow statement" msgstr "" -#: erpnext/stock/doctype/item/item.py:199 +#: erpnext/stock/doctype/item/item.py:203 msgid "Opening stock creation has been queued and will be created in the background. Please check the Stock Reconciliation after some time." msgstr "" @@ -34343,7 +34392,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:334 #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/public/js/shop_floor/shop_floor.js:387 -#: erpnext/setup/doctype/company/company.py:537 +#: erpnext/setup/doctype/company/company.py:539 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -34688,14 +34737,10 @@ msgstr "" #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' #. Label of a Desktop Icon -#. Name of a Workspace -#. 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/setup/workspace/organization/organization.json -#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "" @@ -34795,7 +34840,7 @@ msgid "Ounce/Gallon (US)" 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/batch_wise_balance_history/batch_wise_balance_history.py:88 #: erpnext/stock/report/stock_balance/stock_balance.py:555 #: erpnext/stock/report/stock_ledger/stock_ledger.py:324 msgid "Out Qty" @@ -34819,7 +34864,7 @@ msgstr "" msgid "Out of Order" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:663 +#: erpnext/stock/doctype/pick_list/pick_list.py:672 msgid "Out of Stock" msgstr "" @@ -34840,12 +34885,16 @@ msgstr "" msgid "Outdated POS Opening Entry" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Bills" msgstr "" +#. Label of a number card in the Accounting Workspace #. Label of a number card in the Invoicing Workspace +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/invoicing/invoicing.json msgid "Outgoing Payment" msgstr "" @@ -34935,11 +34984,6 @@ msgstr "" msgid "Outward" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/subcontracting.json -msgid "Outward Order" -msgstr "" - #. Label of the over_billing_allowance (Currency) field in DocType 'Accounts #. Settings' #. Label of the over_billing_allowance (Float) field in DocType 'Item' @@ -35022,6 +35066,16 @@ msgstr "" msgid "Overdue" msgstr "" +#: erpnext/selling/doctype/customer/customer.py:612 +msgid "Overdue Billing Limit Crossed" +msgstr "" + +#. Label of the overdue_billing_threshold (Currency) field in DocType 'Customer +#. Credit Limit' +#: erpnext/selling/doctype/customer_credit_limit/customer_credit_limit.json +msgid "Overdue Billing Threshold" +msgstr "" + #. Label of the overdue_days (Data) field in DocType 'Overdue Payment' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json msgid "Overdue Days" @@ -35725,7 +35779,7 @@ msgstr "" msgid "Parent Account" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:384 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:385 msgid "Parent Account Missing" msgstr "" @@ -35739,7 +35793,7 @@ msgstr "" msgid "Parent Company" msgstr "" -#: erpnext/setup/doctype/company/company.py:672 +#: erpnext/setup/doctype/company/company.py:674 msgid "Parent Company must be a group company" msgstr "" @@ -35870,7 +35924,7 @@ msgstr "" msgid "Partial Payment in POS Transactions are not allowed." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1755 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1757 msgid "Partial Stock Reservation" msgstr "" @@ -36697,7 +36751,7 @@ msgstr "" msgid "Payment Gateway Account" msgstr "" -#: erpnext/accounts/utils.py:1528 +#: erpnext/accounts/utils.py:1522 msgid "Payment Gateway Account not created, please create one manually." msgstr "" @@ -36971,7 +37025,6 @@ msgstr "Platební plány" #. Label of the payment_term (Link) field in DocType 'Payment Terms Template #. Detail' #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_reference/payment_reference.json @@ -36983,7 +37036,6 @@ msgstr "Platební plány" #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/controllers/transaction.js:559 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:32 -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" msgstr "" @@ -37291,7 +37343,7 @@ msgstr "" msgid "Pending activities for today" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:277 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:285 msgid "Pending processing" msgstr "" @@ -37436,11 +37488,9 @@ msgstr "" #. Balance' #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json #: erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Period Closing Voucher" msgstr "" @@ -37662,7 +37712,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sales_order/sales_order.js:1066 #: erpnext/stock/doctype/delivery_note/delivery_note.js:199 -#: erpnext/stock/doctype/material_request/material_request.js:156 +#: erpnext/stock/doctype/material_request/material_request.js:159 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -37841,10 +37891,8 @@ msgstr "" #. Label of a Link in the Invoicing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json -#: erpnext/workspace_sidebar/banking.json msgid "Plaid Settings" msgstr "" @@ -37999,7 +38047,7 @@ msgstr "" msgid "Plants and Machineries" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:660 +#: erpnext/stock/doctype/pick_list/pick_list.py:669 msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List." msgstr "" @@ -38025,7 +38073,7 @@ msgstr "" msgid "Please Specify Account" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:129 +#: erpnext/buying/doctype/supplier/supplier.py:137 msgid "Please add 'Supplier' role to user {0}." msgstr "" @@ -38041,7 +38089,7 @@ msgstr "" msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:421 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:422 msgid "Please add Root Account for - {0}" msgstr "" @@ -38057,7 +38105,7 @@ msgstr "" msgid "Please add at least one Serial No / Batch No" msgstr "" -#: erpnext/stock/doctype/item/item.js:925 +#: erpnext/stock/doctype/item/item.js:942 msgid "Please add at least one row in Item Defaults with a Company before setting opening stock." msgstr "" @@ -38074,7 +38122,7 @@ msgstr "" msgid "Please add the account to root level Company - {0}" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:305 +#: erpnext/controllers/website_list_for_contact.py:307 msgid "Please add {1} role to user {0}." msgstr "" @@ -38086,7 +38134,7 @@ msgstr "" msgid "Please attach CSV file" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1257 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1263 msgid "Please cancel and amend the Payment Entry" msgstr "" @@ -38120,7 +38168,7 @@ msgstr "" msgid "Please check the 'Activate Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:621 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:770 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "" @@ -38161,11 +38209,11 @@ msgstr "" msgid "Please contact any of the following users for this transaction." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:534 +#: erpnext/selling/doctype/customer/customer.py:551 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:527 +#: erpnext/selling/doctype/customer/customer.py:544 msgid "Please contact your administrator to extend the credit limits for {0}." msgstr "" @@ -38193,7 +38241,7 @@ msgstr "" msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:716 +#: erpnext/stock/doctype/item/item.py:721 msgid "Please delete Product Bundle {0}, before merging {1} into {2}" msgstr "" @@ -38241,11 +38289,11 @@ msgstr "" msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:758 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:764 msgid "Please ensure {0} account is a Balance Sheet account." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:768 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:774 msgid "Please ensure {0} account {1} is a Receivable account." msgstr "" @@ -38254,7 +38302,7 @@ msgid "Please enter Difference Account or set default Stock Adjustment msgstr "" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:559 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:962 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 msgid "Please enter Account for Change Amount" msgstr "" @@ -38266,7 +38314,7 @@ msgstr "" msgid "Please enter Batch No" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:19 +#: erpnext/stock/doctype/stock_reconciliation/services/gl_composer.py:26 msgid "Please enter Cost Center" msgstr "" @@ -38283,7 +38331,7 @@ msgid "Please enter Expense Account" msgstr "" #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:99 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:98 msgid "Please enter Item Code to get Batch Number" msgstr "" @@ -38319,7 +38367,7 @@ msgstr "" msgid "Please enter Reference date" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:400 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:401 msgid "Please enter Root Type for account- {0}" msgstr "" @@ -38340,7 +38388,7 @@ msgid "Please enter Warehouse and Date" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:501 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:958 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:964 msgid "Please enter Write Off Account" msgstr "" @@ -38384,7 +38432,7 @@ msgstr "" msgid "Please enter parent cost center" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:186 +#: erpnext/public/js/utils/barcode_scanner.js:191 msgid "Please enter quantity for item {0}" msgstr "" @@ -38408,7 +38456,7 @@ msgstr "" msgid "Please enter the phone number first" msgstr "" -#: erpnext/controllers/buying_controller.py:1193 +#: erpnext/controllers/buying_controller.py:1201 msgid "Please enter the {schedule_date}." msgstr "" @@ -38460,7 +38508,7 @@ msgstr "" msgid "Please make sure the employees above report to another Active employee." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:379 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:380 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "" @@ -38468,7 +38516,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for {0}. Your master data will remain as it is. This action cannot be undone." msgstr "" -#: erpnext/stock/doctype/item/item.js:1036 +#: erpnext/stock/doctype/item/item.js:1053 msgid "Please mention 'Weight UOM' along with Weight." msgstr "" @@ -38481,7 +38529,7 @@ msgstr "" msgid "Please mention no of visits required" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:73 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:74 msgid "Please mention the Current and New BOM for replacement." msgstr "" @@ -38569,7 +38617,7 @@ msgstr "" msgid "Please select Customer first" msgstr "" -#: erpnext/setup/doctype/company/company.py:603 +#: erpnext/setup/doctype/company/company.py:605 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "" @@ -38578,8 +38626,8 @@ msgstr "" msgid "Please select Finished Good Item for Service Item {0}" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:763 -#: erpnext/assets/doctype/asset/asset.js:778 +#: erpnext/assets/doctype/asset/asset.js:771 +#: erpnext/assets/doctype/asset/asset.js:786 msgid "Please select Item Code first" msgstr "" @@ -38619,7 +38667,7 @@ msgstr "" msgid "Please select Qty against item {0}" msgstr "" -#: erpnext/stock/doctype/item/item.py:390 +#: erpnext/stock/doctype/item/item.py:395 msgid "Please select Sample Retention Warehouse in Stock Settings first" msgstr "" @@ -38635,7 +38683,7 @@ msgstr "" msgid "Please select Stock Asset Account" msgstr "" -#: erpnext/setup/doctype/company/company.py:230 +#: erpnext/setup/doctype/company/company.py:232 msgid "Please select Stock Delivered But Not Billed Account" msgstr "" @@ -38649,7 +38697,7 @@ msgstr "" #: erpnext/accounts/party.py:447 #: erpnext/selling/page/sales_funnel/sales_funnel.py:19 -#: erpnext/stock/doctype/pick_list/pick_list.py:1400 +#: erpnext/stock/doctype/pick_list/pick_list.py:1409 msgid "Please select a Company" msgstr "" @@ -38756,7 +38804,7 @@ msgstr "" msgid "Please select a value for {0} quotation_to {1}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:194 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:203 msgid "Please select an item code before setting the warehouse." msgstr "" @@ -38846,7 +38894,7 @@ msgstr "" msgid "Please select the Multiple Tier Program type for more than one collection rule." msgstr "" -#: erpnext/stock/doctype/item/item.js:437 +#: erpnext/stock/doctype/item/item.js:448 msgid "Please select the Warehouse first" msgstr "" @@ -38954,10 +39002,6 @@ msgstr "" msgid "Please set Parent Row No for item {0}" msgstr "" -#: erpnext/controllers/buying_controller.py:355 -msgid "Please set Purchase Expense Contra Account in Company {0}" -msgstr "" - #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:24 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.js:35 msgid "Please set Root Type" @@ -38995,12 +39039,12 @@ msgstr "" msgid "Please set a Purchase Price Variance Account for Item {0} or a Default Purchase Price Variance Account in Company {1}." msgstr "" -#: erpnext/stock/doctype/item/item.py:341 -#: erpnext/stock/doctype/item/item.py:1669 +#: erpnext/stock/doctype/item/item.py:346 +#: erpnext/stock/doctype/item/item.py:1674 msgid "Please set a Temporary Opening account for company {0} to create an Opening Stock reconciliation." msgstr "" -#: erpnext/projects/doctype/project/project.py:807 +#: erpnext/projects/doctype/project/project.py:837 msgid "Please set a default Holiday List for Company {0}" msgstr "" @@ -39020,7 +39064,7 @@ msgstr "" msgid "Please set an Address on the Company '{0}'" msgstr "Nastavte prosím adresu u společnosti „{0}“" -#: erpnext/stock/services/base_stock_gl_composer.py:194 +#: erpnext/stock/services/base_stock_gl_composer.py:261 msgid "Please set an Expense Account in the Items table" msgstr "" @@ -39049,7 +39093,7 @@ msgstr "" msgid "Please set default Cash or Bank account in Mode of Payments {0}" msgstr "" -#: erpnext/accounts/utils.py:2570 +#: erpnext/accounts/utils.py:2564 msgid "Please set default Exchange Gain/Loss Account in Company {0}" msgstr "" @@ -39061,7 +39105,7 @@ msgstr "" msgid "Please set default UOM in Stock Settings" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:107 +#: erpnext/stock/services/base_stock_gl_composer.py:114 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "" @@ -39141,6 +39185,11 @@ msgstr "" msgid "Please set {0} in BOM Creator {1}" msgstr "" +#: erpnext/controllers/buying_controller.py:347 +#: erpnext/stock/services/base_stock_gl_composer.py:209 +msgid "Please set {0} in Company {1} or in the Item Defaults of Item {2}" +msgstr "" + #: erpnext/accounts/doctype/payment_entry/payment_entry.py:1147 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "" @@ -39157,7 +39206,7 @@ msgstr "" msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "" -#: erpnext/stock/get_item_details.py:349 +#: erpnext/stock/get_item_details.py:348 msgid "Please specify Company" msgstr "" @@ -39196,7 +39245,7 @@ msgstr "" msgid "Please submit Purchase Order {0} before proceeding." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:276 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:284 msgid "Please try again in an hour." msgstr "" @@ -39204,7 +39253,7 @@ msgstr "" msgid "Please uncheck 'Show in Bucket View' to create Orders" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:237 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:240 msgid "Please update Repair Status." msgstr "" @@ -39507,7 +39556,7 @@ msgstr "" msgid "Posting date does not match the selected transaction" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:101 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:109 msgid "Posting date is required" msgstr "" @@ -39582,15 +39631,15 @@ msgstr "" msgid "Pre Sales" msgstr "" -#: erpnext/accounts/utils.py:2808 +#: erpnext/accounts/utils.py:2802 msgid "Pre-Submit Warning" msgstr "" -#: erpnext/accounts/utils.py:2857 +#: erpnext/accounts/utils.py:2851 msgid "Pre-Submit Warning: Credit Limit" msgstr "" -#: erpnext/accounts/utils.py:2869 +#: erpnext/accounts/utils.py:2863 msgid "Pre-Submit Warning: Packed Qty" msgstr "" @@ -39867,7 +39916,7 @@ msgstr "" msgid "Price List Currency" msgstr "" -#: erpnext/stock/get_item_details.py:1384 +#: erpnext/stock/get_item_details.py:1383 msgid "Price List Currency not selected" msgstr "" @@ -40438,7 +40487,6 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Process Payment Reconciliation" @@ -40697,7 +40745,7 @@ msgstr "" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:543 +#: erpnext/setup/doctype/company/company.py:545 msgid "Production" msgstr "" @@ -40851,11 +40899,13 @@ msgstr "Zisk v tomto roce" #. Option for the 'Report Type' (Select) field in DocType 'Account' #. Option for the 'Report Type' (Select) field in DocType 'Process Period #. Closing Voucher Detail' +#. Label of a chart in the Accounting Workspace #. Label of a chart in the Financial Reports Workspace #. Label of a chart in the Invoicing Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/process_period_closing_voucher_detail/process_period_closing_voucher_detail.json +#: erpnext/accounts/workspace/accounting/accounting.json #: erpnext/accounts/workspace/financial_reports/financial_reports.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/public/js/financial_statements.js:368 @@ -40915,7 +40965,7 @@ msgstr "" msgid "Progress (%)" msgstr "" -#: erpnext/projects/doctype/project/project.py:432 +#: erpnext/projects/doctype/project/project.py:434 msgid "Project Collaboration Invitation" msgstr "" @@ -40963,7 +41013,7 @@ msgstr "" msgid "Project Summary" msgstr "" -#: erpnext/projects/doctype/project/project.py:745 +#: erpnext/projects/doctype/project/project.py:775 msgid "Project Summary for {0}" msgstr "" @@ -41094,7 +41144,7 @@ msgstr "" #. Label of a Card Break in the Projects Workspace #. Title of a Workspace Sidebar #: erpnext/config/projects.py:7 erpnext/desktop_icon/projects.json -#: erpnext/projects/doctype/project/project.py:512 +#: erpnext/projects/doctype/project/project.py:542 #: erpnext/projects/workspace/projects/projects.json #: erpnext/selling/doctype/customer/customer_dashboard.py:26 #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:28 @@ -41255,7 +41305,7 @@ msgstr "" msgid "Providing" msgstr "" -#: erpnext/setup/doctype/company/company.py:642 +#: erpnext/setup/doctype/company/company.py:644 msgid "Provisional Account" msgstr "" @@ -41335,7 +41385,7 @@ msgstr "" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:531 erpnext/setup/install.py:413 +#: erpnext/setup/doctype/company/company.py:533 erpnext/setup/install.py:413 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item/item_list.js:30 #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -41410,8 +41460,8 @@ msgstr "" msgid "Purchase Expense Contra Account" msgstr "" -#: erpnext/controllers/buying_controller.py:365 -#: erpnext/controllers/buying_controller.py:379 +#: erpnext/controllers/buying_controller.py:373 +#: erpnext/controllers/buying_controller.py:387 msgid "Purchase Expense for Item {0}" msgstr "" @@ -41458,7 +41508,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:446 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:445 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -41530,7 +41580,6 @@ msgstr "" #. Label of the purchase_order (Link) field in DocType 'Stock Entry' #. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt #. Item' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.js:61 #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json @@ -41549,7 +41598,7 @@ msgstr "" #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.js:48 #: erpnext/buying/report/purchase_order_analysis/purchase_order_analysis.py:205 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/buying_controller.py:929 +#: erpnext/controllers/buying_controller.py:937 #: erpnext/crm/doctype/contract/contract.json #: erpnext/manufacturing/doctype/blanket_order/blanket_order.js:54 #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json @@ -41558,14 +41607,12 @@ msgstr "" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:196 +#: erpnext/stock/doctype/material_request/material_request.js:199 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:217 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/buying.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Purchase Order" msgstr "" @@ -41666,7 +41713,7 @@ msgstr "" msgid "Purchase Order {0} is not submitted" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:582 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:583 msgid "Purchase Orders" msgstr "" @@ -41681,7 +41728,7 @@ msgstr "" msgid "Purchase Orders Items Overdue" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:277 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:278 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "" @@ -41710,7 +41757,7 @@ msgstr "" msgid "Purchase Price Variance Account" msgstr "" -#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:88 +#: erpnext/stock/doctype/stock_entry/services/gl_composer.py:93 msgid "Purchase Price Variance for {0}" msgstr "" @@ -41840,10 +41887,8 @@ msgid "Purchase Return" msgstr "" #. Label of the purchase_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:161 -#: erpnext/workspace_sidebar/taxes.json msgid "Purchase Tax Template" msgstr "" @@ -41943,7 +41988,7 @@ msgstr "" #: erpnext/stock/doctype/item/item_list.js:41 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:481 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:480 #: 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 @@ -42260,7 +42305,7 @@ msgstr "" msgid "Qty of Finished Goods Item" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:707 +#: erpnext/stock/doctype/pick_list/pick_list.py:716 msgid "Qty of Finished Goods Item should be greater than 0." msgstr "" @@ -42289,7 +42334,7 @@ msgstr "" msgid "Qty to Deliver" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:401 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:400 msgid "Qty to Disassemble" msgstr "" @@ -42558,7 +42603,7 @@ msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "" #: erpnext/public/js/controllers/transaction.js:446 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:212 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:211 msgid "Quality Inspection(s)" msgstr "" @@ -42567,7 +42612,7 @@ msgstr "" msgid "Quality Inspections" msgstr "" -#: erpnext/setup/doctype/company/company.py:573 +#: erpnext/setup/doctype/company/company.py:575 msgid "Quality Management" msgstr "" @@ -42710,11 +42755,11 @@ msgstr "" #: erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py:39 #: erpnext/stock/dashboard/item_dashboard.js:248 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json -#: erpnext/stock/doctype/material_request/material_request.js:368 +#: erpnext/stock/doctype/material_request/material_request.js:369 #: 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:829 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:828 #: 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 @@ -42824,7 +42869,7 @@ msgstr "" msgid "Quantity and Warehouse" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:214 +#: erpnext/stock/doctype/material_request/material_request.py:253 msgid "Quantity cannot be greater than {0} for Item {1}" msgstr "" @@ -42840,7 +42885,7 @@ msgstr "" msgid "Quantity must be greater than zero" msgstr "" -#: erpnext/stock/doctype/item/item.py:1649 +#: erpnext/stock/doctype/item/item.py:1654 msgid "Quantity must be greater than zero." msgstr "" @@ -42875,11 +42920,11 @@ msgstr "" msgid "Quantity to Manufacture must be greater than 0." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:257 +#: erpnext/public/js/utils/barcode_scanner.js:262 msgid "Quantity to Scan" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:919 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:932 msgid "Quantity {0} should not be greater than allowed quantity {1}" msgstr "" @@ -42908,7 +42953,7 @@ msgstr "" msgid "Query Route String" msgstr "Řetězec trasy dotazu" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:193 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:200 msgid "Queue Size should be between 5 and 100" msgstr "" @@ -43558,7 +43603,7 @@ msgstr "" #: erpnext/manufacturing/doctype/work_order/work_order.js:788 #: erpnext/selling/doctype/sales_order/sales_order.js:1012 #: erpnext/selling/doctype/sales_order/sales_order_list.js:70 -#: erpnext/stock/doctype/material_request/material_request.js:243 +#: erpnext/stock/doctype/material_request/material_request.js:246 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:163 msgid "Re-open" @@ -43876,7 +43921,7 @@ msgstr "" msgid "Received Quantity" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:377 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:376 msgid "Received Stock Entries" msgstr "" @@ -44018,11 +44063,6 @@ msgstr "" msgid "Reconciliation Progress" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/banking.json -msgid "Reconciliation Statement" -msgstr "" - #. Label of the reconciliation_takes_effect_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json @@ -44861,7 +44901,7 @@ msgstr "" msgid "Repost Item Valuation" msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:376 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:399 msgid "Repost Item Valuation restarted for selected failed records." msgstr "" @@ -45046,7 +45086,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:270 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/stock/doctype/material_request/material_request.js:202 +#: erpnext/stock/doctype/material_request/material_request.js:205 #: erpnext/workspace_sidebar/buying.json msgid "Request for Quotation" msgstr "" @@ -45221,7 +45261,7 @@ msgstr "" msgid "Research" msgstr "" -#: erpnext/setup/doctype/company/company.py:579 +#: erpnext/setup/doctype/company/company.py:581 msgid "Research & Development" msgstr "" @@ -45312,7 +45352,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:665 +#: erpnext/stock/services/serial_batch_bundle_service.py:664 msgid "Reserved Batch Conflict" msgstr "" @@ -45382,7 +45422,7 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2452 +#: erpnext/stock/stock_ledger.py:2500 msgid "Reserved Serial No." msgstr "" @@ -45398,13 +45438,13 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.js:178 #: erpnext/stock/report/reserved_stock/reserved_stock.json #: erpnext/stock/report/stock_balance/stock_balance.py:573 -#: erpnext/stock/stock_ledger.py:2436 +#: erpnext/stock/stock_ledger.py:2484 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:204 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:332 msgid "Reserved Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2481 +#: erpnext/stock/stock_ledger.py:2529 msgid "Reserved Stock for Batch" msgstr "" @@ -45446,7 +45486,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:421 -#: erpnext/stock/doctype/pick_list/pick_list.js:306 +#: erpnext/stock/doctype/pick_list/pick_list.js:307 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:292 msgid "Reserving Stock..." msgstr "" @@ -45617,7 +45657,7 @@ msgstr "" msgid "Restart Subscription" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:183 +#: erpnext/assets/doctype/asset/asset.js:191 msgid "Restore Asset" msgstr "" @@ -45633,6 +45673,15 @@ msgstr "" msgid "Restrict Items Based On" msgstr "" +#. Label of the restrict_to_companies (Check) field in DocType 'Supplier' +#. Label of the restrict_to_companies (Check) field in DocType 'Customer' +#. Label of the restrict_to_companies (Check) field in DocType 'Item' +#: erpnext/buying/doctype/supplier/supplier.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/stock/doctype/item/item.json +msgid "Restrict to Companies" +msgstr "" + #. Label of the section_break_6 (Section Break) field in DocType 'Shipping #. Rule' #: erpnext/accounts/doctype/shipping_rule/shipping_rule.json @@ -45675,7 +45724,7 @@ msgstr "" msgid "Resume Job" msgstr "" -#: erpnext/projects/doctype/timesheet/timesheet.js:65 +#: erpnext/projects/doctype/timesheet/timesheet.js:66 msgid "Resume Timer" msgstr "" @@ -46101,6 +46150,12 @@ msgstr "" msgid "Role allowed to bypass credit limit" msgstr "" +#. Label of the role_allowed_to_bypass_overdue_billing (Link) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Role allowed to bypass overdue billing limit" +msgstr "" + #. Description of the 'Exempted Role' (Link) field in DocType 'Accounting #. Period' #: erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -46162,7 +46217,7 @@ msgstr "" msgid "Root Type" msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:404 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:405 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "" @@ -46326,8 +46381,8 @@ msgstr "" msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:119 -#: erpnext/stock/services/base_stock_gl_composer.py:134 +#: erpnext/stock/services/base_stock_gl_composer.py:126 +#: erpnext/stock/services/base_stock_gl_composer.py:141 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "" @@ -46384,7 +46439,7 @@ msgstr "" msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "" -#: erpnext/stock/doctype/item/item.py:585 +#: erpnext/stock/doctype/item/item.py:590 msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "" @@ -46600,11 +46655,11 @@ msgstr "" msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:196 +#: erpnext/stock/services/base_stock_gl_composer.py:263 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:145 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:148 msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "" @@ -46667,11 +46722,11 @@ msgstr "" msgid "Row #{0}: From Time and To Time fields are required" msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:680 +#: erpnext/stock/doctype/pick_list/pick_list.py:689 msgid "Row #{0}: Item Code is Mandatory" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:427 +#: erpnext/public/js/utils/barcode_scanner.js:435 msgid "Row #{0}: Item added" msgstr "" @@ -46683,7 +46738,7 @@ msgstr "" msgid "Row #{0}: Item {1} does not exist" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1659 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1661 msgid "Row #{0}: Item {1} has been picked, please reserve stock from the Pick List." msgstr "" @@ -46760,7 +46815,7 @@ msgstr "" msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1742 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1744 msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "" @@ -46813,7 +46868,7 @@ msgstr "" msgid "Row #{0}: Please select the Sub Assembly Warehouse" msgstr "Řádek č. {0}: Vyberte prosím sklad podsestavy" -#: erpnext/stock/doctype/item/item.py:592 +#: erpnext/stock/doctype/item/item.py:597 msgid "Row #{0}: Please set reorder quantity" msgstr "" @@ -46834,7 +46889,7 @@ msgstr "" msgid "Row #{0}: Product Bundle {1} is disabled and cannot be used in transactions." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:425 +#: erpnext/public/js/utils/barcode_scanner.js:433 msgid "Row #{0}: Qty increased by {1}" msgstr "" @@ -46871,7 +46926,7 @@ msgstr "" msgid "Row #{0}: Quantity of Item {1} cannot be more than {2} {3} against Subcontracting Inward Order {4}" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1727 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1729 msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "" @@ -46897,7 +46952,7 @@ msgstr "" msgid "Row #{0}: Rejected Warehouse is mandatory for the rejected Item {1}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:163 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:166 msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "" @@ -46932,7 +46987,7 @@ msgstr "" msgid "Row #{0}: Serial No {1} cannot be returned since it was not transacted in original invoice {2}" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:123 +#: erpnext/stock/services/serial_batch_bundle_service.py:125 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "" @@ -47000,7 +47055,7 @@ msgstr "" msgid "Row #{0}: Status must be {1} for Invoice Discounting {2}" msgstr "Řádek č. {0}: Stav musí být pro diskont faktury {2} nastaven na {1}" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:454 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:459 msgid "Row #{0}: Stock Delivered But Not Billed account cannot be used for items linked to a Sales Invoice" msgstr "" @@ -47008,19 +47063,19 @@ msgstr "" msgid "Row #{0}: Stock cannot be reserved for Item {1} against a disabled Batch {2}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1672 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1674 msgid "Row #{0}: Stock cannot be reserved for a non-stock Item {1}" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1685 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1687 msgid "Row #{0}: Stock cannot be reserved in group warehouse {1}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1701 msgid "Row #{0}: Stock is already reserved for the Item {1}." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:569 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:574 msgid "Row #{0}: Stock is reserved for item {1} in warehouse {2}." msgstr "" @@ -47029,11 +47084,11 @@ msgid "Row #{0}: Stock not available to reserve for Item {1} against Batch {2} i msgstr "" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1263 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1713 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1715 msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:944 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:950 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "" @@ -47041,7 +47096,7 @@ msgstr "" msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:141 +#: erpnext/stock/services/serial_batch_bundle_service.py:143 msgid "Row #{0}: The batch {1} has already expired." msgstr "" @@ -47053,7 +47108,7 @@ msgstr "" msgid "Row #{0}: The original Invoice {1} of return invoice {2} is not consolidated." msgstr "" -#: erpnext/stock/doctype/item/item.py:601 +#: erpnext/stock/doctype/item/item.py:606 msgid "Row #{0}: The warehouse {1} is not a child warehouse of a group warehouse {2}" msgstr "" @@ -47073,7 +47128,7 @@ msgstr "" msgid "Row #{0}: Valuation Rate for Item {1} must be the same across all rows, as it is the item's company-wide Standard Cost." msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:57 +#: erpnext/stock/services/serial_batch_bundle_service.py:59 msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." msgstr "" @@ -47126,7 +47181,7 @@ msgstr "" msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "" -#: erpnext/stock/doctype/item/item.py:1557 +#: erpnext/stock/doctype/item/item.py:1562 msgid "Row #{0}: {1} {2} does not belong to Company {3}. Please select valid {4}." msgstr "" @@ -47146,23 +47201,23 @@ msgstr "" msgid "Row #{idx}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor." msgstr "" -#: erpnext/controllers/buying_controller.py:633 +#: erpnext/controllers/buying_controller.py:641 msgid "Row #{idx}: Item rate has been updated as per valuation rate since its an internal stock transfer." msgstr "" -#: erpnext/controllers/buying_controller.py:1069 +#: erpnext/controllers/buying_controller.py:1077 msgid "Row #{idx}: Please enter a location for the asset item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:726 +#: erpnext/controllers/buying_controller.py:734 msgid "Row #{idx}: Received Qty must be equal to Accepted + Rejected Qty for Item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:739 +#: erpnext/controllers/buying_controller.py:747 msgid "Row #{idx}: {field_label} can not be negative for item {item_code}." msgstr "" -#: erpnext/controllers/buying_controller.py:692 +#: erpnext/controllers/buying_controller.py:700 msgid "Row #{idx}: {field_label} is mandatory." msgstr "" @@ -47170,7 +47225,7 @@ msgstr "" msgid "Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same." msgstr "" -#: erpnext/controllers/buying_controller.py:1185 +#: erpnext/controllers/buying_controller.py:1193 msgid "Row #{idx}: {schedule_date} cannot be before {transaction_date}." msgstr "" @@ -47222,11 +47277,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:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:729 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:556 +#: erpnext/stock/doctype/material_request/material_request.py:595 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "" @@ -47467,7 +47522,7 @@ msgstr "" msgid "Row {0}: Task {1} does not belong to Project {2}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:178 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:187 msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "" @@ -47544,7 +47599,7 @@ msgstr "" msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "" -#: erpnext/controllers/buying_controller.py:1051 +#: erpnext/controllers/buying_controller.py:1059 msgid "Row {idx}: Asset Naming Series is mandatory for the auto creation of assets for item {item_code}." msgstr "" @@ -47809,8 +47864,8 @@ msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:143 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:525 -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:527 +#: erpnext/setup/doctype/company/company.py:720 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 #: erpnext/setup/install.py:408 @@ -47825,7 +47880,7 @@ msgstr "" msgid "Sales & Purchase" msgstr "" -#: erpnext/setup/doctype/company/company.py:718 +#: erpnext/setup/doctype/company/company.py:720 msgid "Sales Account" msgstr "" @@ -48023,7 +48078,7 @@ msgstr "" msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:626 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:631 msgid "Sales Invoice {0} has already been submitted" msgstr "" @@ -48075,7 +48130,6 @@ msgstr "" #. Label of the sales_order (Link) field in DocType 'Purchase Receipt Item' #. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation #. Entry' -#. Label of a Link in the Subcontracting Workspace #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json @@ -48115,7 +48169,7 @@ msgstr "" #: erpnext/setup/doctype/authorization_rule/authorization_rule.json #: erpnext/stock/doctype/delivery_note/delivery_note.js:157 #: erpnext/stock/doctype/delivery_note/delivery_note.js:223 -#: erpnext/stock/doctype/material_request/material_request.js:236 +#: erpnext/stock/doctype/material_request/material_request.js:239 #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -48124,9 +48178,7 @@ msgstr "" #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:159 #: erpnext/stock/report/delayed_order_report/delayed_order_report.js:30 #: erpnext/stock/report/delayed_order_report/delayed_order_report.py:74 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json #: erpnext/workspace_sidebar/selling.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Sales Order" msgstr "" @@ -48229,7 +48281,7 @@ msgstr "" msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "" -#: erpnext/projects/doctype/project/project.py:256 +#: erpnext/projects/doctype/project/project.py:258 msgid "Sales Order {0} is already linked to Project {1}, skipping the link." msgstr "" @@ -48238,7 +48290,7 @@ msgstr "" msgid "Sales Order {0} is not available for production" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1022 msgid "Sales Order {0} is not submitted" msgstr "" @@ -48522,10 +48574,8 @@ msgid "Sales Summary" msgstr "" #. Label of the sales_tax_template (Link) field in DocType 'Tax Rule' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/setup/doctype/company/company.js:149 -#: erpnext/workspace_sidebar/taxes.json msgid "Sales Tax Template" msgstr "" @@ -48534,11 +48584,6 @@ msgstr "" msgid "Sales Tax Withholding Category" msgstr "" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/accounts_setup.json -msgid "Sales Taxes" -msgstr "" - #. Label of the taxes (Table) field in DocType 'POS Invoice' #. Label of the taxes (Table) field in DocType 'Sales Invoice' #. Name of a DocType @@ -48663,7 +48708,7 @@ msgid "Sample Quantity" msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:557 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:556 msgid "Sample Retention Stock Entry" msgstr "" @@ -48734,7 +48779,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/public/js/utils/barcode_scanner.js:236 +#: erpnext/public/js/utils/barcode_scanner.js:241 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -48766,7 +48811,7 @@ msgstr "" msgid "Scan Serial No" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:200 +#: erpnext/public/js/utils/barcode_scanner.js:205 msgid "Scan barcode for item {0}" msgstr "" @@ -48788,14 +48833,14 @@ msgstr "" msgid "Scanned Cheque" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:268 +#: erpnext/public/js/utils/barcode_scanner.js:273 msgid "Scanned Quantity" 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:383 +#: erpnext/assets/doctype/asset/asset.js:391 #: 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" @@ -48929,7 +48974,7 @@ msgstr "" msgid "Scrap" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:168 +#: erpnext/assets/doctype/asset/asset.js:176 msgid "Scrap Asset" msgstr "" @@ -48990,7 +49035,7 @@ msgstr "" msgid "Search transactions" msgstr "" -#: erpnext/stock/doctype/item/item.js:1099 +#: erpnext/stock/doctype/item/item.js:1116 msgid "Search values..." msgstr "" @@ -49118,7 +49163,7 @@ msgstr "" msgid "Select Alternative Items for Sales Order" msgstr "" -#: erpnext/stock/doctype/item/item.js:1225 +#: erpnext/stock/doctype/item/item.js:1242 msgid "Select Attribute Values" msgstr "" @@ -49130,9 +49175,9 @@ msgstr "" msgid "Select BOM and Qty for Production" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Batch No" msgstr "" @@ -49264,15 +49309,15 @@ msgstr "" msgid "Select Quantity" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:234 -#: erpnext/public/js/utils/sales_common.js:449 -#: erpnext/stock/doctype/pick_list/pick_list.js:398 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:243 +#: erpnext/public/js/utils/sales_common.js:447 +#: erpnext/stock/doctype/pick_list/pick_list.js:399 msgid "Select Serial No" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.js:237 -#: erpnext/public/js/utils/sales_common.js:452 -#: erpnext/stock/doctype/pick_list/pick_list.js:401 +#: erpnext/assets/doctype/asset_repair/asset_repair.js:246 +#: erpnext/public/js/utils/sales_common.js:450 +#: erpnext/stock/doctype/pick_list/pick_list.js:402 msgid "Select Serial and Batch" msgstr "" @@ -49310,7 +49355,7 @@ msgstr "" msgid "Select Warehouse..." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:580 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:578 msgid "Select Warehouses to get Stock for Materials Planning" msgstr "" @@ -49322,7 +49367,7 @@ msgstr "" msgid "Select a Company this Employee belongs to." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:221 +#: erpnext/buying/doctype/supplier/supplier.js:230 msgid "Select a Customer" msgstr "" @@ -49334,7 +49379,7 @@ msgstr "Vyberte výchozí prioritu." msgid "Select a Payment Method." msgstr "" -#: erpnext/selling/doctype/customer/customer.js:253 +#: erpnext/selling/doctype/customer/customer.js:262 msgid "Select a Supplier" msgstr "" @@ -49361,7 +49406,7 @@ msgstr "" msgid "Select all" msgstr "" -#: erpnext/stock/doctype/item/item.js:1567 +#: erpnext/stock/doctype/item/item.js:1584 msgid "Select an Item Group." msgstr "" @@ -49378,7 +49423,7 @@ msgstr "" msgid "Select an item from each set to be used in the Sales Order." msgstr "" -#: erpnext/stock/doctype/item/item.js:1239 +#: erpnext/stock/doctype/item/item.js:1256 msgid "Select at least one attribute value." msgstr "" @@ -49449,7 +49494,7 @@ msgstr "" msgid "Select the customer or supplier." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:940 +#: erpnext/assets/doctype/asset/asset.js:948 msgid "Select the date" msgstr "" @@ -49475,7 +49520,7 @@ msgstr "" msgid "Select variant item code for the template item {0}" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:737 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:735 msgid "Select whether to get items from a Sales Order or a Material Request. For now select Sales Order.\n" " A Production Plan can also be created manually where you can select the Items to manufacture." msgstr "" @@ -49529,22 +49574,22 @@ msgstr "" msgid "Self delivery" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:647 +#: erpnext/assets/doctype/asset/asset.js:655 #: 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:176 -#: erpnext/assets/doctype/asset/asset.js:636 +#: erpnext/assets/doctype/asset/asset.js:184 +#: erpnext/assets/doctype/asset/asset.js:644 msgid "Sell Asset" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:641 +#: erpnext/assets/doctype/asset/asset.js:649 msgid "Sell Qty" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:657 +#: erpnext/assets/doctype/asset/asset.js:665 msgid "Sell quantity cannot exceed the asset quantity" msgstr "" @@ -49552,7 +49597,7 @@ msgstr "" msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "" -#: erpnext/assets/doctype/asset/asset.js:653 +#: erpnext/assets/doctype/asset/asset.js:661 msgid "Sell quantity must be greater than zero" msgstr "" @@ -49858,7 +49903,7 @@ msgstr "" msgid "Serial No Already Assigned" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:296 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:299 msgid "Serial No Bundle is mandatory for Item {0}" msgstr "" @@ -49879,11 +49924,11 @@ msgstr "" msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2766 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2768 msgid "Serial No Reserved" msgstr "" -#: erpnext/stock/doctype/item/item.py:496 +#: erpnext/stock/doctype/item/item.py:501 msgid "Serial No Series Overlap" msgstr "" @@ -49948,7 +49993,7 @@ msgstr "" msgid "Serial No {0} already exists" msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:342 +#: erpnext/public/js/utils/barcode_scanner.js:347 msgid "Serial No {0} already scanned" msgstr "" @@ -49962,7 +50007,7 @@ msgstr "" #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py:52 #: erpnext/selling/doctype/installation_note/installation_note.py:84 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3564 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3566 msgid "Serial No {0} does not exist" msgstr "" @@ -49970,7 +50015,7 @@ msgstr "" msgid "Serial No {0} is already Delivered. You cannot use it again in Manufacture / Repack entry." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:435 +#: erpnext/public/js/utils/barcode_scanner.js:443 msgid "Serial No {0} is already added" msgstr "" @@ -49998,7 +50043,7 @@ msgstr "" msgid "Serial No: {0} has already been transacted into another POS Invoice." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:292 +#: erpnext/public/js/utils/barcode_scanner.js:297 #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:201 #: erpnext/stock/doctype/batch/batch.py:393 @@ -50021,7 +50066,7 @@ msgstr "" msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2442 +#: erpnext/stock/stock_ledger.py:2490 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "" @@ -50102,7 +50147,7 @@ msgstr "" msgid "Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/item/item.py:1150 +#: erpnext/stock/doctype/item/item.py:1155 msgid "Serial and Batch Bundle Exists" msgstr "" @@ -50114,7 +50159,7 @@ msgstr "" msgid "Serial and Batch Bundle updated" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:99 +#: erpnext/stock/services/serial_batch_bundle_service.py:101 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "" @@ -50191,7 +50236,7 @@ msgstr "" msgid "Series for Asset Depreciation Entry (Journal Entry)" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:143 +#: erpnext/buying/doctype/supplier/supplier.py:151 msgid "Series is mandatory" msgstr "" @@ -50471,7 +50516,7 @@ msgstr "" msgid "Set New Release Date" msgstr "" -#: erpnext/stock/doctype/item/item.js:207 +#: erpnext/stock/doctype/item/item.js:218 msgid "Set Opening Stock" msgstr "" @@ -50532,7 +50577,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Sales Order' #. Label of the set_warehouse (Link) field in DocType 'Delivery Note' #. Label of the set_from_warehouse (Link) field in DocType 'Material Request' -#: erpnext/public/js/utils/sales_common.js:574 +#: erpnext/public/js/utils/sales_common.js:572 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json @@ -50550,7 +50595,7 @@ msgstr "" #. Label of the set_warehouse (Link) field in DocType 'Subcontracting Order' #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/public/js/utils/sales_common.js:571 +#: erpnext/public/js/utils/sales_common.js:569 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json @@ -50576,7 +50621,7 @@ msgstr "" msgid "Set as Completed" msgstr "" -#: erpnext/public/js/utils/sales_common.js:598 +#: erpnext/public/js/utils/sales_common.js:596 #: erpnext/selling/doctype/quotation/quotation.js:146 msgid "Set as Lost" msgstr "" @@ -50603,11 +50648,11 @@ msgstr "" msgid "Set closing balance as per bank statement" msgstr "" -#: erpnext/setup/doctype/company/company.py:615 +#: erpnext/setup/doctype/company/company.py:617 msgid "Set default inventory account for perpetual inventory" msgstr "" -#: erpnext/setup/doctype/company/company.py:641 +#: erpnext/setup/doctype/company/company.py:643 msgid "Set default {0} account for non stock items" msgstr "" @@ -50821,44 +50866,34 @@ msgstr "" #. Label of the share_balance (Table) field in DocType 'Shareholder' #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_balance/share_balance.json #: erpnext/accounts/doctype/shareholder/shareholder.js:21 #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Balance" msgstr "" #. Name of a report #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.js:27 #: erpnext/accounts/report/share_ledger/share_ledger.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Ledger" msgstr "" #. Label of a Card Break in the Invoicing Workspace -#. Name of a Workspace #. Label of a Desktop Icon -#. Title of a Workspace Sidebar #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/accounts/workspace/share_management/share_management.json #: erpnext/desktop_icon/share_management.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Management" msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/share_transfer/share_transfer.json #: erpnext/accounts/report/share_ledger/share_ledger.py:59 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Share Transfer" msgstr "" @@ -50875,14 +50910,12 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/shareholder/shareholder.json #: erpnext/accounts/report/share_balance/share_balance.js:16 #: erpnext/accounts/report/share_balance/share_balance.py:55 #: erpnext/accounts/report/share_ledger/share_ledger.js:16 #: erpnext/accounts/report/share_ledger/share_ledger.py:51 #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/share_management.json msgid "Shareholder" msgstr "" @@ -50896,7 +50929,7 @@ msgid "Shelf Life in Days" msgstr "" #. Label of the shift (Link) field in DocType 'Depreciation Schedule' -#: erpnext/assets/doctype/asset/asset.js:396 +#: erpnext/assets/doctype/asset/asset.js:404 #: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json msgid "Shift" msgstr "" @@ -50968,7 +51001,7 @@ msgstr "" msgid "Shipment details" msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:656 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:661 msgid "Shipments" msgstr "" @@ -51334,7 +51367,7 @@ msgstr "" msgid "Show Variant Attributes" msgstr "" -#: erpnext/stock/doctype/item/item.js:231 +#: erpnext/stock/doctype/item/item.js:242 msgid "Show Variants" msgstr "" @@ -51525,11 +51558,11 @@ msgstr "" msgid "Since you have enabled 'Track Semi Finished Goods', at least one operation must have 'Is Final Finished Good' checked. For that set the FG / Semi FG Item as {0} against an operation." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:134 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:142 msgid "Since {0} are Serial No/Batch No items, you cannot enable 'Recreate Stock Ledgers' in Repost Item Valuation." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:114 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:122 msgid "Since {0} has 'Update Stock' disabled, you cannot create repost item valuation against it" msgstr "" @@ -51551,7 +51584,7 @@ msgstr "" msgid "Single Tier Program" msgstr "" -#: erpnext/stock/doctype/item/item.js:256 +#: erpnext/stock/doctype/item/item.js:267 msgid "Single Variant" msgstr "" @@ -51743,11 +51776,11 @@ msgstr "Zdrojový typ" #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json #: erpnext/manufacturing/doctype/work_order_operation/work_order_operation.json #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:135 -#: erpnext/public/js/utils/sales_common.js:570 +#: erpnext/public/js/utils/sales_common.js:568 #: 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:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:819 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "" @@ -51837,15 +51870,15 @@ msgstr "" msgid "Spent" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:697 +#: erpnext/assets/doctype/asset/asset.js:705 #: erpnext/stock/doctype/batch/batch.js:104 #: erpnext/stock/doctype/batch/batch.js:185 #: erpnext/support/doctype/issue/issue.js:114 msgid "Split" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:152 -#: erpnext/assets/doctype/asset/asset.js:681 +#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:689 msgid "Split Asset" msgstr "" @@ -51869,7 +51902,7 @@ msgstr "" msgid "Split Issue" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:687 +#: erpnext/assets/doctype/asset/asset.js:695 msgid "Split Qty" msgstr "" @@ -51944,13 +51977,13 @@ msgstr "" msgid "Stale Days" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:163 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:170 msgid "Stale Days should start from 1." msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:485 -#: erpnext/tests/utils.py:275 +#: erpnext/tests/utils.py:276 msgid "Standard Buying" msgstr "" @@ -51977,8 +52010,8 @@ msgstr "" #: erpnext/setup/setup_wizard/operations/defaults_setup.py:70 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:493 -#: erpnext/stock/doctype/item/item.py:291 erpnext/tests/utils.py:283 -#: erpnext/tests/utils.py:2523 +#: erpnext/stock/doctype/item/item.py:296 erpnext/tests/utils.py:284 +#: erpnext/tests/utils.py:2524 msgid "Standard Selling" msgstr "" @@ -52081,7 +52114,7 @@ msgstr "" msgid "Start Time can't be greater than or equal to End Time for {0}." msgstr "" -#: erpnext/projects/doctype/timesheet/timesheet.js:62 +#: erpnext/projects/doctype/timesheet/timesheet.js:63 msgid "Start Timer" msgstr "" @@ -52206,7 +52239,7 @@ msgstr "" msgid "Status and Reference" msgstr "" -#: erpnext/projects/doctype/project/project.py:788 +#: erpnext/projects/doctype/project/project.py:818 msgid "Status must be Cancelled or Completed" msgstr "" @@ -52295,7 +52328,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:170 +#: erpnext/stock/doctype/item/item.js:181 #: 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 @@ -52352,7 +52385,7 @@ msgstr "" msgid "Stock Delivered But Not Billed" msgstr "" -#: erpnext/setup/doctype/company/company.py:217 +#: erpnext/setup/doctype/company/company.py:219 msgid "Stock Delivered But Not Billed Account cannot be changed or disabled since account {0} contains outstanding Delivery Notes: {1}" msgstr "" @@ -52390,7 +52423,6 @@ msgstr "" #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/stock.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Stock Entry" msgstr "" @@ -52437,6 +52469,18 @@ msgstr "" msgid "Stock Entry {0} is not submitted" msgstr "" +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Company' +#: erpnext/setup/doctype/company/company.json +msgid "Stock Expense" +msgstr "" + +#. Label of the stock_expense_section (Section Break) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Stock Expense Accounting" +msgstr "" + #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:87 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:147 msgid "Stock Expenses" @@ -52459,7 +52503,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:180 +#: erpnext/stock/doctype/item/item.js:191 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json @@ -52577,7 +52621,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:190 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -52630,7 +52674,7 @@ msgstr "" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/setup/workspace/home/home.json -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json #: erpnext/stock/doctype/stock_settings/stock_settings.js:137 #: erpnext/stock/workspace/stock/stock.json @@ -52649,7 +52693,7 @@ msgstr "" msgid "Stock Reconciliation that revalues on-hand stock to this standard rate: auto-created when the rate is changed here, or the reconciliation that captured this rate (opening entry or rate change)." msgstr "" -#: erpnext/stock/doctype/item/item.py:677 +#: erpnext/stock/doctype/item/item.py:682 msgid "Stock Reconciliations" msgstr "" @@ -52690,12 +52734,12 @@ msgstr "" #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:869 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:680 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1266 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1675 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1688 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1702 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1730 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1747 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1677 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1690 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1704 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1718 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1732 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1749 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/doctype/stock_settings/stock_settings.py:225 #: erpnext/stock/doctype/stock_settings/stock_settings.py:237 @@ -52708,7 +52752,7 @@ msgstr "" msgid "Stock Reservation" msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1858 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1860 msgid "Stock Reservation Entries Cancelled" msgstr "" @@ -52716,7 +52760,7 @@ msgstr "" #: erpnext/manufacturing/doctype/production_plan/services/reservation.py:152 #: erpnext/manufacturing/doctype/work_order/services/reservation.py:597 #: erpnext/selling/doctype/sales_order/services/reservation.py:133 -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1808 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1810 msgid "Stock Reservation Entries Created" msgstr "" @@ -52743,7 +52787,7 @@ msgstr "" msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:579 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:584 msgid "Stock Reservation Warehouse Mismatch" msgstr "" @@ -52783,7 +52827,7 @@ msgstr "" #: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/item/item.js:486 +#: erpnext/stock/doctype/item/item.js:497 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:681 #: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/workspace/stock/stock.json @@ -53020,15 +53064,15 @@ msgstr "" msgid "Stock cannot be reserved in group warehouse {0}." msgstr "" -#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1620 +#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1622 msgid "Stock cannot be reserved in the group warehouse {0}." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:906 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:912 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:982 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:988 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "" @@ -53092,11 +53136,11 @@ msgstr "" msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "" -#: erpnext/setup/doctype/company/company.py:452 +#: erpnext/setup/doctype/company/company.py:454 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:537 -#: erpnext/stock/doctype/item/item.py:329 -#: erpnext/stock/doctype/item/item.py:1776 erpnext/tests/utils.py:248 +#: erpnext/stock/doctype/item/item.py:334 +#: erpnext/stock/doctype/item/item.py:1781 erpnext/tests/utils.py:249 msgid "Stores" msgstr "" @@ -53210,12 +53254,8 @@ msgstr "" #. Name of a report #. Label of a Link in the Manufacturing Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/buying/report/subcontract_order_summary/subcontract_order_summary.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontract Order Summary" msgstr "" @@ -53233,16 +53273,14 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Item To Be Received" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:224 +#: erpnext/stock/doctype/material_request/material_request.js:227 msgid "Subcontracted Purchase Order" msgstr "" @@ -53258,12 +53296,10 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of a Link in the Manufacturing Workspace #. Label of a Link in the Stock Workspace -#. Label of a Link in the Subcontracting Workspace #: erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json #: erpnext/buying/workspace/buying/buying.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json msgid "Subcontracted Raw Materials To Be Transferred" msgstr "" @@ -53273,25 +53309,19 @@ msgstr "" #. 'Production Plan Sub Assembly Item' #. Label of a Card Break in the Manufacturing Workspace #. Option for the 'Purpose' (Select) field in DocType 'Material Request' -#. Name of a Workspace -#. Title of a Workspace Sidebar #: erpnext/desktop_icon/subcontracting.json #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:10 #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting" msgstr "" #. Label of a Link in the Manufacturing Workspace #. Name of a DocType -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/subcontracting/doctype/subcontracting_bom/subcontracting_bom.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting BOM" msgstr "" @@ -53306,14 +53336,10 @@ msgstr "" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry' #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/setup/setup_wizard/operations/install_fixtures.py:132 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:158 -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Delivery" msgstr "" @@ -53337,24 +53363,14 @@ msgstr "" #. Option for the 'From Voucher Type' (Select) field in DocType 'Stock #. Reservation Entry' #. Name of a DocType -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/work_order/work_order.json #: erpnext/selling/doctype/sales_order/sales_order.js:1049 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Inward Order" msgstr "" -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Inward Order Count" -msgstr "" - #. Label of the subcontracting_inward_order_item (Data) field in DocType 'Work #. Order' #. Name of a DocType @@ -53387,7 +53403,6 @@ msgstr "" #. Receipt Item' #. Label of the subcontracting_order (Link) field in DocType 'Subcontracting #. Receipt Supplied Item' -#. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/purchase_order/purchase_order.js:370 #: erpnext/controllers/subcontracting_controller.py:1156 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json @@ -53397,7 +53412,6 @@ msgstr "" #: 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 msgid "Subcontracting Order" msgstr "" @@ -53431,18 +53445,6 @@ msgstr "" msgid "Subcontracting Order {0} created." msgstr "" -#. Label of a chart in the Subcontracting Workspace -#. Label of a Card Break in the Subcontracting Workspace -#. Label of a Link in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order" -msgstr "" - -#. Label of a number card in the Subcontracting Workspace -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -msgid "Subcontracting Outward Order Count" -msgstr "" - #. Label of the purchase_order (Link) field in DocType 'Subcontracting Order' #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json msgid "Subcontracting Purchase Order" @@ -53458,8 +53460,6 @@ msgstr "" #. Option for the 'Reference Type' (Select) field in DocType 'Quality #. Inspection' #. Name of a DocType -#. Label of a Link in the Subcontracting Workspace -#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json @@ -53467,8 +53467,6 @@ msgstr "" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:637 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json -#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json -#: erpnext/workspace_sidebar/subcontracting.json msgid "Subcontracting Receipt" msgstr "" @@ -53584,7 +53582,6 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Desktop Icon -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_subscription/process_subscription.json @@ -53599,7 +53596,6 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation_dashboard.py:12 #: erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py:25 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_dashboard.py:34 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription" msgstr "" @@ -53634,10 +53630,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/subscription_plan/subscription_plan.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Plan" msgstr "" @@ -53663,7 +53657,6 @@ msgstr "" #: erpnext/accounts/doctype/subscription_settings/subscription_settings.json #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/workspace_sidebar/erpnext_settings.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscription Settings" msgstr "" @@ -53676,11 +53669,7 @@ msgstr "" msgid "Subscription for Future dates cannot be processed." msgstr "" -#. Name of a Workspace -#. Title of a Workspace Sidebar -#: erpnext/accounts/workspace/subscriptions/subscriptions.json #: erpnext/selling/doctype/customer/customer_dashboard.py:28 -#: erpnext/workspace_sidebar/subscriptions.json msgid "Subscriptions" msgstr "" @@ -53719,7 +53708,7 @@ msgstr "" msgid "Successfully Set Supplier" msgstr "" -#: erpnext/stock/doctype/item/item.py:409 +#: erpnext/stock/doctype/item/item.py:414 msgid "Successfully changed Stock UOM, please redefine conversion factors for new UOM." msgstr "" @@ -53739,11 +53728,11 @@ msgstr "" msgid "Successfully imported {0} records." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:243 +#: erpnext/buying/doctype/supplier/supplier.js:252 msgid "Successfully linked to Customer" msgstr "" -#: erpnext/selling/doctype/customer/customer.js:275 +#: erpnext/selling/doctype/customer/customer.js:284 msgid "Successfully linked to Supplier" msgstr "" @@ -53906,7 +53895,7 @@ msgstr "" #: erpnext/public/js/purchase_trends_filters.js:63 #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/regional/report/irs_1099/irs_1099.py:76 -#: erpnext/selling/doctype/customer/customer.js:257 +#: erpnext/selling/doctype/customer/customer.js:266 #: erpnext/selling/doctype/party_specific_item/party_specific_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:187 #: erpnext/selling/doctype/sales_order/sales_order.js:1741 @@ -53925,7 +53914,6 @@ msgstr "" #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:524 #: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/invoicing.json -#: erpnext/workspace_sidebar/subscriptions.json msgid "Supplier" msgstr "" @@ -54203,7 +54191,7 @@ msgstr "" #: erpnext/buying/workspace/buying/buying.json #: erpnext/crm/doctype/opportunity/opportunity.js:81 #: erpnext/selling/doctype/quotation/quotation.json -#: erpnext/stock/doctype/material_request/material_request.js:208 +#: erpnext/stock/doctype/material_request/material_request.js:211 #: erpnext/workspace_sidebar/buying.json msgid "Supplier Quotation" msgstr "" @@ -54459,7 +54447,7 @@ msgstr "" msgid "Synchronize all accounts every hour" msgstr "" -#: erpnext/accounts/doctype/account/account.py:676 +#: erpnext/accounts/doctype/account/account.py:683 msgid "System In Use" msgstr "" @@ -54506,9 +54494,7 @@ msgid "TDS / withholding tax category applied when paying this supplier" msgstr "" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.json -#: erpnext/workspace_sidebar/taxes.json msgid "TDS Computation Summary" msgstr "" @@ -54663,7 +54649,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:826 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:825 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "" @@ -54783,7 +54769,7 @@ msgstr "" #. Label of the amount (Currency) field in DocType 'Item Wise Tax Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:244 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:91 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:101 msgid "Tax Amount" msgstr "" @@ -54863,7 +54849,6 @@ msgstr "" #. Label of the tax_category (Link) field in DocType 'Delivery Note' #. Label of the tax_category (Link) field in DocType 'Item Tax' #. Label of the tax_category (Link) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -54883,7 +54868,6 @@ msgstr "" #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/item_tax/item_tax.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Category" msgstr "" @@ -54922,7 +54906,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:229 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:67 #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:205 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:57 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:67 #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Tax Id" @@ -54962,7 +54946,7 @@ msgid "Tax Rate" msgstr "" #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:237 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:84 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:94 msgid "Tax Rate %" msgstr "" @@ -54982,10 +54966,8 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Invoicing Workspace -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/workspace/invoicing/invoicing.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Rule" msgstr "" @@ -55044,7 +55026,6 @@ msgstr "" #. Label of the tax_withholding_category (Link) field in DocType 'Lower #. Deduction Certificate' #. Label of the tax_withholding_category (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -55052,19 +55033,16 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.json #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:199 -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:72 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:82 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/regional/doctype/lower_deduction_certificate/lower_deduction_certificate.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Category" msgstr "" #. Name of a report -#. Label of a Workspace Sidebar Item #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Details" msgstr "" @@ -55109,7 +55087,6 @@ msgstr "" #. Rate' #. Label of the tax_withholding_group (Link) field in DocType 'Supplier' #. Label of the tax_withholding_group (Link) field in DocType 'Customer' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -55119,7 +55096,6 @@ msgstr "" #: erpnext/accounts/doctype/tax_withholding_rate/tax_withholding_rate.json #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json -#: erpnext/workspace_sidebar/taxes.json msgid "Tax Withholding Group" msgstr "" @@ -55185,12 +55161,10 @@ msgstr "" #. Label of the taxes (Table) field in DocType 'POS Closing Entry' #. Label of the taxes_section (Section Break) field in DocType 'POS Profile' #. Label of the sb_1 (Section Break) field in DocType 'Subscription' -#. Name of a Workspace #. Label of a Desktop Icon #. Label of the taxes_section (Section Break) field in DocType 'Sales Order' #. Label of the taxes (Table) field in DocType 'Item Group' #. Label of the taxes (Table) field in DocType 'Item' -#. Title of a Workspace Sidebar #: erpnext/accounts/doctype/pos_closing_entry/closing_voucher_details.html:60 #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -55198,10 +55172,10 @@ msgstr "" #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:12 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:27 #: erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py:43 -#: erpnext/accounts/workspace/taxes/taxes.json erpnext/desktop_icon/taxes.json +#: erpnext/desktop_icon/taxes.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/setup/doctype/item_group/item_group.json -#: erpnext/stock/doctype/item/item.json erpnext/workspace_sidebar/taxes.json +#: erpnext/stock/doctype/item/item.json msgid "Taxes" msgstr "" @@ -55324,7 +55298,7 @@ msgstr "" msgid "Taxes and Charges Deducted (Company Currency)" msgstr "" -#: erpnext/stock/doctype/item/item.py:422 +#: erpnext/stock/doctype/item/item.py:427 msgid "Taxes row #{0}: {1} cannot be smaller than {2}" msgstr "" @@ -55375,7 +55349,7 @@ msgstr "" msgid "Template Item" msgstr "" -#: erpnext/stock/get_item_details.py:358 +#: erpnext/stock/get_item_details.py:357 msgid "Template Item Selected" msgstr "" @@ -55498,7 +55472,6 @@ msgstr "" #. Name of a DocType #. Label of the terms (Text Editor) field in DocType 'Terms and Conditions' #. Label of the terms (Text Editor) field in DocType 'Purchase Receipt' -#. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json @@ -55513,7 +55486,6 @@ msgstr "" #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json -#: erpnext/workspace_sidebar/accounts_setup.json msgid "Terms and Conditions" msgstr "" @@ -55757,7 +55729,7 @@ msgstr "" msgid "The Process Loss Qty has been reset as per the Job Card's Process Loss Qty" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1384 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1397 msgid "The Process Loss Qty has been reset as per the job card's Process Loss Qty" msgstr "" @@ -55769,7 +55741,7 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2763 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2765 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" @@ -55777,7 +55749,7 @@ msgstr "" msgid "The Serial Nos {0} have not been supplied against the {1} {2}" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:959 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:972 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 "" @@ -55813,8 +55785,8 @@ msgstr "" msgid "The bank account is not a company account. Please select a company account" msgstr "" -#: erpnext/stock/services/serial_batch_bundle_service.py:654 -msgid "The batch {0} is already reserved in {1} {2}. So, cannot proceed with the {3} {4}, which is created against the {5} {6}." +#: erpnext/stock/services/serial_batch_bundle_service.py:655 +msgid "The batch {0} is reserved for {1} in the warehouse {2} and the remaining quantity is not enough to cover the reservations. So, cannot proceed with the {3} {4}." msgstr "" #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:41 @@ -55882,7 +55854,7 @@ msgstr "" msgid "The field {0} in row {1} is not set" msgstr "" -#: erpnext/stock/stock_ledger.py:445 +#: erpnext/stock/stock_ledger.py:475 msgid "The field {0} is required for reposting" msgstr "" @@ -55911,7 +55883,7 @@ msgstr "" msgid "The following Items, having Putaway Rules, could not be accommodated:" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:137 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:140 msgid "The following Purchase Invoices are not submitted:" msgstr "" @@ -55927,7 +55899,7 @@ msgstr "" msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "" -#: erpnext/stock/doctype/item/item.py:953 +#: erpnext/stock/doctype/item/item.py:958 msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "" @@ -55944,11 +55916,11 @@ msgid "The following payment schedule(s) already exist:\n" "{0}" msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:111 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:114 msgid "The following rows are duplicates:" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:566 +#: erpnext/stock/doctype/material_request/material_request.py:605 msgid "The following {0} were created: {1}" msgstr "" @@ -55971,15 +55943,15 @@ msgstr "Svátek dne {0} není mezi datem od a datem do" msgid "The invoice is not fully allocated as there is a difference of {0}." msgstr "" -#: erpnext/controllers/buying_controller.py:1244 +#: erpnext/controllers/buying_controller.py:1252 msgid "The item {item} is not marked as {type_of} item. You can enable it as {type_of} item from its Item master." msgstr "" -#: erpnext/stock/doctype/item/item.py:679 +#: erpnext/stock/doctype/item/item.py:684 msgid "The items {0} and {1} are present in the following {2} :" msgstr "" -#: erpnext/controllers/buying_controller.py:1237 +#: erpnext/controllers/buying_controller.py:1245 msgid "The items {items} are not marked as {type_of} item. You can enable them as {type_of} item from their Item masters." msgstr "" @@ -55995,7 +55967,7 @@ msgstr "" msgid "The last account row must not have any debit or credit amounts set." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:533 +#: erpnext/public/js/utils/barcode_scanner.js:542 msgid "The last scanned warehouse has been cleared and won't be set in the subsequently scanned items" msgstr "" @@ -56037,7 +56009,7 @@ msgstr "" msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:234 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:235 msgid "The parent account {0} does not exists in the uploaded template" msgstr "" @@ -56100,7 +56072,7 @@ msgstr "" msgid "The root account {0} must be a group" msgstr "" -#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:87 +#: erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py:88 msgid "The selected BOMs are not for the same item" msgstr "" @@ -56112,7 +56084,7 @@ msgstr "" msgid "The selected item cannot have Batch" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:662 +#: erpnext/assets/doctype/asset/asset.js:670 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 "" @@ -56141,7 +56113,7 @@ msgstr "" msgid "The shares don't exist with the {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:908 +#: erpnext/stock/stock_ledger.py:956 msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." msgstr "Zásoba položky {0} ve skladu {1} byla dne {2} záporná. Pro zaúčtování správné oceňovací sazby byste měli před datem {4} a časem {5} vytvořit kladnou položku {3}. Další podrobnosti najdete v dokumentaci." @@ -56175,11 +56147,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:352 +#: erpnext/stock/doctype/material_request/material_request.py:391 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:359 +#: erpnext/stock/doctype/material_request/material_request.py:398 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "" @@ -56247,11 +56219,11 @@ msgstr "" msgid "The {0} contains Unit Price Items." msgstr "" -#: erpnext/stock/doctype/item/item.py:493 +#: erpnext/stock/doctype/item/item.py:498 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:572 +#: erpnext/stock/doctype/material_request/material_request.py:611 msgid "The {0} {1} created successfully" msgstr "" @@ -56312,7 +56284,7 @@ msgstr "" msgid "There are no transactions in the system for the selected bank account and dates that match the filters." msgstr "" -#: erpnext/stock/doctype/item/item.js:1591 +#: erpnext/stock/doctype/item/item.js:1608 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 "" @@ -56348,7 +56320,7 @@ msgstr "" msgid "There is one unreconciled transaction before {0}." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:896 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:909 msgid "There must be at least 1 Finished Good in this Stock Entry" msgstr "" @@ -56396,11 +56368,11 @@ msgstr "" msgid "This Fiscal Year" msgstr "" -#: erpnext/stock/doctype/item/item.js:224 +#: erpnext/stock/doctype/item/item.js:235 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:281 +#: erpnext/stock/doctype/item/item.js:292 msgid "This Item is a Variant of {0} (Template)." msgstr "" @@ -56527,7 +56499,7 @@ msgstr "" msgid "This is a root department and cannot be edited." msgstr "" -#: erpnext/setup/doctype/item_group/item_group.js:98 +#: erpnext/setup/doctype/item_group/item_group.js:115 msgid "This is a root item group and cannot be edited." msgstr "" @@ -56567,7 +56539,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:1579 +#: erpnext/stock/doctype/item/item.js:1596 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 "" @@ -56650,7 +56622,7 @@ msgstr "" msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}." msgstr "" -#: erpnext/assets/doctype/asset_repair/asset_repair.py:328 +#: erpnext/assets/doctype/asset_repair/asset_repair.py:331 msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "" @@ -57217,7 +57189,7 @@ msgstr "" msgid "To add Operations tick the 'With Operations' checkbox." msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:770 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:768 msgid "To add subcontracted Item's raw materials if include exploded items is disabled." msgstr "" @@ -57261,7 +57233,7 @@ msgstr "" msgid "To enable Capital Work in Progress Accounting, you must select Capital Work in Progress Account in accounts table" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:763 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:761 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "" @@ -57276,7 +57248,7 @@ msgstr "" msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" -#: erpnext/stock/doctype/item/item.py:701 +#: erpnext/stock/doctype/item/item.py:706 msgid "To merge, following properties must be same for both items" msgstr "" @@ -57536,10 +57508,6 @@ msgstr "" msgid "Total Asset Cost" msgstr "" -#: erpnext/assets/dashboard_fixtures.py:158 -msgid "Total Assets" -msgstr "" - #. Label of the total_billable_amount (Currency) field in DocType 'Timesheet' #: erpnext/projects/doctype/timesheet/timesheet.json msgid "Total Billable Amount" @@ -58051,7 +58019,7 @@ msgstr "" msgid "Total Tax" msgstr "" -#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:86 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:96 msgid "Total Taxable Amount" msgstr "" @@ -58215,7 +58183,7 @@ msgstr "" msgid "Total allocated percentage for sales team should be 100" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:197 +#: erpnext/selling/doctype/customer/customer.py:205 msgid "Total contribution percentage should be equal to 100" msgstr "" @@ -58374,7 +58342,7 @@ msgstr "" msgid "Transaction Dates" msgstr "" -#: erpnext/setup/doctype/company/company.py:1140 +#: erpnext/setup/doctype/company/company.py:1142 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "" @@ -58555,9 +58523,10 @@ msgstr "" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "" -#. Description of the 'Credit Limit' (Table) field in DocType 'Customer' +#. Description of the 'Credit & Overdue Limits' (Table) field in DocType +#. 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Transactions are blocked or warned when outstanding balance exceeds this amount." +msgid "Transactions are blocked when the outstanding balance exceeds the credit limit. When the overdue billing setting is enabled, new invoices are also blocked when the customer's overdue amount exceeds the overdue billing threshold." msgstr "" #: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:239 @@ -58599,7 +58568,7 @@ msgstr "" msgid "Transfer Account" msgstr "" -#: erpnext/assets/doctype/asset/asset.js:160 +#: erpnext/assets/doctype/asset/asset.js:168 msgid "Transfer Asset" msgstr "" @@ -58609,7 +58578,7 @@ msgstr "" msgid "Transfer Extra Raw Materials to WIP (%)" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:485 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:483 msgid "Transfer From Warehouses" msgstr "" @@ -58627,7 +58596,7 @@ msgstr "" msgid "Transfer Materials" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:479 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:477 msgid "Transfer Materials For Warehouse {0}" msgstr "" @@ -58706,7 +58675,7 @@ msgstr "" msgid "Transit" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:611 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:610 msgid "Transit Entry" msgstr "" @@ -59040,7 +59009,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/uom_conversion_detail/uom_conversion_detail.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:101 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:87 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:92 #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/item_where_used/item_where_used.py:69 #: erpnext/stock/report/item_wise_consumption/item_wise_consumption.py:60 @@ -59106,7 +59075,7 @@ msgstr "" msgid "UOM Conversion Factor" msgstr "" -#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:520 +#: erpnext/manufacturing/doctype/production_plan/services/material_request.py:526 msgid "UOM Conversion factor ({0} -> {1}) not found for item: {2}" msgstr "" @@ -59125,7 +59094,7 @@ msgstr "" msgid "UOM Name" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1693 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1728 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "" @@ -59318,7 +59287,7 @@ msgstr "" msgid "Unit of Measure (UOM)" msgstr "" -#: erpnext/stock/doctype/item/item.py:454 +#: erpnext/stock/doctype/item/item.py:459 msgid "Unit of Measure {0} has been entered more than once in Conversion Factor Table" msgstr "" @@ -59422,7 +59391,6 @@ msgstr "" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/workspace_sidebar/banking.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json msgid "Unreconcile Payment" @@ -59486,7 +59454,7 @@ msgstr "" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:552 -#: erpnext/stock/doctype/pick_list/pick_list.js:321 +#: erpnext/stock/doctype/pick_list/pick_list.js:322 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:389 msgid "Unreserving Stock..." msgstr "" @@ -59763,7 +59731,7 @@ msgstr "" msgid "Updating Costing and Billing fields against this Project..." msgstr "" -#: erpnext/stock/doctype/item/item.py:1541 +#: erpnext/stock/doctype/item/item.py:1546 msgid "Updating Variants..." msgstr "" @@ -59961,7 +59929,7 @@ msgstr "" msgid "Use Transaction Date Exchange Rate" msgstr "" -#: erpnext/projects/doctype/project/project.py:639 +#: erpnext/projects/doctype/project/project.py:669 msgid "Use a name that is different from previous project name" msgstr "" @@ -60006,6 +59974,12 @@ msgstr "" msgid "Used for items valued at Standard Cost: the difference between the purchase price and the standard rate is booked here." msgstr "" +#. Description of the 'Expenses Added To Stock Contra Account' (Link) field in +#. DocType 'Item Default' +#: erpnext/stock/doctype/item_default/item_default.json +msgid "Used to balance the books when recording expenses added to stock" +msgstr "" + #. Description of the 'Purchase Expense Contra Account' (Link) field in DocType #. 'Item Default' #: erpnext/stock/doctype/item_default/item_default.json @@ -60112,6 +60086,12 @@ msgstr "" msgid "Users with this role are allowed to over deliver/receive against orders above the allowance percentage" msgstr "" +#. Description of the 'Role allowed to bypass overdue billing limit' (Link) +#. field in DocType 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Users with this role can still submit invoices for customers over their overdue billing threshold." +msgstr "" + #. Description of the 'Role to Notify on Depreciation Failure' (Link) field in #. DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -60327,7 +60307,7 @@ msgstr "" msgid "Valuation Method" msgstr "" -#: erpnext/stock/doctype/item/item.py:1074 +#: erpnext/stock/doctype/item/item.py:1079 msgid "Valuation Method cannot be changed to or from 'Standard Cost' for {0} because stock transactions already exist for it." msgstr "" @@ -60364,7 +60344,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json -#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:976 +#: erpnext/stock/doctype/bin/bin.json erpnext/stock/doctype/item/item.js:993 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json @@ -60372,7 +60352,7 @@ msgstr "" #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:164 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:90 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:68 #: erpnext/stock/report/stock_balance/stock_balance.py:563 @@ -60383,19 +60363,19 @@ msgstr "" msgid "Valuation Rate (In / Out)" msgstr "" -#: erpnext/stock/stock_ledger.py:2161 +#: erpnext/stock/stock_ledger.py:2209 msgid "Valuation Rate Missing" msgstr "" -#: erpnext/stock/doctype/item/item.py:1652 +#: erpnext/stock/doctype/item/item.py:1657 msgid "Valuation Rate cannot be negative." msgstr "" -#: erpnext/stock/stock_ledger.py:2139 +#: erpnext/stock/stock_ledger.py:2187 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" -#: erpnext/stock/doctype/item/item.py:316 +#: erpnext/stock/doctype/item/item.py:321 msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "" @@ -60553,13 +60533,13 @@ msgstr "" msgid "Variance ({})" msgstr "" -#: erpnext/stock/doctype/item/item.js:271 +#: erpnext/stock/doctype/item/item.js:282 #: erpnext/stock/doctype/item/item_list.js:61 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" msgstr "" -#: erpnext/stock/doctype/item/item.py:968 +#: erpnext/stock/doctype/item/item.py:973 msgid "Variant Attribute Error" msgstr "" @@ -60578,11 +60558,11 @@ msgstr "" msgid "Variant Based On" msgstr "" -#: erpnext/stock/doctype/item/item.py:996 +#: erpnext/stock/doctype/item/item.py:1001 msgid "Variant Based On cannot be changed" msgstr "" -#: erpnext/stock/doctype/item/item.js:247 +#: erpnext/stock/doctype/item/item.js:258 msgid "Variant Details Report" msgstr "" @@ -60596,7 +60576,7 @@ msgstr "" msgid "Variant Item" msgstr "" -#: erpnext/stock/doctype/item/item.py:966 +#: erpnext/stock/doctype/item/item.py:971 msgid "Variant Items" msgstr "" @@ -60607,7 +60587,7 @@ msgstr "" msgid "Variant Of" msgstr "" -#: erpnext/stock/doctype/item/item.js:1264 +#: erpnext/stock/doctype/item/item.js:1281 msgid "Variant creation has been queued." msgstr "" @@ -61268,7 +61248,7 @@ msgstr "" msgid "Warehouse not found against the account {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:896 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:902 #: erpnext/stock/doctype/delivery_note/delivery_note.py:401 msgid "Warehouse required for stock Item {0}" msgstr "" @@ -61282,7 +61262,7 @@ msgstr "" msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:1657 +#: erpnext/stock/doctype/item/item.py:1662 #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:67 msgid "Warehouse {0} does not belong to Company {1}." msgstr "" @@ -61299,7 +61279,7 @@ msgstr "" msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:147 +#: erpnext/stock/services/base_stock_gl_composer.py:154 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 "" @@ -61309,7 +61289,7 @@ msgstr "" #. Label of the warehouses (Table MultiSelect) field in DocType 'Production #. Plan' -#: erpnext/manufacturing/doctype/production_plan/production_plan.js:555 +#: erpnext/manufacturing/doctype/production_plan/production_plan.js:553 #: erpnext/manufacturing/doctype/production_plan/production_plan.json #: erpnext/stock/report/stock_balance/stock_balance.js:76 #: erpnext/stock/report/stock_ledger/stock_ledger.js:30 @@ -61412,7 +61392,7 @@ msgstr "" msgid "Warning - Row {0}: Billing Hours are more than Actual Hours" msgstr "" -#: erpnext/stock/stock_ledger.py:918 +#: erpnext/stock/stock_ledger.py:966 msgid "Warning on Negative Stock" msgstr "" @@ -61428,7 +61408,7 @@ msgstr "" msgid "Warning: Another {0} # {1} exists against stock entry {2}" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.js:534 +#: erpnext/stock/doctype/material_request/material_request.js:535 msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "" @@ -61724,7 +61704,7 @@ 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:1598 +#: erpnext/stock/doctype/item/item.js:1615 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "" @@ -61890,7 +61870,7 @@ msgstr "" #: erpnext/assets/doctype/asset/asset_list.js:12 #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json -#: erpnext/setup/doctype/company/company.py:453 +#: erpnext/setup/doctype/company/company.py:455 #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Work In Progress" msgstr "" @@ -61932,9 +61912,9 @@ msgstr "" #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/public/js/shop_floor/shop_floor.js:230 #: erpnext/selling/doctype/sales_order/sales_order.js:1094 -#: erpnext/stock/doctype/material_request/material_request.js:216 +#: erpnext/stock/doctype/material_request/material_request.js:219 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:573 +#: erpnext/stock/doctype/material_request/material_request.py:612 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -62014,7 +61994,7 @@ msgstr "" msgid "Work Order Summary Report" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:579 +#: erpnext/stock/doctype/material_request/material_request.py:618 msgid "Work Order cannot be created for the following reason:
    {0}" msgstr "" @@ -62048,7 +62028,7 @@ msgid "Work Order {0} must be submitted" msgstr "" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:567 +#: erpnext/stock/doctype/material_request/material_request.py:606 msgid "Work Orders" msgstr "" @@ -62213,7 +62193,7 @@ msgstr "" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:736 +#: erpnext/setup/doctype/company/company.py:738 msgid "Write Off" msgstr "" @@ -62382,6 +62362,10 @@ msgstr "" msgid "You are not authorized to set Frozen value" msgstr "" +#: erpnext/stock/doctype/company_restriction/company_restriction.py:93 +msgid "You are not permitted to add or remove Company {0} in Allowed Companies" +msgstr "" + #: erpnext/stock/doctype/pick_list/pick_list.py:544 msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}." msgstr "" @@ -62402,7 +62386,7 @@ msgstr "" msgid "You can also set default CWIP account in Company {0}" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:761 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:767 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "" @@ -62479,7 +62463,7 @@ msgstr "" msgid "You cannot edit the root node." msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:198 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:205 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" @@ -62499,7 +62483,7 @@ msgstr "" msgid "You cannot redeem more than {0}." msgstr "" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:212 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:220 msgid "You cannot repost item valuation before {0}" msgstr "" @@ -62515,7 +62499,7 @@ msgstr "" msgid "You cannot submit the order without payment." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:968 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:974 msgid "You cannot update stock for a Debit Note. A Debit Note is a financial document that should not affect inventory. Please disable 'Update Stock'." msgstr "" @@ -62572,7 +62556,7 @@ msgstr "" msgid "You have already selected items from {0} {1}" msgstr "" -#: erpnext/projects/doctype/project/project.py:420 +#: erpnext/projects/doctype/project/project.py:422 msgid "You have been invited to collaborate on the project {0}." msgstr "" @@ -62596,7 +62580,7 @@ msgstr "" msgid "You have not performed any reconciliations in this session yet." msgstr "" -#: erpnext/stock/doctype/item/item.py:1215 +#: erpnext/stock/doctype/item/item.py:1220 msgid "You have to enable auto re-order in Stock Settings to maintain re-order levels." msgstr "" @@ -62698,7 +62682,7 @@ msgstr "" msgid "`Allow Negative rates for Items`" msgstr "" -#: erpnext/stock/stock_ledger.py:2153 +#: erpnext/stock/stock_ledger.py:2201 msgid "after" msgstr "" @@ -62735,7 +62719,7 @@ msgid "by {}" msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:338 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:840 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:846 msgid "dated {0}" msgstr "" @@ -62869,7 +62853,7 @@ msgstr "" msgid "paid to" msgstr "" -#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:51 +#: erpnext/public/js/utils.js:480 erpnext/utilities/__init__.py:78 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "" @@ -62886,7 +62870,7 @@ msgstr "" msgid "per hour" msgstr "" -#: erpnext/stock/stock_ledger.py:2154 +#: erpnext/stock/stock_ledger.py:2202 msgid "performing either one below:" msgstr "" @@ -62981,7 +62965,7 @@ msgstr "" msgid "to" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1259 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1265 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "" @@ -63066,7 +63050,7 @@ msgstr "" msgid "{0} Digest" msgstr "" -#: erpnext/accounts/utils.py:1591 +#: erpnext/accounts/utils.py:1585 msgid "{0} Number {1} is already used in {2} {3}" msgstr "" @@ -63078,11 +63062,11 @@ msgstr "" msgid "{0} Operations: {1}" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:232 +#: erpnext/stock/doctype/material_request/material_request.py:271 msgid "{0} Request for {1}" msgstr "" -#: erpnext/stock/doctype/item/item.py:393 +#: erpnext/stock/doctype/item/item.py:398 msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "" @@ -63132,6 +63116,9 @@ msgstr "" #: erpnext/accounts/report/general_ledger/general_ledger.py:63 #: erpnext/accounts/report/pos_register/pos_register.py:120 +#: erpnext/accounts/report/tds_computation_summary/tds_computation_summary.py:28 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:35 +#: erpnext/stock/report/cogs_by_item_group/cogs_by_item_group.py:42 msgid "{0} and {1} are mandatory" msgstr "" @@ -63155,7 +63142,7 @@ msgstr "" msgid "{0} cannot be changed with opened Opening Entries." msgstr "" -#: erpnext/public/js/utils/sales_common.js:336 +#: erpnext/public/js/utils/sales_common.js:334 msgid "{0} cannot be greater than 100" msgstr "" @@ -63172,7 +63159,7 @@ msgid "{0} completed job cards" msgstr "" #: erpnext/manufacturing/doctype/production_plan/services/material_request.py:137 -#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:199 +#: erpnext/manufacturing/doctype/production_plan/services/work_order_planning.py:214 #: erpnext/stock/doctype/pick_list/mapper.py:79 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:323 msgid "{0} created" @@ -63182,11 +63169,11 @@ msgstr "" msgid "{0} creation for the following records will be skipped." msgstr "" -#: erpnext/setup/doctype/company/company.py:364 +#: erpnext/setup/doctype/company/company.py:366 msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:287 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "" @@ -63202,6 +63189,14 @@ msgstr "" msgid "{0} does not belong to the Company {1}." msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:100 +msgid "{0} doesn't belong to Company {1}. Please select a Cost Center that belongs to Company {1}." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:57 +msgid "{0} doesn't belong to Company {1}. Please select an Income Account that belongs to Company {1}." +msgstr "" + #: erpnext/public/js/templates/shop_floor_template.html:880 msgid "{0} draft job cards awaiting submission" msgstr "" @@ -63211,7 +63206,7 @@ msgid "{0} entered twice in Item Tax" msgstr "" #: erpnext/setup/doctype/item_group/item_group.py:47 -#: erpnext/stock/doctype/item/item.py:524 +#: erpnext/stock/doctype/item/item.py:529 msgid "{0} entered twice {1} in Item Taxes" msgstr "" @@ -63252,6 +63247,14 @@ msgstr "" msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:114 +msgid "{0} is a group Cost Center. Please select a non-group Cost Center." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:78 +msgid "{0} is a group account. Please select a non-group Income Account." +msgstr "" + #: erpnext/accounts/doctype/pos_profile/pos_profile.py:95 msgid "{0} is a mandatory Accounting Dimension.
    Please set a value for {0} in Accounting Dimensions section." msgstr "" @@ -63274,11 +63277,19 @@ msgstr "" msgid "{0} is blocked so this transaction cannot proceed" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:64 +msgid "{0} is disabled. Please select a valid Income Account." +msgstr "" + +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:107 +msgid "{0} is disabled. Please select an enabled Cost Center." +msgstr "" + #: erpnext/assets/doctype/asset/asset.py:514 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:865 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:871 msgid "{0} is mandatory for Item {1}" msgstr "" @@ -63299,7 +63310,7 @@ msgstr "" msgid "{0} is not a CSV file." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:239 +#: erpnext/selling/doctype/customer/customer.py:251 msgid "{0} is not a company bank account" msgstr "" @@ -63331,6 +63342,10 @@ msgstr "" msgid "{0} is not added in the table" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:71 +msgid "{0} is not an Income Account. Please select a valid Income Account." +msgstr "" + #: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:146 msgid "{0} is not enabled in {1}" msgstr "" @@ -63339,11 +63354,11 @@ msgstr "" msgid "{0} is not running. Cannot trigger events for this document" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:478 +#: erpnext/stock/doctype/material_request/material_request.py:517 msgid "{0} is not the default supplier for any items." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2689 msgid "{0} is on hold until {1}" msgstr "" @@ -63383,6 +63398,10 @@ msgstr "" msgid "{0} job cards awaiting Manufacture entry" msgstr "" +#: erpnext/accounts/doctype/dunning_type/dunning_type.py:144 +msgid "{0} languages are marked as default languages. Please select only one of them." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.py:160 msgid "{0} must be a group warehouse." msgstr "" @@ -63436,11 +63455,11 @@ msgstr "" msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1127 +#: erpnext/stock/doctype/pick_list/pick_list.py:1136 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1120 +#: erpnext/stock/doctype/pick_list/pick_list.py:1129 msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "" @@ -63448,16 +63467,16 @@ 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:1800 erpnext/stock/stock_ledger.py:2325 -#: erpnext/stock/stock_ledger.py:2339 +#: erpnext/stock/stock_ledger.py:1848 erpnext/stock/stock_ledger.py:2373 +#: erpnext/stock/stock_ledger.py:2387 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:2429 erpnext/stock/stock_ledger.py:2474 +#: erpnext/stock/stock_ledger.py:2477 erpnext/stock/stock_ledger.py:2522 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1794 +#: erpnext/stock/stock_ledger.py:1842 msgid "{0} units of {1} needed in {2} to complete this transaction." msgstr "" @@ -63469,7 +63488,7 @@ msgstr "" msgid "{0} valid serial nos for Item {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:1269 +#: erpnext/stock/doctype/item/item.js:1286 msgid "{0} variants created." msgstr "" @@ -63481,7 +63500,7 @@ msgstr "Zobrazení {0} není v uživatelské finanční sestavě aktuálně podp msgid "{0} will be given as discount." msgstr "" -#: erpnext/public/js/utils/barcode_scanner.js:523 +#: erpnext/public/js/utils/barcode_scanner.js:532 msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "" @@ -63525,11 +63544,11 @@ msgstr "" #: erpnext/buying/doctype/purchase_order/services/status.py:35 #: erpnext/selling/doctype/sales_order/services/status.py:45 -#: erpnext/stock/doctype/material_request/material_request.py:258 +#: erpnext/stock/doctype/material_request/material_request.py:297 msgid "{0} {1} has been modified. Please refresh." msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:285 +#: erpnext/stock/doctype/material_request/material_request.py:324 msgid "{0} {1} has not been submitted so the action cannot be completed" msgstr "" @@ -63559,11 +63578,11 @@ msgstr "" msgid "{0} {1} is cancelled or closed" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:437 +#: erpnext/stock/doctype/material_request/material_request.py:476 msgid "{0} {1} is cancelled or stopped" msgstr "" -#: erpnext/stock/doctype/material_request/material_request.py:275 +#: erpnext/stock/doctype/material_request/material_request.py:314 msgid "{0} {1} is cancelled so the action cannot be completed" msgstr "" @@ -63647,7 +63666,7 @@ msgstr "" msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "" -#: erpnext/stock/services/base_stock_gl_composer.py:226 +#: erpnext/stock/services/base_stock_gl_composer.py:282 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "" @@ -63679,11 +63698,11 @@ msgstr "" msgid "{0}%" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:210 +#: erpnext/controllers/website_list_for_contact.py:212 msgid "{0}% Billed" msgstr "" -#: erpnext/controllers/website_list_for_contact.py:218 +#: erpnext/controllers/website_list_for_contact.py:220 msgid "{0}% Delivered" msgstr "" @@ -63716,11 +63735,11 @@ msgstr "" msgid "{0}: Virtual DocType (no database table)" msgstr "" -#: erpnext/stock/doctype/item/item.js:1185 +#: erpnext/stock/doctype/item/item.js:1202 msgid "{0}: remove invalid value(s) {1}" msgstr "" -#: erpnext/stock/doctype/item/item.js:1192 +#: erpnext/stock/doctype/item/item.js:1209 msgid "{0}: select the typed value {1} from the list or clear it" msgstr "" @@ -63732,7 +63751,7 @@ msgstr "" msgid "{0}: {1} does not exist" msgstr "{0}: {1} neexistuje" -#: erpnext/setup/doctype/company/company.py:351 +#: erpnext/setup/doctype/company/company.py:353 msgid "{0}: {1} is a group account." msgstr "" @@ -63740,15 +63759,15 @@ msgstr "" msgid "{0}: {1} must be less than {2}" msgstr "" -#: erpnext/controllers/buying_controller.py:1028 +#: erpnext/controllers/buying_controller.py:1036 msgid "{count} Assets created for {item_code}" msgstr "" -#: erpnext/controllers/buying_controller.py:928 +#: erpnext/controllers/buying_controller.py:936 msgid "{doctype} {name} is cancelled or closed." msgstr "" -#: erpnext/controllers/stock_controller.py:666 +#: erpnext/controllers/stock_controller.py:668 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "" diff --git a/erpnext/locale/da.po b/erpnext/locale/da.po index cbc4d9f894e..74c61ccbc2a 100644 --- a/erpnext/locale/da.po +++ b/erpnext/locale/da.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-07-12 10:05+0000\n" -"PO-Revision-Date: 2026-07-15 12:58\n" +"POT-Creation-Date: 2026-07-19 10:04+0000\n" +"PO-Revision-Date: 2026-07-19 13:55\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Danish\n" "MIME-Version: 1.0\n" @@ -38,7 +38,7 @@ msgstr " Stykliste" #. Label of the default_wip_warehouse (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json msgid " Default Work In Progress Warehouse " -msgstr "" +msgstr " Standardlager for igangværende arbejde " #. Label of the istable (Check) field in DocType 'Inventory Dimension' #: erpnext/stock/doctype/inventory_dimension/inventory_dimension.json @@ -62,7 +62,7 @@ msgstr " Navn" #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:144 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:185 msgid " Phantom Item" -msgstr "" +msgstr " Fantomgenstand" #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:602 msgid " Rate" @@ -86,15 +86,15 @@ msgstr " Underenhed" msgid " Summary" msgstr " Oversigt" -#: erpnext/stock/doctype/item/item.py:281 +#: erpnext/stock/doctype/item/item.py:286 msgid "\"Customer Provided Item\" cannot be Purchase Item also" msgstr "\"Kunde Leverede Artikel\" kan ikke være Indkøbe Artikel" -#: erpnext/stock/doctype/item/item.py:283 +#: erpnext/stock/doctype/item/item.py:288 msgid "\"Customer Provided Item\" cannot have Valuation Rate" msgstr "\"Kunde Leverede Artikel\" kan ikke have Værdiansættelsesrate" -#: erpnext/stock/doctype/item/item.py:385 +#: erpnext/stock/doctype/item/item.py:390 msgid "\"Is Fixed Asset\" cannot be unchecked, as Asset record exists against the item" msgstr "\"Er anlægsaktiv\" kan ikke afkrydses, da der findes aktiv post for artikel" @@ -144,7 +144,7 @@ msgstr "% Færdig" #. Label of the cost_allocation_per (Percent) field in DocType 'BOM' #: erpnext/manufacturing/doctype/bom/bom.json msgid "% Cost Allocation" -msgstr "" +msgstr "% Omkostningsallokering" #. Label of the per_delivered (Percent) field in DocType 'Pick List' #. Label of the per_delivered (Percent) field in DocType 'Subcontracting Inward @@ -284,7 +284,7 @@ msgid "'Entries' cannot be empty" msgstr "'Indtastninger' må ikke være tomme" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:132 #: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "'Fra Dato' er påkrævet" @@ -293,7 +293,7 @@ msgstr "'Fra Dato' er påkrævet" msgid "'From Date' must be after 'To Date'" msgstr "'Fra Dato' skal være efter 'Til Dato'" -#: erpnext/stock/doctype/item/item.py:468 +#: erpnext/stock/doctype/item/item.py:473 msgid "'Has Serial No' cannot be 'Yes' for non-stock item" msgstr "" @@ -312,7 +312,7 @@ msgid "'Opening'" msgstr "'Åbning'" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 -#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 +#: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:134 #: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "'Til dato' er påkrævet" @@ -337,8 +337,8 @@ msgstr "'{0}' konto bruges allerede af {1}. Brug en anden konto." msgid "'{0}' has been already added." msgstr "'{0}' er allerede tilføjet." -#: erpnext/setup/doctype/company/company.py:376 -#: erpnext/setup/doctype/company/company.py:387 +#: erpnext/setup/doctype/company/company.py:378 +#: erpnext/setup/doctype/company/company.py:389 msgid "'{0}' should be in company currency {1}." msgstr "'{0}' skal være i selskab valuta {1}." @@ -371,7 +371,7 @@ msgstr "(D) Saldo Lagerværdi" #. Description of the 'Capacity' (Int) field in DocType 'Item Lead Time' #: erpnext/stock/doctype/item_lead_time/item_lead_time.json msgid "(Daily Yield * No of Units Produced) / 100" -msgstr "" +msgstr "(Dagligt udbytte * Antal producerede enheder) / 100" #: erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py:199 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:249 @@ -397,7 +397,7 @@ msgstr "(G) Summen af Ændringer i Lagerværdi" #. Time' #: erpnext/stock/doctype/item_lead_time/item_lead_time.json msgid "(Good Units Produced / Total Units Produced) × 100" -msgstr "" +msgstr "(Gode producerede enheder / Samlet antal producerede enheder) × 100" #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:274 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:166 @@ -439,7 +439,7 @@ msgstr "(Indkøp Ordre + Materiale Anmodning + Faktisk Udgift)" #. Time' #: erpnext/stock/doctype/item_lead_time/item_lead_time.json msgid "(Total Workstation Time / Manufacturing Time) * 60" -msgstr "" +msgstr "(Samlet arbejdsstationstid / Produktionstid) * 60" #. Description of the 'From No' (Int) field in DocType 'Share Transfer' #. Description of the 'To No' (Int) field in DocType 'Share Transfer' @@ -456,7 +456,7 @@ msgstr "* Vil blive beregnet i transaktionen." #: erpnext/stock/doctype/item/item_prices.html:128 #: erpnext/stock/doctype/item/item_prices.html:136 msgid "+ Add Price" -msgstr "" +msgstr "+ Tilføj pris" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html:112 #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:360 @@ -492,7 +492,7 @@ msgstr "1 time" #: banking/src/components/features/ActionLog/ActionLogDialogBody.tsx:236 msgid "1 invoice" -msgstr "" +msgstr "1 faktura" #: erpnext/public/js/templates/shop_floor_template.html:921 msgid "1 job card awaiting Manufacture entry" @@ -630,7 +630,7 @@ msgstr "<0" #: erpnext/assets/doctype/asset/asset.py:550 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 "" +msgstr "Kan ikke oprette et aktiv.

    Du prøver at oprette {0} aktiv(er) fra {2} {3}.
    Der blev dog kun købt {1} vare(r) , og der findes allerede {4} aktiver mod {5}." #: erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.py:59 msgid "From Time cannot be later than To Time for {0}" @@ -638,7 +638,7 @@ msgstr "Fra Tidspunkt kan ikke være senere end Til Tidspunkt for #: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:436 msgid "Row #{0}: Bundle {1} in warehouse {2} has insufficient packed items:
      {3}
    " -msgstr "" +msgstr "Række #{0}: Bundt {1} på lager {2} har utilstrækkelige pakkede varer:
      {3}
    " #. Content of the 'Help Text' (HTML) field in DocType 'Process Statement Of #. Accounts' @@ -660,7 +660,22 @@ msgid "
    \n" "
    Hello {{ customer.customer_name }},
    PFA your Statement Of Accounts from {{ doc.from_date }} to {{ doc.to_date }}.
    \n" "
\n" "" -msgstr "" +msgstr "
\n" +"

Note

\n" +"
    \n" +"
  • \n" +"Du kan bruge Jinja-tags i Emne og Brødtekst felter for dynamiske værdier.\n" +"
  • \n" +" Alle felter i denne doctype er tilgængelige under doc objektet, og alle felter for den kunde, som mailen skal sendes til, er tilgængelige under kunde objektet.\n" +"
\n" +"

Eksempler

\n" +"\n" +"
    \n" +"
  • Emne:

    Regnskabsopgørelse for {{ customer.customer_name }}

  • \n" +"
  • Brødtekst:

    \n" +"
    Hej {{ customer.customer_name }},
    PFA din regnskabsopgørelse fra {{ doc.from_date }} til {{ doc.to_date }}.
  • \n" +"
\n" +"" #. Content of the 'Other Details' (HTML) field in DocType 'Purchase Receipt' #. Content of the 'Other Details' (HTML) field in DocType 'Subcontracting @@ -668,39 +683,41 @@ msgstr "" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "
Other Details
" -msgstr "" +msgstr "
Andre detaljer
" #. Content of the 'no_bank_transactions' (HTML) field in DocType 'Bank #. Reconciliation Tool' #: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.json msgid "
No Matching Bank Transactions Found
" -msgstr "" +msgstr "
Ingen matchende banktransaktioner fundet
" #: erpnext/public/js/bank_reconciliation_tool/dialog_manager.js:262 msgid "
{0}
" -msgstr "" +msgstr "
{0}
" #. Content of the 'Stock Levels HTML' (HTML) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "
" -msgstr "" +msgstr "
" #. Content of the 'Prices HTML' (HTML) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "
" -msgstr "" +msgstr "
" #. Content of the 'uom_help_html' (HTML) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "
Define alternate units for this item. Eg: 1 Box = 12 Nos, set conversion factor as 12. (Will also apply for variants) Learn more →
" -msgstr "" +msgstr "
Definer alternative enheder for denne vare. F.eks.: 1 æske = 12 stk., indstil konverteringsfaktoren til 12. (Gælder også for varianter) Få mere at vide →
" #. Content of the 'settings' (HTML) field in DocType 'Cheque Print Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json msgid "
\n" "

All dimensions in centimeter only

\n" "
" -msgstr "" +msgstr "
\n" +"

Alle dimensioner er kun i centimeter

\n" +"
" #. Content of the 'about' (HTML) field in DocType 'Product Bundle' #: erpnext/selling/doctype/product_bundle/product_bundle.json @@ -709,7 +726,11 @@ msgid "

About Product Bundle

\n\n" "

The package Item will have Is Stock Item as No and Is Sales Item as Yes.

\n" "

Example:

\n" "

If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Product Bundle Item.

" -msgstr "" +msgstr "

Om produktpakke

\n\n" +"

Saml en gruppe af elementer til en anden element. Dette er nyttigt, hvis du samler bestemte varer i en pakke, og du har lager af de pakkede varer og ikke den samlede vare.

\n" +"

Pakken Vare vil have Er lagervare som Nej og Er salgsvare som Ja.

\n" +"

Eksempel:

\n" +"

Hvis du sælger bærbare computere og rygsække separat og har en specialpris, hvis kunden køber begge, vil bærbar computer + rygsæk være en ny produktpakke.

" #. Content of the 'Help' (HTML) field in DocType 'Currency Exchange Settings' #: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json @@ -717,7 +738,10 @@ msgid "

Currency Exchange Settings Help

\n" "

There are 3 variables that could be used within the endpoint, result key and in values of the parameter.

\n" "

Exchange rate between {from_currency} and {to_currency} on {transaction_date} is fetched by the API.

\n" "

Example: If your endpoint is exchange.com/2021-08-01, then, you will have to input exchange.com/{transaction_date}

" -msgstr "" +msgstr "

Hjælp til indstillinger for valutaveksling

\n" +"

Der er 3 variabler, der kan bruges i slutpunktet, resultatnøglen og i parameterens værdier.

\n" +"

Valutakurs mellem {from_currency} og {to_currency} på {transaction_date} hentes af API'en.

\n" +"

Eksempel: Hvis dit slutpunkt er exchange.com/2021-08-01, skal du indtaste exchange.com/{transaction_date}

" #. Content of the 'Body and Closing Text Help' (HTML) field in DocType 'Dunning #. Letter Text' @@ -728,7 +752,12 @@ msgid "

Body Text and Closing Text Example

\n\n" "

The fieldnames you can use in your template are the fields in the document. You can find out the fields of any documents via Setup > Customize Form View and selecting the document type (e.g. Sales Invoice)

\n\n" "

Templating

\n\n" "

Templates are compiled using the Jinja Templating Language. To learn more about Jinja, read this documentation.

" -msgstr "" +msgstr "

Eksempel på brødtekst og afsluttende tekst

\n\n" +"
Vi har bemærket, at du endnu ikke har betalt faktura {{sales_invoice}} for {{frappe.db.get_value(\"Currency\", currency, \"symbol\")}} {{outstanding_amount}}. Dette er en venlig påmindelse om, at fakturaen forfaldt den {{due_date}}. Betal venligst det skyldige beløb med det samme for at undgå yderligere rykkeromkostninger.
\n\n" +"

Sådan henter du feltnavne

\n\n" +"

De feltnavne, du kan bruge i din skabelon, er felterne i dokumentet. Du kan finde felterne i alle dokumenter via Opsætning > Tilpas formularvisning og vælg dokumenttype (f.eks. salgsfaktura)

\n\n" +"

Skabeloner

\n\n" +"

Skabeloner kompileres ved hjælp af Jinja-skabelonsproget. For at lære mere om Jinja, læs denne dokumentation.

" #. Content of the 'Contract Template Help' (HTML) field in DocType 'Contract #. Template' @@ -742,7 +771,15 @@ msgid "

Contract Template Example

\n\n" "

The field names you can use in your Contract Template are the fields in the Contract for which you are creating the template. You can find out the fields of any documents via Setup > Customize Form View and selecting the document type (e.g. Contract)

\n\n" "

Templating

\n\n" "

Templates are compiled using the Jinja Templating Language. To learn more about Jinja, read this documentation.

" -msgstr "" +msgstr "

Eksempel på kontraktskabelon

\n\n" +"
Kontrakt for kunde {{ party_name }}\n\n"
+"-Gyldig fra: {{ start_date }} \n"
+"-Gyldig til: {{ end_date }}\n"
+"
\n\n" +"

Sådan får du feltnavne

\n\n" +"

De feltnavne, du kan bruge i din kontraktskabelon, er felterne i den kontrakt, som du opretter skabelonen til. Du kan finde felterne for alle dokumenter via Opsætning > Tilpas formularvisning og valg af dokumenttype (f.eks. kontrakt)

\n\n" +"

Skabeloner

\n\n" +"

Skabeloner kompileres ved hjælp af Jinja-skabelonsproget. For at lære mere om Jinja, læs denne dokumentation.

" #. Content of the 'Terms and Conditions Help' (HTML) field in DocType 'Terms #. and Conditions' @@ -756,18 +793,26 @@ msgid "

Standard Terms and Conditions Example

\n\n" "

The fieldnames you can use in your email template are the fields in the document from which you are sending the email. You can find out the fields of any documents via Setup > Customize Form View and selecting the document type (e.g. Sales Invoice)

\n\n" "

Templating

\n\n" "

Templates are compiled using the Jinja Templating Language. To learn more about Jinja, read this documentation.

" -msgstr "" +msgstr "

Eksempel på standardvilkår og -betingelser

\n\n" +"
Leveringsbetingelser for ordrenummer {{ name }}\n\n"
+"-Ordredato: {{ transaction_date }} \n"
+"-Forventet leveringsdato: {{ delivery_date }}\n"
+"
\n\n" +"

Sådan får du feltnavne

\n\n" +"

De feltnavne, du kan bruge i din e-mailskabelon, er felterne i det dokument, hvorfra du sender e-mailen. Du kan finde felterne i alle dokumenter via Opsætning > Tilpas formularvisning og vælg dokumenttype (f.eks. salgsfaktura)

\n\n" +"

Skabeloner

\n\n" +"

Skabeloner kompileres ved hjælp af Jinja-skabelonsproget. For at lære mere om Jinja, læs denne dokumentation.

" #. Content of the 'account_no_settings' (HTML) field in DocType 'Cheque Print #. Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json msgid "" -msgstr "" +msgstr "" #. Content of the 'html_19' (HTML) field in DocType 'Cheque Print Template' #: erpnext/accounts/doctype/cheque_print_template/cheque_print_template.json msgid "" -msgstr "" +msgstr "" #. Content of the 'Date Settings' (HTML) field in DocType 'Cheque Print #. Template' @@ -777,19 +822,19 @@ msgstr "