diff --git a/.github/helper/documentation.py b/.github/helper/documentation.py index 378983e95f..83346045f8 100644 --- a/.github/helper/documentation.py +++ b/.github/helper/documentation.py @@ -3,52 +3,71 @@ import requests from urllib.parse import urlparse -docs_repos = [ - "frappe_docs", - "erpnext_documentation", +WEBSITE_REPOS = [ "erpnext_com", "frappe_io", ] +DOCUMENTATION_DOMAINS = [ + "docs.erpnext.com", + "frappeframework.com", +] -def uri_validator(x): - result = urlparse(x) - return all([result.scheme, result.netloc, result.path]) -def docs_link_exists(body): - for line in body.splitlines(): - for word in line.split(): - if word.startswith('http') and uri_validator(word): - parsed_url = urlparse(word) - if parsed_url.netloc == "github.com": - parts = parsed_url.path.split('/') - if len(parts) == 5 and parts[1] == "frappe" and parts[2] in docs_repos: - return True - elif parsed_url.netloc == "docs.erpnext.com": - return True +def is_valid_url(url: str) -> bool: + parts = urlparse(url) + return all((parts.scheme, parts.netloc, parts.path)) + + +def is_documentation_link(word: str) -> bool: + if not word.startswith("http") or not is_valid_url(word): + return False + + parsed_url = urlparse(word) + if parsed_url.netloc in DOCUMENTATION_DOMAINS: + return True + + if parsed_url.netloc == "github.com": + parts = parsed_url.path.split("/") + if len(parts) == 5 and parts[1] == "frappe" and parts[2] in WEBSITE_REPOS: + return True + + return False + + +def contains_documentation_link(body: str) -> bool: + return any( + is_documentation_link(word) + for line in body.splitlines() + for word in line.split() + ) + + +def check_pull_request(number: str) -> "tuple[int, str]": + response = requests.get(f"https://api.github.com/repos/frappe/erpnext/pulls/{number}") + if not response.ok: + return 1, "Pull Request Not Found! ⚠️" + + payload = response.json() + title = (payload.get("title") or "").lower().strip() + head_sha = (payload.get("head") or {}).get("sha") + body = (payload.get("body") or "").lower() + + if ( + not title.startswith("feat") + or not head_sha + or "no-docs" in body + or "backport" in body + ): + return 0, "Skipping documentation checks... 🏃" + + if contains_documentation_link(body): + return 0, "Documentation Link Found. You're Awesome! 🎉" + + return 1, "Documentation Link Not Found! ⚠️" if __name__ == "__main__": - pr = sys.argv[1] - response = requests.get("https://api.github.com/repos/frappe/erpnext/pulls/{}".format(pr)) - - if response.ok: - payload = response.json() - title = (payload.get("title") or "").lower().strip() - head_sha = (payload.get("head") or {}).get("sha") - body = (payload.get("body") or "").lower() - - if (title.startswith("feat") - and head_sha - and "no-docs" not in body - and "backport" not in body - ): - if docs_link_exists(body): - print("Documentation Link Found. You're Awesome! 🎉") - - else: - print("Documentation Link Not Found! ⚠️") - sys.exit(1) - - else: - print("Skipping documentation checks... 🏃") + exit_code, message = check_pull_request(sys.argv[1]) + print(message) + sys.exit(exit_code) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 73aae33e93..d70977c07e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,8 +32,8 @@ repos: - id: black additional_dependencies: ['click==8.0.4'] - - repo: https://github.com/timothycrosley/isort - rev: 5.9.1 + - repo: https://github.com/PyCQA/isort + rev: 5.12.0 hooks: - id: isort exclude: ".*setup.py$" diff --git a/erpnext/accounts/doctype/budget/budget.py b/erpnext/accounts/doctype/budget/budget.py index 53838fbd17..4c628a4d95 100644 --- a/erpnext/accounts/doctype/budget/budget.py +++ b/erpnext/accounts/doctype/budget/budget.py @@ -184,6 +184,11 @@ def validate_budget_records(args, budget_records, expense_amount): amount = expense_amount or get_amount(args, budget) yearly_action, monthly_action = get_actions(args, budget) + if yearly_action in ("Stop", "Warn"): + compare_expense_with_budget( + args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount + ) + if monthly_action in ["Stop", "Warn"]: budget_amount = get_accumulated_monthly_budget( budget.monthly_distribution, args.posting_date, args.fiscal_year, budget.budget_amount @@ -195,28 +200,28 @@ def validate_budget_records(args, budget_records, expense_amount): args, budget_amount, _("Accumulated Monthly"), monthly_action, budget.budget_against, amount ) - if ( - yearly_action in ("Stop", "Warn") - and monthly_action != "Stop" - and yearly_action != monthly_action - ): - compare_expense_with_budget( - args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount - ) - def compare_expense_with_budget(args, budget_amount, action_for, action, budget_against, amount=0): - actual_expense = amount or get_actual_expense(args) - if actual_expense > budget_amount: - diff = actual_expense - budget_amount + actual_expense = get_actual_expense(args) + total_expense = actual_expense + amount + + if total_expense > budget_amount: + if actual_expense > budget_amount: + error_tense = _("is already") + diff = actual_expense - budget_amount + else: + error_tense = _("will be") + diff = total_expense - budget_amount + currency = frappe.get_cached_value("Company", args.company, "default_currency") - msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It will exceed by {5}").format( + msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It {5} exceed by {6}").format( _(action_for), frappe.bold(args.account), - args.budget_against_field, + frappe.unscrub(args.budget_against_field), frappe.bold(budget_against), frappe.bold(fmt_money(budget_amount, currency=currency)), + error_tense, frappe.bold(fmt_money(diff, currency=currency)), ) @@ -227,9 +232,9 @@ def compare_expense_with_budget(args, budget_amount, action_for, action, budget_ action = "Warn" if action == "Stop": - frappe.throw(msg, BudgetError) + frappe.throw(msg, BudgetError, title=_("Budget Exceeded")) else: - frappe.msgprint(msg, indicator="orange") + frappe.msgprint(msg, indicator="orange", title=_("Budget Exceeded")) def get_actions(args, budget): @@ -351,7 +356,9 @@ def get_actual_expense(args): """ select sum(gle.debit) - sum(gle.credit) from `tabGL Entry` gle - where gle.account=%(account)s + where + is_cancelled = 0 + and gle.account=%(account)s {condition1} and gle.fiscal_year=%(fiscal_year)s and gle.company=%(company)s diff --git a/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py b/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py index d25016fe59..54ffe21a15 100644 --- a/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py +++ b/erpnext/accounts/doctype/cost_center_allocation/cost_center_allocation.py @@ -28,9 +28,14 @@ class InvalidDateError(frappe.ValidationError): class CostCenterAllocation(Document): + def __init__(self, *args, **kwargs): + super(CostCenterAllocation, self).__init__(*args, **kwargs) + self._skip_from_date_validation = False + def validate(self): self.validate_total_allocation_percentage() - self.validate_from_date_based_on_existing_gle() + if not self._skip_from_date_validation: + self.validate_from_date_based_on_existing_gle() self.validate_backdated_allocation() self.validate_main_cost_center() self.validate_child_cost_centers() diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 30a32015f5..21f27aedc5 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -8,7 +8,7 @@ frappe.provide("erpnext.journal_entry"); frappe.ui.form.on("Journal Entry", { setup: function(frm) { frm.add_fetch("bank_account", "account", "account"); - frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice']; + frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', 'Journal Entry']; }, refresh: function(frm) { diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index 12c0b7a7bf..154fdc039d 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -69,6 +69,10 @@ class PaymentReconciliation(Document): def get_jv_entries(self): condition = self.get_conditions() + + if self.get("cost_center"): + condition += f" and t2.cost_center = '{self.cost_center}' " + dr_or_cr = ( "credit_in_account_currency" if erpnext.get_party_account_type(self.party_type) == "Receivable" diff --git a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py index 2ba90b4da9..00e3934f10 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py @@ -747,6 +747,73 @@ class TestPaymentReconciliation(FrappeTestCase): self.assertEqual(len(pr.get("invoices")), 0) self.assertEqual(len(pr.get("payments")), 0) + def test_cost_center_filter_on_vouchers(self): + """ + Test Cost Center filter is applied on Invoices, Payment Entries and Journals + """ + transaction_date = nowdate() + rate = 100 + + # 'Main - PR' Cost Center + si1 = self.create_sales_invoice( + qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True + ) + si1.cost_center = self.main_cc.name + si1.submit() + + pe1 = self.create_payment_entry(posting_date=transaction_date, amount=rate) + pe1.cost_center = self.main_cc.name + pe1 = pe1.save().submit() + + je1 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date) + je1.accounts[0].cost_center = self.main_cc.name + je1.accounts[1].cost_center = self.main_cc.name + je1.accounts[1].party_type = "Customer" + je1.accounts[1].party = self.customer + je1 = je1.save().submit() + + # 'Sub - PR' Cost Center + si2 = self.create_sales_invoice( + qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True + ) + si2.cost_center = self.sub_cc.name + si2.submit() + + pe2 = self.create_payment_entry(posting_date=transaction_date, amount=rate) + pe2.cost_center = self.sub_cc.name + pe2 = pe2.save().submit() + + je2 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date) + je2.accounts[0].cost_center = self.sub_cc.name + je2.accounts[1].cost_center = self.sub_cc.name + je2.accounts[1].party_type = "Customer" + je2.accounts[1].party = self.customer + je2 = je2.save().submit() + + pr = self.create_payment_reconciliation() + pr.cost_center = self.main_cc.name + + pr.get_unreconciled_entries() + + # check PR tool output + self.assertEqual(len(pr.get("invoices")), 1) + self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si1.name) + self.assertEqual(len(pr.get("payments")), 2) + payment_vouchers = [x.get("reference_name") for x in pr.get("payments")] + self.assertCountEqual(payment_vouchers, [pe1.name, je1.name]) + + # Change cost center + pr.cost_center = self.sub_cc.name + + pr.get_unreconciled_entries() + + # check PR tool output + self.assertEqual(len(pr.get("invoices")), 1) + self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si2.name) + self.assertEqual(len(pr.get("payments")), 2) + payment_vouchers = [x.get("reference_name") for x in pr.get("payments")] + self.assertCountEqual(payment_vouchers, [je2.name, pe2.name]) + def make_customer(customer_name, currency=None): if not frappe.db.exists("Customer", customer_name): diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 4fc12dbc16..fc837c75a3 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -51,7 +51,7 @@ class PaymentRequest(Document): if existing_payment_request_amount: ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) - if hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") != "Shopping Cart": + if not hasattr(ref_doc, "order_type") or getattr(ref_doc, "order_type") != "Shopping Cart": ref_amount = get_amount(ref_doc, self.payment_account) if existing_payment_request_amount + flt(self.grand_total) > ref_amount: diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py index b543016eaa..a1239d64a0 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py @@ -675,7 +675,7 @@ def get_bin_qty(item_code, warehouse): def get_pos_reserved_qty(item_code, warehouse): reserved_qty = frappe.db.sql( - """select sum(p_item.qty) as qty + """select sum(p_item.stock_qty) as qty from `tabPOS Invoice` p, `tabPOS Invoice Item` p_item where p.name = p_item.parent and ifnull(p.consolidated_invoice, '') = '' diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 6281400fbc..54caf6f8b0 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -1426,6 +1426,7 @@ }, { "default": "0", + "depends_on": "apply_tds", "fieldname": "tax_withholding_net_total", "fieldtype": "Currency", "hidden": 1, @@ -1435,12 +1436,13 @@ "read_only": 1 }, { + "depends_on": "apply_tds", "fieldname": "base_tax_withholding_net_total", "fieldtype": "Currency", "hidden": 1, "label": "Base Tax Withholding Net Total", "no_copy": 1, - "options": "currency", + "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1 }, @@ -1554,7 +1556,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2022-12-12 18:37:38.142688", + "modified": "2023-01-28 19:18:56.586321", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 4729d9c3db..2f4e45e618 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -1776,6 +1776,8 @@ "width": "50%" }, { + "fetch_from": "sales_partner.commission_rate", + "fetch_if_empty": 1, "fieldname": "commission_rate", "fieldtype": "Float", "hide_days": 1, @@ -2141,7 +2143,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2022-12-12 18:34:33.409895", + "modified": "2023-01-28 19:45:47.538163", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py index 1bce43fd31..2c829b258b 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py +++ b/erpnext/accounts/doctype/tax_withholding_category/tax_withholding_category.py @@ -410,12 +410,26 @@ def get_tds_amount(ldc, parties, inv, tax_details, tax_deducted, vouchers): tds_amount = 0 invoice_filters = {"name": ("in", vouchers), "docstatus": 1, "apply_tds": 1} + ## for TDS to be deducted on advances + payment_entry_filters = { + "party_type": "Supplier", + "party": ("in", parties), + "docstatus": 1, + "apply_tax_withholding_amount": 1, + "unallocated_amount": (">", 0), + "posting_date": ["between", (tax_details.from_date, tax_details.to_date)], + "tax_withholding_category": tax_details.get("tax_withholding_category"), + } + field = "sum(tax_withholding_net_total)" if cint(tax_details.consider_party_ledger_amount): invoice_filters.pop("apply_tds", None) field = "sum(grand_total)" + payment_entry_filters.pop("apply_tax_withholding_amount", None) + payment_entry_filters.pop("tax_withholding_category", None) + supp_credit_amt = frappe.db.get_value("Purchase Invoice", invoice_filters, field) or 0.0 supp_jv_credit_amt = ( @@ -427,14 +441,28 @@ def get_tds_amount(ldc, parties, inv, tax_details, tax_deducted, vouchers): "party": ("in", parties), "reference_type": ("!=", "Purchase Invoice"), }, - "sum(credit_in_account_currency)", + "sum(credit_in_account_currency - debit_in_account_currency)", ) or 0.0 ) + # Get Amount via payment entry + payment_entry_amounts = frappe.db.get_all( + "Payment Entry", + filters=payment_entry_filters, + fields=["sum(unallocated_amount) as amount", "payment_type"], + group_by="payment_type", + ) + supp_credit_amt += supp_jv_credit_amt supp_credit_amt += inv.tax_withholding_net_total + for type in payment_entry_amounts: + if type.payment_type == "Pay": + supp_credit_amt += type.amount + else: + supp_credit_amt -= type.amount + threshold = tax_details.get("threshold", 0) cumulative_threshold = tax_details.get("cumulative_threshold", 0) diff --git a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py index 23caac047a..1e86cf5d2e 100644 --- a/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py +++ b/erpnext/accounts/doctype/tax_withholding_category/test_tax_withholding_category.py @@ -16,7 +16,7 @@ class TestTaxWithholdingCategory(unittest.TestCase): def setUpClass(self): # create relevant supplier, etc create_records() - create_tax_with_holding_category() + create_tax_withholding_category_records() def tearDown(self): cancel_invoices() @@ -38,7 +38,7 @@ class TestTaxWithholdingCategory(unittest.TestCase): pi = create_purchase_invoice(supplier="Test TDS Supplier") pi.submit() - # assert equal tax deduction on total invoice amount uptil now + # assert equal tax deduction on total invoice amount until now self.assertEqual(pi.taxes_and_charges_deducted, 3000) self.assertEqual(pi.grand_total, 7000) invoices.append(pi) @@ -47,7 +47,7 @@ class TestTaxWithholdingCategory(unittest.TestCase): pi = create_purchase_invoice(supplier="Test TDS Supplier", rate=5000) pi.submit() - # assert equal tax deduction on total invoice amount uptil now + # assert equal tax deduction on total invoice amount until now self.assertEqual(pi.taxes_and_charges_deducted, 500) invoices.append(pi) @@ -130,7 +130,7 @@ class TestTaxWithholdingCategory(unittest.TestCase): invoices.append(si) # create another invoice whose total when added to previously created invoice, - # surpasses cumulative threshhold + # surpasses cumulative threshold si = create_sales_invoice(customer="Test TCS Customer", rate=12000) si.submit() @@ -329,6 +329,38 @@ class TestTaxWithholdingCategory(unittest.TestCase): for d in reversed(invoices): d.cancel() + def test_tax_withholding_via_payment_entry_for_advances(self): + frappe.db.set_value( + "Supplier", "Test TDS Supplier7", "tax_withholding_category", "Advance TDS Category" + ) + + # create payment entry + pe1 = create_payment_entry( + payment_type="Pay", party_type="Supplier", party="Test TDS Supplier7", paid_amount=4000 + ) + pe1.submit() + + self.assertFalse(pe1.get("taxes")) + + pe2 = create_payment_entry( + payment_type="Pay", party_type="Supplier", party="Test TDS Supplier7", paid_amount=4000 + ) + pe2.submit() + + self.assertFalse(pe2.get("taxes")) + + pe3 = create_payment_entry( + payment_type="Pay", party_type="Supplier", party="Test TDS Supplier7", paid_amount=4000 + ) + pe3.apply_tax_withholding_amount = 1 + pe3.save() + pe3.submit() + + self.assertEquals(pe3.get("taxes")[0].tax_amount, 1200) + pe1.cancel() + pe2.cancel() + pe3.cancel() + def cancel_invoices(): purchase_invoices = frappe.get_all( @@ -450,6 +482,32 @@ def create_sales_invoice(**args): return si +def create_payment_entry(**args): + # return payment entry doc object + args = frappe._dict(args) + pe = frappe.get_doc( + { + "doctype": "Payment Entry", + "posting_date": today(), + "payment_type": args.payment_type, + "party_type": args.party_type, + "party": args.party, + "company": "_Test Company", + "paid_from": "Cash - _TC", + "paid_to": "Creditors - _TC", + "paid_amount": args.paid_amount or 10000, + "received_amount": args.paid_amount or 10000, + "reference_no": args.reference_no or "12345", + "reference_date": today(), + "paid_from_account_currency": "INR", + "paid_to_account_currency": "INR", + } + ) + + pe.save() + return pe + + def create_records(): # create a new suppliers for name in [ @@ -460,6 +518,7 @@ def create_records(): "Test TDS Supplier4", "Test TDS Supplier5", "Test TDS Supplier6", + "Test TDS Supplier7", ]: if frappe.db.exists("Supplier", name): continue @@ -530,142 +589,129 @@ def create_records(): ).insert() -def create_tax_with_holding_category(): +def create_tax_withholding_category_records(): fiscal_year = get_fiscal_year(today(), company="_Test Company") + from_date = fiscal_year[1] + to_date = fiscal_year[2] + # Cumulative threshold - if not frappe.db.exists("Tax Withholding Category", "Cumulative Threshold TDS"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "Cumulative Threshold TDS", - "category_name": "10% TDS", - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 0, - "cumulative_threshold": 30000.00, - } - ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], - } - ).insert() + create_tax_withholding_category( + category_name="Cumulative Threshold TDS", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=0, + cumulative_threshold=30000.00, + ) - if not frappe.db.exists("Tax Withholding Category", "Cumulative Threshold TCS"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "Cumulative Threshold TCS", - "category_name": "10% TCS", - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 0, - "cumulative_threshold": 30000.00, - } - ], - "accounts": [{"company": "_Test Company", "account": "TCS - _TC"}], - } - ).insert() + # Category for TCS + create_tax_withholding_category( + category_name="Cumulative Threshold TCS", + rate=10, + from_date=from_date, + to_date=to_date, + account="TCS - _TC", + single_threshold=0, + cumulative_threshold=30000.00, + ) - # Single thresold - if not frappe.db.exists("Tax Withholding Category", "Single Threshold TDS"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "Single Threshold TDS", - "category_name": "10% TDS", - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 20000.00, - "cumulative_threshold": 0, - } - ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], - } - ).insert() + # Single threshold + create_tax_withholding_category( + category_name="Single Threshold TDS", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=20000, + cumulative_threshold=0, + ) - if not frappe.db.exists("Tax Withholding Category", "New TDS Category"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "New TDS Category", - "category_name": "New TDS Category", - "round_off_tax_amount": 1, - "consider_party_ledger_amount": 1, - "tax_on_excess_amount": 1, - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 0, - "cumulative_threshold": 30000, - } - ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], - } - ).insert() + create_tax_withholding_category( + category_name="New TDS Category", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=0, + cumulative_threshold=30000, + round_off_tax_amount=1, + consider_party_ledger_amount=1, + tax_on_excess_amount=1, + ) - if not frappe.db.exists("Tax Withholding Category", "Test Service Category"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "Test Service Category", - "category_name": "Test Service Category", - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 2000, - "cumulative_threshold": 2000, - } - ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], - } - ).insert() + create_tax_withholding_category( + category_name="Test Service Category", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=2000, + cumulative_threshold=2000, + ) - if not frappe.db.exists("Tax Withholding Category", "Test Goods Category"): - frappe.get_doc( - { - "doctype": "Tax Withholding Category", - "name": "Test Goods Category", - "category_name": "Test Goods Category", - "rates": [ - { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 2000, - "cumulative_threshold": 2000, - } - ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], - } - ).insert() + create_tax_withholding_category( + category_name="Test Goods Category", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=2000, + cumulative_threshold=2000, + ) - if not frappe.db.exists("Tax Withholding Category", "Test Multi Invoice Category"): + create_tax_withholding_category( + category_name="Test Multi Invoice Category", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=5000, + cumulative_threshold=10000, + ) + + create_tax_withholding_category( + category_name="Advance TDS Category", + rate=10, + from_date=from_date, + to_date=to_date, + account="TDS - _TC", + single_threshold=5000, + cumulative_threshold=10000, + consider_party_ledger_amount=1, + ) + + +def create_tax_withholding_category( + category_name, + rate, + from_date, + to_date, + account, + single_threshold=0, + cumulative_threshold=0, + round_off_tax_amount=0, + consider_party_ledger_amount=0, + tax_on_excess_amount=0, +): + if not frappe.db.exists("Tax Withholding Category", category_name): frappe.get_doc( { "doctype": "Tax Withholding Category", - "name": "Test Multi Invoice Category", - "category_name": "Test Multi Invoice Category", + "name": category_name, + "category_name": category_name, + "round_off_tax_amount": round_off_tax_amount, + "consider_party_ledger_amount": consider_party_ledger_amount, + "tax_on_excess_amount": tax_on_excess_amount, "rates": [ { - "from_date": fiscal_year[1], - "to_date": fiscal_year[2], - "tax_withholding_rate": 10, - "single_threshold": 5000, - "cumulative_threshold": 10000, + "from_date": from_date, + "to_date": to_date, + "tax_withholding_rate": rate, + "single_threshold": single_threshold, + "cumulative_threshold": cumulative_threshold, } ], - "accounts": [{"company": "_Test Company", "account": "TDS - _TC"}], + "accounts": [{"company": "_Test Company", "account": account}], } ).insert() diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index baeed03a0f..b6eb3edbda 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -211,7 +211,13 @@ def set_address_details( else: party_details.update(get_company_address(company)) - if doctype and doctype in ["Delivery Note", "Sales Invoice", "Sales Order", "Quotation"]: + if doctype and doctype in [ + "Delivery Note", + "Sales Invoice", + "Sales Order", + "Quotation", + "POS Invoice", + ]: if party_details.company_address: party_details.update( get_fetch_values(doctype, "company_address", party_details.company_address) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index fc23127935..27b84c4e77 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -526,7 +526,7 @@ def get_columns(filters): "options": "GL Entry", "hidden": 1, }, - {"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 90}, + {"label": _("Posting Date"), "fieldname": "posting_date", "fieldtype": "Date", "width": 100}, { "label": _("Account"), "fieldname": "account", @@ -538,13 +538,13 @@ def get_columns(filters): "label": _("Debit ({0})").format(currency), "fieldname": "debit", "fieldtype": "Float", - "width": 100, + "width": 130, }, { "label": _("Credit ({0})").format(currency), "fieldname": "credit", "fieldtype": "Float", - "width": 100, + "width": 130, }, { "label": _("Balance ({0})").format(currency), diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 130b7150fb..25e7891a49 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -655,10 +655,35 @@ class GrossProfitGenerator(object): return self.calculate_buying_amount_from_sle( row, my_sle, parenttype, parent, item_row, item_code ) + elif row.sales_order and row.so_detail: + incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code) + if incoming_amount: + return incoming_amount else: return flt(row.qty) * self.get_average_buying_rate(row, item_code) - return 0.0 + return flt(row.qty) * self.get_average_buying_rate(row, item_code) + + def get_buying_amount_from_so_dn(self, sales_order, so_detail, item_code): + from frappe.query_builder.functions import Sum + + delivery_note = frappe.qb.DocType("Delivery Note") + delivery_note_item = frappe.qb.DocType("Delivery Note Item") + + query = ( + frappe.qb.from_(delivery_note) + .inner_join(delivery_note_item) + .on(delivery_note.name == delivery_note_item.parent) + .select(Sum(delivery_note_item.incoming_rate * delivery_note_item.stock_qty)) + .where(delivery_note.docstatus == 1) + .where(delivery_note_item.item_code == item_code) + .where(delivery_note_item.against_sales_order == sales_order) + .where(delivery_note_item.so_detail == so_detail) + .groupby(delivery_note_item.item_code) + ) + + incoming_amount = query.run() + return flt(incoming_amount[0][0]) if incoming_amount else 0 def get_average_buying_rate(self, row, item_code): args = row @@ -760,7 +785,8 @@ class GrossProfitGenerator(object): `tabSales Invoice`.territory, `tabSales Invoice Item`.item_code, `tabSales Invoice Item`.item_name, `tabSales Invoice Item`.description, `tabSales Invoice Item`.warehouse, `tabSales Invoice Item`.item_group, - `tabSales Invoice Item`.brand, `tabSales Invoice Item`.dn_detail, + `tabSales Invoice Item`.brand, `tabSales Invoice Item`.so_detail, + `tabSales Invoice Item`.sales_order, `tabSales Invoice Item`.dn_detail, `tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.stock_qty as qty, `tabSales Invoice Item`.base_net_rate, `tabSales Invoice Item`.base_net_amount, `tabSales Invoice Item`.name as "item_row", `tabSales Invoice`.is_return, diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index fa11a41df4..21681bef5b 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -302,3 +302,82 @@ class TestGrossProfit(FrappeTestCase): columns, data = execute(filters=filters) self.assertGreater(len(data), 0) + + def test_order_connected_dn_and_inv(self): + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + """ + Test gp calculation when invoice and delivery note aren't directly connected. + SO -- INV + | + DN + """ + se = make_stock_entry( + company=self.company, + item_code=self.item, + target=self.warehouse, + qty=3, + basic_rate=100, + do_not_submit=True, + ) + item = se.items[0] + se.append( + "items", + { + "item_code": item.item_code, + "s_warehouse": item.s_warehouse, + "t_warehouse": item.t_warehouse, + "qty": 10, + "basic_rate": 200, + "conversion_factor": item.conversion_factor or 1.0, + "transfer_qty": flt(item.qty) * (flt(item.conversion_factor) or 1.0), + "serial_no": item.serial_no, + "batch_no": item.batch_no, + "cost_center": item.cost_center, + "expense_account": item.expense_account, + }, + ) + se = se.save().submit() + + so = make_sales_order( + customer=self.customer, + company=self.company, + warehouse=self.warehouse, + item=self.item, + qty=4, + do_not_save=False, + do_not_submit=False, + ) + + from erpnext.selling.doctype.sales_order.sales_order import ( + make_delivery_note, + make_sales_invoice, + ) + + make_delivery_note(so.name).submit() + sinv = make_sales_invoice(so.name).submit() + + filters = frappe._dict( + company=self.company, from_date=nowdate(), to_date=nowdate(), group_by="Invoice" + ) + + columns, data = execute(filters=filters) + expected_entry = { + "parent_invoice": sinv.name, + "currency": "INR", + "sales_invoice": self.item, + "customer": self.customer, + "posting_date": frappe.utils.datetime.date.fromisoformat(nowdate()), + "item_code": self.item, + "item_name": self.item, + "warehouse": "Stores - _GP", + "qty": 4.0, + "avg._selling_rate": 100.0, + "valuation_rate": 125.0, + "selling_amount": 400.0, + "buying_amount": 500.0, + "gross_profit": -100.0, + "gross_profit_%": -25.0, + } + gp_entry = [x for x in data if x.parent_invoice == sinv.name] + self.assertDictContainsSubset(expected_entry, gp_entry[0]) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 5337fd64ee..17d40784be 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -4,7 +4,17 @@ import frappe from frappe import _ -from frappe.utils import add_months, cint, flt, get_link_to_form, getdate, nowdate, today +from frappe.utils import ( + add_months, + cint, + flt, + get_last_day, + get_link_to_form, + getdate, + is_last_day_of_the_month, + nowdate, + today, +) from frappe.utils.user import get_users_with_role from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( @@ -400,6 +410,9 @@ def disposal_was_made_on_original_schedule_date(schedule_idx, row, posting_date_ row.depreciation_start_date, schedule_idx * cint(row.frequency_of_depreciation) ) + if is_last_day_of_the_month(row.depreciation_start_date): + orginal_schedule_date = get_last_day(orginal_schedule_date) + if orginal_schedule_date == posting_date_of_disposal: return True diff --git a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py index faffd1134d..d41069c1c9 100644 --- a/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/fixed_asset_register.py @@ -126,16 +126,18 @@ def get_asset_value(asset, finance_book=None): if not asset.calculate_depreciation: return flt(asset.gross_purchase_amount) - flt(asset.opening_accumulated_depreciation) - finance_book_filter = ["finance_book", "is", "not set"] - if finance_book: - finance_book_filter = ["finance_book", "=", finance_book] - - return frappe.db.get_value( + result = frappe.get_all( doctype="Asset Finance Book", - filters=[["parent", "=", asset.asset_id], finance_book_filter], - fieldname="value_after_depreciation", + filters={ + "parent": asset.asset_id, + "finance_book": finance_book or ("is", "not set"), + }, + pluck="value_after_depreciation", + limit=1, ) + return result[0] if result else 0.0 + def prepare_chart_data(data, filters): labels_values_map = {} diff --git a/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py b/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py index 646dba51ce..c673be89b3 100644 --- a/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py +++ b/erpnext/bulk_transaction/doctype/bulk_transaction_log/test_bulk_transaction_log.py @@ -15,17 +15,6 @@ class TestBulkTransactionLog(unittest.TestCase): create_customer() create_item() - def test_for_single_record(self): - so_name = create_so() - transaction_processing([{"name": so_name}], "Sales Order", "Sales Invoice") - data = frappe.db.get_list( - "Sales Invoice", - filters={"posting_date": date.today(), "customer": "Bulk Customer"}, - fields=["*"], - ) - if not data: - self.fail("No Sales Invoice Created !") - def test_entry_in_log(self): so_name = create_so() transaction_processing([{"name": so_name}], "Sales Order", "Sales Invoice") diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index e1dd679781..29afc8476e 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1221,6 +1221,7 @@ }, { "default": "0", + "depends_on": "apply_tds", "fieldname": "tax_withholding_net_total", "fieldtype": "Currency", "hidden": 1, @@ -1230,12 +1231,13 @@ "read_only": 1 }, { + "depends_on": "apply_tds", "fieldname": "base_tax_withholding_net_total", "fieldtype": "Currency", "hidden": 1, "label": "Base Tax Withholding Net Total", "no_copy": 1, - "options": "currency", + "options": "Company:company:default_currency", "print_hide": 1, "read_only": 1 }, @@ -1269,7 +1271,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2022-12-25 18:08:59.074182", + "modified": "2023-01-28 18:59:16.322824", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py index 47a66ad46f..9b53421319 100644 --- a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py @@ -15,60 +15,4 @@ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse class TestProcurementTracker(FrappeTestCase): - def test_result_for_procurement_tracker(self): - filters = {"company": "_Test Procurement Company", "cost_center": "Main - _TPC"} - expected_data = self.generate_expected_data() - report = execute(filters) - - length = len(report[1]) - self.assertEqual(expected_data, report[1][length - 1]) - - def generate_expected_data(self): - if not frappe.db.exists("Company", "_Test Procurement Company"): - frappe.get_doc( - dict( - doctype="Company", - company_name="_Test Procurement Company", - abbr="_TPC", - default_currency="INR", - country="Pakistan", - ) - ).insert() - warehouse = create_warehouse("_Test Procurement Warehouse", company="_Test Procurement Company") - mr = make_material_request( - company="_Test Procurement Company", warehouse=warehouse, cost_center="Main - _TPC" - ) - po = make_purchase_order(mr.name) - po.supplier = "_Test Supplier" - po.get("items")[0].cost_center = "Main - _TPC" - po.submit() - pr = make_purchase_receipt(po.name) - pr.get("items")[0].cost_center = "Main - _TPC" - pr.submit() - date_obj = datetime.date(datetime.now()) - - po.load_from_db() - - expected_data = { - "material_request_date": date_obj, - "cost_center": "Main - _TPC", - "project": None, - "requesting_site": "_Test Procurement Warehouse - _TPC", - "requestor": "Administrator", - "material_request_no": mr.name, - "item_code": "_Test Item", - "quantity": 10.0, - "unit_of_measurement": "_Test UOM", - "status": "To Bill", - "purchase_order_date": date_obj, - "purchase_order": po.name, - "supplier": "_Test Supplier", - "estimated_cost": 0.0, - "actual_cost": 0.0, - "purchase_order_amt": po.net_total, - "purchase_order_amt_in_company_currency": po.base_net_total, - "expected_delivery_date": date_obj, - "actual_delivery_date": date_obj, - } - - return expected_data + pass diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index b0ff5d4c3b..2a588d8d13 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -282,6 +282,7 @@ def _make_customer(source_name, target_doc=None, ignore_permissions=False): "contact_no": "phone_1", "fax": "fax_1", }, + "field_no_map": ["disabled"], } }, target_doc, @@ -390,7 +391,7 @@ def get_lead_details(lead, posting_date=None, company=None): { "territory": lead.territory, "customer_name": lead.company_name or lead.lead_name, - "contact_display": " ".join(filter(None, [lead.salutation, lead.lead_name])), + "contact_display": " ".join(filter(None, [lead.lead_name])), "contact_email": lead.email_id, "contact_mobile": lead.mobile_no, "contact_phone": lead.phone, diff --git a/erpnext/patches/v14_0/migrate_cost_center_allocations.py b/erpnext/patches/v14_0/migrate_cost_center_allocations.py index 3bd26933ba..48f4e6d989 100644 --- a/erpnext/patches/v14_0/migrate_cost_center_allocations.py +++ b/erpnext/patches/v14_0/migrate_cost_center_allocations.py @@ -18,9 +18,11 @@ def create_new_cost_center_allocation_records(cc_allocations): cca = frappe.new_doc("Cost Center Allocation") cca.main_cost_center = main_cc cca.valid_from = today() + cca._skip_from_date_validation = True for child_cc, percentage in allocations.items(): cca.append("allocation_percentages", ({"cost_center": child_cc, "percentage": percentage})) + cca.save() cca.submit() diff --git a/erpnext/portal/doctype/homepage_section/test_homepage_section.py b/erpnext/portal/doctype/homepage_section/test_homepage_section.py index 27c8fe4c95..3df56e67f6 100644 --- a/erpnext/portal/doctype/homepage_section/test_homepage_section.py +++ b/erpnext/portal/doctype/homepage_section/test_homepage_section.py @@ -10,62 +10,6 @@ from frappe.website.serve import get_response class TestHomepageSection(unittest.TestCase): - def test_homepage_section_card(self): - try: - frappe.get_doc( - { - "doctype": "Homepage Section", - "name": "Card Section", - "section_based_on": "Cards", - "section_cards": [ - { - "title": "Card 1", - "subtitle": "Subtitle 1", - "content": "This is test card 1", - "route": "/card-1", - }, - { - "title": "Card 2", - "subtitle": "Subtitle 2", - "content": "This is test card 2", - "image": "test.jpg", - }, - ], - "no_of_columns": 3, - } - ).insert(ignore_if_duplicate=True) - except frappe.DuplicateEntryError: - pass - - set_request(method="GET", path="home") - response = get_response() - - self.assertEqual(response.status_code, 200) - - html = frappe.safe_decode(response.get_data()) - - soup = BeautifulSoup(html, "html.parser") - sections = soup.find("main").find_all("section") - self.assertEqual(len(sections), 3) - - homepage_section = sections[2] - self.assertEqual(homepage_section.h3.text, "Card Section") - - cards = homepage_section.find_all(class_="card") - - self.assertEqual(len(cards), 2) - self.assertEqual(cards[0].h5.text, "Card 1") - self.assertEqual(cards[0].a["href"], "/card-1") - self.assertEqual(cards[1].p.text, "Subtitle 2") - - img = cards[1].find(class_="card-img-top") - - self.assertEqual(img["src"], "test.jpg") - self.assertEqual(img["loading"], "lazy") - - # cleanup - frappe.db.rollback() - def test_homepage_section_custom_html(self): frappe.get_doc( { diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 271b563c73..2ce0c7eb00 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -122,7 +122,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { calculate_item_values() { var me = this; if (!this.discount_amount_applied) { - for (item of this.frm.doc.items || []) { + for (const item of this.frm.doc.items || []) { frappe.model.round_floats_in(item); item.net_rate = item.rate; item.qty = item.qty === undefined ? (me.frm.doc.is_return ? -1 : 1) : item.qty; diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 3a778fa496..09f2c5d5cb 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1691,6 +1691,10 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe var me = this; var valid = true; + if (frappe.flags.ignore_company_party_validation) { + return valid; + } + $.each(["company", "customer"], function(i, fieldname) { if(frappe.meta.has_field(me.frm.doc.doctype, fieldname) && !["Purchase Order","Purchase Invoice"].includes(me.frm.doc.doctype)) { if (!me.frm.doc[fieldname]) { diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js index 9288f515cd..a913844e18 100644 --- a/erpnext/public/js/setup_wizard.js +++ b/erpnext/public/js/setup_wizard.js @@ -13,19 +13,11 @@ frappe.setup.on("before_load", function () { erpnext.setup.slides_settings = [ { - // Brand - name: 'brand', - icon: "fa fa-bookmark", - title: __("The Brand"), - // help: __('Upload your letter head and logo. (you can edit them later).'), + // Organization + name: 'organization', + title: __("Setup your organization"), + icon: "fa fa-building", fields: [ - { - fieldtype: "Attach Image", fieldname: "attach_logo", - label: __("Attach Logo"), - description: __("100px by 100px"), - is_private: 0, - align: 'center' - }, { fieldname: 'company_name', label: __('Company Name'), @@ -35,54 +27,9 @@ erpnext.setup.slides_settings = [ { fieldname: 'company_abbr', label: __('Company Abbreviation'), - fieldtype: 'Data' - } - ], - onload: function(slide) { - this.bind_events(slide); - }, - bind_events: function (slide) { - slide.get_input("company_name").on("change", function () { - var parts = slide.get_input("company_name").val().split(" "); - var abbr = $.map(parts, function (p) { return p ? p.substr(0, 1) : null }).join(""); - slide.get_field("company_abbr").set_value(abbr.slice(0, 10).toUpperCase()); - }).val(frappe.boot.sysdefaults.company_name || "").trigger("change"); - - slide.get_input("company_abbr").on("change", function () { - if (slide.get_input("company_abbr").val().length > 10) { - frappe.msgprint(__("Company Abbreviation cannot have more than 5 characters")); - slide.get_field("company_abbr").set_value(""); - } - }); - }, - validate: function() { - if ((this.values.company_name || "").toLowerCase() == "company") { - frappe.msgprint(__("Company Name cannot be Company")); - return false; - } - if (!this.values.company_abbr) { - return false; - } - if (this.values.company_abbr.length > 10) { - return false; - } - return true; - } - }, - { - // Organisation - name: 'organisation', - title: __("Your Organization"), - icon: "fa fa-building", - fields: [ - { - fieldname: 'company_tagline', - label: __('What does it do?'), fieldtype: 'Data', - placeholder: __('e.g. "Build tools for builders"'), - reqd: 1 + hidden: 1 }, - { fieldname: 'bank_account', label: __('Bank Name'), fieldtype: 'Data', reqd: 1 }, { fieldname: 'chart_of_accounts', label: __('Chart of Accounts'), options: "", fieldtype: 'Select' @@ -94,40 +41,24 @@ erpnext.setup.slides_settings = [ ], onload: function (slide) { - this.load_chart_of_accounts(slide); this.bind_events(slide); + this.load_chart_of_accounts(slide); this.set_fy_dates(slide); }, - validate: function () { - let me = this; - let exist; - if (!this.validate_fy_dates()) { return false; } - // Validate bank name - if(me.values.bank_account) { - frappe.call({ - async: false, - method: "erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts.validate_bank_account", - args: { - "coa": me.values.chart_of_accounts, - "bank_account": me.values.bank_account - }, - callback: function (r) { - if(r.message){ - exist = r.message; - me.get_field("bank_account").set_value(""); - let message = __('Account {0} already exists. Please enter a different name for your bank account.', - [me.values.bank_account] - ); - frappe.msgprint(message); - } - } - }); - return !exist; // Return False if exist = true + if ((this.values.company_name || "").toLowerCase() == "company") { + frappe.msgprint(__("Company Name cannot be Company")); + return false; + } + if (!this.values.company_abbr) { + return false; + } + if (this.values.company_abbr.length > 10) { + return false; } return true; @@ -151,15 +82,15 @@ erpnext.setup.slides_settings = [ var country = frappe.wizard.values.country; if (country) { - var fy = erpnext.setup.fiscal_years[country]; - var current_year = moment(new Date()).year(); - var next_year = current_year + 1; + let fy = erpnext.setup.fiscal_years[country]; + let current_year = moment(new Date()).year(); + let next_year = current_year + 1; if (!fy) { fy = ["01-01", "12-31"]; next_year = current_year; } - var year_start_date = current_year + "-" + fy[0]; + let year_start_date = current_year + "-" + fy[0]; if (year_start_date > frappe.datetime.get_today()) { next_year = current_year; current_year -= 1; @@ -171,7 +102,7 @@ erpnext.setup.slides_settings = [ load_chart_of_accounts: function (slide) { - var country = frappe.wizard.values.country; + let country = frappe.wizard.values.country; if (country) { frappe.call({ @@ -202,12 +133,25 @@ erpnext.setup.slides_settings = [ me.charts_modal(slide, chart_template); }); + + slide.get_input("company_name").on("change", function () { + let parts = slide.get_input("company_name").val().split(" "); + let abbr = $.map(parts, function (p) { return p ? p.substr(0, 1) : null }).join(""); + slide.get_field("company_abbr").set_value(abbr.slice(0, 10).toUpperCase()); + }).val(frappe.boot.sysdefaults.company_name || "").trigger("change"); + + slide.get_input("company_abbr").on("change", function () { + if (slide.get_input("company_abbr").val().length > 10) { + frappe.msgprint(__("Company Abbreviation cannot have more than 5 characters")); + slide.get_field("company_abbr").set_value(""); + } + }); }, charts_modal: function(slide, chart_template) { let parent = __('All Accounts'); - var dialog = new frappe.ui.Dialog({ + let dialog = new frappe.ui.Dialog({ title: chart_template, fields: [ {'fieldname': 'expand_all', 'label': __('Expand All'), 'fieldtype': 'Button', diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index d37b7bb43b..51dcd64d9d 100755 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -491,7 +491,20 @@ erpnext.utils.update_child_items = function(opts) { const child_meta = frappe.get_meta(`${frm.doc.doctype} Item`); const get_precision = (fieldname) => child_meta.fields.find(f => f.fieldname == fieldname).precision; - this.data = []; + this.data = frm.doc[opts.child_docname].map((d) => { + return { + "docname": d.name, + "name": d.name, + "item_code": d.item_code, + "delivery_date": d.delivery_date, + "schedule_date": d.schedule_date, + "conversion_factor": d.conversion_factor, + "qty": d.qty, + "rate": d.rate, + "uom": d.uom + } + }); + const fields = [{ fieldtype:'Data', fieldname:"docname", @@ -588,7 +601,7 @@ erpnext.utils.update_child_items = function(opts) { }) } - const dialog = new frappe.ui.Dialog({ + new frappe.ui.Dialog({ title: __("Update Items"), fields: [ { @@ -624,24 +637,7 @@ erpnext.utils.update_child_items = function(opts) { refresh_field("items"); }, primary_action_label: __('Update') - }); - - frm.doc[opts.child_docname].forEach(d => { - dialog.fields_dict.trans_items.df.data.push({ - "docname": d.name, - "name": d.name, - "item_code": d.item_code, - "delivery_date": d.delivery_date, - "schedule_date": d.schedule_date, - "conversion_factor": d.conversion_factor, - "qty": d.qty, - "rate": d.rate, - "uom": d.uom - }); - this.data = dialog.fields_dict.trans_items.df.data; - dialog.fields_dict.trans_items.grid.refresh(); - }) - dialog.show(); + }).show(); } erpnext.utils.map_current_doc = function(opts) { diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index accf5f22a6..ca6a51a6f3 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -26,7 +26,7 @@ from erpnext.manufacturing.doctype.production_plan.production_plan import ( from erpnext.selling.doctype.customer.customer import check_credit_limit from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.stock.doctype.item.item import get_item_defaults -from erpnext.stock.get_item_details import get_default_bom +from erpnext.stock.get_item_details import get_default_bom, get_price_list_rate from erpnext.stock.stock_balance import get_reserved_qty, update_bin_qty form_grid_templates = {"items": "templates/form_grid/item_grid.html"} @@ -590,6 +590,23 @@ def make_material_request(source_name, target_doc=None): target.qty = qty - requested_item_qty.get(source.name, 0) target.stock_qty = flt(target.qty) * flt(target.conversion_factor) + args = target.as_dict().copy() + args.update( + { + "company": source_parent.get("company"), + "price_list": frappe.db.get_single_value("Buying Settings", "buying_price_list"), + "currency": source_parent.get("currency"), + "conversion_rate": source_parent.get("conversion_rate"), + } + ) + + target.rate = flt( + get_price_list_rate(args=args, item_doc=frappe.get_cached_doc("Item", target.item_code)).get( + "price_list_rate" + ) + ) + target.amount = target.qty * target.rate + doc = get_mapped_doc( "Sales Order", source_name, 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 999ddc23f0..158ac1d049 100644 --- a/erpnext/selling/page/point_of_sale/point_of_sale.py +++ b/erpnext/selling/page/point_of_sale/point_of_sale.py @@ -17,45 +17,79 @@ from erpnext.stock.utils import scan_barcode def search_by_term(search_term, warehouse, price_list): result = search_for_serial_or_batch_or_barcode_number(search_term) or {} - item_code = result.get("item_code") or search_term - serial_no = result.get("serial_no") or "" - batch_no = result.get("batch_no") or "" - barcode = result.get("barcode") or "" + item_code = result.get("item_code", search_term) + serial_no = result.get("serial_no", "") + batch_no = result.get("batch_no", "") + barcode = result.get("barcode", "") - if result: - item_info = frappe.db.get_value( - "Item", - item_code, - [ - "name as item_code", - "item_name", - "description", - "stock_uom", - "image as item_image", - "is_stock_item", - ], - as_dict=1, - ) + if not result: + return - item_stock_qty, is_stock_item = get_stock_availability(item_code, warehouse) - price_list_rate, currency = frappe.db.get_value( - "Item Price", - {"price_list": price_list, "item_code": item_code}, - ["price_list_rate", "currency"], - ) or [None, None] + item_doc = frappe.get_doc("Item", item_code) - item_info.update( + if not item_doc: + return + + item = { + "barcode": barcode, + "batch_no": batch_no, + "description": item_doc.description, + "is_stock_item": item_doc.is_stock_item, + "item_code": item_doc.name, + "item_image": item_doc.image, + "item_name": item_doc.item_name, + "serial_no": serial_no, + "stock_uom": item_doc.stock_uom, + "uom": item_doc.stock_uom, + } + + if barcode: + barcode_info = next(filter(lambda x: x.barcode == barcode, item_doc.get("barcodes", [])), None) + if barcode_info and barcode_info.uom: + uom = next(filter(lambda x: x.uom == barcode_info.uom, item_doc.uoms), {}) + item.update( + { + "uom": barcode_info.uom, + "conversion_factor": uom.get("conversion_factor", 1), + } + ) + + item_stock_qty, is_stock_item = get_stock_availability(item_code, warehouse) + item_stock_qty = item_stock_qty // item.get("conversion_factor") + item.update({"actual_qty": item_stock_qty}) + + price = frappe.get_list( + doctype="Item Price", + filters={ + "price_list": price_list, + "item_code": item_code, + }, + fields=["uom", "stock_uom", "currency", "price_list_rate"], + ) + + def __sort(p): + p_uom = p.get("uom") + + if p_uom == item.get("uom"): + return 0 + elif p_uom == item.get("stock_uom"): + return 1 + else: + return 2 + + # sort by fallback preference. always pick exact uom match if available + price = sorted(price, key=__sort) + + if len(price) > 0: + p = price.pop(0) + item.update( { - "serial_no": serial_no, - "batch_no": batch_no, - "barcode": barcode, - "price_list_rate": price_list_rate, - "currency": currency, - "actual_qty": item_stock_qty, + "currency": p.get("currency"), + "price_list_rate": p.get("price_list_rate"), } ) - return {"items": [item_info]} + return {"items": [item]} @frappe.whitelist() @@ -121,33 +155,43 @@ def get_items(start, page_length, price_list, item_group, pos_profile, search_te as_dict=1, ) - if items_data: - items = [d.item_code for d in items_data] - item_prices_data = frappe.get_all( + # return (empty) list if there are no results + if not items_data: + return result + + for item in items_data: + uoms = frappe.get_doc("Item", item.item_code).get("uoms", []) + + item.actual_qty, _ = get_stock_availability(item.item_code, warehouse) + item.uom = item.stock_uom + + item_price = frappe.get_all( "Item Price", - fields=["item_code", "price_list_rate", "currency"], - filters={"price_list": price_list, "item_code": ["in", items]}, + fields=["price_list_rate", "currency", "uom"], + filters={ + "price_list": price_list, + "item_code": item.item_code, + "selling": True, + }, ) - item_prices = {} - for d in item_prices_data: - item_prices[d.item_code] = d + if not item_price: + result.append(item) - for item in items_data: - item_code = item.item_code - item_price = item_prices.get(item_code) or {} - item_stock_qty, is_stock_item = get_stock_availability(item_code, warehouse) + for price in item_price: + uom = next(filter(lambda x: x.uom == price.uom, uoms), {}) - row = {} - row.update(item) - row.update( + if price.uom != item.stock_uom and uom and uom.conversion_factor: + item.actual_qty = item.actual_qty // uom.conversion_factor + + result.append( { - "price_list_rate": item_price.get("price_list_rate"), - "currency": item_price.get("currency"), - "actual_qty": item_stock_qty, + **item, + "price_list_rate": price.get("price_list_rate"), + "currency": price.get("currency"), + "uom": price.uom or item.uom, } ) - result.append(row) return {"items": result} diff --git a/erpnext/selling/page/point_of_sale/pos_controller.js b/erpnext/selling/page/point_of_sale/pos_controller.js index 595b9196e8..c442774d0f 100644 --- a/erpnext/selling/page/point_of_sale/pos_controller.js +++ b/erpnext/selling/page/point_of_sale/pos_controller.js @@ -542,12 +542,12 @@ erpnext.PointOfSale.Controller = class { if (!this.frm.doc.customer) return this.raise_customer_selection_alert(); - const { item_code, batch_no, serial_no, rate } = item; + const { item_code, batch_no, serial_no, rate, uom } = item; if (!item_code) return; - const new_item = { item_code, batch_no, rate, [field]: value }; + const new_item = { item_code, batch_no, rate, uom, [field]: value }; if (serial_no) { await this.check_serial_no_availablilty(item_code, this.frm.doc.set_warehouse, serial_no); @@ -649,6 +649,7 @@ erpnext.PointOfSale.Controller = class { const is_stock_item = resp[1]; frappe.dom.unfreeze(); + const bold_uom = item_row.stock_uom.bold(); const bold_item_code = item_row.item_code.bold(); const bold_warehouse = warehouse.bold(); const bold_available_qty = available_qty.toString().bold() @@ -664,7 +665,7 @@ erpnext.PointOfSale.Controller = class { } } else if (is_stock_item && available_qty < qty_needed) { frappe.throw({ - message: __('Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2}.', [bold_item_code, bold_warehouse, bold_available_qty]), + message: __('Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2} {3}.', [bold_item_code, bold_warehouse, bold_available_qty, bold_uom]), indicator: 'orange' }); frappe.utils.play_sound("error"); diff --git a/erpnext/selling/page/point_of_sale/pos_item_cart.js b/erpnext/selling/page/point_of_sale/pos_item_cart.js index e7dd211c0f..12cc629776 100644 --- a/erpnext/selling/page/point_of_sale/pos_item_cart.js +++ b/erpnext/selling/page/point_of_sale/pos_item_cart.js @@ -609,7 +609,7 @@ erpnext.PointOfSale.ItemCart = class { if (item_data.rate && item_data.amount && item_data.rate !== item_data.amount) { return `
-
${item_data.qty || 0}
+
${item_data.qty || 0} ${item_data.uom}
${format_currency(item_data.amount, currency)}
${format_currency(item_data.rate, currency)}
@@ -618,7 +618,7 @@ erpnext.PointOfSale.ItemCart = class { } else { return `
-
${item_data.qty || 0}
+
${item_data.qty || 0} ${item_data.uom}
${format_currency(item_data.rate, currency)}
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 b5eb0489f9..ec67bdfd9d 100644 --- a/erpnext/selling/page/point_of_sale/pos_item_selector.js +++ b/erpnext/selling/page/point_of_sale/pos_item_selector.js @@ -78,7 +78,7 @@ erpnext.PointOfSale.ItemSelector = class { get_item_html(item) { const me = this; // eslint-disable-next-line no-unused-vars - const { item_image, serial_no, batch_no, barcode, actual_qty, stock_uom, price_list_rate } = item; + const { item_image, serial_no, batch_no, barcode, actual_qty, uom, price_list_rate } = item; const precision = flt(price_list_rate, 2) % 1 != 0 ? 2 : 0; let indicator_color; let qty_to_display = actual_qty; @@ -118,7 +118,7 @@ erpnext.PointOfSale.ItemSelector = class { return ( `
@@ -128,7 +128,7 @@ erpnext.PointOfSale.ItemSelector = class {
${frappe.ellipsis(item.item_name, 18)}
-
${format_currency(price_list_rate, item.currency, precision) || 0}
+
${format_currency(price_list_rate, item.currency, precision) || 0} / ${uom}
` ); diff --git a/erpnext/selling/page/point_of_sale/pos_past_order_summary.js b/erpnext/selling/page/point_of_sale/pos_past_order_summary.js index 40165c3484..be75bd64cf 100644 --- a/erpnext/selling/page/point_of_sale/pos_past_order_summary.js +++ b/erpnext/selling/page/point_of_sale/pos_past_order_summary.js @@ -94,7 +94,7 @@ erpnext.PointOfSale.PastOrderSummary = class { get_item_html(doc, item_data) { return `
${item_data.item_name}
-
${item_data.qty || 0}
+
${item_data.qty || 0} ${item_data.uom}
${get_rate_discount_html()}
`; diff --git a/erpnext/setup/setup_wizard/operations/company_setup.py b/erpnext/setup/setup_wizard/operations/company_setup.py index aadc98989f..ace5cca0b0 100644 --- a/erpnext/setup/setup_wizard/operations/company_setup.py +++ b/erpnext/setup/setup_wizard/operations/company_setup.py @@ -4,7 +4,6 @@ import frappe from frappe import _ from frappe.utils import cstr, getdate -from .default_website import website_maker def create_fiscal_year_and_company(args): @@ -48,83 +47,6 @@ def enable_shopping_cart(args): # nosemgrep ).insert() -def create_email_digest(): - from frappe.utils.user import get_system_managers - - system_managers = get_system_managers(only_name=True) - - if not system_managers: - return - - recipients = [] - for d in system_managers: - recipients.append({"recipient": d}) - - companies = frappe.db.sql_list("select name FROM `tabCompany`") - for company in companies: - if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company): - edigest = frappe.get_doc( - { - "doctype": "Email Digest", - "name": "Default Weekly Digest - " + company, - "company": company, - "frequency": "Weekly", - "recipients": recipients, - } - ) - - for df in edigest.meta.get("fields", {"fieldtype": "Check"}): - if df.fieldname != "scheduler_errors": - edigest.set(df.fieldname, 1) - - edigest.insert() - - # scheduler errors digest - if companies: - edigest = frappe.new_doc("Email Digest") - edigest.update( - { - "name": "Scheduler Errors", - "company": companies[0], - "frequency": "Daily", - "recipients": recipients, - "scheduler_errors": 1, - "enabled": 1, - } - ) - edigest.insert() - - -def create_logo(args): - if args.get("attach_logo"): - attach_logo = args.get("attach_logo").split(",") - if len(attach_logo) == 3: - filename, filetype, content = attach_logo - _file = frappe.get_doc( - { - "doctype": "File", - "file_name": filename, - "attached_to_doctype": "Website Settings", - "attached_to_name": "Website Settings", - "decode": True, - } - ) - _file.save() - fileurl = _file.file_url - frappe.db.set_value( - "Website Settings", - "Website Settings", - "brand_html", - " {1}".format( - fileurl, args.get("company_name") - ), - ) - - -def create_website(args): - website_maker(args) - - def get_fy_details(fy_start_date, fy_end_date): start_year = getdate(fy_start_date).year if start_year == getdate(fy_end_date).year: diff --git a/erpnext/setup/setup_wizard/operations/default_website.py b/erpnext/setup/setup_wizard/operations/default_website.py deleted file mode 100644 index 40b02b35df..0000000000 --- a/erpnext/setup/setup_wizard/operations/default_website.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - - -import frappe -from frappe import _ -from frappe.utils import nowdate - - -class website_maker(object): - def __init__(self, args): - self.args = args - self.company = args.company_name - self.tagline = args.company_tagline - self.user = args.get("email") - self.make_web_page() - self.make_website_settings() - self.make_blog() - - def make_web_page(self): - # home page - homepage = frappe.get_doc("Homepage", "Homepage") - homepage.company = self.company - homepage.tag_line = self.tagline - homepage.setup_items() - homepage.save() - - def make_website_settings(self): - # update in home page in settings - website_settings = frappe.get_doc("Website Settings", "Website Settings") - website_settings.home_page = "home" - website_settings.brand_html = self.company - website_settings.copyright = self.company - website_settings.top_bar_items = [] - website_settings.append( - "top_bar_items", {"doctype": "Top Bar Item", "label": "Contact", "url": "/contact"} - ) - website_settings.append( - "top_bar_items", {"doctype": "Top Bar Item", "label": "Blog", "url": "/blog"} - ) - website_settings.append( - "top_bar_items", {"doctype": "Top Bar Item", "label": _("Products"), "url": "/all-products"} - ) - website_settings.save() - - def make_blog(self): - blog_category = frappe.get_doc( - {"doctype": "Blog Category", "category_name": "general", "published": 1, "title": _("General")} - ).insert() - - if not self.user: - # Admin setup - return - - blogger = frappe.new_doc("Blogger") - user = frappe.get_doc("User", self.user) - blogger.user = self.user - blogger.full_name = user.first_name + (" " + user.last_name if user.last_name else "") - blogger.short_name = user.first_name.lower() - blogger.avatar = user.user_image - blogger.insert() - - frappe.get_doc( - { - "doctype": "Blog Post", - "title": "Welcome", - "published": 1, - "published_on": nowdate(), - "blogger": blogger.name, - "blog_category": blog_category.name, - "blog_intro": "My First Blog", - "content": frappe.get_template("setup/setup_wizard/data/sample_blog_post.html").render(), - } - ).insert() - - -def test(): - frappe.delete_doc("Web Page", "test-company") - frappe.delete_doc("Blog Post", "welcome") - frappe.delete_doc("Blogger", "administrator") - frappe.delete_doc("Blog Category", "general") - website_maker( - { - "company": "Test Company", - "company_tagline": "Better Tools for Everyone", - "name": "Administrator", - } - ) - frappe.db.commit() diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py index bd86a5b969..65b268e385 100644 --- a/erpnext/setup/setup_wizard/setup_wizard.py +++ b/erpnext/setup/setup_wizard/setup_wizard.py @@ -5,7 +5,6 @@ import frappe from frappe import _ -from .operations import company_setup from .operations import install_fixtures as fixtures @@ -35,7 +34,6 @@ def get_setup_stages(args=None): "fail_msg": "Failed to set defaults", "tasks": [ {"fn": setup_defaults, "args": args, "fail_msg": _("Failed to setup defaults")}, - {"fn": stage_four, "args": args, "fail_msg": _("Failed to create website")}, ], }, { @@ -60,12 +58,6 @@ def setup_defaults(args): fixtures.install_defaults(frappe._dict(args)) -def stage_four(args): - company_setup.create_website(args) - company_setup.create_email_digest() - company_setup.create_logo(args) - - def fin(args): frappe.local.message_log = [] login_as_first_user(args) @@ -81,5 +73,4 @@ def setup_complete(args=None): stage_fixtures(args) setup_company(args) setup_defaults(args) - stage_four(args) fin(args) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index e61f0f514e..5bcb05aa98 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -894,6 +894,12 @@ function open_form(frm, doctype, child_doctype, parentfield) { new_child_doc.uom = frm.doc.stock_uom; new_child_doc.description = frm.doc.description; - frappe.ui.form.make_quick_entry(doctype, null, null, new_doc); + frappe.run_serially([ + () => frappe.ui.form.make_quick_entry(doctype, null, null, new_doc), + () => { + frappe.flags.ignore_company_party_validation = true; + frappe.model.trigger("item_code", frm.doc.name, new_child_doc); + } + ]) }); } diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py index 9321c2c166..2a9f091bd0 100644 --- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py +++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py @@ -221,7 +221,7 @@ class QualityInspection(Document): def item_query(doctype, txt, searchfield, start, page_len, filters): from frappe.desk.reportview import get_match_cond - from_doctype = cstr(filters.get("doctype")) + from_doctype = cstr(filters.get("from")) if not from_doctype or not frappe.db.exists("DocType", from_doctype): return [] diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 897fca3978..fb1f77ad3b 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -169,6 +169,8 @@ frappe.ui.form.on('Stock Entry', { }, refresh: function(frm) { + frm.trigger("get_items_from_transit_entry"); + if(!frm.doc.docstatus) { frm.trigger('validate_purpose_consumption'); frm.add_custom_button(__('Material Request'), function() { @@ -337,6 +339,28 @@ frappe.ui.form.on('Stock Entry', { } }, + get_items_from_transit_entry: function(frm) { + if (frm.doc.docstatus===0) { + frm.add_custom_button(__('Transit Entry'), function() { + erpnext.utils.map_current_doc({ + method: "erpnext.stock.doctype.stock_entry.stock_entry.make_stock_in_entry", + source_doctype: "Stock Entry", + target: frm, + date_field: "posting_date", + setters: { + stock_entry_type: "Material Transfer", + purpose: "Material Transfer", + }, + get_query_filters: { + docstatus: 1, + purpose: "Material Transfer", + add_to_transit: 1, + } + }) + }, __("Get Items From")); + } + }, + before_save: function(frm) { frm.doc.items.forEach((item) => { item.uom = item.uom || item.stock_uom; diff --git a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py index 41a3b8916d..0f9001392d 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry_utils.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry_utils.py @@ -117,6 +117,7 @@ def make_stock_entry(**args): args.item = "_Test Item" s.company = args.company or erpnext.get_default_company() + s.add_to_transit = args.add_to_transit or 0 s.purchase_receipt_no = args.purchase_receipt_no s.delivery_note_no = args.delivery_note_no s.sales_invoice_no = args.sales_invoice_no diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index b574b718fe..38bf0a5f9e 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -17,6 +17,7 @@ from erpnext.stock.doctype.item.test_item import ( from erpnext.stock.doctype.serial_no.serial_no import * # noqa from erpnext.stock.doctype.stock_entry.stock_entry import ( FinishedGoodError, + make_stock_in_entry, move_sample_to_retention_warehouse, ) from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry @@ -160,6 +161,53 @@ class TestStockEntry(FrappeTestCase): self.assertTrue(item_code in items) + def test_add_to_transit_entry(self): + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + item_code = "_Test Transit Item" + company = "_Test Company" + + create_warehouse("Test From Warehouse") + create_warehouse("Test Transit Warehouse") + create_warehouse("Test To Warehouse") + + create_item( + item_code=item_code, + is_stock_item=1, + is_purchase_item=1, + company=company, + ) + + # create inward stock entry + make_stock_entry( + item_code=item_code, + target="Test From Warehouse - _TC", + qty=10, + basic_rate=100, + expense_account="Stock Adjustment - _TC", + cost_center="Main - _TC", + ) + + transit_entry = make_stock_entry( + item_code=item_code, + source="Test From Warehouse - _TC", + target="Test Transit Warehouse - _TC", + add_to_transit=1, + stock_entry_type="Material Transfer", + purpose="Material Transfer", + qty=10, + basic_rate=100, + expense_account="Stock Adjustment - _TC", + cost_center="Main - _TC", + ) + + end_transit_entry = make_stock_in_entry(transit_entry.name) + self.assertEqual(transit_entry.name, end_transit_entry.outgoing_stock_entry) + self.assertEqual(transit_entry.name, end_transit_entry.items[0].against_stock_entry) + self.assertEqual(transit_entry.items[0].name, end_transit_entry.items[0].ste_detail) + + # create add to transit + def test_material_receipt_gl_entry(self): company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company") diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js index aab2fc927d..7ca12642c5 100644 --- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js +++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order_list.js @@ -11,6 +11,7 @@ frappe.listview_settings['Subcontracting Order'] = { "Partial Material Transferred": "purple", "Material Transferred": "blue", "Closed": "red", + "Cancelled": "red", }; return [__(doc.status), status_colors[doc.status], "status,=," + doc.status]; }, diff --git a/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json b/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json index 3675a4ea08..d77e77440e 100644 --- a/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json +++ b/erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json @@ -1,352 +1,353 @@ { - "actions": [], - "autoname": "hash", - "creation": "2022-04-01 19:26:31.475015", - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "item_code", - "item_name", - "bom", - "include_exploded_items", - "column_break_3", - "schedule_date", - "expected_delivery_date", - "description_section", - "description", - "column_break_8", - "image", - "image_view", - "quantity_and_rate_section", - "qty", - "received_qty", - "returned_qty", - "column_break_13", - "stock_uom", - "conversion_factor", - "section_break_16", - "rate", - "amount", - "column_break_19", - "rm_cost_per_qty", - "service_cost_per_qty", - "additional_cost_per_qty", - "warehouse_section", - "warehouse", - "accounting_details_section", - "expense_account", - "manufacture_section", - "manufacturer", - "manufacturer_part_no", - "accounting_dimensions_section", - "cost_center", - "dimension_col_break", - "project", - "section_break_34", - "page_break" - ], - "fields": [ - { - "bold": 1, - "columns": 2, - "fieldname": "item_code", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Item Code", - "options": "Item", - "read_only": 1, - "reqd": 1, - "search_index": 1 - }, - { - "fetch_from": "item_code.item_name", - "fetch_if_empty": 1, - "fieldname": "item_name", - "fieldtype": "Data", - "in_global_search": 1, - "label": "Item Name", - "print_hide": 1, - "reqd": 1 - }, - { - "fieldname": "column_break_3", - "fieldtype": "Column Break" - }, - { - "bold": 1, - "columns": 2, - "fieldname": "schedule_date", - "fieldtype": "Date", - "label": "Required By", - "print_hide": 1, - "read_only": 1 - }, - { - "allow_on_submit": 1, - "bold": 1, - "fieldname": "expected_delivery_date", - "fieldtype": "Date", - "label": "Expected Delivery Date", - "search_index": 1 - }, - { - "collapsible": 1, - "fieldname": "description_section", - "fieldtype": "Section Break", - "label": "Description" - }, - { - "fetch_from": "item_code.description", - "fetch_if_empty": 1, - "fieldname": "description", - "fieldtype": "Text Editor", - "label": "Description", - "print_width": "300px", - "reqd": 1, - "width": "300px" - }, - { - "fieldname": "column_break_8", - "fieldtype": "Column Break" - }, - { - "fieldname": "image", - "fieldtype": "Attach", - "hidden": 1, - "label": "Image" - }, - { - "fieldname": "image_view", - "fieldtype": "Image", - "label": "Image View", - "options": "image", - "print_hide": 1 - }, - { - "fieldname": "quantity_and_rate_section", - "fieldtype": "Section Break", - "label": "Quantity and Rate" - }, - { - "bold": 1, - "columns": 1, - "default": "1", - "fieldname": "qty", - "fieldtype": "Float", - "in_list_view": 1, - "label": "Quantity", - "print_width": "60px", - "read_only": 1, - "reqd": 1, - "width": "60px" - }, - { - "fieldname": "column_break_13", - "fieldtype": "Column Break", - "print_hide": 1 - }, - { - "fieldname": "stock_uom", - "fieldtype": "Link", - "label": "Stock UOM", - "options": "UOM", - "print_width": "100px", - "read_only": 1, - "reqd": 1, - "width": "100px" - }, - { - "default": "1", - "fieldname": "conversion_factor", - "fieldtype": "Float", - "hidden": 1, - "label": "Conversion Factor", - "read_only": 1 - }, - { - "fieldname": "section_break_16", - "fieldtype": "Section Break" - }, - { - "bold": 1, - "columns": 2, - "fetch_from": "item_code.standard_rate", - "fetch_if_empty": 1, - "fieldname": "rate", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Rate", - "options": "currency", - "read_only": 1, - "reqd": 1 - }, - { - "fieldname": "column_break_19", - "fieldtype": "Column Break" - }, - { - "columns": 2, - "fieldname": "amount", - "fieldtype": "Currency", - "in_list_view": 1, - "label": "Amount", - "options": "currency", - "read_only": 1, - "reqd": 1 - }, - { - "fieldname": "warehouse_section", - "fieldtype": "Section Break", - "label": "Warehouse Details" - }, - { - "fieldname": "warehouse", - "fieldtype": "Link", - "label": "Warehouse", - "options": "Warehouse", - "print_hide": 1, - "reqd": 1 - }, - { - "collapsible": 1, - "fieldname": "accounting_details_section", - "fieldtype": "Section Break", - "label": "Accounting Details" - }, - { - "fieldname": "expense_account", - "fieldtype": "Link", - "label": "Expense Account", - "options": "Account", - "print_hide": 1 - }, - { - "collapsible": 1, - "fieldname": "manufacture_section", - "fieldtype": "Section Break", - "label": "Manufacture" - }, - { - "fieldname": "manufacturer", - "fieldtype": "Link", - "label": "Manufacturer", - "options": "Manufacturer" - }, - { - "fieldname": "manufacturer_part_no", - "fieldtype": "Data", - "label": "Manufacturer Part Number" - }, - { - "depends_on": "item_code", - "fetch_from": "item_code.default_bom", - "fieldname": "bom", - "fieldtype": "Link", - "in_list_view": 1, - "label": "BOM", - "options": "BOM", - "print_hide": 1, - "reqd": 1 - }, - { - "default": "0", - "fieldname": "include_exploded_items", - "fieldtype": "Check", - "label": "Include Exploded Items", - "print_hide": 1 - }, - { - "fieldname": "service_cost_per_qty", - "fieldtype": "Currency", - "label": "Service Cost Per Qty", - "read_only": 1, - "reqd": 1 - }, - { - "default": "0", - "fieldname": "additional_cost_per_qty", - "fieldtype": "Currency", - "label": "Additional Cost Per Qty", - "read_only": 1 - }, - { - "fieldname": "rm_cost_per_qty", - "fieldtype": "Currency", - "label": "Raw Material Cost Per Qty", - "no_copy": 1, - "read_only": 1 - }, - { - "allow_on_submit": 1, - "default": "0", - "fieldname": "page_break", - "fieldtype": "Check", - "label": "Page Break", - "no_copy": 1, - "print_hide": 1 - }, - { - "fieldname": "section_break_34", - "fieldtype": "Section Break" - }, - { - "depends_on": "received_qty", - "fieldname": "received_qty", - "fieldtype": "Float", - "label": "Received Qty", - "no_copy": 1, - "print_hide": 1, - "read_only": 1 - }, - { - "depends_on": "returned_qty", - "fieldname": "returned_qty", - "fieldtype": "Float", - "label": "Returned Qty", - "no_copy": 1, - "print_hide": 1, - "read_only": 1 - }, - { - "collapsible": 1, - "fieldname": "accounting_dimensions_section", - "fieldtype": "Section Break", - "label": "Accounting Dimensions" - }, - { - "fieldname": "cost_center", - "fieldtype": "Link", - "label": "Cost Center", - "options": "Cost Center" - }, - { - "fieldname": "dimension_col_break", - "fieldtype": "Column Break" - }, - { - "fieldname": "project", - "fieldtype": "Link", - "label": "Project", - "options": "Project" - } - ], - "idx": 1, - "index_web_pages_for_search": 1, - "istable": 1, - "links": [], - "modified": "2022-08-15 14:25:45.177703", - "modified_by": "Administrator", - "module": "Subcontracting", - "name": "Subcontracting Order Item", - "naming_rule": "Random", - "owner": "Administrator", - "permissions": [], - "quick_entry": 1, - "search_fields": "item_name", - "sort_field": "modified", - "sort_order": "DESC", - "states": [], - "track_changes": 1 + "actions": [], + "autoname": "hash", + "creation": "2022-04-01 19:26:31.475015", + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "item_code", + "item_name", + "bom", + "include_exploded_items", + "column_break_3", + "schedule_date", + "expected_delivery_date", + "description_section", + "description", + "column_break_8", + "image", + "image_view", + "quantity_and_rate_section", + "qty", + "received_qty", + "returned_qty", + "column_break_13", + "stock_uom", + "conversion_factor", + "section_break_16", + "rate", + "amount", + "column_break_19", + "rm_cost_per_qty", + "service_cost_per_qty", + "additional_cost_per_qty", + "warehouse_section", + "warehouse", + "accounting_details_section", + "expense_account", + "manufacture_section", + "manufacturer", + "manufacturer_part_no", + "accounting_dimensions_section", + "cost_center", + "dimension_col_break", + "project", + "section_break_34", + "page_break" + ], + "fields": [ + { + "bold": 1, + "columns": 2, + "fieldname": "item_code", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Item Code", + "options": "Item", + "read_only": 1, + "reqd": 1, + "search_index": 1 + }, + { + "fetch_from": "item_code.item_name", + "fetch_if_empty": 1, + "fieldname": "item_name", + "fieldtype": "Data", + "in_global_search": 1, + "label": "Item Name", + "print_hide": 1, + "reqd": 1 + }, + { + "fieldname": "column_break_3", + "fieldtype": "Column Break" + }, + { + "bold": 1, + "columns": 2, + "fieldname": "schedule_date", + "fieldtype": "Date", + "label": "Required By", + "print_hide": 1, + "read_only": 1 + }, + { + "allow_on_submit": 1, + "bold": 1, + "fieldname": "expected_delivery_date", + "fieldtype": "Date", + "label": "Expected Delivery Date", + "search_index": 1 + }, + { + "collapsible": 1, + "fieldname": "description_section", + "fieldtype": "Section Break", + "label": "Description" + }, + { + "fetch_from": "item_code.description", + "fetch_if_empty": 1, + "fieldname": "description", + "fieldtype": "Text Editor", + "label": "Description", + "print_width": "300px", + "reqd": 1, + "width": "300px" + }, + { + "fieldname": "column_break_8", + "fieldtype": "Column Break" + }, + { + "fieldname": "image", + "fieldtype": "Attach", + "hidden": 1, + "label": "Image" + }, + { + "fieldname": "image_view", + "fieldtype": "Image", + "label": "Image View", + "options": "image", + "print_hide": 1 + }, + { + "fieldname": "quantity_and_rate_section", + "fieldtype": "Section Break", + "label": "Quantity and Rate" + }, + { + "bold": 1, + "columns": 1, + "default": "1", + "fieldname": "qty", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Quantity", + "print_width": "60px", + "read_only": 1, + "reqd": 1, + "width": "60px" + }, + { + "fieldname": "column_break_13", + "fieldtype": "Column Break", + "print_hide": 1 + }, + { + "fieldname": "stock_uom", + "fieldtype": "Link", + "label": "Stock UOM", + "options": "UOM", + "print_width": "100px", + "read_only": 1, + "reqd": 1, + "width": "100px" + }, + { + "default": "1", + "fieldname": "conversion_factor", + "fieldtype": "Float", + "hidden": 1, + "label": "Conversion Factor", + "read_only": 1 + }, + { + "fieldname": "section_break_16", + "fieldtype": "Section Break" + }, + { + "bold": 1, + "columns": 2, + "fetch_from": "item_code.standard_rate", + "fetch_if_empty": 1, + "fieldname": "rate", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Rate", + "options": "currency", + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "column_break_19", + "fieldtype": "Column Break" + }, + { + "columns": 2, + "fieldname": "amount", + "fieldtype": "Currency", + "in_list_view": 1, + "label": "Amount", + "options": "currency", + "read_only": 1, + "reqd": 1 + }, + { + "fieldname": "warehouse_section", + "fieldtype": "Section Break", + "label": "Warehouse Details" + }, + { + "fieldname": "warehouse", + "fieldtype": "Link", + "label": "Warehouse", + "options": "Warehouse", + "print_hide": 1, + "reqd": 1 + }, + { + "collapsible": 1, + "fieldname": "accounting_details_section", + "fieldtype": "Section Break", + "label": "Accounting Details" + }, + { + "fieldname": "expense_account", + "fieldtype": "Link", + "label": "Expense Account", + "options": "Account", + "print_hide": 1 + }, + { + "collapsible": 1, + "fieldname": "manufacture_section", + "fieldtype": "Section Break", + "label": "Manufacture" + }, + { + "fieldname": "manufacturer", + "fieldtype": "Link", + "label": "Manufacturer", + "options": "Manufacturer" + }, + { + "fieldname": "manufacturer_part_no", + "fieldtype": "Data", + "label": "Manufacturer Part Number" + }, + { + "depends_on": "item_code", + "fetch_from": "item_code.default_bom", + "fetch_if_empty": 1, + "fieldname": "bom", + "fieldtype": "Link", + "in_list_view": 1, + "label": "BOM", + "options": "BOM", + "print_hide": 1, + "reqd": 1 + }, + { + "default": "0", + "fieldname": "include_exploded_items", + "fieldtype": "Check", + "label": "Include Exploded Items", + "print_hide": 1 + }, + { + "fieldname": "service_cost_per_qty", + "fieldtype": "Currency", + "label": "Service Cost Per Qty", + "read_only": 1, + "reqd": 1 + }, + { + "default": "0", + "fieldname": "additional_cost_per_qty", + "fieldtype": "Currency", + "label": "Additional Cost Per Qty", + "read_only": 1 + }, + { + "fieldname": "rm_cost_per_qty", + "fieldtype": "Currency", + "label": "Raw Material Cost Per Qty", + "no_copy": 1, + "read_only": 1 + }, + { + "allow_on_submit": 1, + "default": "0", + "fieldname": "page_break", + "fieldtype": "Check", + "label": "Page Break", + "no_copy": 1, + "print_hide": 1 + }, + { + "fieldname": "section_break_34", + "fieldtype": "Section Break" + }, + { + "depends_on": "received_qty", + "fieldname": "received_qty", + "fieldtype": "Float", + "label": "Received Qty", + "no_copy": 1, + "print_hide": 1, + "read_only": 1 + }, + { + "depends_on": "returned_qty", + "fieldname": "returned_qty", + "fieldtype": "Float", + "label": "Returned Qty", + "no_copy": 1, + "print_hide": 1, + "read_only": 1 + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Cost Center" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" + }, + { + "fieldname": "project", + "fieldtype": "Link", + "label": "Project", + "options": "Project" + } + ], + "idx": 1, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2023-01-20 23:25:45.363281", + "modified_by": "Administrator", + "module": "Subcontracting", + "name": "Subcontracting Order Item", + "naming_rule": "Random", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "search_fields": "item_name", + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py index e1e12bd60d..185ec6615f 100644 --- a/erpnext/templates/pages/order.py +++ b/erpnext/templates/pages/order.py @@ -38,22 +38,27 @@ def get_context(context): if not frappe.has_website_permission(context.doc): frappe.throw(_("Not Permitted"), frappe.PermissionError) - # check for the loyalty program of the customer - customer_loyalty_program = frappe.db.get_value( - "Customer", context.doc.customer, "loyalty_program" - ) - if customer_loyalty_program: - from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( - get_loyalty_program_details_with_points, + context.available_loyalty_points = 0.0 + if context.doc.get("customer"): + # check for the loyalty program of the customer + customer_loyalty_program = frappe.db.get_value( + "Customer", context.doc.customer, "loyalty_program" ) - loyalty_program_details = get_loyalty_program_details_with_points( - context.doc.customer, customer_loyalty_program - ) - context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points")) + if customer_loyalty_program: + from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( + get_loyalty_program_details_with_points, + ) - # show Make Purchase Invoice button based on permission - context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create") + loyalty_program_details = get_loyalty_program_details_with_points( + context.doc.customer, customer_loyalty_program + ) + context.available_loyalty_points = int(loyalty_program_details.get("loyalty_points")) + + context.show_make_pi_button = False + if context.doc.get("supplier"): + # show Make Purchase Invoice button based on permission + context.show_make_pi_button = frappe.has_permission("Purchase Invoice", "create") def get_attachments(dt, dn): diff --git a/erpnext/translations/af.csv b/erpnext/translations/af.csv index 45435d8600..265e85c0f1 100644 --- a/erpnext/translations/af.csv +++ b/erpnext/translations/af.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kwaliteit-terugvoersjabloon, Rules for applying different promotional schemes.,Reëls vir die toepassing van verskillende promosieskemas., Shift,verskuiwing, Show {0},Wys {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Spesiale karakters behalwe "-", "#", ".", "/", "{" En "}" word nie toegelaat in die naamreekse nie", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Spesiale karakters behalwe "-", "#", ".", "/", "{{" En "}}" word nie toegelaat in die naamreekse nie {0}", Target Details,Teikenbesonderhede, {0} already has a Parent Procedure {1}.,{0} het reeds 'n ouerprosedure {1}., API,API, diff --git a/erpnext/translations/am.csv b/erpnext/translations/am.csv index 554b0a54f1..d131404821 100644 --- a/erpnext/translations/am.csv +++ b/erpnext/translations/am.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,የጥራት ግብረ መልስ አብነት።, Rules for applying different promotional schemes.,የተለያዩ የማስተዋወቂያ ዘዴዎችን ለመተግበር ህጎች።, Shift,ቀይር, Show {0},አሳይ {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",ከ "-" ፣ "#" ፣ "፣" ፣ "/" ፣ "{" እና "}" በስተቀር ልዩ ቁምፊዎች ከመለያ መሰየሚያ አይፈቀድም, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",ከ "-" ፣ "#" ፣ "፣" ፣ "/" ፣ "{{" እና "}}" በስተቀር ልዩ ቁምፊዎች ከመለያ መሰየሚያ አይፈቀድም {0}, Target Details,የ Detailsላማ ዝርዝሮች።, {0} already has a Parent Procedure {1}.,{0} ቀድሞውኑ የወላጅ አሰራር ሂደት አለው {1}።, API,ኤ ፒ አይ, diff --git a/erpnext/translations/ar.csv b/erpnext/translations/ar.csv index e62f61a4f5..c0da1c4d76 100644 --- a/erpnext/translations/ar.csv +++ b/erpnext/translations/ar.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,قالب ملاحظات الجودة, Rules for applying different promotional schemes.,قواعد تطبيق المخططات الترويجية المختلفة., Shift,تحول, Show {0},عرض {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",الأحرف الخاصة باستثناء "-" ، "#" ، "." ، "/" ، "{" و "}" غير مسموح في سلسلة التسمية, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} الأحرف الخاصة باستثناء "-" ، "#" ، "." ، "/" ، "{{" و "}}" غير مسموح في سلسلة التسمية, Target Details,تفاصيل الهدف, {0} already has a Parent Procedure {1}.,{0} يحتوي بالفعل على إجراء الأصل {1}., API,API, diff --git a/erpnext/translations/bg.csv b/erpnext/translations/bg.csv index 15278a6a40..ac6dc7851b 100644 --- a/erpnext/translations/bg.csv +++ b/erpnext/translations/bg.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Качествен обратен шаблон, Rules for applying different promotional schemes.,Правила за прилагане на различни промоционални схеми., Shift,изместване, Show {0},Показване на {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Специални символи, с изключение на "-", "#", ".", "/", "{" И "}" не са позволени в именуването на серии", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Специални символи, с изключение на "-", "#", ".", "/", "{{" И "}}" не са позволени в именуването на серии {0}", Target Details,Детайли за целта, {0} already has a Parent Procedure {1}.,{0} вече има родителска процедура {1}., API,API, diff --git a/erpnext/translations/bn.csv b/erpnext/translations/bn.csv index cf0971667b..52f7b1c593 100644 --- a/erpnext/translations/bn.csv +++ b/erpnext/translations/bn.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,গুণমান প্রতিক্রিয় Rules for applying different promotional schemes.,বিভিন্ন প্রচারমূলক স্কিম প্রয়োগ করার নিয়ম।, Shift,পরিবর্তন, Show {0},{0} দেখান, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","নামকরণ সিরিজে "-", "#", "।", "/", "{" এবং "}" ব্যতীত বিশেষ অক্ষর অনুমোদিত নয়", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","নামকরণ সিরিজে "-", "#", "।", "/", "{{" এবং "}}" ব্যতীত বিশেষ অক্ষর অনুমোদিত নয় {0}", Target Details,টার্গেটের বিশদ, {0} already has a Parent Procedure {1}.,{0} ইতিমধ্যে একটি মূল পদ্ধতি আছে {1}।, API,এপিআই, diff --git a/erpnext/translations/bs.csv b/erpnext/translations/bs.csv index 6ef445a1af..267434f480 100644 --- a/erpnext/translations/bs.csv +++ b/erpnext/translations/bs.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Predložak kvalitetne povratne informacije, Rules for applying different promotional schemes.,Pravila za primjenu različitih promotivnih shema., Shift,Shift, Show {0},Prikaži {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znakovi osim "-", "#", ".", "/", "{" I "}" nisu dozvoljeni u imenovanju serija", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znakovi osim "-", "#", ".", "/", "{{" I "}}" nisu dozvoljeni u imenovanju serija {0}", Target Details,Detalji cilja, {0} already has a Parent Procedure {1}.,{0} već ima roditeljsku proceduru {1}., API,API, diff --git a/erpnext/translations/ca.csv b/erpnext/translations/ca.csv index 18fa52a2b7..d8c2ef68e6 100644 --- a/erpnext/translations/ca.csv +++ b/erpnext/translations/ca.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Plantilla de comentaris de qualitat, Rules for applying different promotional schemes.,Normes per aplicar diferents règims promocionals., Shift,Majúscules, Show {0},Mostra {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caràcters especials, excepte "-", "#", ".", "/", "{" I "}" no estan permesos en nomenar sèries", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caràcters especials, excepte "-", "#", ".", "/", "{{" I "}}" no estan permesos en nomenar sèries {0}", Target Details,Detalls de l'objectiu, {0} already has a Parent Procedure {1}.,{0} ja té un procediment progenitor {1}., API,API, diff --git a/erpnext/translations/cs.csv b/erpnext/translations/cs.csv index 705e471d27..7d570bbdd0 100644 --- a/erpnext/translations/cs.csv +++ b/erpnext/translations/cs.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Šablona zpětné vazby kvality, Rules for applying different promotional schemes.,Pravidla pro uplatňování různých propagačních programů., Shift,Posun, Show {0},Zobrazit {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Zvláštní znaky kromě "-", "#", ".", "/", "{" A "}" nejsou v názvových řadách povoleny", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Zvláštní znaky kromě "-", "#", ".", "/", "{{" A "}}" nejsou v názvových řadách povoleny {0}", Target Details,Podrobnosti o cíli, {0} already has a Parent Procedure {1}.,{0} již má rodičovský postup {1}., API,API, diff --git a/erpnext/translations/da.csv b/erpnext/translations/da.csv index c0d0146694..16b2e878e0 100644 --- a/erpnext/translations/da.csv +++ b/erpnext/translations/da.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitetsfeedback-skabelon, Rules for applying different promotional schemes.,Regler for anvendelse af forskellige salgsfremmende ordninger., Shift,Flytte, Show {0},Vis {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialtegn undtagen "-", "#", ".", "/", "{" Og "}" er ikke tilladt i navngivningsserier", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialtegn undtagen "-", "#", ".", "/", "{{" Og "}}" er ikke tilladt i navngivningsserier {0}", Target Details,Måldetaljer, {0} already has a Parent Procedure {1}.,{0} har allerede en overordnet procedure {1}., API,API, diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv index 1014e27d6c..5a0a863a47 100644 --- a/erpnext/translations/de.csv +++ b/erpnext/translations/de.csv @@ -3546,7 +3546,7 @@ Quality Feedback Template,Qualitäts-Feedback-Vorlage, Rules for applying different promotional schemes.,Regeln für die Anwendung verschiedener Werbemaßnahmen., Shift,Verschiebung, Show {0},{0} anzeigen, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Sonderzeichen außer "-", "#", ".", "/", "{" Und "}" sind bei der Benennung von Serien nicht zulässig", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Sonderzeichen außer "-", "#", ".", "/", "{{" Und "}}" sind bei der Benennung von Serien nicht zulässig {0}", Target Details,Zieldetails, {0} already has a Parent Procedure {1}.,{0} hat bereits eine übergeordnete Prozedur {1}., API,API, diff --git a/erpnext/translations/el.csv b/erpnext/translations/el.csv index acf5db5d46..06b80603e6 100644 --- a/erpnext/translations/el.csv +++ b/erpnext/translations/el.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Πρότυπο σχολιασμού ποιότητας Rules for applying different promotional schemes.,Κανόνες εφαρμογής διαφορετικών προγραμμάτων προώθησης., Shift,Βάρδια, Show {0},Εμφάνιση {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Ειδικοί χαρακτήρες εκτός από "-", "#", ".", "/", "" Και "}" δεν επιτρέπονται στη σειρά ονομασίας", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Ειδικοί χαρακτήρες εκτός από "-", "#", ".", "/", "{" Και "}}" δεν επιτρέπονται στη σειρά ονομασίας {0}", Target Details,Στοιχεία στόχου, {0} already has a Parent Procedure {1}.,{0} έχει ήδη μια διαδικασία γονέα {1}., API,API, diff --git a/erpnext/translations/es.csv b/erpnext/translations/es.csv index 0f2259db21..b216b868bb 100644 --- a/erpnext/translations/es.csv +++ b/erpnext/translations/es.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Plantilla de comentarios de calidad, Rules for applying different promotional schemes.,Reglas para aplicar diferentes esquemas promocionales., Shift,Cambio, Show {0},Mostrar {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiales excepto "-", "#", ".", "/", "{" Y "}" no están permitidos en las series de nombres", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiales excepto "-", "#", ".", "/", "{{" Y "}}" no están permitidos en las series de nombres {0}", Target Details,Detalles del objetivo, {0} already has a Parent Procedure {1}.,{0} ya tiene un Procedimiento principal {1}., API,API, diff --git a/erpnext/translations/et.csv b/erpnext/translations/et.csv index ba32187c68..5d67d81b79 100644 --- a/erpnext/translations/et.csv +++ b/erpnext/translations/et.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvaliteetse tagasiside mall, Rules for applying different promotional schemes.,Erinevate reklaamiskeemide rakenduseeskirjad., Shift,Vahetus, Show {0},Kuva {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Erimärgid, välja arvatud "-", "#", ".", "/", "{" Ja "}" pole sarjade nimetamisel lubatud", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Erimärgid, välja arvatud "-", "#", ".", "/", "{{" Ja "}}" pole sarjade nimetamisel lubatud {0}", Target Details,Sihtkoha üksikasjad, {0} already has a Parent Procedure {1}.,{0} juba on vanemamenetlus {1}., API,API, diff --git a/erpnext/translations/fa.csv b/erpnext/translations/fa.csv index 4a7c979499..040034d09e 100644 --- a/erpnext/translations/fa.csv +++ b/erpnext/translations/fa.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,الگوی بازخورد کیفیت, Rules for applying different promotional schemes.,قوانین استفاده از طرح های تبلیغاتی مختلف., Shift,تغییر مکان, Show {0},نمایش {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",کاراکترهای خاص به جز "-" ، "#" ، "." ، "/" ، "{" و "}" در سریال نامگذاری مجاز نیستند, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} کاراکترهای خاص به جز "-" ، "#" ، "." ، "/" ، "{{" و "}}" در سریال نامگذاری مجاز نیستند, Target Details,جزئیات هدف, {0} already has a Parent Procedure {1}.,{0} در حال حاضر یک روش والدین {1} دارد., API,API, diff --git a/erpnext/translations/fi.csv b/erpnext/translations/fi.csv index 29eb56702d..27ea3b8dd4 100644 --- a/erpnext/translations/fi.csv +++ b/erpnext/translations/fi.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Laadun palautteen malli, Rules for applying different promotional schemes.,Säännöt erilaisten myynninedistämisjärjestelmien soveltamisesta., Shift,Siirtää, Show {0},Näytä {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Erikoismerkit paitsi "-", "#", ".", "/", "{" Ja "}" eivät ole sallittuja nimeämissarjoissa", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Erikoismerkit paitsi "-", "#", ".", "/", "{{" Ja "}}" eivät ole sallittuja nimeämissarjoissa {0}", Target Details,Kohteen yksityiskohdat, {0} already has a Parent Procedure {1}.,{0}: llä on jo vanhempainmenettely {1}., API,API, diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv index 3ba5ade629..8367afd331 100644 --- a/erpnext/translations/fr.csv +++ b/erpnext/translations/fr.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Modèle de commentaires sur la qualité, Rules for applying different promotional schemes.,Règles d'application de différents programmes promotionnels., Shift,Décalage, Show {0},Montrer {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caractères spéciaux sauf "-", "#", ".", "/", "{" Et "}" non autorisés dans les séries de nommage", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caractères spéciaux sauf "-", "#", ".", "/", "{{" Et "}}" non autorisés dans les séries de nommage {0}", Target Details,Détails de la cible, {0} already has a Parent Procedure {1}.,{0} a déjà une procédure parent {1}., API,API, diff --git a/erpnext/translations/gu.csv b/erpnext/translations/gu.csv index 5c2b520d9e..97adac94db 100644 --- a/erpnext/translations/gu.csv +++ b/erpnext/translations/gu.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,ગુણવત્તા પ્રતિસાદ Temp Rules for applying different promotional schemes.,વિવિધ પ્રમોશનલ યોજનાઓ લાગુ કરવાના નિયમો., Shift,પાળી, Show {0},બતાવો {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" અને "}" સિવાયના વિશેષ અક્ષરો નામકરણ શ્રેણીમાં મંજૂરી નથી", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" અને "}}" સિવાયના વિશેષ અક્ષરો નામકરણ શ્રેણીમાં મંજૂરી નથી {0}", Target Details,લક્ષ્યાંક વિગતો, {0} already has a Parent Procedure {1}.,{0} પાસે પહેલેથી જ પિતૃ કાર્યવાહી છે {1}., API,API, diff --git a/erpnext/translations/he.csv b/erpnext/translations/he.csv index 29e6f6afc3..22b252261f 100644 --- a/erpnext/translations/he.csv +++ b/erpnext/translations/he.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,תבנית משוב איכותית, Rules for applying different promotional schemes.,כללים ליישום תוכניות קידום מכירות שונות., Shift,מִשׁמֶרֶת, Show {0},הצג את {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","תווים מיוחדים למעט "-", "#", ".", "/", "{" ו- "}" אינם מורשים בסדרות שמות", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","{0} תווים מיוחדים למעט "-", "#", ".", "/", "{{" ו- "}}" אינם מורשים בסדרות שמות", Target Details,פרטי יעד, {0} already has a Parent Procedure {1}.,{0} כבר יש נוהל הורים {1}., API,ממשק API, diff --git a/erpnext/translations/hi.csv b/erpnext/translations/hi.csv index c385fc6ef6..ca41cf3d9f 100644 --- a/erpnext/translations/hi.csv +++ b/erpnext/translations/hi.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,गुणवत्ता प्रतिक्रि Rules for applying different promotional schemes.,विभिन्न प्रचार योजनाओं को लागू करने के लिए नियम।, Shift,खिसक जाना, Show {0},{0} दिखाएं, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", "।", "/", "{" और "}" को छोड़कर विशेष वर्ण श्रृंखला में अनुमति नहीं है", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", "।", "/", "{{" और "}}" को छोड़कर विशेष वर्ण श्रृंखला {0} में अनुमति नहीं है", Target Details,लक्ष्य विवरण, {0} already has a Parent Procedure {1}.,{0} पहले से ही एक पेरेंट प्रोसीजर {1} है।, API,एपीआई, diff --git a/erpnext/translations/hr.csv b/erpnext/translations/hr.csv index a544e98868..319b80b7c4 100644 --- a/erpnext/translations/hr.csv +++ b/erpnext/translations/hr.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Predložak povratne informacije o kvaliteti, Rules for applying different promotional schemes.,Pravila za primjenu različitih promotivnih shema., Shift,smjena, Show {0},Prikaži {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znakovi osim "-", "#", ".", "/", "{" I "}" nisu dopušteni u imenovanju serija", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znakovi osim "-", "#", ".", "/", "{{" I "}}" nisu dopušteni u imenovanju serija {0}", Target Details,Pojedinosti cilja, {0} already has a Parent Procedure {1}.,{0} već ima roditeljski postupak {1}., API,API, diff --git a/erpnext/translations/hu.csv b/erpnext/translations/hu.csv index 29f347ecbc..06647281cd 100644 --- a/erpnext/translations/hu.csv +++ b/erpnext/translations/hu.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Minőségi visszajelző sablon, Rules for applying different promotional schemes.,Különböző promóciós rendszerek alkalmazásának szabályai., Shift,Váltás, Show {0},Mutasd {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciális karakterek, kivéve "-", "#", ".", "/", "{" És "}", a sorozatok elnevezése nem megengedett", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciális karakterek, kivéve "-", "#", ".", "/", "{{" És "}}", a sorozatok elnevezése nem megengedett {0}", Target Details,Cél részletei, {0} already has a Parent Procedure {1}.,A (z) {0} már rendelkezik szülői eljárással {1}., API,API, diff --git a/erpnext/translations/id.csv b/erpnext/translations/id.csv index 7175ad2fa7..1e50747023 100644 --- a/erpnext/translations/id.csv +++ b/erpnext/translations/id.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Template Umpan Balik Kualitas, Rules for applying different promotional schemes.,Aturan untuk menerapkan berbagai skema promosi., Shift,Bergeser, Show {0},Tampilkan {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Karakter Khusus kecuali "-", "#", ".", "/", "{" Dan "}" tidak diizinkan dalam rangkaian penamaan", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Karakter Khusus kecuali "-", "#", ".", "/", "{{" Dan "}}" tidak diizinkan dalam rangkaian penamaan {0}", Target Details,Detail Target, {0} already has a Parent Procedure {1}.,{0} sudah memiliki Prosedur Induk {1}., API,API, diff --git a/erpnext/translations/is.csv b/erpnext/translations/is.csv index 5f56aff3dc..c20c21eef8 100644 --- a/erpnext/translations/is.csv +++ b/erpnext/translations/is.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Sniðmát fyrir gæði gæða, Rules for applying different promotional schemes.,Reglur um beitingu mismunandi kynningarkerfa., Shift,Vakt, Show {0},Sýna {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Sérstafir nema "-", "#", ".", "/", "{" Og "}" ekki leyfðar í nafngiftiröð", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Sérstafir nema "-", "#", ".", "/", "{{" Og "}}" ekki leyfðar í nafngiftiröð {0}", Target Details,Upplýsingar um markmið, {0} already has a Parent Procedure {1}.,{0} er þegar með foreldraferli {1}., API,API, diff --git a/erpnext/translations/it.csv b/erpnext/translations/it.csv index 3a1d73f344..3d15d5594d 100644 --- a/erpnext/translations/it.csv +++ b/erpnext/translations/it.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Modello di feedback sulla qualità, Rules for applying different promotional schemes.,Regole per l'applicazione di diversi schemi promozionali., Shift,Cambio, Show {0},Mostra {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caratteri speciali tranne "-", "#", ".", "/", "{" E "}" non consentiti nelle serie di nomi", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caratteri speciali tranne "-", "#", ".", "/", "{{" E "}}" non consentiti nelle serie di nomi {0}", Target Details,Dettagli target, {0} already has a Parent Procedure {1}.,{0} ha già una procedura padre {1}., API,API, diff --git a/erpnext/translations/ja.csv b/erpnext/translations/ja.csv index 6e2eaae4a4..a11a9a126a 100644 --- a/erpnext/translations/ja.csv +++ b/erpnext/translations/ja.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,品質フィードバックテンプレート, Rules for applying different promotional schemes.,さまざまなプロモーションスキームを適用するための規則。, Shift,シフト, Show {0},{0}を表示, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series"," - "、 "#"、 "。"、 "/"、 "{"、および "}"以外の特殊文字は、一連の名前付けでは使用できません, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}"," - "、 "#"、 "。"、 "/"、 "{{"、および "}}"以外の特殊文字は、一連の名前付けでは使用できません {0}, Target Details,ターゲット詳細, {0} already has a Parent Procedure {1}.,{0}にはすでに親プロシージャー{1}があります。, API,API, diff --git a/erpnext/translations/km.csv b/erpnext/translations/km.csv index e2a528cea2..bd70595a7b 100644 --- a/erpnext/translations/km.csv +++ b/erpnext/translations/km.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,គំរូមតិយោបល់គុណភាព Rules for applying different promotional schemes.,វិធានសម្រាប់អនុវត្តគម្រោងផ្សព្វផ្សាយផ្សេងៗគ្នា។, Shift,ប្តូរ។, Show {0},បង្ហាញ {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","តួអក្សរពិសេសលើកលែងតែ "-", "#", "។ ", "/", "{" និង "}" មិនត្រូវបានអនុញ្ញាតក្នុងស៊េរីដាក់ឈ្មោះ", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","តួអក្សរពិសេសលើកលែងតែ "-", "#", "។ ", "/", "{{" និង "}}" មិនត្រូវបានអនុញ្ញាតក្នុងស៊េរីដាក់ឈ្មោះ {0}", Target Details,ព័ត៌មានលម្អិតគោលដៅ។, {0} already has a Parent Procedure {1}.,{0} មាននីតិវិធីឪពុកម្តាយរួចហើយ {1} ។, API,API, diff --git a/erpnext/translations/kn.csv b/erpnext/translations/kn.csv index 4a9173d4a0..7572a09a08 100644 --- a/erpnext/translations/kn.csv +++ b/erpnext/translations/kn.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,ಗುಣಮಟ್ಟದ ಪ್ರತಿಕ್ರಿ Rules for applying different promotional schemes.,ವಿಭಿನ್ನ ಪ್ರಚಾರ ಯೋಜನೆಗಳನ್ನು ಅನ್ವಯಿಸುವ ನಿಯಮಗಳು., Shift,ಶಿಫ್ಟ್, Show {0},{0} ತೋರಿಸು, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" ಮತ್ತು "}" ಹೊರತುಪಡಿಸಿ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಹೆಸರಿಸುವ ಸರಣಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" ಮತ್ತು "}}" ಹೊರತುಪಡಿಸಿ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಹೆಸರಿಸುವ ಸರಣಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ {0}", Target Details,ಗುರಿ ವಿವರಗಳು, {0} already has a Parent Procedure {1}.,{0} ಈಗಾಗಲೇ ಪೋಷಕ ವಿಧಾನವನ್ನು ಹೊಂದಿದೆ {1}., API,API, diff --git a/erpnext/translations/ko.csv b/erpnext/translations/ko.csv index c051b07bea..b873b73b9c 100644 --- a/erpnext/translations/ko.csv +++ b/erpnext/translations/ko.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,품질 피드백 템플릿, Rules for applying different promotional schemes.,다양한 홍보 계획을 적용하기위한 규칙., Shift,시프트, Show {0},{0} 표시, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","이름 계열에 허용되지 않는 "-", "#", ".", "/", "{"및 "}"을 제외한 특수 문자", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","이름 계열에 허용되지 않는 "-", "#", ".", "/", "{{"및 "}}"을 제외한 특수 문자 {0}", Target Details,대상 세부 정보, {0} already has a Parent Procedure {1}.,{0}에 이미 상위 절차 {1}이 있습니다., API,API, diff --git a/erpnext/translations/ku.csv b/erpnext/translations/ku.csv index 6962ea1ef1..89e12c070b 100644 --- a/erpnext/translations/ku.csv +++ b/erpnext/translations/ku.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Feedablonê nerazîbûna kalîteyê, Rules for applying different promotional schemes.,Qanûnên ji bo bicihanîna nexşeyên cûda yên danasînê, Shift,Tarloqî, Show {0},Show {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Di tîpa navnasî de ji bilî "-", "#", ".", "/", "{" Û "}" tîpên Taybet", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Di tîpa navnasî de ji bilî "-", "#", ".", "/", "{{" Û "}}" tîpên Taybet {0}", Target Details,Hûrgulên armancê, {0} already has a Parent Procedure {1}.,{0} ji berê ve heye Parent Procedure {1}., API,API, diff --git a/erpnext/translations/lo.csv b/erpnext/translations/lo.csv index b61476cf17..778a59b3c2 100644 --- a/erpnext/translations/lo.csv +++ b/erpnext/translations/lo.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,ແມ່ແບບ ຄຳ ຕິຊົມຄຸນນ Rules for applying different promotional schemes.,ກົດລະບຽບໃນການ ນຳ ໃຊ້ແຜນການໂຄສະນາທີ່ແຕກຕ່າງກັນ., Shift,ປ່ຽນ, Show {0},ສະແດງ {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","ຕົວລະຄອນພິເສດຍົກເວັ້ນ "-", "#", ".", "/", "{" ແລະ "}" ບໍ່ໄດ້ຖືກອະນຸຍາດໃນຊຸດຊື່", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","ຕົວລະຄອນພິເສດຍົກເວັ້ນ "-", "#", ".", "/", "{{" ແລະ "}}" ບໍ່ໄດ້ຖືກອະນຸຍາດໃນຊຸດຊື່ {0}", Target Details,ລາຍລະອຽດເປົ້າ ໝາຍ, {0} already has a Parent Procedure {1}.,{0} ມີຂັ້ນຕອນການເປັນພໍ່ແມ່ {1} ແລ້ວ., API,API, diff --git a/erpnext/translations/lt.csv b/erpnext/translations/lt.csv index 78571f9624..4721ce43ff 100644 --- a/erpnext/translations/lt.csv +++ b/erpnext/translations/lt.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kokybės atsiliepimų šablonas, Rules for applying different promotional schemes.,Skirtingų reklamos schemų taikymo taisyklės., Shift,Pamaina, Show {0},Rodyti {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialieji simboliai, išskyrus „-“, „#“, „.“, „/“, „{“ Ir „}“, neleidžiami įvardyti serijomis", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialieji simboliai, išskyrus "-", "#", "।", "/", "{{" Ir "}}", neleidžiami įvardyti serijomis {0}", Target Details,Tikslinė informacija, {0} already has a Parent Procedure {1}.,{0} jau turi tėvų procedūrą {1}., API,API, diff --git a/erpnext/translations/lv.csv b/erpnext/translations/lv.csv index cbf04855d0..b8499b28c1 100644 --- a/erpnext/translations/lv.csv +++ b/erpnext/translations/lv.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitatīvas atsauksmes veidne, Rules for applying different promotional schemes.,Noteikumi dažādu reklāmas shēmu piemērošanai., Shift,Maiņa, Show {0},Rādīt {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciālās rakstzīmes, izņemot "-", "#", ".", "/", "{" Un "}", kas nav atļautas nosaukuma sērijās", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciālās rakstzīmes, izņemot "-", "#", ".", "/", "{{" Un "}}", kas nav atļautas nosaukuma sērijās {0}", Target Details,Mērķa informācija, {0} already has a Parent Procedure {1}.,{0} jau ir vecāku procedūra {1}., API,API, diff --git a/erpnext/translations/mk.csv b/erpnext/translations/mk.csv index 7008025534..8ecae03adc 100644 --- a/erpnext/translations/mk.csv +++ b/erpnext/translations/mk.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Шаблон за повратни информаци Rules for applying different promotional schemes.,Правила за примена на различни промотивни шеми., Shift,Смена, Show {0},Покажи {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Не се дозволени специјални карактери освен "-", "#", ".", "/", "{" И "}" во сериите за именување", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Не се дозволени специјални карактери освен "-", "#", ".", "/", "{{" И "}}" во сериите за именување {0}", Target Details,Цели детали, {0} already has a Parent Procedure {1}.,{0} веќе има Матична постапка {1}., API,API, diff --git a/erpnext/translations/ml.csv b/erpnext/translations/ml.csv index f917969345..f649e6c83b 100644 --- a/erpnext/translations/ml.csv +++ b/erpnext/translations/ml.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,ഗുണനിലവാരമുള്ള ഫീഡ Rules for applying different promotional schemes.,വ്യത്യസ്ത പ്രമോഷണൽ സ്കീമുകൾ പ്രയോഗിക്കുന്നതിനുള്ള നിയമങ്ങൾ., Shift,ഷിഫ്റ്റ്, Show {0},{0} കാണിക്കുക, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{", "}" എന്നിവ ഒഴികെയുള്ള പ്രത്യേക പ്രതീകങ്ങൾ നാമകരണ ശ്രേണിയിൽ അനുവദനീയമല്ല", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{", "}}" എന്നിവ ഒഴികെയുള്ള പ്രത്യേക പ്രതീകങ്ങൾ നാമകരണ ശ്രേണിയിൽ അനുവദനീയമല്ല {0}", Target Details,ടാർഗെറ്റ് വിശദാംശങ്ങൾ, {0} already has a Parent Procedure {1}.,{0} ന് ഇതിനകം ഒരു രക്ഷാകർതൃ നടപടിക്രമം ഉണ്ട് {1}., API,API, diff --git a/erpnext/translations/mr.csv b/erpnext/translations/mr.csv index 9c41ce6f33..38effc1b15 100644 --- a/erpnext/translations/mr.csv +++ b/erpnext/translations/mr.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,गुणवत्ता अभिप्राय ट Rules for applying different promotional schemes.,वेगवेगळ्या जाहिरात योजना लागू करण्याचे नियम., Shift,शिफ्ट, Show {0},दर्शवा {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" आणि "}" वगळता विशिष्ट वर्णांना नामांकन मालिकेमध्ये परवानगी नाही", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" आणि "}}" वगळता विशिष्ट वर्णांना नामांकन मालिकेमध्ये परवानगी नाही {0}", Target Details,लक्ष्य तपशील, {0} already has a Parent Procedure {1}.,{0} कडे आधीपासूनच पालक प्रक्रिया आहे {1}., API,API, diff --git a/erpnext/translations/ms.csv b/erpnext/translations/ms.csv index 1483844990..4ee650b104 100644 --- a/erpnext/translations/ms.csv +++ b/erpnext/translations/ms.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Template Maklum Balas Kualiti, Rules for applying different promotional schemes.,Kaedah untuk memohon skim promosi yang berbeza., Shift,Shift, Show {0},Tunjukkan {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Watak Khas kecuali "-", "#", ".", "/", "{" Dan "}" tidak dibenarkan dalam siri penamaan", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Watak Khas kecuali "-", "#", ".", "/", "{{" Dan "}}" tidak dibenarkan dalam siri penamaan {0}", Target Details,Butiran Sasaran, {0} already has a Parent Procedure {1}.,{0} sudah mempunyai Tatacara Ibu Bapa {1}., API,API, diff --git a/erpnext/translations/my.csv b/erpnext/translations/my.csv index d15ec1ec71..f0d216bbc7 100644 --- a/erpnext/translations/my.csv +++ b/erpnext/translations/my.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,အရည်အသွေးတုံ့ပြန်ခ Rules for applying different promotional schemes.,ကွဲပြားခြားနားသောပရိုမိုးရှင်းအစီအစဉ်များလျှောက်ထားမှုအတွက်စည်းကမ်းများ။, Shift,အဆိုင်း, Show {0},Show ကို {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","မှလွဲ. အထူးဇာတ်ကောင် "-" "။ ", "#", "/", "{" နှင့် "}" စီးရီးနာမည်အတွက်ခွင့်မပြု", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","မှလွဲ. အထူးဇာတ်ကောင် "-" "။ ", "#", "/", "{{" နှင့် "}}" စီးရီးနာမည်အတွက်ခွင့်မပြု {0}", Target Details,ပစ်မှတ်အသေးစိတ်, {0} already has a Parent Procedure {1}.,{0} ပြီးသားမိဘလုပ်ထုံးလုပ်နည်း {1} ရှိပါတယ်။, API,API ကို, diff --git a/erpnext/translations/nl.csv b/erpnext/translations/nl.csv index fbadc02327..6ec43a0592 100644 --- a/erpnext/translations/nl.csv +++ b/erpnext/translations/nl.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kwaliteitsfeedbacksjabloon, Rules for applying different promotional schemes.,Regels voor het toepassen van verschillende promotieregelingen., Shift,Verschuiving, Show {0},Toon {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Speciale tekens behalve "-", "#", ".", "/", "{" En "}" niet toegestaan in naamgevingsreeks", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Speciale tekens behalve "-", "#", ".", "/", "{{" En "}}" niet toegestaan in naamgevingsreeks {0}", Target Details,Doelgegevens, {0} already has a Parent Procedure {1}.,{0} heeft al een ouderprocedure {1}., API,API, diff --git a/erpnext/translations/no.csv b/erpnext/translations/no.csv index 150e5ca4a2..df87e81db9 100644 --- a/erpnext/translations/no.csv +++ b/erpnext/translations/no.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitet Tilbakemelding Mal, Rules for applying different promotional schemes.,Regler for anvendelse av forskjellige kampanjer., Shift,Skifte, Show {0},Vis {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Spesialtegn unntatt "-", "#", ".", "/", "{" Og "}" ikke tillatt i navneserier", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Spesialtegn unntatt "-", "#", ".", "/", "{{" Og "}}" ikke tillatt i navneserier {0}", Target Details,Måldetaljer, {0} already has a Parent Procedure {1}.,{0} har allerede en foreldreprosedyre {1}., API,API, diff --git a/erpnext/translations/pl.csv b/erpnext/translations/pl.csv index 8340b7272f..be81e29d7f 100644 --- a/erpnext/translations/pl.csv +++ b/erpnext/translations/pl.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Szablon opinii o jakości, Rules for applying different promotional schemes.,Zasady stosowania różnych programów promocyjnych., Shift,Przesunięcie, Show {0},Pokaż {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Znaki specjalne z wyjątkiem „-”, „#”, „.”, „/”, „{” I „}” niedozwolone w serii nazw", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Znaki specjalne z wyjątkiem "-", "#", "।", "/", "{{" I "}}" niedozwolone w serii nazw {0}", Target Details,Szczegóły celu, {0} already has a Parent Procedure {1}.,{0} ma już procedurę nadrzędną {1}., API,API, diff --git a/erpnext/translations/ps.csv b/erpnext/translations/ps.csv index 1dcaf48d79..68add60cc9 100644 --- a/erpnext/translations/ps.csv +++ b/erpnext/translations/ps.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,د کیفیت فیډبیک ټیمپلیټ, Rules for applying different promotional schemes.,د مختلف پروموشنل سکیمونو پلي کولو قواعد., Shift,شفټ, Show {0},ښودل {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",ځانګړي نومونه د "-" ، "#" ، "." ، "/" ، "{" او "}" نوم لیکلو کې اجازه نه لري, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} ځانګړي نومونه د "-" ، "#" ، "." ، "/" ، "{{" او "}}" نوم لیکلو کې اجازه نه لري, Target Details,د هدف توضیحات, {0} already has a Parent Procedure {1}.,{0} د مخه د والدین پروسیجر {1} لري., API,API, diff --git a/erpnext/translations/pt-BR.csv b/erpnext/translations/pt-BR.csv index 957cb75752..cc1c6af913 100644 --- a/erpnext/translations/pt-BR.csv +++ b/erpnext/translations/pt-BR.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Modelo de Feedback de Qualidade, Rules for applying different promotional schemes.,Regras para aplicar diferentes esquemas promocionais., Shift,Mudança, Show {0},Mostrar {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiais, exceto "-", "#", ".", "/", "{" e "}" não permitidos na série de nomenclatura", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiais, exceto "-", "#", ".", "/", "{{" e "}}" não permitidos na série de nomenclatura {0}", Target Details,Detalhes do Alvo, {0} already has a Parent Procedure {1}.,{0} já tem um procedimento pai {1}., API,API, diff --git a/erpnext/translations/pt.csv b/erpnext/translations/pt.csv index 3b8a0a0f43..43bf227e67 100644 --- a/erpnext/translations/pt.csv +++ b/erpnext/translations/pt.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Modelo de Feedback de Qualidade, Rules for applying different promotional schemes.,Regras para aplicar diferentes esquemas promocionais., Shift,Mudança, Show {0},Mostrar {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caracteres especiais, exceto "-", "#", ".", "/", "{" E "}" não permitidos na série de nomenclatura", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caracteres especiais, exceto "-", "#", ".", "/", "{{" E "}}" não permitidos na série de nomenclatura {0}", Target Details,Detalhes do Alvo, {0} already has a Parent Procedure {1}.,{0} já tem um procedimento pai {1}., API,API, diff --git a/erpnext/translations/ro.csv b/erpnext/translations/ro.csv index 643b8c5c3e..3aab431cdd 100644 --- a/erpnext/translations/ro.csv +++ b/erpnext/translations/ro.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Șablon de feedback de calitate, Rules for applying different promotional schemes.,Reguli pentru aplicarea diferitelor scheme promoționale., Shift,Schimb, Show {0},Afișați {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Caractere speciale, cu excepția "-", "#", ".", "/", "{" Și "}" nu sunt permise în numirea seriei", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Caractere speciale, cu excepția "-", "#", ".", "/", "{{" Și "}}" nu sunt permise în numirea seriei {0}", Target Details,Detalii despre țintă, {0} already has a Parent Procedure {1}.,{0} are deja o procedură părinte {1}., API,API-ul, diff --git a/erpnext/translations/ru.csv b/erpnext/translations/ru.csv index 5f3af770cf..662346f2e5 100644 --- a/erpnext/translations/ru.csv +++ b/erpnext/translations/ru.csv @@ -3535,7 +3535,7 @@ Quality Feedback Template,Шаблон обратной связи по каче Rules for applying different promotional schemes.,Правила применения разных рекламных схем., Shift,Сдвиг, Show {0},Показать {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Специальные символы, кроме ""-"", ""#"", ""."", ""/"", ""{"" и ""}"", не допускаются в серийных номерах", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Специальные символы, кроме "-", "#", "।", "/", "{{" и "}}", не допускаются в серийных номерах {0}", Target Details,Детали цели, {0} already has a Parent Procedure {1}.,{0} уже имеет родительскую процедуру {1}., API,API, diff --git a/erpnext/translations/rw.csv b/erpnext/translations/rw.csv index 64591399af..6c2b5ddb10 100644 --- a/erpnext/translations/rw.csv +++ b/erpnext/translations/rw.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Inyandikorugero nziza, Rules for applying different promotional schemes.,Amategeko yo gukoresha gahunda zitandukanye zo kwamamaza., Shift,Shift, Show {0},Erekana {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Inyuguti zidasanzwe usibye "-", "#", ".", "/", "{" Na "}" ntibyemewe mu ruhererekane rwo kwita izina", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Inyuguti zidasanzwe usibye "-", "#", ".", "/", "{{" Na "}}" ntibyemewe mu ruhererekane rwo kwita izina {0}", Target Details,Intego Ibisobanuro, {0} already has a Parent Procedure {1}.,{0} isanzwe ifite uburyo bwababyeyi {1}., API,API, diff --git a/erpnext/translations/si.csv b/erpnext/translations/si.csv index 690c47332d..5b7823589a 100644 --- a/erpnext/translations/si.csv +++ b/erpnext/translations/si.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,ගුණාත්මක ප්‍රතිපෝෂ Rules for applying different promotional schemes.,විවිධ ප්‍රවර්ධන යෝජනා ක්‍රම යෙදීම සඳහා නීති., Shift,මාරුව, Show {0},{0 Show පෙන්වන්න, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" සහ "}" හැර විශේෂ අක්ෂර නම් කිරීමේ ශ්‍රේණියේ අවසර නැත", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" සහ "}}" හැර විශේෂ අක්ෂර නම් කිරීමේ ශ්‍රේණියේ අවසර නැත {0}", Target Details,ඉලක්ක විස්තර, {0} already has a Parent Procedure {1}.,{0} දැනටමත් දෙමාපිය ක්‍රියා පටිපාටියක් ඇත {1}., API,API, diff --git a/erpnext/translations/sk.csv b/erpnext/translations/sk.csv index cb4a7fed4b..446e0be58b 100644 --- a/erpnext/translations/sk.csv +++ b/erpnext/translations/sk.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Šablóna spätnej väzby kvality, Rules for applying different promotional schemes.,Pravidlá uplatňovania rôznych propagačných programov., Shift,smena, Show {0},Zobraziť {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Špeciálne znaky s výnimkou „-“, „#“, „.“, „/“, „{“ A „}“ nie sú v názvových sériách povolené.", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Špeciálne znaky s výnimkou "-", "#", "।", "/", "{{" A "}}" nie sú v názvových sériách povolené {0}.", Target Details,Podrobnosti o cieli, {0} already has a Parent Procedure {1}.,{0} už má rodičovský postup {1}., API,API, diff --git a/erpnext/translations/sl.csv b/erpnext/translations/sl.csv index 8beec6be16..8b8ed01114 100644 --- a/erpnext/translations/sl.csv +++ b/erpnext/translations/sl.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Predloga za povratne informacije o kakovosti, Rules for applying different promotional schemes.,Pravila za uporabo različnih promocijskih shem., Shift,Shift, Show {0},Prikaži {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Posebni znaki, razen "-", "#", ".", "/", "{" In "}" v poimenovanju ni dovoljen", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Posebni znaki, razen "-", "#", ".", "/", "{{" In "}}" v poimenovanju ni dovoljen {0}", Target Details,Podrobnosti cilja, {0} already has a Parent Procedure {1}.,{0} že ima nadrejeni postopek {1}., API,API, diff --git a/erpnext/translations/sq.csv b/erpnext/translations/sq.csv index 05aefa3602..6f4f8e0135 100644 --- a/erpnext/translations/sq.csv +++ b/erpnext/translations/sq.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Modeli i reagimit të cilësisë, Rules for applying different promotional schemes.,Rregulla për aplikimin e skemave të ndryshme promovuese., Shift,ndryshim, Show {0},Trego {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Karaktere speciale përveç "-", "#", ".", "/", "{" Dhe "}" nuk lejohen në seritë emërtuese", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Karaktere speciale përveç "-", "#", ".", "/", "{{" Dhe "}}" nuk lejohen në seritë emërtuese {0}", Target Details,Detaje të synuara, {0} already has a Parent Procedure {1}.,{0} tashmë ka një procedurë prindërore {1}., API,API, diff --git a/erpnext/translations/sr.csv b/erpnext/translations/sr.csv index b507f74f09..853c6f3ccc 100644 --- a/erpnext/translations/sr.csv +++ b/erpnext/translations/sr.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Квалитетни образац за поврат Rules for applying different promotional schemes.,Правила за примену различитих промотивних шема., Shift,Смена, Show {0},Прикажи {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Посебни знакови осим "-", "#", ".", "/", "{" И "}" нису дозвољени у именовању серија", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Посебни знакови осим "-", "#", ".", "/", "{{" И "}}" нису дозвољени у именовању серија {0}", Target Details,Детаљи циља, {0} already has a Parent Procedure {1}.,{0} већ има родитељску процедуру {1}., API,АПИ, diff --git a/erpnext/translations/sv.csv b/erpnext/translations/sv.csv index 57e02792f4..2a4d6b1fbd 100644 --- a/erpnext/translations/sv.csv +++ b/erpnext/translations/sv.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kvalitetsåterkopplingsmall, Rules for applying different promotional schemes.,Regler för tillämpning av olika kampanjprogram., Shift,Flytta, Show {0},Visa {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Specialtecken utom "-", "#", ".", "/", "{" Och "}" är inte tillåtna i namnserien", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Specialtecken utom "-", "#", ".", "/", "{{" Och "}}" är inte tillåtna i namnserien {0}", Target Details,Måldetaljer, {0} already has a Parent Procedure {1}.,{0} har redan en överordnad procedur {1}., API,API, diff --git a/erpnext/translations/sw.csv b/erpnext/translations/sw.csv index 3595727666..234d33e106 100644 --- a/erpnext/translations/sw.csv +++ b/erpnext/translations/sw.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kiolezo cha Maoni ya Ubora, Rules for applying different promotional schemes.,Sheria za kutumia miradi tofauti ya uendelezaji., Shift,Shift, Show {0},Onyesha {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Tabia maalum isipokuwa "-", "#", ".", "/", "{" Na "}" hairuhusiwi katika kutaja mfululizo", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Tabia maalum isipokuwa "-", "#", ".", "/", "{{" Na "}}" hairuhusiwi katika kutaja mfululizo {0}", Target Details,Maelezo ya Lengo, {0} already has a Parent Procedure {1}.,{0} tayari ina Utaratibu wa Mzazi {1}., API,API, diff --git a/erpnext/translations/ta.csv b/erpnext/translations/ta.csv index 100f0e9300..e7384b36ef 100644 --- a/erpnext/translations/ta.csv +++ b/erpnext/translations/ta.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,தரமான கருத்து வார்ப Rules for applying different promotional schemes.,வெவ்வேறு விளம்பர திட்டங்களைப் பயன்படுத்துவதற்கான விதிகள்., Shift,ஷிப்ட், Show {0},{0 Show ஐக் காட்டு, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" மற்றும் "}" தவிர சிறப்பு எழுத்துக்கள் பெயரிடும் தொடரில் அனுமதிக்கப்படவில்லை", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" மற்றும் "}}" தவிர சிறப்பு எழுத்துக்கள் பெயரிடும் தொடரில் அனுமதிக்கப்படவில்லை {0}", Target Details,இலக்கு விவரங்கள், {0} already has a Parent Procedure {1}.,{0} ஏற்கனவே பெற்றோர் நடைமுறை {1 has ஐக் கொண்டுள்ளது., API,ஏபிஐ, diff --git a/erpnext/translations/te.csv b/erpnext/translations/te.csv index 047d07731e..cd14a77310 100644 --- a/erpnext/translations/te.csv +++ b/erpnext/translations/te.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,నాణ్యమైన అభిప్రాయ మ Rules for applying different promotional schemes.,విభిన్న ప్రచార పథకాలను వర్తింపజేయడానికి నియమాలు., Shift,మార్పు, Show {0},{0 Show చూపించు, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" మరియు "}" మినహా ప్రత్యేక అక్షరాలు పేరు పెట్టే సిరీస్‌లో అనుమతించబడవు", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" మరియు "}}" మినహా ప్రత్యేక అక్షరాలు పేరు పెట్టే సిరీస్‌లో అనుమతించబడవు {0}", Target Details,లక్ష్య వివరాలు, {0} already has a Parent Procedure {1}.,{0} ఇప్పటికే తల్లిదండ్రుల విధానం {1 has ను కలిగి ఉంది., API,API, diff --git a/erpnext/translations/th.csv b/erpnext/translations/th.csv index 71233ec8fa..4ab59bc8e1 100644 --- a/erpnext/translations/th.csv +++ b/erpnext/translations/th.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,เทมเพลตข้อเสนอแนะค Rules for applying different promotional schemes.,กฎสำหรับการใช้รูปแบบการส่งเสริมการขายต่าง ๆ, Shift,เปลี่ยน, Show {0},แสดง {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","ห้ามใช้อักขระพิเศษยกเว้น "-", "#", ".", "/", "{" และ "}" ในซีรี่ส์", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","ห้ามใช้อักขระพิเศษยกเว้น "-", "#", ".", "/", "{{" และ "}}" ในซีรี่ส์ {0}", Target Details,รายละเอียดเป้าหมาย, {0} already has a Parent Procedure {1}.,{0} มี parent Parent {1} อยู่แล้ว, API,API, diff --git a/erpnext/translations/tr.csv b/erpnext/translations/tr.csv index 9e7ba4d142..b65494ce32 100644 --- a/erpnext/translations/tr.csv +++ b/erpnext/translations/tr.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Kalite Geribildirim Şablonu, Rules for applying different promotional schemes.,Farklı promosyon programlarını uygulama kuralları., Shift,vardiya, Show {0},{0} göster, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" Ve "}" dışındaki Özel Karakterler, seri dizisine izin verilmez", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" Ve "}}" dışındaki Özel Karakterler, seri dizisine izin verilmez {0}", Target Details,Hedef Detayları, {0} already has a Parent Procedure {1}.,{0} zaten bir {1} veli prosedürüne sahip., API,API, diff --git a/erpnext/translations/uk.csv b/erpnext/translations/uk.csv index 53e2df518c..4e2f63f870 100644 --- a/erpnext/translations/uk.csv +++ b/erpnext/translations/uk.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Шаблон зворотнього зв'язку Rules for applying different promotional schemes.,Правила застосування різних рекламних схем., Shift,Зміна, Show {0},Показати {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Спеціальні символи, окрім "-", "#", ".", "/", "{" Та "}", не дозволяються в іменуванні серій", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Спеціальні символи, окрім "-", "#", ".", "/", "{{" Та "}}", не дозволяються в іменуванні серій {0}", Target Details,Деталі цілі, {0} already has a Parent Procedure {1}.,{0} вже має батьківську процедуру {1}., API,API, diff --git a/erpnext/translations/ur.csv b/erpnext/translations/ur.csv index aaaef5895f..db6518e86b 100644 --- a/erpnext/translations/ur.csv +++ b/erpnext/translations/ur.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,کوالٹی فیڈ بیک ٹیمپلیٹ۔, Rules for applying different promotional schemes.,مختلف پروموشنل اسکیموں کو لاگو کرنے کے قواعد۔, Shift,شفٹ۔, Show {0},دکھائیں {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","-" ، "#" ، "." ، "/" ، "{" اور "}" سوائے خصوصی حروف کی نام بندی سیریز میں اجازت نہیں ہے, +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",{0} "-" ، "#" ، "." ، "/" ، "{{" اور "}}" سوائے خصوصی حروف کی نام بندی سیریز میں اجازت نہیں ہے, Target Details,ہدف کی تفصیلات۔, {0} already has a Parent Procedure {1}.,{0} پہلے سے ہی والدین کا طریقہ کار {1} ہے., API,API, diff --git a/erpnext/translations/uz.csv b/erpnext/translations/uz.csv index c983797aae..bb64a15f2b 100644 --- a/erpnext/translations/uz.csv +++ b/erpnext/translations/uz.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Sifat bo'yicha fikrlar shablonlari, Rules for applying different promotional schemes.,Turli reklama sxemalarini qo'llash qoidalari., Shift,Shift, Show {0},{0} ni ko'rsatish, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",""-", "#", ".", "/", "{" Va "}" belgilaridan tashqari maxsus belgilarga ruxsat berilmaydi.", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}",""-", "#", ".", "/", "{{" Va "}}" belgilaridan tashqari maxsus belgilarga ruxsat berilmaydi {0}.", Target Details,Maqsad tafsilotlari, {0} already has a Parent Procedure {1}.,{0} allaqachon Ota-ona tartibiga ega {1}., API,API, diff --git a/erpnext/translations/vi.csv b/erpnext/translations/vi.csv index 03ff2ccc38..7317b4b027 100644 --- a/erpnext/translations/vi.csv +++ b/erpnext/translations/vi.csv @@ -3537,7 +3537,7 @@ Quality Feedback Template,Mẫu phản hồi chất lượng, Rules for applying different promotional schemes.,Quy tắc áp dụng các chương trình khuyến mãi khác nhau., Shift,Ca, Show {0},Hiển thị {0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series","Các ký tự đặc biệt ngoại trừ "-", "#", ".", "/", "{" Và "}" không được phép trong chuỗi đặt tên", +"Special Characters except '-', '#', '.', '/', '{{' and '}}' not allowed in naming series {0}","Các ký tự đặc biệt ngoại trừ "-", "#", ".", "/", "{{" Và "}}" không được phép trong chuỗi đặt tên {0}", Target Details,Chi tiết mục tiêu, {0} already has a Parent Procedure {1}.,{0} đã có Quy trình dành cho phụ huynh {1}., API,API, diff --git a/erpnext/translations/zh.csv b/erpnext/translations/zh.csv index d1f1b07f11..2337bcb4da 100644 --- a/erpnext/translations/zh.csv +++ b/erpnext/translations/zh.csv @@ -3537,7 +3537,6 @@ Quality Feedback Template,质量反馈模板, Rules for applying different promotional schemes.,适用不同促销计划的规则。, Shift,转移, Show {0},显示{0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",命名系列中不允许使用除“ - ”,“#”,“。”,“/”,“{”和“}”之外的特殊字符, Target Details,目标细节, {0} already has a Parent Procedure {1}.,{0}已有父程序{1}。, API,应用程序界面, diff --git a/erpnext/translations/zh_tw.csv b/erpnext/translations/zh_tw.csv index 1cc7d8773e..1b7e18637d 100644 --- a/erpnext/translations/zh_tw.csv +++ b/erpnext/translations/zh_tw.csv @@ -3311,7 +3311,6 @@ Quality Feedback Template,質量反饋模板, Rules for applying different promotional schemes.,適用不同促銷計劃的規則。, Shift,轉移, Show {0},顯示{0}, -"Special Characters except ""-"", ""#"", ""."", ""/"", ""{"" and ""}"" not allowed in naming series",命名系列中不允許使用除“ - ”,“#”,“。”,“/”,“{”和“}”之外的特殊字符, Target Details,目標細節, API,API, Annual,年刊,