diff --git a/.github/workflows/initiate_release.yml b/.github/workflows/initiate_release.yml index f57d46b354d..51cc911f0a0 100644 --- a/.github/workflows/initiate_release.yml +++ b/.github/workflows/initiate_release.yml @@ -8,8 +8,8 @@ permissions: on: schedule: - # 9:30 UTC => 3 PM IST Tuesday - - cron: "30 9 * * 2" + # 9:30 UTC => 3 PM IST + - cron: "30 9 * * 1,4" workflow_dispatch: jobs: @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - version: ["14", "15", "16"] + version: ["15", "16"] steps: - uses: octokit/request-action@v2.x diff --git a/.github/workflows/run-indinvidual-tests.yml b/.github/workflows/run-individual-tests.yml similarity index 82% rename from .github/workflows/run-indinvidual-tests.yml rename to .github/workflows/run-individual-tests.yml index 3e4b8371f8a..a70a2394757 100644 --- a/.github/workflows/run-indinvidual-tests.yml +++ b/.github/workflows/run-individual-tests.yml @@ -4,8 +4,8 @@ on: workflow_dispatch: concurrency: - group: server-individual-tests-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }} - cancel-in-progress: false + group: server-individual-tests-lightmode-develop + cancel-in-progress: true permissions: contents: read @@ -21,7 +21,7 @@ jobs: - id: set-matrix run: | # Use grep and find to get the list of test files - matrix=$(find . -path '*/doctype/*/test_*.py' | xargs grep -l 'def test_' | awk '{ + matrix=$(find . -path '*/test_*.py' | xargs grep -l 'def test_' | sort | awk '{ # Remove ./ prefix, file extension, and replace / with . gsub(/^\.\//, "", $0) gsub(/\.py$/, "", $0) @@ -58,6 +58,7 @@ jobs: strategy: fail-fast: false matrix: ${{fromJson(needs.discover.outputs.matrix)}} + max-parallel: 14 name: Test @@ -130,4 +131,13 @@ jobs: FRAPPE_BRANCH: ${{ github.event.inputs.branch }} - name: Run Tests - run: 'cd ~/frappe-bench/ && bench --site test_site run-tests --app erpnext --module ${{ matrix.test }}' + run: | + site_name=$(echo "${{matrix.test}}" | sed -e 's/.*\.\(test_.*$\)/\1/') + echo "$site_name" + mkdir ~/frappe-bench/sites/$site_name + cp -r "${GITHUB_WORKSPACE}/.github/helper/site_config_mariadb.json" ~/frappe-bench/sites/$site_name/site_config.json + cd ~/frappe-bench/ + bench --site $site_name reinstall --yes + bench --site $site_name set-config allow_tests true + bench --site $site_name run-tests --module ${{ matrix.test }} --lightmode + diff --git a/.github/workflows/server-tests-mariadb.yml b/.github/workflows/server-tests-mariadb.yml index 2bfe5e7065d..b8e88d1b5f3 100644 --- a/.github/workflows/server-tests-mariadb.yml +++ b/.github/workflows/server-tests-mariadb.yml @@ -129,7 +129,7 @@ jobs: FRAPPE_BRANCH: ${{ github.event.client_payload.sha || github.event.inputs.branch }} - name: Run Tests - run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }} --with-coverage' + run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --lightmode --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }} --with-coverage' env: TYPE: server diff --git a/CODEOWNERS b/CODEOWNERS index 328ea4cf713..804230ac8d0 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -7,17 +7,17 @@ erpnext/accounts/ @ruthra-kumar erpnext/assets/ @khushi8112 erpnext/regional @ruthra-kumar erpnext/selling @ruthra-kumar -erpnext/support/ @ruthra-kumar erpnext/buying/ @rohitwaghchaure @mihir-kandoi -erpnext/maintenance/ @rohitwaghchaure +erpnext/maintenance/ @rohitwaghchaure @mihir-kandoi erpnext/manufacturing/ @rohitwaghchaure @mihir-kandoi -erpnext/quality_management/ @rohitwaghchaure +erpnext/quality_management/ @rohitwaghchaure @mihir-kandoi erpnext/stock/ @rohitwaghchaure @mihir-kandoi -erpnext/subcontracting @mihir-kandoi +erpnext/subcontracting/ @mihir-kandoi +erpnext/projects/ @nishkagosalia erpnext/controllers/ @ruthra-kumar @rohitwaghchaure @mihir-kandoi -erpnext/patches/ @ruthra-kumar +erpnext/patches/ @ruthra-kumar @rohitwaghchaure @mihir-kandoi -.github/ @ruthra-kumar +.github/ @ruthra-kumar @mihir-kandoi pyproject.toml @ruthra-kumar diff --git a/README.md b/README.md index 622c004e3ad..d44739f4839 100644 --- a/README.md +++ b/README.md @@ -75,25 +75,48 @@ It takes care of installation, setup, upgrades, monitoring, maintenance and supp - ### Self-Hosted #### Docker -Prerequisites: docker, docker-compose, git. Refer [Docker Documentation](https://docs.docker.com) for more details on Docker setup. +See [Frappe Docker Documentation](https://github.com/frappe/frappe_docker) for full documentation & FAQ on docker setup -Run following commands: +#### Prerequisites -``` +- [Docker](https://docs.docker.com/get-docker/) +- [Docker Compose v2](https://docs.docker.com/compose/) +- [git](https://docs.github.com/en/get-started/getting-started-with-git/set-up-git) + +> For Docker basics and best practices refer to Docker's [documentation](https://docs.docker.com) + +#### Demo setup + +The fastest way to try ERPNext is to play in an already set up sandbox, in your browser, click the button below: + + + Try in PWD + + +### Try on your environment + +> **⚠️ Disposable demo only** +> +> **This setup is intended for quick evaluation. Expect to throw the environment away.** You will not be able to install custom apps to this setup. For production deployments, custom configurations, and detailed explanations, see the full documentation. + +First clone the repo: + +```sh git clone https://github.com/frappe/frappe_docker cd frappe_docker -docker compose -f pwd.yml up -d ``` -After a couple of minutes, site should be accessible on your localhost port: 8080. Use below default login credentials to access the site. -- Username: Administrator -- Password: admin +Then run: -See [Frappe Docker](https://github.com/frappe/frappe_docker?tab=readme-ov-file#to-run-on-arm64-architecture-follow-this-instructions) for ARM based docker setup. +```sh +docker compose -f pwd.yml up -d +``` +Wait for a couple of minutes for ERPNext site to be created or check `create-site` container logs before opening browser on port `8080`. (username: `Administrator`, password: `admin`) + +See [Frappe Docker](https://github.com/frappe/frappe_docker/blob/main/docs/01-getting-started/03-arm64.md) for ARM based docker setup ## Development Setup diff --git a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js index 09846114ea2..f96f7af260a 100644 --- a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js +++ b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.js @@ -17,6 +17,15 @@ frappe.dashboards.chart_sources["Account Balance Timeline"] = { fieldtype: "Link", options: "Account", reqd: 1, + default: locals[":Company"][frappe.defaults.get_user_default("Company")]["default_bank_account"], + get_query: () => { + return { + filters: { + account_type: "Bank", + is_group: 0, + }, + }; + }, }, ], }; diff --git a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py index 261e68ca015..2e070517b8f 100644 --- a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py +++ b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py @@ -37,21 +37,14 @@ def get( filters = frappe.parse_json(filters) or frappe.parse_json(chart.filters_json) account = filters.get("account") - filters.get("company") + company = filters.get("company") - if not account and chart_name: - frappe.throw( - _("Account is not set for the dashboard chart {0}").format( - get_link_to_form("Dashboard Chart", chart_name) - ) - ) - - if not frappe.db.exists("Account", account) and chart_name: - frappe.throw( - _("Account {0} does not exists in the dashboard chart {1}").format( - account, get_link_to_form("Dashboard Chart", chart_name) - ) - ) + if not company and not account: + frappe.throw(_("Company and account filters not set!")) + if not company: + frappe.throw(_("Company filter not set!")) + if not account: + frappe.throw(_("Account filter not set!")) if not to_date: to_date = nowdate() diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py index 7a8ed4dff43..c3518077410 100644 --- a/erpnext/accounts/deferred_revenue.py +++ b/erpnext/accounts/deferred_revenue.py @@ -523,7 +523,8 @@ def make_gl_entries( if gl_entries: try: make_gl_entries(gl_entries, cancel=(doc.docstatus == 2), merge_entries=True) - frappe.db.commit() + if not frappe.in_test: + frappe.db.commit() except Exception as e: if frappe.in_test: doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}") @@ -605,7 +606,8 @@ def book_revenue_via_journal_entry( if submit: journal_entry.submit() - frappe.db.commit() + if not frappe.in_test: + frappe.db.commit() except Exception: frappe.db.rollback() doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}") diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js index 315b41560ce..5ff4e4a47e2 100644 --- a/erpnext/accounts/doctype/account/account_tree.js +++ b/erpnext/accounts/doctype/account/account_tree.js @@ -52,60 +52,55 @@ frappe.treeview_settings["Account"] = { ], root_label: "Accounts", get_tree_nodes: "erpnext.accounts.utils.get_children", - on_get_node: function (nodes, deep = false) { - if (frappe.boot.user.can_read.indexOf("GL Entry") == -1) return; + on_node_render: function (node, deep) { + const render_balances = () => { + for (let account of cur_tree.account_balance_data) { + const node = cur_tree.nodes && cur_tree.nodes[account.value]; + if (!node || node.is_root) continue; - let accounts = []; - if (deep) { - // in case of `get_all_nodes` - accounts = nodes.reduce((acc, node) => [...acc, ...node.data], []); - } else { - accounts = nodes; - } + // show Dr if positive since balance is calculated as debit - credit else show Cr + const balance = account.balance_in_account_currency || account.balance; + const dr_or_cr = balance > 0 ? __("Dr") : __("Cr"); + const format = (value, currency) => format_currency(Math.abs(value), currency); - frappe.db.get_single_value("Accounts Settings", "show_balance_in_coa").then((value) => { - if (value) { - const get_balances = frappe.call({ - method: "erpnext.accounts.utils.get_account_balances", - args: { - accounts: accounts, - company: cur_tree.args.company, - include_default_fb_balances: true, - }, - }); - - get_balances.then((r) => { - if (!r.message || r.message.length == 0) return; - - for (let account of r.message) { - const node = cur_tree.nodes && cur_tree.nodes[account.value]; - if (!node || node.is_root) continue; - - // show Dr if positive since balance is calculated as debit - credit else show Cr - const balance = account.balance_in_account_currency || account.balance; - const dr_or_cr = balance > 0 ? __("Dr") : __("Cr"); - const format = (value, currency) => format_currency(Math.abs(value), currency); - - if (account.balance !== undefined) { - node.parent && node.parent.find(".balance-area").remove(); - $( - '' + - (account.balance_in_account_currency - ? format( - account.balance_in_account_currency, - account.account_currency - ) + " / " - : "") + - format(account.balance, account.company_currency) + - " " + - dr_or_cr + - "" - ).insertBefore(node.$ul); - } - } - }); + if (account.balance !== undefined) { + node.parent && node.parent.find(".balance-area").remove(); + $( + '' + + (account.account_currency != account.company_currency + ? format(account.balance_in_account_currency, account.account_currency) + + " / " + : "") + + format(account.balance, account.company_currency) + + " " + + dr_or_cr + + "" + ).insertBefore(node.$ul); + } } - }); + }; + + if (frappe.boot.user.can_read.indexOf("GL Entry") == -1) return; + if (!cur_tree.account_balance_data) { + frappe.db.get_single_value("Accounts Settings", "show_balance_in_coa").then((value) => { + if (value) { + frappe.call({ + method: "erpnext.accounts.utils.get_account_balances_coa", + args: { + company: cur_tree.args.company, + include_default_fb_balances: true, + }, + callback: function (r) { + if (!r.message || r.message.length === 0) return; + cur_tree.account_balance_data = r.message || []; + render_balances(); + }, + }); + } + }); + } else { + render_balances(); + } }, add_tree_node: "erpnext.accounts.utils.add_ac", menu_items: [ diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json index 1cb95962709..496cf4599b3 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/in_standard_chart_of_accounts.json @@ -6,64 +6,83 @@ "Current Assets": { "Accounts Receivable": { "Debtors": { - "account_type": "Receivable" + "account_type": "Receivable", + "account_category": "Trade Receivables" } }, "Bank Accounts": { "account_type": "Bank", - "is_group": 1 + "is_group": 1, + "account_category": "Cash and Cash Equivalents" }, "Cash In Hand": { "Cash": { - "account_type": "Cash" + "account_type": "Cash", + "account_category": "Cash and Cash Equivalents" }, - "account_type": "Cash" + "account_type": "Cash", + "account_category": "Cash and Cash Equivalents" }, "Loans and Advances (Assets)": { - "is_group": 1 + "is_group": 1, + "account_category": "Other Receivables" }, "Securities and Deposits": { - "Earnest Money": {} + "Earnest Money": { + "account_category": "Other Current Assets" + } }, "Stock Assets": { "Stock In Hand": { - "account_type": "Stock" + "account_type": "Stock", + "account_category": "Stock Assets" }, - "account_type": "Stock" + "account_type": "Stock", + "account_category": "Stock Assets" }, "Tax Assets": { - "is_group": 1 + "is_group": 1, + "account_category": "Other Current Assets" } }, "Fixed Assets": { "Capital Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Electronic Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Furniture and Fixtures": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Office Equipment": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Plants and Machineries": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Buildings": { - "account_type": "Fixed Asset" + "account_type": "Fixed Asset", + "account_category": "Tangible Assets" }, "Accumulated Depreciations": { - "account_type": "Accumulated Depreciation" + "account_type": "Accumulated Depreciation", + "account_category": "Tangible Assets" } }, "Investments": { - "is_group": 1 + "is_group": 1, + "account_category": "Long-term Investments" }, "Temporary Accounts": { "Temporary Opening": { - "account_type": "Temporary" + "account_type": "Temporary", + "account_category": "Other Non-current Assets" } }, "root_type": "Asset" @@ -72,55 +91,103 @@ "Direct Expenses": { "Stock Expenses": { "Cost of Goods Sold": { - "account_type": "Cost of Goods Sold" + "account_type": "Cost of Goods Sold", + "account_category": "Cost of Goods Sold" }, "Expenses Included In Valuation": { - "account_type": "Expenses Included In Valuation" + "account_type": "Expenses Included In Valuation", + "account_category": "Other Direct Costs" }, "Stock Adjustment": { - "account_type": "Stock Adjustment" + "account_type": "Stock Adjustment", + "account_category": "Other Direct Costs" } } }, "Indirect Expenses": { - "Administrative Expenses": {}, - "Commission on Sales": {}, + "Administrative Expenses": { + "account_category": "Operating Expenses" + }, + "Commission on Sales": { + "account_category": "Operating Expenses" + }, "Depreciation": { - "account_type": "Depreciation" + "account_type": "Depreciation", + "account_category": "Operating Expenses" + }, + "Entertainment Expenses": { + "account_category": "Operating Expenses" }, - "Entertainment Expenses": {}, "Freight and Forwarding Charges": { - "account_type": "Chargeable" + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Legal Expenses": { + "account_category": "Operating Expenses" + }, + "Marketing Expenses": { + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Miscellaneous Expenses": { + "account_type": "Chargeable", + "account_category": "Operating Expenses" + }, + "Office Maintenance Expenses": { + "account_category": "Operating Expenses" + }, + "Office Rent": { + "account_category": "Operating Expenses" + }, + "Postal Expenses": { + "account_category": "Operating Expenses" + }, + "Print and Stationery": { + "account_category": "Operating Expenses" }, - "Legal Expenses": {}, - "Marketing Expenses": {}, - "Miscellaneous Expenses": {}, - "Office Maintenance Expenses": {}, - "Office Rent": {}, - "Postal Expenses": {}, - "Print and Stationery": {}, "Rounded Off": { - "account_type": "Round Off" + "account_type": "Round Off", + "account_category": "Operating Expenses" }, - "Salary": {}, - "Sales Expenses": {}, - "Telephone Expenses": {}, - "Travel Expenses": {}, - "Utility Expenses": {}, - "Write Off": {}, - "Exchange Gain/Loss": {}, - "Gain/Loss on Asset Disposal": {}, - "Impairment": {} + "Salary": { + "account_category": "Operating Expenses" + }, + "Sales Expenses": { + "account_category": "Operating Expenses" + }, + "Telephone Expenses": { + "account_category": "Operating Expenses" + }, + "Travel Expenses": { + "account_category": "Operating Expenses" + }, + "Utility Expenses": { + "account_category": "Operating Expenses" + }, + "Write Off": { + "account_category": "Operating Expenses" + }, + "Exchange Gain/Loss": { + "account_category": "Operating Expenses" + }, + "Gain/Loss on Asset Disposal": { + "account_category": "Other Operating Income" + }, + "Impairment": { + "account_category": "Operating Expenses" + } }, "root_type": "Expense" }, "Income": { "Direct Income": { "Sales": { - "account_type": "Income Account" + "account_type": "Income Account", + "account_category": "Revenue from Operations" }, "Service": { - "account_type": "Income Account" + "account_type": "Income Account", + "account_category": "Revenue from Operations" }, "account_type": "Income Account" }, @@ -132,31 +199,51 @@ }, "Source of Funds (Liabilities)": { "Capital Account": { - "Reserves and Surplus": {}, - "Shareholders Funds": {}, - "Revaluation Surplus": {} + "Reserves and Surplus": { + "account_category": "Reserves and Surplus" + }, + "Shareholders Funds": { + "account_category": "Share Capital" + }, + "Revaluation Surplus": { + "account_category": "Reserves and Surplus" + } }, "Current Liabilities": { "Accounts Payable": { "Creditors": { - "account_type": "Payable" + "account_type": "Payable", + "account_category": "Trade Payables" }, - "Payroll Payable": {} + "Payroll Payable": { + "account_category": "Other Payables" + } }, "Stock Liabilities": { "Stock Received But Not Billed": { - "account_type": "Stock Received But Not Billed" + "account_type": "Stock Received But Not Billed", + "account_category": "Trade Payables" } }, "Duties and Taxes": { "TDS": { - "account_type": "Tax" - } + "account_type": "Tax", + "account_category": "Current Tax Liabilities" + }, + "account_type": "Tax", + "is_group": 1, + "account_category": "Current Tax Liabilities" }, "Loans (Liabilities)": { - "Secured Loans": {}, - "Unsecured Loans": {}, - "Bank Overdraft Account": {} + "Secured Loans": { + "account_category": "Long-term Borrowings" + }, + "Unsecured Loans": { + "account_category": "Long-term Borrowings" + }, + "Bank Overdraft Account": { + "account_category": "Short-term Borrowings" + } } }, "root_type": "Liability" diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index 80ccc549d75..3629102ea5a 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -2,7 +2,6 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.accounts.doctype.account.account import ( @@ -11,11 +10,10 @@ from erpnext.accounts.doctype.account.account import ( update_account_number, ) from erpnext.stock import get_company_default_inventory_account, get_warehouse_account - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Company"] +from erpnext.tests.utils import ERPNextTestSuite -class TestAccount(IntegrationTestCase): +class TestAccount(ERPNextTestSuite): def test_rename_account(self): if not frappe.db.exists("Account", "1210 - Debtors - _TC"): acc = frappe.new_doc("Account") diff --git a/erpnext/accounts/doctype/account/test_records.json b/erpnext/accounts/doctype/account/test_records.json deleted file mode 100644 index d15f7ad4c0a..00000000000 --- a/erpnext/accounts/doctype/account/test_records.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "doctype": "Account", - "name": "_Test Account 1" - } -] diff --git a/erpnext/accounts/doctype/account_category/test_account_category.py b/erpnext/accounts/doctype/account_category/test_account_category.py index ea3c2c7783c..e695b11bcb5 100644 --- a/erpnext/accounts/doctype/account_category/test_account_category.py +++ b/erpnext/accounts/doctype/account_category/test_account_category.py @@ -2,19 +2,3 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase - -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] - - -class IntegrationTestAccountCategory(IntegrationTestCase): - """ - Integration tests for AccountCategory. - Use this class for testing interactions between multiple components. - """ - - pass diff --git a/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.js b/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.js index e35591474b1..d5d109a324f 100644 --- a/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.js +++ b/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.js @@ -1,8 +1,8 @@ // Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -// frappe.ui.form.on("Account Closing Balance", { -// refresh(frm) { - -// }, -// }); +frappe.ui.form.on("Account Closing Balance", { + refresh(frm) { + frm.page.btn_secondary.hide(); + }, +}); diff --git a/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json b/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json index b980a8378a9..c17a79642dd 100644 --- a/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json +++ b/erpnext/accounts/doctype/account_closing_balance/account_closing_balance.json @@ -5,6 +5,7 @@ "doctype": "DocType", "document_type": "Document", "engine": "InnoDB", + "is_submittable": 1, "field_order": [ "closing_date", "account", diff --git a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py index 53f4e5d15af..a39bd00579e 100644 --- a/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py +++ b/erpnext/accounts/doctype/account_closing_balance/test_account_closing_balance.py @@ -2,8 +2,9 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountClosingBalance(IntegrationTestCase): +class TestAccountClosingBalance(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py index f14e7d2b21d..3bc4c1c6382 100644 --- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py +++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py @@ -2,15 +2,13 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Cost Center", "Location", "Warehouse", "Department"] +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountingDimension(IntegrationTestCase): +class TestAccountingDimension(ERPNextTestSuite): def setUp(self): create_dimension() @@ -79,11 +77,6 @@ class TestAccountingDimension(IntegrationTestCase): si.save() self.assertRaises(frappe.ValidationError, si.submit) - def tearDown(self): - disable_dimension() - frappe.flags.accounting_dimensions_details = None - frappe.flags.dimension_filter_map = None - def create_dimension(): frappe.set_user("Administrator") diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py index bff288cf4d8..9bed10824bb 100644 --- a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py +++ b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py @@ -11,11 +11,10 @@ from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension imp ) from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Location", "Cost Center", "Department"] +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountingDimensionFilter(unittest.TestCase): +class TestAccountingDimensionFilter(ERPNextTestSuite): def setUp(self): create_dimension() create_accounting_dimension_filter() @@ -44,17 +43,6 @@ class TestAccountingDimensionFilter(unittest.TestCase): self.assertRaises(MandatoryAccountDimensionError, si.submit) self.invoice_list.append(si) - def tearDown(self): - disable_dimension_filter() - disable_dimension() - frappe.flags.accounting_dimensions_details = None - frappe.flags.dimension_filter_map = None - - for si in self.invoice_list: - si.load_from_db() - if si.docstatus == 1: - si.cancel() - def create_accounting_dimension_filter(): if not frappe.db.get_value("Accounting Dimension Filter", {"accounting_dimension": "Cost Center"}): diff --git a/erpnext/accounts/doctype/accounting_period/accounting_period.json b/erpnext/accounts/doctype/accounting_period/accounting_period.json index 2fb69f6b97c..10c6b72ec88 100644 --- a/erpnext/accounts/doctype/accounting_period/accounting_period.json +++ b/erpnext/accounts/doctype/accounting_period/accounting_period.json @@ -20,7 +20,6 @@ { "fieldname": "period_name", "fieldtype": "Data", - "in_list_view": 1, "label": "Period Name", "reqd": 1, "unique": 1 @@ -79,7 +78,7 @@ } ], "links": [], - "modified": "2025-12-01 16:53:44.631299", + "modified": "2026-03-09 17:15:33.577217", "modified_by": "Administrator", "module": "Accounts", "name": "Accounting Period", diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py index d8ad730a960..dccc5f8e0f7 100644 --- a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py +++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_months, nowdate from erpnext.accounts.doctype.accounting_period.accounting_period import ( @@ -10,11 +9,10 @@ from erpnext.accounts.doctype.accounting_period.accounting_period import ( OverlapError, ) from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"] +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountingPeriod(IntegrationTestCase): +class TestAccountingPeriod(ERPNextTestSuite): def test_overlap(self): ap1 = create_accounting_period( start_date="2018-04-01", end_date="2018-06-30", company="Wind Power LLC" @@ -89,10 +87,6 @@ class TestAccountingPeriod(IntegrationTestCase): doc.submit() # Should not raise self.assertEqual(doc.docstatus, 1) - def tearDown(self): - for d in frappe.get_all("Accounting Period"): - frappe.delete_doc("Accounting Period", d.name) - def create_accounting_period(**args): args = frappe._dict(args) diff --git a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py index ba7bbe91386..d41e13ffe43 100644 --- a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.py @@ -1,15 +1,9 @@ import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountsSettings(IntegrationTestCase): - def tearDown(self): - # Just in case `save` method succeeds, we need to take things back to default so that other tests - # don't break - cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings") - cur_settings.allow_stale = 1 - cur_settings.save() - +class TestAccountsSettings(ERPNextTestSuite): def test_stale_days(self): cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings") cur_settings.allow_stale = 0 diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js index 24b82fa8025..bf9abdbc21c 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.js @@ -3,6 +3,7 @@ frappe.ui.form.on("Advance Payment Ledger Entry", { refresh(frm) { + frm.page.btn_secondary.hide(); frm.set_currency_labels(["amount"], frm.doc.currency); frm.set_currency_labels(["base_amount"], erpnext.get_currency(frm.doc.company)); }, diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json index 1bf909117a8..2783cb1bda4 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json @@ -4,6 +4,7 @@ "creation": "2024-10-16 16:57:12.085072", "doctype": "DocType", "engine": "InnoDB", + "is_submittable": 1, "field_order": [ "company", "voucher_type", diff --git a/erpnext/accounts/doctype/advance_payment_ledger_entry/test_advance_payment_ledger_entry.py b/erpnext/accounts/doctype/advance_payment_ledger_entry/test_advance_payment_ledger_entry.py index f824e6893e4..53047b61718 100644 --- a/erpnext/accounts/doctype/advance_payment_ledger_entry/test_advance_payment_ledger_entry.py +++ b/erpnext/accounts/doctype/advance_payment_ledger_entry/test_advance_payment_ledger_entry.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate, today from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry @@ -10,14 +9,13 @@ from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order -# On IntegrationTestCase, the doctype test records and all +# On ERPNextTestSuite, the doctype test records and all # link-field test record depdendencies are recursively loaded # Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] +from erpnext.tests.utils import ERPNextTestSuite -class TestAdvancePaymentLedgerEntry(AccountsTestMixin, IntegrationTestCase): +class TestAdvancePaymentLedgerEntry(AccountsTestMixin, ERPNextTestSuite): """ Integration tests for AdvancePaymentLedgerEntry. Use this class for testing interactions between multiple components. @@ -30,9 +28,6 @@ class TestAdvancePaymentLedgerEntry(AccountsTestMixin, IntegrationTestCase): self.create_item() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_sales_order(self, qty=1, rate=100, currency="INR", do_not_submit=False): """ Helper method diff --git a/erpnext/accounts/doctype/bank/test_bank.py b/erpnext/accounts/doctype/bank/test_bank.py index 6aa57089ddd..c17b2437cb8 100644 --- a/erpnext/accounts/doctype/bank/test_bank.py +++ b/erpnext/accounts/doctype/bank/test_bank.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBank(IntegrationTestCase): +class TestBank(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bank_account/test_bank_account.py b/erpnext/accounts/doctype/bank_account/test_bank_account.py index 70cb8afc267..a1f785e58b0 100644 --- a/erpnext/accounts/doctype/bank_account/test_bank_account.py +++ b/erpnext/accounts/doctype/bank_account/test_bank_account.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBankAccount(IntegrationTestCase): +class TestBankAccount(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bank_account_subtype/test_bank_account_subtype.py b/erpnext/accounts/doctype/bank_account_subtype/test_bank_account_subtype.py index a8ab617ff41..4b4aae093a3 100644 --- a/erpnext/accounts/doctype/bank_account_subtype/test_bank_account_subtype.py +++ b/erpnext/accounts/doctype/bank_account_subtype/test_bank_account_subtype.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBankAccountSubtype(IntegrationTestCase): +class TestBankAccountSubtype(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bank_account_type/test_bank_account_type.py b/erpnext/accounts/doctype/bank_account_type/test_bank_account_type.py index ad7647a41fa..dd92be43268 100644 --- a/erpnext/accounts/doctype/bank_account_type/test_bank_account_type.py +++ b/erpnext/accounts/doctype/bank_account_type/test_bank_account_type.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBankAccountType(IntegrationTestCase): +class TestBankAccountType(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py index 5a8b7e36243..f7451830e1d 100644 --- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py +++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py @@ -5,7 +5,9 @@ import frappe from frappe import _, msgprint from frappe.model.document import Document +from frappe.query_builder import Case from frappe.query_builder.custom import ConstantColumn +from frappe.query_builder.functions import Coalesce, Sum from frappe.utils import cint, flt, fmt_money, getdate from pypika import Order @@ -182,65 +184,162 @@ def get_payment_entries_for_bank_clearance( ): entries = [] - condition = "" - pe_condition = "" + journal_entry = frappe.qb.DocType("Journal Entry") + journal_entry_account = frappe.qb.DocType("Journal Entry Account") + + journal_entry_query = ( + frappe.qb.from_(journal_entry_account) + .inner_join(journal_entry) + .on(journal_entry_account.parent == journal_entry.name) + .select( + ConstantColumn("Journal Entry").as_("payment_document"), + journal_entry.name.as_("payment_entry"), + journal_entry.cheque_no.as_("cheque_number"), + journal_entry.cheque_date, + Sum(journal_entry_account.debit_in_account_currency).as_("debit"), + Sum(journal_entry_account.credit_in_account_currency).as_("credit"), + journal_entry.posting_date, + journal_entry_account.against_account, + journal_entry.clearance_date, + journal_entry_account.account_currency, + ) + .where( + (journal_entry_account.account == account) + & (journal_entry.docstatus == 1) + & (journal_entry.posting_date >= from_date) + & (journal_entry.posting_date <= to_date) + & (journal_entry.is_opening == "No") + ) + ) + if not include_reconciled_entries: - condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')" - pe_condition = "and (pe.clearance_date IS NULL or pe.clearance_date='0000-00-00')" + journal_entry_query = journal_entry_query.where( + (journal_entry.clearance_date.isnull()) | (journal_entry.clearance_date == "0000-00-00") + ) - journal_entries = frappe.db.sql( - f""" - select - "Journal Entry" as payment_document, t1.name as payment_entry, - t1.cheque_no as cheque_number, t1.cheque_date, - sum(t2.debit_in_account_currency) as debit, sum(t2.credit_in_account_currency) as credit, - t1.posting_date, t2.against_account, t1.clearance_date, t2.account_currency - from - `tabJournal Entry` t1, `tabJournal Entry Account` t2 - where - t2.parent = t1.name and t2.account = %(account)s and t1.docstatus=1 - and t1.posting_date >= %(from)s and t1.posting_date <= %(to)s - and ifnull(t1.is_opening, 'No') = 'No' {condition} - group by t2.account, t1.name - order by t1.posting_date ASC, t1.name DESC - """, - {"account": account, "from": from_date, "to": to_date}, - as_dict=1, + journal_entries = ( + journal_entry_query.groupby(journal_entry_account.account, journal_entry.name) + .orderby(journal_entry.posting_date) + .orderby(journal_entry.name, order=Order.desc) + ).run(as_dict=True) + + pe = frappe.qb.DocType("Payment Entry") + company = frappe.qb.DocType("Company") + payment_entry_query = ( + frappe.qb.from_(pe) + .join(company) + .on(pe.company == company.name) + .select( + ConstantColumn("Payment Entry").as_("payment_document"), + pe.name.as_("payment_entry"), + pe.reference_no.as_("cheque_number"), + pe.reference_date.as_("cheque_date"), + ( + Case() + .when( + pe.paid_from == account, + ( + pe.paid_amount + + ( + Case() + .when( + (pe.payment_type == "Pay") + & (company.default_currency == pe.paid_from_account_currency), + pe.base_total_taxes_and_charges, + ) + .else_(pe.total_taxes_and_charges) + ) + ), + ) + .else_(0) + ).as_("credit"), + ( + Case() + .when(pe.paid_from == account, 0) + .else_( + pe.received_amount + + ( + Case() + .when( + company.default_currency == pe.paid_to_account_currency, + pe.base_total_taxes_and_charges, + ) + .else_(pe.total_taxes_and_charges) + ) + ) + ).as_("debit"), + pe.posting_date, + Coalesce(pe.party, Case().when(pe.paid_from == account, pe.paid_to).else_(pe.paid_from)).as_( + "against_account" + ), + pe.clearance_date, + ( + Case() + .when(pe.paid_to == account, pe.paid_to_account_currency) + .else_(pe.paid_from_account_currency) + ).as_("account_currency"), + ) + .where( + ((pe.paid_from == account) | (pe.paid_to == account)) + & (pe.docstatus == 1) + & (pe.posting_date >= from_date) + & (pe.posting_date <= to_date) + ) ) - payment_entries = frappe.db.sql( - f""" - select - "Payment Entry" as payment_document, pe.name as payment_entry, - pe.reference_no as cheque_number, pe.reference_date as cheque_date, - if(pe.paid_from=%(account)s, pe.paid_amount + if(pe.payment_type = 'Pay' and c.default_currency = pe.paid_from_account_currency, pe.base_total_taxes_and_charges, pe.total_taxes_and_charges) , 0) as credit, - if(pe.paid_from=%(account)s, 0, pe.received_amount + pe.total_taxes_and_charges) as debit, - pe.posting_date, ifnull(pe.party,if(pe.paid_from=%(account)s,pe.paid_to,pe.paid_from)) as against_account, pe.clearance_date, - if(pe.paid_to=%(account)s, pe.paid_to_account_currency, pe.paid_from_account_currency) as account_currency - from `tabPayment Entry` as pe - join `tabCompany` c on c.name = pe.company - where - (pe.paid_from=%(account)s or pe.paid_to=%(account)s) and pe.docstatus=1 - and pe.posting_date >= %(from)s and pe.posting_date <= %(to)s - {pe_condition} - order by - pe.posting_date ASC, pe.name DESC - """, - { - "account": account, - "from": from_date, - "to": to_date, - }, - as_dict=1, + if not include_reconciled_entries: + payment_entry_query = payment_entry_query.where( + (pe.clearance_date.isnull()) | (pe.clearance_date == "0000-00-00") + ) + + payment_entries = (payment_entry_query.orderby(pe.posting_date).orderby(pe.name, order=Order.desc)).run( + as_dict=True ) - pos_sales_invoices, pos_purchase_invoices = [], [] + acc = frappe.qb.DocType("Account") + + pi = frappe.qb.DocType("Purchase Invoice") + + paid_purchase_invoices_query = ( + frappe.qb.from_(pi) + .inner_join(acc) + .on(pi.cash_bank_account == acc.name) + .select( + ConstantColumn("Purchase Invoice").as_("payment_document"), + pi.name.as_("payment_entry"), + pi.paid_amount.as_("credit"), + pi.posting_date, + pi.supplier.as_("against_account"), + pi.bill_no.as_("cheque_number"), + pi.clearance_date, + acc.account_currency, + ConstantColumn(0).as_("debit"), + ) + .where( + (pi.docstatus == 1) + & (pi.is_paid == 1) + & (pi.cash_bank_account == account) + & (pi.posting_date >= from_date) + & (pi.posting_date <= to_date) + ) + ) + + if not include_reconciled_entries: + paid_purchase_invoices_query = paid_purchase_invoices_query.where( + (pi.clearance_date.isnull()) | (pi.clearance_date == "0000-00-00") + ) + + paid_purchase_invoices = ( + paid_purchase_invoices_query.orderby(pi.posting_date).orderby(pi.name, order=Order.desc) + ).run(as_dict=True) + + pos_sales_invoices = [] + if include_pos_transactions: si_payment = frappe.qb.DocType("Sales Invoice Payment") si = frappe.qb.DocType("Sales Invoice") - acc = frappe.qb.DocType("Account") - pos_sales_invoices = ( + pos_sales_invoices_query = ( frappe.qb.from_(si_payment) .inner_join(si) .on(si_payment.parent == si.name) @@ -263,38 +362,22 @@ def get_payment_entries_for_bank_clearance( & (si.posting_date >= from_date) & (si.posting_date <= to_date) ) - .orderby(si.posting_date) - .orderby(si.name, order=Order.desc) - ).run(as_dict=True) + ) - pi = frappe.qb.DocType("Purchase Invoice") + if not include_reconciled_entries: + pos_sales_invoices_query = pos_sales_invoices_query.where( + (si_payment.clearance_date.isnull()) | (si_payment.clearance_date == "0000-00-00") + ) - pos_purchase_invoices = ( - frappe.qb.from_(pi) - .inner_join(acc) - .on(pi.cash_bank_account == acc.name) - .select( - ConstantColumn("Purchase Invoice").as_("payment_document"), - pi.name.as_("payment_entry"), - pi.paid_amount.as_("credit"), - pi.posting_date, - pi.supplier.as_("against_account"), - pi.clearance_date, - acc.account_currency, - ConstantColumn(0).as_("debit"), - ) - .where( - (pi.docstatus == 1) - & (pi.cash_bank_account == account) - & (pi.posting_date >= from_date) - & (pi.posting_date <= to_date) - ) - .orderby(pi.posting_date) - .orderby(pi.name, order=Order.desc) + pos_sales_invoices = ( + pos_sales_invoices_query.orderby(si.posting_date).orderby(si.name, order=Order.desc) ).run(as_dict=True) entries = ( - list(payment_entries) + list(journal_entries) + list(pos_sales_invoices) + list(pos_purchase_invoices) + list(payment_entries) + + list(journal_entries) + + list(pos_sales_invoices) + + list(paid_purchase_invoices) ) return entries diff --git a/erpnext/accounts/doctype/bank_clearance/test_bank_clearance.py b/erpnext/accounts/doctype/bank_clearance/test_bank_clearance.py index 3416a4e78a4..1190ffac9f3 100644 --- a/erpnext/accounts/doctype/bank_clearance/test_bank_clearance.py +++ b/erpnext/accounts/doctype/bank_clearance/test_bank_clearance.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_months, getdate from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center @@ -14,13 +13,12 @@ from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.stock.doctype.item.test_item import create_item from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse -from erpnext.tests.utils import if_lending_app_installed, if_lending_app_not_installed +from erpnext.tests.utils import ERPNextTestSuite, if_lending_app_installed, if_lending_app_not_installed -class TestBankClearance(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestBankClearance(ERPNextTestSuite): + def setUp(self): + frappe.clear_cache() create_warehouse( warehouse_name="_Test Warehouse", properties={"parent_warehouse": "All Warehouses - _TC"}, diff --git a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py index 7aee2ccb6ff..c5ad4d20940 100644 --- a/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py +++ b/erpnext/accounts/doctype/bank_guarantee/test_bank_guarantee.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBankGuarantee(IntegrationTestCase): +class TestBankGuarantee(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py index 6f8ab21ccf7..59c3573b1b3 100644 --- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py +++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py @@ -59,7 +59,7 @@ def get_bank_transactions( filters.append(["date", "<=", to_date]) if from_date: filters.append(["date", ">=", from_date]) - transactions = frappe.get_all( + transactions = frappe.get_list( "Bank Transaction", fields=[ "date", @@ -84,6 +84,7 @@ def get_bank_transactions( @frappe.whitelist() def get_account_balance(bank_account: str, till_date: str | date, company: str): # returns account balance till the specified date + frappe.has_permission("Bank Account", "read", bank_account, throw=True) account = frappe.db.get_value("Bank Account", bank_account, "account") filters = frappe._dict( { diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py index 53586b333b4..5354aa0c4dd 100644 --- a/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py +++ b/erpnext/accounts/doctype/bank_reconciliation_tool/test_bank_reconciliation_tool.py @@ -4,7 +4,6 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import ( @@ -13,9 +12,10 @@ from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool ) from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase): +class TestBankReconciliationTool(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() @@ -24,9 +24,6 @@ class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase): qb.from_(bank_dt).delete().where(bank_dt.name == "HDFC").run() self.create_bank_account() - def tearDown(self): - frappe.db.rollback() - def create_bank_account(self): bank = frappe.get_doc( { @@ -43,6 +40,7 @@ class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase): "bank": bank.name, "is_company_account": True, "account": self.bank, # account from Chart of Accounts + "company": self.company, } ) .insert() diff --git a/erpnext/accounts/doctype/bank_statement_import/test_bank_statement_import.py b/erpnext/accounts/doctype/bank_statement_import/test_bank_statement_import.py index 3e1cee9115e..2ae00059c83 100644 --- a/erpnext/accounts/doctype/bank_statement_import/test_bank_statement_import.py +++ b/erpnext/accounts/doctype/bank_statement_import/test_bank_statement_import.py @@ -1,15 +1,14 @@ # Copyright (c) 2020, Frappe Technologies and Contributors # See license.txt -import unittest - from erpnext.accounts.doctype.bank_statement_import.bank_statement_import import ( is_mt940_format, preprocess_mt940_content, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestBankStatementImport(unittest.TestCase): +class TestBankStatementImport(ERPNextTestSuite): """Unit tests for Bank Statement Import functions""" def test_preprocess_mt940_content_with_long_statement_number(self): diff --git a/erpnext/accounts/doctype/bank_transaction/test_auto_match_party.py b/erpnext/accounts/doctype/bank_transaction/test_auto_match_party.py index da2c28a148c..bb1e436c5f7 100644 --- a/erpnext/accounts/doctype/bank_transaction/test_auto_match_party.py +++ b/erpnext/accounts/doctype/bank_transaction/test_auto_match_party.py @@ -2,27 +2,20 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import create_bank_account +from erpnext.tests.utils import ERPNextTestSuite IBAN_1 = "DE02000000003716541159" IBAN_2 = "DE02500105170137075030" -class TestAutoMatchParty(IntegrationTestCase): - @classmethod - def setUpClass(cls): +class TestAutoMatchParty(ERPNextTestSuite): + def setUp(self): create_bank_account() frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 1) frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 1) - return super().setUpClass() - - @classmethod - def tearDownClass(cls): - frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 0) - frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 0) def test_match_by_account_number(self): create_supplier_for_match(account_no=IBAN_1[11:]) diff --git a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py index e04c67e54d4..c69d255c51a 100644 --- a/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/test_bank_transaction.py @@ -6,7 +6,6 @@ import json import frappe from frappe import utils from frappe.model.docstatus import DocStatus -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import ( get_linked_payments, @@ -19,12 +18,10 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_paymen from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice -from erpnext.tests.utils import if_lending_app_installed - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Cost Center"] +from erpnext.tests.utils import ERPNextTestSuite, if_lending_app_installed -class TestBankTransaction(IntegrationTestCase): +class TestBankTransaction(ERPNextTestSuite): def setUp(self): make_pos_profile() diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py index fd1793b2560..55e4811a87f 100644 --- a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py +++ b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestBisectAccountingStatements(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestBisectAccountingStatements(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py index 1f37009d8e2..082b2a28f1f 100644 --- a/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py +++ b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestBisectNodes(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestBisectNodes(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/budget/test_budget.py b/erpnext/accounts/doctype/budget/test_budget.py index 866f9cb322d..d3dc7476c98 100644 --- a/erpnext/accounts/doctype/budget/test_budget.py +++ b/erpnext/accounts/doctype/budget/test_budget.py @@ -17,12 +17,6 @@ from erpnext.tests.utils import ERPNextTestSuite class TestBudget(ERPNextTestSuite): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.make_monthly_distribution() - cls.make_projects() - def setUp(self): frappe.db.set_single_value("Accounts Settings", "use_legacy_budget_controller", False) self.company = "_Test Company" diff --git a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py index 2852caeca1c..7a38d8a9a93 100644 --- a/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py +++ b/erpnext/accounts/doctype/cashier_closing/test_cashier_closing.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestCashierClosing(IntegrationTestCase): +class TestCashierClosing(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py b/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py index fab0808e1d1..f1248393aca 100644 --- a/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py +++ b/erpnext/accounts/doctype/chart_of_accounts_importer/test_chart_of_accounts_importer.py @@ -1,8 +1,8 @@ # Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestChartofAccountsImporter(IntegrationTestCase): +class TestChartofAccountsImporter(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py b/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py index c46a1c73aff..23e95efe6bd 100644 --- a/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py +++ b/erpnext/accounts/doctype/cheque_print_template/test_cheque_print_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestChequePrintTemplate(IntegrationTestCase): +class TestChequePrintTemplate(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/cost_center/test_cost_center.py b/erpnext/accounts/doctype/cost_center/test_cost_center.py index 87b4acaefcf..3c3a60d4885 100644 --- a/erpnext/accounts/doctype/cost_center/test_cost_center.py +++ b/erpnext/accounts/doctype/cost_center/test_cost_center.py @@ -2,10 +2,11 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestCostCenter(IntegrationTestCase): +class TestCostCenter(ERPNextTestSuite): def test_cost_center_creation_against_child_node(self): cost_center = frappe.get_doc( { diff --git a/erpnext/accounts/doctype/cost_center/test_records.json b/erpnext/accounts/doctype/cost_center/test_records.json deleted file mode 100644 index 941a85b382d..00000000000 --- a/erpnext/accounts/doctype/cost_center/test_records.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "company": "_Test Company", - "cost_center_name": "_Test Cost Center", - "doctype": "Cost Center", - "is_group": 0, - "parent_cost_center": "_Test Company - _TC" - }, - { - "company": "_Test Company", - "cost_center_name": "_Test Cost Center 2", - "doctype": "Cost Center", - "is_group": 0, - "parent_cost_center": "_Test Company - _TC" - }, - { - "company": "_Test Company", - "cost_center_name": "_Test Write Off Cost Center", - "doctype": "Cost Center", - "is_group": 0, - "parent_cost_center": "_Test Company - _TC" - } -] diff --git a/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py b/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py index 449730bc8c3..dac04501e0f 100644 --- a/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py +++ b/erpnext/accounts/doctype/cost_center_allocation/test_cost_center_allocation.py @@ -3,7 +3,6 @@ import frappe from frappe.query_builder.functions import Sum -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center @@ -15,9 +14,10 @@ from erpnext.accounts.doctype.cost_center_allocation.cost_center_allocation impo WrongPercentageAllocation, ) from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestCostCenterAllocation(IntegrationTestCase): +class TestCostCenterAllocation(ERPNextTestSuite): def setUp(self): cost_centers = [ "Main Cost Center 1", @@ -190,7 +190,7 @@ class TestCostCenterAllocation(IntegrationTestCase): coa2.cancel() jv.cancel() - @IntegrationTestCase.change_settings("System Settings", {"rounding_method": "Commercial Rounding"}) + @ERPNextTestSuite.change_settings("System Settings", {"rounding_method": "Commercial Rounding"}) def test_debit_credit_on_cost_center_allocation_for_commercial_rounding(self): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice diff --git a/erpnext/accounts/doctype/coupon_code/test_coupon_code.py b/erpnext/accounts/doctype/coupon_code/test_coupon_code.py index d8e134b8502..ba4e7c0b191 100644 --- a/erpnext/accounts/doctype/coupon_code/test_coupon_code.py +++ b/erpnext/accounts/doctype/coupon_code/test_coupon_code.py @@ -2,11 +2,9 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"] +from erpnext.tests.utils import ERPNextTestSuite def test_create_test_data(): @@ -87,6 +85,7 @@ def test_create_test_data(): "partner_name": "_Test Coupon Partner", "commission_rate": 2, "referral_code": "COPART", + "territory": "All Territories", } ) sales_partner.insert() @@ -109,13 +108,10 @@ def test_create_test_data(): coupon_code.insert() -class TestCouponCode(IntegrationTestCase): +class TestCouponCode(ERPNextTestSuite): def setUp(self): test_create_test_data() - def tearDown(self): - frappe.set_user("Administrator") - def test_sales_order_with_coupon_code(self): frappe.db.set_value("Coupon Code", "SAVE30", "used", 0) diff --git a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json index ae3dbd59d69..9f0852bb686 100644 --- a/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json +++ b/erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json @@ -101,11 +101,11 @@ "label": "Use HTTP Protocol" } ], - "hide_toolbar": 1, + "hide_toolbar": 0, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-02 18:19:02.873815", + "modified": "2026-03-16 13:28:21.075743", "modified_by": "Administrator", "module": "Accounts", "name": "Currency Exchange Settings", diff --git a/erpnext/accounts/doctype/currency_exchange_settings/test_currency_exchange_settings.py b/erpnext/accounts/doctype/currency_exchange_settings/test_currency_exchange_settings.py index 202e674c552..8d91dfe6a63 100644 --- a/erpnext/accounts/doctype/currency_exchange_settings/test_currency_exchange_settings.py +++ b/erpnext/accounts/doctype/currency_exchange_settings/test_currency_exchange_settings.py @@ -2,8 +2,8 @@ # For license information, please see license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestCurrencyExchangeSettings(IntegrationTestCase): +class TestCurrencyExchangeSettings(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py index 4ba44a2a3c9..6eaf1d8798e 100644 --- a/erpnext/accounts/doctype/dunning/test_dunning.py +++ b/erpnext/accounts/doctype/dunning/test_dunning.py @@ -4,37 +4,20 @@ import json import frappe from frappe.model import mapper -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate, today from erpnext import get_default_cost_center from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry -from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import ( - unlink_payment_on_cancel_of_invoice, -) from erpnext.accounts.doctype.sales_invoice.sales_invoice import ( create_dunning as create_dunning_from_sales_invoice, ) from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import ( create_sales_invoice_against_cost_center, ) - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Company", "Cost Center"] +from erpnext.tests.utils import ERPNextTestSuite -class TestDunning(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1) - create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0) - unlink_payment_on_cancel_of_invoice() - - @classmethod - def tearDownClass(cls): - unlink_payment_on_cancel_of_invoice(0) - super().tearDownClass() - +class TestDunning(ERPNextTestSuite): def test_dunning_without_fees(self): dunning = create_dunning(overdue_days=20) diff --git a/erpnext/accounts/doctype/dunning_type/test_dunning_type.py b/erpnext/accounts/doctype/dunning_type/test_dunning_type.py index ea176fbcf47..1e58e56570b 100644 --- a/erpnext/accounts/doctype/dunning_type/test_dunning_type.py +++ b/erpnext/accounts/doctype/dunning_type/test_dunning_type.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestDunningType(IntegrationTestCase): +class TestDunningType(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/dunning_type/test_records.json b/erpnext/accounts/doctype/dunning_type/test_records.json deleted file mode 100644 index 7f28aab873c..00000000000 --- a/erpnext/accounts/doctype/dunning_type/test_records.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "doctype": "Dunning Type", - "dunning_type": "_Test First Notice", - "company": "_Test Company", - "is_default": 1, - "dunning_fee": 0.0, - "rate_of_interest": 0.0, - "dunning_letter_text": [ - { - "language": "en", - "body_text": "We have still not received payment for our invoice", - "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees." - } - ], - "income_account": "Sales - _TC", - "cost_center": "_Test Cost Center - _TC" - }, - { - "doctype": "Dunning Type", - "dunning_type": "_Test Second Notice", - "company": "_Test Company", - "is_default": 0, - "dunning_fee": 10.0, - "rate_of_interest": 10.0, - "dunning_letter_text": [ - { - "language": "en", - "body_text": "We have still not received payment for our invoice", - "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees." - } - ], - "income_account": "Sales - _TC", - "cost_center": "_Test Cost Center - _TC" - } -] diff --git a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py index 96079284dd9..1310a8b482b 100644 --- a/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py +++ b/erpnext/accounts/doctype/exchange_rate_revaluation/test_exchange_rate_revaluation.py @@ -5,15 +5,15 @@ import frappe from frappe.query_builder import functions from frappe.query_builder.utils import DocType -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): +class TestExchangeRateRevaluation(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_usd_receivable_account() @@ -22,14 +22,13 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): self.clear_old_entries() self.set_system_and_company_settings() - def tearDown(self): - frappe.db.rollback() - def set_system_and_company_settings(self): # set number and currency precision system_settings = frappe.get_doc("System Settings") system_settings.float_precision = 2 system_settings.currency_precision = 2 + system_settings.language = "en" + system_settings.time_zone = "Asia/Kolkata" system_settings.save() # Using Exchange Gain/Loss account for unrealized as well. @@ -37,7 +36,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): company_doc.unrealized_exchange_gain_loss_account = company_doc.exchange_gain_loss_account company_doc.save() - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0}, ) @@ -91,7 +90,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): )[0] self.assertEqual(acc_balance.balance, 8500.0) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0}, ) @@ -164,7 +163,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): self.assertEqual(acc_balance.balance, 0.0) self.assertEqual(acc_balance.balance_in_account_currency, 0.0) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0}, ) @@ -259,7 +258,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase): self.assertEqual(flt(acc_balance.balance, precision), 0.0) self.assertEqual(flt(acc_balance.balance_in_account_currency, precision), 0.0) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0}, ) diff --git a/erpnext/accounts/doctype/finance_book/test_finance_book.py b/erpnext/accounts/doctype/finance_book/test_finance_book.py index f69ff2425a5..d9d6c0e44ab 100644 --- a/erpnext/accounts/doctype/finance_book/test_finance_book.py +++ b/erpnext/accounts/doctype/finance_book/test_finance_book.py @@ -2,12 +2,12 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestFinanceBook(IntegrationTestCase): +class TestFinanceBook(ERPNextTestSuite): def test_finance_book(self): finance_book = create_finance_book() diff --git a/erpnext/accounts/doctype/financial_report_template/test_financial_report_engine.py b/erpnext/accounts/doctype/financial_report_template/test_financial_report_engine.py index e65e3f185a0..48bd1a5e48a 100644 --- a/erpnext/accounts/doctype/financial_report_template/test_financial_report_engine.py +++ b/erpnext/accounts/doctype/financial_report_template/test_financial_report_engine.py @@ -16,12 +16,6 @@ from erpnext.accounts.doctype.financial_report_template.test_financial_report_te from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry from erpnext.accounts.utils import get_currency_precision, get_fiscal_year -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] - class TestDependencyResolver(FinancialReportTemplateTestCase): """Test cases for DependencyResolver class""" diff --git a/erpnext/accounts/doctype/financial_report_template/test_financial_report_template.py b/erpnext/accounts/doctype/financial_report_template/test_financial_report_template.py index ef5404bd478..9372c503d12 100644 --- a/erpnext/accounts/doctype/financial_report_template/test_financial_report_template.py +++ b/erpnext/accounts/doctype/financial_report_template/test_financial_report_template.py @@ -2,29 +2,16 @@ # For license information, please see license.txt import frappe -from frappe.tests import IntegrationTestCase -from frappe.tests.utils import make_test_records -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] +from erpnext.tests.utils import ERPNextTestSuite -class TestFinancialReportTemplate(IntegrationTestCase): - pass - - -class FinancialReportTemplateTestCase(IntegrationTestCase): +class FinancialReportTemplateTestCase(ERPNextTestSuite): """Utility class with common setup and helper methods for all test classes""" - @classmethod - def setUpClass(cls): + def setUp(self): """Set up test data""" - make_test_records("Company") - make_test_records("Fiscal Year") - cls.create_test_template() + self.create_test_template() @classmethod def create_test_template(cls): diff --git a/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py index db08e80a0d1..26358399cde 100644 --- a/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py +++ b/erpnext/accounts/doctype/fiscal_year/test_fiscal_year.py @@ -2,13 +2,12 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import now_datetime -IGNORE_TEST_RECORD_DEPENDENCIES = ["Company"] +from erpnext.tests.utils import ERPNextTestSuite -class TestFiscalYear(IntegrationTestCase): +class TestFiscalYear(ERPNextTestSuite): def test_extra_year(self): if frappe.db.exists("Fiscal Year", "_Test Fiscal Year 2000"): frappe.delete_doc("Fiscal Year", "_Test Fiscal Year 2000") diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index b3afb906c6b..a8815a7d19a 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -5,6 +5,7 @@ "doctype": "DocType", "document_type": "Document", "engine": "InnoDB", + "is_submittable": 1, "field_order": [ "dates_section", "posting_date", diff --git a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py index 7f204edd4ea..6caec70dc00 100644 --- a/erpnext/accounts/doctype/gl_entry/test_gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/test_gl_entry.py @@ -3,13 +3,13 @@ import frappe from frappe.model.naming import parse_naming_series -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.gl_entry.gl_entry import rename_gle_sle_docs from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestGLEntry(IntegrationTestCase): +class TestGLEntry(ERPNextTestSuite): def test_round_off_entry(self): frappe.db.set_value("Company", "_Test Company", "round_off_account", "_Test Write Off - _TC") frappe.db.set_value("Company", "_Test Company", "round_off_cost_center", "_Test Cost Center - _TC") diff --git a/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py b/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py index a852ee3c8a3..7d92fb1e117 100644 --- a/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py +++ b/erpnext/accounts/doctype/invoice_discounting/test_invoice_discounting.py @@ -2,16 +2,16 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, nowdate from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.journal_entry.journal_entry import get_payment_entry_against_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries +from erpnext.tests.utils import ERPNextTestSuite -class TestInvoiceDiscounting(IntegrationTestCase): +class TestInvoiceDiscounting(ERPNextTestSuite): def setUp(self): self.ar_credit = create_account( account_name="_Test Accounts Receivable Credit", diff --git a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py index 144d5661550..f180c324a6d 100644 --- a/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py +++ b/erpnext/accounts/doctype/item_tax_template/test_item_tax_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestItemTaxTemplate(IntegrationTestCase): +class TestItemTaxTemplate(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/item_tax_template/test_records.json b/erpnext/accounts/doctype/item_tax_template/test_records.json deleted file mode 100644 index 4d9537d4b89..00000000000 --- a/erpnext/accounts/doctype/item_tax_template/test_records.json +++ /dev/null @@ -1,79 +0,0 @@ -[ - { - "doctype": "Item Tax Template", - "title": "_Test Account Excise Duty @ 10", - "company": "_Test Company", - "taxes": [ - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 10, - "tax_type": "_Test Account Excise Duty - _TC" - } - ] - }, - { - "doctype": "Item Tax Template", - "title": "_Test Account Excise Duty @ 12", - "company": "_Test Company", - "taxes": [ - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 12, - "tax_type": "_Test Account Excise Duty - _TC" - } - ] - }, - { - "doctype": "Item Tax Template", - "title": "_Test Account Excise Duty @ 15", - "company": "_Test Company", - "taxes": [ - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 15, - "tax_type": "_Test Account Excise Duty - _TC" - } - ] - }, - { - "doctype": "Item Tax Template", - "title": "_Test Account Excise Duty @ 20", - "company": "_Test Company", - "taxes": [ - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 20, - "tax_type": "_Test Account Excise Duty - _TC" - } - ] - }, - { - "doctype": "Item Tax Template", - "title": "_Test Item Tax Template 1", - "company": "_Test Company", - "taxes": [ - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 5, - "tax_type": "_Test Account Excise Duty - _TC" - }, - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 10, - "tax_type": "_Test Account Education Cess - _TC" - }, - { - "doctype": "Item Tax Template Detail", - "parentfield": "taxes", - "tax_rate": 15, - "tax_type": "_Test Account S&H Education Cess - _TC" - } - ] - } -] diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.json b/erpnext/accounts/doctype/journal_entry/journal_entry.json index 45e9c4eab85..0856f41bb09 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.json +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.json @@ -140,6 +140,7 @@ { "fieldname": "company", "fieldtype": "Link", + "in_list_view": 1, "in_standard_filter": 1, "label": "Company", "oldfieldname": "company", @@ -181,7 +182,6 @@ "fieldname": "cheque_no", "fieldtype": "Data", "in_global_search": 1, - "in_list_view": 1, "label": "Reference Number", "mandatory_depends_on": "eval:doc.voucher_type == \"Bank Entry\"", "no_copy": 1, @@ -665,7 +665,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-02-16 16:06:10.468482", + "modified": "2026-03-09 17:15:26.569327", "modified_by": "Administrator", "module": "Accounts", "name": "Journal Entry", diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 4f6e8b7507e..d2eb3b23dda 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -294,6 +294,8 @@ class JournalEntry(AccountsController): # References for this Journal are removed on the `on_cancel` event in accounts_controller super().on_cancel() + + from_doc_events = getattr(self, "ignore_linked_doctypes", ()) self.ignore_linked_doctypes = ( "GL Entry", "Stock Ledger Entry", @@ -307,6 +309,10 @@ class JournalEntry(AccountsController): "Advance Payment Ledger Entry", "Tax Withholding Entry", ) + + if from_doc_events and from_doc_events != self.ignore_linked_doctypes: + self.ignore_linked_doctypes = self.ignore_linked_doctypes + from_doc_events + self.make_gl_entries(1) JournalTaxWithholding(self).on_cancel() self.unlink_advance_entry_reference() diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py index 1a048a237bf..53d6013e1e2 100644 --- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/test_journal_entry.py @@ -2,19 +2,20 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import flt, nowdate from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.accounts.doctype.journal_entry.journal_entry import StockAccountInvalidTransaction from erpnext.exceptions import InvalidAccountCurrency from erpnext.selling.doctype.customer.test_customer import make_customer, set_credit_limit +from erpnext.tests.utils import ERPNextTestSuite -class TestJournalEntry(IntegrationTestCase): - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) +class TestJournalEntry(ERPNextTestSuite): + def setUp(self): + self.load_test_records("Journal Entry") + + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_journal_entry_with_against_jv(self): jv_invoice = frappe.copy_doc(self.globalTestRecords["Journal Entry"][2]) base_jv = frappe.copy_doc(self.globalTestRecords["Journal Entry"][0]) @@ -149,7 +150,6 @@ class TestJournalEntry(IntegrationTestCase): if account_bal == stock_bal: self.assertRaises(StockAccountInvalidTransaction, jv.save) - frappe.db.rollback() else: jv.submit() jv.cancel() diff --git a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py index d1eb1acec84..616327e8493 100644 --- a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestJournalEntryTemplate(IntegrationTestCase): +class TestJournalEntryTemplate(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/ledger_health/test_ledger_health.py b/erpnext/accounts/doctype/ledger_health/test_ledger_health.py index 0eec86ccc0f..84fd3925ded 100644 --- a/erpnext/accounts/doctype/ledger_health/test_ledger_health.py +++ b/erpnext/accounts/doctype/ledger_health/test_ledger_health.py @@ -3,23 +3,20 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.accounts.utils import run_ledger_health_checks +from erpnext.tests.utils import ERPNextTestSuite -class TestLedgerHealth(AccountsTestMixin, IntegrationTestCase): +class TestLedgerHealth(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.configure_monitoring_tool() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def configure_monitoring_tool(self): monitor_settings = frappe.get_doc("Ledger Health Monitor") monitor_settings.enable_health_monitor = True diff --git a/erpnext/accounts/doctype/ledger_health_monitor/test_ledger_health_monitor.py b/erpnext/accounts/doctype/ledger_health_monitor/test_ledger_health_monitor.py index bc2193f10ce..191a06510b9 100644 --- a/erpnext/accounts/doctype/ledger_health_monitor/test_ledger_health_monitor.py +++ b/erpnext/accounts/doctype/ledger_health_monitor/test_ledger_health_monitor.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestLedgerHealthMonitor(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestLedgerHealthMonitor(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py index c9fb000b539..ee636f16405 100644 --- a/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py +++ b/erpnext/accounts/doctype/ledger_merge/test_ledger_merge.py @@ -2,12 +2,12 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.ledger_merge.ledger_merge import start_merge +from erpnext.tests.utils import ERPNextTestSuite -class TestLedgerMerge(IntegrationTestCase): +class TestLedgerMerge(ERPNextTestSuite): def test_merge_success(self): if not frappe.db.exists("Account", "Indirect Expenses - _TC"): acc = frappe.new_doc("Account") @@ -100,16 +100,3 @@ class TestLedgerMerge(IntegrationTestCase): self.assertFalse(frappe.db.exists("Account", "Indirect Test Income - _TC")) self.assertTrue(frappe.db.exists("Account", "Administrative Test Income - _TC")) - - def tearDown(self): - for entry in frappe.db.get_all("Ledger Merge"): - frappe.delete_doc("Ledger Merge", entry.name) - - test_accounts = [ - "Indirect Test Expenses - _TC", - "Administrative Test Expenses - _TC", - "Indirect Test Income - _TC", - "Administrative Test Income - _TC", - ] - for account in test_accounts: - frappe.delete_doc_if_exists("Account", account) diff --git a/erpnext/accounts/doctype/loyalty_point_entry/test_loyalty_point_entry.py b/erpnext/accounts/doctype/loyalty_point_entry/test_loyalty_point_entry.py index 6d6579d6ed4..40a15d29909 100644 --- a/erpnext/accounts/doctype/loyalty_point_entry/test_loyalty_point_entry.py +++ b/erpnext/accounts/doctype/loyalty_point_entry/test_loyalty_point_entry.py @@ -2,31 +2,20 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today -from erpnext.accounts.doctype.loyalty_program.test_loyalty_program import create_records from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.tests.utils import ERPNextTestSuite -class TestLoyaltyPointEntry(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestLoyaltyPointEntry(ERPNextTestSuite): + def setUp(self): # Create test records - create_records() - cls.loyalty_program_name = "Test Single Loyalty" - cls.customer_name = "Test Loyalty Customer" - customer = frappe.get_doc("Customer", cls.customer_name) - customer.db_set("loyalty_program", cls.loyalty_program_name) - - @classmethod - def tearDownClass(cls): - # Delete all Loyalty Point Entries - frappe.db.sql("DELETE FROM `tabLoyalty Point Entry` WHERE customer = %s", cls.customer_name) - frappe.db.sql("DELETE FROM `tabSales Invoice` WHERE customer = %s", cls.customer_name) - frappe.db.commit() - # cls.customer.delete() + self.loyalty_program_name = "Test Single Loyalty" + self.customer_name = "Test Loyalty Customer" + customer = frappe.get_doc("Customer", self.customer_name) + customer.loyalty_program = self.loyalty_program_name + customer.save() def create_test_invoice(self, redeem=None): if redeem: @@ -68,9 +57,10 @@ class TestLoyaltyPointEntry(IntegrationTestCase): self.assertEqual(entry.discretionary_reason, "Customer Appreciation") def test_redeem_loyalty_points(self): - self.create_test_invoice(redeem=10) + self.create_test_invoice() + self.create_test_invoice(redeem=7) doc = frappe.get_last_doc("Loyalty Point Entry") - self.assertEqual(doc.loyalty_points, -10) + self.assertEqual(doc.loyalty_points, -7) # Check balance balance = frappe.db.sql( @@ -82,4 +72,4 @@ class TestLoyaltyPointEntry(IntegrationTestCase): (self.customer_name,), )[0][0] - self.assertEqual(balance, 75) # 85 added, 10 redeemed + self.assertEqual(balance, 3) # 10 added, 7 redeemed diff --git a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py index 604e95df6b8..28731e4db51 100644 --- a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py +++ b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py @@ -3,7 +3,6 @@ import unittest import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import cint, flt, getdate, today from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( @@ -11,15 +10,10 @@ from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( get_loyalty_program_details_with_points, ) from erpnext.accounts.party import get_dashboard_info +from erpnext.tests.utils import ERPNextTestSuite -class TestLoyaltyProgram(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create relevant item, customer, loyalty program, etc - create_records() - +class TestLoyaltyProgram(ERPNextTestSuite): def test_loyalty_points_earned_single_tier(self): frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty") # create a new sales invoice @@ -323,96 +317,3 @@ def create_sales_invoice_record(qty=1): ], } ) - - -def create_records(): - # create a new loyalty Account - if not frappe.db.exists("Account", "Loyalty - _TC"): - frappe.get_doc( - { - "doctype": "Account", - "account_name": "Loyalty", - "parent_account": "Direct Expenses - _TC", - "company": "_Test Company", - "is_group": 0, - "account_type": "Expense Account", - } - ).insert() - - # create a new loyalty program Single tier - if not frappe.db.exists("Loyalty Program", "Test Single Loyalty"): - frappe.get_doc( - { - "doctype": "Loyalty Program", - "loyalty_program_name": "Test Single Loyalty", - "auto_opt_in": 1, - "from_date": today(), - "loyalty_program_type": "Single Tier Program", - "conversion_factor": 1, - "expiry_duration": 10, - "company": "_Test Company", - "cost_center": "Main - _TC", - "expense_account": "Loyalty - _TC", - "collection_rules": [{"tier_name": "Bronce", "collection_factor": 1000, "min_spent": 0}], - } - ).insert() - - # create a new customer - if not frappe.db.exists("Customer", "Test Loyalty Customer"): - frappe.get_doc( - { - "customer_group": "_Test Customer Group", - "customer_name": "Test Loyalty Customer", - "customer_type": "Individual", - "doctype": "Customer", - "territory": "_Test Territory", - } - ).insert() - - # create a new loyalty program Multiple tier - if not frappe.db.exists("Loyalty Program", "Test Multiple Loyalty"): - frappe.get_doc( - { - "doctype": "Loyalty Program", - "loyalty_program_name": "Test Multiple Loyalty", - "auto_opt_in": 1, - "from_date": today(), - "loyalty_program_type": "Multiple Tier Program", - "conversion_factor": 1, - "expiry_duration": 10, - "company": "_Test Company", - "cost_center": "Main - _TC", - "expense_account": "Loyalty - _TC", - "collection_rules": [ - {"tier_name": "Bronze", "collection_factor": 1000, "min_spent": 0}, - {"tier_name": "Silver", "collection_factor": 1000, "min_spent": 10000}, - {"tier_name": "Gold", "collection_factor": 1000, "min_spent": 19000}, - ], - } - ).insert() - - # create an item - if not frappe.db.exists("Item", "Loyal Item"): - frappe.get_doc( - { - "doctype": "Item", - "item_code": "Loyal Item", - "item_name": "Loyal Item", - "item_group": "All Item Groups", - "company": "_Test Company", - "is_stock_item": 1, - "opening_stock": 100, - "valuation_rate": 10000, - } - ).insert() - - # create item price - if not frappe.db.exists("Item Price", {"price_list": "Standard Selling", "item_code": "Loyal Item"}): - frappe.get_doc( - { - "doctype": "Item Price", - "price_list": "Standard Selling", - "item_code": "Loyal Item", - "price_list_rate": 10000, - } - ).insert() diff --git a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py index 6099a7ec70a..679bbb53386 100644 --- a/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py +++ b/erpnext/accounts/doctype/mode_of_payment/test_mode_of_payment.py @@ -2,10 +2,11 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestModeofPayment(IntegrationTestCase): +class TestModeofPayment(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py index 9d6f2578639..29d148b4e92 100644 --- a/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py +++ b/erpnext/accounts/doctype/monthly_distribution/test_monthly_distribution.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestMonthlyDistribution(IntegrationTestCase): +class TestMonthlyDistribution(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py b/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py index 730d5db8ae6..3d57c781983 100644 --- a/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py +++ b/erpnext/accounts/doctype/opening_invoice_creation_tool/test_opening_invoice_creation_tool.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import ( create_dimension, @@ -11,17 +10,14 @@ from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension imp from erpnext.accounts.doctype.opening_invoice_creation_tool.opening_invoice_creation_tool import ( get_temporary_opening_account, ) - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Customer", "Supplier", "Accounting Dimension"] +from erpnext.tests.utils import ERPNextTestSuite -class TestOpeningInvoiceCreationTool(IntegrationTestCase): - @classmethod - def setUpClass(cls): +class TestOpeningInvoiceCreationTool(ERPNextTestSuite): + def setUp(self): if not frappe.db.exists("Company", "_Test Opening Invoice Company"): make_company() create_dimension() - return super().setUpClass() def make_invoices( self, @@ -149,9 +145,6 @@ class TestOpeningInvoiceCreationTool(IntegrationTestCase): } self.check_expected_values(invoices, expected_value, invoice_type="Sales") - def tearDown(self): - disable_dimension() - def get_opening_invoice_creation_dict(**args): party = "Customer" if args.get("invoice_type", "Sales") == "Sales" else "Supplier" diff --git a/erpnext/accounts/doctype/party_link/test_party_link.py b/erpnext/accounts/doctype/party_link/test_party_link.py index a796de526a5..4f488b19456 100644 --- a/erpnext/accounts/doctype/party_link/test_party_link.py +++ b/erpnext/accounts/doctype/party_link/test_party_link.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestPartyLink(IntegrationTestCase): +class TestPartyLink(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index 1adf6a5866e..afa508781d8 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -138,6 +138,7 @@ "fieldname": "posting_date", "fieldtype": "Date", "in_list_view": 1, + "in_standard_filter": 1, "label": "Posting Date", "reqd": 1 }, @@ -160,7 +161,6 @@ { "fieldname": "mode_of_payment", "fieldtype": "Link", - "in_list_view": 1, "label": "Mode of Payment", "options": "Mode of Payment" }, @@ -228,6 +228,7 @@ "fieldname": "paid_from", "fieldtype": "Link", "in_global_search": 1, + "in_list_view": 1, "label": "Account Paid From", "options": "Account", "print_hide": 1, @@ -252,6 +253,7 @@ "fieldname": "paid_to", "fieldtype": "Link", "in_global_search": 1, + "in_list_view": 1, "label": "Account Paid To", "options": "Account", "print_hide": 1, @@ -414,6 +416,7 @@ "depends_on": "eval:(doc.paid_from && doc.paid_to)", "fieldname": "reference_no", "fieldtype": "Data", + "in_standard_filter": 1, "label": "Cheque/Reference No", "mandatory_depends_on": "eval:(doc.paid_from_account_type == 'Bank' || doc.paid_to_account_type == 'Bank')" }, @@ -792,7 +795,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2026-02-03 16:08:49.800381", + "modified": "2026-03-09 17:15:30.453920", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 31d6a1a7f5a..1ece52234ef 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -2558,14 +2558,9 @@ def get_orders_to_be_billed( if not voucher_type: return [] - # Add cost center condition - doc = frappe.get_doc({"doctype": voucher_type}) - condition = "" - if doc and hasattr(doc, "cost_center") and doc.cost_center: - condition = " and cost_center='%s'" % cost_center - # dynamic dimension filters - active_dimensions = get_dimensions()[0] + condition = "" + active_dimensions = get_dimensions(True)[0] for dim in active_dimensions: if filters.get(dim.fieldname): condition += f" and {dim.fieldname}='{filters.get(dim.fieldname)}'" diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index f6c240c0714..12f5276fbfb 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -4,7 +4,6 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, nowdate from erpnext.accounts.doctype.account.test_account import create_account @@ -24,14 +23,10 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import ( ) from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.setup.doctype.employee.test_employee import make_employee - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Currency Exchange"] +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentEntry(IntegrationTestCase): - def tearDown(self): - frappe.db.rollback() - +class TestPaymentEntry(ERPNextTestSuite): def get_journals_for(self, voucher_type: str, voucher_no: str) -> list: journals = [] if voucher_type and voucher_no: @@ -427,7 +422,7 @@ class TestPaymentEntry(IntegrationTestCase): self.assertEqual(si.payment_schedule[0].outstanding, 0) self.assertEqual(si.payment_schedule[0].discounted_amount, 50) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "allow_multi_currency_invoices_against_single_party_account": 1, @@ -645,6 +640,7 @@ class TestPaymentEntry(IntegrationTestCase): def test_payment_entry_retrieves_last_exchange_rate(self): from erpnext.setup.doctype.currency_exchange.test_currency_exchange import save_new_records + self.load_test_records("Currency Exchange") save_new_records(self.globalTestRecords["Currency Exchange"]) pe = frappe.new_doc("Payment Entry") @@ -982,6 +978,7 @@ class TestPaymentEntry(IntegrationTestCase): def test_gl_of_multi_currency_payment_transaction(self): from erpnext.setup.doctype.currency_exchange.test_currency_exchange import save_new_records + self.load_test_records("Currency Exchange") save_new_records(self.globalTestRecords["Currency Exchange"]) paid_from = create_account( parent_account="Current Liabilities - _TC", @@ -1158,7 +1155,7 @@ class TestPaymentEntry(IntegrationTestCase): } self.assertDictEqual(ref_details, expected_response) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "unlink_payment_on_cancellation_of_invoice": 1, @@ -1253,7 +1250,7 @@ class TestPaymentEntry(IntegrationTestCase): si3.cancel() si3.delete() - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "unlink_payment_on_cancellation_of_invoice": 1, @@ -1949,7 +1946,7 @@ class TestPaymentEntry(IntegrationTestCase): # 'Is Opening' should always be 'No' for normal advance payments self.assertEqual(gl_with_opening_set, []) - @IntegrationTestCase.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) def test_delete_linked_exchange_gain_loss_journal(self): from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import ( diff --git a/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json b/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json index 59a01bc84ef..8d4e55c970a 100644 --- a/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json +++ b/erpnext/accounts/doctype/payment_entry_deduction/payment_entry_deduction.json @@ -22,6 +22,7 @@ "reqd": 1 }, { + "allow_on_submit": 1, "fieldname": "cost_center", "fieldtype": "Link", "in_list_view": 1, @@ -59,7 +60,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-08-13 06:52:46.130142", + "modified": "2026-03-11 14:26:11.312950", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry Deduction", diff --git a/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py b/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py index 655bd2d7d99..fe70292144f 100644 --- a/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py +++ b/erpnext/accounts/doctype/payment_gateway_account/test_payment_gateway_account.py @@ -1,10 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase - -IGNORE_TEST_RECORD_DEPENDENCIES = ["Payment Gateway"] +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentGatewayAccount(IntegrationTestCase): +class TestPaymentGatewayAccount(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.js b/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.js index 07fe83177ba..1d54968144b 100644 --- a/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.js +++ b/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.js @@ -2,6 +2,7 @@ // For license information, please see license.txt frappe.ui.form.on("Payment Ledger Entry", { - // refresh: function(frm) { - // } + refresh(frm) { + frm.page.btn_secondary.hide(); + }, }); diff --git a/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json b/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json index fcc3a15206a..de4bc9d98ef 100644 --- a/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json +++ b/erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json @@ -5,6 +5,7 @@ "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", + "is_submittable": 1, "field_order": [ "posting_date", "company", diff --git a/erpnext/accounts/doctype/payment_ledger_entry/test_payment_ledger_entry.py b/erpnext/accounts/doctype/payment_ledger_entry/test_payment_ledger_entry.py index 1de103764a4..c2528040e98 100644 --- a/erpnext/accounts/doctype/payment_ledger_entry/test_payment_ledger_entry.py +++ b/erpnext/accounts/doctype/payment_ledger_entry/test_payment_ledger_entry.py @@ -3,7 +3,6 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -11,9 +10,10 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_pay from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.stock.doctype.item.test_item import create_item +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentLedgerEntry(IntegrationTestCase): +class TestPaymentLedgerEntry(ERPNextTestSuite): def setUp(self): self.ple = qb.DocType("Payment Ledger Entry") self.create_company() @@ -21,9 +21,6 @@ class TestPaymentLedgerEntry(IntegrationTestCase): self.create_customer() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_company(self): company_name = "_Test Payment Ledger" company = None @@ -445,7 +442,7 @@ class TestPaymentLedgerEntry(IntegrationTestCase): self.assertEqual(pl_entries_for_crnote[0], expected_values[0]) self.assertEqual(pl_entries_for_crnote[1], expected_values[1]) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1, "delete_linked_ledger_entries": 1}, ) @@ -474,7 +471,7 @@ class TestPaymentLedgerEntry(IntegrationTestCase): si.delete() self.assertRaises(frappe.DoesNotExistError, frappe.get_doc, si.doctype, si.name) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1, "delete_linked_ledger_entries": 1}, ) @@ -507,7 +504,7 @@ class TestPaymentLedgerEntry(IntegrationTestCase): si.delete() self.assertRaises(frappe.DoesNotExistError, frappe.get_doc, si.doctype, si.name) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "unlink_payment_on_cancellation_of_invoice": 1, diff --git a/erpnext/accounts/doctype/payment_order/test_payment_order.py b/erpnext/accounts/doctype/payment_order/test_payment_order.py index f12491fdf15..b11500cfd20 100644 --- a/erpnext/accounts/doctype/payment_order/test_payment_order.py +++ b/erpnext/accounts/doctype/payment_order/test_payment_order.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import ( @@ -15,9 +14,10 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import ( make_payment_order, ) from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentOrder(IntegrationTestCase): +class TestPaymentOrder(ERPNextTestSuite): def setUp(self): # generate and use a uniq hash identifier for 'Bank Account' and it's linked GL 'Account' to avoid validation error uniq_identifier = frappe.generate_hash(length=10) @@ -26,9 +26,6 @@ class TestPaymentOrder(IntegrationTestCase): gl_account=self.gl_account, bank_account_name="Checking Account " + uniq_identifier ) - def tearDown(self): - frappe.db.rollback() - def test_payment_order_creation_against_payment_entry(self): purchase_invoice = make_purchase_invoice() payment_entry = get_payment_entry( diff --git a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py index 3682e7c63a9..1bbf228d73a 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py @@ -4,7 +4,6 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_years, flt, getdate, nowdate, today from frappe.utils.data import getdate as convert_to_date @@ -17,11 +16,10 @@ from erpnext.accounts.party import get_party_account from erpnext.accounts.utils import get_fiscal_year from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.stock.doctype.item.test_item import create_item - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"] +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentReconciliation(IntegrationTestCase): +class TestPaymentReconciliation(ERPNextTestSuite): def setUp(self): self.create_company() self.create_item() @@ -30,9 +28,6 @@ class TestPaymentReconciliation(IntegrationTestCase): self.create_cost_center() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_company(self): company = None if frappe.db.exists("Company", "_Test Payment Reconciliation"): @@ -1235,7 +1230,7 @@ class TestPaymentReconciliation(IntegrationTestCase): payment_vouchers = [x.get("reference_name") for x in pr.get("payments")] self.assertCountEqual(payment_vouchers, [je2.name, pe2.name]) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "allow_multi_currency_invoices_against_single_party_account": 1, diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 1ba9cf1675d..81ddd1de537 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -955,6 +955,7 @@ def resend_payment_email(docname: str): @frappe.whitelist() def make_payment_entry(docname: str): doc = frappe.get_doc("Payment Request", docname) + doc.check_permission("read") return doc.create_payment_entry(submit=False).as_dict() diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py index c59846d69b7..ae9c8d21976 100644 --- a/erpnext/accounts/doctype/payment_request/test_payment_request.py +++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py @@ -6,7 +6,6 @@ import re from unittest.mock import patch import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -17,8 +16,7 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sal from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.setup.utils import get_exchange_rate - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Currency Exchange", "Journal Entry", "Contact", "Address"] +from erpnext.tests.utils import ERPNextTestSuite PAYMENT_URL = "https://example.com/payment" @@ -63,7 +61,7 @@ payment_method = [ ] -class TestPaymentRequest(IntegrationTestCase): +class TestPaymentRequest(ERPNextTestSuite): def setUp(self): for payment_gateway in payment_gateways: if not frappe.db.get_value("Payment Gateway", payment_gateway["gateway"], "name"): @@ -100,9 +98,6 @@ class TestPaymentRequest(IntegrationTestCase): self._get_payment_gateway_controller = _get_payment_gateway_controller.start() self.addCleanup(_get_payment_gateway_controller.stop) - def tearDown(self): - frappe.db.rollback() - def test_payment_request_linkings(self): so_inr = make_sales_order(currency="INR", do_not_save=True) so_inr.disable_rounded_total = 1 @@ -503,7 +498,7 @@ class TestPaymentRequest(IntegrationTestCase): return_doc=1, ) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1} ) def test_multiple_payment_if_partially_paid_for_multi_currency(self): @@ -621,7 +616,7 @@ class TestPaymentRequest(IntegrationTestCase): self.assertEqual(pr.outstanding_amount, 0) self.assertEqual(pr.grand_total, 20000) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1} ) def test_single_payment_with_payment_term_for_multi_currency(self): diff --git a/erpnext/accounts/doctype/payment_term/test_payment_term.py b/erpnext/accounts/doctype/payment_term/test_payment_term.py index 78c4a672476..f170c789256 100644 --- a/erpnext/accounts/doctype/payment_term/test_payment_term.py +++ b/erpnext/accounts/doctype/payment_term/test_payment_term.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentTerm(IntegrationTestCase): +class TestPaymentTerm(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/payment_term/test_records.json b/erpnext/accounts/doctype/payment_term/test_records.json deleted file mode 100644 index ef6e0693b3c..00000000000 --- a/erpnext/accounts/doctype/payment_term/test_records.json +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "doctype":"Payment Term", - "due_date_based_on":"Day(s) after invoice date", - "payment_term_name":"_Test N30", - "description":"_Test Net 30 Days", - "invoice_portion":50, - "credit_days":30 - }, - { - "doctype":"Payment Term", - "due_date_based_on":"Day(s) after invoice date", - "payment_term_name":"_Test COD", - "description":"_Test Cash on Delivery", - "invoice_portion":50, - "credit_days":0 - }, - { - "doctype":"Payment Term", - "due_date_based_on":"Month(s) after the end of the invoice month", - "payment_term_name":"_Test EONM", - "description":"_Test End of Next Month", - "invoice_portion":100, - "credit_months":1 - }, - { - "doctype":"Payment Term", - "due_date_based_on":"Day(s) after invoice date", - "payment_term_name":"_Test N30 1", - "description":"_Test Net 30 Days", - "invoice_portion":100, - "credit_days":30 - } -] \ No newline at end of file diff --git a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py index c8a43991a44..9fc91b6f2de 100644 --- a/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py +++ b/erpnext/accounts/doctype/payment_terms_template/test_payment_terms_template.py @@ -2,13 +2,11 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentTermsTemplate(IntegrationTestCase): - def tearDown(self): - frappe.delete_doc("Payment Terms Template", "_Test Payment Terms Template For Test", force=1) - +class TestPaymentTermsTemplate(ERPNextTestSuite): def test_create_template(self): template = frappe.get_doc( { diff --git a/erpnext/accounts/doctype/payment_terms_template/test_records.json b/erpnext/accounts/doctype/payment_terms_template/test_records.json deleted file mode 100644 index fea0b35c112..00000000000 --- a/erpnext/accounts/doctype/payment_terms_template/test_records.json +++ /dev/null @@ -1,60 +0,0 @@ -[ - { - "doctype":"Payment Terms Template", - "terms":[ - { - "doctype":"Payment Terms Template Detail", - "due_date_based_on":"Day(s) after invoice date", - "idx":1, - "description":"Cash on Delivery", - "invoice_portion":50, - "credit_days":0, - "credit_months":0, - "payment_term":"_Test COD" - }, - { - "doctype":"Payment Terms Template Detail", - "due_date_based_on":"Day(s) after invoice date", - "idx":2, - "description":"Net 30 Days ", - "invoice_portion":50, - "credit_days":30, - "credit_months":0, - "payment_term":"_Test N30" - } - ], - "template_name":"_Test Payment Term Template" - }, - { - "doctype":"Payment Terms Template", - "terms":[ - { - "doctype":"Payment Terms Template Detail", - "due_date_based_on":"Month(s) after the end of the invoice month", - "idx":1, - "description":"_Test End of Next Months", - "invoice_portion":100, - "credit_days":0, - "credit_months":1, - "payment_term":"_Test EONM" - } - ], - "template_name":"_Test Payment Term Template 1" - }, - { - "doctype":"Payment Terms Template", - "terms":[ - { - "doctype":"Payment Terms Template Detail", - "due_date_based_on":"Day(s) after invoice date", - "idx":1, - "description":"_Test Net Within 30 days", - "invoice_portion":100, - "credit_days":30, - "credit_months":0, - "payment_term":"_Test N30 1" - } - ], - "template_name":"_Test Payment Term Template 3" - } -] \ No newline at end of file diff --git a/erpnext/accounts/doctype/pegged_currencies/test_pegged_currencies.py b/erpnext/accounts/doctype/pegged_currencies/test_pegged_currencies.py index 32bb3f34fd5..e695b11bcb5 100644 --- a/erpnext/accounts/doctype/pegged_currencies/test_pegged_currencies.py +++ b/erpnext/accounts/doctype/pegged_currencies/test_pegged_currencies.py @@ -2,28 +2,3 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase, UnitTestCase - -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] - - -class UnitTestPeggedCurrencies(UnitTestCase): - """ - Unit tests for PeggedCurrencies. - Use this class for testing individual functions and methods. - """ - - pass - - -class IntegrationTestPeggedCurrencies(IntegrationTestCase): - """ - Integration tests for PeggedCurrencies. - Use this class for testing interactions between multiple components. - """ - - pass diff --git a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py index 9bb8e7bff80..7b6d8e5c317 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py +++ b/erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py @@ -2,16 +2,16 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.doctype.finance_book.test_finance_book import create_finance_book from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.utils import get_fiscal_year +from erpnext.tests.utils import ERPNextTestSuite -class TestPeriodClosingVoucher(IntegrationTestCase): +class TestPeriodClosingVoucher(ERPNextTestSuite): def setUp(self): super().setUp() frappe.db.set_single_value("Accounts Settings", "use_legacy_controller_for_pcv", 1) @@ -390,6 +390,3 @@ def create_cost_center(cc_name): ) costcenter.insert(ignore_if_duplicate=True) return costcenter.name - - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Customer", "Cost Center"] diff --git a/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py b/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py index d771a08cf06..508d3716593 100644 --- a/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py +++ b/erpnext/accounts/doctype/pos_closing_entry/test_pos_closing_entry.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import ( create_dimension, @@ -21,26 +20,14 @@ from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle get_batch_from_bundle, ) from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSClosingEntry(IntegrationTestCase): - @classmethod - def setUpClass(cls): - frappe.db.sql("delete from `tabPOS Opening Entry`") - cls.enterClassContext(cls.change_settings("POS Settings", {"invoice_type": "POS Invoice"})) - - @classmethod - def tearDownClass(cls): - frappe.db.sql("delete from `tabPOS Opening Entry`") - +class TestPOSClosingEntry(ERPNextTestSuite): def setUp(self): - # Make stock available for POS Sales - frappe.db.sql("delete from `tabPOS Opening Entry`") + init_user_and_profile() make_stock_entry(target="_Test Warehouse - _TC", qty=2, basic_rate=100) - - def tearDown(self): - frappe.set_user("Administrator") - frappe.db.sql("delete from `tabPOS Profile`") + frappe.db.set_single_value("POS Settings", "invoice_type", "POS Invoice") def test_pos_closing_entry(self): test_user, pos_profile = init_user_and_profile() @@ -57,6 +44,7 @@ class TestPOSClosingEntry(IntegrationTestCase): pos_inv2.submit() pcv_doc = make_closing_entry_from_opening(opening_entry) + pcv_doc.flags.in_test = True payment = pcv_doc.payment_reconciliation[0] self.assertEqual(payment.mode_of_payment, "Cash") @@ -65,6 +53,7 @@ class TestPOSClosingEntry(IntegrationTestCase): if d.mode_of_payment == "Cash": d.closing_amount = 6700 + pcv_doc.flags.in_test = True pcv_doc.submit() self.assertEqual(pcv_doc.total_quantity, 2) @@ -83,6 +72,7 @@ class TestPOSClosingEntry(IntegrationTestCase): pos_inv.submit() pcv_doc = make_closing_entry_from_opening(opening_entry) + pcv_doc.flags.in_test = True pcv_doc.submit() self.assertTrue(pcv_doc.name) @@ -115,6 +105,7 @@ class TestPOSClosingEntry(IntegrationTestCase): pos_return.submit() pcv_doc = make_closing_entry_from_opening(opening_entry) + pcv_doc.flags.in_test = True pcv_doc.submit() opening_entry = create_opening_entry(pos_profile, test_user.name) @@ -144,6 +135,7 @@ class TestPOSClosingEntry(IntegrationTestCase): if d.mode_of_payment == "Cash": d.closing_amount = 6700 + pcv_doc.flags.in_test = True pcv_doc.submit() pos_inv1.load_from_db() @@ -197,6 +189,7 @@ class TestPOSClosingEntry(IntegrationTestCase): pcv_doc = make_closing_entry_from_opening(opening_entry) # will assert coz the new mandatory accounting dimension bank is not set in POS Profile + pcv_doc.flags.in_test = True self.assertRaises(frappe.ValidationError, pcv_doc.submit) accounting_dimension_department = frappe.get_doc( @@ -264,6 +257,7 @@ class TestPOSClosingEntry(IntegrationTestCase): self.assertEqual(batch_qty_with_pos, 0.0) pcv_doc = make_closing_entry_from_opening(opening_entry) + pcv_doc.flags.in_test = True pcv_doc.submit() piv_merge = frappe.db.get_value("POS Invoice Merge Log", {"pos_closing_entry": pcv_doc.name}, "name") @@ -287,6 +281,7 @@ class TestPOSClosingEntry(IntegrationTestCase): frappe.flags.print_message = True pcv_doc.reload() + pcv_doc.flags.in_test = True pcv_doc.cancel() batch_qty_with_pos = get_batch_qty(batch_no, "_Test Warehouse - _TC", item_code) @@ -301,7 +296,7 @@ class TestPOSClosingEntry(IntegrationTestCase): batch_qty_with_pos = get_batch_qty(batch_no, "_Test Warehouse - _TC", item_code) self.assertEqual(batch_qty_with_pos, 10.0) - @IntegrationTestCase.change_settings("POS Settings", {"invoice_type": "Sales Invoice"}) + @ERPNextTestSuite.change_settings("POS Settings", {"invoice_type": "Sales Invoice"}) def test_closing_entries_with_sales_invoice(self): test_user, pos_profile = init_user_and_profile() opening_entry = create_opening_entry(pos_profile, test_user.name) @@ -329,6 +324,7 @@ class TestPOSClosingEntry(IntegrationTestCase): if d.mode_of_payment == "Cash": d.closing_amount = 1500 + pcv_doc.flags.in_test = True pcv_doc.submit() self.assertEqual(pcv_doc.total_quantity, 15) @@ -472,7 +468,7 @@ def init_user_and_profile(**args): user = "test@example.com" test_user = frappe.get_doc("User", user) - roles = ("Accounts Manager", "Accounts User", "Sales Manager") + roles = ("Accounts Manager", "Accounts User", "Sales Manager", "Stock User", "Item Manager") test_user.add_roles(*roles) frappe.set_user(user) diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py index 53c1d75db4e..c9b35a27c29 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py @@ -867,11 +867,16 @@ class POSInvoice(SalesInvoice): idx = self.payments[-1].idx if self.payments else -1 + self.reload() + self.flags.ignore_validate_update_after_submit = True + for d in payments: idx += 1 payment = create_payments_on_invoice(self, idx, frappe._dict(d)) paid_amount += flt(payment.amount) - payment.submit() + self.append("payments", payment) + + self.save() paid_amount = flt(flt(paid_amount), self.precision("paid_amount")) base_paid_amount = flt(flt(paid_amount * self.conversion_rate), self.precision("base_paid_amount")) diff --git a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py index 9750e4c7f83..253df61d87f 100644 --- a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice.py @@ -4,7 +4,6 @@ import copy import frappe from frappe import _ -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.mode_of_payment.test_mode_of_payment import ( set_default_account_for_mode_of_payment, @@ -21,37 +20,34 @@ from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle make_serial_batch_bundle, ) from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSInvoice(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) - cls.enterClassContext(cls.change_settings("POS Settings", invoice_type="POS Invoice")) - make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item", qty=800, basic_rate=100) - frappe.db.sql("delete from `tabTax Rule`") - +class POSInvoiceTestMixin(ERPNextTestSuite): + def setUp(self): from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import init_user_and_profile - from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry - cls.test_user, cls.pos_profile = init_user_and_profile() - cls.opening_entry = create_opening_entry(cls.pos_profile, cls.test_user.name) - mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft") - set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC") + self.load_test_records("Stock Entry") + self.test_user, self.pos_profile = init_user_and_profile() - @classmethod - def tearDownClass(cls): - frappe.db.sql("delete from `tabPOS Invoice`") - opening_entry_doc = frappe.get_doc("POS Opening Entry", cls.opening_entry.name) - opening_entry_doc.cancel() - - def tearDown(self): if frappe.session.user != "Administrator": frappe.set_user("Administrator") - if frappe.db.get_single_value("Selling Settings", "validate_selling_price"): - frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) + frappe.db.set_single_value("POS Settings", "invoice_type", "POS Invoice") + make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item", qty=800, basic_rate=100) + frappe.db.sql("delete from `tabTax Rule`") + + mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft") + set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC") + + +class TestPOSInvoice(POSInvoiceTestMixin): + def setUp(self): + super().setUp() + from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry + + self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name) def test_timestamp_change(self): w = create_pos_invoice(do_not_save=1) @@ -641,9 +637,7 @@ class TestPOSInvoice(IntegrationTestCase): from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( get_loyalty_program_details_with_points, ) - from erpnext.accounts.doctype.loyalty_program.test_loyalty_program import create_records - create_records() frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty") before_lp_details = get_loyalty_program_details_with_points( "Test Loyalty Customer", company="_Test Company", loyalty_program="Test Single Loyalty" @@ -680,6 +674,7 @@ class TestPOSInvoice(IntegrationTestCase): get_loyalty_program_details_with_points, ) + frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty") # add 10 loyalty points pos_inv = create_pos_invoice(customer="Test Loyalty Customer", rate=10000, do_not_save=1) pos_inv.append( @@ -709,134 +704,6 @@ class TestPOSInvoice(IntegrationTestCase): ) self.assertEqual(after_redeem_lp_details.loyalty_points, 9) - def test_merging_into_sales_invoice_with_discount(self): - from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( - init_user_and_profile, - ) - from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( - consolidate_pos_invoices, - ) - - frappe.db.sql("delete from `tabPOS Invoice`") - test_user, pos_profile = init_user_and_profile() - pos_inv = create_pos_invoice(rate=300, additional_discount_percentage=10, do_not_submit=1) - pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 270}) - pos_inv.save() - pos_inv.submit() - - pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) - pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 3200}) - pos_inv2.save() - pos_inv2.submit() - - consolidate_pos_invoices() - - pos_inv.load_from_db() - rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") - self.assertEqual(rounded_total, 3470) - - def test_merging_into_sales_invoice_with_discount_and_inclusive_tax(self): - from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( - init_user_and_profile, - ) - from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( - consolidate_pos_invoices, - ) - - frappe.db.sql("delete from `tabPOS Invoice`") - test_user, pos_profile = init_user_and_profile() - pos_inv = create_pos_invoice(rate=300, do_not_submit=1) - pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 300}) - pos_inv.append( - "taxes", - { - "charge_type": "On Net Total", - "account_head": "_Test Account Service Tax - _TC", - "cost_center": "_Test Cost Center - _TC", - "description": "Service Tax", - "rate": 14, - "included_in_print_rate": 1, - }, - ) - pos_inv.save() - pos_inv.submit() - - pos_inv2 = create_pos_invoice(rate=300, qty=2, do_not_submit=1) - pos_inv2.additional_discount_percentage = 10 - pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 540}) - pos_inv2.append( - "taxes", - { - "charge_type": "On Net Total", - "account_head": "_Test Account Service Tax - _TC", - "cost_center": "_Test Cost Center - _TC", - "description": "Service Tax", - "rate": 14, - "included_in_print_rate": 1, - }, - ) - pos_inv2.save() - pos_inv2.submit() - - consolidate_pos_invoices() - - pos_inv.load_from_db() - rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") - self.assertEqual(rounded_total, 840) - - def test_merging_with_validate_selling_price(self): - from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( - init_user_and_profile, - ) - from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( - consolidate_pos_invoices, - ) - - if not frappe.db.get_single_value("Selling Settings", "validate_selling_price"): - frappe.db.set_single_value("Selling Settings", "validate_selling_price", 1) - - item = "Test Selling Price Validation" - make_item(item, {"is_stock_item": 1}) - make_purchase_receipt(item_code=item, warehouse="_Test Warehouse - _TC", qty=1, rate=300) - frappe.db.sql("delete from `tabPOS Invoice`") - test_user, pos_profile = init_user_and_profile() - pos_inv = create_pos_invoice(item=item, rate=300, do_not_submit=1) - pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 300}) - pos_inv.append( - "taxes", - { - "charge_type": "On Net Total", - "account_head": "_Test Account Service Tax - _TC", - "cost_center": "_Test Cost Center - _TC", - "description": "Service Tax", - "rate": 14, - "included_in_print_rate": 1, - }, - ) - self.assertRaises(frappe.ValidationError, pos_inv.submit) - - pos_inv2 = create_pos_invoice(item=item, rate=400, do_not_submit=1) - pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 400}) - pos_inv2.append( - "taxes", - { - "charge_type": "On Net Total", - "account_head": "_Test Account Service Tax - _TC", - "cost_center": "_Test Cost Center - _TC", - "description": "Service Tax", - "rate": 14, - "included_in_print_rate": 1, - }, - ) - pos_inv2.save() - pos_inv2.submit() - - consolidate_pos_invoices() - - pos_inv2.load_from_db() - rounded_total = frappe.db.get_value("Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total") - self.assertEqual(rounded_total, 400) - def test_pos_batch_reservation(self): from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import ( get_auto_batch_nos, @@ -1003,40 +870,39 @@ class TestPOSInvoice(IntegrationTestCase): def test_ignore_pricing_rule(self): from erpnext.accounts.doctype.pricing_rule.test_pricing_rule import make_pricing_rule - item_price = frappe.get_doc( - { - "doctype": "Item Price", - "item_code": "_Test Item", - "price_list": "_Test Price List", - "price_list_rate": "450", - } - ) - item_price.insert() + if not frappe.db.exists( + "Item Price", + {"item_code": "_Test Item", "price_list": "_Test Price List", "price_list_rate": "450"}, + ): + item_price = frappe.get_doc( + { + "doctype": "Item Price", + "item_code": "_Test Item", + "price_list": "_Test Price List", + "price_list_rate": "450", + } + ) + item_price.insert() + pr = make_pricing_rule(selling=1, priority=5, discount_percentage=10) pr.save() - try: - pos_inv = create_pos_invoice(qty=1, do_not_submit=1) - pos_inv.items[0].rate = 300 - pos_inv.save() - self.assertEqual(pos_inv.items[0].discount_percentage, 10) - # rate shouldn't change - self.assertEqual(pos_inv.items[0].rate, 405) + pos_inv = create_pos_invoice(qty=1, do_not_submit=1) + pos_inv.items[0].rate = 300 + pos_inv.save() + self.assertEqual(pos_inv.items[0].discount_percentage, 10) + # rate shouldn't change + self.assertEqual(pos_inv.items[0].rate, 405) - pos_inv.ignore_pricing_rule = 1 - pos_inv.save() - self.assertEqual(pos_inv.ignore_pricing_rule, 1) - # rate should reset since pricing rules are ignored - self.assertEqual(pos_inv.items[0].rate, 450) + pos_inv.ignore_pricing_rule = 1 + pos_inv.save() + self.assertEqual(pos_inv.ignore_pricing_rule, 1) + # rate should reset since pricing rules are ignored + self.assertEqual(pos_inv.items[0].rate, 450) - pos_inv.items[0].rate = 300 - pos_inv.save() - self.assertEqual(pos_inv.items[0].rate, 300) - - finally: - item_price.delete() - pos_inv.delete() - pr.delete() + pos_inv.items[0].rate = 300 + pos_inv.save() + self.assertEqual(pos_inv.items[0].rate, 300) def test_delivered_serial_no_case(self): from erpnext.accounts.doctype.pos_invoice_merge_log.test_pos_invoice_merge_log import ( @@ -1045,32 +911,26 @@ class TestPOSInvoice(IntegrationTestCase): from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item - frappe.db.savepoint("before_test_delivered_serial_no_case") - try: - se = make_serialized_item(self) - serial_no = get_serial_nos_from_bundle(se.get("items")[0].serial_and_batch_bundle)[0] + se = make_serialized_item(self) + serial_no = get_serial_nos_from_bundle(se.get("items")[0].serial_and_batch_bundle)[0] - dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=[serial_no]) - delivered_serial_no = get_serial_nos_from_bundle(dn.get("items")[0].serial_and_batch_bundle)[0] + dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=[serial_no]) + delivered_serial_no = get_serial_nos_from_bundle(dn.get("items")[0].serial_and_batch_bundle)[0] - self.assertEqual(serial_no, delivered_serial_no) + self.assertEqual(serial_no, delivered_serial_no) - init_user_and_profile() + init_user_and_profile() - pos_inv = create_pos_invoice( - item_code="_Test Serialized Item With Series", - serial_no=[serial_no], - qty=1, - rate=100, - do_not_submit=True, - ignore_sabb_validation=True, - ) + pos_inv = create_pos_invoice( + item_code="_Test Serialized Item With Series", + serial_no=[serial_no], + qty=1, + rate=100, + do_not_submit=True, + ignore_sabb_validation=True, + ) - self.assertRaises(frappe.ValidationError, pos_inv.submit) - - finally: - frappe.db.rollback(save_point="before_test_delivered_serial_no_case") - frappe.set_user("Administrator") + self.assertRaises(frappe.ValidationError, pos_inv.submit) def test_bundle_stock_availability_validation(self): from erpnext.accounts.doctype.pos_invoice.pos_invoice import ProductBundleStockValidationError diff --git a/erpnext/accounts/doctype/pos_invoice/test_pos_invoice_merge.py b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice_merge.py new file mode 100644 index 00000000000..5c490d303be --- /dev/null +++ b/erpnext/accounts/doctype/pos_invoice/test_pos_invoice_merge.py @@ -0,0 +1,164 @@ +# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.accounts.doctype.pos_invoice.test_pos_invoice import POSInvoiceTestMixin, create_pos_invoice +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite + + +class TestPOSInvoiceMerging(POSInvoiceTestMixin): + def clear_pos_data(self): + frappe.db.sql("delete from `tabPOS Opening Entry`;") + frappe.db.sql("delete from `tabPOS Closing Entry`;") + frappe.db.sql("delete from `tabPOS Invoice`;") + + def setUp(self): + self.clear_pos_data() + super().setUp() + + from erpnext.accounts.doctype.pos_opening_entry.test_pos_opening_entry import create_opening_entry + + self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name) + + def test_merging_into_sales_invoice_with_discount(self): + from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import ( + make_closing_entry_from_opening, + ) + from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( + init_user_and_profile, + ) + from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( + consolidate_pos_invoices, + ) + + frappe.db.sql("delete from `tabPOS Invoice`") + test_user, pos_profile = init_user_and_profile() + pos_inv = create_pos_invoice(rate=300, additional_discount_percentage=10, do_not_submit=1) + pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 270}) + pos_inv.save() + pos_inv.submit() + + pos_inv2 = create_pos_invoice(rate=3200, do_not_submit=1) + pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 3200}) + pos_inv2.save() + pos_inv2.submit() + + closing_entry = make_closing_entry_from_opening(self.opening_entry) + consolidate_pos_invoices(closing_entry=closing_entry) # does DB commit + + pos_inv.load_from_db() + rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") + self.assertEqual(rounded_total, 3470) + + def test_merging_into_sales_invoice_with_discount_and_inclusive_tax(self): + from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import ( + make_closing_entry_from_opening, + ) + from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( + init_user_and_profile, + ) + from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( + consolidate_pos_invoices, + ) + + frappe.db.sql("delete from `tabPOS Invoice`") + test_user, pos_profile = init_user_and_profile() + pos_inv = create_pos_invoice(rate=300, do_not_submit=1) + pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 300}) + pos_inv.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Service Tax", + "rate": 14, + "included_in_print_rate": 1, + }, + ) + pos_inv.save() + pos_inv.submit() + + pos_inv2 = create_pos_invoice(rate=300, qty=2, do_not_submit=1) + pos_inv2.additional_discount_percentage = 10 + pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 540}) + pos_inv2.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Service Tax", + "rate": 14, + "included_in_print_rate": 1, + }, + ) + pos_inv2.save() + pos_inv2.submit() + + self.closing_entry = make_closing_entry_from_opening(self.opening_entry) + consolidate_pos_invoices(closing_entry=self.closing_entry) # does DB commit + + pos_inv.load_from_db() + rounded_total = frappe.db.get_value("Sales Invoice", pos_inv.consolidated_invoice, "rounded_total") + self.assertEqual(rounded_total, 840) + + def test_merging_with_validate_selling_price(self): + from erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry import ( + make_closing_entry_from_opening, + ) + from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import ( + init_user_and_profile, + ) + from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import ( + consolidate_pos_invoices, + ) + + if not frappe.db.get_single_value("Selling Settings", "validate_selling_price"): + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 1) + + item = "Test Selling Price Validation" + make_item(item, {"is_stock_item": 1}) + make_purchase_receipt(item_code=item, warehouse="_Test Warehouse - _TC", qty=1, rate=300) + frappe.db.sql("delete from `tabPOS Invoice`") + test_user, pos_profile = init_user_and_profile() + pos_inv = create_pos_invoice(item=item, rate=300, do_not_submit=1) + pos_inv.append("payments", {"mode_of_payment": "Cash", "amount": 300}) + pos_inv.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Service Tax", + "rate": 14, + "included_in_print_rate": 1, + }, + ) + self.assertRaises(frappe.ValidationError, pos_inv.submit) + + pos_inv2 = create_pos_invoice(item=item, rate=400, do_not_submit=1) + pos_inv2.append("payments", {"mode_of_payment": "Cash", "amount": 400}) + pos_inv2.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": "_Test Account Service Tax - _TC", + "cost_center": "_Test Cost Center - _TC", + "description": "Service Tax", + "rate": 14, + "included_in_print_rate": 1, + }, + ) + pos_inv2.save() + pos_inv2.submit() + + self.closing_entry = make_closing_entry_from_opening(self.opening_entry) + consolidate_pos_invoices(closing_entry=self.closing_entry) # does DB commit + + pos_inv2.load_from_db() + rounded_total = frappe.db.get_value("Sales Invoice", pos_inv2.consolidated_invoice, "rounded_total") + self.assertEqual(rounded_total, 400) diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py index 0874955ec47..e41548b89f6 100644 --- a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py +++ b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py @@ -283,7 +283,7 @@ class POSInvoiceMergeLog(Document): base_rounding_adjustment += doc.base_rounding_adjustment base_rounded_total += doc.base_rounded_total - for d in doc.get("item_wise_tax_details"): + for d in doc.get("item_wise_tax_details") or []: row = frappe._dict( item=old_new_item_map[d.item_row], tax=old_new_tax_map[d.tax_row], @@ -572,7 +572,7 @@ def split_invoices(invoices): def create_merge_logs(invoice_by_customer, closing_entry=None): - try: + def merge_and_close(): for customer, invoices_acc_dim in invoice_by_customer.items(): for invoices in invoices_acc_dim.values(): for _invoices in split_invoices(invoices): @@ -594,25 +594,30 @@ def create_merge_logs(invoice_by_customer, closing_entry=None): closing_entry.db_set("error_message", "") closing_entry.update_opening_entry() - except Exception as e: - frappe.db.rollback() - message_log = frappe.message_log.pop() if frappe.message_log else str(e) - error_message = get_error_message(message_log) + if frappe.in_test: + merge_and_close() + else: + try: + merge_and_close() + except Exception as e: + frappe.db.rollback() + message_log = frappe.message_log.pop() if frappe.message_log else str(e) + error_message = get_error_message(message_log) - if closing_entry: - closing_entry.set_status(update=True, status="Failed") - if isinstance(error_message, list): - error_message = json.dumps(error_message) - closing_entry.db_set("error_message", error_message) - raise + if closing_entry: + closing_entry.set_status(update=True, status="Failed") + if isinstance(error_message, list): + error_message = json.dumps(error_message) + closing_entry.db_set("error_message", error_message) + raise - finally: - frappe.db.commit() - frappe.publish_realtime("closing_process_complete", user=frappe.session.user) + finally: + frappe.db.commit() + frappe.publish_realtime("closing_process_complete", user=frappe.session.user) def cancel_merge_logs(merge_logs, closing_entry=None): - try: + def merge_cancel_and_close(): for log in merge_logs: merge_log = frappe.get_doc("POS Invoice Merge Log", log) if merge_log.docstatus == 2: @@ -626,19 +631,24 @@ def cancel_merge_logs(merge_logs, closing_entry=None): closing_entry.db_set("error_message", "") closing_entry.update_opening_entry(for_cancel=True) - except Exception as e: - frappe.db.rollback() - message_log = frappe.message_log.pop() if frappe.message_log else str(e) - error_message = get_error_message(message_log) + if frappe.flags.in_test: + merge_cancel_and_close() + else: + try: + merge_cancel_and_close() + except Exception as e: + frappe.db.rollback() + message_log = frappe.message_log.pop() if frappe.message_log else str(e) + error_message = get_error_message(message_log) - if closing_entry: - closing_entry.set_status(update=True, status="Submitted") - closing_entry.db_set("error_message", error_message) - raise + if closing_entry: + closing_entry.set_status(update=True, status="Submitted") + closing_entry.db_set("error_message", error_message) + raise - finally: - frappe.db.commit() - frappe.publish_realtime("closing_process_complete", user=frappe.session.user) + finally: + frappe.db.commit() + frappe.publish_realtime("closing_process_complete", user=frappe.session.user) def enqueue_job(job, **kwargs): diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py index 39fd8142073..5c6d03d7adb 100644 --- a/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py +++ b/erpnext/accounts/doctype/pos_invoice_merge_log/test_pos_invoice_merge_log.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.mode_of_payment.test_mode_of_payment import ( set_default_account_for_mode_of_payment, @@ -18,30 +17,25 @@ from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle get_serial_nos_from_bundle, ) from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSInvoiceMergeLog(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - frappe.db.sql("delete from `tabPOS Opening Entry`") - cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) - cls.enterClassContext(cls.change_settings("POS Settings", invoice_type="POS Invoice")) - mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft") - set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC") - +class TestPOSInvoiceMergeLog(ERPNextTestSuite): def setUp(self): - frappe.db.sql("delete from `tabPOS Invoice`") + mode_of_payment = frappe.get_doc("Mode of Payment", "Bank Draft") + self.test_user, self.pos_profile = init_user_and_profile() + self.opening_entry = create_opening_entry(self.pos_profile, self.test_user.name) - def tearDown(self): - frappe.set_user("Administrator") - frappe.db.sql("delete from `tabPOS Profile`") - frappe.db.sql("delete from `tabPOS Invoice`") + set_default_account_for_mode_of_payment(mode_of_payment, "_Test Company", "_Test Bank - _TC") + frappe.db.set_single_value("POS Settings", "invoice_type", "POS Invoice") + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) + + def make_closing_entry(self): + closing_entry = make_closing_entry_from_opening(self.opening_entry) + closing_entry.insert().submit() + return closing_entry def test_consolidated_invoice_creation(self): - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300}) pos_inv.save() @@ -57,9 +51,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): pos_inv3.save() pos_inv3.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() pos_inv.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) @@ -70,9 +62,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): self.assertFalse(pos_inv.consolidated_invoice == pos_inv3.consolidated_invoice) def test_consolidated_credit_note_creation(self): - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300}) pos_inv.save() @@ -97,9 +86,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): pos_inv_cn.paid_amount = -300 pos_inv_cn.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() pos_inv.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) @@ -117,9 +104,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): self.assertEqual(consolidated_credit_note.payments[1].amount, -200) def test_consolidated_invoice_item_taxes(self): - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - inv = create_pos_invoice(qty=1, rate=100, do_not_save=True) inv.append( @@ -156,9 +140,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): inv2.save() inv2.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() inv.load_from_db() @@ -206,9 +188,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): qty=10, ) - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - inv = create_pos_invoice(qty=3, rate=10000, do_not_save=True) inv.append( "taxes", @@ -243,9 +222,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): inv2.insert() inv2.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) @@ -263,9 +240,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): qty=10, ) - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - inv = create_pos_invoice(qty=6, rate=10000, do_not_save=True) inv.append( "taxes", @@ -305,16 +279,14 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): inv3.insert() inv3.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) self.assertNotEqual(consolidated_invoice.outstanding_amount, 800) self.assertEqual(consolidated_invoice.status, "Paid") - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "System Settings", {"number_format": "#,###.###", "currency_precision": 3, "float_precision": 3} ) def test_consolidation_round_off_error_3(self): @@ -324,8 +296,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): rate=8000, qty=10, ) - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) item_rates = [69, 59, 29] for _i in [1, 2]: @@ -362,9 +332,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): inv.save() inv.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) @@ -382,9 +350,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): qty=10, ) - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - inv = create_pos_invoice(qty=1, rate=69.5, do_not_save=True) inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 70}) inv.insert() @@ -395,9 +360,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): inv2.insert() inv2.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() inv.load_from_db() consolidated_invoice = frappe.get_doc("Sales Invoice", inv.consolidated_invoice) @@ -414,14 +377,12 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): The second and third POS Invoice should be consolidated with a single Merge Log """ + self.load_test_records("Stock Entry") from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item se = make_serialized_item(self) serial_no = get_serial_nos_from_bundle(se.get("items")[0].serial_and_batch_bundle)[0] - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - pos_inv = create_pos_invoice( item_code="_Test Serialized Item With Series", serial_no=[serial_no], @@ -448,9 +409,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): pos_inv2.save() pos_inv2.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() pos_inv.load_from_db() pos_inv2.load_from_db() @@ -469,9 +428,6 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): create_cost_center(cost_center_name="_Test POS Cost Center 1", is_group=0) create_cost_center(cost_center_name="_Test POS Cost Center 2", is_group=0) - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300}) pos_inv.cost_center = "_Test POS Cost Center 1 - _TC" @@ -490,9 +446,7 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): pos_inv3.save() pos_inv3.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + self.make_closing_entry() pos_inv.load_from_db() self.assertTrue(frappe.db.exists("Sales Invoice", pos_inv.consolidated_invoice)) @@ -511,17 +465,12 @@ class TestPOSInvoiceMergeLog(IntegrationTestCase): """ Test if the company is fetched from POS Closing Entry """ - test_user, pos_profile = init_user_and_profile() - opening_entry = create_opening_entry(pos_profile, test_user.name) - pos_inv = create_pos_invoice(rate=300, do_not_submit=1) pos_inv.append("payments", {"mode_of_payment": "Cash", "account": "Cash - _TC", "amount": 300}) pos_inv.save() pos_inv.submit() - closing_entry = make_closing_entry_from_opening(opening_entry) - closing_entry.insert() - closing_entry.submit() + closing_entry = self.make_closing_entry() self.assertTrue(frappe.db.exists("POS Invoice Merge Log", {"pos_closing_entry": closing_entry.name})) diff --git a/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py b/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py index 0810814f479..e23e139b0fa 100644 --- a/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py +++ b/erpnext/accounts/doctype/pos_opening_entry/test_pos_opening_entry.py @@ -3,35 +3,21 @@ import frappe from frappe.core.doctype.user_permission.test_user_permission import create_user -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.pos_invoice.test_pos_invoice import create_pos_invoice from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSOpeningEntry(IntegrationTestCase): - @classmethod - def setUpClass(cls): - frappe.db.sql("delete from `tabPOS Opening Entry`") - cls.enterClassContext(cls.change_settings("POS Settings", {"invoice_type": "POS Invoice"})) - - @classmethod - def tearDownClass(cls): - frappe.db.sql("delete from `tabPOS Opening Entry`") - +class TestPOSOpeningEntry(ERPNextTestSuite): def setUp(self): - # Make stock available for POS Sales - frappe.db.sql("delete from `tabPOS Opening Entry`") + frappe.db.set_single_value("POS Settings", "invoice_type", "POS Invoice") make_stock_entry(target="_Test Warehouse - _TC", qty=2, basic_rate=100) from erpnext.accounts.doctype.pos_closing_entry.test_pos_closing_entry import init_user_and_profile self.init_user_and_profile = init_user_and_profile - def tearDown(self): - frappe.set_user("Administrator") - frappe.db.sql("delete from `tabPOS Profile`") - def test_pos_opening_entry(self): test_user, pos_profile = self.init_user_and_profile() opening_entry = create_opening_entry(pos_profile, test_user.name) @@ -60,7 +46,9 @@ class TestPOSOpeningEntry(IntegrationTestCase): self.assertEqual(opening_entry_1.status, "Open") self.assertEqual(opening_entry_1.user, test_user.name) - cashier_user = create_user("test_cashier@example.com", "Accounts Manager", "Sales Manager") + cashier_user = create_user( + "test_cashier@example.com", "Accounts Manager", "Sales Manager", "Stock User", "System Manager" + ) frappe.set_user(cashier_user.name) pos_profile2 = make_pos_profile(name="_Test POS Profile 2") diff --git a/erpnext/accounts/doctype/pos_profile/test_pos_profile.py b/erpnext/accounts/doctype/pos_profile/test_pos_profile.py index 23ef5678e0d..7c28504d5e8 100644 --- a/erpnext/accounts/doctype/pos_profile/test_pos_profile.py +++ b/erpnext/accounts/doctype/pos_profile/test_pos_profile.py @@ -2,19 +2,18 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import cint from erpnext.accounts.doctype.pos_profile.pos_profile import ( get_child_nodes, ) from erpnext.stock.get_item_details import get_pos_profile - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"] +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSProfile(IntegrationTestCase): +class TestPOSProfile(ERPNextTestSuite): def test_pos_profile(self): + frappe.set_user("Administrator") make_pos_profile() pos_profile = get_pos_profile("_Test Company") or {} @@ -36,8 +35,6 @@ class TestPOSProfile(IntegrationTestCase): self.assertEqual(len(items), products_count[0][0]) self.assertEqual(len(customers), customers_count[0][0]) - frappe.db.sql("delete from `tabPOS Profile`") - def test_disabled_pos_profile_creation(self): make_pos_profile(name="_Test POS Profile 001", disabled=1) diff --git a/erpnext/accounts/doctype/pos_profile_user/test_pos_profile_user.py b/erpnext/accounts/doctype/pos_profile_user/test_pos_profile_user.py index 27afe146f0a..6223478e3e8 100644 --- a/erpnext/accounts/doctype/pos_profile_user/test_pos_profile_user.py +++ b/erpnext/accounts/doctype/pos_profile_user/test_pos_profile_user.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSProfileUser(IntegrationTestCase): +class TestPOSProfileUser(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/pos_settings/pos_settings.json b/erpnext/accounts/doctype/pos_settings/pos_settings.json index 7afc19423d8..8e9adc56f14 100644 --- a/erpnext/accounts/doctype/pos_settings/pos_settings.json +++ b/erpnext/accounts/doctype/pos_settings/pos_settings.json @@ -50,10 +50,10 @@ "options": "1" } ], - "hide_toolbar": 1, + "hide_toolbar": 0, "issingle": 1, "links": [], - "modified": "2026-01-09 17:30:41.476806", + "modified": "2026-03-16 13:28:19.677217", "modified_by": "Administrator", "module": "Accounts", "name": "POS Settings", diff --git a/erpnext/accounts/doctype/pos_settings/test_pos_settings.py b/erpnext/accounts/doctype/pos_settings/test_pos_settings.py index a45af6e1930..261e31fdd97 100644 --- a/erpnext/accounts/doctype/pos_settings/test_pos_settings.py +++ b/erpnext/accounts/doctype/pos_settings/test_pos_settings.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestPOSSettings(IntegrationTestCase): +class TestPOSSettings(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 7ebdfed9d8d..effd87c8a70 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice @@ -11,17 +10,15 @@ from erpnext.controllers.sales_and_purchase_return import make_return_doc from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.get_item_details import get_item_details +from erpnext.tests.utils import ERPNextTestSuite -class TestPricingRule(IntegrationTestCase): +class TestPricingRule(ERPNextTestSuite): def setUp(self): delete_existing_pricing_rules() setup_pricing_rule_data() self.enterClassContext(self.change_settings("Selling Settings", validate_selling_price=0)) - def tearDown(self): - delete_existing_pricing_rules() - def test_pricing_rule_for_discount(self): from frappe import MandatoryError @@ -414,6 +411,7 @@ class TestPricingRule(IntegrationTestCase): self.assertEqual(item.discount_amount, 110) self.assertEqual(item.rate, 990) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_pricing_rule_for_product_discount_on_same_item(self): frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule") test_record = { @@ -1189,6 +1187,7 @@ class TestPricingRule(IntegrationTestCase): si.delete() rule.delete() + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_pricing_rule_for_product_free_item_rounded_qty_and_recursion(self): frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule") test_record = { @@ -1234,6 +1233,7 @@ class TestPricingRule(IntegrationTestCase): so.save() self.assertEqual(len(so.items), 1) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_pricing_rule_for_product_free_item_round_free_qty(self): frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule") test_record = { @@ -1520,9 +1520,6 @@ class TestPricingRule(IntegrationTestCase): pi.cancel() -EXTRA_TEST_RECORD_DEPENDENCIES = ["UTM Campaign"] - - def make_pricing_rule(**args): args = frappe._dict(args) diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py index 763ea1bf7ea..6c2cff54cb3 100644 --- a/erpnext/accounts/doctype/pricing_rule/utils.py +++ b/erpnext/accounts/doctype/pricing_rule/utils.py @@ -242,8 +242,10 @@ def get_other_conditions(conditions, values, args): if group_condition: conditions += " and " + group_condition - date = args.get("transaction_date") or frappe.get_value( - args.get("doctype"), args.get("name"), "posting_date", ignore=True + date = ( + args.get("transaction_date") + or args.get("posting_date") + or frappe.get_value(args.get("doctype"), args.get("name"), "posting_date", ignore=True) ) if date: conditions += """ and %(transaction_date)s between ifnull(`tabPricing Rule`.valid_from, '2000-01-01') diff --git a/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py b/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py index 08f3b06e58c..95be179b66d 100644 --- a/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py +++ b/erpnext/accounts/doctype/process_deferred_accounting/test_process_deferred_accounting.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import ( @@ -10,9 +9,10 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import ( create_sales_invoice, ) from erpnext.stock.doctype.item.test_item import create_item +from erpnext.tests.utils import ERPNextTestSuite -class TestProcessDeferredAccounting(IntegrationTestCase): +class TestProcessDeferredAccounting(ERPNextTestSuite): def test_creation_of_ledger_entry_on_submit(self): """test creation of gl entries on submission of document""" change_acc_settings(acc_frozen_till_date="2023-05-31", book_deferred_entries_based_on="Months") @@ -52,6 +52,7 @@ class TestProcessDeferredAccounting(IntegrationTestCase): start_date="2023-05-01", end_date="2023-06-30", type="Income", + company="_Test Company", ) process_deferred_accounting.insert() @@ -82,6 +83,7 @@ class TestProcessDeferredAccounting(IntegrationTestCase): start_date="2019-01-01", end_date="2019-01-31", type="Income", + company="_Test Company", ) pda.submit() pda.cancel() diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py index d54ff6f902e..eff49ecadc5 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation/test_process_payment_reconciliation.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestProcessPaymentReconciliation(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProcessPaymentReconciliation(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/process_payment_reconciliation_log/test_process_payment_reconciliation_log.py b/erpnext/accounts/doctype/process_payment_reconciliation_log/test_process_payment_reconciliation_log.py index 66a4dca21e1..26c4b5a4a1c 100644 --- a/erpnext/accounts/doctype/process_payment_reconciliation_log/test_process_payment_reconciliation_log.py +++ b/erpnext/accounts/doctype/process_payment_reconciliation_log/test_process_payment_reconciliation_log.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestProcessPaymentReconciliationLog(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProcessPaymentReconciliationLog(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py b/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py index 17ce2c13b09..e695b11bcb5 100644 --- a/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py +++ b/erpnext/accounts/doctype/process_period_closing_voucher/test_process_period_closing_voucher.py @@ -2,19 +2,3 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase - -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] - - -class IntegrationTestProcessPeriodClosingVoucher(IntegrationTestCase): - """ - Integration tests for ProcessPeriodClosingVoucher. - Use this class for testing interactions between multiple components. - """ - - pass diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py index 3994538059c..76b67860376 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py @@ -465,6 +465,8 @@ def get_customer_emails(customer_name: str, primary_mandatory: str | int, billin when Is Billing Contact checked and Primary email- email with Is Primary checked""" + frappe.has_permission("Customer", "read", customer_name, throw=True) + billing_email = frappe.db.sql( """ SELECT @@ -508,6 +510,7 @@ def get_customer_emails(customer_name: str, primary_mandatory: str | int, billin @frappe.whitelist() def download_statements(document_name: str): doc = frappe.get_doc("Process Statement Of Accounts", document_name) + doc.check_permission("read") report = get_report_pdf(doc) if report: frappe.local.response.filename = doc.name + ".pdf" diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py index 2d599fee1af..c16933c7836 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate, today from erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts import ( @@ -12,26 +11,16 @@ from erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of ) from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestProcessStatementOfAccounts(AccountsTestMixin, IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestProcessStatementOfAccounts(AccountsTestMixin, ERPNextTestSuite): + def setUp(self): + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") letterhead.is_default = 0 letterhead.save() - cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) - @classmethod - def tearDownClass(cls): - super().tearDownClass() - letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") - letterhead.is_default = 1 - letterhead.save() - frappe.db.commit() # nosemgrep - - def setUp(self): self.create_company() self.create_customer() self.create_customer(customer_name="Other Customer") @@ -101,9 +90,6 @@ class TestProcessStatementOfAccounts(AccountsTestMixin, IntegrationTestCase): for age_range in expected_ageing: self.assertEqual(expected_ageing[age_range], ageing.get(age_range)) - def tearDown(self): - frappe.db.rollback() - def create_process_soa(**args): args = frappe._dict(args) diff --git a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py index 5ec80641192..8c7604b8f5c 100644 --- a/erpnext/accounts/doctype/process_subscription/test_process_subscription.py +++ b/erpnext/accounts/doctype/process_subscription/test_process_subscription.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestProcessSubscription(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestProcessSubscription(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py b/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py index 996f361fd3f..e33995996c6 100644 --- a/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py +++ b/erpnext/accounts/doctype/promotional_scheme/test_promotional_scheme.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.promotional_scheme.promotional_scheme import TransactionExists from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite -class TestPromotionalScheme(IntegrationTestCase): +class TestPromotionalScheme(ERPNextTestSuite): def setUp(self): if frappe.db.exists("Promotional Scheme", "_Test Scheme"): frappe.delete_doc("Promotional Scheme", "_Test Scheme") diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 3926e27e519..d2021e0f9a4 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -266,6 +266,7 @@ { "fieldname": "due_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Due Date", "oldfieldname": "due_date", "oldfieldtype": "Date" @@ -319,7 +320,8 @@ "fieldname": "posting_date", "fieldtype": "Date", "in_list_view": 1, - "label": "Date", + "in_standard_filter": 1, + "label": "Posting Date", "oldfieldname": "posting_date", "oldfieldtype": "Date", "print_hide": 1, @@ -389,7 +391,7 @@ }, { "collapsible": 1, - "collapsible_depends_on": "bill_no", + "collapsible_depends_on": "posting_date", "fieldname": "supplier_invoice_details", "fieldtype": "Section Break", "label": "Supplier Invoice" @@ -397,6 +399,8 @@ { "fieldname": "bill_no", "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Supplier Invoice No", "oldfieldname": "bill_no", "oldfieldtype": "Data", @@ -1689,7 +1693,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2026-02-23 13:23:57.269770", + "modified": "2026-03-17 20:44:00.221219", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 2134578efac..02e6e4c6524 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -734,9 +734,10 @@ class PurchaseInvoice(BuyingController): for item in self.get("items"): if item.purchase_receipt: frappe.throw( - _("Stock cannot be updated against Purchase Receipt {0}").format( - item.purchase_receipt - ) + _( + "Stock cannot be updated for Purchase Invoice {0} because a Purchase Receipt {1} has already been created for this transaction. Please disable the 'Update Stock' checkbox in the Purchase Invoice and save the invoice." + ).format(self.name, item.purchase_receipt), + title=_("Stock Update Not Allowed"), ) def validate_for_repost(self): diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index cb771bdc35a..33117c639dc 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, cint, flt, getdate, nowdate, today import erpnext @@ -37,24 +36,15 @@ from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle ) from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_transaction from erpnext.stock.tests.test_utils import StockTestMixin - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Cost Center", "Payment Term", "Payment Terms Template"] -IGNORE_TEST_RECORD_DEPENDENCIES = ["Serial No"] +from erpnext.tests.utils import ERPNextTestSuite -class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestPurchaseInvoice(ERPNextTestSuite, StockTestMixin): + def setUp(self): unlink_payment_on_cancel_of_invoice() frappe.db.set_single_value("Buying Settings", "allow_multiple_items", 1) - - @classmethod - def tearDownClass(cls): - unlink_payment_on_cancel_of_invoice(0) - - def tearDown(self): - frappe.db.rollback() + self.load_test_records("Purchase Invoice") + self.load_test_records("Journal Entry") def test_purchase_invoice_qty(self): pi = make_purchase_invoice(qty=0, do_not_save=True) @@ -352,6 +342,9 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): self.assertEqual(expected_values[gle.account][1], gle.debit) self.assertEqual(expected_values[gle.account][2], gle.credit) + @ERPNextTestSuite.change_settings( + "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1} + ) def test_purchase_invoice_with_exchange_rate_difference(self): from erpnext.stock.doctype.purchase_receipt.purchase_receipt import ( make_purchase_invoice as create_purchase_invoice, @@ -375,7 +368,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): # fetching the latest GL Entry with exchange gain and loss account account amount = frappe.db.get_value( - "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "debit" + "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "credit" ) discrepancy_caused_by_exchange_rate_diff = abs( pi.items[0].base_net_amount - pr.items[0].base_net_amount @@ -421,14 +414,14 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): # fetching the latest GL Entry with exchange gain and loss account account amount = frappe.db.get_value( - "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "debit" + "GL Entry", {"account": exchange_gain_loss_account, "voucher_no": pi.name}, "credit" ) discrepancy_caused_by_exchange_rate_diff = abs( pi.items[1].base_net_amount - pr.items[1].base_net_amount ) - self.assertEqual(discrepancy_caused_by_exchange_rate_diff, amount) + self.assertEqual(flt(discrepancy_caused_by_exchange_rate_diff, 2), amount) def test_purchase_invoice_change_naming_series(self): pi = frappe.copy_doc(self.globalTestRecords["Purchase Invoice"][1]) @@ -509,9 +502,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): self.assertEqual(tax.tax_amount, expected_values[i][1]) self.assertEqual(tax.total, expected_values[i][2]) - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_purchase_invoice_with_advance(self): jv = frappe.copy_doc(self.globalTestRecords["Journal Entry"][1]) jv.insert() @@ -562,9 +553,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): ) ) - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_invoice_with_advance_and_multi_payment_terms(self): jv = frappe.copy_doc(self.globalTestRecords["Journal Entry"][1]) jv.insert() @@ -1289,9 +1278,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): acc_settings.submit_journal_entriessubmit_journal_entries = 0 acc_settings.save() - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_gain_loss_with_advance_entry(self): unlink_enabled = frappe.db.get_single_value( "Accounts Settings", "unlink_payment_on_cancellation_of_invoice" @@ -1492,9 +1479,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): ) frappe.db.set_value("Company", "_Test Company", "exchange_gain_loss_account", original_account) - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_purchase_invoice_advance_taxes(self): from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -2160,7 +2145,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): rate = flt(sle.stock_value_difference) / flt(sle.actual_qty) self.assertAlmostEqual(rate, 500) - @IntegrationTestCase.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) def test_payment_allocation_for_payment_terms(self): from erpnext.buying.doctype.purchase_order.test_purchase_order import ( create_pr_against_po, @@ -2287,6 +2272,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): def test_create_purchase_invoice_without_mandatory(self): pi = frappe.new_doc("Purchase Invoice") + pi.company = "_Test Company" pi.flags.ignore_mandatory = True pi.insert(ignore_permissions=True) @@ -2295,7 +2281,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): pi.delete() - @IntegrationTestCase.change_settings("Buying Settings", {"supplier_group": None}) + @ERPNextTestSuite.change_settings("Buying Settings", {"supplier_group": None}) def test_purchase_invoice_without_supplier_group(self): # Create a Supplier test_supplier_name = "_Test Supplier Without Supplier Group" @@ -2415,6 +2401,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): "doctype": "Serial No", "item_code": serial_item, "serial_no": serial_no, + "company": "_Test Company", } ).insert() @@ -2467,11 +2454,6 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): self.assertEqual(row.rejected_serial_no, serial_nos[2]) def test_make_pr_and_pi_from_po(self): - from erpnext.assets.doctype.asset.test_asset import create_asset_category - - if not frappe.db.exists("Asset Category", "Computers"): - create_asset_category() - item = create_item( item_code="_Test_Item", is_stock_item=0, is_fixed_asset=1, asset_category="Computers" ) @@ -2642,7 +2624,7 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Buying Settings", {"maintain_same_rate": 0, "set_landed_cost_based_on_purchase_invoice_rate": 1} ) def test_pr_status_rate_adjusted_from_pi(self): diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py index 30bb017871b..4e34ec416b6 100644 --- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py +++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestPurchaseTaxesandChargesTemplate(IntegrationTestCase): +class TestPurchaseTaxesandChargesTemplate(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py b/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py index cde007d14f6..b60c13fc8b8 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py +++ b/erpnext/accounts/doctype/repost_accounting_ledger/test_repost_accounting_ledger.py @@ -4,7 +4,6 @@ import frappe from frappe import qb from frappe.query_builder.functions import Sum -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate, today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -14,23 +13,17 @@ from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.accounts.utils import get_fiscal_year from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries, make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class TestRepostAccountingLedger(AccountsTestMixin, IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) - +class TestRepostAccountingLedger(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.create_item() + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) update_repost_settings() - def tearDown(self): - frappe.db.rollback() - def test_01_basic_functions(self): si = create_sales_invoice( item=self.item, @@ -121,7 +114,7 @@ class TestRepostAccountingLedger(AccountsTestMixin, IntegrationTestCase): ral.append("vouchers", {"voucher_type": si.doctype, "voucher_no": si.name}) self.assertRaises(frappe.ValidationError, ral.save) - @IntegrationTestCase.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) def test_04_pcv_validation(self): # Clear old GL entries so PCV can be submitted. gl = frappe.qb.DocType("GL Entry") diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json b/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json index ba8188c1440..808986bba23 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json +++ b/erpnext/accounts/doctype/repost_accounting_ledger_settings/repost_accounting_ledger_settings.json @@ -15,11 +15,11 @@ } ], "grid_page_length": 50, - "hide_toolbar": 1, + "hide_toolbar": 0, "in_create": 1, "issingle": 1, "links": [], - "modified": "2026-01-02 18:19:08.888368", + "modified": "2026-03-16 13:28:21.312607", "modified_by": "Administrator", "module": "Accounts", "name": "Repost Accounting Ledger Settings", diff --git a/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py b/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py index 2dd4c50ba7e..6a8698e96af 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py +++ b/erpnext/accounts/doctype/repost_accounting_ledger_settings/test_repost_accounting_ledger_settings.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestRepostAccountingLedgerSettings(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestRepostAccountingLedgerSettings(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/repost_payment_ledger/test_repost_payment_ledger.py b/erpnext/accounts/doctype/repost_payment_ledger/test_repost_payment_ledger.py index a09ba71e27c..8c2b8946121 100644 --- a/erpnext/accounts/doctype/repost_payment_ledger/test_repost_payment_ledger.py +++ b/erpnext/accounts/doctype/repost_payment_ledger/test_repost_payment_ledger.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestRepostPaymentLedger(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestRepostPaymentLedger(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index f97e641c757..a76568eab2e 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -381,7 +381,9 @@ "fieldtype": "Date", "hide_days": 1, "hide_seconds": 1, - "label": "Date", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Posting Date", "no_copy": 1, "oldfieldname": "posting_date", "oldfieldtype": "Date", @@ -415,6 +417,7 @@ "fieldtype": "Date", "hide_days": 1, "hide_seconds": 1, + "in_list_view": 1, "label": "Payment Due Date", "no_copy": 1, "oldfieldname": "due_date", @@ -1639,6 +1642,7 @@ "fieldtype": "Select", "hide_days": 1, "hide_seconds": 1, + "in_list_view": 1, "in_standard_filter": 1, "label": "Status", "length": 30, @@ -2330,7 +2334,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-02-28 17:58:56.453076", + "modified": "2026-03-09 17:15:30.931929", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 7a21a0bcf69..a386e778154 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -920,11 +920,9 @@ class SalesInvoice(SellingController): if self.pos_profile: pos = frappe.get_doc("POS Profile", self.pos_profile) - if not self.get("payments") and not for_validate: - update_multi_mode_option(self, pos) - if pos: if not for_validate: + update_multi_mode_option(self, pos) self.tax_category = pos.get("tax_category") if not for_validate and not self.customer: @@ -2780,7 +2778,7 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None): "doctype": target_doctype, "postprocess": update_details, "set_target_warehouse": "set_from_warehouse", - "field_no_map": ["taxes_and_charges", "set_warehouse", "shipping_address"], + "field_no_map": ["taxes_and_charges", "set_warehouse", "shipping_address", "cost_center"], }, doctype + " Item": item_field_map, }, @@ -3009,6 +3007,8 @@ def update_multi_mode_option(doc, pos_profile): payment.account = payment_mode.default_account payment.type = payment_mode.type + mop_refetched = bool(doc.payments) and not doc.is_created_using_pos + doc.set("payments", []) invalid_modes = [] mode_of_payments = [d.mode_of_payment for d in pos_profile.get("payments")] @@ -3030,6 +3030,12 @@ def update_multi_mode_option(doc, pos_profile): msg = _("Please set default Cash or Bank account in Mode of Payments {}") frappe.throw(msg.format(", ".join(invalid_modes)), title=_("Missing Account")) + if mop_refetched: + frappe.toast( + _("Payment methods refreshed. Please review before proceeding."), + indicator="orange", + ) + def get_all_mode_of_payments(doc): return frappe.db.sql( diff --git a/erpnext/accounts/doctype/sales_invoice/test_records.json b/erpnext/accounts/doctype/sales_invoice/test_records.json index 814c6757d38..9aee69cd053 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_records.json +++ b/erpnext/accounts/doctype/sales_invoice/test_records.json @@ -383,5 +383,390 @@ "price_list_currency": "INR", "selling_price_list": "_Test Price List", "territory": "_Test Territory" + }, + { + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "cost_center": "_Test Cost Center - _TC", + "customer": "_Test Customer", + "customer_name": "_Test Customer", + "debit_to": "Debtors - _TC", + "doctype": "Sales Invoice", + "items": [ + { + "amount": 500.0, + "base_amount": 500.0, + "base_rate": 500.0, + "cost_center": "_Test Cost Center - _TC", + "description": "138-CMS Shoe", + "doctype": "Sales Invoice Item", + "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "138-CMS Shoe", + "item_name": "138-CMS Shoe", + "parentfield": "items", + "qty": 1.0, + "rate": 500.0, + "uom": "_Test UOM", + "conversion_factor": 1, + "stock_uom": "_Test UOM" + } + ], + "base_grand_total": 561.8, + "grand_total": 561.8, + "is_pos": 0, + "naming_series": "T-SINV-", + "base_net_total": 500.0, + "taxes": [ + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "cost_center": "_Test Cost Center - _TC", + "rate": 6 + }, + { + "account_head": "_Test Account Service Tax - _TC", + "charge_type": "On Net Total", + "description": "Service Tax", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "cost_center": "_Test Cost Center - _TC", + "rate": 6.36 + } + ], + "plc_conversion_rate": 1.0, + "price_list_currency": "INR", + "selling_price_list": "_Test Price List", + "territory": "_Test Territory" + }, + { + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "customer": "_Test Customer", + "customer_name": "_Test Customer", + "debit_to": "Debtors - _TC", + "doctype": "Sales Invoice", + "cost_center": "_Test Cost Center - _TC", + "items": [ + { + "amount": 500.0, + "base_amount": 500.0, + "base_rate": 500.0, + "cost_center": "_Test Cost Center - _TC", + "description": "_Test Item", + "doctype": "Sales Invoice Item", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "income_account": "Sales - _TC", + "item_code": "_Test Item", + "item_name": "_Test Item", + "parentfield": "items", + "price_list_rate": 500.0, + "qty": 1.0, + "uom": "_Test UOM", + "conversion_factor": 1, + "stock_uom": "_Test UOM" + } + ], + "base_grand_total": 630.0, + "grand_total": 630.0, + "is_pos": 0, + "naming_series": "T-SINV-", + "base_net_total": 500.0, + "taxes": [ + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "cost_center": "_Test Cost Center - _TC", + "rate": 16 + }, + { + "account_head": "_Test Account Service Tax - _TC", + "charge_type": "On Net Total", + "description": "Service Tax", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "cost_center": "_Test Cost Center - _TC", + "rate": 10 + } + ], + "plc_conversion_rate": 1.0, + "price_list_currency": "INR", + "selling_price_list": "_Test Price List", + "territory": "_Test Territory" + }, + { + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "customer": "_Test Customer", + "customer_name": "_Test Customer", + "debit_to": "Debtors - _TC", + "doctype": "Sales Invoice", + "cost_center": "_Test Cost Center - _TC", + "items": [ + { + "cost_center": "_Test Cost Center - _TC", + "doctype": "Sales Invoice Item", + "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 100", + "item_name": "_Test Item Home Desktop 100", + "item_tax_template": "_Test Account Excise Duty @ 10 - _TC", + "parentfield": "items", + "price_list_rate": 50, + "qty": 10, + "rate": 50, + "uom": "_Test UOM 1", + "conversion_factor": 1, + "stock_uom": "_Test UOM 1" + }, + { + "cost_center": "_Test Cost Center - _TC", + "doctype": "Sales Invoice Item", + "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 200", + "item_name": "_Test Item Home Desktop 200", + "parentfield": "items", + "price_list_rate": 150, + "qty": 5, + "uom": "_Test UOM", + "conversion_factor": 1, + "rate": 150, + "stock_uom": "_Test UOM" + } + ], + "grand_total": 0, + "is_pos": 0, + "naming_series": "T-SINV-", + "taxes": [ + { + "account_head": "_Test Account Shipping Charges - _TC", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "Shipping Charges", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "tax_amount": 100 + }, + { + "account_head": "_Test Account Customs Duty - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Customs Duty", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 10 + }, + { + "account_head": "_Test Account Excise Duty - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Excise Duty", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 12 + }, + { + "account_head": "_Test Account Education Cess - _TC", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "Education Cess", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 2, + "row_id": 3 + }, + { + "account_head": "_Test Account S&H Education Cess - _TC", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "S&H Education Cess", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 1, + "row_id": 3 + }, + { + "account_head": "_Test Account CST - _TC", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "CST", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 2, + "row_id": 5 + }, + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": 12.5 + }, + { + "account_head": "_Test Account Discount - _TC", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Discount", + "doctype": "Sales Taxes and Charges", + "parentfield": "taxes", + "rate": -10, + "row_id": 7 + } + ], + "plc_conversion_rate": 1.0, + "price_list_currency": "INR", + "selling_price_list": "_Test Price List", + "territory": "_Test Territory" + }, + { + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "customer": "_Test Customer", + "customer_name": "_Test Customer", + "debit_to": "Debtors - _TC", + "doctype": "Sales Invoice", + "cost_center": "_Test Cost Center - _TC", + "items": [ + { + "cost_center": "_Test Cost Center - _TC", + "doctype": "Sales Invoice Item", + "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 100", + "item_name": "_Test Item Home Desktop 100", + "item_tax_template": "_Test Account Excise Duty @ 10 - _TC", + "parentfield": "items", + "price_list_rate": 62.5, + "qty": 10, + "uom": "_Test UOM 1", + "conversion_factor": 1, + "stock_uom": "_Test UOM 1" + }, + { + "cost_center": "_Test Cost Center - _TC", + "doctype": "Sales Invoice Item", + "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 200", + "item_name": "_Test Item Home Desktop 200", + "parentfield": "items", + "price_list_rate": 190.66, + "qty": 5, + "uom": "_Test UOM", + "conversion_factor": 1, + "stock_uom": "_Test UOM" + } + ], + "grand_total": 0, + "is_pos": 0, + "naming_series": "T-SINV-", + "taxes": [ + { + "account_head": "_Test Account Excise Duty - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Excise Duty", + "doctype": "Sales Taxes and Charges", + "idx": 1, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 12 + }, + { + "account_head": "_Test Account Education Cess - _TC", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "Education Cess", + "doctype": "Sales Taxes and Charges", + "idx": 2, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 2, + "row_id": 1 + }, + { + "account_head": "_Test Account S&H Education Cess - _TC", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "S&H Education Cess", + "doctype": "Sales Taxes and Charges", + "idx": 3, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 1, + "row_id": 1 + }, + { + "account_head": "_Test Account CST - _TC", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "CST", + "doctype": "Sales Taxes and Charges", + "idx": 4, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 2, + "row_id": 3 + }, + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "idx": 5, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 12.5 + }, + { + "account_head": "_Test Account Customs Duty - _TC", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Customs Duty", + "doctype": "Sales Taxes and Charges", + "idx": 6, + "parentfield": "taxes", + "rate": 10 + }, + { + "account_head": "_Test Account Shipping Charges - _TC", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "Shipping Charges", + "doctype": "Sales Taxes and Charges", + "idx": 7, + "parentfield": "taxes", + "tax_amount": 100 + }, + { + "account_head": "_Test Account Discount - _TC", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Discount", + "doctype": "Sales Taxes and Charges", + "idx": 8, + "parentfield": "taxes", + "rate": -10, + "row_id": 7 + } + ], + "plc_conversion_rate": 1.0, + "price_list_currency": "INR", + "selling_price_list": "_Test Price List", + "territory": "_Test Territory" } ] diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index c5e2e61feb4..8c6b3c61b6b 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -7,7 +7,6 @@ import json import frappe from frappe import qb from frappe.model.dynamic_links import get_dynamic_link_map -from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, cint, flt, format_date, getdate, nowdate, today import erpnext @@ -23,7 +22,7 @@ from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import ( from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction from erpnext.accounts.utils import PaymentEntryUnlinkError from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries -from erpnext.assets.doctype.asset.test_asset import create_asset, create_asset_data +from erpnext.assets.doctype.asset.test_asset import create_asset from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( get_depr_schedule, ) @@ -53,6 +52,11 @@ from erpnext.tests.utils import ERPNextTestSuite class TestSalesInvoice(ERPNextTestSuite): def setUp(self): + self.load_test_records("Journal Entry") + self.load_test_records("Stock Entry") + self.load_test_records("Sales Invoice") + unlink_payment_on_cancel_of_invoice() + from erpnext.stock.doctype.stock_ledger_entry.test_stock_ledger_entry import create_items create_items(["_Test Internal Transfer Item"], uoms=[{"uom": "Box", "conversion_factor": 10}]) @@ -65,8 +69,9 @@ class TestSalesInvoice(ERPNextTestSuite): ) for company in frappe.get_all("Company", pluck="name"): frappe.db.set_value("Company", company, "accounts_frozen_till_date", None) + frappe.db.set_single_value("Selling Settings", "validate_selling_price", 0) - @change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"maintain_same_internal_transaction_rate": 1, "maintain_same_rate_action": "Stop"}, ) @@ -86,9 +91,6 @@ class TestSalesInvoice(ERPNextTestSuite): pi.submit() self.assertIn("Rate must be same", str(e.exception)) - def tearDown(self): - frappe.db.rollback() - def make(self): w = frappe.copy_doc(self.globalTestRecords["Sales Invoice"][0]) w.is_pos = 0 @@ -96,18 +98,6 @@ class TestSalesInvoice(ERPNextTestSuite): w.submit() return w - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) - cls.make_employees() - cls.make_sales_person() - unlink_payment_on_cancel_of_invoice() - - @classmethod - def tearDownClass(self): - unlink_payment_on_cancel_of_invoice(0) - def test_sales_invoice_qty(self): si = create_sales_invoice(qty=0, do_not_save=True) with self.assertRaises(InvalidQtyError): @@ -229,9 +219,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertRaises(frappe.LinkExistsError, si.cancel) unlink_payment_on_cancel_of_invoice() - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_payment_entry_unlink_against_standalone_credit_note(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry @@ -273,6 +261,9 @@ class TestSalesInvoice(ERPNextTestSuite): si1.load_from_db() self.assertRaises(PaymentEntryUnlinkError, si1.cancel) + @ERPNextTestSuite.change_settings( + "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1} + ) def test_sales_invoice_calculation_export_currency(self): si = frappe.copy_doc(self.globalTestRecords["Sales Invoice"][2]) si.currency = "USD" @@ -536,6 +527,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertTrue(gle) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_tax_calculation_with_multiple_items(self): si = create_sales_invoice(qty=84, rate=4.6, do_not_save=True) item_row = si.get("items")[0] @@ -564,6 +556,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(si.grand_total, 5474.0) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_tax_calculation_with_item_tax_template(self): si = create_sales_invoice(qty=84, rate=4.6, do_not_save=True) item_row = si.get("items")[0] @@ -630,6 +623,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(si.rounding_adjustment, 0.43) self.assertEqual(si.rounded_total, 5676.0) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_tax_calculation_with_multiple_items_and_discount(self): si = create_sales_invoice(qty=1, rate=75, do_not_save=True) item_row = si.get("items")[0] @@ -754,6 +748,9 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(si.base_grand_total, 1622.97) self.assertEqual(si.grand_total, 1622.97) + @ERPNextTestSuite.change_settings( + "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1} + ) def test_sales_invoice_calculation_export_currency_with_tax_inclusive_price(self): # prepare si = frappe.copy_doc(self.globalTestRecords["Sales Invoice"][3]) @@ -844,7 +841,7 @@ class TestSalesInvoice(ERPNextTestSuite): w = self.make() self.assertEqual(w.outstanding_amount, w.base_rounded_total) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 0}, ) @@ -1401,9 +1398,7 @@ class TestSalesInvoice(ERPNextTestSuite): dn.submit() return dn - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_sales_invoice_with_advance(self): jv = frappe.copy_doc(self.globalTestRecords["Journal Entry"][0]) jv.insert() @@ -1624,7 +1619,6 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertRaises(frappe.ValidationError, cr_note.save) def test_gle_made_when_asset_is_returned(self): - create_asset_data() asset = create_asset(item_code="Macbook Pro") si = create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=90000) @@ -2131,17 +2125,21 @@ class TestSalesInvoice(ERPNextTestSuite): si.insert() return si + @ERPNextTestSuite.change_settings("Selling Settings", {"sales_update_frequency": "Each Transaction"}) def test_company_monthly_sales(self): - existing_current_month_sales = frappe.get_cached_value( - "Company", "_Test Company", "total_monthly_sales" - ) + from erpnext.setup.doctype.company.company import update_company_current_month_sales + + company = "_Test Company" + + update_company_current_month_sales(company) + existing_current_month_sales = frappe.db.get_value("Company", company, "total_monthly_sales") si = create_sales_invoice() - current_month_sales = frappe.get_cached_value("Company", "_Test Company", "total_monthly_sales") + current_month_sales = frappe.db.get_value("Company", company, "total_monthly_sales") self.assertEqual(current_month_sales, existing_current_month_sales + si.base_grand_total) si.cancel() - current_month_sales = frappe.get_cached_value("Company", "_Test Company", "total_monthly_sales") + current_month_sales = frappe.db.get_value("Company", company, "total_monthly_sales") self.assertEqual(current_month_sales, existing_current_month_sales) def test_rounding_adjustment(self): @@ -2188,6 +2186,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(expected_values[gle.account][1], gle.debit) self.assertEqual(expected_values[gle.account][2], gle.credit) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_rounding_adjustment_2(self): si = create_sales_invoice(rate=400, do_not_save=True) for rate in [400.25, 600.30, 100.65]: @@ -2245,6 +2244,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(expected_account_values[0], gle.debit) self.assertEqual(expected_account_values[1], gle.credit) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_rounding_adjustment_3(self): from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import create_dimension @@ -2484,7 +2484,7 @@ class TestSalesInvoice(ERPNextTestSuite): for gle in gl_entries: self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"book_deferred_entries_based_on": "Days", "book_deferred_entries_via_journal_entry": 0}, ) @@ -2540,7 +2540,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertRaises(frappe.ValidationError, si.save) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"book_deferred_entries_based_on": "Months", "book_deferred_entries_via_journal_entry": 0}, ) @@ -3005,7 +3005,7 @@ class TestSalesInvoice(ERPNextTestSuite): si.submit() - @IntegrationTestCase.change_settings("Selling Settings", {"enable_discount_accounting": 1}) + @ERPNextTestSuite.change_settings("Selling Settings", {"enable_discount_accounting": 1}) def test_sales_invoice_with_discount_accounting_enabled(self): discount_account = create_account( account_name="Discount Account", @@ -3022,7 +3022,7 @@ class TestSalesInvoice(ERPNextTestSuite): check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1)) - @IntegrationTestCase.change_settings("Selling Settings", {"enable_discount_accounting": 1}) + @ERPNextTestSuite.change_settings("Selling Settings", {"enable_discount_accounting": 1}) def test_additional_discount_for_sales_invoice_with_discount_accounting_enabled(self): from erpnext.accounts.doctype.repost_accounting_ledger.test_repost_accounting_ledger import ( update_repost_settings, @@ -3113,7 +3113,6 @@ class TestSalesInvoice(ERPNextTestSuite): Tests if an Asset set to depreciate yearly on June 30, that gets sold on Sept 30, creates an additional depreciation entry on its date of sale. """ - create_asset_data() asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, submit=1) post_depreciation_entries(getdate("2021-09-30")) @@ -3139,7 +3138,6 @@ class TestSalesInvoice(ERPNextTestSuite): Tests if an Asset set to depreciate yearly on Dec 31, that gets sold on Dec 31 after two years, created an additional depreciation entry on its date of sale. """ - create_asset_data() asset = create_asset( item_code="Macbook Pro", calculate_depreciation=1, @@ -3460,7 +3458,8 @@ class TestSalesInvoice(ERPNextTestSuite): si.submit() frappe.db.set_value("Company", "_Test Company", "accounts_frozen_till_date", None) - @IntegrationTestCase.change_settings("Accounts Settings", {"over_billing_allowance": 0}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"over_billing_allowance": 0}) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_over_billing_case_against_delivery_note(self): """ Test a case where duplicating the item with qty = 1 in the invoice @@ -3486,7 +3485,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertTrue("cannot overbill" in str(err.exception).lower()) dn.cancel() - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", { "book_deferred_entries_via_journal_entry": 1, @@ -3604,9 +3603,7 @@ class TestSalesInvoice(ERPNextTestSuite): account.disabled = 0 account.save() - @IntegrationTestCase.change_settings( - "Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1} - ) + @ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}) def test_gain_loss_with_advance_entry(self): from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry @@ -3769,7 +3766,7 @@ class TestSalesInvoice(ERPNextTestSuite): set_advance_flag(company="_Test Company", flag=0, default_account="") - @IntegrationTestCase.change_settings("Selling Settings", {"customer_group": None, "territory": None}) + @ERPNextTestSuite.change_settings("Selling Settings", {"customer_group": None, "territory": None}) def test_sales_invoice_without_customer_group_and_territory(self): # create a customer if not frappe.db.exists("Customer", "_Test Simple Customer"): @@ -3787,7 +3784,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(si.customer_group, None) self.assertEqual(si.territory, None) - @IntegrationTestCase.change_settings("Selling Settings", {"allow_negative_rates_for_items": 0}) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_negative_rates_for_items": 0}) def test_sales_return_negative_rate(self): si = create_sales_invoice(is_return=1, qty=-2, rate=-10, do_not_save=True) self.assertRaises(frappe.ValidationError, si.save) @@ -3884,19 +3881,18 @@ class TestSalesInvoice(ERPNextTestSuite): def test_loyalty_points_redemption_with_shopping_cart(self): from erpnext.accounts.doctype.loyalty_program.test_loyalty_program import ( - create_records, create_sales_invoice_record, ) from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order # Set up loyalty program - create_records() - frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty") + loyalty_customer = frappe.get_doc("Customer", {"customer_name": "Test Loyalty Customer"}).name + frappe.db.set_value("Customer", loyalty_customer, "loyalty_program", "Test Single Loyalty") create_sales_invoice_record(10).insert().submit() # Create a sales order - so = make_sales_order(qty=10, do_not_save=True, customer="Test Loyalty Customer") + so = make_sales_order(qty=10, do_not_save=True, customer=loyalty_customer) so.name = "_T-Sales Order LP-0001" so.order_type = "Shopping Cart" so.loyalty_points = 50 @@ -4174,12 +4170,14 @@ class TestSalesInvoice(ERPNextTestSuite): si.save() return si + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_rounding_validation_for_opening_with_inclusive_tax(self): si = self._create_opening_invoice_with_inclusive_tax() # 'Round Off for Opening' not set in Company master # Ledger level validation must be thrown self.assertRaises(frappe.ValidationError, si.submit) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_ledger_entries_on_opening_invoice_with_rounding_loss_by_inclusive_tax(self): si = self._create_opening_invoice_with_inclusive_tax() # 'Round Off for Opening' is set in Company master @@ -4201,7 +4199,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(len(actual), 4) self.assertEqual(expected, actual) - @IntegrationTestCase.change_settings("Accounts Settings", {"enable_common_party_accounting": True}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"enable_common_party_accounting": True}) def test_common_party_with_foreign_currency_jv(self): from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import ( @@ -4283,7 +4281,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertTrue(jv) self.assertEqual(jv[0], si.grand_total) - @IntegrationTestCase.change_settings("Accounts Settings", {"enable_common_party_accounting": True}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"enable_common_party_accounting": True}) def test_common_party_with_different_currency_in_debtor_and_creditor(self): from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import ( @@ -4392,6 +4390,7 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertTrue(all([x == "Credit Note" for x in gl_entries])) + @ERPNextTestSuite.change_settings("Selling Settings", {"sales_update_frequency": "Each Transaction"}) def test_total_billed_amount(self): si = create_sales_invoice(do_not_submit=True) @@ -4407,6 +4406,8 @@ class TestSalesInvoice(ERPNextTestSuite): doc = frappe.get_doc("Project", project.name) self.assertEqual(doc.total_billed_amount, si.grand_total) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) + @ERPNextTestSuite.change_settings("Selling Settings", {"sales_update_frequency": "Each Transaction"}) def test_total_billed_amount_with_different_projects(self): # This test case is for checking the scenario where project is set at document level and for **some** child items only, not all from copy import copy @@ -4739,7 +4740,7 @@ class TestSalesInvoice(ERPNextTestSuite): doc.db_set("do_not_use_batchwise_valuation", original_value) - @change_settings("Selling Settings", {"set_zero_rate_for_expired_batch": True}) + @ERPNextTestSuite.change_settings("Selling Settings", {"set_zero_rate_for_expired_batch": True}) def test_zero_valuation_for_standalone_credit_note_with_expired_batch(self): item_code = "_Test Item for Expiry Batch Zero Valuation" make_item_for_si( @@ -4799,6 +4800,33 @@ class TestSalesInvoice(ERPNextTestSuite): self.assertEqual(stock_ledger_entry.incoming_rate, 0.0) + def test_inter_company_transaction_cost_center(self): + si = create_sales_invoice( + company="Wind Power LLC", + customer="_Test Internal Customer", + debit_to="Debtors - WP", + warehouse="Stores - WP", + income_account="Sales - WP", + expense_account="Cost of Goods Sold - WP", + parent_cost_center="Main - WP", + cost_center="Main - WP", + currency="USD", + do_not_save=1, + ) + + si.selling_price_list = "_Test Price List Rest of the World" + si.submit() + + cost_center = frappe.db.get_value("Company", "_Test Company 1", "cost_center") + frappe.db.set_value("Company", "_Test Company 1", "cost_center", None) + + target_doc = make_inter_company_transaction("Sales Invoice", si.name) + + self.assertEqual(target_doc.cost_center, None) + self.assertEqual(target_doc.items[0].cost_center, None) + + frappe.db.set_value("Company", "_Test Company 1", "cost_center", cost_center) + def make_item_for_si(item_code, properties=None): from erpnext.stock.doctype.item.test_item import make_item @@ -4983,9 +5011,6 @@ def create_sales_invoice_against_cost_center(**args): return si -EXTRA_TEST_RECORD_DEPENDENCIES = ["Journal Entry", "Contact", "Address"] - - def get_outstanding_amount(against_voucher_type, against_voucher, account, party, party_type): bal = flt( frappe.db.sql( diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json deleted file mode 100644 index 74db08d5b86..00000000000 --- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_records.json +++ /dev/null @@ -1,209 +0,0 @@ -[ - { - "company": "_Test Company", - "doctype": "Sales Taxes and Charges Template", - "taxes": [ - { - "account_head": "_Test Account VAT - _TC", - "charge_type": "On Net Total", - "description": "VAT", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 6 - }, - { - "account_head": "_Test Account Service Tax - _TC", - "charge_type": "On Net Total", - "description": "Service Tax", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 6.36 - } - ], - "title": "_Test Sales Taxes and Charges Template" - }, - { - "company": "_Test Company", - "doctype": "Sales Taxes and Charges Template", - "taxes": [ - { - "account_head": "_Test Account Shipping Charges - _TC", - "charge_type": "Actual", - "cost_center": "_Test Cost Center - _TC", - "description": "Shipping Charges", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "tax_amount": 100 - }, - { - "account_head": "_Test Account Customs Duty - _TC", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Customs Duty", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 10 - }, - { - "account_head": "_Test Account Excise Duty - _TC", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Excise Duty", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 12 - }, - { - "account_head": "_Test Account Education Cess - _TC", - "charge_type": "On Previous Row Amount", - "cost_center": "_Test Cost Center - _TC", - "description": "Education Cess", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 2, - "row_id": 3 - }, - { - "account_head": "_Test Account S&H Education Cess - _TC", - "charge_type": "On Previous Row Amount", - "cost_center": "_Test Cost Center - _TC", - "description": "S&H Education Cess", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 1, - "row_id": 3 - }, - { - "account_head": "_Test Account CST - _TC", - "charge_type": "On Previous Row Total", - "cost_center": "_Test Cost Center - _TC", - "description": "CST", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 2, - "row_id": 5 - }, - { - "account_head": "_Test Account VAT - _TC", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "VAT", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": 12.5 - }, - { - "account_head": "_Test Account Discount - _TC", - "charge_type": "On Previous Row Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Discount", - "doctype": "Sales Taxes and Charges", - "parentfield": "taxes", - "rate": -10, - "row_id": 7 - } - ], - "title": "_Test India Tax Master" - }, - { - "company": "_Test Company", - "doctype": "Sales Taxes and Charges Template", - "taxes": [ - { - "account_head": "_Test Account VAT - _TC", - "charge_type": "On Net Total", - "description": "VAT", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 12 - }, - { - "account_head": "_Test Account Service Tax - _TC", - "charge_type": "On Net Total", - "description": "Service Tax", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 4 - } - ], - "title": "_Test Sales Taxes and Charges Template - Rest of the World" - }, - { - "company": "_Test Company", - "doctype": "Sales Taxes and Charges Template", - "taxes": [ - { - "account_head": "_Test Account VAT - _TC", - "charge_type": "On Net Total", - "description": "VAT", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 12 - }, - { - "account_head": "_Test Account Service Tax - _TC", - "charge_type": "On Net Total", - "description": "Service Tax", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 4 - } - ], - "title": "_Test Sales Taxes and Charges Template 1" - }, - { - "company": "_Test Company", - "doctype": "Sales Taxes and Charges Template", - "taxes": [ - { - "account_head": "_Test Account VAT - _TC", - "charge_type": "On Net Total", - "description": "VAT", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 12 - }, - { - "account_head": "_Test Account Service Tax - _TC", - "charge_type": "On Net Total", - "description": "Service Tax", - "doctype": "Sales Taxes and Charges", - "cost_center": "Main - _TC", - "parentfield": "taxes", - "rate": 4 - } - ], - "title": "_Test Sales Taxes and Charges Template 2" - }, - { - "doctype" : "Sales Taxes and Charges Template", - "title": "_Test Tax 1", - "company": "_Test Company", - "taxes":[{ - "charge_type": "Actual", - "account_head": "Sales Expenses - _TC", - "cost_center": "Main - _TC", - "description": "Test Shopping cart taxes with Tax Rule", - "tax_amount": 1000 - }] - }, - { - "doctype" : "Sales Taxes and Charges Template", - "title": "_Test Tax 2", - "company": "_Test Company", - "taxes":[{ - "charge_type": "Actual", - "account_head": "Sales Expenses - _TC", - "cost_center": "Main - _TC", - "description": "Test Shopping cart taxes with Tax Rule", - "tax_amount": 200 - }] - } -] diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py index e7454829e98..f780fef5c0e 100644 --- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py +++ b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSalesTaxesandChargesTemplate(IntegrationTestCase): +class TestSalesTaxesandChargesTemplate(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py index 9cd05bdbe37..e1d56167476 100644 --- a/erpnext/accounts/doctype/share_transfer/test_share_transfer.py +++ b/erpnext/accounts/doctype/share_transfer/test_share_transfer.py @@ -2,14 +2,12 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.share_transfer.share_transfer import ShareDontExists - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Share Type", "Shareholder"] +from erpnext.tests.utils import ERPNextTestSuite -class TestShareTransfer(IntegrationTestCase): +class TestShareTransfer(ERPNextTestSuite): def setUp(self): frappe.db.sql("delete from `tabShare Transfer`") frappe.db.sql("delete from `tabShare Balance`") diff --git a/erpnext/accounts/doctype/share_type/test_records.json b/erpnext/accounts/doctype/share_type/test_records.json deleted file mode 100644 index 88cb8c056fe..00000000000 --- a/erpnext/accounts/doctype/share_type/test_records.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "doctype": "Share Type", - "title": "Class A" - }, - { - "doctype": "Share Type", - "title": "Class B" - } -] \ No newline at end of file diff --git a/erpnext/accounts/doctype/share_type/test_share_type.py b/erpnext/accounts/doctype/share_type/test_share_type.py index c43eb206c69..3e067c16166 100644 --- a/erpnext/accounts/doctype/share_type/test_share_type.py +++ b/erpnext/accounts/doctype/share_type/test_share_type.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestShareType(IntegrationTestCase): +class TestShareType(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/shareholder/test_records.json b/erpnext/accounts/doctype/shareholder/test_records.json deleted file mode 100644 index 39b72d47770..00000000000 --- a/erpnext/accounts/doctype/shareholder/test_records.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "doctype": "Shareholder", - "naming_series": "SH-", - "title": "Iron Man", - "company": "_Test Company" - }, - { - "doctype": "Shareholder", - "naming_series": "SH-", - "title": "Thor", - "company": "_Test Company" - }, - { - "doctype": "Shareholder", - "naming_series": "SH-", - "title": "Hulk", - "company": "_Test Company" - } -] \ No newline at end of file diff --git a/erpnext/accounts/doctype/shareholder/test_shareholder.py b/erpnext/accounts/doctype/shareholder/test_shareholder.py index 00c321dcb69..d2cc440d60d 100644 --- a/erpnext/accounts/doctype/shareholder/test_shareholder.py +++ b/erpnext/accounts/doctype/shareholder/test_shareholder.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestShareholder(IntegrationTestCase): +class TestShareholder(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py index d9b7b0a408f..3ec11364afa 100644 --- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py @@ -152,7 +152,9 @@ class ShippingRule(Document): frappe.throw(_("Shipping rule only applicable for Buying")) shipping_charge["doctype"] = "Purchase Taxes and Charges" - shipping_charge["category"] = "Valuation and Total" + shipping_charge["category"] = ( + "Valuation and Total" if doc.get_stock_items() or doc.get_asset_items() else "Total" + ) shipping_charge["add_deduct_tax"] = "Add" existing_shipping_charge = doc.get("taxes", filters=shipping_charge) diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py index 57099aae6a3..40e66756f7e 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py @@ -2,16 +2,19 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.shipping_rule.shipping_rule import ( FromGreaterThanToError, ManyBlankToValuesError, OverlappingConditionError, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestShippingRule(IntegrationTestCase): +class TestShippingRule(ERPNextTestSuite): + def setUp(self): + self.load_test_records("Shipping Rule") + def test_from_greater_than_to(self): shipping_rule = frappe.copy_doc(self.globalTestRecords["Shipping Rule"][0]) shipping_rule.name = self.globalTestRecords["Shipping Rule"][0].get("name") @@ -85,5 +88,5 @@ def create_shipping_rule(shipping_rule_type, shipping_rule_name): }, ) sr.insert(ignore_permissions=True) - sr.submit() + return sr diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py index b6b1cdc81e2..d90a589d5e6 100644 --- a/erpnext/accounts/doctype/subscription/test_subscription.py +++ b/erpnext/accounts/doctype/subscription/test_subscription.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils.data import ( add_days, add_months, @@ -18,20 +17,16 @@ from frappe.utils.data import ( from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.subscription.subscription import get_prorata_factor - -EXTRA_TEST_RECORD_DEPENDENCIES = ("UOM", "Item Group", "Item") +from erpnext.tests.utils import ERPNextTestSuite -class TestSubscription(IntegrationTestCase): +class TestSubscription(ERPNextTestSuite): def setUp(self): make_plans() create_parties() reset_settings() frappe.db.set_value("Company", "_Test Company", "accounts_frozen_till_date", None) - def tearDown(self): - frappe.db.rollback() - def test_create_subscription_with_trial_with_correct_period(self): subscription = create_subscription( trial_period_start=nowdate(), trial_period_end=add_months(nowdate(), 1) @@ -471,7 +466,7 @@ class TestSubscription(IntegrationTestCase): currency = frappe.db.get_value("Sales Invoice", subscription.invoices[0].name, "currency") self.assertEqual(currency, "USD") - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1}, ) diff --git a/erpnext/accounts/doctype/subscription_invoice/test_subscription_invoice.py b/erpnext/accounts/doctype/subscription_invoice/test_subscription_invoice.py index 347777b6945..15b4a017602 100644 --- a/erpnext/accounts/doctype/subscription_invoice/test_subscription_invoice.py +++ b/erpnext/accounts/doctype/subscription_invoice/test_subscription_invoice.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSubscriptionInvoice(IntegrationTestCase): +class TestSubscriptionInvoice(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py index 6c11af041c9..76328f9e4c3 100644 --- a/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py +++ b/erpnext/accounts/doctype/subscription_plan/test_subscription_plan.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSubscriptionPlan(IntegrationTestCase): +class TestSubscriptionPlan(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/subscription_settings/subscription_settings.json b/erpnext/accounts/doctype/subscription_settings/subscription_settings.json index 326fee345dc..06112d51fd1 100644 --- a/erpnext/accounts/doctype/subscription_settings/subscription_settings.json +++ b/erpnext/accounts/doctype/subscription_settings/subscription_settings.json @@ -31,10 +31,10 @@ } ], "grid_page_length": 50, - "hide_toolbar": 1, + "hide_toolbar": 0, "issingle": 1, "links": [], - "modified": "2026-01-02 18:18:34.671062", + "modified": "2026-03-16 13:28:20.485964", "modified_by": "Administrator", "module": "Accounts", "name": "Subscription Settings", diff --git a/erpnext/accounts/doctype/subscription_settings/test_subscription_settings.py b/erpnext/accounts/doctype/subscription_settings/test_subscription_settings.py index 36fd6b0f7a7..d6a4376d806 100644 --- a/erpnext/accounts/doctype/subscription_settings/test_subscription_settings.py +++ b/erpnext/accounts/doctype/subscription_settings/test_subscription_settings.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSubscriptionSettings(IntegrationTestCase): +class TestSubscriptionSettings(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/tax_category/test_records.json b/erpnext/accounts/doctype/tax_category/test_records.json deleted file mode 100644 index 1bb7f5ed876..00000000000 --- a/erpnext/accounts/doctype/tax_category/test_records.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "doctype": "Tax Category", - "title": "_Test Tax Category 1" - }, - { - "doctype": "Tax Category", - "title": "_Test Tax Category 2" - }, - { - "doctype": "Tax Category", - "title": "_Test Tax Category 3" - } -] diff --git a/erpnext/accounts/doctype/tax_category/test_tax_category.py b/erpnext/accounts/doctype/tax_category/test_tax_category.py index 596682499d9..bd51ba7ba36 100644 --- a/erpnext/accounts/doctype/tax_category/test_tax_category.py +++ b/erpnext/accounts/doctype/tax_category/test_tax_category.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxCategory(IntegrationTestCase): +class TestTaxCategory(ERPNextTestSuite): pass diff --git a/erpnext/accounts/doctype/tax_rule/test_records.json b/erpnext/accounts/doctype/tax_rule/test_records.json deleted file mode 100644 index e80b12f73ea..00000000000 --- a/erpnext/accounts/doctype/tax_rule/test_records.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "doctype": "Tax Rule", - "tax_type" : "Sales", - "sales_tax_template": "_Test Tax 1 - _TC", - "use_for_shopping_cart": 1, - "billing_city": "_Test City", - "billing_state": "Test State", - "billing_country": "India", - "shipping_city": "_Test City", - "shipping_country": "India", - "priority": 1, - "company": "_Test Company" - }, - { - "doctype": "Tax Rule", - "tax_type" : "Sales", - "sales_tax_template": "_Test Tax 2 - _TC", - "use_for_shopping_cart": 0, - "billing_city": "_Test City", - "billing_country": "India", - "shipping_city": "_Test City", - "shipping_state": "Test State", - "shipping_country": "India", - "priority": 2, - "company": "_Test Company" - } -] \ No newline at end of file diff --git a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py index 9b8e4feb83a..cd47d689c60 100644 --- a/erpnext/accounts/doctype/tax_rule/test_tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/test_tax_rule.py @@ -2,25 +2,16 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.tax_rule.tax_rule import ConflictingTaxRule, get_tax_template from erpnext.crm.doctype.opportunity.opportunity import make_quotation from erpnext.crm.doctype.opportunity.test_opportunity import make_opportunity +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxRule(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - frappe.db.set_single_value("Shopping Cart Settings", "enabled", 0) - - @classmethod - def tearDownClass(cls): - frappe.db.sql("delete from `tabTax Rule`") - +class TestTaxRule(ERPNextTestSuite): def setUp(self): - frappe.db.sql("delete from `tabTax Rule`") + frappe.db.set_single_value("Shopping Cart Settings", "enabled", 0) def test_conflict(self): tax_rule1 = make_tax_rule( 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 a9773ceae60..66dc090f7c7 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 @@ -5,28 +5,21 @@ import datetime import frappe from frappe.custom.doctype.custom_field.custom_field import create_custom_fields -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.utils import get_fiscal_year from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Supplier Group", "Customer Group"] +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxWithholdingCategory(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestTaxWithholdingCategory(ERPNextTestSuite): + def setUp(self): # create relevant supplier, etc create_records() create_tax_withholding_category_records() make_pan_no_field() - def tearDown(self): - frappe.db.rollback() - def validate_tax_withholding_entries(self, doctype, docname, expected_entries): """Validate tax withholding entries for a document""" entries = frappe.get_all( @@ -1036,6 +1029,7 @@ class TestTaxWithholdingCategory(IntegrationTestCase): self.cleanup_invoices(invoices) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_multiple_items": 1}) def test_tds_calculation_on_net_total_partial_tds(self): self.setup_party_with_category("Supplier", "Test TDS Supplier4", "Cumulative Threshold TDS") invoices = [] @@ -2049,7 +2043,7 @@ class TestTaxWithholdingCategory(IntegrationTestCase): self.assertEqual(pi2.taxes, []) self.assertEqual(payment.taxes[0].tax_amount, 6000) - @IntegrationTestCase.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) def test_tds_payment_entry_cancellation(self): """ Test payment entry cancellation clears withholding references from matched entries @@ -2227,7 +2221,7 @@ class TestTaxWithholdingCategory(IntegrationTestCase): self.validate_tax_withholding_entries("Purchase Invoice", pi1.name, expected_entries) self.cleanup_invoices(invoices) - @IntegrationTestCase.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1}) def test_tds_purchase_invoice_cancellation(self): """ Test that after cancellation, new documents get automatically adjusted against remaining entries diff --git a/erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py b/erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py index 6aff1116935..fa0adfae5b8 100644 --- a/erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py +++ b/erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py @@ -197,6 +197,7 @@ class TaxWithholdingEntry(Document): new_entry = frappe.copy_doc(old_entry) new_entry.update(values_to_update) + new_entry.flags.skip_docstatus_validation = True new_entry.insert() docs_needing_reindex.add((old_entry.parenttype, old_entry.parent)) @@ -335,6 +336,7 @@ class TaxWithholdingEntry(Document): "withholding_date": None, } new_entry.update(values_to_update) + new_entry.flags.skip_docstatus_validation = True new_entry.insert() docs_needing_reindex.add((entry.parenttype, entry.parent)) diff --git a/erpnext/accounts/doctype/tax_withholding_entry/test_tax_withholding_entry.py b/erpnext/accounts/doctype/tax_withholding_entry/test_tax_withholding_entry.py index 8a09f46e079..3f52eb77ee5 100644 --- a/erpnext/accounts/doctype/tax_withholding_entry/test_tax_withholding_entry.py +++ b/erpnext/accounts/doctype/tax_withholding_entry/test_tax_withholding_entry.py @@ -1,17 +1,10 @@ # Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe -from frappe.tests import IntegrationTestCase - -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] +from erpnext.tests.utils import ERPNextTestSuite -class IntegrationTestTaxWithholdingEntry(IntegrationTestCase): +class IntegrationTestTaxWithholdingEntry(ERPNextTestSuite): """ Integration tests for TaxWithholdingEntry. Use this class for testing interactions between multiple components. diff --git a/erpnext/accounts/doctype/tax_withholding_group/test_tax_withholding_group.py b/erpnext/accounts/doctype/tax_withholding_group/test_tax_withholding_group.py index 268febe3d7e..eacdf7f36fc 100644 --- a/erpnext/accounts/doctype/tax_withholding_group/test_tax_withholding_group.py +++ b/erpnext/accounts/doctype/tax_withholding_group/test_tax_withholding_group.py @@ -1,17 +1,10 @@ # Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe -from frappe.tests import IntegrationTestCase - -# On IntegrationTestCase, the doctype test records and all -# link-field test record dependencies are recursively loaded -# Use these module variables to add/remove to/from that list -EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] -IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"] +from erpnext.tests.utils import ERPNextTestSuite -class IntegrationTestTaxWithholdingGroup(IntegrationTestCase): +class IntegrationTestTaxWithholdingGroup(ERPNextTestSuite): """ Integration tests for TaxWithholdingGroup. Use this class for testing interactions between multiple components. diff --git a/erpnext/accounts/doctype/unreconcile_payment/test_unreconcile_payment.py b/erpnext/accounts/doctype/unreconcile_payment/test_unreconcile_payment.py index acd30cc47b7..7f931b7556e 100644 --- a/erpnext/accounts/doctype/unreconcile_payment/test_unreconcile_payment.py +++ b/erpnext/accounts/doctype/unreconcile_payment/test_unreconcile_payment.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry @@ -12,9 +11,10 @@ from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite -class TestUnreconcilePayment(AccountsTestMixin, IntegrationTestCase): +class TestUnreconcilePayment(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() @@ -23,9 +23,6 @@ class TestUnreconcilePayment(AccountsTestMixin, IntegrationTestCase): self.create_item() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_sales_invoice(self, do_not_submit=False): si = create_sales_invoice( item=self.item, diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index 97008d0b057..a04511f0c40 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -429,6 +429,8 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False): gle.flags.adv_adj = adv_adj gle.flags.update_outstanding = update_outstanding or "Yes" gle.flags.notify_update = False + if gle.is_cancelled: + gle.flags.ignore_links = True gle.submit() if ( diff --git a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json b/erpnext/accounts/print_format/point_of_sale/point_of_sale.json deleted file mode 100644 index c0c50cb4e26..00000000000 --- a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "align_labels_right": 0, - "creation": "2016-05-05 17:16:18.564460", - "custom_format": 1, - "disabled": 0, - "doc_type": "Sales Invoice", - "docstatus": 0, - "doctype": "Print Format", - "font": "Default", - "html": "\n\n

\n\t{{ company }}
\n\t{{ __(\"POS No : \") }} {{ offline_pos_name }}
\n

\n

\n\t{{ __(\"Customer\") }}: {{ customer }}
\n

\n\n

\n\t{{ __(\"Date\") }}: {{ dateutil.global_date_format(posting_date) }}
\n

\n\n
\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{% for item in items %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endfor %}\n\t\n
{{ __(\"Item\") }}{{ __(\"Qty\") }}{{ __(\"Amount\") }}
\n\t\t\t\t{{ item.item_name }}\n\t\t\t{{ format_number(item.qty, null,precision(\"difference\")) }}
@ {{ format_currency(item.rate, currency) }}
{{ format_currency(item.amount, currency) }}
\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% for row in taxes %}\n\t\t{% if not row.included_in_print_rate %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if discount_amount %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
\n\t\t\t\t{{ __(\"Net Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(total, currency) }}\n\t\t\t
\n\t\t\t\t{{ row.description }}\n\t\t\t\n\t\t\t\t{{ format_currency(row.tax_amount, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(discount_amount, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(grand_total, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Paid Amount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(paid_amount, currency) }}\n\t\t\t
\n\t\t\t\t{{ __(\"Qty Total\") }}\n\t\t\t\n\t\t\t\t{{ qty_total }}\n\t\t\t
\n\n\n
\n

{{ terms }}

\n

{{ __(\"Thank you, please visit again.\") }}

", - "idx": 0, - "line_breaks": 0, - "modified": "2019-09-05 17:20:30.726659", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Point of Sale", - "owner": "Administrator", - "print_format_builder": 0, - "print_format_type": "JS", - "raw_printing": 0, - "show_section_headings": 0, - "standard": "Yes" -} \ No newline at end of file diff --git a/erpnext/accounts/report/account_balance/test_account_balance.py b/erpnext/accounts/report/account_balance/test_account_balance.py index 13b261da724..5edf078b31d 100644 --- a/erpnext/accounts/report/account_balance/test_account_balance.py +++ b/erpnext/accounts/report/account_balance/test_account_balance.py @@ -1,12 +1,12 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.account_balance.account_balance import execute +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountBalance(IntegrationTestCase): +class TestAccountBalance(ERPNextTestSuite): def test_account_balance(self): frappe.db.sql("delete from `tabSales Invoice` where company='_Test Company 2'") frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 2'") diff --git a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py index 8da40ea3aa4..87a4b989661 100644 --- a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py +++ b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py @@ -1,13 +1,13 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.report.accounts_payable.accounts_payable import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountsPayable(AccountsTestMixin, IntegrationTestCase): +class TestAccountsPayable(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() @@ -15,9 +15,6 @@ class TestAccountsPayable(AccountsTestMixin, IntegrationTestCase): self.create_supplier(currency="USD", supplier_name="Test Supplier2") self.create_usd_payable_account() - def tearDown(self): - frappe.db.rollback() - def test_accounts_payable_for_foreign_currency_supplier(self): pi = self.create_purchase_invoice(do_not_submit=True) pi.currency = "USD" diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py index 907840e8ff4..9fa72f1716c 100644 --- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py @@ -1,6 +1,5 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, getdate, today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -8,9 +7,10 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sal from erpnext.accounts.report.accounts_receivable.accounts_receivable import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): +class TestAccountsReceivable(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() @@ -18,9 +18,6 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): self.create_usd_receivable_account() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_sales_invoice(self, no_payment_schedule=False, do_not_submit=False, **args): frappe.set_user("Administrator") si = create_sales_invoice( @@ -199,7 +196,7 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): row = report[1] self.assertTrue(len(row) == 0) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1}, ) @@ -448,7 +445,7 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): ], ) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0}, ) @@ -692,11 +689,9 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): ) def test_sales_person(self): - sales_person = ( - frappe.get_doc({"doctype": "Sales Person", "sales_person_name": "John Clark", "enabled": True}) - .insert() - .submit() - ) + sales_person = frappe.get_doc( + {"doctype": "Sales Person", "sales_person_name": "John Clark", "enabled": True} + ).insert() si = self.create_sales_invoice(do_not_submit=True) si.append("sales_team", {"sales_person": sales_person.name, "allocated_percentage": 100}) si.save().submit() @@ -772,18 +767,14 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): def test_party_account_filter(self): si1 = self.create_sales_invoice() - self.customer2 = ( - frappe.get_doc( - { - "doctype": "Customer", - "customer_name": "Jane Doe", - "type": "Individual", - "default_currency": "USD", - } - ) - .insert() - .submit() - ) + self.customer2 = frappe.get_doc( + { + "doctype": "Customer", + "customer_name": "Jane Doe", + "type": "Individual", + "default_currency": "USD", + } + ).insert() si2 = self.create_sales_invoice(do_not_submit=True) si2.posting_date = add_days(today(), -1) @@ -995,18 +986,14 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): self.assertEqual(expected_data, report_output) def test_future_payments_on_foreign_currency(self): - self.customer2 = ( - frappe.get_doc( - { - "doctype": "Customer", - "customer_name": "Jane Doe", - "type": "Individual", - "default_currency": "USD", - } - ) - .insert() - .submit() - ) + self.customer2 = frappe.get_doc( + { + "doctype": "Customer", + "customer_name": "Jane Doe", + "type": "Individual", + "default_currency": "USD", + } + ).insert() si = self.create_sales_invoice(do_not_submit=True) si.posting_date = add_days(today(), -1) diff --git a/erpnext/accounts/report/accounts_receivable_summary/test_accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/test_accounts_receivable_summary.py index d357c0d6273..96fa4ae8b64 100644 --- a/erpnext/accounts/report/accounts_receivable_summary/test_accounts_receivable_summary.py +++ b/erpnext/accounts/report/accounts_receivable_summary/test_accounts_receivable_summary.py @@ -1,14 +1,14 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.accounts_receivable_summary.accounts_receivable_summary import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): +class TestAccountsReceivable(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.maxDiff = None self.create_company() @@ -16,9 +16,6 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): self.create_item() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def test_01_receivable_summary_output(self): """ Test for Invoices, Paid, Advance and Outstanding @@ -112,7 +109,7 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): self.assertEqual(len(rpt_output), 1) self.assertDictEqual(rpt_output[0], expected_data) - @IntegrationTestCase.change_settings("Selling Settings", {"cust_master_name": "Naming Series"}) + @ERPNextTestSuite.change_settings("Selling Settings", {"cust_master_name": "Naming Series"}) def test_02_various_filters_and_output(self): filters = { "company": self.company, diff --git a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py index fad93e6fb70..212698765b1 100644 --- a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py +++ b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py @@ -4,6 +4,7 @@ import frappe from frappe import _ +from frappe.query_builder.functions import IfNull, Sum from frappe.utils import add_days, flt, formatdate @@ -75,210 +76,333 @@ def get_group_by_asset_category_data(filters): def get_asset_categories_for_grouped_by_category(filters): - condition = "" - if filters.get("asset_category"): - condition += " and a.asset_category = %(asset_category)s" - if filters.get("finance_book"): - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") + asset_capitalization_asset_item = frappe.qb.DocType("Asset Capitalization Asset Item") + asset_capitalization = frappe.qb.DocType("Asset Capitalization") - # nosemgrep - return frappe.db.sql( - f""" - SELECT a.asset_category, - ifnull(sum(case when a.purchase_date < %(from_date)s then - case when ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_as_on_from_date, - ifnull(sum(case when a.purchase_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end), 0) as value_of_new_purchase, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Sold" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_sold_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Scrapped" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_scrapped_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Capitalized" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_capitalized_asset - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - and not exists( - select 1 from `tabAsset Capitalization Asset Item` acai join `tabAsset Capitalization` ac on acai.parent=ac.name - where acai.asset = a.name - and ac.posting_date < %(from_date)s - and ac.docstatus=1 - ) - group by a.asset_category - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "asset_category": filters.get("asset_category"), - "finance_book": filters.get("finance_book"), - }, - as_dict=1, + disposal_in_period = ( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) ) + value_as_on_from_date = IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.purchase_date < filters.from_date) + & ((IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date)), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_as_on_from_date") + + value_of_new_purchase = IfNull( + Sum( + frappe.qb.terms.Case() + .when(asset.purchase_date >= filters.from_date, asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_new_purchase") + + value_of_sold_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Sold"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_sold_asset") + + value_of_scrapped_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Scrapped"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_scrapped_asset") + + value_of_capitalized_asset = IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Capitalized"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_capitalized_asset") + + capitalized_before_from_date = ( + frappe.qb.from_(asset_capitalization_asset_item) + .join(asset_capitalization) + .on(asset_capitalization_asset_item.parent == asset_capitalization.name) + .select(asset_capitalization_asset_item.asset) + .where(asset_capitalization.posting_date < filters.from_date) + .where(asset_capitalization.docstatus == 1) + ) + + query = ( + frappe.qb.from_(asset) + .select( + asset.asset_category, + value_as_on_from_date, + value_of_new_purchase, + value_of_sold_asset, + value_of_scrapped_asset, + value_of_capitalized_asset, + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(asset.name.notin(capitalized_before_from_date)) + .groupby(asset.asset_category) + ) + + if filters.get("asset_category"): + query = query.where(asset.asset_category == filters.get("asset_category")) + + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + query = query.where(asset.name.isin(assets_with_finance_book)) + + return query.run(as_dict=True) + def get_assets_for_grouped_by_category(filters): - condition = "" - if filters.get("asset_category"): - condition = f" and a.asset_category = '{filters.get('asset_category')}'" - finance_book_filter = "" - if filters.get("finance_book"): - finance_book_filter += " and ifnull(gle.finance_book, '')=%(finance_book)s" - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") + company = frappe.qb.DocType("Company") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") - # nosemgrep - return frappe.db.sql( - f""" - SELECT results.asset_category, - sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date, - sum(results.depreciation_eliminated_via_reversal) as depreciation_eliminated_via_reversal, - sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period, - sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period - from (SELECT a.asset_category, - ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then - gle.debit - else - 0 - end), 0) as accumulated_depreciation_as_on_from_date, - ifnull(sum(case when gle.posting_date <= %(to_date)s and ifnull(a.disposal_date, 0) = 0 then - gle.credit - else - 0 - end), 0) as depreciation_eliminated_via_reversal, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then - gle.debit - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s - and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then - gle.debit - else - 0 - end), 0) as depreciation_amount_during_the_period - from `tabGL Entry` gle - join `tabAsset` a on - gle.against_voucher = a.name - join `tabAsset Category Account` aca on - aca.parent = a.asset_category and aca.company_name = %(company)s - join `tabCompany` company on - company.name = %(company)s - where - a.docstatus=1 - and a.company=%(company)s - and a.purchase_date <= %(to_date)s - and gle.is_cancelled = 0 - and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) - {condition} {finance_book_filter} - group by a.asset_category - union - SELECT a.asset_category, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date < %(from_date)s then - 0 - else - a.opening_accumulated_depreciation - end), 0) as accumulated_depreciation_as_on_from_date, - 0 as depreciation_eliminated_via_reversal, - ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then - a.opening_accumulated_depreciation - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - 0 as depreciation_amount_during_the_period - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - group by a.asset_category) as results - group by results.asset_category - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "finance_book": filters.get("finance_book", ""), - }, - as_dict=1, + assets_with_finance_book = None + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + + from_gl_entries_query = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .join(company) + .on(company.name == filters.company) + .select( + asset.asset_category, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) & (IfNull(asset.disposal_date, 0) == 0), + gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_via_reversal"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) + & (gl_entry.posting_date <= asset.disposal_date), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date >= filters.from_date) + & (gl_entry.posting_date <= filters.to_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) + | (gl_entry.posting_date <= asset.disposal_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_amount_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.is_cancelled == 0) + .where( + gl_entry.account + == IfNull( + asset_category_account.depreciation_expense_account, + company.depreciation_expense_account, + ) + ) + .groupby(asset.asset_category) ) + from_opening_depreciation_query = ( + frappe.qb.from_(asset) + .select( + asset.asset_category, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) & (asset.disposal_date < filters.from_date), + 0, + ) + .else_(asset.opening_accumulated_depreciation) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.disposal_date >= filters.from_date) & (asset.disposal_date <= filters.to_date), + asset.opening_accumulated_depreciation, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .groupby(asset.asset_category) + ) + + if filters.get("asset_category"): + from_gl_entries_query = from_gl_entries_query.where( + asset.asset_category == filters.get("asset_category") + ) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.asset_category == filters.get("asset_category") + ) + + if assets_with_finance_book is not None: + from_gl_entries_query = from_gl_entries_query.where( + IfNull(gl_entry.finance_book, "") == filters.get("finance_book") + ).where(asset.name.isin(assets_with_finance_book)) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name.isin(assets_with_finance_book) + ) + + combined = {} + + for row in from_gl_entries_query.run(as_dict=True): + combined[row.asset_category] = { + "asset_category": row.asset_category, + "accumulated_depreciation_as_on_from_date": flt(row.accumulated_depreciation_as_on_from_date), + "depreciation_eliminated_via_reversal": flt(row.depreciation_eliminated_via_reversal), + "depreciation_eliminated_during_the_period": flt(row.depreciation_eliminated_during_the_period), + "depreciation_amount_during_the_period": flt(row.depreciation_amount_during_the_period), + } + + for row in from_opening_depreciation_query.run(as_dict=True): + if row.asset_category not in combined: + combined[row.asset_category] = { + "asset_category": row.asset_category, + "accumulated_depreciation_as_on_from_date": 0.0, + "depreciation_eliminated_via_reversal": 0.0, + "depreciation_eliminated_during_the_period": 0.0, + "depreciation_amount_during_the_period": 0.0, + } + + combined[row.asset_category]["accumulated_depreciation_as_on_from_date"] += flt( + row.accumulated_depreciation_as_on_from_date + ) + combined[row.asset_category]["depreciation_eliminated_during_the_period"] += flt( + row.depreciation_eliminated_during_the_period + ) + + return list(combined.values()) + def get_asset_value_adjustment_map_by_category(filters): - asset_value_adjustments = frappe.db.sql( - """ - SELECT - a.asset_category AS asset_category, - IFNULL( - SUM( - CASE - WHEN gle.posting_date < %(from_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(from_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_before_from_date, - IFNULL( - SUM( - CASE - WHEN gle.posting_date <= %(to_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(to_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_till_to_date + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") - FROM `tabGL Entry` gle - JOIN `tabAsset` a ON gle.against_voucher = a.name - JOIN `tabAsset Category Account` aca - ON aca.parent = a.asset_category - AND aca.company_name = %(company)s - WHERE gle.is_cancelled = 0 - AND a.docstatus = 1 - AND a.company = %(company)s - AND a.purchase_date <= %(to_date)s - AND gle.account = aca.fixed_asset_account - AND gle.is_opening = 'No' - GROUP BY a.asset_category - """, - {"from_date": filters.from_date, "to_date": filters.to_date, "company": filters.company}, - as_dict=1, - ) + asset_value_adjustments = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .select( + asset.asset_category.as_("asset_category"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.from_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_before_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.to_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_till_to_date"), + ) + .where(gl_entry.is_cancelled == 0) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.account == asset_category_account.fixed_asset_account) + .where(gl_entry.is_opening == "No") + .groupby(asset.asset_category) + ).run(as_dict=True) category_value_adjustment_map = {} @@ -346,210 +470,327 @@ def get_group_by_asset_data(filters): def get_asset_details_for_grouped_by_category(filters): - condition = "" - if filters.get("asset"): - condition += " and a.name = %(asset)s" - if filters.get("finance_book"): - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") + asset_capitalization_asset_item = frappe.qb.DocType("Asset Capitalization Asset Item") + asset_capitalization = frappe.qb.DocType("Asset Capitalization") - # nosemgrep - return frappe.db.sql( - f""" - SELECT a.name, a.asset_name, - ifnull(sum(case when a.purchase_date < %(from_date)s then - case when ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_as_on_from_date, - ifnull(sum(case when a.purchase_date >= %(from_date)s then - a.net_purchase_amount - else - 0 - end), 0) as value_of_new_purchase, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Sold" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_sold_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Scrapped" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_scrapped_asset, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 - and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s then - case when a.status = "Capitalized" then - a.net_purchase_amount - else - 0 - end - else - 0 - end), 0) as value_of_capitalized_asset - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - and not exists( - select 1 from `tabAsset Capitalization Asset Item` acai join `tabAsset Capitalization` ac on acai.parent=ac.name - where acai.asset = a.name - and ac.posting_date < %(from_date)s - and ac.docstatus=1 - ) - group by a.name - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "asset": filters.get("asset"), - "finance_book": filters.get("finance_book"), - }, - as_dict=1, + disposal_in_period = ( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) ) + capitalized_before_from_date = ( + frappe.qb.from_(asset_capitalization_asset_item) + .join(asset_capitalization) + .on(asset_capitalization_asset_item.parent == asset_capitalization.name) + .select(asset_capitalization_asset_item.asset) + .where(asset_capitalization.posting_date < filters.from_date) + .where(asset_capitalization.docstatus == 1) + ) + + query = ( + frappe.qb.from_(asset) + .select( + asset.name, + asset.asset_name, + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.purchase_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(asset.purchase_date >= filters.from_date, asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_new_purchase"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Sold"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_sold_asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when(disposal_in_period & (asset.status == "Scrapped"), asset.net_purchase_amount) + .else_(0) + ), + 0, + ).as_("value_of_scrapped_asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + disposal_in_period & (asset.status == "Capitalized"), + asset.net_purchase_amount, + ) + .else_(0) + ), + 0, + ).as_("value_of_capitalized_asset"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(asset.name.notin(capitalized_before_from_date)) + .groupby(asset.name) + ) + + if filters.get("asset"): + query = query.where(asset.name == filters.get("asset")) + + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + query = query.where(asset.name.isin(assets_with_finance_book)) + + return query.run(as_dict=True) + def get_assets_for_grouped_by_asset(filters): - condition = "" - if filters.get("asset"): - condition = f" and a.name = '{filters.get('asset')}'" - finance_book_filter = "" - if filters.get("finance_book"): - finance_book_filter += " and ifnull(gle.finance_book, '')=%(finance_book)s" - condition += " and exists (select 1 from `tabAsset Depreciation Schedule` ads where ads.asset = a.name and ads.finance_book = %(finance_book)s)" + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") + company = frappe.qb.DocType("Company") + asset_depreciation_schedule = frappe.qb.DocType("Asset Depreciation Schedule") - # nosemgrep - return frappe.db.sql( - f""" - SELECT results.name as asset, - sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date, - sum(results.depreciation_eliminated_via_reversal) as depreciation_eliminated_via_reversal, - sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period, - sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period - from (SELECT a.name as name, - ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then - gle.debit - else - 0 - end), 0) as accumulated_depreciation_as_on_from_date, - ifnull(sum(case when gle.posting_date <= %(to_date)s and ifnull(a.disposal_date, 0) = 0 then - gle.credit - else - 0 - end), 0) as depreciation_eliminated_via_reversal, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s - and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then - gle.debit - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s - and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then - gle.debit - else - 0 - end), 0) as depreciation_amount_during_the_period - from `tabGL Entry` gle - join `tabAsset` a on - gle.against_voucher = a.name - join `tabAsset Category Account` aca on - aca.parent = a.asset_category and aca.company_name = %(company)s - join `tabCompany` company on - company.name = %(company)s - where - a.docstatus=1 - and a.company=%(company)s - and a.purchase_date <= %(to_date)s - and gle.is_cancelled = 0 - and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) - {finance_book_filter} {condition} - group by a.name - union - SELECT a.name as name, - ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date < %(from_date)s then - 0 - else - a.opening_accumulated_depreciation - end), 0) as accumulated_depreciation_as_on_from_date, - 0 as depreciation_as_on_from_date_credit, - ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then - a.opening_accumulated_depreciation - else - 0 - end), 0) as depreciation_eliminated_during_the_period, - 0 as depreciation_amount_during_the_period - from `tabAsset` a - where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {condition} - group by a.name) as results - group by results.name - """, - { - "to_date": filters.to_date, - "from_date": filters.from_date, - "company": filters.company, - "finance_book": filters.get("finance_book", ""), - }, - as_dict=1, + assets_with_finance_book = None + if filters.get("finance_book"): + assets_with_finance_book = ( + frappe.qb.from_(asset_depreciation_schedule) + .select(asset_depreciation_schedule.asset) + .where(asset_depreciation_schedule.finance_book == filters.get("finance_book")) + ) + + from_gl_entries_query = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .join(company) + .on(company.name == filters.company) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) | (asset.disposal_date >= filters.from_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) & (IfNull(asset.disposal_date, 0) == 0), + gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_via_reversal"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) + & (asset.disposal_date >= filters.from_date) + & (asset.disposal_date <= filters.to_date) + & (gl_entry.posting_date <= asset.disposal_date), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date >= filters.from_date) + & (gl_entry.posting_date <= filters.to_date) + & ( + (IfNull(asset.disposal_date, 0) == 0) + | (gl_entry.posting_date <= asset.disposal_date) + ), + gl_entry.debit, + ) + .else_(0) + ), + 0, + ).as_("depreciation_amount_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.is_cancelled == 0) + .where( + gl_entry.account + == IfNull( + asset_category_account.depreciation_expense_account, + company.depreciation_expense_account, + ) + ) + .groupby(asset.name) ) + from_opening_depreciation_query = ( + frappe.qb.from_(asset) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (IfNull(asset.disposal_date, 0) != 0) & (asset.disposal_date < filters.from_date), + 0, + ) + .else_(asset.opening_accumulated_depreciation) + ), + 0, + ).as_("accumulated_depreciation_as_on_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (asset.disposal_date >= filters.from_date) & (asset.disposal_date <= filters.to_date), + asset.opening_accumulated_depreciation, + ) + .else_(0) + ), + 0, + ).as_("depreciation_eliminated_during_the_period"), + ) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .groupby(asset.name) + ) + + if filters.get("asset"): + from_gl_entries_query = from_gl_entries_query.where(asset.name == filters.get("asset")) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name == filters.get("asset") + ) + + if assets_with_finance_book is not None: + from_gl_entries_query = from_gl_entries_query.where( + IfNull(gl_entry.finance_book, "") == filters.get("finance_book") + ).where(asset.name.isin(assets_with_finance_book)) + from_opening_depreciation_query = from_opening_depreciation_query.where( + asset.name.isin(assets_with_finance_book) + ) + + combined = {} + + for row in from_gl_entries_query.run(as_dict=True): + combined[row.asset] = { + "asset": row.asset, + "accumulated_depreciation_as_on_from_date": flt(row.accumulated_depreciation_as_on_from_date), + "depreciation_eliminated_via_reversal": flt(row.depreciation_eliminated_via_reversal), + "depreciation_eliminated_during_the_period": flt(row.depreciation_eliminated_during_the_period), + "depreciation_amount_during_the_period": flt(row.depreciation_amount_during_the_period), + } + + for row in from_opening_depreciation_query.run(as_dict=True): + if row.asset not in combined: + combined[row.asset] = { + "asset": row.asset, + "accumulated_depreciation_as_on_from_date": 0.0, + "depreciation_eliminated_via_reversal": 0.0, + "depreciation_eliminated_during_the_period": 0.0, + "depreciation_amount_during_the_period": 0.0, + } + + combined[row.asset]["accumulated_depreciation_as_on_from_date"] += flt( + row.accumulated_depreciation_as_on_from_date + ) + combined[row.asset]["depreciation_eliminated_during_the_period"] += flt( + row.depreciation_eliminated_during_the_period + ) + + return list(combined.values()) + def get_asset_value_adjustment_map(filters): - asset_with_value_adjustments = frappe.db.sql( - """ - SELECT - a.name AS asset, - IFNULL( - SUM( - CASE - WHEN gle.posting_date < %(from_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(from_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_before_from_date, - IFNULL( - SUM( - CASE - WHEN gle.posting_date <= %(to_date)s - AND (a.disposal_date IS NULL OR a.disposal_date >= %(to_date)s) - THEN gle.debit - gle.credit - ELSE 0 - END - ), - 0) AS value_adjustment_till_to_date + asset = frappe.qb.DocType("Asset") + gl_entry = frappe.qb.DocType("GL Entry") + asset_category_account = frappe.qb.DocType("Asset Category Account") - FROM `tabGL Entry` gle - JOIN `tabAsset` a ON gle.against_voucher = a.name - JOIN `tabAsset Category Account` aca - ON aca.parent = a.asset_category - AND aca.company_name = %(company)s - WHERE gle.is_cancelled = 0 - AND a.docstatus = 1 - AND a.company = %(company)s - AND a.purchase_date <= %(to_date)s - AND gle.account = aca.fixed_asset_account - AND gle.is_opening = 'No' - GROUP BY a.name - """, - {"from_date": filters.from_date, "to_date": filters.to_date, "company": filters.company}, - as_dict=1, - ) + asset_with_value_adjustments = ( + frappe.qb.from_(gl_entry) + .join(asset) + .on(gl_entry.against_voucher == asset.name) + .join(asset_category_account) + .on( + (asset_category_account.parent == asset.asset_category) + & (asset_category_account.company_name == filters.company) + ) + .select( + asset.name.as_("asset"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date < filters.from_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.from_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_before_from_date"), + IfNull( + Sum( + frappe.qb.terms.Case() + .when( + (gl_entry.posting_date <= filters.to_date) + & (asset.disposal_date.isnull() | (asset.disposal_date >= filters.to_date)), + gl_entry.debit - gl_entry.credit, + ) + .else_(0) + ), + 0, + ).as_("value_adjustment_till_to_date"), + ) + .where(gl_entry.is_cancelled == 0) + .where(asset.docstatus == 1) + .where(asset.company == filters.company) + .where(asset.purchase_date <= filters.to_date) + .where(gl_entry.account == asset_category_account.fixed_asset_account) + .where(gl_entry.is_opening == "No") + .groupby(asset.name) + ).run(as_dict=True) asset_value_adjustment_map = {} diff --git a/erpnext/accounts/report/balance_sheet/test_balance_sheet.py b/erpnext/accounts/report/balance_sheet/test_balance_sheet.py index cf225ba39da..dce9d8ab0fa 100644 --- a/erpnext/accounts/report/balance_sheet/test_balance_sheet.py +++ b/erpnext/accounts/report/balance_sheet/test_balance_sheet.py @@ -2,18 +2,16 @@ # MIT License. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils.data import today from erpnext.accounts.report.balance_sheet.balance_sheet import execute +from erpnext.tests.utils import ERPNextTestSuite COMPANY = "_Test Company 6" COMPANY_SHORT_NAME = "_TC6" -EXTRA_TEST_RECORD_DEPENDENCIES = ["Company"] - -class TestBalanceSheet(IntegrationTestCase): +class TestBalanceSheet(ERPNextTestSuite): def test_balance_sheet(self): frappe.db.sql(f"delete from `tabJournal Entry` where company='{COMPANY}'") frappe.db.sql(f"delete from `tabGL Entry` where company='{COMPANY}'") diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py index ae675670446..5320de2b66c 100644 --- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py +++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py @@ -4,7 +4,10 @@ import frappe from frappe import _ -from frappe.utils import getdate, nowdate +from frappe.query_builder import Case +from frappe.query_builder.custom import ConstantColumn +from frappe.utils import getdate +from pypika import Order def execute(filters=None): @@ -48,17 +51,6 @@ def get_columns(): return columns -def get_conditions(filters): - conditions = "" - - if filters.get("from_date"): - conditions += " and posting_date>=%(from_date)s" - if filters.get("to_date"): - conditions += " and posting_date<=%(to_date)s" - - return conditions - - def get_entries(filters): entries = [] @@ -73,41 +65,90 @@ def get_entries(filters): return sorted( entries, - key=lambda k: k[2].strftime("%H%M%S") or getdate(nowdate()), + key=lambda k: getdate(k[2]), ) def get_entries_for_bank_clearance_summary(filters): entries = [] - conditions = get_conditions(filters) + je = frappe.qb.DocType("Journal Entry") + jea = frappe.qb.DocType("Journal Entry Account") - journal_entries = frappe.db.sql( - f"""SELECT - "Journal Entry", jv.name, jv.posting_date, jv.cheque_no, - jv.clearance_date, jvd.against_account, jvd.debit - jvd.credit - FROM - `tabJournal Entry Account` jvd, `tabJournal Entry` jv - WHERE - jvd.parent = jv.name and jv.docstatus=1 and jvd.account = %(account)s {conditions} - order by posting_date DESC, jv.name DESC""", - filters, - as_list=1, - ) + journal_entries = ( + frappe.qb.from_(jea) + .inner_join(je) + .on(jea.parent == je.name) + .select( + ConstantColumn("Journal Entry").as_("payment_document"), + je.name.as_("payment_entry"), + je.posting_date, + je.cheque_no, + je.clearance_date, + jea.against_account, + jea.debit_in_account_currency - jea.credit_in_account_currency, + ) + .where( + (jea.account == filters.account) + & (je.docstatus == 1) + & (je.posting_date >= filters.from_date) + & (je.posting_date <= filters.to_date) + & ((je.is_opening == "No") | (je.is_opening.isnull())) + ) + .orderby(je.posting_date, order=Order.desc) + .orderby(je.name, order=Order.desc) + ).run(as_list=True) - payment_entries = frappe.db.sql( - f"""SELECT - "Payment Entry", name, posting_date, reference_no, clearance_date, party, - if(paid_from=%(account)s, ((paid_amount * -1) - total_taxes_and_charges) , received_amount) - FROM - `tabPayment Entry` - WHERE - docstatus=1 and (paid_from = %(account)s or paid_to = %(account)s) {conditions} - order by posting_date DESC, name DESC""", - filters, - as_list=1, - ) + pe = frappe.qb.DocType("Payment Entry") + payment_entries = ( + frappe.qb.from_(pe) + .select( + ConstantColumn("Payment Entry").as_("payment_document"), + pe.name.as_("payment_entry"), + pe.posting_date, + pe.reference_no.as_("cheque_no"), + pe.clearance_date, + pe.party.as_("against_account"), + Case() + .when( + (pe.paid_from == filters.account), + ((pe.paid_amount * -1) - pe.total_taxes_and_charges), + ) + .else_(pe.received_amount), + ) + .where((pe.paid_from == filters.account) | (pe.paid_to == filters.account)) + .where( + (pe.docstatus == 1) + & (pe.posting_date >= filters.from_date) + & (pe.posting_date <= filters.to_date) + ) + .orderby(pe.posting_date, order=Order.desc) + .orderby(pe.name, order=Order.desc) + ).run(as_list=True) - entries = journal_entries + payment_entries + pi = frappe.qb.DocType("Purchase Invoice") + purchase_invoices = ( + frappe.qb.from_(pi) + .select( + ConstantColumn("Purchase Invoice").as_("payment_document"), + pi.name.as_("payment_entry"), + pi.posting_date, + pi.bill_no.as_("cheque_no"), + pi.clearance_date, + pi.supplier.as_("against_account"), + (pi.paid_amount * -1).as_("amount"), + ) + .where( + (pi.docstatus == 1) + & (pi.is_paid == 1) + & (pi.cash_bank_account == filters.account) + & (pi.posting_date >= filters.from_date) + & (pi.posting_date <= filters.to_date) + ) + .orderby(pi.posting_date, order=Order.desc) + .orderby(pi.name, order=Order.desc) + ).run(as_list=True) + + entries = journal_entries + payment_entries + purchase_invoices return entries diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py index bfc2f2d56ff..474e25c5474 100644 --- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py @@ -4,7 +4,11 @@ import frappe from frappe import _ +from frappe.query_builder import Case +from frappe.query_builder.custom import ConstantColumn +from frappe.query_builder.functions import Coalesce, Sum from frappe.utils import flt, getdate +from pypika import Order from erpnext.accounts.utils import get_balance_on @@ -123,73 +127,143 @@ def get_entries_for_bank_reconciliation_statement(filters): payment_entries = get_payment_entries(filters) + purchase_invoices = get_purchase_invoices(filters) + pos_entries = [] if filters.include_pos_transactions: pos_entries = get_pos_entries(filters) - return list(journal_entries) + list(payment_entries) + list(pos_entries) + return list(journal_entries) + list(payment_entries) + list(pos_entries) + list(purchase_invoices) def get_journal_entries(filters): - return frappe.db.sql( - """ - select "Journal Entry" as payment_document, jv.posting_date, - jv.name as payment_entry, jvd.debit_in_account_currency as debit, - jvd.credit_in_account_currency as credit, jvd.against_account, - jv.cheque_no as reference_no, jv.cheque_date as ref_date, jv.clearance_date, jvd.account_currency - from - `tabJournal Entry Account` jvd, `tabJournal Entry` jv - where jvd.parent = jv.name and jv.docstatus=1 - and jvd.account = %(account)s and jv.posting_date <= %(report_date)s - and ifnull(jv.clearance_date, '4000-01-01') > %(report_date)s - and ifnull(jv.is_opening, 'No') = 'No' - and jv.company = %(company)s """, - filters, - as_dict=1, - ) + je = frappe.qb.DocType("Journal Entry") + jea = frappe.qb.DocType("Journal Entry Account") + return ( + frappe.qb.from_(jea) + .join(je) + .on(jea.parent == je.name) + .select( + ConstantColumn("Journal Entry").as_("payment_document"), + je.name.as_("payment_entry"), + je.posting_date, + jea.debit_in_account_currency.as_("debit"), + jea.credit_in_account_currency.as_("credit"), + jea.against_account, + je.cheque_no.as_("reference_no"), + je.cheque_date.as_("ref_date"), + je.clearance_date, + jea.account_currency, + ) + .where( + (je.docstatus == 1) + & (jea.account == filters.account) + & (je.posting_date <= filters.report_date) + & (je.clearance_date.isnull() | (je.clearance_date > filters.report_date)) + & (je.company == filters.company) + & ((je.is_opening.isnull()) | (je.is_opening == "No")) + ) + .orderby(je.posting_date) + .orderby(je.name, order=Order.desc) + ).run(as_dict=True) def get_payment_entries(filters): - return frappe.db.sql( - """ - select - "Payment Entry" as payment_document, name as payment_entry, - reference_no, reference_date as ref_date, - if(paid_to=%(account)s, received_amount_after_tax, 0) as debit, - if(paid_from=%(account)s, paid_amount_after_tax, 0) as credit, - posting_date, ifnull(party,if(paid_from=%(account)s,paid_to,paid_from)) as against_account, clearance_date, - if(paid_to=%(account)s, paid_to_account_currency, paid_from_account_currency) as account_currency - from `tabPayment Entry` - where - (paid_from=%(account)s or paid_to=%(account)s) and docstatus=1 - and posting_date <= %(report_date)s - and ifnull(clearance_date, '4000-01-01') > %(report_date)s - and company = %(company)s - """, - filters, - as_dict=1, - ) + pe = frappe.qb.DocType("Payment Entry") + return ( + frappe.qb.from_(pe) + .select( + ConstantColumn("Payment Entry").as_("payment_document"), + pe.name.as_("payment_entry"), + pe.reference_no.as_("reference_no"), + pe.reference_date.as_("ref_date"), + Case().when(pe.paid_to == filters.account, pe.received_amount_after_tax).else_(0).as_("debit"), + Case().when(pe.paid_from == filters.account, pe.paid_amount_after_tax).else_(0).as_("credit"), + pe.posting_date, + Coalesce( + pe.party, Case().when(pe.paid_from == filters.account, pe.paid_to).else_(pe.paid_from) + ).as_("against_account"), + pe.clearance_date, + ( + Case() + .when(pe.paid_to == filters.account, pe.paid_to_account_currency) + .else_(pe.paid_from_account_currency) + ).as_("account_currency"), + ) + .where( + (pe.docstatus == 1) + & ((pe.paid_from == filters.account) | (pe.paid_to == filters.account)) + & (pe.posting_date <= filters.report_date) + & (pe.clearance_date.isnull() | (pe.clearance_date > filters.report_date)) + & (pe.company == filters.company) + ) + .orderby(pe.posting_date) + .orderby(pe.name, order=Order.desc) + ).run(as_dict=True) + + +def get_purchase_invoices(filters): + pi = frappe.qb.DocType("Purchase Invoice") + acc = frappe.qb.DocType("Account") + return ( + frappe.qb.from_(pi) + .inner_join(acc) + .on(pi.cash_bank_account == acc.name) + .select( + ConstantColumn("Purchase Invoice").as_("payment_document"), + pi.name.as_("payment_entry"), + pi.bill_no.as_("reference_no"), + pi.posting_date.as_("ref_date"), + Case().when(pi.paid_amount < 0, pi.paid_amount * -1).else_(0).as_("debit"), + Case().when(pi.paid_amount > 0, pi.paid_amount).else_(0).as_("credit"), + pi.posting_date, + pi.supplier.as_("against_account"), + pi.clearance_date, + acc.account_currency, + ) + .where( + (pi.docstatus == 1) + & (pi.is_paid == 1) + & (pi.cash_bank_account == filters.account) + & (pi.posting_date <= filters.report_date) + & (pi.clearance_date.isnull() | (pi.clearance_date > filters.report_date)) + & (pi.company == filters.company) + ) + .orderby(pi.posting_date) + .orderby(pi.name, order=Order.desc) + ).run(as_dict=True) def get_pos_entries(filters): - return frappe.db.sql( - """ - select - "Sales Invoice Payment" as payment_document, sip.name as payment_entry, sip.amount as debit, - si.posting_date, si.debit_to as against_account, sip.clearance_date, - account.account_currency, 0 as credit - from `tabSales Invoice Payment` sip, `tabSales Invoice` si, `tabAccount` account - where - sip.account=%(account)s and si.docstatus=1 and sip.parent = si.name - and account.name = sip.account and si.posting_date <= %(report_date)s and - ifnull(sip.clearance_date, '4000-01-01') > %(report_date)s - and si.company = %(company)s - order by - si.posting_date ASC, si.name DESC - """, - filters, - as_dict=1, - ) + si = frappe.qb.DocType("Sales Invoice") + si_payment = frappe.qb.DocType("Sales Invoice Payment") + acc = frappe.qb.DocType("Account") + return ( + frappe.qb.from_(si_payment) + .join(si) + .on(si_payment.parent == si.name) + .join(acc) + .on(si_payment.account == acc.name) + .select( + ConstantColumn("Sales Invoice").as_("payment_document"), + si.name.as_("payment_entry"), + si_payment.amount.as_("debit"), + si.posting_date, + si.debit_to.as_("against_account"), + si_payment.clearance_date, + acc.account_currency, + ConstantColumn(0).as_("credit"), + ) + .where( + (si_payment.account == filters.account) + & (si.docstatus == 1) + & (si.posting_date <= filters.report_date) + & (si_payment.clearance_date.isnull() | (si_payment.clearance_date > filters.report_date)) + & (si.company == filters.company) + ) + .orderby(si.posting_date) + .orderby(si_payment.name, order=Order.desc) + ).run(as_dict=True) def get_amounts_not_reflected_in_system(filters): @@ -205,30 +279,66 @@ def get_amounts_not_reflected_in_system(filters): def get_amounts_not_reflected_in_system_for_bank_reconciliation_statement(filters): - je_amount = frappe.db.sql( - """ - select sum(jvd.debit_in_account_currency - jvd.credit_in_account_currency) - from `tabJournal Entry Account` jvd, `tabJournal Entry` jv - where jvd.parent = jv.name and jv.docstatus=1 and jvd.account=%(account)s - and jv.posting_date > %(report_date)s and jv.clearance_date <= %(report_date)s - and ifnull(jv.is_opening, 'No') = 'No' """, - filters, + je = frappe.qb.DocType("Journal Entry") + jea = frappe.qb.DocType("Journal Entry Account") + + je_amount = ( + frappe.qb.from_(jea) + .inner_join(je) + .on(jea.parent == je.name) + .select( + Sum(jea.debit_in_account_currency - jea.credit_in_account_currency).as_("amount"), + ) + .where( + (je.docstatus == 1) + & (jea.account == filters.account) + & (je.posting_date > filters.report_date) + & (je.clearance_date <= filters.report_date) + & (je.company == filters.company) + & ((je.is_opening.isnull()) | (je.is_opening == "No")) + ) + .run(as_dict=True) ) + je_amount = flt(je_amount[0].amount) if je_amount else 0.0 - je_amount = flt(je_amount[0][0]) if je_amount else 0.0 - - pe_amount = frappe.db.sql( - """ - select sum(if(paid_from=%(account)s, paid_amount, received_amount)) - from `tabPayment Entry` - where (paid_from=%(account)s or paid_to=%(account)s) and docstatus=1 - and posting_date > %(report_date)s and clearance_date <= %(report_date)s""", - filters, + pe = frappe.qb.DocType("Payment Entry") + pe_amount = ( + frappe.qb.from_(pe) + .select( + Sum(Case().when(pe.paid_from == filters.account, pe.paid_amount).else_(pe.received_amount)).as_( + "amount" + ), + ) + .where( + ((pe.paid_from == filters.account) | (pe.paid_to == filters.account)) + & (pe.docstatus == 1) + & (pe.posting_date > filters.report_date) + & (pe.clearance_date <= filters.report_date) + & (pe.company == filters.company) + ) + .run(as_dict=True) ) + pe_amount = flt(pe_amount[0].amount) if pe_amount else 0.0 - pe_amount = flt(pe_amount[0][0]) if pe_amount else 0.0 + pi = frappe.qb.DocType("Purchase Invoice") + pi_amount = ( + frappe.qb.from_(pi) + .select( + Sum(pi.paid_amount).as_("amount"), + ) + .where( + (pi.docstatus == 1) + & (pi.is_paid == 1) + & (pi.cash_bank_account == filters.account) + & (pi.posting_date > filters.report_date) + & (pi.clearance_date <= filters.report_date) + & (pi.company == filters.company) + ) + ).run(as_dict=True) - return je_amount + pe_amount + pi_amount = flt(pi_amount[0].amount) if pi_amount else 0.0 + + return je_amount + pe_amount + pi_amount def get_balance_row(label, amount, account_currency): diff --git a/erpnext/accounts/report/bank_reconciliation_statement/test_bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/test_bank_reconciliation_statement.py index 1fed7a43f7d..2e73a001107 100644 --- a/erpnext/accounts/report/bank_reconciliation_statement/test_bank_reconciliation_statement.py +++ b/erpnext/accounts/report/bank_reconciliation_statement/test_bank_reconciliation_statement.py @@ -2,15 +2,14 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.report.bank_reconciliation_statement.bank_reconciliation_statement import ( execute, ) -from erpnext.tests.utils import if_lending_app_installed +from erpnext.tests.utils import ERPNextTestSuite, if_lending_app_installed -class TestBankReconciliationStatement(IntegrationTestCase): +class TestBankReconciliationStatement(ERPNextTestSuite): @if_lending_app_installed def test_loan_entries_in_bank_reco_statement(self): from lending.loan_management.doctype.loan.test_loan import create_loan_accounts diff --git a/erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py b/erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py index d9d74f483b0..3166abf4061 100644 --- a/erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py +++ b/erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py @@ -3,36 +3,21 @@ import frappe from frappe import _ -from frappe.tests import IntegrationTestCase from frappe.utils import flt, today from erpnext.accounts.report.consolidated_trial_balance.consolidated_trial_balance import execute from erpnext.setup.utils import get_exchange_rate +from erpnext.tests.utils import ERPNextTestSuite class ForeignCurrencyTranslationReserveNotFoundError(frappe.ValidationError): pass -class TestConsolidatedTrialBalance(IntegrationTestCase): - @classmethod - def setUpClass(cls): - from erpnext.accounts.report.trial_balance.test_trial_balance import create_company +class TestConsolidatedTrialBalance(ERPNextTestSuite): + def setUp(self): from erpnext.accounts.utils import get_fiscal_year - # Group Company - create_company(company_name="Parent Group Company India", is_group=1) - - create_company(company_name="Child Company India", parent_company="Parent Group Company India") - - # Child Company with different currency - create_company( - company_name="Child Company US", - country="United States", - currency="USD", - parent_company="Parent Group Company India", - ) - create_journal_entry( company="Parent Group Company India", acc1="Marketing Expenses - PGCI", @@ -48,7 +33,7 @@ class TestConsolidatedTrialBalance(IntegrationTestCase): company="Child Company US", acc1="Marketing Expenses - CCU", acc2="Cash - CCU", amount=1000 ) - cls.fiscal_year = get_fiscal_year(today(), company="Parent Group Company India")[0] + self.fiscal_year = get_fiscal_year(today(), company="Parent Group Company India")[0] def test_single_company_report(self): filters = frappe._dict({"company": ["Parent Group Company India"], "fiscal_year": self.fiscal_year}) diff --git a/erpnext/accounts/report/customer_ledger_summary/test_customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/test_customer_ledger_summary.py index f2ed334d16d..0b114dd96d2 100644 --- a/erpnext/accounts/report/customer_ledger_summary/test_customer_ledger_summary.py +++ b/erpnext/accounts/report/customer_ledger_summary/test_customer_ledger_summary.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests import IntegrationTestCase +from frappe import qb from frappe.utils import today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -7,18 +7,16 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sal from erpnext.accounts.report.customer_ledger_summary.customer_ledger_summary import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.controllers.sales_and_purchase_return import make_return_doc +from erpnext.tests.utils import ERPNextTestSuite -class TestCustomerLedgerSummary(AccountsTestMixin, IntegrationTestCase): +class TestCustomerLedgerSummary(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.create_item() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_sales_invoice(self, do_not_submit=False, **args): si = create_sales_invoice( item=self.item, diff --git a/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py b/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py index fcd9075a30f..15e216e333a 100644 --- a/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py +++ b/erpnext/accounts/report/deferred_revenue_and_expense/test_deferred_revenue_and_expense.py @@ -1,6 +1,5 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.accounts.doctype.account.test_account import create_account @@ -11,9 +10,10 @@ from erpnext.accounts.report.deferred_revenue_and_expense.deferred_revenue_and_e ) from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.accounts.utils import get_fiscal_year +from erpnext.tests.utils import ERPNextTestSuite -class TestDeferredRevenueAndExpense(IntegrationTestCase, AccountsTestMixin): +class TestDeferredRevenueAndExpense(ERPNextTestSuite, AccountsTestMixin): maxDiff = None def clear_old_entries(self): @@ -67,10 +67,7 @@ class TestDeferredRevenueAndExpense(IntegrationTestCase, AccountsTestMixin): self.setup_deferred_accounts_and_items() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - - @IntegrationTestCase.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) def test_deferred_revenue(self): self.create_item("_Test Internet Subscription", 0, self.warehouse, self.company) item = frappe.get_doc("Item", self.item) @@ -137,7 +134,7 @@ class TestDeferredRevenueAndExpense(IntegrationTestCase, AccountsTestMixin): ] self.assertEqual(report.period_total, expected) - @IntegrationTestCase.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) def test_deferred_expense(self): self.create_item("_Test Office Desk", 0, self.warehouse, self.company) item = frappe.get_doc("Item", self.item) @@ -207,7 +204,7 @@ class TestDeferredRevenueAndExpense(IntegrationTestCase, AccountsTestMixin): ] self.assertEqual(report.period_total, expected) - @IntegrationTestCase.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"book_deferred_entries_based_on": "Months"}) def test_zero_months(self): self.create_item("_Test Internet Subscription", 0, self.warehouse, self.company) item = frappe.get_doc("Item", self.item) @@ -272,7 +269,7 @@ class TestDeferredRevenueAndExpense(IntegrationTestCase, AccountsTestMixin): ] self.assertEqual(report.period_total, expected) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"book_deferred_entries_based_on": "Months", "book_deferred_entries_via_journal_entry": 0}, ) diff --git a/erpnext/accounts/report/general_and_payment_ledger_comparison/test_general_and_payment_ledger_comparison.py b/erpnext/accounts/report/general_and_payment_ledger_comparison/test_general_and_payment_ledger_comparison.py index 8c33bc90965..dd836a6891e 100644 --- a/erpnext/accounts/report/general_and_payment_ledger_comparison/test_general_and_payment_ledger_comparison.py +++ b/erpnext/accounts/report/general_and_payment_ledger_comparison/test_general_and_payment_ledger_comparison.py @@ -1,6 +1,5 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice @@ -8,16 +7,14 @@ from erpnext.accounts.report.general_and_payment_ledger_comparison.general_and_p execute, ) from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestGeneralAndPaymentLedger(IntegrationTestCase, AccountsTestMixin): +class TestGeneralAndPaymentLedger(ERPNextTestSuite, AccountsTestMixin): def setUp(self): self.create_company() self.cleanup() - def tearDown(self): - frappe.db.rollback() - def cleanup(self): doctypes = [] doctypes.append(qb.DocType("GL Entry")) diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py index 24280d4d620..8f558467192 100644 --- a/erpnext/accounts/report/general_ledger/test_general_ledger.py +++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py @@ -3,15 +3,15 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import flt, today from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.general_ledger.general_ledger import execute from erpnext.controllers.sales_and_purchase_return import make_return_doc +from erpnext.tests.utils import ERPNextTestSuite -class TestGeneralLedger(IntegrationTestCase): +class TestGeneralLedger(ERPNextTestSuite): def setUp(self): self.company = "_Test Company" self.clear_old_entries() diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index 55ab95ac662..a53c2134e3f 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -649,7 +649,7 @@ class GrossProfitGenerator: new_row = row self.set_average_based_on_payment_term_portion(new_row, row, invoice_portion) else: - new_row.qty += flt(row.qty) + new_row.qty = flt((new_row.qty + row.qty), self.float_precision) self.set_average_based_on_payment_term_portion(new_row, row, invoice_portion, True) new_row = self.set_average_rate(new_row) @@ -659,11 +659,17 @@ class GrossProfitGenerator: if i == 0: new_row = row else: - new_row.qty += flt(row.qty) - new_row.buying_amount += flt(row.buying_amount, self.currency_precision) - new_row.base_amount += flt(row.base_amount, self.currency_precision) + new_row.qty = flt((new_row.qty + row.qty), self.float_precision) + new_row.buying_amount = flt( + (new_row.buying_amount + row.buying_amount), self.currency_precision + ) + new_row.base_amount = flt( + (new_row.base_amount + row.base_amount), self.currency_precision + ) if self.filters.get("group_by") == "Sales Person": - new_row.allocated_amount += flt(row.allocated_amount, self.currency_precision) + new_row.allocated_amount = flt( + (new_row.allocated_amount + row.allocated_amount), self.currency_precision + ) new_row = self.set_average_rate(new_row) self.grouped_data.append(new_row) diff --git a/erpnext/accounts/report/gross_profit/test_gross_profit.py b/erpnext/accounts/report/gross_profit/test_gross_profit.py index bf52e127544..ac1ca89b5e4 100644 --- a/erpnext/accounts/report/gross_profit/test_gross_profit.py +++ b/erpnext/accounts/report/gross_profit/test_gross_profit.py @@ -1,6 +1,5 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, get_first_day, get_last_day, nowdate from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note, make_sales_return @@ -10,9 +9,10 @@ from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.item.test_item import create_item from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestGrossProfit(IntegrationTestCase): +class TestGrossProfit(ERPNextTestSuite): def setUp(self): self.create_company() self.create_item() @@ -21,9 +21,6 @@ class TestGrossProfit(IntegrationTestCase): self.create_sales_invoice() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_company(self): company_name = "_Test Gross Profit" abbr = "_GP" @@ -391,6 +388,7 @@ class TestGrossProfit(IntegrationTestCase): report_output = {k: v for k, v in gp_entry[0].items() if k in expected_entry} self.assertEqual(report_output, expected_entry) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": True}) def test_crnote_against_invoice_with_multiple_instances_of_same_item(self): """ Item Qty for Sales Invoices with multiple instances of same item go in the -ve. Ideally, the credit noteshould cancel out the invoice items. diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py index 7166e5da691..0f0121f4e6c 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py +++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py @@ -32,6 +32,7 @@ def _execute(filters=None, additional_table_columns=None): item_list = get_items(filters, additional_table_columns) aii_account_map = get_aii_accounts() + default_taxes = {} if item_list: itemised_tax, tax_columns = get_tax_accounts( item_list, @@ -40,6 +41,9 @@ def _execute(filters=None, additional_table_columns=None): doctype="Purchase Invoice", tax_doctype="Purchase Taxes and Charges", ) + for tax in tax_columns: + default_taxes[f"{tax}_rate"] = 0 + default_taxes[f"{tax}_amount"] = 0 po_pr_map = get_purchase_receipts_against_purchase_order(item_list) @@ -87,6 +91,7 @@ def _execute(filters=None, additional_table_columns=None): total_tax = 0 total_other_charges = 0 + row.update(default_taxes.copy()) for tax, details in itemised_tax.get(d.name, {}).items(): row.update( { diff --git a/erpnext/accounts/report/item_wise_purchase_register/test_item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/test_item_wise_purchase_register.py index 5a2fe7e23ce..eed45ea60bb 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/test_item_wise_purchase_register.py +++ b/erpnext/accounts/report/item_wise_purchase_register/test_item_wise_purchase_register.py @@ -1,21 +1,18 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import getdate, today from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.report.item_wise_purchase_register.item_wise_purchase_register import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestItemWisePurchaseRegister(AccountsTestMixin, IntegrationTestCase): +class TestItemWisePurchaseRegister(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_supplier() self.create_item() - def tearDown(self): - frappe.db.rollback() - def create_purchase_invoice(self, do_not_submit=False): pi = make_purchase_invoice( item=self.item, diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index d77eb56525f..d849aa7e285 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -33,6 +33,10 @@ def _execute(filters=None, additional_table_columns=None, additional_conditions= return columns, [], None, None, None, 0 itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) + default_taxes = {} + for tax in tax_columns: + default_taxes[f"{tax}_rate"] = 0 + default_taxes[f"{tax}_amount"] = 0 mode_of_payments = get_mode_of_payments(set(d.parent for d in item_list)) so_dn_map = get_delivery_notes_against_sales_order(item_list) @@ -90,6 +94,9 @@ def _execute(filters=None, additional_table_columns=None, additional_conditions= total_tax = 0 total_other_charges = 0 + + row.update(default_taxes.copy()) + for tax, details in itemised_tax.get(d.name, {}).items(): row.update( { diff --git a/erpnext/accounts/report/item_wise_sales_register/test_item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/test_item_wise_sales_register.py index 34ec398e7f3..689edeac1c4 100644 --- a/erpnext/accounts/report/item_wise_sales_register/test_item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/test_item_wise_sales_register.py @@ -1,24 +1,23 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import getdate, today from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase): +class TestItemWiseSalesRegister(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.create_item() - def tearDown(self): - frappe.db.rollback() - - def create_sales_invoice(self, do_not_submit=False): + def create_sales_invoice(self, item=None, taxes=None, do_not_submit=False): si = create_sales_invoice( - item=self.item, + item=item or self.item, + item_name=item or self.item, + description=item or self.item, company=self.company, customer=self.customer, debit_to=self.debit_to, @@ -29,6 +28,19 @@ class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase): price_list_rate=100, do_not_save=1, ) + + for tax in taxes or []: + si.append( + "taxes", + { + "charge_type": "On Net Total", + "account_head": tax["account_head"], + "cost_center": self.cost_center, + "description": tax["description"], + "rate": tax["rate"], + }, + ) + si = si.save() if not do_not_submit: si = si.submit() @@ -62,3 +74,54 @@ class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase): report_output = {k: v for k, v in report[1][0].items() if k in expected_result} self.assertDictEqual(report_output, expected_result) + + def test_grouped_report_handles_different_tax_descriptions(self): + self.create_item( + item_name="_Test Item Tax Description A", company="_Test Company", warehouse="Stores - _TC" + ) + first_item = self.item + self.create_item( + item_name="_Test Item Tax Description B", company="_Test Company", warehouse="Stores - _TC" + ) + second_item = self.item + + first_tax_description = "Tax Description A" + second_tax_description = "Tax Description B" + first_tax_amount_field = f"{frappe.scrub(first_tax_description)}_amount" + second_tax_amount_field = f"{frappe.scrub(second_tax_description)}_amount" + + self.create_sales_invoice( + item=first_item, + taxes=[ + { + "account_head": "_Test Account VAT - _TC", + "description": first_tax_description, + "rate": 5, + } + ], + ) + self.create_sales_invoice( + item=second_item, + taxes=[ + { + "account_head": "_Test Account Service Tax - _TC", + "description": second_tax_description, + "rate": 2, + } + ], + ) + + filters = frappe._dict( + { + "from_date": today(), + "to_date": today(), + "company": self.company, + "group_by": "Customer", + } + ) + _, data, _, _, _, _ = execute(filters) + + grand_total_row = next(row for row in data if row.get("bold") and row.get("item_code") == "Total") + + self.assertEqual(grand_total_row[first_tax_amount_field], 5.0) + self.assertEqual(grand_total_row[second_tax_amount_field], 2.0) diff --git a/erpnext/accounts/report/payment_ledger/test_payment_ledger.py b/erpnext/accounts/report/payment_ledger/test_payment_ledger.py index 1225fb70101..00206059672 100644 --- a/erpnext/accounts/report/payment_ledger/test_payment_ledger.py +++ b/erpnext/accounts/report/payment_ledger/test_payment_ledger.py @@ -1,13 +1,13 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.payment_ledger.payment_ledger import execute +from erpnext.tests.utils import ERPNextTestSuite -class TestPaymentLedger(IntegrationTestCase): +class TestPaymentLedger(ERPNextTestSuite): def setUp(self): self.create_company() self.cleanup() diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js index e679f1f5728..5c9aaa62c94 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js +++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.js @@ -39,7 +39,7 @@ frappe.query_reports[PL_REPORT_NAME]["filters"].push( fieldname: "accumulated_values", label: __("Accumulated Values"), fieldtype: "Check", - default: 1, + default: 0, }, { fieldname: "include_default_book_entries", diff --git a/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py index 4f1a08370a4..90d28033f19 100644 --- a/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py +++ b/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py @@ -3,24 +3,21 @@ import frappe from frappe.desk.query_report import export_query -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate, today from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.financial_statements import get_period_list from erpnext.accounts.report.profit_and_loss_statement.profit_and_loss_statement import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestProfitAndLossStatement(AccountsTestMixin, IntegrationTestCase): +class TestProfitAndLossStatement(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.create_item() - def tearDown(self): - frappe.db.rollback() - def create_sales_invoice(self, qty=1, rate=150, no_payment_schedule=False, do_not_submit=False): frappe.set_user("Administrator") si = create_sales_invoice( diff --git a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json index 2080f51933a..37556b6b4c2 100644 --- a/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json +++ b/erpnext/accounts/report/purchase_invoice_trends/purchase_invoice_trends.json @@ -7,10 +7,10 @@ "docstatus": 0, "doctype": "Report", "filters": [], - "idx": 3, + "idx": 4, "is_standard": "Yes", - "letterhead": null, - "modified": "2025-11-05 11:55:49.950442", + "letter_head": null, + "modified": "2026-03-13 17:35:39.703838", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Trends", diff --git a/erpnext/accounts/report/purchase_register/test_purchase_register.py b/erpnext/accounts/report/purchase_register/test_purchase_register.py index 6f61c44db02..400ee899fa1 100644 --- a/erpnext/accounts/report/purchase_register/test_purchase_register.py +++ b/erpnext/accounts/report/purchase_register/test_purchase_register.py @@ -2,13 +2,13 @@ # MIT License. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_months, today from erpnext.accounts.report.purchase_register.purchase_register import execute +from erpnext.tests.utils import ERPNextTestSuite -class TestPurchaseRegister(IntegrationTestCase): +class TestPurchaseRegister(ERPNextTestSuite): def test_purchase_register(self): frappe.db.sql("delete from `tabPurchase Invoice` where company='_Test Company 6'") frappe.db.sql("delete from `tabGL Entry` where company='_Test Company 6'") diff --git a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json index 1ed34ff4c36..93aa6567f0c 100644 --- a/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json +++ b/erpnext/accounts/report/sales_invoice_trends/sales_invoice_trends.json @@ -9,8 +9,8 @@ "filters": [], "idx": 3, "is_standard": "Yes", - "letterhead": null, - "modified": "2025-11-05 11:55:50.070651", + "letter_head": null, + "modified": "2026-03-13 17:36:13.725601", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice Trends", diff --git a/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py b/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py index 96e903b93ca..8ec9da89992 100644 --- a/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py +++ b/erpnext/accounts/report/sales_payment_summary/test_sales_payment_summary.py @@ -2,7 +2,6 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry @@ -10,25 +9,10 @@ from erpnext.accounts.report.sales_payment_summary.sales_payment_summary import get_mode_of_payment_details, get_mode_of_payments, ) - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Sales Invoice"] +from erpnext.tests.utils import ERPNextTestSuite -class TestSalesPaymentSummary(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - create_records() - pes = frappe.get_all("Payment Entry") - jes = frappe.get_all("Journal Entry") - sis = frappe.get_all("Sales Invoice") - for pe in pes: - frappe.db.set_value("Payment Entry", pe.name, "docstatus", 2) - for je in jes: - frappe.db.set_value("Journal Entry", je.name, "docstatus", 2) - for si in sis: - frappe.db.set_value("Sales Invoice", si.name, "docstatus", 2) - +class TestSalesPaymentSummary(ERPNextTestSuite): def test_get_mode_of_payments(self): filters = get_filters() @@ -94,6 +78,7 @@ class TestSalesPaymentSummary(IntegrationTestCase): mopd = get_mode_of_payment_details(filters) mopd_values = next(iter(mopd.values())) + cc_init_amount = 0 for mopd_value in mopd_values: if mopd_value[0] == "Credit Card": cc_init_amount = mopd_value[1] @@ -110,6 +95,7 @@ class TestSalesPaymentSummary(IntegrationTestCase): mopd = get_mode_of_payment_details(filters) mopd_values = next(iter(mopd.values())) + cc_final_amount = 0 for mopd_value in mopd_values: if mopd_value[0] == "Credit Card": cc_final_amount = mopd_value[1] @@ -147,41 +133,3 @@ def create_sales_invoice_record(qty=1): ], } ) - - -def create_records(): - if frappe.db.exists("Customer", "Prestiga-Biz"): - return - - # customer - frappe.get_doc( - { - "customer_group": "_Test Customer Group", - "customer_name": "Prestiga-Biz", - "customer_type": "Company", - "doctype": "Customer", - "territory": "_Test Territory", - } - ).insert() - - # item - item = frappe.get_doc( - { - "doctype": "Item", - "item_code": "Consulting", - "item_name": "Consulting", - "item_group": "All Item Groups", - "company": "_Test Company", - "is_stock_item": 0, - } - ).insert() - - # item price - frappe.get_doc( - { - "doctype": "Item Price", - "price_list": "Standard Selling", - "item_code": item.item_code, - "price_list_rate": 10000, - } - ).insert() diff --git a/erpnext/accounts/report/sales_register/test_sales_register.py b/erpnext/accounts/report/sales_register/test_sales_register.py index 50f12e52e33..ca284cc636c 100644 --- a/erpnext/accounts/report/sales_register/test_sales_register.py +++ b/erpnext/accounts/report/sales_register/test_sales_register.py @@ -1,22 +1,19 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import getdate, today from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.sales_register.sales_register import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase): +class TestItemWiseSalesRegister(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() self.create_item() self.create_child_cost_center() - def tearDown(self): - frappe.db.rollback() - def create_child_cost_center(self): cc_name = "South Wing" if frappe.db.exists("Cost Center", cc_name): diff --git a/erpnext/accounts/report/supplier_ledger_summary/test_supplier_ledger_summary.py b/erpnext/accounts/report/supplier_ledger_summary/test_supplier_ledger_summary.py index 376495b5cc9..418d86abb66 100644 --- a/erpnext/accounts/report/supplier_ledger_summary/test_supplier_ledger_summary.py +++ b/erpnext/accounts/report/supplier_ledger_summary/test_supplier_ledger_summary.py @@ -1,22 +1,19 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.report.supplier_ledger_summary.supplier_ledger_summary import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierLedgerSummary(AccountsTestMixin, IntegrationTestCase): +class TestSupplierLedgerSummary(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_supplier() self.create_item() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def create_purchase_invoice(self, do_not_submit=False): frappe.set_user("Administrator") pi = make_purchase_invoice( diff --git a/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py index 30a5df3fcb2..a2a732e8de6 100644 --- a/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py +++ b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py @@ -2,7 +2,6 @@ # MIT License. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_to_date, today from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry @@ -14,9 +13,10 @@ from erpnext.accounts.doctype.tax_withholding_category.test_tax_withholding_cate from erpnext.accounts.report.tax_withholding_details.tax_withholding_details import execute from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.accounts.utils import get_fiscal_year +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxWithholdingDetails(AccountsTestMixin, IntegrationTestCase): +class TestTaxWithholdingDetails(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.clear_old_entries() @@ -126,9 +126,6 @@ class TestTaxWithholdingDetails(AccountsTestMixin, IntegrationTestCase): ) self.assertSequenceEqual(voucher_actual_values, voucher_expected_values) - def tearDown(self): - self.clear_old_entries() - def create_tax_accounts(): account_names = ["TCS", "TDS"] diff --git a/erpnext/accounts/report/trial_balance/test_trial_balance.py b/erpnext/accounts/report/trial_balance/test_trial_balance.py index a7922b716e7..42cf62af0a0 100644 --- a/erpnext/accounts/report/trial_balance/test_trial_balance.py +++ b/erpnext/accounts/report/trial_balance/test_trial_balance.py @@ -2,13 +2,13 @@ # MIT License. See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.report.trial_balance.trial_balance import execute +from erpnext.tests.utils import ERPNextTestSuite -class TestTrialBalance(IntegrationTestCase): +class TestTrialBalance(ERPNextTestSuite): def setUp(self): from erpnext.accounts.doctype.account.test_account import create_account from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center @@ -62,10 +62,6 @@ class TestTrialBalance(IntegrationTestCase): total_row = execute(filters)[1][-1] self.assertEqual(total_row["debit"], total_row["credit"]) - def tearDown(self): - clear_dimension_defaults("Branch") - disable_dimension() - def create_company(**args): args = frappe._dict(args) diff --git a/erpnext/accounts/test/test_reports.py b/erpnext/accounts/test/test_reports.py index e702c135b04..8c27452264c 100644 --- a/erpnext/accounts/test/test_reports.py +++ b/erpnext/accounts/test/test_reports.py @@ -1,6 +1,4 @@ -from frappe.tests import IntegrationTestCase - -from erpnext.tests.utils import ReportFilters, ReportName, execute_script_report +from erpnext.tests.utils import ERPNextTestSuite, ReportFilters, ReportName, execute_script_report DEFAULT_FILTERS = { "company": "_Test Company", @@ -34,7 +32,7 @@ REPORT_FILTER_TEST_CASES: list[tuple[ReportName, ReportFilters]] = [ OPTIONAL_FILTERS = {} -class TestReports(IntegrationTestCase): +class TestReports(ERPNextTestSuite): def test_execute_all_accounts_reports(self): """Test that all script report in stock modules are executable with supported filters""" for report, filter in REPORT_FILTER_TEST_CASES: diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 6aa1553a656..d1ec2181cce 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -1,6 +1,5 @@ import frappe from frappe.test_runner import make_test_objects -from frappe.tests import IntegrationTestCase from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice @@ -14,18 +13,10 @@ from erpnext.accounts.utils import ( from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestUtils(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - make_test_objects("Address", ADDRESS_RECORDS) - - @classmethod - def tearDownClass(cls): - frappe.db.rollback() - +class TestUtils(ERPNextTestSuite): def test_get_party_shipping_address(self): address = get_party_shipping_address("Customer", "_Test Customer 1") self.assertEqual(address, "_Test Billing Address 2 Title-Billing") @@ -160,45 +151,3 @@ class TestUtils(IntegrationTestCase): self.assertEqual(get_zero_cutoff(None), 0.005) self.assertEqual(get_zero_cutoff("EUR"), 0.005) self.assertEqual(get_zero_cutoff("BHD"), 0.0005) - - -ADDRESS_RECORDS = [ - { - "doctype": "Address", - "address_type": "Billing", - "address_line1": "Address line 1", - "address_title": "_Test Billing Address Title", - "city": "Lagos", - "country": "Nigeria", - "links": [{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}], - }, - { - "doctype": "Address", - "address_type": "Shipping", - "address_line1": "Address line 2", - "address_title": "_Test Shipping Address 1 Title", - "city": "Lagos", - "country": "Nigeria", - "links": [{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}], - }, - { - "doctype": "Address", - "address_type": "Shipping", - "address_line1": "Address line 3", - "address_title": "_Test Shipping Address 2 Title", - "city": "Lagos", - "country": "Nigeria", - "is_shipping_address": "1", - "links": [{"link_doctype": "Customer", "link_name": "_Test Customer 2", "doctype": "Dynamic Link"}], - }, - { - "doctype": "Address", - "address_type": "Billing", - "address_line1": "Address line 4", - "address_title": "_Test Billing Address 2 Title", - "city": "Lagos", - "country": "Nigeria", - "is_shipping_address": "1", - "links": [{"link_doctype": "Customer", "link_name": "_Test Customer 1", "doctype": "Dynamic Link"}], - }, -] diff --git a/erpnext/accounts/test_party.py b/erpnext/accounts/test_party.py index 986a5b5d680..0f477103da4 100644 --- a/erpnext/accounts/test_party.py +++ b/erpnext/accounts/test_party.py @@ -1,10 +1,10 @@ import frappe -from frappe.tests import IntegrationTestCase from erpnext.accounts.party import get_default_price_list +from erpnext.tests.utils import ERPNextTestSuite -class PartyTestCase(IntegrationTestCase): +class PartyTestCase(ERPNextTestSuite): def test_get_default_price_list_should_return_none_for_invalid_group(self): customer = frappe.get_doc( { diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 6b71228841f..d0707438745 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -1414,6 +1414,78 @@ def get_account_balances( return accounts +@frappe.whitelist() +def get_account_balances_coa(company: str, include_default_fb_balances: bool = False): + company_currency = frappe.get_cached_value("Company", company, "default_currency") + + Account = DocType("Account") + account_list = ( + frappe.qb.from_(Account) + .select(Account.name, Account.parent_account, Account.account_currency) + .where(Account.company == company) + .orderby(Account.lft) + .run(as_dict=True) + ) + + account_balances_cc = {account.get("name"): 0 for account in account_list} + + account_balances_ac = {account.get("name"): 0 for account in account_list} + + GLEntry = DocType("GL Entry") + precision = get_currency_precision() + get_ledger_balances_query = ( + frappe.qb.from_(GLEntry) + .select( + GLEntry.account, + (Sum(Round(GLEntry.debit, precision)) - Sum(Round(GLEntry.credit, precision))).as_("balance"), + ( + Sum(Round(GLEntry.debit_in_account_currency, precision)) + - Sum(Round(GLEntry.credit_in_account_currency, precision)) + ).as_("balance_in_account_currency"), + ) + .groupby(GLEntry.account) + ) + + condition_list = [GLEntry.company == company, GLEntry.is_cancelled == 0] + + default_finance_book = None + + if include_default_fb_balances: + default_finance_book = frappe.get_cached_value("Company", company, "default_finance_book") + + if default_finance_book: + condition_list.append( + (GLEntry.finance_book == default_finance_book) | (GLEntry.finance_book.isnull()) + ) + + for condition in condition_list: + get_ledger_balances_query = get_ledger_balances_query.where(condition) + + ledger_balances = get_ledger_balances_query.run(as_dict=True) + + for ledger_entry in ledger_balances: + account_balances_cc[ledger_entry.get("account")] = ledger_entry.get("balance") + account_balances_ac[ledger_entry.get("account")] = ledger_entry.get("balance_in_account_currency") + + for account in reversed(account_list): + parent = account.get("parent_account") + if parent: + account_balances_cc[parent] += account_balances_cc.get(account.get("name")) + + accounts_data = [ + { + "value": account.get("name"), + "company_currency": company_currency, + "balance": account_balances_cc.get(account.get("name")), + "account_currency": account.get("account_currency"), + "balance_in_account_currency": account_balances_ac.get(account.get("name")), + } + for account in account_list + ] + + return accounts_data + + def create_payment_gateway_account(gateway, payment_channel="Email", company=None): from erpnext.setup.setup_wizard.operations.install_fixtures import create_bank_account @@ -1548,7 +1620,7 @@ def parse_naming_series_variable(doc, variable): getdate(doc.get("posting_date") or doc.get("transaction_date") or doc.get("posting_datetime")) or now_datetime() ) - if frappe.get_single_value("Global Defaults", "use_posting_datetime_for_naming_documents") + if doc and frappe.get_single_value("Global Defaults", "use_posting_datetime_for_naming_documents") else now_datetime() ) return date.strftime(data[variable]) if variable in data else determine_consecutive_week_number(date) @@ -2070,6 +2142,7 @@ def create_payment_ledger_entry( if is_immutable_ledger_enabled(): ple.delinked = 0 ple.posting_date = frappe.form_dict.get("posting_date") or getdate() + ple.flags.ignore_links = True ple.flags.ignore_permissions = 1 ple.flags.adv_adj = adv_adj diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index bbbdf2564eb..1b333d51c17 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -36,6 +36,7 @@ frappe.ui.form.on("Asset", { }, company: function (frm) { + frm.trigger("set_dynamic_labels"); erpnext.accounts.dimensions.update_dimension(frm, frm.doctype); }, @@ -87,6 +88,8 @@ frappe.ui.form.on("Asset", { }, refresh: async function (frm) { + frm.trigger("set_dynamic_labels"); + frappe.ui.form.trigger("Asset", "asset_type"); frm.toggle_display("next_depreciation_date", frm.doc.docstatus < 1); @@ -227,6 +230,10 @@ frappe.ui.form.on("Asset", { } }, + set_dynamic_labels: function (frm) { + frm.set_currency_labels(["net_purchase_amount"], erpnext.get_currency(frm.doc.company)); + }, + should_show_accounting_ledger: async function (frm) { if (["Capitalized"].includes(frm.doc.status)) { return false; diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 32f5ce9cf50..c048e972882 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -9,13 +9,13 @@ "engine": "InnoDB", "field_order": [ "naming_series", - "company", "item_code", "item_name", "asset_name", + "location", "image", "column_break_3", - "location", + "company", "asset_category", "asset_type", "maintenance_required", @@ -169,6 +169,8 @@ { "fieldname": "company", "fieldtype": "Link", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Company", "options": "Company", "remember_last_selected_value": 1, @@ -531,7 +533,7 @@ "fieldtype": "Currency", "label": "Net Purchase Amount", "mandatory_depends_on": "eval:(doc.asset_type != \"Composite Asset\" || doc.docstatus==1)", - "options": "Company:company:default_currency", + "options": "currency", "read_only_depends_on": "eval: doc.asset_type == \"Composite Asset\"" }, { @@ -624,7 +626,7 @@ "link_fieldname": "target_asset" } ], - "modified": "2026-02-05 12:42:45.350216", + "modified": "2026-03-12 16:07:39.543227", "modified_by": "Administrator", "module": "Assets", "name": "Asset", diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 4da21e3942b..91ab627b113 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import ( add_days, add_months, @@ -36,21 +35,14 @@ from erpnext.stock.doctype.purchase_receipt.purchase_receipt import ( make_purchase_invoice as make_invoice, ) from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class AssetSetup(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class AssetSetup(ERPNextTestSuite): + def setUp(self): set_depreciation_settings_in_company() - create_asset_data() enable_cwip_accounting("Computers") make_purchase_receipt(item_code="Macbook Pro", qty=1, rate=100000.0, location="Test Location") - frappe.db.sql("delete from `tabTax Rule`") - - @classmethod - def tearDownClass(cls): - frappe.db.rollback() class TestAsset(AssetSetup): @@ -911,18 +903,9 @@ class TestAsset(AssetSetup): class TestDepreciationMethods(AssetSetup): - @classmethod - def setUpClass(cls): - super().setUpClass() - - cls._old_float_precision = frappe.db.get_single_value("System Settings", "float_precision") + def setUp(self): frappe.db.set_single_value("System Settings", "float_precision", 2) - @classmethod - def tearDownClass(cls): - frappe.db.set_single_value("System Settings", "float_precision", cls._old_float_precision) - super().tearDownClass() - def test_schedule_for_straight_line_method(self): asset = create_asset( calculate_depreciation=1, @@ -1991,31 +1974,9 @@ def get_gl_entries(doctype, docname): ) -def create_asset_data(): - if not frappe.db.exists("Asset Category", "Computers"): - create_asset_category() - - if not frappe.db.exists("Item", "Macbook Pro"): - create_fixed_asset_item() - - if not frappe.db.exists("Location", "Test Location"): - frappe.get_doc({"doctype": "Location", "location_name": "Test Location"}).insert() - - if not frappe.db.exists("Finance Book", "Test Finance Book 1"): - frappe.get_doc({"doctype": "Finance Book", "finance_book_name": "Test Finance Book 1"}).insert() - - if not frappe.db.exists("Finance Book", "Test Finance Book 2"): - frappe.get_doc({"doctype": "Finance Book", "finance_book_name": "Test Finance Book 2"}).insert() - - if not frappe.db.exists("Finance Book", "Test Finance Book 3"): - frappe.get_doc({"doctype": "Finance Book", "finance_book_name": "Test Finance Book 3"}).insert() - - def create_asset(**args): args = frappe._dict(args) - create_asset_data() - asset = frappe.get_doc( { "doctype": "Asset", diff --git a/erpnext/assets/doctype/asset_activity/test_asset_activity.py b/erpnext/assets/doctype/asset_activity/test_asset_activity.py index 1c7d472c88b..0344c7d984b 100644 --- a/erpnext/assets/doctype/asset_activity/test_asset_activity.py +++ b/erpnext/assets/doctype/asset_activity/test_asset_activity.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestAssetActivity(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestAssetActivity(ERPNextTestSuite): pass diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py index 3509da79b20..d5022be96e3 100644 --- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py @@ -2,13 +2,11 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import cint, flt, now_datetime from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries from erpnext.assets.doctype.asset.test_asset import ( create_asset, - create_asset_data, create_fixed_asset_item, set_depreciation_settings_in_company, ) @@ -17,12 +15,12 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_pu from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import ( make_serial_batch_bundle, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetCapitalization(IntegrationTestCase): +class TestAssetCapitalization(ERPNextTestSuite): def setUp(self): set_depreciation_settings_in_company() - create_asset_data() create_asset_capitalization_data() frappe.db.sql("delete from `tabTax Rule`") diff --git a/erpnext/assets/doctype/asset_category/test_asset_category.py b/erpnext/assets/doctype/asset_category/test_asset_category.py index 995185fbf95..b12387bb2c0 100644 --- a/erpnext/assets/doctype/asset_category/test_asset_category.py +++ b/erpnext/assets/doctype/asset_category/test_asset_category.py @@ -2,12 +2,12 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from erpnext.assets.doctype.asset.test_asset import create_asset +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetCategory(IntegrationTestCase): +class TestAssetCategory(ERPNextTestSuite): def test_mandatory_fields(self): asset_category = frappe.new_doc("Asset Category") asset_category.asset_category_name = "Computers" diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py index b7e96f935d1..449f6091d01 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/test_asset_depreciation_schedule.py @@ -2,14 +2,13 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import cstr, flt, getdate from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.assets.doctype.asset.depreciation import ( post_depreciation_entries, ) -from erpnext.assets.doctype.asset.test_asset import create_asset, create_asset_data +from erpnext.assets.doctype.asset.test_asset import create_asset from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( get_asset_depr_schedule_doc, get_depr_schedule, @@ -18,12 +17,10 @@ from erpnext.assets.doctype.asset_repair.test_asset_repair import create_asset_r from erpnext.assets.doctype.asset_value_adjustment.test_asset_value_adjustment import ( make_asset_value_adjustment, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetDepreciationSchedule(IntegrationTestCase): - def setUp(self): - create_asset_data() - +class TestAssetDepreciationSchedule(ERPNextTestSuite): def test_throw_error_if_another_asset_depr_schedule_exist(self): asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, submit=1) @@ -815,7 +812,6 @@ class TestAssetDepreciationSchedule(IntegrationTestCase): def test_depreciation_on_return_of_sold_asset(self): from erpnext.controllers.sales_and_purchase_return import make_return_doc - create_asset_data() asset = create_asset(item_code="Macbook Pro", calculate_depreciation=1, submit=1) post_depreciation_entries(getdate("2021-09-30")) diff --git a/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py b/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py index 8b22991f7b0..068c6cff9c9 100644 --- a/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py +++ b/erpnext/assets/doctype/asset_maintenance/test_asset_maintenance.py @@ -2,14 +2,14 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, get_last_day, nowdate from erpnext.assets.doctype.asset_maintenance.asset_maintenance import calculate_next_due_date from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetMaintenance(IntegrationTestCase): +class TestAssetMaintenance(ERPNextTestSuite): def setUp(self): set_depreciation_settings_in_company() self.pr = make_purchase_receipt( diff --git a/erpnext/assets/doctype/asset_maintenance/test_records.json b/erpnext/assets/doctype/asset_maintenance/test_records.json deleted file mode 100644 index 8306fad6cba..00000000000 --- a/erpnext/assets/doctype/asset_maintenance/test_records.json +++ /dev/null @@ -1,68 +0,0 @@ -[ - { - "doctype": "Asset Category", - "asset_category_name": "Equipment", - "total_number_of_depreciations": 3, - "frequency_of_depreciation": 3, - "accounts": [ - { - "company_name": "_Test Company", - "fixed_asset_account": "_Test Fixed Asset - _TC", - "accumulated_depreciation_account": "_Test Accumulated Depreciations - _TC", - "depreciation_expense_account": "_Test Depreciations - _TC" - } - ] - }, - { - "doctype": "Location", - "location_name": "Test Location" - }, - { - "doctype": "Role", - "role_name": "Technician" - }, - { - "doctype": "User", - "email": "marcus@abc.com", - "first_name": "marcus@abc.com", - "new_password": "password", - "roles": [{"doctype": "Has Role", "role": "Technician"}] - }, - { - "doctype": "User", - "email": "thalia@abc.com", - "first_name": "thalia@abc.com", - "new_password": "password", - "roles": [{"doctype": "Has Role", "role": "Technician"}] - }, - { - "doctype": "User", - "email": "mathias@abc.com", - "first_name": "mathias@abc.com", - "new_password": "password", - "roles": [{"doctype": "Has Role", "role": "Technician"}] - }, - { - "doctype": "Asset Maintenance Team", - "maintenance_manager": "marcus@abc.com", - "maintenance_team_name": "Team Awesome", - "company": "_Test Company", - "maintenance_team_members": [ - {"team_member": "marcus@abc.com", "full_name": "marcus@abc.com", "maintenance_role": "Technician"}, - {"team_member": "thalia@abc.com", "full_name": "thalia@abc.com", "maintenance_role": "Technician"}, - {"team_member": "mathias@abc.com", "full_name": "mathias@abc.com", "maintenance_role": "Technician"} - ] - }, - { - "doctype": "Item", - "item_code": "Photocopier", - "item_name": "Photocopier", - "item_group": "All Item Groups", - "company": "_Test Company", - "is_fixed_asset": 1, - "is_stock_item": 0, - "asset_category": "Equipment", - "auto_create_assets": 1, - "asset_naming_series": "ABC.###" - } -] diff --git a/erpnext/assets/doctype/asset_maintenance_log/test_asset_maintenance_log.py b/erpnext/assets/doctype/asset_maintenance_log/test_asset_maintenance_log.py index 7842e41bd2f..3e9f210892a 100644 --- a/erpnext/assets/doctype/asset_maintenance_log/test_asset_maintenance_log.py +++ b/erpnext/assets/doctype/asset_maintenance_log/test_asset_maintenance_log.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetMaintenanceLog(IntegrationTestCase): +class TestAssetMaintenanceLog(ERPNextTestSuite): pass diff --git a/erpnext/assets/doctype/asset_maintenance_team/test_asset_maintenance_team.py b/erpnext/assets/doctype/asset_maintenance_team/test_asset_maintenance_team.py index 1d0c51f3f09..ff75c3c071f 100644 --- a/erpnext/assets/doctype/asset_maintenance_team/test_asset_maintenance_team.py +++ b/erpnext/assets/doctype/asset_maintenance_team/test_asset_maintenance_team.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetMaintenanceTeam(IntegrationTestCase): +class TestAssetMaintenanceTeam(ERPNextTestSuite): pass diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json index a656acf1265..aedfc149f64 100644 --- a/erpnext/assets/doctype/asset_movement/asset_movement.json +++ b/erpnext/assets/doctype/asset_movement/asset_movement.json @@ -32,6 +32,7 @@ { "fieldname": "purpose", "fieldtype": "Select", + "in_list_view": 1, "label": "Purpose", "options": "\nIssue\nReceipt\nTransfer\nTransfer and Issue", "reqd": 1 @@ -97,7 +98,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2025-05-30 17:01:55.864353", + "modified": "2026-03-09 17:19:02.087333", "modified_by": "Administrator", "module": "Assets", "name": "Asset Movement", diff --git a/erpnext/assets/doctype/asset_movement/test_asset_movement.py b/erpnext/assets/doctype/asset_movement/test_asset_movement.py index 33eaa7e7e4c..7353195562d 100644 --- a/erpnext/assets/doctype/asset_movement/test_asset_movement.py +++ b/erpnext/assets/doctype/asset_movement/test_asset_movement.py @@ -2,20 +2,19 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, now -from erpnext.assets.doctype.asset.test_asset import create_asset, create_asset_data +from erpnext.assets.doctype.asset.test_asset import create_asset from erpnext.setup.doctype.employee.test_employee import make_employee from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetMovement(IntegrationTestCase): +class TestAssetMovement(ERPNextTestSuite): def setUp(self): frappe.db.set_value( "Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC" ) - create_asset_data() make_location() def test_movement(self): diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.js b/erpnext/assets/doctype/asset_repair/asset_repair.js index bdbf60f653e..4d9ef28ceae 100644 --- a/erpnext/assets/doctype/asset_repair/asset_repair.js +++ b/erpnext/assets/doctype/asset_repair/asset_repair.js @@ -86,6 +86,26 @@ frappe.ui.form.on("Asset Repair", { } }, + show_general_ledger: function (frm) { + if (frm.doc.docstatus > 0) { + frm.add_custom_button( + __("Accounting Ledger"), + function () { + frappe.route_options = { + voucher_no: frm.doc.name, + from_date: frm.doc.completion_date, + to_date: moment(frm.doc.modified).format("YYYY-MM-DD"), + company: frm.doc.company, + categorize_by: "", + show_cancelled_entries: frm.doc.docstatus === 2, + }; + frappe.set_route("query-report", "General Ledger"); + }, + __("View") + ); + } + }, + repair_status: (frm) => { if (frm.doc.completion_date && frm.doc.repair_status == "Completed") { frappe.call({ @@ -164,26 +184,6 @@ frappe.ui.form.on("Asset Repair Purchase Invoice", { }, }); }, - - show_general_ledger: (frm) => { - if (frm.doc.docstatus > 0) { - frm.add_custom_button( - __("Accounting Ledger"), - function () { - frappe.route_options = { - voucher_no: frm.doc.name, - from_date: frm.doc.posting_date, - to_date: moment(frm.doc.modified).format("YYYY-MM-DD"), - company: frm.doc.company, - categorize_by: "", - show_cancelled_entries: frm.doc.docstatus === 2, - }; - frappe.set_route("query-report", "General Ledger"); - }, - __("View") - ); - } - }, }); frappe.ui.form.on("Asset Repair Consumed Item", { diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py index 012a3895768..717435e4caa 100644 --- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py +++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py @@ -4,7 +4,6 @@ import frappe from frappe import qb from frappe.query_builder.functions import Sum -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, flt, get_first_day, nowdate, nowtime, today from erpnext.assets.doctype.asset.asset import ( @@ -14,7 +13,6 @@ from erpnext.assets.doctype.asset.asset import ( ) from erpnext.assets.doctype.asset.test_asset import ( create_asset, - create_asset_data, set_depreciation_settings_in_company, ) from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( @@ -25,16 +23,14 @@ from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle get_serial_nos_from_bundle, make_serial_batch_bundle, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetRepair(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestAssetRepair(ERPNextTestSuite): + def setUp(self): + self.load_test_records("Stock Entry") set_depreciation_settings_in_company() - create_asset_data() create_item("_Test Stock Item") - frappe.db.sql("delete from `tabTax Rule`") def test_asset_status(self): date = nowdate() diff --git a/erpnext/assets/doctype/asset_shift_allocation/test_asset_shift_allocation.py b/erpnext/assets/doctype/asset_shift_allocation/test_asset_shift_allocation.py index 2764a2cc373..5b1cdaf0277 100644 --- a/erpnext/assets/doctype/asset_shift_allocation/test_asset_shift_allocation.py +++ b/erpnext/assets/doctype/asset_shift_allocation/test_asset_shift_allocation.py @@ -2,25 +2,19 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import cstr from erpnext.assets.doctype.asset.test_asset import create_asset from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( get_depr_schedule, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetShiftAllocation(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() +class TestAssetShiftAllocation(ERPNextTestSuite): + def setUp(self): create_asset_shift_factors() - @classmethod - def tearDownClass(cls): - frappe.db.rollback() - def test_asset_shift_allocation(self): asset = create_asset( calculate_depreciation=1, diff --git a/erpnext/assets/doctype/asset_shift_factor/test_asset_shift_factor.py b/erpnext/assets/doctype/asset_shift_factor/test_asset_shift_factor.py index 12d68b02c5f..7470e55b6fb 100644 --- a/erpnext/assets/doctype/asset_shift_factor/test_asset_shift_factor.py +++ b/erpnext/assets/doctype/asset_shift_factor/test_asset_shift_factor.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestAssetShiftFactor(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestAssetShiftFactor(ERPNextTestSuite): pass diff --git a/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py index ba45510191e..ce27f3852f9 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/test_asset_value_adjustment.py @@ -2,22 +2,20 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, cstr, get_last_day, getdate, nowdate from erpnext.assets.doctype.asset.asset import get_asset_value_after_depreciation from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries -from erpnext.assets.doctype.asset.test_asset import create_asset_data from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( get_asset_depr_schedule_doc, ) from erpnext.assets.doctype.asset_repair.test_asset_repair import create_asset_repair from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class TestAssetValueAdjustment(IntegrationTestCase): +class TestAssetValueAdjustment(ERPNextTestSuite): def setUp(self): - create_asset_data() frappe.db.set_value( "Company", "_Test Company", "capital_work_in_progress_account", "CWIP Account - _TC" ) diff --git a/erpnext/assets/doctype/location/location.py b/erpnext/assets/doctype/location/location.py index 7878294caad..c2c3d5a2f1e 100644 --- a/erpnext/assets/doctype/location/location.py +++ b/erpnext/assets/doctype/location/location.py @@ -77,7 +77,7 @@ class Location(NestedSet): location = json.loads(self.location) location["features"] = features - self.db_set("location", json.dumps(location), commit=True) + self.db_set("location", json.dumps(location)) def update_ancestor_location_features(self): self_features = set(self.add_child_property()) @@ -105,7 +105,7 @@ class Location(NestedSet): ancestor_features[index] = json.loads(feature) ancestor_doc.set_location_features(features=ancestor_features) - ancestor_doc.db_set("area", ancestor_doc.area + self.area_difference, commit=True) + ancestor_doc.db_set("area", ancestor_doc.area + self.area_difference) def remove_ancestor_location_features(self): for ancestor in self.get_ancestors(): @@ -116,7 +116,7 @@ class Location(NestedSet): ancestor_features[index] = json.loads(feature) ancestor_doc.set_location_features(features=ancestor_features) - ancestor_doc.db_set("area", ancestor_doc.area - self.area, commit=True) + ancestor_doc.db_set("area", ancestor_doc.area - self.area) def add_child_property(self): features = self.get_location_features() diff --git a/erpnext/assets/doctype/location/test_location.py b/erpnext/assets/doctype/location/test_location.py index 6d777c06181..14fde6a1547 100644 --- a/erpnext/assets/doctype/location/test_location.py +++ b/erpnext/assets/doctype/location/test_location.py @@ -3,11 +3,12 @@ import json import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestLocation(IntegrationTestCase): - def runTest(self): +class TestLocation(ERPNextTestSuite): + def test_location_features(self): locations = ["Basil Farm", "Division 1", "Field 1", "Block 1"] area = 0 formatted_locations = [] diff --git a/erpnext/assets/doctype/location/test_records.json b/erpnext/assets/doctype/location/test_records.json deleted file mode 100644 index 8a89cf8bdd3..00000000000 --- a/erpnext/assets/doctype/location/test_records.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "doctype": "Location", - "location_name": "Test Location Area", - "is_group": 1, - "is_container": 1 - }, - { - "doctype": "Location", - "location_name": "Basil Farm", - "location": "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"point_type\":\"circle\",\"radius\":884.5625420736483},\"geometry\":{\"type\":\"Point\",\"coordinates\":[72.875834,19.100566]}}]}", - "parent_location": "Test Location Area", - "parent": "Test Location Area", - "is_group": 1, - "is_container": 1 - }, - { - "doctype": "Location", - "location_name": "Division 1", - "location": "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{\"point_type\":\"circle\",\"radius\":542.3424997060739},\"geometry\":{\"type\":\"Point\",\"coordinates\":[72.852359,19.11557]}}]}", - "parent_location": "Basil Farm", - "parent": "Basil Farm", - "is_group": 1, - "is_container": 1 - }, - { - "doctype": "Location", - "location_name": "Field 1", - "location": "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[72.846758,19.118287],[72.846758,19.121206],[72.850535,19.121206],[72.850535,19.118287],[72.846758,19.118287]]]}}]}", - "parent_location": "Division 1", - "parent": "Division 1", - "is_group": 1, - "is_container": 1 - }, - { - "doctype": "Location", - "location_name": "Block 1", - "location": "{\"type\":\"FeatureCollection\",\"features\":[{\"type\":\"Feature\",\"properties\":{},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[72.921495,19.073313],[72.924929,19.068121],[72.934713,19.06585],[72.929392,19.05579],[72.94158,19.056926],[72.951365,19.095213],[72.921495,19.073313]]]}}]}", - "parent_location": "Field 1", - "parent": "Field 1", - "is_group": 0, - "is_container": 1 - } -] \ No newline at end of file diff --git a/erpnext/assets/doctype/maintenance_team_member/test_maintenance_team_member.py b/erpnext/assets/doctype/maintenance_team_member/test_maintenance_team_member.py index 5de115f22a3..71d13dfd608 100644 --- a/erpnext/assets/doctype/maintenance_team_member/test_maintenance_team_member.py +++ b/erpnext/assets/doctype/maintenance_team_member/test_maintenance_team_member.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestMaintenanceTeamMember(IntegrationTestCase): +class TestMaintenanceTeamMember(ERPNextTestSuite): pass 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 66e6456d103..e3909ea619a 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 @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestBulkTransactionLog(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestBulkTransactionLog(ERPNextTestSuite): pass diff --git a/erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/test_bulk_transaction_log_detail.py b/erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/test_bulk_transaction_log_detail.py index 6b9b4637ab4..ae35c697c31 100644 --- a/erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/test_bulk_transaction_log_detail.py +++ b/erpnext/bulk_transaction/doctype/bulk_transaction_log_detail/test_bulk_transaction_log_detail.py @@ -2,8 +2,10 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase -class TestBulkTransactionLogDetail(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestBulkTransactionLogDetail(ERPNextTestSuite): pass diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json index fbe17f3dbbc..5a0edbdf5d1 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.json +++ b/erpnext/buying/doctype/buying_settings/buying_settings.json @@ -282,13 +282,13 @@ } ], "grid_page_length": 50, - "hide_toolbar": 1, + "hide_toolbar": 0, "icon": "fa fa-cog", "idx": 1, "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-02 18:16:35.885540", + "modified": "2026-03-16 13:28:19.432589", "modified_by": "Administrator", "module": "Buying", "name": "Buying Settings", diff --git a/erpnext/buying/doctype/buying_settings/test_buying_settings.py b/erpnext/buying/doctype/buying_settings/test_buying_settings.py index 2946685ee87..c884f51e7eb 100644 --- a/erpnext/buying/doctype/buying_settings/test_buying_settings.py +++ b/erpnext/buying/doctype/buying_settings/test_buying_settings.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestBuyingSettings(IntegrationTestCase): +class TestBuyingSettings(ERPNextTestSuite): pass diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 87435f19393..bda926b4040 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -67,7 +67,7 @@ frappe.ui.form.on("Purchase Order", { }, transaction_date(frm) { - prevent_past_schedule_dates(frm); + erpnext.buying.prevent_past_schedule_dates(frm); frm.set_value("schedule_date", ""); }, @@ -87,7 +87,7 @@ frappe.ui.form.on("Purchase Order", { if (frm.doc.docstatus == 0) { erpnext.set_unit_price_items_note(frm); } - prevent_past_schedule_dates(frm); + erpnext.buying.prevent_past_schedule_dates(frm); }, get_materials_from_supplier: function (frm) { @@ -779,11 +779,3 @@ frappe.ui.form.on("Purchase Order", "is_subcontracted", function (frm) { erpnext.buying.get_default_bom(frm); } }); - -function prevent_past_schedule_dates(frm) { - if (frm.doc.transaction_date) { - frm.fields_dict["schedule_date"].datepicker?.update({ - minDate: new Date(frm.doc.transaction_date), - }); - } -} diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 53879d5eff3..d5b2beea6f6 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -252,6 +252,7 @@ "allow_on_submit": 1, "fieldname": "schedule_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Required By" }, { @@ -1327,7 +1328,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-02 00:40:47.119584", + "modified": "2026-03-09 17:15:29.184682", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 2b287d51d8d..227221b36c0 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -894,7 +894,7 @@ def get_list_context(context=None): @frappe.whitelist() def update_status(status: str, name: str): - po = frappe.get_lazy_doc("Purchase Order", name) + po = frappe.get_lazy_doc("Purchase Order", name, check_permission="submit") po.update_status(status) po.update_delivered_qty_in_sales_order() diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 3b7c9db5ee9..02b12bc0f63 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -5,7 +5,7 @@ import json import frappe -from frappe.tests import IntegrationTestCase, change_settings +from frappe.tests import change_settings from frappe.utils import add_days, flt, getdate, nowdate from frappe.utils.data import today @@ -26,9 +26,11 @@ from erpnext.stock.doctype.material_request.test_material_request import make_ma from erpnext.stock.doctype.purchase_receipt.purchase_receipt import ( make_purchase_invoice as make_pi_from_pr, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestPurchaseOrder(IntegrationTestCase): +class TestPurchaseOrder(ERPNextTestSuite): + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_multiple_items": 1}) def test_purchase_order_qty(self): po = create_purchase_order(qty=1, do_not_save=True) @@ -540,7 +542,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertRaises(frappe.ValidationError, pr.submit) self.assertRaises(frappe.ValidationError, pi.submit) - @IntegrationTestCase.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) def test_make_purchase_invoice_with_terms(self): po = create_purchase_order(do_not_save=True) po.update({"payment_terms_template": "_Test Payment Term Template"}) @@ -712,7 +714,7 @@ class TestPurchaseOrder(IntegrationTestCase): ) self.assertEqual(due_date, "2023-03-31") - @IntegrationTestCase.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 0}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 0}) def test_terms_are_not_copied_if_automatically_fetch_payment_terms_is_unchecked(self): po = create_purchase_order(do_not_save=1) po.payment_terms_template = "_Test Payment Term Template" @@ -737,7 +739,7 @@ class TestPurchaseOrder(IntegrationTestCase): pi.insert() self.assertTrue(pi.get("payment_schedule")) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"unlink_advance_payment_on_cancelation_of_order": 1} ) def test_advance_payment_entry_unlink_against_purchase_order(self): @@ -785,6 +787,7 @@ class TestPurchaseOrder(IntegrationTestCase): Test "Advance Paid" on Purchase Order, when "Book Advance Payments in Separate Party Account" is enabled and the payment entry linked to the Order is allocated to Purchase Invoice. """ + frappe.flags.is_reverse_depr_entry = False supplier = "_Test Supplier" company = "_Test Company" @@ -808,12 +811,13 @@ class TestPurchaseOrder(IntegrationTestCase): company_doc.book_advance_payments_in_separate_party_account = False company_doc.save() - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"unlink_advance_payment_on_cancelation_of_order": 1} ) def test_advance_paid_upon_payment_entry_cancellation(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry + frappe.flags.is_reverse_depr_entry = False supplier = "_Test Supplier USD" company = "_Test Company" @@ -848,6 +852,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertEqual(po_doc.advance_paid, 0) self.assertEqual(po_doc.party_account_currency, "USD") + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_multiple_items": 1}) def test_schedule_date(self): po = create_purchase_order(do_not_submit=True) po.schedule_date = None @@ -904,7 +909,7 @@ class TestPurchaseOrder(IntegrationTestCase): bo.load_from_db() self.assertEqual(bo.items[0].ordered_qty, 5) - @IntegrationTestCase.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) + @ERPNextTestSuite.change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) def test_payment_terms_are_fetched_when_creating_purchase_invoice(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import ( create_payment_terms_template, @@ -1143,7 +1148,7 @@ class TestPurchaseOrder(IntegrationTestCase): # Test - 8: Since this PO is now fully subcontracted, creating a new SCO from it should throw error self.assertRaises(frappe.ValidationError, make_subcontracting_order, po.name) - @IntegrationTestCase.change_settings("Buying Settings", {"auto_create_subcontracting_order": 1}) + @ERPNextTestSuite.change_settings("Buying Settings", {"auto_create_subcontracting_order": 1}) def test_auto_create_subcontracting_order(self): from erpnext.controllers.tests.test_subcontracting_controller import ( make_bom_for_subcontracted_items, @@ -1176,6 +1181,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertTrue(frappe.db.get_value("Subcontracting Order", {"purchase_order": po.name})) def test_purchase_order_advance_payment_status(self): + frappe.flags.is_reverse_depr_entry = False from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request @@ -1235,7 +1241,7 @@ class TestPurchaseOrder(IntegrationTestCase): po.reload() self.assertEqual(po.per_billed, 100) - @IntegrationTestCase.change_settings("Buying Settings", {"allow_zero_qty_in_purchase_order": 1}) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_zero_qty_in_purchase_order": 1}) def test_receive_zero_qty_purchase_order(self): """ Test the flow of a Unit Price PO and PR creation against it until completion. @@ -1284,7 +1290,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertEqual(po.per_received, 100.0) self.assertEqual(po.status, "To Bill") - @IntegrationTestCase.change_settings("Buying Settings", {"allow_zero_qty_in_purchase_order": 1}) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_zero_qty_in_purchase_order": 1}) def test_bill_zero_qty_purchase_order(self): po = create_purchase_order(qty=0) @@ -1309,7 +1315,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertFalse(po.per_billed) self.assertEqual(po.status, "To Receive and Bill") - @IntegrationTestCase.change_settings("Buying Settings", {"maintain_same_rate": 0}) + @ERPNextTestSuite.change_settings("Buying Settings", {"maintain_same_rate": 0}) def test_purchase_invoice_creation_with_partial_qty(self): po = create_purchase_order(qty=100, rate=10) @@ -1329,6 +1335,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertEqual(pi.items[0].qty, 50) def test_multiple_advances_against_purchase_order_are_allocated_across_partial_purchase_invoices(self): + frappe.flags.is_reverse_depr_entry = False # step - 1: create PO po = create_purchase_order(qty=10, rate=10) @@ -1558,6 +1565,3 @@ def get_ordered_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"): def get_requested_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"): return flt(frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse}, "indented_qty")) - - -EXTRA_TEST_RECORD_DEPENDENCIES = ["BOM", "Item Price", "Warehouse"] diff --git a/erpnext/buying/doctype/purchase_order/test_records.json b/erpnext/buying/doctype/purchase_order/test_records.json deleted file mode 100644 index 4df994a68c6..00000000000 --- a/erpnext/buying/doctype/purchase_order/test_records.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "advance_paid": 0.0, - "buying_price_list": "_Test Price List", - "company": "_Test Company", - "conversion_rate": 1.0, - "currency": "INR", - "doctype": "Purchase Order", - "base_grand_total": 5000.0, - "grand_total": 5000.0, - "is_subcontracted": 0, - "naming_series": "_T-Purchase Order-", - "base_net_total": 5000.0, - "items": [ - { - "base_amount": 5000.0, - "conversion_factor": 1.0, - "description": "_Test Item", - "doctype": "Purchase Order Item", - "item_code": "_Test Item", - "item_name": "_Test Item", - "parentfield": "items", - "qty": 10.0, - "rate": 500.0, - "schedule_date": "2013-03-01", - "stock_uom": "_Test UOM", - "uom": "_Test UOM", - "warehouse": "_Test Warehouse - _TC" - } - ], - "supplier": "_Test Supplier", - "supplier_name": "_Test Supplier", - "transaction_date": "2013-02-12", - "schedule_date": "2013-02-13" - } -] diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 3171ad595b1..b71d0dd3006 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -165,14 +165,10 @@ frappe.ui.form.on("Request for Quotation", { }, show_supplier_quotation_comparison(frm) { - const today = new Date(); - const oneMonthAgo = new Date(today); - oneMonthAgo.setMonth(today.getMonth() - 1); - frappe.route_options = { company: frm.doc.company, - from_date: moment(oneMonthAgo).format("YYYY-MM-DD"), - to_date: moment(today).format("YYYY-MM-DD"), + from_date: moment(frm.doc.transaction_date).format("YYYY-MM-DD"), + to_date: moment(new Date()).format("YYYY-MM-DD"), request_for_quotation: frm.doc.name, }; frappe.set_route("query-report", "Supplier Quotation Comparison"); diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json index a10497702ce..18e1356b263 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -49,7 +49,6 @@ { "fieldname": "naming_series", "fieldtype": "Select", - "in_list_view": 1, "label": "Series", "no_copy": 1, "oldfieldname": "naming_series", @@ -77,6 +76,7 @@ "fieldname": "vendor", "fieldtype": "Link", "hidden": 1, + "in_list_view": 1, "in_standard_filter": 1, "label": "Supplier", "no_copy": 1, @@ -95,6 +95,7 @@ "fieldname": "transaction_date", "fieldtype": "Date", "in_list_view": 1, + "in_standard_filter": 1, "label": "Date", "oldfieldname": "transaction_date", "oldfieldtype": "Date", @@ -147,7 +148,6 @@ "depends_on": "eval:doc.use_html == 0", "fieldname": "message_for_supplier", "fieldtype": "Text Editor", - "in_list_view": 1, "label": "Message for Supplier", "mandatory_depends_on": "eval:doc.use_html == 0", "print_hide": 1 @@ -225,6 +225,8 @@ { "fieldname": "status", "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, "label": "Status", "no_copy": 1, "oldfieldname": "status", @@ -263,6 +265,7 @@ { "fieldname": "schedule_date", "fieldtype": "Date", + "in_list_view": 1, "label": "Required Date" }, { @@ -350,7 +353,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-03-01 23:38:48.079274", + "modified": "2026-03-09 17:15:29.774614", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py index 425d172629d..9201f6c4f2d 100644 --- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py @@ -5,7 +5,7 @@ from urllib.parse import urlparse import frappe -from frappe.tests import IntegrationTestCase, change_settings +from frappe.tests import change_settings from frappe.utils import nowdate from erpnext.buying.doctype.request_for_quotation.request_for_quotation import ( @@ -19,9 +19,10 @@ from erpnext.crm.doctype.opportunity.opportunity import make_request_for_quotati from erpnext.crm.doctype.opportunity.test_opportunity import make_opportunity from erpnext.stock.doctype.item.test_item import make_item from erpnext.templates.pages.rfq import check_supplier_has_docname_access +from erpnext.tests.utils import ERPNextTestSuite -class TestRequestforQuotation(IntegrationTestCase): +class TestRequestforQuotation(ERPNextTestSuite): def test_rfq_qty(self): rfq = make_request_for_quotation(qty=0, do_not_save=True) with self.assertRaises(InvalidQtyError): @@ -222,7 +223,7 @@ class TestRequestforQuotation(IntegrationTestCase): supplier_doc.reload() self.assertTrue(supplier_doc.portal_users[0].user) - @IntegrationTestCase.change_settings("Buying Settings", {"allow_zero_qty_in_request_for_quotation": 1}) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_zero_qty_in_request_for_quotation": 1}) def test_supplier_quotation_from_zero_qty_rfq(self): rfq = make_request_for_quotation(qty=0) sq = make_supplier_quotation_from_rfq(rfq.name, for_supplier=rfq.get("suppliers")[0].supplier) @@ -231,7 +232,7 @@ class TestRequestforQuotation(IntegrationTestCase): self.assertEqual(sq.items[0].qty, 0) self.assertEqual(sq.items[0].item_code, rfq.items[0].item_code) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Buying Settings", { "allow_zero_qty_in_request_for_quotation": 1, diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 08178831751..60e90517b17 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -178,6 +178,7 @@ "default": "Company", "fieldname": "supplier_type", "fieldtype": "Select", + "in_list_view": 1, "label": "Supplier Type", "options": "Company\nIndividual\nPartnership", "reqd": 1 @@ -238,6 +239,7 @@ "fieldname": "default_currency", "fieldtype": "Link", "ignore_user_permissions": 1, + "in_list_view": 1, "label": "Billing Currency", "no_copy": 1, "options": "Currency" @@ -515,7 +517,7 @@ "link_fieldname": "party" } ], - "modified": "2026-02-08 20:28:01.101808", + "modified": "2026-03-09 17:15:25.465759", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json deleted file mode 100644 index 1bb9899cc85..00000000000 --- a/erpnext/buying/doctype/supplier/test_records.json +++ /dev/null @@ -1,50 +0,0 @@ -[ - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier With Template 1", - "supplier_group": "_Test Supplier Group", - "payment_terms": "_Test Payment Term Template 3" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier P", - "supplier_group": "_Test Supplier Group" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier with Country", - "supplier_group": "_Test Supplier Group", - "country": "Greece" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier", - "supplier_group": "_Test Supplier Group" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier 1", - "supplier_group": "_Test Supplier Group" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier 2", - "supplier_group": "_Test Supplier Group" - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier USD", - "supplier_group": "_Test Supplier Group", - "default_currency": "USD", - "accounts": [{ - "company": "_Test Company", - "account": "_Test Payable USD - _TC" - }] - }, - { - "doctype": "Supplier", - "supplier_name": "_Test Supplier With Tax Category", - "supplier_group": "_Test Supplier Group", - "tax_category": "_Test Tax Category 1" - } -] diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index f3f0ede3e17..663a7b48e46 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -3,18 +3,15 @@ import frappe +from frappe.tests import UnitTestCase from erpnext.accounts.party import get_due_date from erpnext.controllers.website_list_for_contact import get_customers_suppliers from erpnext.exceptions import PartyDisabled - -EXTRA_TEST_RECORD_DEPENDENCIES = ["Payment Term", "Payment Terms Template"] +from erpnext.tests.utils import ERPNextTestSuite -from frappe.tests import IntegrationTestCase - - -class TestSupplier(IntegrationTestCase): +class TestSupplier(ERPNextTestSuite): def test_get_supplier_group_details(self): doc = frappe.new_doc("Supplier Group") doc.supplier_group_name = "_Testing Supplier Group" @@ -175,7 +172,10 @@ def create_supplier(**args): return doc -class TestSupplierPortal(IntegrationTestCase): +from erpnext.tests.utils import ERPNextTestSuite + + +class TestSupplierPortal(ERPNextTestSuite): def test_portal_user_can_access_supplier_data(self): supplier = create_supplier() diff --git a/erpnext/buying/doctype/supplier_quotation/test_records.json b/erpnext/buying/doctype/supplier_quotation/test_records.json index 8acac3210d5..1b9b922e3c9 100644 --- a/erpnext/buying/doctype/supplier_quotation/test_records.json +++ b/erpnext/buying/doctype/supplier_quotation/test_records.json @@ -1,31 +1,31 @@ [ { - "buying_price_list": "_Test Price List", - "company": "_Test Company", - "conversion_rate": 1.0, - "currency": "INR", - "doctype": "Supplier Quotation", - "base_grand_total": 5000.0, - "grand_total": 5000.0, - "is_subcontracted": 0, - "naming_series": "_T-Supplier Quotation-", - "base_net_total": 5000.0, + "buying_price_list": "_Test Price List", + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "doctype": "Supplier Quotation", + "base_grand_total": 5000.0, + "grand_total": 5000.0, + "is_subcontracted": 0, + "naming_series": "_T-Supplier Quotation-", + "base_net_total": 5000.0, "items": [ { - "base_amount": 5000.0, - "description": "_Test FG Item", - "doctype": "Supplier Quotation Item", - "item_code": "_Test FG Item", - "item_name": "_Test FG Item", - "parentfield": "items", - "qty": 10.0, - "rate": 500.0, - "uom": "_Test UOM", + "base_amount": 5000.0, + "description": "_Test FG Item", + "doctype": "Supplier Quotation Item", + "item_code": "_Test FG Item", + "item_name": "_Test FG Item", + "parentfield": "items", + "qty": 10.0, + "rate": 500.0, + "uom": "_Test UOM", "warehouse": "_Test Warehouse - _TC" } - ], - "supplier": "_Test Supplier", - "supplier_name": "_Test Supplier", + ], + "supplier": "_Test Supplier", + "supplier_name": "_Test Supplier", "transaction_date": "2013-02-12" } -] \ No newline at end of file +] diff --git a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py index 7c2714ba671..c271d34b35d 100644 --- a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py @@ -5,14 +5,18 @@ import json import frappe -from frappe.tests import IntegrationTestCase, change_settings +from frappe.tests import change_settings from frappe.utils import add_days, today from erpnext.buying.doctype.supplier_quotation.supplier_quotation import make_purchase_order from erpnext.controllers.accounts_controller import InvalidQtyError, update_child_qty_rate +from erpnext.tests.utils import ERPNextTestSuite -class TestPurchaseOrder(IntegrationTestCase): +class TestPurchaseOrder(ERPNextTestSuite): + def setUp(self): + self.load_test_records("Supplier Quotation") + def test_update_child_supplier_quotation_add_item(self): sq = frappe.copy_doc(self.globalTestRecords["Supplier Quotation"][0]) sq.submit() @@ -166,7 +170,7 @@ class TestPurchaseOrder(IntegrationTestCase): po.insert() - @IntegrationTestCase.change_settings("Buying Settings", {"allow_zero_qty_in_supplier_quotation": 1}) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_zero_qty_in_supplier_quotation": 1}) def test_map_purchase_order_from_zero_qty_supplier_quotation(self): sq = frappe.copy_doc(self.globalTestRecords["Supplier Quotation"][0]) sq.items[0].qty = 0 diff --git a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py index 7aaaceaed08..c11ee6383dc 100644 --- a/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py +++ b/erpnext/buying/doctype/supplier_scorecard/supplier_scorecard.py @@ -266,8 +266,8 @@ def get_scorecard_date(period, start_date): return end_date -def make_default_records(): - install_variable_docs = [ +def get_default_scorecard_variables(): + return [ { "param_name": "total_accepted_items", "variable_label": "Total Accepted Items", @@ -374,7 +374,10 @@ def make_default_records(): "path": "get_invoiced_qty", }, ] - install_standing_docs = [ + + +def get_default_scorecard_standing(): + return [ { "min_grade": 0.0, "prevent_rfqs": 1, @@ -425,12 +428,17 @@ def make_default_records(): }, ] + +def make_default_records(): + install_variable_docs = get_default_scorecard_variables() for d in install_variable_docs: try: d["doctype"] = "Supplier Scorecard Variable" frappe.get_doc(d).insert() except frappe.NameError: pass + + install_standing_docs = get_default_scorecard_standing() for d in install_standing_docs: try: d["doctype"] = "Supplier Scorecard Standing" diff --git a/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py b/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py index c65ebe2086f..a1d1dfc4709 100644 --- a/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py +++ b/erpnext/buying/doctype/supplier_scorecard/test_supplier_scorecard.py @@ -3,10 +3,11 @@ import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierScorecard(IntegrationTestCase): +class TestSupplierScorecard(ERPNextTestSuite): def test_create_scorecard(self): doc = make_supplier_scorecard().insert() self.assertEqual(doc.name, valid_scorecard[0].get("supplier")) diff --git a/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py b/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py index 114ff2b56b3..951d33ed901 100644 --- a/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py +++ b/erpnext/buying/doctype/supplier_scorecard_criteria/test_supplier_scorecard_criteria.py @@ -3,10 +3,11 @@ import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierScorecardCriteria(IntegrationTestCase): +class TestSupplierScorecardCriteria(ERPNextTestSuite): def test_variables_exist(self): delete_test_scorecards() for d in test_good_criteria: diff --git a/erpnext/buying/doctype/supplier_scorecard_period/test_supplier_scorecard_period.py b/erpnext/buying/doctype/supplier_scorecard_period/test_supplier_scorecard_period.py index b4975edfc75..4762c25ae51 100644 --- a/erpnext/buying/doctype/supplier_scorecard_period/test_supplier_scorecard_period.py +++ b/erpnext/buying/doctype/supplier_scorecard_period/test_supplier_scorecard_period.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierScorecardPeriod(IntegrationTestCase): +class TestSupplierScorecardPeriod(ERPNextTestSuite): pass diff --git a/erpnext/buying/doctype/supplier_scorecard_standing/test_supplier_scorecard_standing.py b/erpnext/buying/doctype/supplier_scorecard_standing/test_supplier_scorecard_standing.py index 97cb93f4c69..64f8abacadb 100644 --- a/erpnext/buying/doctype/supplier_scorecard_standing/test_supplier_scorecard_standing.py +++ b/erpnext/buying/doctype/supplier_scorecard_standing/test_supplier_scorecard_standing.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierScorecardStanding(IntegrationTestCase): +class TestSupplierScorecardStanding(ERPNextTestSuite): pass diff --git a/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py b/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py index 8f4b2f4ecdf..f390eefcc65 100644 --- a/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py +++ b/erpnext/buying/doctype/supplier_scorecard_variable/test_supplier_scorecard_variable.py @@ -3,14 +3,14 @@ import frappe -from frappe.tests import IntegrationTestCase from erpnext.buying.doctype.supplier_scorecard_variable.supplier_scorecard_variable import ( VariablePathNotFound, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestSupplierScorecardVariable(IntegrationTestCase): +class TestSupplierScorecardVariable(ERPNextTestSuite): def test_variable_exist(self): for d in test_existing_variables: my_doc = frappe.get_doc("Supplier Scorecard Variable", d.get("name")) diff --git a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py index f344730a7fa..1577bf2cbf6 100644 --- a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py @@ -2,8 +2,8 @@ # For license information, please see license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestProcurementTracker(IntegrationTestCase): +class TestProcurementTracker(ERPNextTestSuite): pass diff --git a/erpnext/buying/report/purchase_analytics/purchase_analytics.js b/erpnext/buying/report/purchase_analytics/purchase_analytics.js index 23a188057d9..b66c1c429d0 100644 --- a/erpnext/buying/report/purchase_analytics/purchase_analytics.js +++ b/erpnext/buying/report/purchase_analytics/purchase_analytics.js @@ -65,6 +65,11 @@ frappe.query_reports["Purchase Analytics"] = { default: "Monthly", reqd: 1, }, + { + fieldname: "show_aggregate_value_from_subsidiary_companies", + label: __("Show Aggregate Value from Subsidiary Companies"), + fieldtype: "Check", + }, ], get_datatable_options(options) { return Object.assign(options, { diff --git a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json index 0047d6ecbe5..e53b8e6d669 100644 --- a/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json +++ b/erpnext/buying/report/purchase_order_trends/purchase_order_trends.json @@ -9,8 +9,8 @@ "filters": [], "idx": 3, "is_standard": "Yes", - "letterhead": null, - "modified": "2025-11-05 11:55:50.058154", + "letter_head": null, + "modified": "2026-03-13 17:36:05.561765", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order Trends", diff --git a/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py b/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py index ca0b1abad0c..38f2d7426ff 100644 --- a/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py +++ b/erpnext/buying/report/requested_items_to_order_and_receive/test_requested_items_to_order_and_receive.py @@ -2,7 +2,6 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt @@ -11,11 +10,14 @@ from erpnext.buying.report.requested_items_to_order_and_receive.requested_items_ ) from erpnext.stock.doctype.item.test_item import create_item from erpnext.stock.doctype.material_request.material_request import make_purchase_order +from erpnext.tests.utils import ERPNextTestSuite -class TestRequestedItemsToOrderAndReceive(IntegrationTestCase): +class TestRequestedItemsToOrderAndReceive(ERPNextTestSuite): def setUp(self) -> None: create_item("Test MR Report Item") + self.load_test_records("Material Request") + frappe.db.set_single_value("Buying Settings", "allow_multiple_items", 1) self.setup_material_request() # to order and receive self.setup_material_request(order=True, days=1) # to receive (ordered) self.setup_material_request(order=True, receive=True, days=2) # complete (ordered & received) @@ -27,9 +29,6 @@ class TestRequestedItemsToOrderAndReceive(IntegrationTestCase): item_code="Test MR Report Item", ) - def tearDown(self) -> None: - frappe.db.rollback() - def test_date_range(self): data = get_data(self.filters) self.assertEqual(len(data), 2) # MRs today should be fetched diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py b/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py index 5a4c8ec6ba0..1b6bf653a77 100644 --- a/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py +++ b/erpnext/buying/report/subcontracted_item_to_be_received/test_subcontracted_item_to_be_received.py @@ -7,7 +7,6 @@ import copy import frappe -from frappe.tests import IntegrationTestCase from erpnext.buying.report.subcontracted_item_to_be_received.subcontracted_item_to_be_received import ( execute, @@ -22,9 +21,10 @@ from erpnext.controllers.tests.test_subcontracting_controller import ( from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import ( make_subcontracting_receipt, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestSubcontractedItemToBeReceived(IntegrationTestCase): +class TestSubcontractedItemToBeReceived(ERPNextTestSuite): def test_pending_and_received_qty(self): make_service_item("Subcontracted Service Item 1") service_items = [ diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py index ef28eda62a5..4526bbf1703 100644 --- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py @@ -41,6 +41,7 @@ def get_columns(filters): "fieldname": "transferred_qty", "width": 200, }, + {"label": _("Returned Quantity"), "fieldtype": "Float", "fieldname": "returned_qty", "width": 150}, {"label": _("Pending Quantity"), "fieldtype": "Float", "fieldname": "p_qty", "width": 150}, ] @@ -50,7 +51,7 @@ def get_data(filters): data = [] for row in order_rm_item_details: - transferred_qty = row.get("transferred_qty") or 0 + transferred_qty = (row.get("transferred_qty") or 0) - (row.get("returned_qty") or 0) if transferred_qty < row.get("reqd_qty", 0): pending_qty = frappe.utils.flt(row.get("reqd_qty", 0) - transferred_qty) row.p_qty = pending_qty if pending_qty > 0 else 0 @@ -86,6 +87,7 @@ def get_order_items_to_supply(filters): f"`tab{supplied_items_table}`.rm_item_code as rm_item_code", f"`tab{supplied_items_table}`.required_qty as reqd_qty", f"`tab{supplied_items_table}`.supplied_qty as transferred_qty", + f"`tab{supplied_items_table}`.returned_qty as returned_qty", ], filters=record_filters, ) diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py index 3553906ae63..ee76c50261d 100644 --- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py @@ -4,7 +4,6 @@ # Decompiled by https://python-decompiler.com import frappe -from frappe.tests import IntegrationTestCase from erpnext.buying.report.subcontracted_raw_materials_to_be_transferred.subcontracted_raw_materials_to_be_transferred import ( execute, @@ -15,9 +14,10 @@ from erpnext.controllers.tests.test_subcontracting_controller import ( make_service_item, ) from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry +from erpnext.tests.utils import ERPNextTestSuite -class TestSubcontractedItemToBeTransferred(IntegrationTestCase): +class TestSubcontractedItemToBeTransferred(ERPNextTestSuite): def test_pending_and_transferred_qty(self): make_service_item("Subcontracted Service Item 1") service_items = [ diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 09a31eea4be..83e7d84a7fd 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2290,6 +2290,16 @@ class AccountsController(TransactionBase): return stock_items + def get_asset_items(self): + asset_items = [] + item_codes = list(set(item.item_code for item in self.get("items"))) + if item_codes: + asset_items = frappe.db.get_values( + "Item", {"name": ["in", item_codes], "is_fixed_asset": 1}, pluck="name", cache=True + ) + + return asset_items + def calculate_total_advance_from_ledger(self): adv = frappe.qb.DocType("Advance Payment Ledger Entry") return ( diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 86cfbc01172..07349a3363f 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -1092,12 +1092,9 @@ class BuyingController(SubcontractingController): } ) for dimension in accounting_dimensions[0]: - asset.update( - { - dimension["fieldname"]: self.get(dimension["fieldname"]) - or dimension.get("default_dimension") - } - ) + fieldname = dimension["fieldname"] + default_dimension = accounting_dimensions[1].get(self.company, {}).get(fieldname) + asset.update({fieldname: row.get(fieldname) or self.get(fieldname) or default_dimension}) asset.flags.ignore_validate = True asset.flags.ignore_mandatory = True diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py index f539ef15536..689f0c6a3f6 100644 --- a/erpnext/controllers/item_variant.py +++ b/erpnext/controllers/item_variant.py @@ -366,13 +366,13 @@ def copy_attributes_to_variant(item, variant): else: if item.variant_based_on == "Item Attribute": if variant.attributes: - attributes_description = item.description + " " + attributes_description = item.description or "" for d in variant.attributes: attributes_description += ( "
" + d.attribute + ": " + cstr(d.attribute_value) + "
" ) - if attributes_description not in variant.description: + if attributes_description not in (variant.description or ""): variant.description = attributes_description diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index c3503da61a4..a62468d1d1f 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -15,6 +15,7 @@ from frappe.utils import cint, nowdate, today, unique from pypika import Order import erpnext +from erpnext.accounts.utils import build_qb_match_conditions from erpnext.stock.get_item_details import ItemDetailsCtx, _get_item_tax_template @@ -634,34 +635,37 @@ def get_blanket_orders(doctype: str, txt: str, searchfield: str, start: int, pag @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def get_income_account(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): - from erpnext.controllers.queries import get_match_cond - # income account can be any Credit account, # but can also be a Asset account with account_type='Income Account' in special circumstances. # Hence the first condition is an "OR" + if not filters: filters = {} - doctype = "Account" - condition = "" + dt = "Account" + + acc = qb.DocType(dt) + condition = [ + (acc.report_type.eq("Profit and Loss") | acc.account_type.isin(["Income Account", "Temporary"])), + acc.is_group.eq(0), + acc.disabled.eq(0), + ] + if txt: + condition.append(acc.name.like(f"%{txt}%")) + if filters.get("company"): - condition += "and tabAccount.company = %(company)s" + condition.append(acc.company.eq(filters.get("company"))) - condition += " and tabAccount.disabled = %(disabled)s" + user_perms = build_qb_match_conditions(dt) + condition.extend(user_perms) - return frappe.db.sql( - f"""select tabAccount.name from `tabAccount` - where (tabAccount.report_type = "Profit and Loss" - or tabAccount.account_type in ("Income Account", "Temporary")) - and tabAccount.is_group=0 - and tabAccount.`{searchfield}` LIKE %(txt)s - {condition} {get_match_cond(doctype)} - order by idx desc, name""", - { - "txt": "%" + txt + "%", - "company": filters.get("company", ""), - "disabled": cint(filters.get("disabled", 0)), - }, + return ( + qb.from_(acc) + .select(acc.name) + .where(Criterion.all(condition)) + .orderby(acc.idx, order=Order.desc) + .orderby(acc.name) + .run() ) @@ -730,26 +734,38 @@ def get_filtered_dimensions( @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def get_expense_account(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): - from erpnext.controllers.queries import get_match_cond - if not filters: filters = {} - doctype = "Account" - condition = "" - if filters.get("company"): - condition += "and tabAccount.company = %(company)s" + dt = "Account" - return frappe.db.sql( - f"""select tabAccount.name from `tabAccount` - where (tabAccount.report_type = "Profit and Loss" - or tabAccount.account_type in ("Expense Account", "Fixed Asset", "Temporary", "Asset Received But Not Billed", "Capital Work in Progress")) - and tabAccount.is_group=0 - and tabAccount.disabled = 0 - and tabAccount.{searchfield} LIKE %(txt)s - {condition} {get_match_cond(doctype)}""", - {"company": filters.get("company", ""), "txt": "%" + txt + "%"}, - ) + acc = qb.DocType(dt) + condition = [ + ( + acc.report_type.eq("Profit and Loss") + | acc.account_type.isin( + [ + "Expense Account", + "Fixed Asset", + "Temporary", + "Asset Received But Not Billed", + "Capital Work in Progress", + ] + ) + ), + acc.is_group.eq(0), + acc.disabled.eq(0), + ] + if txt: + condition.append(acc.name.like(f"%{txt}%")) + + if filters.get("company"): + condition.append(acc.company.eq(filters.get("company"))) + + user_perms = build_qb_match_conditions(dt) + condition.extend(user_perms) + + return qb.from_(acc).select(acc.name).where(Criterion.all(condition)).run() @frappe.whitelist() diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 7c47bf1ae41..409af70bb75 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -596,7 +596,6 @@ def make_return_doc(doctype: str, source_name: str, target_doc=None, return_agai target_doc.against_sales_order = source_doc.against_sales_order target_doc.against_sales_invoice = source_doc.against_sales_invoice target_doc.so_detail = source_doc.so_detail - target_doc.si_detail = source_doc.si_detail target_doc.expense_account = source_doc.expense_account target_doc.dn_detail = source_doc.name if default_warehouse_for_sales_return: diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 742d8627fdf..8138a94693c 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -526,6 +526,9 @@ class SellingController(StockController): if self.doctype not in ("Delivery Note", "Sales Invoice"): return + if self.doctype == "Sales Invoice" and not self.update_stock and not self.is_internal_transfer(): + return + from erpnext.stock.serial_batch_bundle import get_batch_nos, get_serial_nos allow_at_arms_length_price = frappe.get_cached_value( diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 4ec5e739143..3ce079a62a6 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -267,8 +267,8 @@ class StatusUpdater(Document): self.global_amount_allowance = None for args in self.status_updater: - if "target_ref_field" not in args: - # if target_ref_field is not specified, the programmer does not want to validate qty / amount + if "target_ref_field" not in args or args.get("validate_qty") is False: + # if target_ref_field is not specified or validate_qty is explicitly set to False, skip validation continue items_to_validate = [] @@ -444,7 +444,10 @@ class StatusUpdater(Document): ): return - if args["source_dt"] != "Pick List Item" and args["target_dt"] != "Quotation Item": + if args["source_dt"] != "Pick List Item" and args["target_dt"] not in [ + "Quotation Item", + "Packed Item", + ]: if qty_or_amount == "qty": action_msg = _( 'To allow over receipt / delivery, update "Over Receipt/Delivery Allowance" in Stock Settings or the Item.' diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index beaacd3674b..01366d7bcc8 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -1435,10 +1435,20 @@ class StockController(AccountsController): elif self.doctype == "Stock Entry" and row.t_warehouse: qi_required = True # inward stock needs inspection - if row.get("is_scrap_item"): + if row.get("type") or row.get("is_legacy_scrap_item"): continue if qi_required: # validate row only if inspection is required on item level + if self.doctype in [ + "Purchase Receipt", + "Purchase Invoice", + "Sales Invoice", + "Delivery Note", + ] and frappe.get_single_value( + "Stock Settings", "allow_to_make_quality_inspection_after_purchase_or_delivery" + ): + return + self.validate_qi_presence(row) if self.docstatus == 1: self.validate_qi_submission(row) @@ -1446,16 +1456,6 @@ class StockController(AccountsController): def validate_qi_presence(self, row): """Check if QI is present on row level. Warn on save and stop on submit if missing.""" - if self.doctype in [ - "Purchase Receipt", - "Purchase Invoice", - "Sales Invoice", - "Delivery Note", - ] and frappe.get_single_value( - "Stock Settings", "allow_to_make_quality_inspection_after_purchase_or_delivery" - ): - return - if not row.quality_inspection: msg = _("Row #{0}: Quality Inspection is required for Item {1}").format( row.idx, frappe.bold(row.item_code) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index 47528184a8b..2e4ea6916d8 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -160,7 +160,7 @@ class SubcontractingController(StockController): ).format(item.idx, get_link_to_form("Item", item.item_code)) ) - if not item.get("is_scrap_item"): + if not item.get("type") and not item.get("is_legacy_scrap_item"): if not is_sub_contracted_item: frappe.throw( _("Row {0}: Item {1} must be a subcontracted item.").format(item.idx, item.item_name) @@ -206,7 +206,7 @@ class SubcontractingController(StockController): ).format(item.idx, item.item_name) ) - if self.doctype != "Subcontracting Inward Order": + if self.doctype not in ["Subcontracting Inward Order", "Subcontracting Receipt"]: item.amount = item.qty * item.rate if item.bom: @@ -238,7 +238,7 @@ class SubcontractingController(StockController): and self._doc_before_save ): for row in self._doc_before_save.get("items"): - item_dict[row.name] = (row.item_code, row.qty + (row.get("rejected_qty") or 0)) + item_dict[row.name] = (row.item_code, row.received_qty) return item_dict @@ -264,7 +264,7 @@ class SubcontractingController(StockController): self.__reference_name.append(row.name) if (row.name not in item_dict) or ( row.item_code, - row.qty + (row.get("rejected_qty") or 0), + row.received_qty, ) != item_dict[row.name]: self.__changed_name.append(row.name) @@ -961,7 +961,7 @@ class SubcontractingController(StockController): ): qty = ( flt(bom_item.qty_consumed_per_unit) - * flt(row.qty + (row.get("rejected_qty") or 0)) + * flt(row.get("received_qty") or (row.qty + (row.get("rejected_qty") or 0))) * row.conversion_factor ) bom_item.main_item_code = row.item_code @@ -1278,22 +1278,28 @@ class SubcontractingController(StockController): if self.total_additional_costs: if self.distribute_additional_costs_based_on == "Amount": total_amt = sum( - flt(item.amount) for item in self.get("items") if not item.get("is_scrap_item") + flt(item.amount) + for item in self.get("items") + if not item.get("type") and not item.get("is_legacy_scrap_item") ) for item in self.items: - if not item.get("is_scrap_item"): + if not item.get("type") and not item.get("is_legacy_scrap_item"): item.additional_cost_per_qty = ( (item.amount * self.total_additional_costs) / total_amt ) / item.qty else: - total_qty = sum(flt(item.qty) for item in self.get("items") if not item.get("is_scrap_item")) + total_qty = sum( + flt(item.qty) + for item in self.get("items") + if not item.get("type") and not item.get("is_legacy_scrap_item") + ) additional_cost_per_qty = self.total_additional_costs / total_qty for item in self.items: - if not item.get("is_scrap_item"): + if not item.get("type") and not item.get("is_legacy_scrap_item"): item.additional_cost_per_qty = additional_cost_per_qty else: for item in self.items: - if not item.get("is_scrap_item"): + if not item.get("type") and not item.get("is_legacy_scrap_item"): item.additional_cost_per_qty = 0 @frappe.whitelist() diff --git a/erpnext/controllers/subcontracting_inward_controller.py b/erpnext/controllers/subcontracting_inward_controller.py index 1167cdcb59d..77a6a9ea19d 100644 --- a/erpnext/controllers/subcontracting_inward_controller.py +++ b/erpnext/controllers/subcontracting_inward_controller.py @@ -1,3 +1,5 @@ +from collections import defaultdict + import frappe from frappe import _, bold from frappe.query_builder import Case @@ -18,7 +20,7 @@ class SubcontractingInwardController: def on_submit_subcontracting_inward(self): self.update_inward_order_item() self.update_inward_order_received_items() - self.update_inward_order_scrap_items() + self.update_inward_order_secondary_items() self.create_stock_reservation_entries_for_inward() self.update_inward_order_status() @@ -28,7 +30,7 @@ class SubcontractingInwardController: self.validate_delivery() self.validate_receive_from_customer_cancel() self.update_inward_order_received_items() - self.update_inward_order_scrap_items() + self.update_inward_order_secondary_items() self.remove_reference_for_additional_items() self.update_inward_order_status() @@ -239,7 +241,8 @@ class SubcontractingInwardController: item for item in self.get("items") if not item.is_finished_item - and not item.is_scrap_item + and not item.type + and not item.is_legacy_scrap_item and frappe.get_cached_value("Item", item.item_code, "is_customer_provided_item") ] @@ -368,7 +371,9 @@ class SubcontractingInwardController: if self.subcontracting_inward_order: if self.purpose in ["Subcontracting Delivery", "Subcontracting Return", "Manufacture"]: for item in self.items: - if (item.is_finished_item or item.is_scrap_item) and item.valuation_rate == 0: + if ( + item.is_finished_item or item.type or item.is_legacy_scrap_item + ) and item.valuation_rate == 0: item.allow_zero_valuation_rate = 1 def validate_warehouse_(self): @@ -467,7 +472,7 @@ class SubcontractingInwardController: self.validate_delivery_on_save() else: for item in self.items: - if not item.is_scrap_item: + if not item.type and not item.is_legacy_scrap_item: delivered_qty, returned_qty = frappe.get_value( "Subcontracting Inward Order Item", item.scio_detail, @@ -519,7 +524,7 @@ class SubcontractingInwardController: if max_allowed_qty: max_allowed_qty = max_allowed_qty[0] else: - table = frappe.qb.DocType("Subcontracting Inward Order Scrap Item") + table = frappe.qb.DocType("Subcontracting Inward Order Secondary Item") query = ( frappe.qb.from_(table) .select((table.produced_qty - table.delivered_qty).as_("max_allowed_qty")) @@ -538,8 +543,8 @@ class SubcontractingInwardController: bold( frappe.get_cached_value( "Subcontracting Inward Order Item" - if not item.is_scrap_item - else "Subcontracting Inward Order Scrap Item", + if not item.type and not item.is_legacy_scrap_item + else "Subcontracting Inward Order Secondary Item", item.scio_detail, "stock_uom", ) @@ -590,9 +595,9 @@ class SubcontractingInwardController: ) for item in [item for item in self.items if not item.is_finished_item]: - if item.is_scrap_item: - scio_scrap_item = frappe.get_value( - "Subcontracting Inward Order Scrap Item", + if item.type or item.is_legacy_scrap_item: + scio_secondary_item = frappe.get_value( + "Subcontracting Inward Order Secondary Item", { "docstatus": 1, "item_code": item.item_code, @@ -603,12 +608,13 @@ class SubcontractingInwardController: as_dict=True, ) if ( - scio_scrap_item - and scio_scrap_item.delivered_qty > scio_scrap_item.produced_qty - item.transfer_qty + scio_secondary_item + and scio_secondary_item.delivered_qty + > scio_secondary_item.produced_qty - item.transfer_qty ): frappe.throw( _( - "Row #{0}: Cannot cancel this Manufacturing Stock Entry as quantity of Scrap Item {1} produced cannot be less than quantity delivered." + "Row #{0}: Cannot cancel this Manufacturing Stock Entry as quantity of Secondary Item {1} produced cannot be less than quantity delivered." ).format(item.idx, get_link_to_form("Item", item.item_code)) ) else: @@ -648,8 +654,8 @@ class SubcontractingInwardController: for item in self.items: doctype = ( "Subcontracting Inward Order Item" - if not item.is_scrap_item - else "Subcontracting Inward Order Scrap Item" + if not item.type and not item.is_legacy_scrap_item + else "Subcontracting Inward Order Secondary Item" ) frappe.db.set_value( doctype, @@ -715,6 +721,7 @@ class SubcontractingInwardController: "Subcontracting Inward Order Item", item.against_fg, "item_code" ), ) + scio_rm.flags.skip_docstatus_validation = True scio_rm.insert() scio_rm.submit() item.db_set("scio_detail", scio_rm.name) @@ -763,7 +770,11 @@ class SubcontractingInwardController: customer_warehouse = frappe.get_cached_value( "Subcontracting Inward Order", self.subcontracting_inward_order, "customer_warehouse" ) - items = [item for item in self.items if not item.is_finished_item and not item.is_scrap_item] + items = [ + item + for item in self.items + if not item.is_finished_item and not item.type and not item.is_legacy_scrap_item + ] item_code_wh = frappe._dict( { ( @@ -857,27 +868,28 @@ class SubcontractingInwardController: warehouse=extra_item.s_warehouse, is_additional_item=True, ) + doc.flags.skip_docstatus_validation = True doc.insert() doc.submit() - def update_inward_order_scrap_items(self): + def update_inward_order_secondary_items(self): if (scio := self.subcontracting_inward_order) and self.purpose == "Manufacture": - scrap_items_list = [item for item in self.items if item.is_scrap_item] - scrap_items = frappe._dict( - { - (item.item_code, item.t_warehouse): item.transfer_qty - if self._action == "submit" - else -item.transfer_qty - for item in scrap_items_list - } - ) - if scrap_items: - item_codes, warehouses = zip(*list(scrap_items.keys()), strict=True) + secondary_items_list = [item for item in self.items if item.type or item.is_legacy_scrap_item] + + secondary_items = defaultdict(float) + for item in secondary_items_list: + secondary_items[(item.item_code, item.t_warehouse)] += ( + item.transfer_qty if self._action == "submit" else -item.transfer_qty + ) + secondary_items = frappe._dict(secondary_items) + + if secondary_items: + item_codes, warehouses = zip(*list(secondary_items.keys()), strict=True) item_codes = list(item_codes) warehouses = list(warehouses) result = frappe.get_all( - "Subcontracting Inward Order Scrap Item", + "Subcontracting Inward Order Secondary Item", filters={ "item_code": ["in", item_codes], "warehouse": ["in", warehouses], @@ -890,7 +902,7 @@ class SubcontractingInwardController: ) if result: - scrap_item_dict = frappe._dict( + secondary_items_dict = frappe._dict( { (d.item_code, d.warehouse): frappe._dict( {"name": d.name, "produced_qty": d.produced_qty} @@ -900,45 +912,51 @@ class SubcontractingInwardController: ) deleted_docs = [] case_expr = Case() - table = frappe.qb.DocType("Subcontracting Inward Order Scrap Item") - for key, value in scrap_item_dict.items(): - if self._action == "cancel" and value.produced_qty - abs(scrap_items.get(key)) == 0: + table = frappe.qb.DocType("Subcontracting Inward Order Secondary Item") + for key, value in secondary_items_dict.items(): + if ( + self._action == "cancel" + and value.produced_qty - abs(secondary_items.get(key)) == 0 + ): deleted_docs.append(value.name) - frappe.delete_doc("Subcontracting Inward Order Scrap Item", value.name) + frappe.delete_doc("Subcontracting Inward Order Secondary Item", value.name) else: case_expr = case_expr.when( - table.name == value.name, value.produced_qty + scrap_items.get(key) + table.name == value.name, value.produced_qty + secondary_items.get(key) ) if final_list := list( - set([v.name for v in scrap_item_dict.values()]) - set(deleted_docs) + set([v.name for v in secondary_items_dict.values()]) - set(deleted_docs) ): frappe.qb.update(table).set(table.produced_qty, case_expr).where( (table.name.isin(final_list)) & (table.docstatus == 1) ).run() fg_item_code = next(fg for fg in self.items if fg.is_finished_item).item_code - for scrap_item in [ + for secondary_item in [ item - for item in scrap_items_list + for item in secondary_items_list if (item.item_code, item.t_warehouse) not in [(d.item_code, d.warehouse) for d in result] ]: doc = frappe.new_doc( - "Subcontracting Inward Order Scrap Item", + "Subcontracting Inward Order Secondary Item", parent=scio, parenttype="Subcontracting Inward Order", - parentfield="scrap_items", - idx=frappe.db.count("Subcontracting Inward Order Scrap Item", {"parent": scio}) + 1, - item_code=scrap_item.item_code, + parentfield="secondary_items", + idx=frappe.db.count("Subcontracting Inward Order Secondary Item", {"parent": scio}) + + 1, + item_code=secondary_item.item_code, fg_item_code=fg_item_code, - stock_uom=scrap_item.stock_uom, - warehouse=scrap_item.t_warehouse, - produced_qty=scrap_item.transfer_qty, + stock_uom=secondary_item.stock_uom, + warehouse=secondary_item.t_warehouse, + produced_qty=secondary_item.transfer_qty, + type=secondary_item.type, delivered_qty=0, reference_name=frappe.get_value( "Work Order", self.work_order, "subcontracting_inward_order_item" ), ) + doc.flags.skip_docstatus_validation = True doc.insert() doc.submit() @@ -965,7 +983,7 @@ class SubcontractingInwardController: and ( not frappe.db.exists("Subcontracting Inward Order Received Item", item.scio_detail) and not frappe.db.exists("Subcontracting Inward Order Item", item.scio_detail) - and not frappe.db.exists("Subcontracting Inward Order Scrap Item", item.scio_detail) + and not frappe.db.exists("Subcontracting Inward Order Secondary Item", item.scio_detail) ) ] for item in items: diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index b94426db475..1cd6f203ec2 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -26,11 +26,12 @@ from erpnext.utilities.regional import temporary_flag class calculate_taxes_and_totals: def __init__(self, doc: Document): self.doc = doc - frappe.flags.round_off_applicable_accounts = [] + frappe.flags.round_off_applicable_accounts = ( + get_round_off_applicable_accounts(self.doc.company, []) or [] + ) frappe.flags.round_row_wise_tax = frappe.get_single_value("Accounts Settings", "round_row_wise_tax") self._items = self.filter_rows() if self.doc.doctype == "Quotation" else self.doc.get("items") - get_round_off_applicable_accounts(self.doc.company, frappe.flags.round_off_applicable_accounts) self.calculate() def filter_rows(self): diff --git a/erpnext/controllers/tests/test_accounts_controller.py b/erpnext/controllers/tests/test_accounts_controller.py index 553a7246fea..15fb6e53ffd 100644 --- a/erpnext/controllers/tests/test_accounts_controller.py +++ b/erpnext/controllers/tests/test_accounts_controller.py @@ -5,7 +5,6 @@ import frappe from frappe import qb from frappe.query_builder.functions import Sum -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate, nowdate from frappe.utils.data import getdate as convert_to_date @@ -20,6 +19,7 @@ from erpnext.buying.doctype.purchase_order.test_purchase_order import ( ) from erpnext.projects.doctype.project.test_project import make_project from erpnext.stock.doctype.item.test_item import create_item +from erpnext.tests.utils import ERPNextTestSuite def make_customer(customer_name, currency=None): @@ -51,7 +51,7 @@ def make_supplier(supplier_name, currency=None): return supplier_name -class TestAccountsController(IntegrationTestCase): +class TestAccountsController(ERPNextTestSuite): """ Test Exchange Gain/Loss booking on various scenarios. Test Cases are numbered for better organization @@ -72,9 +72,7 @@ class TestAccountsController(IntegrationTestCase): self.create_item() self.create_parties() self.clear_old_entries() - - def tearDown(self): - frappe.db.rollback() + frappe.flags.is_reverse_depr_entry = False def create_company(self): company_name = "_Test Company" @@ -810,9 +808,7 @@ class TestAccountsController(IntegrationTestCase): self.assertEqual(exc_je_for_si, []) self.assertEqual(exc_je_for_pe, []) - @IntegrationTestCase.change_settings( - "Stock Settings", {"allow_internal_transfer_at_arms_length_price": 1} - ) + @ERPNextTestSuite.change_settings("Stock Settings", {"allow_internal_transfer_at_arms_length_price": 1}) def test_16_internal_transfer_at_arms_length_price(self): from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_purchase_invoice from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse @@ -873,7 +869,7 @@ class TestAccountsController(IntegrationTestCase): self.assertEqual(pi.items[0].rate, arms_length_price) self.assertEqual(pi.items[0].valuation_rate, 100) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"exchange_gain_loss_posting_date": "Reconciliation Date"} ) def test_17_gain_loss_posting_date_for_normal_payment(self): @@ -936,9 +932,9 @@ class TestAccountsController(IntegrationTestCase): self.assertEqual(exc_je_for_si, []) self.assertEqual(exc_je_for_pe, []) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", - {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 1}, + {"add_taxes_from_taxes_and_charges_template": 1, "add_taxes_from_item_tax_template": 0}, ) def test_18_fetch_taxes_based_on_taxes_and_charges_template(self): # Create a Sales Taxes and Charges Template @@ -968,7 +964,7 @@ class TestAccountsController(IntegrationTestCase): self.assertEqual(sinv.total_taxes_and_charges, 4.5) - @IntegrationTestCase.change_settings( + @ERPNextTestSuite.change_settings( "Accounts Settings", {"add_taxes_from_item_tax_template": 1, "add_taxes_from_taxes_and_charges_template": 0}, ) @@ -2479,11 +2475,11 @@ class TestAccountsController(IntegrationTestCase): po.items[0].delivered_by_supplier = 1 po.save() - @IntegrationTestCase.change_settings("Global Defaults", {"use_posting_datetime_for_naming_documents": 1}) + @ERPNextTestSuite.change_settings("Global Defaults", {"use_posting_datetime_for_naming_documents": 1}) def test_document_naming_rule_based_on_posting_date(self): frappe.new_doc( "Document Naming Rule", document_type="Sales Invoice", prefix="SI-.MM.-.YYYY.-" - ).submit() + ).insert() si = create_sales_invoice(do_not_save=True) si.set_posting_time = 1 diff --git a/erpnext/controllers/tests/test_distributed_discount.py b/erpnext/controllers/tests/test_distributed_discount.py index 05db1496da8..4f4911c8537 100644 --- a/erpnext/controllers/tests/test_distributed_discount.py +++ b/erpnext/controllers/tests/test_distributed_discount.py @@ -1,11 +1,11 @@ -from frappe.tests import IntegrationTestCase - from erpnext.accounts.test.accounts_mixin import AccountsTestMixin from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxesAndTotals(AccountsTestMixin, IntegrationTestCase): +class TestTaxesAndTotals(AccountsTestMixin, ERPNextTestSuite): + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_distributed_discount_amount(self): so = make_sales_order(do_not_save=1) so.apply_discount_on = "Net Total" @@ -27,6 +27,7 @@ class TestTaxesAndTotals(AccountsTestMixin, IntegrationTestCase): self.assertEqual(so.net_total, 1400) self.assertEqual(so.grand_total, 1400) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) def test_distributed_discount_amount_with_taxes(self): so = make_sales_order(do_not_save=1) so.apply_discount_on = "Grand Total" diff --git a/erpnext/controllers/tests/test_item_variant.py b/erpnext/controllers/tests/test_item_variant.py index 6bbe6cd035c..04634cf911a 100644 --- a/erpnext/controllers/tests/test_item_variant.py +++ b/erpnext/controllers/tests/test_item_variant.py @@ -1,16 +1,16 @@ import json import frappe -from frappe.tests import IntegrationTestCase from erpnext.controllers.item_variant import copy_attributes_to_variant, make_variant_item_code from erpnext.stock.doctype.item.test_item import set_item_variant_settings from erpnext.stock.doctype.quality_inspection.test_quality_inspection import ( create_quality_inspection_parameter, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestItemVariant(IntegrationTestCase): +class TestItemVariant(ERPNextTestSuite): def test_tables_in_template_copied_to_variant(self): fields = [{"field_name": "quality_inspection_template"}] set_item_variant_settings(fields) diff --git a/erpnext/controllers/tests/test_item_wise_inventory_account.py b/erpnext/controllers/tests/test_item_wise_inventory_account.py index a783193d60e..2f45ea31466 100644 --- a/erpnext/controllers/tests/test_item_wise_inventory_account.py +++ b/erpnext/controllers/tests/test_item_wise_inventory_account.py @@ -3,7 +3,6 @@ import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom @@ -12,9 +11,10 @@ from erpnext.manufacturing.doctype.work_order.work_order import make_stock_entry from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.tests.utils import ERPNextTestSuite -class TestItemWiseInventoryAccount(IntegrationTestCase): +class TestItemWiseInventoryAccount(ERPNextTestSuite): def setUp(self): self.company = make_company() self.company_abbr = frappe.db.get_value("Company", self.company, "abbr") @@ -273,7 +273,7 @@ class TestItemWiseInventoryAccount(IntegrationTestCase): } for row in items: - self.make_item_group(items[row]["item_group"]) + self._make_item_group(items[row]["item_group"]) inventory_account_dict = frappe._dict() for item_name, item_data in items.items(): @@ -357,7 +357,7 @@ class TestItemWiseInventoryAccount(IntegrationTestCase): } for row in items: - self.make_item_group(items[row]["item_group"]) + self._make_item_group(items[row]["item_group"]) inventory_account_dict = frappe._dict() for item_name, item_data in items.items(): @@ -451,7 +451,7 @@ class TestItemWiseInventoryAccount(IntegrationTestCase): self.assertEqual(sle_value[0].value, gl_value, f"GL Entry not created for {item_code} correctly") - def make_item_group(self, item_name): + def _make_item_group(self, item_name): if not frappe.db.exists("Item Group", item_name): item_group = frappe.get_doc( { diff --git a/erpnext/controllers/tests/test_item_wise_tax_details.py b/erpnext/controllers/tests/test_item_wise_tax_details.py index 138429dcee9..93de1d8890d 100644 --- a/erpnext/controllers/tests/test_item_wise_tax_details.py +++ b/erpnext/controllers/tests/test_item_wise_tax_details.py @@ -1,8 +1,9 @@ import frappe -from frappe.tests.utils import FrappeTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestTaxesAndTotals(FrappeTestCase): +class TestTaxesAndTotals(ERPNextTestSuite): def setUp(self): self.doc = frappe.get_doc( { diff --git a/erpnext/controllers/tests/test_mapper.py b/erpnext/controllers/tests/test_mapper.py index 5d20684ff03..3a804d78b8f 100644 --- a/erpnext/controllers/tests/test_mapper.py +++ b/erpnext/controllers/tests/test_mapper.py @@ -3,13 +3,15 @@ import json import frappe import frappe.utils from frappe.model import mapper -from frappe.tests import IntegrationTestCase from frappe.utils import add_months, nowdate -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"] +from erpnext.tests.utils import ERPNextTestSuite -class TestMapper(IntegrationTestCase): +class TestMapper(ERPNextTestSuite): + def setUp(self): + self.load_test_records("Sales Order") + def test_map_docs(self): """Test mapping of multiple source docs on a single target doc""" @@ -37,6 +39,7 @@ class TestMapper(IntegrationTestCase): "order_type": "Sales", "transaction_date": nowdate(), "valid_till": add_months(nowdate(), 1), + "company": "_Test Company", } ) for item in item_list: @@ -63,6 +66,6 @@ class TestMapper(IntegrationTestCase): "uom": "_Test UOM", } ) - so = frappe.get_doc(frappe.get_test_records("Sales Order")[0]) + so = frappe.get_doc(self.globalTestRecords["Sales Order"][0]) so.insert(ignore_permissions=True) return so, [item.item_code] diff --git a/erpnext/controllers/tests/test_qty_based_taxes.py b/erpnext/controllers/tests/test_qty_based_taxes.py index 27b4d57aa3c..a22a029436b 100644 --- a/erpnext/controllers/tests/test_qty_based_taxes.py +++ b/erpnext/controllers/tests/test_qty_based_taxes.py @@ -1,14 +1,15 @@ from uuid import uuid4 as _uuid4 import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite def uuid4(): return str(_uuid4()) -class TestTaxes(IntegrationTestCase): +class TestTaxes(ERPNextTestSuite): def setUp(self): self.company = frappe.get_doc( { @@ -124,12 +125,3 @@ class TestTaxes(IntegrationTestCase): doc.insert() self.assertEqual(doc.taxes[0].tax_amount, 600) self.created_docs.append(doc) - - def tearDown(self): - for doc in self.created_docs: - doc.delete() - self.item.delete() - self.item_group.delete() - self.item_tax_template.delete() - self.account.delete() - self.company.delete() diff --git a/erpnext/controllers/tests/test_queries.py b/erpnext/controllers/tests/test_queries.py index 1f17e91231e..755961331db 100644 --- a/erpnext/controllers/tests/test_queries.py +++ b/erpnext/controllers/tests/test_queries.py @@ -13,19 +13,7 @@ def add_default_params(func, doctype): return partial(func, doctype=doctype, txt="", searchfield="name", start=0, page_len=20, filters=None) -EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "BOM", "Account"] - - class TestQueries(ERPNextTestSuite): - # All tests are based on self.globalTestRecords[doctype] - - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.make_employees() - cls.make_leads() - cls.make_projects() - def assert_nested_in(self, item, container): self.assertIn(item, [vals for tuples in container for vals in tuples]) @@ -96,6 +84,8 @@ class TestQueries(ERPNextTestSuite): self.assertGreaterEqual(frappe.db.count("UOM", {"enabled": 1}), 10) def test_employee_query_with_user_permissions(self): + employee = frappe.db.get_all("Employee", {"first_name": "_Test Employee"})[0].name + # party field is a dynamic link field in Payment Entry doctype with ignore_user_permissions=0 ps = make_property_setter( doctype="Payment Entry", @@ -110,7 +100,7 @@ class TestQueries(ERPNextTestSuite): { "user": user.name, "doctype": "Employee", - "docname": self.employees[0].name, + "docname": employee, "is_default": 1, "apply_to_all_doctypes": 1, "applicable_doctypes": [], @@ -118,7 +108,7 @@ class TestQueries(ERPNextTestSuite): } ) - with self.set_user(user.name): + with ERPNextTestSuite.set_user(self, user.name): params = { "doctype": "Employee", "txt": "", diff --git a/erpnext/controllers/tests/test_reactivity.py b/erpnext/controllers/tests/test_reactivity.py index 8ba58419581..2f8b3a06784 100644 --- a/erpnext/controllers/tests/test_reactivity.py +++ b/erpnext/controllers/tests/test_reactivity.py @@ -1,12 +1,12 @@ import frappe from frappe import qb -from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.accounts.test.accounts_mixin import AccountsTestMixin +from erpnext.tests.utils import ERPNextTestSuite -class TestReactivity(AccountsTestMixin, IntegrationTestCase): +class TestReactivity(AccountsTestMixin, ERPNextTestSuite): def setUp(self): self.create_company() self.create_customer() @@ -15,9 +15,6 @@ class TestReactivity(AccountsTestMixin, IntegrationTestCase): self.create_price_list() self.clear_old_entries() - def tearDown(self): - frappe.db.rollback() - def disable_dimensions(self): res = frappe.db.get_all("Accounting Dimension", filters={"disabled": False}) for x in res: diff --git a/erpnext/controllers/tests/test_subcontracting_controller.py b/erpnext/controllers/tests/test_subcontracting_controller.py index b6c21fa0b45..0dbacb3c22d 100644 --- a/erpnext/controllers/tests/test_subcontracting_controller.py +++ b/erpnext/controllers/tests/test_subcontracting_controller.py @@ -5,8 +5,7 @@ import copy from collections import defaultdict import frappe -from frappe.tests import IntegrationTestCase -from frappe.utils import cint +from frappe.utils import cint, flt from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order from erpnext.controllers.subcontracting_controller import ( @@ -23,9 +22,10 @@ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import ( make_subcontracting_receipt, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestSubcontractingController(IntegrationTestCase): +class TestSubcontractingController(ERPNextTestSuite): def setUp(self): make_subcontracted_items() make_raw_materials() @@ -75,6 +75,7 @@ class TestSubcontractingController(IntegrationTestCase): sco.create_raw_materials_supplied_or_received() self.assertIsNotNone(sco.supplied_items) + @ERPNextTestSuite.change_settings("Buying Settings", {"allow_multiple_items": 1}) def test_sco_with_bom(self): """ - Set backflush based on BOM. @@ -500,8 +501,8 @@ class TestSubcontractingController(IntegrationTestCase): scr1.items[0].qty = 2 add_second_row_in_scr(scr1) scr1.flags.ignore_mandatory = True - scr1.save() scr1.set_missing_values() + scr1.save() scr1.submit() for _key, value in get_supplied_items(scr1).items(): @@ -512,8 +513,8 @@ class TestSubcontractingController(IntegrationTestCase): scr2.items[0].qty = 2 add_second_row_in_scr(scr2) scr2.flags.ignore_mandatory = True - scr2.save() scr2.set_missing_values() + scr2.save() scr2.submit() for _key, value in get_supplied_items(scr2).items(): @@ -522,8 +523,8 @@ class TestSubcontractingController(IntegrationTestCase): scr3 = make_subcontracting_receipt(sco.name) scr3.items[0].qty = 2 scr3.flags.ignore_mandatory = True - scr3.save() scr3.set_missing_values() + scr3.save() scr3.submit() for _key, value in get_supplied_items(scr3).items(): @@ -741,6 +742,7 @@ class TestSubcontractingController(IntegrationTestCase): "doctype": "Serial No", "item_code": "Subcontracted SRM Item 2", "serial_no": serial_no, + "company": "_Test Company", } ).insert() @@ -1162,6 +1164,54 @@ class TestSubcontractingController(IntegrationTestCase): self.assertEqual([item.rm_item_code for item in sco.supplied_items], expected) + def test_co_by_product(self): + frappe.set_value("UOM", "Nos", "must_be_whole_number", 0) + + fg_item = make_item("FG Item", properties={"is_stock_item": 1, "is_sub_contracted_item": 1}).name + rm_item = make_item("RM Item", properties={"is_stock_item": 1}).name + scrap_item = make_item("Scrap Item", properties={"is_stock_item": 1}).name + make_bom( + item=fg_item, raw_materials=[rm_item], scrap_items=[scrap_item], process_loss_percentage=10 + ).name + + service_items = [ + { + "warehouse": "_Test Warehouse - _TC", + "item_code": "Subcontracted Service Item 11", + "qty": 5, + "rate": 100, + "fg_item": fg_item, + "fg_item_qty": 5, + }, + ] + sco = get_subcontracting_order(service_items=service_items) + rm_items = get_rm_items(sco.supplied_items) + itemwise_details = make_stock_in_entry(rm_items=rm_items) + make_stock_transfer_entry( + sco_no=sco.name, + rm_items=rm_items, + itemwise_details=copy.deepcopy(itemwise_details), + ) + + scr1 = make_subcontracting_receipt(sco.name) + scr1.get_secondary_items() + scr1.save() + + self.assertEqual(scr1.items[0].received_qty, 5) + self.assertEqual(scr1.items[0].process_loss_qty, 0.5) + self.assertEqual(scr1.items[0].qty, 4.5) + self.assertEqual(scr1.items[0].rate, 200) + self.assertEqual(scr1.items[0].amount, 900) + + self.assertEqual(scr1.items[1].item_code, scrap_item) + self.assertEqual(scr1.items[1].received_qty, 5) + self.assertEqual(scr1.items[1].process_loss_qty, 0.5) + self.assertEqual(scr1.items[1].qty, 4.5) + self.assertEqual(flt(scr1.items[1].rate, 3), 11.111) + self.assertEqual(scr1.items[1].amount, 50) + + frappe.set_value("UOM", "Nos", "must_be_whole_number", 1) + def add_second_row_in_scr(scr): item_dict = {} @@ -1512,7 +1562,7 @@ def make_subcontracted_item(**args): }, ) - args.raw_materials = ["_Test FG Item", "Test Extra Item 1"] + args.raw_materials = ["_Test Extra Item 1", "Test Extra Item 2"] if not frappe.db.get_value("BOM", {"item": args.item_code}, "name"): make_bom(item=args.item_code, raw_materials=args.get("raw_materials")) diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py new file mode 100644 index 00000000000..ac713415970 --- /dev/null +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -0,0 +1,31 @@ +from unittest.mock import patch + +import frappe + +from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.tests.utils import ERPNextTestSuite + + +class TestTaxesAndTotals(ERPNextTestSuite): + def test_regional_round_off_accounts(self): + """ + Regional overrides cannot extend the list in-place — the return + value must be assigned back to frappe.flags.round_off_applicable_accounts. + """ + test_account = "_Test Round Off Account" + + def mock_regional(company, account_list: list) -> list: + # Simulates a regional override + account_list.extend([test_account]) + return account_list + + so = make_sales_order(do_not_save=True) + + with patch( + "erpnext.controllers.taxes_and_totals.get_regional_round_off_accounts", + mock_regional, + ): + calculate_taxes_and_totals(so) + + self.assertIn(test_account, frappe.flags.round_off_applicable_accounts) diff --git a/erpnext/controllers/tests/test_transaction_base.py b/erpnext/controllers/tests/test_transaction_base.py index fca8c03c5fb..3348892ae21 100644 --- a/erpnext/controllers/tests/test_transaction_base.py +++ b/erpnext/controllers/tests/test_transaction_base.py @@ -1,8 +1,9 @@ import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite -class TestUtils(IntegrationTestCase): +class TestUtils(ERPNextTestSuite): def test_reset_default_field_value(self): doc = frappe.get_doc( { diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py index 752ec87d501..bde00074ecb 100644 --- a/erpnext/controllers/trends.py +++ b/erpnext/controllers/trends.py @@ -55,6 +55,14 @@ def validate_filters(filters): if filters.get("based_on") == filters.get("group_by"): frappe.throw(_("'Based On' and 'Group By' can not be same")) + if filters.get("period_based_on") and filters.period_based_on not in ["bill_date", "posting_date"]: + frappe.throw( + msg=_("{0} can be either {1} or {2}.").format( + frappe.bold("Period based On"), frappe.bold("Posting Date"), frappe.bold("Billing Date") + ), + title=_("Invalid Filter"), + ) + def get_data(filters, conditions): data = [] diff --git a/erpnext/crm/doctype/appointment/test_appointment.py b/erpnext/crm/doctype/appointment/test_appointment.py index ed8ca5c1bff..83eacca83b6 100644 --- a/erpnext/crm/doctype/appointment/test_appointment.py +++ b/erpnext/crm/doctype/appointment/test_appointment.py @@ -3,7 +3,8 @@ import datetime import frappe -from frappe.tests import IntegrationTestCase + +from erpnext.tests.utils import ERPNextTestSuite LEAD_EMAIL = "test_appointment_lead@example.com" @@ -25,13 +26,9 @@ def create_test_appointment(): return test_appointment -class TestAppointment(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - frappe.db.delete("Lead", {"email_id": LEAD_EMAIL}) - +class TestAppointment(ERPNextTestSuite): def setUp(self): + frappe.db.delete("Lead", {"email_id": LEAD_EMAIL}) self.test_appointment = create_test_appointment() self.test_appointment.set_verified(self.test_appointment.customer_email) diff --git a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json index d1f70af86f1..b79e974e301 100644 --- a/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json +++ b/erpnext/crm/doctype/appointment_booking_settings/appointment_booking_settings.json @@ -102,10 +102,10 @@ } ], "grid_page_length": 50, - "hide_toolbar": 1, + "hide_toolbar": 0, "issingle": 1, "links": [], - "modified": "2026-01-02 18:18:46.617101", + "modified": "2026-03-16 13:28:21.198138", "modified_by": "Administrator", "module": "CRM", "name": "Appointment Booking Settings", diff --git a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py index f06d6f807f3..6a78d53ba49 100644 --- a/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py +++ b/erpnext/crm/doctype/appointment_booking_settings/test_appointment_booking_settings.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestAppointmentBookingSettings(IntegrationTestCase): +class TestAppointmentBookingSettings(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/campaign/test_campaign.py b/erpnext/crm/doctype/campaign/test_campaign.py index 7442fb7c731..8876e640475 100644 --- a/erpnext/crm/doctype/campaign/test_campaign.py +++ b/erpnext/crm/doctype/campaign/test_campaign.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestCampaign(IntegrationTestCase): +class TestCampaign(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/competitor/test_competitor.py b/erpnext/crm/doctype/competitor/test_competitor.py index 4b24378337e..f348014224b 100644 --- a/erpnext/crm/doctype/competitor/test_competitor.py +++ b/erpnext/crm/doctype/competitor/test_competitor.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestCompetitor(IntegrationTestCase): +class TestCompetitor(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/contract/test_contract.py b/erpnext/crm/doctype/contract/test_contract.py index de7aba10e1a..03c3864c700 100644 --- a/erpnext/crm/doctype/contract/test_contract.py +++ b/erpnext/crm/doctype/contract/test_contract.py @@ -2,11 +2,12 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate +from erpnext.tests.utils import ERPNextTestSuite -class TestContract(IntegrationTestCase): + +class TestContract(ERPNextTestSuite): def setUp(self): frappe.db.sql("delete from `tabContract`") self.contract_doc = get_contract() diff --git a/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py index f3cfec6ba0e..d19492ec399 100644 --- a/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py +++ b/erpnext/crm/doctype/contract_fulfilment_checklist/test_contract_fulfilment_checklist.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestContractFulfilmentChecklist(IntegrationTestCase): +class TestContractFulfilmentChecklist(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/contract_template/test_contract_template.py b/erpnext/crm/doctype/contract_template/test_contract_template.py index b4271fad8a1..6362da2afb7 100644 --- a/erpnext/crm/doctype/contract_template/test_contract_template.py +++ b/erpnext/crm/doctype/contract_template/test_contract_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestContractTemplate(IntegrationTestCase): +class TestContractTemplate(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/crm_settings/crm_settings.json b/erpnext/crm/doctype/crm_settings/crm_settings.json index 3f231d460ab..4760d504a57 100644 --- a/erpnext/crm/doctype/crm_settings/crm_settings.json +++ b/erpnext/crm/doctype/crm_settings/crm_settings.json @@ -101,12 +101,12 @@ } ], "grid_page_length": 50, - "hide_toolbar": 1, + "hide_toolbar": 0, "icon": "fa fa-cog", "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-01-02 18:18:52.204988", + "modified": "2026-03-16 13:28:19.573964", "modified_by": "Administrator", "module": "CRM", "name": "CRM Settings", diff --git a/erpnext/crm/doctype/crm_settings/test_crm_settings.py b/erpnext/crm/doctype/crm_settings/test_crm_settings.py index 722810264f6..64a5addefcb 100644 --- a/erpnext/crm/doctype/crm_settings/test_crm_settings.py +++ b/erpnext/crm/doctype/crm_settings/test_crm_settings.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestCRMSettings(IntegrationTestCase): +class TestCRMSettings(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/email_campaign/test_email_campaign.py b/erpnext/crm/doctype/email_campaign/test_email_campaign.py index f865ab05273..02524421327 100644 --- a/erpnext/crm/doctype/email_campaign/test_email_campaign.py +++ b/erpnext/crm/doctype/email_campaign/test_email_campaign.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestEmailCampaign(IntegrationTestCase): +class TestEmailCampaign(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/lead/test_lead.py b/erpnext/crm/doctype/lead/test_lead.py index 1ccaa5f8050..6f9692e10f2 100644 --- a/erpnext/crm/doctype/lead/test_lead.py +++ b/erpnext/crm/doctype/lead/test_lead.py @@ -10,19 +10,16 @@ from erpnext.tests.utils import ERPNextTestSuite class TestLead(ERPNextTestSuite): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.make_leads() - def test_make_customer(self): from erpnext.crm.doctype.lead.lead import make_customer + lead = frappe.db.get_all("Lead", {"lead_name": "_Test Lead"})[0].name + frappe.delete_doc_if_exists("Customer", "_Test Lead") - customer = make_customer(self.leads[0].name) + customer = make_customer(lead) self.assertEqual(customer.doctype, "Customer") - self.assertEqual(customer.lead_name, self.leads[0].name) + self.assertEqual(customer.lead_name, lead) customer.company = "_Test Company" customer.customer_group = "_Test Customer Group" @@ -46,9 +43,10 @@ class TestLead(ERPNextTestSuite): def test_make_customer_from_organization(self): from erpnext.crm.doctype.lead.lead import make_customer - customer = make_customer(self.leads[1].name) + lead = frappe.db.get_all("Lead", {"lead_name": "_Test Lead 1"})[0].name + customer = make_customer(lead) self.assertEqual(customer.doctype, "Customer") - self.assertEqual(customer.lead_name, self.leads[1].name) + self.assertEqual(customer.lead_name, lead) customer.company = "_Test Company" customer.customer_group = "_Test Customer Group" @@ -125,6 +123,7 @@ class TestLead(ERPNextTestSuite): create_todo("followup", "Lead", lead.name) opportunity = make_opportunity(lead.name) + opportunity.company = "_Test Company" opportunity.save() self.assertEqual(opportunity.get("party_name"), lead.name) diff --git a/erpnext/crm/doctype/market_segment/test_market_segment.py b/erpnext/crm/doctype/market_segment/test_market_segment.py index 02aa6a2e7c9..f194660eb77 100644 --- a/erpnext/crm/doctype/market_segment/test_market_segment.py +++ b/erpnext/crm/doctype/market_segment/test_market_segment.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestMarketSegment(IntegrationTestCase): +class TestMarketSegment(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py index 4add7c4074a..a1b2787b5ed 100644 --- a/erpnext/crm/doctype/opportunity/test_opportunity.py +++ b/erpnext/crm/doctype/opportunity/test_opportunity.py @@ -12,14 +12,6 @@ from erpnext.tests.utils import ERPNextTestSuite class TestOpportunity(ERPNextTestSuite): - @classmethod - def setUpClass(cls): - super().setUpClass() - # Only first lead is required - # TODO: dynamically generate limited test records - cls.make_leads() - cls.make_opportunities() - @classmethod def make_opportunities(cls): records = [ @@ -29,6 +21,7 @@ class TestOpportunity(ERPNextTestSuite): "opportunity_from": "Lead", "enquiry_type": "Sales", "party_name": cls.leads[0].name, + "company": cls.companies[0].name, "transaction_date": "2013-12-12", "items": [ {"item_name": "Test Item", "description": "Some description", "qty": 5, "rate": 100} @@ -55,7 +48,7 @@ class TestOpportunity(ERPNextTestSuite): self.assertEqual(doc.status, "Quotation") def test_make_new_lead_if_required(self): - opp_doc = make_opportunity_from_lead() + opp_doc = make_opportunity_from_lead("_Test Company") self.assertTrue(opp_doc.party_name) self.assertEqual(opp_doc.opportunity_from, "Lead") @@ -99,7 +92,7 @@ class TestOpportunity(ERPNextTestSuite): create_communication(opp_doc.doctype, opp_doc.name, opp_doc.contact_email) -def make_opportunity_from_lead(): +def make_opportunity_from_lead(company): new_lead_email_id = f"new{random_string(5)}@example.com" args = { "doctype": "Opportunity", @@ -107,6 +100,7 @@ def make_opportunity_from_lead(): "opportunity_type": "Sales", "with_items": 0, "transaction_date": today(), + "company": company, } # new lead should be created against the new.opportunity@example.com opp_doc = frappe.get_doc(args).insert(ignore_permissions=True) diff --git a/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py index 1e35529e69f..f04d536a406 100644 --- a/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py +++ b/erpnext/crm/doctype/opportunity_type/test_opportunity_type.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestOpportunityType(IntegrationTestCase): +class TestOpportunityType(ERPNextTestSuite): pass diff --git a/erpnext/crm/doctype/prospect/test_prospect.py b/erpnext/crm/doctype/prospect/test_prospect.py index a349e2d978f..92158a30dbb 100644 --- a/erpnext/crm/doctype/prospect/test_prospect.py +++ b/erpnext/crm/doctype/prospect/test_prospect.py @@ -2,20 +2,21 @@ # See license.txt import frappe -from frappe.tests import IntegrationTestCase from frappe.utils import random_string from erpnext.crm.doctype.lead.lead import add_lead_to_prospect from erpnext.crm.doctype.lead.test_lead import make_lead +from erpnext.tests.utils import ERPNextTestSuite -class TestProspect(IntegrationTestCase): +class TestProspect(ERPNextTestSuite): def test_add_lead_to_prospect_and_address_linking(self): + company = "_Test Company" lead_doc = make_lead() address_doc = make_address(address_title=lead_doc.name) address_doc.append("links", {"link_doctype": lead_doc.doctype, "link_name": lead_doc.name}) address_doc.save() - prospect_doc = make_prospect() + prospect_doc = make_prospect(company=company, company_name=company) add_lead_to_prospect(lead_doc.name, prospect_doc.name) prospect_doc.reload() lead_exists_in_prosoect = False @@ -36,6 +37,7 @@ class TestProspect(IntegrationTestCase): "doctype": "Prospect", "company_name": "_Test Prospect", "customer_group": "_Test Customer Group", + "company": "_Test Company", } ) prospect.insert() @@ -57,6 +59,7 @@ def make_prospect(**args): { "doctype": "Prospect", "company_name": args.company_name or f"_Test Company {random_string(3)}", + "company": args.company, } ).insert() diff --git a/erpnext/crm/doctype/sales_stage/test_sales_stage.py b/erpnext/crm/doctype/sales_stage/test_sales_stage.py index 839e18c23e1..1703382bcb4 100644 --- a/erpnext/crm/doctype/sales_stage/test_sales_stage.py +++ b/erpnext/crm/doctype/sales_stage/test_sales_stage.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests import IntegrationTestCase +from erpnext.tests.utils import ERPNextTestSuite -class TestSalesStage(IntegrationTestCase): +class TestSalesStage(ERPNextTestSuite): pass diff --git a/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py b/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py index 10447f39c92..4d5ba1dc9a2 100644 --- a/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py +++ b/erpnext/crm/report/opportunity_summary_by_sales_stage/test_opportunity_summary_by_sales_stage.py @@ -1,21 +1,14 @@ -from frappe.tests import IntegrationTestCase - from erpnext.crm.report.opportunity_summary_by_sales_stage.opportunity_summary_by_sales_stage import ( execute, ) from erpnext.crm.report.sales_pipeline_analytics.test_sales_pipeline_analytics import ( - create_company, - create_customer, create_opportunity, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestOpportunitySummaryBySalesStage(IntegrationTestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - create_company() - create_customer() +class TestOpportunitySummaryBySalesStage(ERPNextTestSuite): + def setUp(self): create_opportunity() def test_opportunity_summary_by_sales_stage(self): diff --git a/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py b/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py index 0bb90923e57..49247b524f5 100644 --- a/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py +++ b/erpnext/crm/report/sales_pipeline_analytics/test_sales_pipeline_analytics.py @@ -1,13 +1,11 @@ import frappe -from frappe.tests import IntegrationTestCase from erpnext.crm.report.sales_pipeline_analytics.sales_pipeline_analytics import execute +from erpnext.tests.utils import ERPNextTestSuite -class TestSalesPipelineAnalytics(IntegrationTestCase): +class TestSalesPipelineAnalytics(ERPNextTestSuite): def setUp(self): - create_company() - create_customer() create_opportunity() def test_sales_pipeline_analytics(self): @@ -179,23 +177,6 @@ class TestSalesPipelineAnalytics(IntegrationTestCase): self.assertEqual(expected_data, report[1]) -def create_company(): - doc = frappe.db.exists("Company", "Best Test") - if not doc: - doc = frappe.new_doc("Company") - doc.company_name = "Best Test" - doc.default_currency = "INR" - doc.insert() - - -def create_customer(): - doc = frappe.db.exists("Customer", "_Test NC") - if not doc: - doc = frappe.new_doc("Customer") - doc.customer_name = "_Test NC" - doc.insert() - - def create_opportunity(): doc = frappe.db.exists({"doctype": "Opportunity", "party_name": "_Test NC"}) if not doc: diff --git a/erpnext/desktop_icon/banking.json b/erpnext/desktop_icon/banking.json index 66ee8c7b318..6e55cfa0d02 100644 --- a/erpnext/desktop_icon/banking.json +++ b/erpnext/desktop_icon/banking.json @@ -10,7 +10,7 @@ "label": "Banking", "link_to": "Banking", "link_type": "Workspace Sidebar", - "modified": "2026-01-12 12:29:48.687545", + "modified": "2026-02-12 12:29:48.687545", "modified_by": "Administrator", "name": "Banking", "owner": "Administrator", diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py index 51b2519c659..12105703772 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/test_plaid_settings.py @@ -3,7 +3,6 @@ import json import frappe -from frappe.tests import IntegrationTestCase from frappe.utils.response import json_handler from erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings import ( @@ -13,22 +12,10 @@ from erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings import ( get_plaid_configuration, new_bank_transaction, ) +from erpnext.tests.utils import ERPNextTestSuite -class TestPlaidSettings(IntegrationTestCase): - def setUp(self): - pass - - def tearDown(self): - for bt in frappe.get_all("Bank Transaction"): - doc = frappe.get_doc("Bank Transaction", bt.name) - doc.cancel() - doc.delete() - - for doctype in ("Bank Account", "Bank Account Type", "Bank Account Subtype"): - for d in frappe.get_all(doctype): - frappe.delete_doc(doctype, d.name, force=True) - +class TestPlaidSettings(ERPNextTestSuite): def test_plaid_disabled(self): frappe.db.set_single_value("Plaid Settings", "enabled", 0) self.assertTrue(get_plaid_configuration() == "disabled") @@ -68,7 +55,7 @@ class TestPlaidSettings(IntegrationTestCase): } bank = json.dumps(frappe.get_doc("Bank", "Citi").as_dict(), default=json_handler) - company = frappe.db.get_single_value("Global Defaults", "default_company") + company = "_Test Company" add_bank_accounts(bank_accounts, bank, company) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 03391161ed2..12bbf689b37 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -63,7 +63,6 @@ welcome_email = "erpnext.setup.utils.welcome_email" setup_wizard_requires = "assets/erpnext/js/setup_wizard.js" setup_wizard_stages = "erpnext.setup.setup_wizard.setup_wizard.get_setup_stages" setup_wizard_complete = "erpnext.setup.setup_wizard.setup_wizard.setup_demo" -setup_wizard_test = "erpnext.setup.setup_wizard.test_setup_wizard.run_setup_wizard_test" after_install = "erpnext.setup.install.after_install" @@ -221,11 +220,12 @@ website_route_rules = [ standard_navbar_items = [ { - "item_label": "Clear Demo Data", + "item_label": "Delete Demo Data", "item_type": "Action", "action": "erpnext.demo.clear_demo();", "is_standard": 1, - "condition": "eval: frappe.boot.sysdefaults.demo_company", + "condition": "eval: frappe.boot.sysdefaults.demo_company && frappe.boot.sysdefaults.demo_company.length > 0", + "icon": "trash", }, ] @@ -319,8 +319,6 @@ has_website_permission = { "Project": "erpnext.controllers.website_list_for_contact.has_website_permission", } -before_tests = "erpnext.setup.utils.before_tests" - period_closing_doctypes = [ "Sales Invoice", @@ -418,11 +416,19 @@ naming_series_variables = { for variable in naming_series_variables_list } -# On cancel event Payment Entry will be exempted and all linked submittable doctype will get cancelled. -# to maintain data integrity we exempted payment entry. it will un-link when sales invoice get cancelled. -# if payment entry not in auto cancel exempted doctypes it will cancel payment entry. auto_cancel_exempted_doctypes = [ + # On cancel event Payment Entry will be exempted and all linked submittable doctype will get cancelled. + # to maintain data integrity we exempted payment entry. it will un-link when sales invoice get cancelled. + # if payment entry not in auto cancel exempted doctypes it will cancel payment entry. "Payment Entry", + # Reverse ledger entries are created instead to ensure ledger immutability. + "GL Entry", + "Stock Ledger Entry", + "Payment Ledger Entry", + "Advance Payment Ledger Entry", + # May be linked to Period Closing Voucher, but cancelled with custom logic in PCV. + # This is better to avoid stale docs when cancelling PCV from backend. + "Account Closing Balance", ] scheduler_events = { @@ -695,3 +701,4 @@ fields_for_group_similar_items = ["qty", "amount"] # ------------ # List of apps whose translatable strings should be excluded from this app's translations. ignore_translatable_strings_from = ["frappe"] +require_type_annotated_api_methods = True diff --git a/erpnext/locale/ar.po b/erpnext/locale/ar.po index 6b262043d1f..4cd433e9743 100644 --- a/erpnext/locale/ar.po +++ b/erpnext/locale/ar.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-02-22 09:43+0000\n" -"PO-Revision-Date: 2026-02-22 16:37\n" +"POT-Creation-Date: 2026-03-08 09:42+0000\n" +"PO-Revision-Date: 2026-03-09 16:57\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Arabic\n" "MIME-Version: 1.0\n" @@ -18,7 +18,7 @@ msgstr "" "X-Crowdin-File-ID: 46\n" "Language: ar_SA\n" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1474 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1516 msgid "\n" "\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}{3}.\n" "\t\t\tPlease add a stock quantity of {4} to proceed with this entry.\n" @@ -263,11 +263,11 @@ msgstr "" msgid "% of materials delivered against this Sales Order" msgstr "" -#: erpnext/controllers/accounts_controller.py:2371 +#: erpnext/controllers/accounts_controller.py:2372 msgid "'Account' in the Accounting section of Customer {0}" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:359 +#: erpnext/selling/doctype/sales_order/sales_order.py:361 msgid "'Allow Multiple Sales Orders Against a Customer's Purchase Order'" msgstr "" @@ -279,17 +279,17 @@ msgstr "'على أساس' و 'المجموعة حسب' لا يمكن أن يكو msgid "'Days Since Last Order' must be greater than or equal to zero" msgstr "يجب أن تكون \"الأيام منذ آخر طلب\" أكبر من أو تساوي الصفر" -#: erpnext/controllers/accounts_controller.py:2376 +#: erpnext/controllers/accounts_controller.py:2377 msgid "'Default {0} Account' in Company {1}" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1220 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1221 msgid "'Entries' cannot be empty" msgstr "المدخلات لا يمكن أن تكون فارغة" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:312 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "من تاريخ (مطلوب)" @@ -301,22 +301,23 @@ msgstr "\"من تاريخ \" يجب أن يكون بعد \" إلى تاريخ \" msgid "'Has Serial No' can not be 'Yes' for non-stock item" msgstr "\"لهُ رقم تسلسل\" لا يمكن ان يكون \"نعم\" لبند غير قابل للتخزين" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:143 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:145 msgid "'Inspection Required before Delivery' has disabled for the item {0}, no need to create the QI" msgstr "" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:134 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:136 msgid "'Inspection Required before Purchase' has disabled for the item {0}, no need to create the QI" msgstr "" -#: erpnext/stock/report/stock_ledger/stock_ledger.py:600 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:633 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:664 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:704 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:809 msgid "'Opening'" msgstr "'افتتاحي'" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:318 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "' إلى تاريخ ' مطلوب" @@ -328,7 +329,7 @@ msgstr "" msgid "'Update Stock' can not be checked because items are not delivered via {0}" msgstr ""الأوراق المالية التحديث" لا يمكن التحقق من أنه لم يتم تسليم المواد عن طريق {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:413 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:414 msgid "'Update Stock' cannot be checked for fixed asset sale" msgstr "لا يمكن التحقق من ' تحديث المخزون ' لبيع الأصول الثابتة\\n
\\n'Update Stock' cannot be checked for fixed asset sale" @@ -340,8 +341,8 @@ msgstr "" msgid "'{0}' has been already added." msgstr "لقد تمت إضافة '{0}' بالفعل." -#: erpnext/setup/doctype/company/company.py:302 -#: erpnext/setup/doctype/company/company.py:313 +#: erpnext/setup/doctype/company/company.py:303 +#: erpnext/setup/doctype/company/company.py:314 msgid "'{0}' should be in company currency {1}." msgstr "" @@ -597,12 +598,12 @@ msgstr "" msgid "90 Above" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1288 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1289 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1330 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1331 msgid "<0" msgstr "<0" -#: erpnext/assets/doctype/asset/asset.py:544 +#: erpnext/assets/doctype/asset/asset.py:545 msgid "Cannot create asset.

You're trying to create {0} asset(s) from {2} {3}.
However, only {1} item(s) were purchased and {4} asset(s) already exist against {5}." msgstr "" @@ -610,7 +611,7 @@ msgstr "" msgid "From Time cannot be later than To Time for {0}" msgstr "من الوقت لا يمكن أن يكون بعد من إلى الوقت لـ {0}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:432 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:433 msgid "Row #{0}: Bundle {1} in warehouse {2} has insufficient packed items:
" msgstr "" @@ -738,11 +739,11 @@ msgstr "" msgid "
  • Clearance date must be after cheque date for row(s): {0}
  • " msgstr "" -#: erpnext/controllers/accounts_controller.py:2264 +#: erpnext/controllers/accounts_controller.py:2265 msgid "
  • Item {0} in row(s) {1} billed more than {2}
  • " msgstr "" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:423 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:424 msgid "
  • Packed Item {0}: Required {1}, Available {2}
  • " msgstr "" @@ -755,7 +756,7 @@ msgstr "" msgid "
  • {}
  • " msgstr "" -#: erpnext/controllers/accounts_controller.py:2261 +#: erpnext/controllers/accounts_controller.py:2262 msgid "

    Cannot overbill for the following Items:

    " msgstr "" @@ -799,7 +800,7 @@ msgstr "" msgid "

    Price List Rate has not been set as editable in Selling Settings. In this scenario, setting Update Price List Based On to Price List Rate will prevent auto-updation of Item Price.

    Are you sure you want to continue?" msgstr "" -#: erpnext/controllers/accounts_controller.py:2273 +#: erpnext/controllers/accounts_controller.py:2274 msgid "

    To allow over-billing, please set allowance in Accounts Settings.

    " msgstr "" @@ -877,11 +878,11 @@ msgstr "" msgid "Your Shortcuts" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1008 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1135 msgid "Grand Total: {0}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1009 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1136 msgid "Outstanding Amount: {0}" msgstr "" @@ -934,7 +935,7 @@ msgstr "مجموعة الزبائن موجودة بنفس الاسم أرجو ت msgid "A Holiday List can be added to exclude counting these days for the Workstation." msgstr "يمكن إضافة قائمة الإجازات لحساب هذه الأيام لمحطة العمل." -#: erpnext/crm/doctype/lead/lead.py:142 +#: erpnext/crm/doctype/lead/lead.py:144 msgid "A Lead requires either a person's name or an organization's name" msgstr "يتطلب العميل المتوقع اسم شخص أو اسم مؤسسة" @@ -952,11 +953,11 @@ msgstr "" msgid "A Product or a Service that is bought, sold or kept in stock." msgstr "" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:570 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:572 msgid "A Reconciliation Job {0} is running for the same filters. Cannot reconcile now" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1754 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1777 msgid "A Reverse Journal Entry {0} already exists for this Journal Entry." msgstr "" @@ -980,7 +981,7 @@ msgstr "" msgid "A logical Warehouse against which stock entries are made." msgstr "" -#: erpnext/stock/serial_batch_bundle.py:1452 +#: erpnext/stock/serial_batch_bundle.py:1460 msgid "A naming series conflict occurred while creating serial numbers. Please change the naming series for the item {0}." msgstr "حدث تعارض في سلسلة التسمية أثناء إنشاء الأرقام التسلسلية. يرجى تغيير سلسلة التسمية للعنصر {0}." @@ -1078,11 +1079,11 @@ msgstr "" msgid "Abbreviation" msgstr "اسم مختصر" -#: erpnext/setup/doctype/company/company.py:237 +#: erpnext/setup/doctype/company/company.py:238 msgid "Abbreviation already used for another company" msgstr "الاختصار يستخدم بالفعل لشركة أخرى\\n
    \\nAbbreviation already used for another company" -#: erpnext/setup/doctype/company/company.py:234 +#: erpnext/setup/doctype/company/company.py:235 msgid "Abbreviation is mandatory" msgstr "الاسم المختصر إلزامي" @@ -1090,7 +1091,7 @@ msgstr "الاسم المختصر إلزامي" msgid "Abbreviation: {0} must appear only once" msgstr "" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1285 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1327 msgid "Above" msgstr "فوق" @@ -1135,7 +1136,7 @@ msgstr "" #. Label of the qty (Float) field in DocType 'Purchase Receipt Item' #. Label of the qty (Float) field in DocType 'Subcontracting Receipt Item' -#: erpnext/public/js/controllers/transaction.js:2810 +#: erpnext/public/js/controllers/transaction.js:2911 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json msgid "Accepted Quantity" @@ -1168,7 +1169,7 @@ msgstr "مفتاح الوصول مطلوب لموفر الخدمة: {0}" msgid "According to CEFACT/ICG/2010/IC013 or CEFACT/ICG/2010/IC010" msgstr "وفقًا لـ CEFACT/ICG/2010/IC013 أو CEFACT/ICG/2010/IC010" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:989 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:994 msgid "According to the BOM {0}, the Item '{1}' is missing in the stock entry." msgstr "وفقًا لقائمة المواد {0}، فإن العنصر '{1}' مفقود في إدخال المخزون." @@ -1286,8 +1287,8 @@ msgstr "" msgid "Account Manager" msgstr "إدارة حساب المستخدم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1009 -#: erpnext/controllers/accounts_controller.py:2380 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1010 +#: erpnext/controllers/accounts_controller.py:2381 msgid "Account Missing" msgstr "الحساب مفقود" @@ -1299,9 +1300,9 @@ msgstr "الحساب مفقود" #: erpnext/accounts/doctype/bank_account/bank_account.json #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/ledger_merge_accounts/ledger_merge_accounts.json -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:409 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:389 #: erpnext/accounts/report/financial_statements.py:678 -#: erpnext/accounts/report/trial_balance/trial_balance.py:480 +#: erpnext/accounts/report/trial_balance/trial_balance.py:488 msgid "Account Name" msgstr "اسم الحساب" @@ -1312,9 +1313,9 @@ msgstr "الحساب غير موجود" #. Label of the account_number (Data) field in DocType 'Account' #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/account_tree.js:133 -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:416 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:396 #: erpnext/accounts/report/financial_statements.py:685 -#: erpnext/accounts/report/trial_balance/trial_balance.py:487 +#: erpnext/accounts/report/trial_balance/trial_balance.py:495 msgid "Account Number" msgstr "رقم الحساب" @@ -1403,7 +1404,7 @@ msgstr "الحساب إلزامي للحصول على إدخالات الدفع" msgid "Account is not set for the dashboard chart {0}" msgstr "لم يتم تعيين الحساب لمخطط لوحة المعلومات {0}" -#: erpnext/assets/doctype/asset/asset.py:905 +#: erpnext/assets/doctype/asset/asset.py:906 msgid "Account not Found" msgstr "تعذر العثور على الحساب" @@ -1444,11 +1445,11 @@ msgstr "لا يمكن تعطيل الحساب {0} لأنه تم تعيينه ب msgid "Account {0} does not belong to company {1}" msgstr "" -#: erpnext/setup/doctype/company/company.py:284 +#: erpnext/setup/doctype/company/company.py:285 msgid "Account {0} does not belong to company: {1}" msgstr "الحساب {0} لا يتنمى للشركة {1}\\n
    \\nAccount {0} does not belong to company: {1}" -#: erpnext/accounts/doctype/account/account.py:587 +#: erpnext/accounts/doctype/account/account.py:589 msgid "Account {0} does not exist" msgstr "حساب {0} غير موجود" @@ -1468,7 +1469,7 @@ msgstr "الحساب {0} لا يتطابق مع الشركة {1} في طريقة msgid "Account {0} doesn't belong to Company {1}" msgstr "" -#: erpnext/accounts/doctype/account/account.py:544 +#: erpnext/accounts/doctype/account/account.py:546 msgid "Account {0} exists in parent company {1}." msgstr "الحساب {0} موجود في الشركة الأم {1}." @@ -1476,7 +1477,7 @@ msgstr "الحساب {0} موجود في الشركة الأم {1}." msgid "Account {0} is added in the child company {1}" msgstr "تتم إضافة الحساب {0} في الشركة التابعة {1}" -#: erpnext/setup/doctype/company/company.py:273 +#: erpnext/setup/doctype/company/company.py:274 msgid "Account {0} is disabled." msgstr "تم تعطيل الحساب {0}." @@ -1484,11 +1485,11 @@ msgstr "تم تعطيل الحساب {0}." msgid "Account {0} is frozen" msgstr "الحساب {0} مجمد\\n
    \\nAccount {0} is frozen" -#: erpnext/controllers/accounts_controller.py:1467 +#: erpnext/controllers/accounts_controller.py:1468 msgid "Account {0} is invalid. Account Currency must be {1}" msgstr "الحساب {0} غير صحيح. يجب أن تكون عملة الحساب {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:347 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:348 msgid "Account {0} should be of type Expense" msgstr "حساب {0} يجب أن يكون من نوع المصروفات" @@ -1512,15 +1513,15 @@ msgstr "الحساب {0}: لا يمكنك جعله حساب رئيسي" msgid "Account: {0} is capital Work in progress and can not be updated by Journal Entry" msgstr "الحساب: {0} عبارة "Capital work" قيد التقدم ولا يمكن تحديثها بواسطة "إدخال دفتر اليومية"" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:362 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:363 msgid "Account: {0} can only be updated via Stock Transactions" msgstr "الحساب: {0} لا يمكن تحديثه إلا من خلال معاملات المخزون" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2708 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2727 msgid "Account: {0} is not permitted under Payment Entry" msgstr "الحساب: {0} غير مسموح به بموجب إدخال الدفع" -#: erpnext/controllers/accounts_controller.py:3266 +#: erpnext/controllers/accounts_controller.py:3272 msgid "Account: {0} with currency: {1} can not be selected" msgstr "الحساب: {0} مع العملة: {1} لا يمكن اختياره" @@ -1799,14 +1800,14 @@ msgstr "فلتر الأبعاد المحاسبية" msgid "Accounting Entries" msgstr "القيود المحاسبة" -#: erpnext/assets/doctype/asset/asset.py:939 -#: erpnext/assets/doctype/asset/asset.py:954 +#: erpnext/assets/doctype/asset/asset.py:940 +#: erpnext/assets/doctype/asset/asset.py:955 #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:543 msgid "Accounting Entry for Asset" msgstr "المدخلات الحسابية للأصول" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1960 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1980 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1965 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1985 msgid "Accounting Entry for LCV in Stock Entry {0}" msgstr "" @@ -1814,33 +1815,33 @@ msgstr "" msgid "Accounting Entry for Landed Cost Voucher for SCR {0}" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:837 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:839 msgid "Accounting Entry for Service" msgstr "القيد المحاسبي للخدمة" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1015 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1036 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1054 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1075 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1096 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1124 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1231 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1467 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1489 -#: erpnext/controllers/stock_controller.py:686 -#: erpnext/controllers/stock_controller.py:703 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:930 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1905 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1919 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1016 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1037 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1055 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1076 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1097 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1125 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1232 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1468 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1490 +#: erpnext/controllers/stock_controller.py:727 +#: erpnext/controllers/stock_controller.py:744 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:932 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1910 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1924 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:709 msgid "Accounting Entry for Stock" msgstr "القيود المحاسبية للمخزون" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:734 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:736 msgid "Accounting Entry for {0}" msgstr "القيد المحاسبي لـ {0}" -#: erpnext/controllers/accounts_controller.py:2421 +#: erpnext/controllers/accounts_controller.py:2422 msgid "Accounting Entry for {0}: {1} can only be made in currency: {2}" msgstr "المدخل المحاسبي ل {0}: {1} يمكن أن يكون فقط بالعملة {1}.\\n
    \\nAccounting Entry for {0}: {1} can only be made in currency: {2}" @@ -1851,7 +1852,7 @@ msgstr "المدخل المحاسبي ل {0}: {1} يمكن أن يكون فقط #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 #: erpnext/selling/doctype/customer/customer.js:173 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:50 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:51 msgid "Accounting Ledger" msgstr "موازنة دفتر الأستاذ" @@ -1860,6 +1861,11 @@ msgstr "موازنة دفتر الأستاذ" msgid "Accounting Masters" msgstr "الماجستير المحاسبة" +#. Title of the Module Onboarding 'Accounting Onboarding' +#: erpnext/accounts/module_onboarding/accounting_onboarding/accounting_onboarding.json +msgid "Accounting Onboarding" +msgstr "" + #. Name of a DocType #. Label of a Link in the Invoicing Workspace #. Label of a Workspace Sidebar Item @@ -1903,12 +1909,12 @@ msgstr "تم تجميد القيود المحاسبية حتى هذا التار #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/doctype/customer/customer.json #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:443 +#: erpnext/setup/doctype/company/company.py:444 #: erpnext/setup/doctype/customer_group/customer_group.json #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/setup/doctype/incoterm/incoterm.json #: erpnext/setup/doctype/supplier_group/supplier_group.json -#: erpnext/setup/install.py:337 +#: erpnext/setup/install.py:368 msgid "Accounts" msgstr "الحسابات" @@ -2030,7 +2036,7 @@ msgstr "إعدادات الحسابات" msgid "Accounts Setup" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1319 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1320 msgid "Accounts table cannot be blank." msgstr "جدول الحسابات لا يمكن أن يكون فارغا." @@ -2275,10 +2281,10 @@ msgstr "نوع النشاط" #: erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json #: erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json #: erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.json -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:239 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:243 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:325 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:335 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:246 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:250 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:332 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:342 msgid "Actual" msgstr "الفعلية" @@ -2339,7 +2345,7 @@ msgstr "تاريخ النهاية الفعلي لا يمكن أن يكون قب msgid "Actual End Time" msgstr "الفعلي وقت الانتهاء" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:453 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:471 msgid "Actual Expense" msgstr "" @@ -2451,7 +2457,7 @@ msgstr "الوقت الفعلي (بالساعات)" msgid "Actual qty in stock" msgstr "الكمية الفعلية في المخزون" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1541 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1545 #: erpnext/public/js/controllers/accounts.js:197 msgid "Actual type tax cannot be included in Item rate in row {0}" msgstr "نوع الضريبة الفعلي لا يمكن تضمينه في معدل الصنف في الصف {0}" @@ -2460,7 +2466,7 @@ msgstr "نوع الضريبة الفعلي لا يمكن تضمينه في مع msgid "Ad-hoc Qty" msgstr "الكَميَّة المخصصة" -#: erpnext/stock/doctype/item/item.js:583 +#: erpnext/stock/doctype/item/item.js:601 #: erpnext/stock/doctype/price_list/price_list.js:8 msgid "Add / Edit Prices" msgstr "إضافة و تعديل الأسعار" @@ -2617,7 +2623,7 @@ msgstr "" msgid "Add Sub Assembly" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:513 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:520 #: erpnext/public/js/event.js:32 msgid "Add Suppliers" msgstr "إضافة الموردين" @@ -2641,7 +2647,7 @@ msgid "Add details" msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.js:86 -#: erpnext/stock/doctype/pick_list/pick_list.py:870 +#: erpnext/stock/doctype/pick_list/pick_list.py:872 msgid "Add items in the Item Locations table" msgstr "أضف عناصر في جدول "مواقع العناصر"" @@ -2833,7 +2839,7 @@ msgstr "مبلغ الخصم الإضافي" msgid "Additional Discount Amount (Company Currency)" msgstr "مقدار الخصم الاضافي (بعملة الشركة)" -#: erpnext/controllers/taxes_and_totals.py:790 +#: erpnext/controllers/taxes_and_totals.py:795 msgid "Additional Discount Amount ({discount_amount}) cannot exceed the total before such discount ({total_before_discount})" msgstr "" @@ -2879,6 +2885,7 @@ msgstr "نسبة الخصم الإضافية" #. Label of the additional_info_section (Section Break) field in DocType #. 'Purchase Order' #. Label of the more_info (Section Break) field in DocType 'Supplier Quotation' +#. Label of the sb_more_info (Section Break) field in DocType 'Task' #. Label of the additional_info_section (Section Break) field in DocType #. 'Quotation' #. Label of the additional_info_section (Section Break) field in DocType 'Sales @@ -2892,6 +2899,7 @@ msgstr "نسبة الخصم الإضافية" #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +#: erpnext/projects/doctype/task/task.json #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json #: erpnext/stock/doctype/delivery_note/delivery_note.json @@ -2934,7 +2942,7 @@ msgstr "تكاليف تشغيل اضافية" msgid "Additional Transferred Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:676 +#: erpnext/manufacturing/doctype/work_order/work_order.py:694 msgid "Additional Transferred Qty {0}\n" "\t\t\t\t\tcannot be greater than {1}.\n" "\t\t\t\t\tTo fix this, increase the percentage value\n" @@ -3098,7 +3106,7 @@ msgstr "ضبط الكميَّة" msgid "Adjustment Against" msgstr "" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:662 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:664 msgid "Adjustment based on Purchase Invoice rate" msgstr "" @@ -3175,7 +3183,7 @@ msgstr "حالة الدفع المسبّق" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/controllers/accounts_controller.py:284 +#: erpnext/controllers/accounts_controller.py:285 #: erpnext/setup/doctype/company/company.json msgid "Advance Payments" msgstr "دفعات مقدمة" @@ -3211,11 +3219,11 @@ msgstr "" msgid "Advance amount" msgstr "المبلغ مقدما" -#: erpnext/controllers/taxes_and_totals.py:927 +#: erpnext/controllers/taxes_and_totals.py:932 msgid "Advance amount cannot be greater than {0} {1}" msgstr "قيمة الدفعة المقدمة لا يمكن أن تكون أكبر من {0} {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:867 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:868 msgid "Advance paid against {0} {1} cannot be greater than Grand Total {2}" msgstr "" @@ -3288,7 +3296,7 @@ msgstr "مقابل الحساب" msgid "Against Blanket Order" msgstr "ضد بطانية النظام" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1102 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1103 msgid "Against Customer Order {0}" msgstr "مقابل طلب العميل {0}" @@ -3343,8 +3351,8 @@ msgstr "" msgid "Against Income Account" msgstr "مقابل حساب الدخل" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:729 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:776 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:730 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:777 msgid "Against Journal Entry {0} does not have any unmatched {1} entry" msgstr "قيد اليومية المقابل {0} لا يحتوى مدخل {1} غير مطابق\\n
    \\nAgainst Journal Entry {0} does not have any unmatched {1} entry" @@ -3385,7 +3393,7 @@ msgstr "مقابل بند طلب مبيعات" msgid "Against Stock Entry" msgstr "ضد دخول الأسهم" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:332 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:333 msgid "Against Supplier Invoice {0}" msgstr "مقابل فاتورة المورد {0}" @@ -3429,7 +3437,7 @@ msgstr "عمر" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:154 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:133 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1226 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 msgid "Age (Days)" msgstr "(العمر (أيام" @@ -3528,8 +3536,8 @@ msgstr "الخوارزمية" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:166 -#: erpnext/accounts/utils.py:1556 erpnext/public/js/setup_wizard.js:184 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:168 +#: erpnext/accounts/utils.py:1567 erpnext/public/js/setup_wizard.js:184 msgid "All Accounts" msgstr "جميع الحسابات" @@ -3581,21 +3589,21 @@ msgstr "جميع مجموعات العملاء" #: erpnext/patches/v11_0/update_department_lft_rgt.py:9 #: erpnext/patches/v11_0/update_department_lft_rgt.py:11 #: erpnext/patches/v11_0/update_department_lft_rgt.py:16 -#: erpnext/setup/doctype/company/company.py:436 -#: erpnext/setup/doctype/company/company.py:439 -#: erpnext/setup/doctype/company/company.py:444 -#: erpnext/setup/doctype/company/company.py:450 -#: erpnext/setup/doctype/company/company.py:456 -#: erpnext/setup/doctype/company/company.py:462 -#: erpnext/setup/doctype/company/company.py:468 -#: erpnext/setup/doctype/company/company.py:474 -#: erpnext/setup/doctype/company/company.py:480 -#: erpnext/setup/doctype/company/company.py:486 -#: erpnext/setup/doctype/company/company.py:492 -#: erpnext/setup/doctype/company/company.py:498 -#: erpnext/setup/doctype/company/company.py:504 -#: erpnext/setup/doctype/company/company.py:510 -#: erpnext/setup/doctype/company/company.py:516 +#: erpnext/setup/doctype/company/company.py:437 +#: erpnext/setup/doctype/company/company.py:440 +#: erpnext/setup/doctype/company/company.py:445 +#: erpnext/setup/doctype/company/company.py:451 +#: erpnext/setup/doctype/company/company.py:457 +#: erpnext/setup/doctype/company/company.py:463 +#: erpnext/setup/doctype/company/company.py:469 +#: erpnext/setup/doctype/company/company.py:475 +#: erpnext/setup/doctype/company/company.py:481 +#: erpnext/setup/doctype/company/company.py:487 +#: erpnext/setup/doctype/company/company.py:493 +#: erpnext/setup/doctype/company/company.py:499 +#: erpnext/setup/doctype/company/company.py:505 +#: erpnext/setup/doctype/company/company.py:511 +#: erpnext/setup/doctype/company/company.py:517 msgid "All Departments" msgstr "جميع الاقسام" @@ -3672,7 +3680,7 @@ msgstr "جميع مجموعات الموردين" msgid "All Territories" msgstr "جميع الأقاليم" -#: erpnext/setup/doctype/company/company.py:381 +#: erpnext/setup/doctype/company/company.py:382 msgid "All Warehouses" msgstr "جميع المخازن" @@ -3690,27 +3698,27 @@ msgstr "يجب نقل جميع الاتصالات بما في ذلك وما فو msgid "All items are already requested" msgstr "جميع العناصر مطلوبة مسبقاً" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1418 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1427 msgid "All items have already been Invoiced/Returned" msgstr "تم بالفعل تحرير / إرجاع جميع العناصر" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:1216 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:1223 msgid "All items have already been received" msgstr "تم استلام جميع العناصر مسبقاً" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3112 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3117 msgid "All items have already been transferred for this Work Order." msgstr "جميع الإصناف تم نقلها لأمر العمل" -#: erpnext/public/js/controllers/transaction.js:2918 +#: erpnext/public/js/controllers/transaction.js:3020 msgid "All items in this document already have a linked Quality Inspection." msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1241 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1242 msgid "All items must be linked to a Sales Order or Subcontracting Inward Order for this Sales Invoice." msgstr "يجب ربط جميع العناصر بطلب مبيعات أو طلب توريد فرعي لهذه الفاتورة." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1252 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1253 msgid "All linked Sales Orders must be subcontracted." msgstr "" @@ -3728,7 +3736,7 @@ msgstr "تم إرجاع جميع العناصر مسبقاً." msgid "All the required items (raw materials) will be fetched from BOM and populated in this table. Here you can also change the Source Warehouse for any item. And during the production, you can track transferred raw materials from this table." msgstr "" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:866 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:869 msgid "All these items have already been Invoiced/Returned" msgstr "تم بالفعل إصدار فاتورة / إرجاع جميع هذه العناصر" @@ -3747,7 +3755,7 @@ msgstr "تخصيص" msgid "Allocate Advances Automatically (FIFO)" msgstr "تخصيص السلف تلقائيا (الداخل أولا الخارج أولا)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:931 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:935 msgid "Allocate Payment Amount" msgstr "تخصيص مبلغ الدفع" @@ -3757,7 +3765,7 @@ msgstr "تخصيص مبلغ الدفع" msgid "Allocate Payment Based On Payment Terms" msgstr "تخصيص الدفع على أساس شروط الدفع" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1731 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1735 msgid "Allocate Payment Request" msgstr "" @@ -3783,7 +3791,7 @@ msgstr "تخصيص" #. Payment Entries' #: erpnext/accounts/doctype/bank_transaction/bank_transaction.json #: erpnext/accounts/doctype/bank_transaction_payments/bank_transaction_payments.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1722 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1726 #: erpnext/accounts/doctype/payment_reconciliation_allocation/payment_reconciliation_allocation.json #: erpnext/accounts/doctype/process_payment_reconciliation_log_allocations/process_payment_reconciliation_log_allocations.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json @@ -3809,11 +3817,11 @@ msgstr "" msgid "Allocated amount" msgstr "المبلغ المخصص" -#: erpnext/accounts/utils.py:657 +#: erpnext/accounts/utils.py:659 msgid "Allocated amount cannot be greater than unadjusted amount" msgstr "لا يمكن أن يكون المبلغ المخصص أكبر من المبلغ غير المعدل" -#: erpnext/accounts/utils.py:655 +#: erpnext/accounts/utils.py:657 msgid "Allocated amount cannot be negative" msgstr "لا يمكن أن يكون المبلغ المخصص سالبًا" @@ -3840,7 +3848,7 @@ msgstr "الكمية المخصصة" #. Label of the allow_account_creation_against_child_company (Check) field in #. DocType 'Company' -#: erpnext/accounts/doctype/account/account.py:542 +#: erpnext/accounts/doctype/account/account.py:544 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:68 #: erpnext/setup/doctype/company/company.json msgid "Allow Account Creation Against Child Company" @@ -3865,7 +3873,7 @@ msgstr "السماح بإنشاء حساب ضد شركة تابعة" msgid "Allow Alternative Item" msgstr "السماح لصنف بديل" -#: erpnext/stock/doctype/item_alternative/item_alternative.py:65 +#: erpnext/stock/doctype/item_alternative/item_alternative.py:67 msgid "Allow Alternative Item must be checked on Item {}" msgstr "يجب تحديد خيار السماح بالعنصر البديل في العنصر {}" @@ -3915,7 +3923,7 @@ msgstr "" msgid "Allow Item To Be Added Multiple Times in a Transaction" msgstr "السماح بإضافة العنصر عدة مرات في المعاملة" -#: erpnext/controllers/selling_controller.py:847 +#: erpnext/controllers/selling_controller.py:855 msgid "Allow Item to Be Added Multiple Times in a Transaction" msgstr "" @@ -3958,8 +3966,8 @@ msgstr "السماح بأوامر مبيعات متعددة مقابل طلب ا #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json #: erpnext/stock/doctype/stock_settings/stock_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:179 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:191 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:201 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:213 msgid "Allow Negative Stock" msgstr "السماح بالقيم السالبة للمخزون" @@ -4035,7 +4043,7 @@ msgstr "" #. Label of the allow_rename_attribute_value (Check) field in DocType 'Item #. Variant Settings' -#: erpnext/controllers/item_variant.py:153 +#: erpnext/controllers/item_variant.py:159 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json msgid "Allow Rename Attribute Value" msgstr "السماح بميزة إعادة التسمية" @@ -4266,11 +4274,11 @@ msgstr "" msgid "Allows users to submit Supplier Quotations with zero quantity. Useful when rates are fixed but the quantities are not. Eg. Rate Contracts." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1012 +#: erpnext/stock/doctype/pick_list/pick_list.py:1014 msgid "Already Picked" msgstr "" -#: erpnext/stock/doctype/item_alternative/item_alternative.py:81 +#: erpnext/stock/doctype/item_alternative/item_alternative.py:83 msgid "Already record exists for the item {0}" msgstr "يوجد سجل للصنف {0}" @@ -4285,8 +4293,8 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:250 #: erpnext/manufacturing/doctype/work_order/work_order.js:165 #: erpnext/manufacturing/doctype/work_order/work_order.js:180 -#: erpnext/public/js/utils.js:496 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:287 +#: erpnext/public/js/utils.js:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:288 msgid "Alternate Item" msgstr "صنف بديل" @@ -4306,11 +4314,11 @@ msgstr "اسم الصنف البديل" msgid "Alternative Items" msgstr "" -#: erpnext/stock/doctype/item_alternative/item_alternative.py:37 +#: erpnext/stock/doctype/item_alternative/item_alternative.py:39 msgid "Alternative item must not be same as item code" msgstr "يجب ألا يكون الصنف البديل هو نفسه رمز الصنف" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:378 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:380 msgid "Alternatively, you can download the template and fill your data in." msgstr "" @@ -4340,6 +4348,7 @@ msgstr "" #. Invoice' #. Label of the amount (Currency) field in DocType 'Payment Reconciliation #. Payment' +#. Label of the amount (Currency) field in DocType 'Payment Reference' #. Label of the grand_total (Currency) field in DocType 'Payment Request' #. Option for the 'Discount Type' (Select) field in DocType 'Payment Schedule' #. Option for the 'Discount Type' (Select) field in DocType 'Payment Term' @@ -4434,6 +4443,7 @@ msgstr "" #: erpnext/accounts/doctype/payment_reconciliation_allocation/payment_reconciliation_allocation.json #: erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json #: erpnext/accounts/doctype/payment_reconciliation_payment/payment_reconciliation_payment.json +#: erpnext/accounts/doctype/payment_reference/payment_reference.json #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json #: erpnext/accounts/doctype/payment_term/payment_term.json @@ -4481,6 +4491,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json +#: erpnext/public/js/controllers/transaction.js:506 #: erpnext/selling/doctype/quotation/quotation.js:316 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -4633,19 +4644,19 @@ msgstr "المبلغ في {0}" msgid "Amount to Bill" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1242 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1259 msgid "Amount {0} {1} against {2} {3}" msgstr "مبلغ {0} {1} مقابل {2} {3}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1253 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1270 msgid "Amount {0} {1} deducted against {2}" msgstr "مبلغ {0} {1} خصم مقابل {2}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1217 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1234 msgid "Amount {0} {1} transferred from {2} to {3}" msgstr "القيمة {0} {1} نقلت من {2} إلى {3}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1223 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1240 msgid "Amount {0} {1} {2} {3}" msgstr "القيمة {0} {1} {2} {3}" @@ -4684,7 +4695,7 @@ msgstr "الإجمالي" msgid "An Item Group is a way to classify items based on types." msgstr "مجموعة العناصر هي طريقة لتصنيف العناصر بناءً على الأنواع." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:527 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:535 msgid "An error has been appeared while reposting item valuation via {0}" msgstr "حدث خطأ أثناء إعادة نشر تقييم العنصر عبر {0}" @@ -4711,7 +4722,7 @@ msgstr "محلل" msgid "Analytical Accounting" msgstr "" -#: erpnext/public/js/utils.js:93 +#: erpnext/public/js/utils.js:158 msgid "Annual Billing: {0}" msgstr "الفواتير السنوية: {0}" @@ -4750,7 +4761,7 @@ msgstr "يوجد بالفعل سجل ميزانية آخر '{0}' مقابل {1} msgid "Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}" msgstr "سجل تخصيص مركز التكلفة الآخر {0} ينطبق من {1}، وبالتالي سيظل هذا التخصيص ساريًا حتى {2}" -#: erpnext/accounts/doctype/payment_request/payment_request.py:758 +#: erpnext/accounts/doctype/payment_request/payment_request.py:883 msgid "Another Payment Request is already processed" msgstr "تمت معالجة طلب دفع آخر بالفعل" @@ -4893,7 +4904,7 @@ msgstr "رمز القسيمة المطبق" msgid "Applied on each reading." msgstr "يتم تطبيقها على كل قراءة." -#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:197 +#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:198 msgid "Applied putaway rules." msgstr "تم تطبيق قواعد التخزين." @@ -5191,7 +5202,7 @@ msgstr "أثناء تمكين الحقل {0} ، يجب أن تكون قيمة ا msgid "As there are existing submitted transactions against item {0}, you can not change the value of {1}." msgstr "بما أن هناك معاملات مقدمة بالفعل مقابل العنصر {0}، فلا يمكنك تغيير قيمة {1}." -#: erpnext/stock/doctype/stock_settings/stock_settings.py:204 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:226 msgid "As there are reserved stock, you cannot disable {0}." msgstr "نظراً لوجود مخزون محجوز، لا يمكنك تعطيل {0}." @@ -5203,8 +5214,8 @@ msgstr "نظرًا لوجود عناصر تجميع فرعية كافية، فإ msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}." msgstr "نظرًا لوجود مواد خام كافية ، فإن طلب المواد ليس مطلوبًا للمستودع {0}." -#: erpnext/stock/doctype/stock_settings/stock_settings.py:178 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:190 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:200 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:212 msgid "As {0} is enabled, you can not enable {1}." msgstr "بما أن {0} مفعل، فلا يمكنك تفعيل {1}." @@ -5375,7 +5386,7 @@ msgstr "يوجد بالفعل جدول استهلاك الأصول {0} للأص msgid "Asset Depreciation Schedule {0} for Asset {1} and Finance Book {2} already exists." msgstr "يوجد بالفعل جدول استهلاك الأصول {0} للأصل {1} ودفتر المالية {2} ." -#: erpnext/assets/doctype/asset/asset.py:235 +#: erpnext/assets/doctype/asset/asset.py:236 msgid "Asset Depreciation Schedules created/updated:
    {0}

    Please check, edit if needed, and submit the Asset." msgstr "" @@ -5605,11 +5616,11 @@ msgstr "لا يمكن نشر تسوية قيمة الأصل قبل تاريخ ش msgid "Asset Value Analytics" msgstr "تحليلات قيمة الأصول" -#: erpnext/assets/doctype/asset/asset.py:277 +#: erpnext/assets/doctype/asset/asset.py:278 msgid "Asset cancelled" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:735 +#: erpnext/assets/doctype/asset/asset.py:736 msgid "Asset cannot be cancelled, as it is already {0}" msgstr "لا يمكن إلغاء الأصل، لانه بالفعل {0}" @@ -5621,15 +5632,15 @@ msgstr "لا يمكن التخلص من الأصل قبل آخر قيد استه msgid "Asset capitalized after Asset Capitalization {0} was submitted" msgstr "تم رسملة الأصل بعد تقديم رسملة الأصل {0}" -#: erpnext/assets/doctype/asset/asset.py:286 +#: erpnext/assets/doctype/asset/asset.py:287 msgid "Asset created" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:1438 +#: erpnext/assets/doctype/asset/asset.py:1439 msgid "Asset created after being split from Asset {0}" msgstr "الأصل الذي تم إنشاؤه بعد فصله عن الأصل {0}" -#: erpnext/assets/doctype/asset/asset.py:289 +#: erpnext/assets/doctype/asset/asset.py:290 msgid "Asset deleted" msgstr "" @@ -5653,7 +5664,7 @@ msgstr "تم استعادة الأصل" msgid "Asset restored after Asset Capitalization {0} was cancelled" msgstr "تمت استعادة الأصل بعد إلغاء رسملة الأصل {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1525 msgid "Asset returned" msgstr "تم إرجاع الأصل" @@ -5665,12 +5676,12 @@ msgstr "الأصول الملغاة" msgid "Asset scrapped via Journal Entry {0}" msgstr "ألغت الأصول عن طريق قيد اليومية {0}\\n
    \\n Asset scrapped via Journal Entry {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1521 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1525 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1528 msgid "Asset sold" msgstr "تم بيع الأصل" -#: erpnext/assets/doctype/asset/asset.py:264 +#: erpnext/assets/doctype/asset/asset.py:265 msgid "Asset submitted" msgstr "تم تقديم الأصل" @@ -5678,7 +5689,7 @@ msgstr "تم تقديم الأصل" msgid "Asset transferred to Location {0}" msgstr "تم نقل الأصل إلى الموقع {0}" -#: erpnext/assets/doctype/asset/asset.py:1447 +#: erpnext/assets/doctype/asset/asset.py:1448 msgid "Asset updated after being split into Asset {0}" msgstr "تم تحديث الأصل بعد تقسيمه إلى الأصل {0}" @@ -5756,7 +5767,7 @@ msgstr "تم تعديل قيمة الأصل بعد تقديم طلب تعديل #. Title of a Workspace Sidebar #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/finance_book/finance_book_dashboard.py:9 -#: erpnext/accounts/report/balance_sheet/balance_sheet.py:249 +#: erpnext/accounts/report/balance_sheet/balance_sheet.py:250 #: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json #: erpnext/assets/doctype/asset_movement/asset_movement.json #: erpnext/assets/workspace/assets/assets.json erpnext/desktop_icon/assets.json @@ -5764,6 +5775,11 @@ msgstr "تم تعديل قيمة الأصل بعد تقديم طلب تعديل msgid "Assets" msgstr "الأصول" +#. Title of the Module Onboarding 'Asset Onboarding' +#: erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json +msgid "Assets Setup" +msgstr "" + #: erpnext/controllers/buying_controller.py:1048 msgid "Assets not created for {item_code}. You will have to create asset manually." msgstr "لم يتم إنشاء الأصول لـ {item_code}. سيكون عليك إنشاء الأصل يدويًا." @@ -5792,27 +5808,27 @@ msgstr "شروط التعيين" msgid "Associate" msgstr "شريك" -#: erpnext/stock/doctype/pick_list/pick_list.py:124 +#: erpnext/stock/doctype/pick_list/pick_list.py:126 msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} for the batch {4} in the warehouse {5}. Please restock the item." msgstr "في الصف #{0}: الكمية المختارة {1} للصنف {2} أكبر من المخزون المتاح {3} للدفعة {4} في المستودع {5}. يرجى إعادة تخزين الصنف." -#: erpnext/stock/doctype/pick_list/pick_list.py:149 +#: erpnext/stock/doctype/pick_list/pick_list.py:151 msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} in the warehouse {4}." msgstr "في الصف #{0}: الكمية المختارة {1} للصنف {2} أكبر من المخزون المتاح {3} في المستودع {4}." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1357 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1399 msgid "At Row {0}: In Serial and Batch Bundle {1} must have docstatus as 1 and not 0" msgstr "في الصف {0}: في حزمة البيانات التسلسلية والدفعية {1} ، يجب أن تكون حالة المستند 1 وليس 0" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:84 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:85 msgid "At least one account with exchange gain or loss is required" msgstr "يشترط وجود حساب واحد على الأقل يتضمن أرباحًا أو خسائر في صرف العملات الأجنبية" -#: erpnext/assets/doctype/asset/asset.py:1296 +#: erpnext/assets/doctype/asset/asset.py:1297 msgid "At least one asset has to be selected." msgstr "يجب اختيار أصل واحد على الأقل." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:1037 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:1038 msgid "At least one invoice has to be selected." msgstr "يجب اختيار فاتورة واحدة على الأقل." @@ -5820,8 +5836,8 @@ msgstr "يجب اختيار فاتورة واحدة على الأقل." msgid "At least one item should be entered with negative quantity in return document" msgstr "يجب إدخال عنصر واحد على الأقل بكمية سالبة في مستند الإرجاع" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:530 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:545 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:531 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:546 msgid "At least one mode of payment is required for POS invoice." msgstr "يلزم وضع واحد نمط واحد للدفع لفاتورة نقطة البيع.\\n
    \\nAt least one mode of payment is required for POS invoice." @@ -5833,7 +5849,7 @@ msgstr "يجب اختيار واحدة على الأقل من الوحدات ا msgid "At least one of the Selling or Buying must be selected" msgstr "يجب اختيار واحد على الأقل من خياري البيع أو الشراء" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:314 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:319 msgid "At least one raw material item must be present in the stock entry for the type {0}" msgstr "" @@ -5841,11 +5857,11 @@ msgstr "" msgid "At least one row is required for a financial report template" msgstr "يلزم وجود صف واحد على الأقل في نموذج التقرير المالي" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:820 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:825 msgid "At least one warehouse is mandatory" msgstr "يُشترط وجود مستودع واحد على الأقل" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:727 msgid "At row #{0}: the Difference Account must not be a Stock type account, please change the Account Type for the account {1} or select a different account" msgstr "في السطر #{0}: يجب ألا يكون حساب الفروقات حسابًا من نوع الأسهم، يُرجى تغيير نوع الحساب {1} أو تحديد حساب مختلف." @@ -5853,11 +5869,11 @@ msgstr "في السطر #{0}: يجب ألا يكون حساب الفروقات msgid "At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}" msgstr "في الصف # {0}: لا يمكن أن يكون معرف التسلسل {1} أقل من معرف تسلسل الصف السابق {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:733 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:738 msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account" msgstr "في الصف #{0}: لقد اخترت حساب الفرق {1}، وهو حساب من نوع تكلفة البضائع المباعة. يرجى اختيار حساب مختلف." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1119 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1147 msgid "At row {0}: Batch No is mandatory for Item {1}" msgstr "في الصف {0}: رقم الدفعة إلزامي للعنصر {1}" @@ -5865,15 +5881,15 @@ msgstr "في الصف {0}: رقم الدفعة إلزامي للعنصر {1}" msgid "At row {0}: Parent Row No cannot be set for item {1}" msgstr "في الصف {0}: لا يمكن تعيين رقم الصف الأصل للعنصر {1}" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1104 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1132 msgid "At row {0}: Qty is mandatory for the batch {1}" msgstr "في الصف {0}: الكمية إلزامية للدفعة {1}" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1111 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1139 msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "في الصف {0}: الرقم التسلسلي إلزامي للعنصر {1}" -#: erpnext/controllers/stock_controller.py:634 +#: erpnext/controllers/stock_controller.py:675 msgid "At row {0}: Serial and Batch Bundle {1} has already created. Please remove the values from the serial no or batch no fields." msgstr "في الصف {0}: تم إنشاء حزمة الرقم التسلسلي وحزمة الدفعة {1} مسبقًا. يُرجى حذف القيم من حقلي الرقم التسلسلي أو رقم الدفعة." @@ -6093,7 +6109,7 @@ msgstr "المطابقة التلقائية" msgid "Auto Reconcile Payments" msgstr "التسوية التلقائية للمدفوعات" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:447 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:451 msgid "Auto Reconciliation" msgstr "التسوية التلقائية" @@ -6103,7 +6119,7 @@ msgstr "التسوية التلقائية" msgid "Auto Reconciliation Job Trigger" msgstr "تشغيل وظيفة المطابقة التلقائية" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:395 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:399 msgid "Auto Reconciliation has started in the background" msgstr "بدأت عملية المطابقة التلقائية في الخلفية" @@ -6192,8 +6208,8 @@ msgstr "إنشاء دفعة جديدة تلقائيا" #. Label of the automatically_fetch_payment_terms (Check) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -msgid "Automatically Fetch Payment Terms from Order" -msgstr "جلب شروط الدفع من الطلب تلقائياً" +msgid "Automatically Fetch Payment Terms from Order/Quotation" +msgstr "" #. Label of the automatically_process_deferred_accounting_entry (Check) field #. in DocType 'Accounts Settings' @@ -6257,7 +6273,7 @@ msgstr "متاح للاستخدام تاريخ" #. 'Pick List Item' #: erpnext/manufacturing/doctype/workstation/workstation.js:505 #: erpnext/manufacturing/report/bom_stock_calculated/bom_stock_calculated.py:88 -#: erpnext/public/js/utils.js:556 +#: erpnext/public/js/utils.js:621 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/report/stock_ageing/stock_ageing.py:169 @@ -6345,11 +6361,11 @@ msgstr "المخزون المتاج للأصناف المعبأة" msgid "Available for Use Date" msgstr "" -#: erpnext/assets/doctype/asset/asset.py:382 +#: erpnext/assets/doctype/asset/asset.py:383 msgid "Available for use date is required" msgstr "مطلوب تاريخ متاح للاستخدام" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:953 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:958 msgid "Available quantity is {0}, you need {1}" msgstr "الكمية المتاحة هي {0} ، تحتاج إلى {1}" @@ -6357,13 +6373,13 @@ msgstr "الكمية المتاحة هي {0} ، تحتاج إلى {1}" msgid "Available {0}" msgstr "متاح {0}" -#: erpnext/assets/doctype/asset/asset.py:491 +#: erpnext/assets/doctype/asset/asset.py:492 msgid "Available-for-use Date should be after purchase date" msgstr "يجب أن يكون التاريخ متاحًا بعد تاريخ الشراء" #: erpnext/stock/report/stock_ageing/stock_ageing.py:170 #: erpnext/stock/report/stock_ageing/stock_ageing.py:204 -#: erpnext/stock/report/stock_balance/stock_balance.py:517 +#: erpnext/stock/report/stock_balance/stock_balance.py:590 msgid "Average Age" msgstr "متوسط العمر" @@ -6410,7 +6426,7 @@ msgid "Avg Rate" msgstr "المعدل المتوسط" #: erpnext/stock/report/available_serial_no/available_serial_no.py:154 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:287 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:351 msgid "Avg Rate (Balance Stock)" msgstr "متوسط المعدل (رصيد المخزون)" @@ -6481,7 +6497,7 @@ msgstr "الكمية في الصندوق" #: erpnext/selling/doctype/sales_order/sales_order.js:1415 #: erpnext/stock/doctype/material_request/material_request.js:351 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:706 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:707 #: erpnext/stock/report/bom_search/bom_search.py:38 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:525 @@ -6733,11 +6749,11 @@ msgstr "صنف الموقع الالكتروني بقائمة المواد" msgid "BOM Website Operation" msgstr "عملية الموقع الالكتروني بقائمة المواد" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2280 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2285 msgid "BOM and Finished Good Quantity is mandatory for Disassembly" msgstr "يُعدّ كل من قائمة المواد وكمية المنتج النهائي شرطًا أساسيًا لعملية التفكيك." -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1344 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1341 msgid "BOM and Manufacturing Quantity are required" msgstr "مطلوب، قائمة مكونات المواد و كمية التصنيع" @@ -6748,7 +6764,7 @@ msgid "BOM and Production" msgstr "قائمة المواد والإنتاج" #: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:758 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:759 msgid "BOM does not contain any stock item" msgstr "فاتورة الموارد لا تحتوي على أي صنف مخزون" @@ -6862,8 +6878,8 @@ msgstr "التوازن في العملة الأساسية" #: erpnext/stock/report/available_batch_report/available_batch_report.py:62 #: erpnext/stock/report/available_serial_no/available_serial_no.py:126 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:84 -#: erpnext/stock/report/stock_balance/stock_balance.py:445 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:250 +#: erpnext/stock/report/stock_balance/stock_balance.py:518 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:314 msgid "Balance Qty" msgstr "كمية الرصيد" @@ -6927,8 +6943,8 @@ msgstr "نوع التوازن" #: erpnext/stock/report/available_serial_no/available_serial_no.py:174 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:86 -#: erpnext/stock/report/stock_balance/stock_balance.py:452 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:307 +#: erpnext/stock/report/stock_balance/stock_balance.py:525 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:371 msgid "Balance Value" msgstr "قيمة الرصيد" @@ -7051,7 +7067,7 @@ msgstr "النوع الفرعي للحساب المصرفي" msgid "Bank Account Type" msgstr "نوع الحساب المصرفي" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:381 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:382 msgid "Bank Account {} in Bank Transaction {} is not matching with Bank Account {}" msgstr "الحساب المصرفي {} في المعاملة المصرفية {} لا يتطابق مع الحساب المصرفي {}" @@ -7427,7 +7443,7 @@ msgstr "التسعير الاساسي استنادأ لوحدة القياس" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:34 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:80 #: erpnext/stock/report/fifo_queue_vs_qty_after_transaction_comparison/fifo_queue_vs_qty_after_transaction_comparison.py:158 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:329 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:393 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:171 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:80 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:19 @@ -7446,7 +7462,7 @@ msgstr "وصف الباتش" msgid "Batch Details" msgstr "تفاصيل الدفعة" -#: erpnext/stock/doctype/batch/batch.py:217 +#: erpnext/stock/doctype/batch/batch.py:218 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:469 msgid "Batch Expiry Date" msgstr "تاريخ انتهاء صلاحية الدفعة" @@ -7456,7 +7472,7 @@ msgstr "تاريخ انتهاء صلاحية الدفعة" msgid "Batch ID" msgstr "هوية الباتش" -#: erpnext/stock/doctype/batch/batch.py:129 +#: erpnext/stock/doctype/batch/batch.py:130 msgid "Batch ID is mandatory" msgstr "معرف الدُفعة إلزامي" @@ -7502,7 +7518,7 @@ msgstr "حالة انتهاء صلاحية الدفعة الصنف" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:89 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:115 -#: erpnext/public/js/controllers/transaction.js:2836 +#: erpnext/public/js/controllers/transaction.js:2937 #: erpnext/public/js/utils/barcode_scanner.js:281 #: erpnext/public/js/utils/serial_no_batch_selector.js:439 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -7523,7 +7539,7 @@ msgstr "حالة انتهاء صلاحية الدفعة الصنف" #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.js:68 #: erpnext/stock/report/negative_batch_report/negative_batch_report.py:33 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:81 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:160 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:162 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.js:19 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:462 #: erpnext/stock/report/stock_ledger/stock_ledger.js:77 @@ -7533,19 +7549,19 @@ msgstr "حالة انتهاء صلاحية الدفعة الصنف" msgid "Batch No" msgstr "رقم دفعة" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1122 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1150 msgid "Batch No is mandatory" msgstr "رقم الدفعة إلزامي" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3284 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3368 msgid "Batch No {0} does not exists" msgstr "رقم الدفعة {0} غير موجود" -#: erpnext/stock/utils.py:618 +#: erpnext/stock/utils.py:621 msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." msgstr "رقم الدفعة {0} مرتبط بالعنصر {1} الذي يحمل رقمًا تسلسليًا. يرجى مسح الرقم التسلسلي بدلاً من ذلك." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:437 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:459 msgid "Batch No {0} is not present in the original {1} {2}, hence you can't return it against the {1} {2}" msgstr "رقم الدفعة {0} غير موجود في الدفعة الأصلية {1} {2}، لذا لا يمكنك إرجاعه مقابل الدفعة {1} {2}" @@ -7560,11 +7576,11 @@ msgstr "" msgid "Batch Nos" msgstr "أرقام الدفعات" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1875 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1917 msgid "Batch Nos are created successfully" msgstr "تم إنشاء أرقام الدفعات بنجاح" -#: erpnext/controllers/sales_and_purchase_return.py:1187 +#: erpnext/controllers/sales_and_purchase_return.py:1194 msgid "Batch Not Available for Return" msgstr "الدفعة غير متاحة للإرجاع" @@ -7573,7 +7589,7 @@ msgstr "الدفعة غير متاحة للإرجاع" msgid "Batch Number Series" msgstr "سلسلة رقم الدفعة" -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:161 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:163 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:33 msgid "Batch Qty" msgstr "كمية الدفعة" @@ -7582,7 +7598,7 @@ msgstr "كمية الدفعة" msgid "Batch Qty updated successfully" msgstr "تم تحديث كمية الدفعة بنجاح" -#: erpnext/stock/doctype/batch/batch.py:177 +#: erpnext/stock/doctype/batch/batch.py:178 msgid "Batch Qty updated to {0}" msgstr "تم تحديث كمية الدفعة إلى {0}" @@ -7614,7 +7630,7 @@ msgstr "دفعة UOM" msgid "Batch and Serial No" msgstr "رقم الدفعة والرقم التسلسلي" -#: erpnext/manufacturing/doctype/work_order/work_order.py:899 +#: erpnext/manufacturing/doctype/work_order/work_order.py:921 msgid "Batch not created for item {} since it does not have a batch series." msgstr "لم يتم إنشاء دفعة للعنصر {} لأنه لا يحتوي على سلسلة دفعات." @@ -7622,16 +7638,16 @@ msgstr "لم يتم إنشاء دفعة للعنصر {} لأنه لا يحتوي msgid "Batch {0} and Warehouse" msgstr "الدفعة {0} والمستودع" -#: erpnext/controllers/sales_and_purchase_return.py:1186 +#: erpnext/controllers/sales_and_purchase_return.py:1193 msgid "Batch {0} is not available in warehouse {1}" msgstr "الدفعة {0} غير متوفرة في المستودع {1}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3289 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3294 #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:289 msgid "Batch {0} of Item {1} has expired." msgstr "الدفعة {0} للعنصر {1} انتهت صلاحيتها\\n
    \\nBatch {0} of Item {1} has expired." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3295 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3300 msgid "Batch {0} of Item {1} is disabled." msgstr "تم تعطيل الدفعة {0} من الصنف {1}." @@ -7674,7 +7690,7 @@ msgstr "تختلف عملات خطط الاشتراك أدناه عن عملة #. Label of the bill_date (Date) field in DocType 'Journal Entry' #. Label of the bill_date (Date) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1211 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1253 #: erpnext/accounts/report/purchase_register/purchase_register.py:214 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill Date" @@ -7683,7 +7699,7 @@ msgstr "تاريخ الفاتورة" #. Label of the bill_no (Data) field in DocType 'Journal Entry' #. Label of the bill_no (Data) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/journal_entry/journal_entry.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1210 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1252 #: erpnext/accounts/report/purchase_register/purchase_register.py:213 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.json msgid "Bill No" @@ -7697,10 +7713,12 @@ msgstr "فاتورة بالكمية المرفوضة في فاتورة الشر #. Label of a Card Break in the Manufacturing Workspace #. Label of a Link in the Manufacturing Workspace +#. Label of a Workspace Sidebar Item #: erpnext/manufacturing/doctype/bom/bom.py:1327 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:692 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:693 +#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "فاتورة المواد" @@ -7800,7 +7818,7 @@ msgstr "تفاصيل عنوان الفوترة" msgid "Billing Address Name" msgstr "اسم عنوان تقديم الفواتير" -#: erpnext/controllers/accounts_controller.py:570 +#: erpnext/controllers/accounts_controller.py:571 msgid "Billing Address does not belong to the {0}" msgstr "عنوان الفوترة لا ينتمي إلى {0}" @@ -7873,7 +7891,7 @@ msgstr "فواتير الفوترة" msgid "Billing Interval Count" msgstr "عدد الفواتير الفوترة" -#: erpnext/accounts/doctype/subscription_plan/subscription_plan.py:41 +#: erpnext/accounts/doctype/subscription_plan/subscription_plan.py:42 msgid "Billing Interval Count cannot be less than 1" msgstr "لا يمكن أن يكون عدد فترات إعداد الفواتير أقل من 1" @@ -7906,7 +7924,7 @@ msgstr "حالة الفواتير" msgid "Billing Zipcode" msgstr "الرمز البريدي للفواتير" -#: erpnext/accounts/party.py:607 +#: erpnext/accounts/party.py:600 msgid "Billing currency must be equal to either default company's currency or party account currency" msgstr "يجب أن تكون عملة الفوترة مساوية لعملة الشركة الافتراضية أو عملة حساب الطرف" @@ -8079,7 +8097,7 @@ msgstr "نص غامق" msgid "Bold text for emphasis (totals, major headings)" msgstr "نص غامق للتأكيد (الإجماليات، العناوين الرئيسية)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:285 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:286 msgid "Book Advance Payments as Liability option is chosen. Paid From account changed from {0} to {1}." msgstr "تم اختيار خيار \"دفعات مقدمة للدفتر كالتزام\". تم تغيير حساب الدفع من {0} إلى {1}." @@ -8135,7 +8153,7 @@ msgstr "حجز" msgid "Booked Fixed Asset" msgstr "حجز الأصول الثابتة" -#: erpnext/stock/doctype/warehouse/warehouse.py:146 +#: erpnext/stock/doctype/warehouse/warehouse.py:147 msgid "Booking stock value across multiple accounts will make it harder to track stock and account value." msgstr "سيؤدي تسجيل قيمة المخزون عبر حسابات متعددة إلى صعوبة تتبع قيمة المخزون والحساب." @@ -8175,10 +8193,12 @@ msgstr "صندوق" #. Label of the branch (Data) field in DocType 'Branch' #. Label of the branch (Link) field in DocType 'Employee' #. Label of the branch (Link) field in DocType 'Employee Internal Work History' +#. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/sms_center/sms_center.json #: erpnext/setup/doctype/branch/branch.json #: erpnext/setup/doctype/employee/employee.json #: erpnext/setup/doctype/employee_internal_work_history/employee_internal_work_history.json +#: erpnext/workspace_sidebar/organization.json msgid "Branch" msgstr "فرع" @@ -8274,11 +8294,11 @@ msgstr "حجم الدلو" #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:65 #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:73 #: erpnext/accounts/doctype/cost_center/cost_center_tree.js:81 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:238 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:242 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:324 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:334 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:448 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:245 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:249 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:331 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:341 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:466 #: erpnext/accounts/workspace/invoicing/invoicing.json #: erpnext/desktop_icon/budget.json erpnext/workspace_sidebar/budget.json msgid "Budget" @@ -8513,6 +8533,11 @@ msgstr "معدل الشراء" msgid "Buying Settings" msgstr "إعدادات الشراء" +#. Title of the Module Onboarding 'Buying Onboarding' +#: erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json +msgid "Buying Setup" +msgstr "" + #. Label of the buying_and_selling_tab (Tab Break) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json msgid "Buying and Selling" @@ -8835,7 +8860,7 @@ msgstr "" msgid "Can be approved by {0}" msgstr "يمكن الموافقة عليها بواسطة {0}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2521 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2533 msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state." msgstr "لا يمكن إغلاق أمر العمل. لأن {0} بطاقات العمل في حالة \"قيد التنفيذ\"." @@ -8863,19 +8888,19 @@ msgstr "لا يمكن التصفية بناءً على طريقة الدفع ، msgid "Can not filter based on Voucher No, if grouped by Voucher" msgstr "لا يمكن الفلتره علي اساس (رقم الأيصال)، إذا تم وضعه في مجموعة على اساس (ايصال)" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1378 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2862 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1389 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2885 msgid "Can only make payment against unbilled {0}" msgstr "يمكن إجراء دفعة فقط مقابل فاتورة غير مدفوعة {0}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1513 -#: erpnext/controllers/accounts_controller.py:3175 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1517 +#: erpnext/controllers/accounts_controller.py:3181 #: erpnext/public/js/controllers/accounts.js:103 msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'" msgstr "لا يمكن الرجوع إلى الصف إلا إذا كان نوع الرسوم هو \"مبلغ الصف السابق\" أو \"إجمالي الصف السابق\"." -#: erpnext/setup/doctype/company/company.py:205 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:145 +#: erpnext/setup/doctype/company/company.py:206 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:167 msgid "Can't change the valuation method, as there are transactions against some items which do not have its own valuation method" msgstr "لا يمكن تغيير طريقة التقييم، حيث توجد معاملات على بعض البنود التي لا تملك طريقة تقييم خاصة بها." @@ -8884,7 +8909,7 @@ msgstr "لا يمكن تغيير طريقة التقييم، حيث توجد م msgid "Cancel At End Of Period" msgstr "الغاء في نهاية الفترة" -#: erpnext/support/doctype/warranty_claim/warranty_claim.py:72 +#: erpnext/support/doctype/warranty_claim/warranty_claim.py:73 msgid "Cancel Material Visit {0} before cancelling this Warranty Claim" msgstr "إلغاء الزيارة {0} قبل إلغاء طلب الضمانة" @@ -8916,7 +8941,7 @@ msgstr "لا يمكن تعيين أمين صندوق" msgid "Cannot Calculate Arrival Time as Driver Address is Missing." msgstr "لا يمكن حساب وقت الوصول حيث أن عنوان برنامج التشغيل مفقود." -#: erpnext/setup/doctype/company/company.py:224 +#: erpnext/setup/doctype/company/company.py:225 msgid "Cannot Change Inventory Account Setting" msgstr "لا يمكن تغيير إعدادات حساب المخزون" @@ -8942,7 +8967,7 @@ msgstr "لا يمكن إعفاء الموظف" msgid "Cannot Resubmit Ledger entries for vouchers in Closed fiscal year." msgstr "لا يمكن إعادة إرسال قيود دفتر الأستاذ للفواتير في السنة المالية المغلقة." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:202 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:204 msgid "Cannot add child table {0} to deletion list. Child tables are automatically deleted with their parent DocTypes." msgstr "" @@ -8962,7 +8987,7 @@ msgstr "لا يمكن أن يكون عنصر الأصول الثابتة كما msgid "Cannot cancel Asset Depreciation Schedule {0} as it has a draft journal entry {1}." msgstr "لا يمكن إلغاء جدول استهلاك الأصول {0} لأنه يحتوي على مسودة قيد يومية {1}." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:246 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:248 msgid "Cannot cancel POS Closing Entry" msgstr "لا يمكن إلغاء إدخال إغلاق نقطة البيع" @@ -8974,7 +8999,7 @@ msgstr "لا يمكن إلغاء إدخال حجز المخزون {0}، لأنه msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "لا يمكن الإلغاء لأن معالجة المستندات الملغاة لا تزال قيد الانتظار." -#: erpnext/manufacturing/doctype/work_order/work_order.py:1084 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1099 msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "لا يمكن الإلغاء لان هناك تدوينات مخزون مقدمة {0} موجوده" @@ -8986,7 +9011,7 @@ msgstr "لا يمكن إلغاء العملية. لم تكتمل إعادة تق msgid "Cannot cancel this Manufacturing Stock Entry as quantity of Finished Good produced cannot be less than quantity delivered in the linked Subcontracting Inward Order." msgstr "لا يمكن إلغاء إدخال مخزون التصنيع هذا لأن كمية المنتج النهائي لا يمكن أن تكون أقل من الكمية المسلمة في أمر الشراء الداخلي المرتبط بالتعاقد من الباطن." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:569 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:570 msgid "Cannot cancel this document as it is linked with the submitted Asset Value Adjustment {0}. Please cancel the Asset Value Adjustment to continue." msgstr "" @@ -8994,7 +9019,7 @@ msgstr "" msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue." msgstr "لا يمكن إلغاء هذا المستند لأنه مرتبط بالأصل المُرسَل {asset_link}. يُرجى إلغاء الأصل للمتابعة." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:494 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:499 msgid "Cannot cancel transaction for Completed Work Order." msgstr "لا يمكن إلغاء المعاملة لأمر العمل المكتمل." @@ -9014,11 +9039,11 @@ msgstr "لا يمكن تغيير تاريخ إيقاف الخدمة للعنصر msgid "Cannot change Variant properties after stock transaction. You will have to make a new Item to do this." msgstr "لا يمكن تغيير خصائص المتغير بعد معاملة المخزون. سيكون عليك عمل عنصر جديد للقيام بذلك." -#: erpnext/setup/doctype/company/company.py:329 +#: erpnext/setup/doctype/company/company.py:330 msgid "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency." msgstr "لا يمكن تغيير العملة الافتراضية للشركة، لأن هناك معاملات موجودة. يجب إلغاء المعاملات لتغيير العملة الافتراضية." -#: erpnext/projects/doctype/task/task.py:145 +#: erpnext/projects/doctype/task/task.py:147 msgid "Cannot complete task {0} as its dependant task {1} are not completed / cancelled." msgstr "لا يمكن إكمال المهمة {0} لأن المهمة التابعة لها {1} لم تكتمل / تم إلغاؤها." @@ -9038,12 +9063,12 @@ msgstr "لا يمكن التحويل إلى مجموعة لأن نوع الحس msgid "Cannot covert to Group because Account Type is selected." msgstr "لا يمكن تحويل الحساب إلى تصنيف مجموعة لأن نوع الحساب تم اختياره." -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1011 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1013 msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts." msgstr "لا يمكن إنشاء إدخالات حجز المخزون لإيصالات الشراء ذات التواريخ المستقبلية." -#: erpnext/selling/doctype/sales_order/sales_order.py:1900 -#: erpnext/stock/doctype/pick_list/pick_list.py:219 +#: erpnext/selling/doctype/sales_order/sales_order.py:1904 +#: erpnext/stock/doctype/pick_list/pick_list.py:221 msgid "Cannot create a pick list for Sales Order {0} because it has reserved stock. Please unreserve the stock in order to create a pick list." msgstr "لا يمكن إنشاء قائمة اختيار لأمر البيع {0} لأنه يحتوي على مخزون محجوز. يرجى إلغاء حجز المخزون لإنشاء قائمة الاختيار." @@ -9059,7 +9084,7 @@ msgstr "لا يمكن إنشاء إرجاع للفاتورة المجمعة {0}. msgid "Cannot deactivate or cancel BOM as it is linked with other BOMs" msgstr "لا يمكن تعطيل أو إلغاء قائمة المواد لانها مترابطة مع قوائم مواد اخرى" -#: erpnext/crm/doctype/opportunity/opportunity.py:282 +#: erpnext/crm/doctype/opportunity/opportunity.py:285 msgid "Cannot declare as lost, because Quotation has been made." msgstr "لا يمكن ان تعلن بانها فقدت ، لأنه تم تقديم عرض مسعر." @@ -9068,7 +9093,7 @@ msgstr "لا يمكن ان تعلن بانها فقدت ، لأنه تم تقد msgid "Cannot deduct when category is for 'Valuation' or 'Valuation and Total'" msgstr "لا يمكن الخصم عندما تكون الفئة \"التقييم\" أو \"التقييم والإجمالي\"" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1828 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1832 msgid "Cannot delete Exchange Gain/Loss row" msgstr "لا يمكن حذف صف الربح/الخسارة في الصرف" @@ -9076,36 +9101,44 @@ msgstr "لا يمكن حذف صف الربح/الخسارة في الصرف" msgid "Cannot delete Serial No {0}, as it is used in stock transactions" msgstr "لا يمكن حذف الرقم التسلسلي {0}، لانه يتم استخدامها في قيود المخزون" -#: erpnext/controllers/accounts_controller.py:3771 +#: erpnext/controllers/accounts_controller.py:3786 msgid "Cannot delete an item which has been ordered" msgstr "لا يمكن حذف عنصر تم طلبه" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:195 -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:780 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:197 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:784 msgid "Cannot delete protected core DocType: {0}" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:211 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:213 msgid "Cannot delete virtual DocType: {0}. Virtual DocTypes do not have database tables." msgstr "" -#: erpnext/setup/doctype/company/company.py:559 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:132 +msgid "Cannot disable Serial and Batch No for Item, as there are existing records for serial / batch." +msgstr "" + +#: erpnext/setup/doctype/company/company.py:560 msgid "Cannot disable perpetual inventory, as there are existing Stock Ledger Entries for the company {0}. Please cancel the stock transactions first and try again." msgstr "لا يمكن تعطيل الجرد الدائم، لوجود قيود دفترية للمخزون للشركة {0}. يرجى إلغاء معاملات المخزون أولاً ثم المحاولة مرة أخرى." -#: erpnext/manufacturing/doctype/work_order/work_order.py:693 +#: erpnext/manufacturing/doctype/work_order/work_order.py:711 msgid "Cannot disassemble more than produced quantity." msgstr "لا يمكن تفكيك كمية أكبر من الكمية المنتجة." -#: erpnext/setup/doctype/company/company.py:221 +#: erpnext/setup/doctype/company/company.py:222 msgid "Cannot enable Item-wise Inventory Account, as there are existing Stock Ledger Entries for the company {0} with Warehouse-wise Inventory Account. Please cancel the stock transactions first and try again." msgstr "لا يمكن تفعيل حساب المخزون حسب الصنف، لوجود قيود دفترية للمخزون للشركة {0} مع حساب مخزون حسب المستودع. يرجى إلغاء معاملات المخزون أولاً ثم المحاولة مرة أخرى." -#: erpnext/selling/doctype/sales_order/sales_order.py:783 -#: erpnext/selling/doctype/sales_order/sales_order.py:806 +#: erpnext/selling/doctype/sales_order/sales_order.py:785 +#: erpnext/selling/doctype/sales_order/sales_order.py:808 msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "لا يمكن ضمان التسليم بواسطة Serial No حيث أن العنصر {0} مضاف مع وبدون ضمان التسليم بواسطة Serial No." +#: erpnext/accounts/doctype/payment_request/payment_request.js:111 +msgid "Cannot fetch selected rows for submitted Payment Request" +msgstr "" + #: erpnext/public/js/utils/barcode_scanner.js:62 msgid "Cannot find Item or Warehouse with this Barcode" msgstr "لا يمكن العثور على المنتج أو المستودع باستخدام هذا الرمز الشريطي" @@ -9114,36 +9147,36 @@ msgstr "لا يمكن العثور على المنتج أو المستودع ب msgid "Cannot find Item with this Barcode" msgstr "لا يمكن العثور على عنصر بهذا الرمز الشريطي" -#: erpnext/controllers/accounts_controller.py:3723 +#: erpnext/controllers/accounts_controller.py:3738 msgid "Cannot find a default warehouse for item {0}. Please set one in the Item Master or in Stock Settings." msgstr "تعذر العثور على مستودع افتراضي للصنف {0}. يرجى تحديد مستودع في بيانات الصنف الرئيسية أو في إعدادات المخزون." -#: erpnext/accounts/party.py:1073 +#: erpnext/accounts/party.py:1075 msgid "Cannot merge {0} '{1}' into '{2}' as both have existing accounting entries in different currencies for company '{3}'." msgstr "لا يمكن دمج {0} '{1}' في '{2}' حيث أن لكليهما قيود محاسبية موجودة بعملات مختلفة للشركة '{3}'." -#: erpnext/manufacturing/doctype/work_order/work_order.py:543 +#: erpnext/manufacturing/doctype/work_order/work_order.py:561 msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1439 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1450 msgid "Cannot produce more item for {0}" msgstr "لا يمكن إنتاج المزيد من العناصر لـ {0}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1443 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1454 msgid "Cannot produce more than {0} items for {1}" msgstr "لا يمكن إنتاج أكثر من {0} عنصرًا لـ {1}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:358 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:359 msgid "Cannot receive from customer against negative outstanding" msgstr "" -#: erpnext/controllers/accounts_controller.py:3903 +#: erpnext/controllers/accounts_controller.py:3936 msgid "Cannot reduce quantity than ordered or purchased quantity" msgstr "لا يمكن تقليل الكمية عن الكمية المطلوبة أو المشتراة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1526 -#: erpnext/controllers/accounts_controller.py:3190 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1530 +#: erpnext/controllers/accounts_controller.py:3196 #: erpnext/public/js/controllers/accounts.js:120 msgid "Cannot refer row number greater than or equal to current row number for this Charge type" msgstr "لا يمكن أن يشير رقم الصف أكبر من أو يساوي رقم الصف الحالي لهذا النوع المسؤول" @@ -9156,12 +9189,12 @@ msgstr "تعذر استرداد رمز الرابط للتحديث. راجع س msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "تعذر استرداد رمز الرابط. راجع سجل الأخطاء لمزيد من المعلومات." -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1519 -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1697 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1810 -#: erpnext/controllers/accounts_controller.py:3180 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1523 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1701 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1827 +#: erpnext/controllers/accounts_controller.py:3186 #: erpnext/public/js/controllers/accounts.js:112 -#: erpnext/public/js/controllers/taxes_and_totals.js:524 +#: erpnext/public/js/controllers/taxes_and_totals.js:531 msgid "Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row" msgstr "لا يمكن تحديد نوع التهمة باسم ' في الصف السابق المبلغ ' أو ' في السابق صف إجمالي \" ل لصف الأول" @@ -9181,11 +9214,11 @@ msgstr "لا يمكن تعيين عدة عناصر افتراضية لأي شر msgid "Cannot set multiple account rows for the same company" msgstr "" -#: erpnext/controllers/accounts_controller.py:3885 +#: erpnext/controllers/accounts_controller.py:3902 msgid "Cannot set quantity less than delivered quantity" msgstr "لا يمكن ضبط كمية أقل من الكمية المسلمة" -#: erpnext/controllers/accounts_controller.py:3888 +#: erpnext/controllers/accounts_controller.py:3903 msgid "Cannot set quantity less than received quantity" msgstr "لا يمكن تعيين كمية أقل من الكمية المستلمة" @@ -9193,11 +9226,15 @@ msgstr "لا يمكن تعيين كمية أقل من الكمية المستل msgid "Cannot set the field {0} for copying in variants" msgstr "لا يمكن تعيين الحقل {0} للنسخ في المتغيرات" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:264 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:266 msgid "Cannot start deletion. Another deletion {0} is already queued/running. Please wait for it to complete." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1920 +#: erpnext/controllers/accounts_controller.py:3930 +msgid "Cannot update rate as item {0} is already ordered or purchased against this quotation" +msgstr "" + +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1939 msgid "Cannot {0} from {1} without any negative outstanding invoice" msgstr "لا يمكن {0} من {1} بدون أي فاتورة مستحقة سالبة" @@ -9226,7 +9263,7 @@ msgstr "السعة (وحدة قياس المخزون)" msgid "Capacity Planning" msgstr "القدرة على التخطيط" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1070 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1085 msgid "Capacity Planning Error, planned start time can not be same as end time" msgstr "خطأ في تخطيط السعة ، لا يمكن أن يكون وقت البدء المخطط له هو نفسه وقت الانتهاء" @@ -9374,7 +9411,7 @@ msgstr "التدفق النقدي من العمليات" msgid "Cash In Hand" msgstr "النقدية الحاضرة" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:322 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:323 msgid "Cash or Bank Account is mandatory for making payment entry" msgstr "الحساب النقدي أو البنكي مطلوب لعمل مدخل بيع
    Cash or Bank Account is mandatory for making payment entry" @@ -9468,8 +9505,8 @@ msgstr "تفاصيل التصنيف" msgid "Category-wise Asset Value" msgstr "قيمة الأصول حسب الفئة" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:298 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:131 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:299 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:141 msgid "Caution" msgstr "الحذر" @@ -9569,11 +9606,11 @@ msgstr "تغيير تاريخ الإصدار" #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/stock_closing_balance/stock_closing_balance.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:169 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:171 msgid "Change in Stock Value" msgstr "التغير في قيمة السهم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1028 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1029 msgid "Change the account type to Receivable or select a different account." msgstr "قم بتغيير نوع الحساب إلى "ذمم مدينة" أو حدد حسابًا مختلفًا." @@ -9591,7 +9628,7 @@ msgstr "تم تغيير اسم العميل إلى '{}' لأن '{}' موجود msgid "Changes in {0}" msgstr "التغييرات في {0}" -#: erpnext/stock/doctype/item/item.js:337 +#: erpnext/stock/doctype/item/item.js:355 msgid "Changing Customer Group for the selected Customer is not allowed." msgstr "لا يسمح بتغيير مجموعة العملاء للعميل المحدد." @@ -9605,8 +9642,8 @@ msgstr "سيؤثر تغيير طريقة التقييم إلى المتوسط ا msgid "Channel Partner" msgstr "شريك القناة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2239 -#: erpnext/controllers/accounts_controller.py:3243 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2258 +#: erpnext/controllers/accounts_controller.py:3249 msgid "Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount" msgstr "لا يمكن تضمين رسوم من النوع \"فعلي\" في الصف {0} في سعر السلعة أو المبلغ المدفوع" @@ -9792,7 +9829,7 @@ msgstr "عرض الشيك" #. Label of the reference_date (Date) field in DocType 'Payment Entry' #: erpnext/accounts/doctype/payment_entry/payment_entry.json -#: erpnext/public/js/controllers/transaction.js:2747 +#: erpnext/public/js/controllers/transaction.js:2848 msgid "Cheque/Reference Date" msgstr "تاريخ الصك / السند المرجع" @@ -9846,16 +9883,16 @@ msgstr "اسم الطفل" #. Label of the child_row_reference (Data) field in DocType 'Quality #. Inspection' -#: erpnext/public/js/controllers/transaction.js:2842 +#: erpnext/public/js/controllers/transaction.js:2943 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Child Row Reference" msgstr "مرجع صف الطفل" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:205 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:207 msgid "Child Table Not Allowed" msgstr "" -#: erpnext/projects/doctype/task/task.py:312 +#: erpnext/projects/doctype/task/task.py:314 msgid "Child Task exists for this Task. You can not delete this Task." msgstr "مهمة تابعة موجودة لهذه المهمة. لا يمكنك حذف هذه المهمة." @@ -9869,11 +9906,11 @@ msgstr "العقد التابعة يمكن أن تنشأ إلا في إطار ' msgid "Child tables that will also be deleted" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.py:103 +#: erpnext/stock/doctype/warehouse/warehouse.py:104 msgid "Child warehouse exists for this warehouse. You can not delete this warehouse." msgstr "مستودع فرعي موجود لهذا المستودع. لا يمكنك حذف هذا المستودع.\\n
    \\nChild warehouse exists for this warehouse. You can not delete this warehouse." -#: erpnext/projects/doctype/task/task.py:260 +#: erpnext/projects/doctype/task/task.py:262 msgid "Circular Reference Error" msgstr "خطأ المرجع الدائري" @@ -9899,7 +9936,9 @@ msgstr "تصنيف العملاء حسب المنطقة" msgid "Clauses and Conditions" msgstr "الشروط والأحكام" -#: erpnext/public/js/utils/demo.js:5 +#. Label of a standard navbar item +#. Type: Action +#: erpnext/hooks.py erpnext/public/js/utils/demo.js:5 msgid "Clear Demo Data" msgstr "مسح بيانات العرض التوضيحي" @@ -10014,11 +10053,11 @@ msgstr "وثيقة مغلقة" msgid "Closed Documents" msgstr "وثائق مغلقة" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2444 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2456 msgid "Closed Work Order can not be stopped or Re-opened" msgstr "لا يمكن إيقاف أمر العمل المغلق أو إعادة فتحه." -#: erpnext/selling/doctype/sales_order/sales_order.py:537 +#: erpnext/selling/doctype/sales_order/sales_order.py:539 msgid "Closed order cannot be cancelled. Unclose to cancel." msgstr "الطلب المغلق لايمكن إلغاؤه. ازالة الاغلاق لكي تتمكن من الالغاء" @@ -10027,14 +10066,14 @@ msgstr "الطلب المغلق لايمكن إلغاؤه. ازالة الاغل msgid "Closing" msgstr "الإغلاق" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:465 -#: erpnext/accounts/report/trial_balance/trial_balance.py:536 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:445 +#: erpnext/accounts/report/trial_balance/trial_balance.py:544 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:226 msgid "Closing (Cr)" msgstr "إغلاق (دائن)" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:458 -#: erpnext/accounts/report/trial_balance/trial_balance.py:529 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:438 +#: erpnext/accounts/report/trial_balance/trial_balance.py:537 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:219 msgid "Closing (Dr)" msgstr "إغلاق (مدين)" @@ -10246,7 +10285,7 @@ msgstr "الاتصالات المتوسطة Timeslot" msgid "Communication Medium Type" msgstr "الاتصالات المتوسطة النوع" -#: erpnext/setup/install.py:97 +#: erpnext/setup/install.py:98 msgid "Compact Item Print" msgstr "مدمجة البند طباعة" @@ -10499,7 +10538,7 @@ msgstr "شركات" #: erpnext/accounts/report/dimension_wise_accounts_balance_report/dimension_wise_accounts_balance_report.js:8 #: erpnext/accounts/report/financial_ratios/financial_ratios.js:9 #: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:8 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:180 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:192 #: erpnext/accounts/report/general_ledger/general_ledger.js:8 #: erpnext/accounts/report/general_ledger/general_ledger.py:59 #: erpnext/accounts/report/gross_profit/gross_profit.js:8 @@ -10637,8 +10676,8 @@ msgstr "شركات" #: erpnext/setup/doctype/employee/employee_tree.js:8 #: erpnext/setup/doctype/employee_external_work_history/employee_external_work_history.json #: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json -#: erpnext/setup/doctype/vehicle/vehicle.json erpnext/setup/install.py:156 -#: erpnext/setup/install.py:165 erpnext/setup/workspace/home/home.json +#: erpnext/setup/doctype/vehicle/vehicle.json erpnext/setup/install.py:157 +#: erpnext/setup/install.py:166 erpnext/setup/workspace/home/home.json #: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8 #: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8 #: erpnext/stock/doctype/bin/bin.json @@ -10683,15 +10722,15 @@ msgstr "شركات" #: erpnext/stock/report/reserved_stock/reserved_stock.js:8 #: erpnext/stock/report/reserved_stock/reserved_stock.py:191 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:9 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:73 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:75 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:40 #: erpnext/stock/report/stock_ageing/stock_ageing.js:8 #: erpnext/stock/report/stock_analytics/stock_analytics.js:41 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:7 #: erpnext/stock/report/stock_balance/stock_balance.js:8 -#: erpnext/stock/report/stock_balance/stock_balance.py:506 +#: erpnext/stock/report/stock_balance/stock_balance.py:579 #: erpnext/stock/report/stock_ledger/stock_ledger.js:8 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:357 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:421 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:18 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:8 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.js:8 @@ -10707,6 +10746,7 @@ msgstr "شركات" #: erpnext/support/report/issue_analytics/issue_analytics.js:8 #: erpnext/support/report/issue_summary/issue_summary.js:8 #: erpnext/workspace_sidebar/accounts_setup.json +#: erpnext/workspace_sidebar/organization.json msgid "Company" msgstr "شركة" @@ -10775,7 +10815,7 @@ msgstr "عرض عنوان الشركة" msgid "Company Address Name" msgstr "اسم عنوان الشركة" -#: erpnext/controllers/accounts_controller.py:4324 +#: erpnext/controllers/accounts_controller.py:4354 msgid "Company Address is missing. You don't have permission to update it. Please contact your System Manager." msgstr "عنوان الشركة غير موجود. ليس لديك صلاحية لتحديثه. يرجى الاتصال بمدير النظام." @@ -10845,7 +10885,7 @@ msgid "Company Field" msgstr "" #. Label of the company_logo (Attach Image) field in DocType 'Company' -#: erpnext/public/js/print.js:64 erpnext/setup/doctype/company/company.json +#: erpnext/public/js/print.js:75 erpnext/setup/doctype/company/company.json msgid "Company Logo" msgstr "شعار الشركة" @@ -10867,16 +10907,16 @@ msgstr "عنوان شحن الشركة" msgid "Company Tax ID" msgstr "رقم التعريف الضريبي للشركة" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:620 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:626 msgid "Company and Posting Date is mandatory" msgstr "اسم الشركة وتاريخ النشر إلزامي" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2580 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2584 msgid "Company currencies of both the companies should match for Inter Company Transactions." msgstr "يجب أن تتطابق عملات الشركة لكلتا الشركتين مع معاملات Inter Inter Company." #: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:752 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:753 msgid "Company field is required" msgstr "حقل الشركة مطلوب" @@ -10902,7 +10942,7 @@ msgstr "" msgid "Company name not same" msgstr "اسم الشركة ليس مماثل\\n
    \\nCompany name not same" -#: erpnext/assets/doctype/asset/asset.py:330 +#: erpnext/assets/doctype/asset/asset.py:331 msgid "Company of asset {0} and purchase document {1} doesn't matches." msgstr "شركة الأصل {0} ومستند الشراء {1} غير متطابقين." @@ -10946,7 +10986,7 @@ msgstr "تمت إضافة الشركة {0} أكثر من مرة" msgid "Company {} does not exist yet. Taxes setup aborted." msgstr "الشركة {} غير موجودة بعد. تم إلغاء إعداد الضرائب." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:574 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:575 msgid "Company {} does not match with POS Profile Company {}" msgstr "الشركة {} لا تتطابق مع ملف تعريف نقطة البيع للشركة {}" @@ -10995,7 +11035,7 @@ msgstr "اكتمل بواسطة" msgid "Completed On" msgstr "اكتمل في" -#: erpnext/projects/doctype/task/task.py:185 +#: erpnext/projects/doctype/task/task.py:187 msgid "Completed On cannot be greater than Today" msgstr "لا يمكن أن يتجاوز تاريخ الإنجاز عدد الأيام" @@ -11019,7 +11059,7 @@ msgstr "المشاريع المنجزة" msgid "Completed Qty" msgstr "الكمية المكتملة" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1353 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1368 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "لا يمكن أن تكون الكمية المكتملة أكبر من "الكمية إلى التصنيع"" @@ -11125,6 +11165,11 @@ msgstr "أمثلة على القواعد الشرطية" msgid "Conditions will be applied on all the selected items combined. " msgstr "سيتم تطبيق الشروط على جميع العناصر المختارة مجتمعة." +#. Label of an action in the Onboarding Step 'Review Chart of Accounts' +#: erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json +msgid "Configure Chart of Accounts" +msgstr "" + #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:56 msgid "Configure Product Assembly" msgstr "تكوين تجميع المنتج" @@ -11260,7 +11305,7 @@ msgstr "" #. Log' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:558 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:559 msgid "Consolidated Sales Invoice" msgstr "فاتورة المبيعات الموحدة" @@ -11273,7 +11318,7 @@ msgstr "ميزان المراجعة الموحد" msgid "Consolidated Trial Balance can be generated for Companies having same root Company." msgstr "يمكن إنشاء ميزان مراجعة موحد للشركات التي لها نفس الشركة الأم." -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:153 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:157 msgid "Consolidated Trial balance could not be generated as Exchange Rate from {0} to {1} is not available for {2}." msgstr "تعذر إنشاء ميزان المراجعة الموحد لأن سعر الصرف من {0} إلى {1} غير متوفر لـ {2}." @@ -11356,7 +11401,7 @@ msgstr "تكلفة المواد المستهلكة" msgid "Consumed Qty" msgstr "تستهلك الكمية" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1732 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1744 msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}" msgstr "لا يمكن أن تتجاوز الكمية المستهلكة الكمية المحجوزة للصنف {0}" @@ -11513,7 +11558,7 @@ msgstr "" msgid "Contact Person" msgstr "الشخص الذي يمكن الاتصال به" -#: erpnext/controllers/accounts_controller.py:582 +#: erpnext/controllers/accounts_controller.py:583 msgid "Contact Person does not belong to the {0}" msgstr "جهة الاتصال لا تنتمي إلى {0}" @@ -11666,7 +11711,7 @@ msgstr "مراقبة معاملات الأسهم التاريخية" #: erpnext/manufacturing/doctype/bom_creator_item/bom_creator_item.json #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json -#: erpnext/public/js/utils.js:811 +#: erpnext/public/js/utils.js:876 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/stock/doctype/packed_item/packed_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -11696,19 +11741,19 @@ msgstr "معدل التحويل" msgid "Conversion factor for default Unit of Measure must be 1 in row {0}" msgstr "معامل التحويل الافتراضي لوحدة القياس يجب أن يكون 1 في الصف {0}" -#: erpnext/controllers/stock_controller.py:86 +#: erpnext/controllers/stock_controller.py:127 msgid "Conversion factor for item {0} has been reset to 1.0 as the uom {1} is same as stock uom {2}." msgstr "تمت إعادة تعيين عامل التحويل للعنصر {0} إلى 1.0 لأن وحدة القياس {1} هي نفسها وحدة قياس المخزون {2}." -#: erpnext/controllers/accounts_controller.py:2958 +#: erpnext/controllers/accounts_controller.py:2962 msgid "Conversion rate cannot be 0" msgstr "لا يمكن أن يكون معدل التحويل 0" -#: erpnext/controllers/accounts_controller.py:2965 +#: erpnext/controllers/accounts_controller.py:2969 msgid "Conversion rate is 1.00, but document currency is different from company currency" msgstr "معدل التحويل هو 1.00، لكن عملة المستند تختلف عن عملة الشركة." -#: erpnext/controllers/accounts_controller.py:2961 +#: erpnext/controllers/accounts_controller.py:2965 msgid "Conversion rate must be 1.00 if document currency is same as company currency" msgstr "يجب أن يكون معدل التحويل 1.00 إذا كانت عملة المستند هي نفسها عملة الشركة" @@ -11921,7 +11966,7 @@ msgstr "" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:28 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:47 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:30 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1197 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1239 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:47 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.js:42 #: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:204 @@ -12016,8 +12061,8 @@ msgstr "تم تحديث مركز التكلفة لصفوف الأصناف إلى msgid "Cost Center is a part of Cost Center Allocation, hence cannot be converted to a group" msgstr "يُعد مركز التكلفة جزءًا من تخصيص مركز التكلفة، وبالتالي لا يمكن تحويله إلى مجموعة." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1432 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:896 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1433 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:898 msgid "Cost Center is required in row {0} in Taxes table for type {1}" msgstr "مركز التكلفة مطلوب في الصف {0} في جدول الضرائب للنوع {1}\\n
    \\nCost Center is required in row {0} in Taxes table for type {1}" @@ -12037,11 +12082,11 @@ msgstr "مركز التكلفة مع المعاملات الحالية لا يم msgid "Cost Center {0} cannot be used for allocation as it is used as main cost center in other allocation record." msgstr "لا يمكن استخدام مركز التكلفة {0} للتخصيص لأنه يستخدم كمركز تكلفة رئيسي في سجل تخصيص آخر." -#: erpnext/assets/doctype/asset/asset.py:358 +#: erpnext/assets/doctype/asset/asset.py:359 msgid "Cost Center {} doesn't belong to Company {}" msgstr "مركز التكلفة {} لا ينتمي إلى الشركة {}" -#: erpnext/assets/doctype/asset/asset.py:365 +#: erpnext/assets/doctype/asset/asset.py:366 msgid "Cost Center {} is a group cost center and group cost centers cannot be used in transactions" msgstr "مركز التكلفة {} هو مركز تكلفة جماعي، ولا يمكن استخدام مراكز التكلفة الجماعية في المعاملات." @@ -12083,7 +12128,7 @@ msgstr "تكلفة السلع والمواد المسلمة" msgid "Cost of Goods Sold" msgstr "تكلفة البضاعة المباعة" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:736 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:741 msgid "Cost of Goods Sold Account in Items Table" msgstr "حساب تكلفة البضائع المباعة في جدول الأصناف" @@ -12118,10 +12163,12 @@ msgstr "التكلفة والتأمين والشحن" #. Label of the currency_detail (Section Break) field in DocType 'BOM Creator' #. Label of the costing_section (Section Break) field in DocType 'BOM #. Operation' +#. Label of the costing_tab (Tab Break) field in DocType 'Project' #. Label of the sb_costing (Section Break) field in DocType 'Task' #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/bom_creator/bom_creator.json #: erpnext/manufacturing/doctype/bom_operation/bom_operation.json +#: erpnext/projects/doctype/project/project.json #: erpnext/projects/doctype/task/task.json msgid "Costing" msgstr "" @@ -12160,11 +12207,11 @@ msgstr "تم تحديث حقول التكلفة والفواتير" msgid "Could Not Delete Demo Data" msgstr "تعذر حذف بيانات العرض التوضيحي" -#: erpnext/selling/doctype/quotation/quotation.py:621 +#: erpnext/selling/doctype/quotation/quotation.py:628 msgid "Could not auto create Customer due to the following missing mandatory field(s):" msgstr "تعذر إنشاء العميل تلقائيًا بسبب الحقول الإلزامية التالية المفقودة:" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:688 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:689 msgid "Could not create Credit Note automatically, please uncheck 'Issue Credit Note' and submit again" msgstr "تعذر إنشاء إشعار دائن تلقائيًا ، يُرجى إلغاء تحديد "إشعار ائتمان الإصدار" وإرساله مرة أخرى" @@ -12252,12 +12299,50 @@ msgstr "نوع الكوبون" msgid "Cr" msgstr "Cr" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Asset Category' +#: erpnext/assets/onboarding_step/create_asset_category/create_asset_category.json +msgid "Create Asset Category" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Asset Item' +#: erpnext/assets/onboarding_step/create_asset_item/create_asset_item.json +msgid "Create Asset Item" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Asset Location' +#: erpnext/assets/onboarding_step/create_asset_location/create_asset_location.json +msgid "Create Asset Location" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Bill of Materials' +#: erpnext/manufacturing/onboarding_step/create_bill_of_materials/create_bill_of_materials.json +#: erpnext/subcontracting/onboarding_step/create_bill_of_materials/create_bill_of_materials.json +msgid "Create Bill of Materials" +msgstr "" + #. Label of the create_chart_of_accounts_based_on (Select) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json msgid "Create Chart Of Accounts Based On" msgstr "إنشاء دليل الحسابات استنادا إلى" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Customer' +#: erpnext/selling/onboarding_step/create_customer/create_customer.json +msgid "Create Customer" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Delivery Note' +#: erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json +#: erpnext/stock/onboarding_step/create_delivery_note/create_delivery_note.json +msgid "Create Delivery Note" +msgstr "" + #: erpnext/stock/doctype/delivery_note/delivery_note_list.js:63 msgid "Create Delivery Trip" msgstr "استحداث رحلة تسليم" @@ -12274,6 +12359,22 @@ msgstr "إنشاء سجلات موظف" msgid "Create Employee records." msgstr "إنشاء سجلات الموظفين." +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Existing Asset' +#: erpnext/assets/onboarding_step/create_existing_asset/create_existing_asset.json +msgid "Create Existing Asset" +msgstr "" + +#. Label of an action in the Onboarding Step 'Create Finished Goods' +#: erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json +msgid "Create Finished Good" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/manufacturing/onboarding_step/create_finished_goods/create_finished_goods.json +msgid "Create Finished Goods" +msgstr "" + #. Label of the is_grouped_asset (Check) field in DocType 'Item' #: erpnext/stock/doctype/item/item.json msgid "Create Grouped Asset" @@ -12287,6 +12388,14 @@ msgstr "إنشاء Inter Journal Journal Entry" msgid "Create Invoices" msgstr "إنشاء الفواتير" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Item' +#: erpnext/buying/onboarding_step/create_item/create_item.json +#: erpnext/selling/onboarding_step/create_item/create_item.json +#: erpnext/stock/onboarding_step/create_item/create_item.json +msgid "Create Item" +msgstr "" + #: erpnext/manufacturing/doctype/work_order/work_order.js:206 msgid "Create Job Card" msgstr "إنشاء بطاقة العمل" @@ -12349,6 +12458,16 @@ msgstr "إنشاء عميل جديد" msgid "Create New Lead" msgstr "إنشاء عميل محتمل" +#. Label of an action in the Onboarding Step 'Create Operations' +#: erpnext/manufacturing/onboarding_step/create_operations/create_operations.json +msgid "Create Operation" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/manufacturing/onboarding_step/create_operations/create_operations.json +msgid "Create Operations" +msgstr "" + #: erpnext/crm/doctype/lead/lead.js:161 msgid "Create Opportunity" msgstr "خلق الفرص" @@ -12357,14 +12476,21 @@ msgstr "خلق الفرص" msgid "Create POS Opening Entry" msgstr "إنشاء مدخل فتح نقطة البيع" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Payment Entry' #: erpnext/accounts/doctype/payment_request/payment_request.js:66 +#: erpnext/accounts/onboarding_step/create_payment_entry/create_payment_entry.json msgid "Create Payment Entry" msgstr "إنشاء إدخال الدفع" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:859 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:860 msgid "Create Payment Entry for Consolidated POS Invoices." msgstr "إنشاء إدخال دفع لفواتير نقاط البيع المجمعة." +#: erpnext/public/js/controllers/transaction.js:513 +msgid "Create Payment Request" +msgstr "" + #: erpnext/manufacturing/doctype/work_order/work_order.js:766 msgid "Create Pick List" msgstr "إنشاء قائمة انتقاء" @@ -12373,10 +12499,25 @@ msgstr "إنشاء قائمة انتقاء" msgid "Create Print Format" msgstr "إنشاء تنسيق طباعة" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Project' +#: erpnext/projects/onboarding_step/create_project/create_project.json +msgid "Create Project" +msgstr "" + #: erpnext/crm/doctype/lead/lead_list.js:8 msgid "Create Prospect" msgstr "إنشاء عميل محتمل" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Purchase Invoice' +#: erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json +msgid "Create Purchase Invoice" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Purchase Order' +#: erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json #: erpnext/selling/doctype/sales_order/sales_order.js:1668 #: erpnext/utilities/activation.py:106 msgid "Create Purchase Order" @@ -12386,10 +12527,28 @@ msgstr "إنشاء أمر الشراء" msgid "Create Purchase Orders" msgstr "إنشاء أمر شراء" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Purchase Receipt' +#: erpnext/stock/onboarding_step/create_purchase_receipt/create_purchase_receipt.json +msgid "Create Purchase Receipt" +msgstr "" + #: erpnext/utilities/activation.py:88 msgid "Create Quotation" msgstr "إنشاء اقتباس" +#. Label of an action in the Onboarding Step 'Create Raw Materials' +#: erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json +#: erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json +msgid "Create Raw Material" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/manufacturing/onboarding_step/create_raw_materials/create_raw_materials.json +#: erpnext/subcontracting/onboarding_step/create_raw_materials/create_raw_materials.json +msgid "Create Raw Materials" +msgstr "" + #. Label of the create_receiver_list (Button) field in DocType 'SMS Center' #: erpnext/selling/doctype/sms_center/sms_center.json msgid "Create Receiver List" @@ -12404,12 +12563,19 @@ msgstr "إنشاء إدخالات إعادة النشر" msgid "Create Reposting Entry" msgstr "إنشاء إدخال إعادة نشر" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Sales Invoice' +#: erpnext/accounts/onboarding_step/create_sales_invoice/create_sales_invoice.json #: erpnext/projects/doctype/timesheet/timesheet.js:55 #: erpnext/projects/doctype/timesheet/timesheet.js:231 #: erpnext/projects/doctype/timesheet/timesheet.js:235 +#: erpnext/selling/onboarding_step/create_sales_invoice/create_sales_invoice.json msgid "Create Sales Invoice" msgstr "إنشاء فاتورة مبيعات" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Sales Order' +#: erpnext/selling/onboarding_step/create_sales_order/create_sales_order.json #: erpnext/utilities/activation.py:97 msgid "Create Sales Order" msgstr "إنشاء أمر مبيعات" @@ -12418,23 +12584,75 @@ msgstr "إنشاء أمر مبيعات" msgid "Create Sales Orders to help you plan your work and deliver on-time" msgstr "قم بإنشاء أوامر المبيعات لمساعدتك في تخطيط عملك وتقديمه في الوقت المحدد" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Service Item' +#: erpnext/subcontracting/onboarding_step/create_service_item/create_service_item.json +msgid "Create Service Item" +msgstr "" + #: erpnext/stock/dashboard/item_dashboard.js:283 #: erpnext/stock/doctype/material_request/material_request.js:500 msgid "Create Stock Entry" msgstr "إنشاء إدخال المخزون" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Subcontracted Item' +#: erpnext/subcontracting/onboarding_step/create_subcontracted_item/create_subcontracted_item.json +msgid "Create Subcontracted Item" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Subcontracting Order' +#: erpnext/subcontracting/onboarding_step/create_subcontracting_order/create_subcontracting_order.json +msgid "Create Subcontracting Order" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json +msgid "Create Subcontracting PO" +msgstr "" + +#. Label of an action in the Onboarding Step 'Create Subcontracting PO' +#: erpnext/subcontracting/onboarding_step/create_subcontracting_po/create_subcontracting_po.json +msgid "Create Subcontracting Purchase Order" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/buying/onboarding_step/create_supplier/create_supplier.json +msgid "Create Supplier" +msgstr "" + #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:184 msgid "Create Supplier Quotation" msgstr "إنشاء اقتباس مورد" +#. Label of an action in the Onboarding Step 'Create Tasks' +#: erpnext/projects/onboarding_step/create_tasks/create_tasks.json +msgid "Create Task" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/projects/onboarding_step/create_tasks/create_tasks.json +msgid "Create Tasks" +msgstr "" + #: erpnext/setup/doctype/company/company.js:157 msgid "Create Tax Template" msgstr "إنشاء قالب الضريبة" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Timesheet' +#: erpnext/projects/onboarding_step/create_timesheet/create_timesheet.json #: erpnext/utilities/activation.py:128 msgid "Create Timesheet" msgstr "إنشاء الجدول الزمني" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Transfer Entry' +#: erpnext/stock/onboarding_step/create_transfer_entry/create_transfer_entry.json +msgid "Create Transfer Entry" +msgstr "" + #. Label of the create_user (Button) field in DocType 'Employee' #: erpnext/setup/doctype/employee/employee.json #: erpnext/utilities/activation.py:117 @@ -12450,25 +12668,36 @@ msgstr "إنشاء صلاحية المستخدم" msgid "Create Users" msgstr "إنشاء المستخدمين" -#: erpnext/stock/doctype/item/item.js:879 +#: erpnext/stock/doctype/item/item.js:897 msgid "Create Variant" msgstr "إنشاء متغير" -#: erpnext/stock/doctype/item/item.js:693 -#: erpnext/stock/doctype/item/item.js:737 +#: erpnext/stock/doctype/item/item.js:711 +#: erpnext/stock/doctype/item/item.js:755 msgid "Create Variants" msgstr "إنشاء المتغيرات" +#. Label of an action in the Onboarding Step 'Setup Warehouse' +#: erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json +msgid "Create Warehouses" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Create Work Order' +#: erpnext/manufacturing/onboarding_step/create_work_order/create_work_order.json +msgid "Create Work Order" +msgstr "" + #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:10 msgid "Create Workstation" msgstr "إنشاء محطة عمل" -#: erpnext/stock/doctype/item/item.js:720 -#: erpnext/stock/doctype/item/item.js:872 +#: erpnext/stock/doctype/item/item.js:738 +#: erpnext/stock/doctype/item/item.js:890 msgid "Create a variant with the template image." msgstr "أنشئ نسخة بديلة باستخدام صورة القالب." -#: erpnext/stock/stock_ledger.py:2011 +#: erpnext/stock/stock_ledger.py:2012 msgid "Create an incoming stock transaction for the Item." msgstr "قم بإنشاء حركة مخزون واردة للصنف." @@ -12476,6 +12705,11 @@ msgstr "قم بإنشاء حركة مخزون واردة للصنف." msgid "Create customer quotes" msgstr "إنشاء عروض مسعرة للزبائن" +#. Label of an action in the Onboarding Step 'Create Delivery Note' +#: erpnext/selling/onboarding_step/create_delivery_note/create_delivery_note.json +msgid "Create delivery note" +msgstr "" + #. Label of the create_pr_in_draft_status (Check) field in DocType 'Accounts #. Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -12488,6 +12722,11 @@ msgstr "إنشاء في حالة المسودة" msgid "Create missing customer or supplier." msgstr "إنشاء العملاء أو المورد المفقودين." +#. Label of an action in the Onboarding Step 'Create Supplier' +#: erpnext/buying/onboarding_step/create_supplier/create_supplier.json +msgid "Create supplier" +msgstr "" + #: erpnext/public/js/bulk_transaction_processing.js:14 msgid "Create {0} {1} ?" msgstr "إنشاء {0} {1}؟" @@ -12514,7 +12753,7 @@ msgstr "إنشاء إيصال التسليم ..." msgid "Creating Delivery Schedule..." msgstr "تحديد موعد التسليم..." -#: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py:144 +#: erpnext/accounts/doctype/accounting_dimension/accounting_dimension.py:140 msgid "Creating Dimensions..." msgstr "إنشاء الأبعاد ..." @@ -12536,7 +12775,7 @@ msgstr "إنشاء أمر شراء ..." #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:704 #: erpnext/buying/doctype/purchase_order/purchase_order.js:497 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:73 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:74 msgid "Creating Purchase Receipt ..." msgstr "" @@ -12598,11 +12837,11 @@ msgstr "" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:11 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:84 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:146 -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:451 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:431 #: erpnext/accounts/report/general_ledger/general_ledger.html:93 #: erpnext/accounts/report/purchase_register/purchase_register.py:241 #: erpnext/accounts/report/sales_register/sales_register.py:277 -#: erpnext/accounts/report/trial_balance/trial_balance.py:522 +#: erpnext/accounts/report/trial_balance/trial_balance.py:530 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:212 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.py:34 msgid "Credit" @@ -12742,7 +12981,7 @@ msgstr "أشهر الائتمان" #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:176 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:147 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1220 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1262 #: erpnext/controllers/sales_and_purchase_return.py:453 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:303 #: erpnext/stock/doctype/delivery_note/delivery_note.js:89 @@ -12760,7 +12999,7 @@ msgstr "ملاحظة الائتمان المبلغ" #. Option for the 'Status' (Select) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:275 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:276 msgid "Credit Note Issued" msgstr "الائتمان مذكرة صادرة" @@ -12770,15 +13009,15 @@ msgstr "الائتمان مذكرة صادرة" msgid "Credit Note will update it's own outstanding amount, even if 'Return Against' is specified." msgstr "ستقوم مذكرة الائتمان بتحديث المبلغ المستحق الخاص بها، حتى في حالة تحديد \"الإرجاع مقابل\"." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:685 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:686 msgid "Credit Note {0} has been created automatically" msgstr "تم إنشاء ملاحظة الائتمان {0} تلقائيًا" #. Label of the credit_to (Link) field in DocType 'Purchase Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:379 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:387 -#: erpnext/controllers/accounts_controller.py:2360 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:380 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:388 +#: erpnext/controllers/accounts_controller.py:2361 msgid "Credit To" msgstr "دائن الى" @@ -12978,9 +13217,9 @@ msgstr "لا يمكن تغيير العملة بعد إجراء إدخالات msgid "Currency filters are currently unsupported in Custom Financial Report." msgstr "لا تدعم التقارير المالية المخصصة حاليًا فلاتر العملات." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1587 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1655 -#: erpnext/accounts/utils.py:2457 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1604 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1672 +#: erpnext/accounts/utils.py:2468 msgid "Currency for {0} must be {1}" msgstr "العملة ل {0} يجب أن تكون {1} \\n
    \\nCurrency for {0} must be {1}" @@ -13328,7 +13567,7 @@ msgstr "محددات مخصصة" #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/shipment/shipment.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:384 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:385 #: erpnext/stock/doctype/warehouse/warehouse.json #: erpnext/stock/report/delayed_item_report/delayed_item_report.js:36 #: erpnext/stock/report/delayed_item_report/delayed_item_report.py:121 @@ -13426,7 +13665,7 @@ msgstr "رمز العميل" #. Label of the customer_contact_display (Small Text) field in DocType #. 'Purchase Order' #. Label of the customer_contact (Small Text) field in DocType 'Delivery Stop' -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1191 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1233 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/stock/doctype/delivery_stop/delivery_stop.json msgid "Customer Contact" @@ -13531,7 +13770,7 @@ msgstr "ملاحظات العميل" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:104 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1248 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1290 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:85 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:185 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:56 @@ -13576,10 +13815,6 @@ msgstr "عنصر مجموعة العملاء" msgid "Customer Group Name" msgstr "أسم فئة العميل" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1344 -msgid "Customer Group: {0} does not exist" -msgstr "مجموعة العملاء: {0} غير موجودة" - #. Label of the customer_groups (Table) field in DocType 'POS Profile' #: erpnext/accounts/doctype/pos_profile/pos_profile.json msgid "Customer Groups" @@ -13595,7 +13830,7 @@ msgstr "منتج العميل" msgid "Customer Items" msgstr "منتجات العميل" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1239 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1281 msgid "Customer LPO" msgstr "العميل لبو" @@ -13648,7 +13883,7 @@ msgstr "رقم محمول العميل" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/process_statement_of_accounts_customer/process_statement_of_accounts_customer.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1181 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1223 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:92 #: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:35 @@ -13754,7 +13989,7 @@ msgstr "العملاء المقدمة" msgid "Customer Provided Item Cost" msgstr "تكلفة السلعة المقدمة من العميل" -#: erpnext/setup/doctype/company/company.py:485 +#: erpnext/setup/doctype/company/company.py:486 msgid "Customer Service" msgstr "خدمة العملاء" @@ -13793,12 +14028,12 @@ msgstr "مستودع العميل {0} لا ينتمي إلى العميل {1}." msgid "Customer contact updated successfully." msgstr "تم تحديث جهة اتصال العميل بنجاح." -#: erpnext/support/doctype/warranty_claim/warranty_claim.py:54 +#: erpnext/support/doctype/warranty_claim/warranty_claim.py:55 msgid "Customer is required" msgstr "العميل مطلوب" -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:135 -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:157 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:136 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:158 msgid "Customer isn't enrolled in any Loyalty Program" msgstr "العميل غير مسجل في أي برنامج ولاء" @@ -13811,9 +14046,9 @@ msgstr "عميل أو بند" msgid "Customer required for 'Customerwise Discount'" msgstr "الزبون مطلوب للخصم المعني بالزبائن" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1145 -#: erpnext/selling/doctype/sales_order/sales_order.py:433 -#: erpnext/stock/doctype/delivery_note/delivery_note.py:432 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1146 +#: erpnext/selling/doctype/sales_order/sales_order.py:435 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:433 msgid "Customer {0} does not belong to project {1}" msgstr "العميل {0} لا ينتمي الى المشروع {1}\\n
    \\nCustomer {0} does not belong to project {1}" @@ -14162,11 +14397,11 @@ msgstr "تاجر" #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:10 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:77 #: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:139 -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:444 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:424 #: erpnext/accounts/report/general_ledger/general_ledger.html:92 #: erpnext/accounts/report/purchase_register/purchase_register.py:240 #: erpnext/accounts/report/sales_register/sales_register.py:276 -#: erpnext/accounts/report/trial_balance/trial_balance.py:515 +#: erpnext/accounts/report/trial_balance/trial_balance.py:523 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:205 #: erpnext/accounts/report/voucher_wise_balance/voucher_wise_balance.py:27 msgid "Debit" @@ -14229,7 +14464,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:178 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:147 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1223 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1265 #: erpnext/controllers/sales_and_purchase_return.py:457 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:304 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:45 @@ -14257,13 +14492,13 @@ msgstr "ستقوم مذكرة الخصم بتحديث المبلغ المستح #. Label of the debit_to (Link) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1013 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1024 -#: erpnext/controllers/accounts_controller.py:2360 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1014 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1025 +#: erpnext/controllers/accounts_controller.py:2361 msgid "Debit To" msgstr "الخصم ل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1009 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1010 msgid "Debit To is required" msgstr "مدين الى مطلوب" @@ -14300,11 +14535,11 @@ msgstr "نسبة الدين إلى حقوق الملكية" msgid "Debtor Turnover Ratio" msgstr "نسبة دوران المدينين" -#: erpnext/accounts/party.py:614 +#: erpnext/accounts/party.py:607 msgid "Debtor/Creditor" msgstr "المدين/الدائن" -#: erpnext/accounts/party.py:617 +#: erpnext/accounts/party.py:610 msgid "Debtor/Creditor Advance" msgstr "سلفة المدين/الدائن" @@ -14407,14 +14642,14 @@ msgstr "الحساب الافتراضي المتقدم" #. Label of the default_advance_paid_account (Link) field in DocType 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:314 +#: erpnext/setup/doctype/company/company.py:315 msgid "Default Advance Paid Account" msgstr "الحساب المدفوع مقدماً الافتراضي" #. Label of the default_advance_received_account (Link) field in DocType #. 'Company' #: erpnext/setup/doctype/company/company.json -#: erpnext/setup/doctype/company/company.py:303 +#: erpnext/setup/doctype/company/company.py:304 msgid "Default Advance Received Account" msgstr "الحساب الافتراضي للمقدم المستلم" @@ -14433,15 +14668,15 @@ msgstr "الافتراضي BOM" msgid "Default BOM ({0}) must be active for this item or its template" msgstr "يجب أن تكون قائمة المواد الافتراضية ({0}) نشطة لهذا الصنف أو قوالبه" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2234 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2246 msgid "Default BOM for {0} not found" msgstr "فاتورة المواد ل {0} غير موجودة\\n
    \\nDefault BOM for {0} not found" -#: erpnext/controllers/accounts_controller.py:3941 +#: erpnext/controllers/accounts_controller.py:3974 msgid "Default BOM not found for FG Item {0}" msgstr "لم يتم العثور على قائمة مكونات افتراضية لعنصر المنتج النهائي {0}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2231 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2243 msgid "Default BOM not found for Item {0} and Project {1}" msgstr "لم يتم العثور على قائمة المواد الافتراضية للمادة {0} والمشروع {1}" @@ -15020,8 +15255,8 @@ msgstr "" msgid "Deleting {0} and all associated Common Code documents..." msgstr "حذف {0} وجميع مستندات الكود المشترك المرتبطة بها..." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1097 -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1116 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1101 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1120 msgid "Deletion in Progress!" msgstr "جارٍ الحذف!" @@ -15154,7 +15389,7 @@ msgstr "تسليم" #: erpnext/manufacturing/doctype/master_production_schedule_item/master_production_schedule_item.json #: erpnext/manufacturing/doctype/sales_forecast_item/sales_forecast_item.json #: erpnext/manufacturing/report/material_requirements_planning_report/material_requirements_planning_report.py:1066 -#: erpnext/public/js/utils.js:804 +#: erpnext/public/js/utils.js:869 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:624 #: erpnext/selling/doctype/sales_order/sales_order.js:1486 @@ -15211,7 +15446,7 @@ msgstr "مدير التوصيل" #: erpnext/stock/doctype/delivery_stop/delivery_stop.json #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:52 #: erpnext/stock/doctype/packing_slip/packing_slip.json -#: erpnext/stock/doctype/pick_list/pick_list.js:132 +#: erpnext/stock/doctype/pick_list/pick_list.js:134 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:59 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/shipment_delivery_note/shipment_delivery_note.json @@ -15257,11 +15492,11 @@ msgstr "إشعار التسليم - المنتج المعبأ" msgid "Delivery Note Trends" msgstr "توجهات إشعارات التسليم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1406 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1407 msgid "Delivery Note {0} is not submitted" msgstr "لم يتم اعتماد ملاحظه التسليم {0}\\n
    \\nDelivery Note {0} is not submitted" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1243 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1285 #: erpnext/stock/doctype/delivery_trip/delivery_trip.js:73 msgid "Delivery Notes" msgstr "مذكرات التسليم" @@ -15347,7 +15582,7 @@ msgstr "مستودع تسليم" msgid "Delivery to" msgstr "" -#: erpnext/selling/doctype/sales_order/sales_order.py:452 +#: erpnext/selling/doctype/sales_order/sales_order.py:454 msgid "Delivery warehouse required for stock item {0}" msgstr "مستودع التسليم مطلوب للبند المستودعي {0}\\n
    \\nDelivery warehouse required for stock item {0}" @@ -15404,7 +15639,7 @@ msgstr "رقم قسيمة SLE التابعة" msgid "Dependent Task" msgstr "مهمة تابعة" -#: erpnext/projects/doctype/task/task.py:178 +#: erpnext/projects/doctype/task/task.py:180 msgid "Dependent Task {0} is not a Template Task" msgstr "المهمة التابعة {0} ليست مهمة نموذجية" @@ -15502,7 +15737,7 @@ msgstr "حركة الإهلاك" msgid "Depreciation Entry Posting Status" msgstr "حالة ترحيل قيد الإهلاك" -#: erpnext/assets/doctype/asset/asset.py:1261 +#: erpnext/assets/doctype/asset/asset.py:1262 msgid "Depreciation Entry against asset {0}" msgstr "قيد استهلاك الأصل {0}" @@ -15549,11 +15784,11 @@ msgstr "تاريخ ترحيل الإهلاك" msgid "Depreciation Posting Date cannot be before Available-for-use Date" msgstr "لا يمكن أن يكون تاريخ ترحيل الإهلاك قبل تاريخ الإتاحة للاستخدام" -#: erpnext/assets/doctype/asset/asset.py:387 +#: erpnext/assets/doctype/asset/asset.py:388 msgid "Depreciation Row {0}: Depreciation Posting Date cannot be before Available-for-use Date" msgstr "صف الإهلاك {0}: لا يمكن أن يكون تاريخ ترحيل الإهلاك قبل تاريخ الإتاحة للاستخدام" -#: erpnext/assets/doctype/asset/asset.py:720 +#: erpnext/assets/doctype/asset/asset.py:721 msgid "Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}" msgstr "صف الإهلاك {0}: يجب أن تكون القيمة المتوقعة بعد العمر الافتراضي أكبر من أو تساوي {1}" @@ -15582,7 +15817,7 @@ msgstr "جدول الاهلاك الزمني" msgid "Depreciation Schedule View" msgstr "عرض جدول الإهلاك" -#: erpnext/assets/doctype/asset/asset.py:485 +#: erpnext/assets/doctype/asset/asset.py:486 msgid "Depreciation cannot be calculated for fully depreciated assets" msgstr "لا يمكن حساب الإهلاك للأصول المستهلكة بالكامل" @@ -15662,15 +15897,15 @@ msgstr "الفرق ( المدين - الدائن )" msgid "Difference Account" msgstr "حساب الفرق" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:725 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:730 msgid "Difference Account in Items Table" msgstr "حساب الفرق في جدول البنود" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:714 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:719 msgid "Difference Account must be a Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry" msgstr "يجب أن يكون حساب الفرق حسابًا من نوع الأصول/الخصوم (افتتاح مؤقت)، لأن قيد المخزون هذا هو قيد افتتاحي." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:985 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:989 msgid "Difference Account must be a Asset/Liability type account, since this Stock Reconciliation is an Opening Entry" msgstr "حساب الفرق يجب أن يكون حساب الأصول / حساب نوع الالتزام، حيث يعتبر تسوية المخزون بمثابة مدخل افتتاح\\n
    \\nDifference Account must be a Asset/Liability type account, since this Stock Reconciliation is an Opening Entry" @@ -15698,7 +15933,7 @@ msgstr "مقدار الفرق" msgid "Difference Amount (Company Currency)" msgstr "فروق المبلغ ( عملة الشركة ) ." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:203 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:204 msgid "Difference Amount must be zero" msgstr "مبلغ الفرق يجب أن يكون صفر\\n
    \\nDifference Amount must be zero" @@ -15794,7 +16029,7 @@ msgstr "النفقات المباشرة" msgid "Direct Income" msgstr "إيراد مباشر" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:358 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:359 msgid "Direct return is not allowed for Timesheet." msgstr "لا يُسمح بالإرجاع المباشر لجدول الدوام." @@ -15889,15 +16124,15 @@ msgstr "قم بتعطيل القالب لمنع استخدامه في التقا msgid "Disabled Account Selected" msgstr "تم تحديد حساب معطل" -#: erpnext/stock/utils.py:422 +#: erpnext/stock/utils.py:425 msgid "Disabled Warehouse {0} cannot be used for this transaction." msgstr "لا يمكن استخدام المستودع المعطل {0} لهذه المعاملة." -#: erpnext/controllers/accounts_controller.py:900 +#: erpnext/controllers/accounts_controller.py:901 msgid "Disabled pricing rules since this {} is an internal transfer" msgstr "تم تعطيل قواعد التسعير لأن هذا {} عبارة عن تحويل داخلي" -#: erpnext/controllers/accounts_controller.py:914 +#: erpnext/controllers/accounts_controller.py:915 msgid "Disabled tax included prices since this {} is an internal transfer" msgstr "الأسعار تشمل الضريبة المعطلة لأن هذا {} عبارة عن تحويل داخلي" @@ -16137,7 +16372,7 @@ msgstr "لا يمكن أن يتجاوز الخصم 100%." msgid "Discount must be less than 100" msgstr "يجب أن يكون الخصم أقل من 100" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3340 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3363 msgid "Discount of {} applied as per Payment Term" msgstr "يتم تطبيق خصم بقيمة {} وفقًا لشروط الدفع." @@ -16209,7 +16444,7 @@ msgstr "سبب تقديري" msgid "Dislikes" msgstr "يكره" -#: erpnext/setup/doctype/company/company.py:479 +#: erpnext/setup/doctype/company/company.py:480 msgid "Dispatch" msgstr "ارسال" @@ -16485,8 +16720,8 @@ msgstr "هل ترغب في تقديم طلب المواد" msgid "Do you want to submit the stock entry?" msgstr "هل ترغب في إرسال بيانات المخزون؟" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:180 -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:443 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:182 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:447 msgid "DocType {0} does not exist" msgstr "نوع المستند {0} غير موجود" @@ -16537,7 +16772,7 @@ msgstr "نوع الوثيقة" msgid "Document Type already used as a dimension" msgstr "" -#: erpnext/setup/install.py:188 +#: erpnext/setup/install.py:189 msgid "Documentation" msgstr "الوثائق" @@ -16787,7 +17022,7 @@ msgstr "نوع الطلب" msgid "Duplicate Customer Group" msgstr "مجموعة عملاء مكررة" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:188 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:190 msgid "Duplicate DocType" msgstr "" @@ -16795,7 +17030,7 @@ msgstr "" msgid "Duplicate Entry. Please check Authorization Rule {0}" msgstr "إدخال مكرر. يرجى التحقق من قاعدة التخويل {0}" -#: erpnext/assets/doctype/asset/asset.py:414 +#: erpnext/assets/doctype/asset/asset.py:415 msgid "Duplicate Finance Book" msgstr "دفتر التمويل المكرر" @@ -16816,20 +17051,24 @@ msgstr "تم العثور على مكون تشغيل مكرر {0} في مكون msgid "Duplicate POS Fields" msgstr "حقول نقاط البيع المكررة" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:104 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:106 #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:64 msgid "Duplicate POS Invoices found" msgstr "تم العثور على فواتير نقاط بيع مكررة" +#: erpnext/accounts/doctype/payment_request/payment_request.py:133 +msgid "Duplicate Payment Schedule selected" +msgstr "" + #: erpnext/projects/doctype/project/project.js:83 msgid "Duplicate Project with Tasks" msgstr "مشروع مكرر مع المهام" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:157 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:159 msgid "Duplicate Sales Invoices found" msgstr "تم العثور على فواتير مبيعات مكررة" -#: erpnext/stock/serial_batch_bundle.py:1455 +#: erpnext/stock/serial_batch_bundle.py:1463 msgid "Duplicate Serial Number Error" msgstr "خطأ في الرقم التسلسلي المكرر" @@ -16845,7 +17084,7 @@ msgstr "تم العثور على مجموعة عملاء مكررة في جدو msgid "Duplicate entry against the item code {0} and manufacturer {1}" msgstr "إدخال مكرر مقابل رمز العنصر {0} والشركة المصنعة {1}" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:187 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:189 msgid "Duplicate entry: {0}{1}" msgstr "" @@ -16957,7 +17196,7 @@ msgstr "كل عملية" msgid "Earliest" msgstr "أولا" -#: erpnext/stock/report/stock_balance/stock_balance.py:518 +#: erpnext/stock/report/stock_balance/stock_balance.py:591 msgid "Earliest Age" msgstr "أقدم عمر" @@ -16978,7 +17217,7 @@ msgstr "سعة التحرير" msgid "Edit Cart" msgstr "تعديل سلة التسوق" -#: erpnext/controllers/item_variant.py:155 +#: erpnext/controllers/item_variant.py:161 msgid "Edit Not Allowed" msgstr "تحرير غير مسموح به" @@ -17105,7 +17344,7 @@ msgstr "إيلز (المملكة المتحدة)" msgid "Email Address (required)" msgstr "" -#: erpnext/crm/doctype/lead/lead.py:164 +#: erpnext/crm/doctype/lead/lead.py:166 msgid "Email Address must be unique, it is already used in {0}" msgstr "يجب أن يكون عنوان البريد الإلكتروني فريدًا، وهو مستخدم بالفعل في {0}" @@ -17166,7 +17405,7 @@ msgstr "إيصال البريد الإلكتروني" msgid "Email Sent" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:359 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:372 msgid "Email Sent to Supplier {0}" msgstr "تم إرسال بريد إلكتروني إلى المورد {0}" @@ -17357,6 +17596,10 @@ msgstr "معرف مستخدم الموظف" msgid "Employee cannot report to himself." msgstr "الموظف لا يمكن أن يقدم تقريرا إلى نفسه.\\n
    \\nEmployee cannot report to himself." +#: erpnext/setup/doctype/employee/employee.py:451 +msgid "Employee is required" +msgstr "" + #: erpnext/assets/doctype/asset_movement/asset_movement.py:109 msgid "Employee is required while issuing Asset {0}" msgstr "الموظف مطلوب أثناء إصدار الأصول {0}" @@ -17370,6 +17613,10 @@ msgstr "الموظف {0} لا ينتمي إلى الشركة {1}" msgid "Employee {0} is currently working on another workstation. Please assign another employee." msgstr "الموظف {0} يعمل حاليًا على محطة عمل أخرى. يرجى تعيين موظف آخر." +#: erpnext/setup/doctype/employee/employee.py:476 +msgid "Employee {0} not found" +msgstr "" + #: erpnext/manufacturing/doctype/workstation/workstation.js:351 msgid "Employees" msgstr "" @@ -17378,7 +17625,7 @@ msgstr "" msgid "Empty" msgstr "فارغة" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:752 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:756 msgid "Empty To Delete List" msgstr "" @@ -17521,6 +17768,18 @@ msgstr "تمكين المخزون الدائم" msgid "Enable Provisional Accounting For Non Stock Items" msgstr "تفعيل المحاسبة المؤقتة للعناصر غير المخزنية" +#. Label of the enable_separate_reposting_for_gl (Check) field in DocType +#. 'Stock Reposting Settings' +#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json +msgid "Enable Separate Reposting for GL" +msgstr "" + +#. Label of the enable_serial_and_batch_no_for_item (Check) field in DocType +#. 'Stock Settings' +#: erpnext/stock/doctype/stock_settings/stock_settings.json +msgid "Enable Serial / Batch No for Item" +msgstr "" + #. Label of the enable_stock_reservation (Check) field in DocType 'Stock #. Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json @@ -17632,7 +17891,7 @@ msgstr "لا يمكن أن يكون تاريخ الانتهاء قبل تاري msgid "End Time" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:310 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:311 msgid "End Transit" msgstr "نهاية النقل" @@ -17699,7 +17958,7 @@ msgstr "ضمان التسليم على أساس المسلسل المنتجة" msgid "Enter API key in Google Settings." msgstr "أدخل مفتاح API في إعدادات Google." -#: erpnext/public/js/print.js:51 +#: erpnext/public/js/print.js:62 msgid "Enter Company Details" msgstr "أدخل تفاصيل الشركة" @@ -17745,7 +18004,7 @@ msgstr "أدخل اسمًا لقائمة العطلات هذه." msgid "Enter amount to be redeemed." msgstr "أدخل المبلغ المراد استرداده." -#: erpnext/stock/doctype/item/item.js:1041 +#: erpnext/stock/doctype/item/item.js:1059 msgid "Enter an Item Code, the name will be auto-filled the same as Item Code on clicking inside the Item Name field." msgstr "أدخل رمز الصنف، وسيتم ملء الاسم تلقائيًا بنفس رمز الصنف عند النقر داخل حقل اسم الصنف." @@ -17761,7 +18020,7 @@ msgstr "أدخل رقم هاتف العميل" msgid "Enter date to scrap asset" msgstr "أدخل التاريخ لإلغاء الأصل" -#: erpnext/assets/doctype/asset/asset.py:483 +#: erpnext/assets/doctype/asset/asset.py:484 msgid "Enter depreciation details" msgstr "أدخل تفاصيل الاستهلاك" @@ -17791,7 +18050,7 @@ msgstr "أدخل اسم المستفيد قبل الإرسال." msgid "Enter the name of the bank or lending institution before submitting." msgstr "أدخل اسم البنك أو المؤسسة المقرضة قبل الإرسال." -#: erpnext/stock/doctype/item/item.js:1067 +#: erpnext/stock/doctype/item/item.js:1085 msgid "Enter the opening stock units." msgstr "أدخل وحدات المخزون الافتتاحي." @@ -17836,7 +18095,7 @@ msgstr "نوع الدخول" #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/report/account_balance/account_balance.js:29 #: erpnext/accounts/report/account_balance/account_balance.js:45 -#: erpnext/accounts/report/balance_sheet/balance_sheet.py:253 +#: erpnext/accounts/report/balance_sheet/balance_sheet.py:254 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:306 msgid "Equity" msgstr "حقوق الملكية" @@ -17888,7 +18147,7 @@ msgstr "حدث خطأ أثناء ترحيل قيود الإهلاك" msgid "Error while processing deferred accounting for {0}" msgstr "حدث خطأ أثناء معالجة المحاسبة المؤجلة لـ {0}" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:523 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:531 msgid "Error while reposting item valuation" msgstr "حدث خطأ أثناء إعادة نشر تقييم السلعة" @@ -17900,7 +18159,7 @@ msgstr "خطأ: هذا الأصل لديه بالفعل {0} فترة استهل "\t\t\t\t\tيجب أن يكون تاريخ \"بدء الاستهلاك\" بعد {1} فترة على الأقل من تاريخ \"جاهز للاستخدام\".\n" "\t\t\t\t\tيرجى تصحيح التواريخ وفقًا لذلك." -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:983 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:987 msgid "Error: {0} is mandatory field" msgstr "الخطأ: {0} هو حقل إلزامي" @@ -17962,7 +18221,7 @@ msgstr "مثال: ABCD.#####\n" msgid "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings." msgstr "مثال: ABCD. #####. إذا تم ضبط المسلسل ولم يتم ذكر رقم الدفعة في المعاملات ، فسيتم إنشاء رقم الدفعة تلقائيًا استنادًا إلى هذه السلسلة. إذا كنت تريد دائمًا الإشارة صراحة إلى Batch No لهذا العنصر ، فاترك هذا فارغًا. ملاحظة: سيأخذ هذا الإعداد الأولوية على بادئة Naming Series في إعدادات المخزون." -#: erpnext/stock/stock_ledger.py:2277 +#: erpnext/stock/stock_ledger.py:2276 msgid "Example: Serial No {0} reserved in {1}." msgstr "مثال: الرقم التسلسلي {0} محجوز في {1}." @@ -18012,12 +18271,12 @@ msgstr "الربح أو الخسارة في الصرف" #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json #: erpnext/accounts/doctype/sales_invoice_advance/sales_invoice_advance.json -#: erpnext/setup/doctype/company/company.py:672 +#: erpnext/setup/doctype/company/company.py:673 msgid "Exchange Gain/Loss" msgstr "أرباح / خسائر الناتجة عن صرف العملة" -#: erpnext/controllers/accounts_controller.py:1772 -#: erpnext/controllers/accounts_controller.py:1856 +#: erpnext/controllers/accounts_controller.py:1773 +#: erpnext/controllers/accounts_controller.py:1857 msgid "Exchange Gain/Loss amount has been booked through {0}" msgstr "تم تسجيل مبلغ الربح/الخسارة من خلال {0}" @@ -18117,7 +18376,7 @@ msgstr "يجب أن يكون سعر الصرف نفس {0} {1} ({2})" msgid "Excise Entry" msgstr "الدخول المكوس" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1412 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1409 msgid "Excise Invoice" msgstr "المكوس الفاتورة" @@ -18231,7 +18490,7 @@ msgstr "تاريخ الإغلاق المتوقع" msgid "Expected Delivery Date" msgstr "تاريخ التسليم المتوقع" -#: erpnext/selling/doctype/sales_order/sales_order.py:414 +#: erpnext/selling/doctype/sales_order/sales_order.py:416 msgid "Expected Delivery Date should be after Sales Order Date" msgstr "يجب أن يكون تاريخ التسليم المتوقع بعد تاريخ أمر المبيعات" @@ -18305,15 +18564,15 @@ msgstr "القيمة المتوقعة بعد حياة مفيدة" #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.json -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:605 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:606 #: erpnext/accounts/report/account_balance/account_balance.js:28 #: erpnext/accounts/report/deferred_revenue_and_expense/deferred_revenue_and_expense.js:89 -#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:182 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:183 #: erpnext/accounts/report/profitability_analysis/profitability_analysis.py:199 msgid "Expense" msgstr "نفقة" -#: erpnext/controllers/stock_controller.py:900 +#: erpnext/controllers/stock_controller.py:941 msgid "Expense / Difference account ({0}) must be a 'Profit or Loss' account" msgstr "حساب نفقات / قروق ({0}) يجب ان يكون حساب ارباح و خسائر" @@ -18361,7 +18620,7 @@ msgstr "حساب نفقات / قروق ({0}) يجب ان يكون حساب ار msgid "Expense Account" msgstr "حساب النفقات" -#: erpnext/controllers/stock_controller.py:880 +#: erpnext/controllers/stock_controller.py:921 msgid "Expense Account Missing" msgstr "حساب المصاريف مفقود" @@ -18376,13 +18635,13 @@ msgstr "" msgid "Expense Head" msgstr "عنوان المصروف" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:499 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:523 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:543 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:500 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:524 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:544 msgid "Expense Head Changed" msgstr "تغيير رأس المصاريف" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:601 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:602 msgid "Expense account is mandatory for item {0}" msgstr "اجباري حساب النفقات للصنف {0}" @@ -18407,8 +18666,8 @@ msgstr "النفقات المدرجة في تقييم الأصول" msgid "Expenses Included In Valuation" msgstr "المصروفات متضمنة في تقييم السعر" -#: erpnext/stock/doctype/pick_list/pick_list.py:271 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:408 +#: erpnext/stock/doctype/pick_list/pick_list.py:273 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:409 msgid "Expired Batches" msgstr "دفعات منتهية الصلاحية" @@ -18442,7 +18701,7 @@ msgstr "انتهاء (في يوم)" msgid "Expiry Date" msgstr "تاريخ انتهاء الصلاحية" -#: erpnext/stock/doctype/batch/batch.py:219 +#: erpnext/stock/doctype/batch/batch.py:220 msgid "Expiry Date Mandatory" msgstr "تاريخ الانتهاء إلزامي" @@ -18596,7 +18855,7 @@ msgstr "أخفق إعداد الشركة" msgid "Failed to setup defaults" msgstr "فشل في إعداد الإعدادات الافتراضية" -#: erpnext/setup/doctype/company/company.py:869 +#: erpnext/setup/doctype/company/company.py:870 msgid "Failed to setup defaults for country {0}. Please contact support." msgstr "فشل إعداد الإعدادات الافتراضية للبلد {0}. يرجى الاتصال بالدعم." @@ -18657,7 +18916,7 @@ msgstr "جلب البيانات بناءً على" msgid "Fetch Customers" msgstr "جلب العملاء" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:80 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:82 msgid "Fetch Items from Warehouse" msgstr "جلب العناصر من المستودع" @@ -18696,7 +18955,7 @@ msgid "Fetch Value From" msgstr "استرجاع القيمة من" #: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:729 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:730 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "جلب BOM انفجرت (بما في ذلك المجالس الفرعية)" @@ -18717,7 +18976,7 @@ msgid "Fetching Sales Orders..." msgstr "جلب طلبات المبيعات..." #: erpnext/accounts/doctype/dunning/dunning.js:135 -#: erpnext/public/js/controllers/transaction.js:1489 +#: erpnext/public/js/controllers/transaction.js:1590 msgid "Fetching exchange rates ..." msgstr "جلب أسعار الصرف ..." @@ -18725,7 +18984,7 @@ msgstr "جلب أسعار الصرف ..." msgid "Fetching..." msgstr "جارٍ الجلب..." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:222 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:224 msgid "Field '{0}' is not a valid Company link field for DocType {1}" msgstr "" @@ -18747,15 +19006,15 @@ msgstr "الحقل في المعاملات المصرفية" msgid "Fields will be copied over only at time of creation." msgstr "سيتم نسخ الحقول فقط في وقت الإنشاء." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1064 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1068 msgid "File does not belong to this Transaction Deletion Record" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1058 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1062 msgid "File not found" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1072 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1076 msgid "File not found on server" msgstr "" @@ -18990,7 +19249,7 @@ msgstr "تم الانتهاء من المنتج بنجاح." #. Service Item' #. Label of the fg_item (Link) field in DocType 'Subcontracting Order Service #. Item' -#: erpnext/public/js/utils.js:830 +#: erpnext/public/js/utils.js:895 #: erpnext/subcontracting/doctype/subcontracting_inward_order_service_item/subcontracting_inward_order_service_item.json #: erpnext/subcontracting/doctype/subcontracting_order_service_item/subcontracting_order_service_item.json msgid "Finished Good Item" @@ -19003,7 +19262,7 @@ msgstr "منتج نهائي جيد" msgid "Finished Good Item Code" msgstr "انتهى رمز السلعة جيدة" -#: erpnext/public/js/utils.js:848 +#: erpnext/public/js/utils.js:913 msgid "Finished Good Item Qty" msgstr "الكمية من المنتج النهائي" @@ -19016,15 +19275,15 @@ msgstr "الكمية من المنتج النهائي" msgid "Finished Good Item Quantity" msgstr "المنتج النهائي الجيد الكمية" -#: erpnext/controllers/accounts_controller.py:3927 +#: erpnext/controllers/accounts_controller.py:3960 msgid "Finished Good Item is not specified for service item {0}" msgstr "لم يتم تحديد المنتج النهائي لعنصر الخدمة {0}" -#: erpnext/controllers/accounts_controller.py:3944 +#: erpnext/controllers/accounts_controller.py:3977 msgid "Finished Good Item {0} Qty can not be zero" msgstr "المنتج النهائي {0} لا يمكن أن تكون الكمية صفرًا" -#: erpnext/controllers/accounts_controller.py:3938 +#: erpnext/controllers/accounts_controller.py:3971 msgid "Finished Good Item {0} must be a sub-contracted item" msgstr "يجب أن يكون المنتج النهائي {0} منتجًا تم التعاقد عليه من الباطن" @@ -19069,7 +19328,7 @@ msgstr "يجب أن يكون المنتج النهائي {0} منتجًا متو msgid "Finished Good {0} must be a sub-contracted item." msgstr "يجب أن يكون المنتج النهائي {0} عنصرًا تم التعاقد عليه من الباطن." -#: erpnext/setup/doctype/company/company.py:384 +#: erpnext/setup/doctype/company/company.py:385 msgid "Finished Goods" msgstr "السلع تامة الصنع" @@ -19110,7 +19369,7 @@ msgstr "مستودع البضائع الجاهزة" msgid "Finished Goods based Operating Cost" msgstr "تكلفة التشغيل بناءً على المنتجات النهائية" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1671 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1676 msgid "Finished Item {0} does not match with Work Order {1}" msgstr "المنتج النهائي {0} لا يتطابق مع أمر العمل {1}" @@ -19214,7 +19473,7 @@ msgstr "السنة المالية للشركة" msgid "Fiscal Year Details" msgstr "" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:47 +#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:53 msgid "Fiscal Year End Date should be one year after Fiscal Year Start Date" msgstr "يجب أن يكون تاريخ انتهاء السنة المالية بعد سنة واحدة من تاريخ بدء السنة المالية" @@ -19254,7 +19513,7 @@ msgstr "الأصول الثابتة" #. Capitalization Asset Item' #. Label of the fixed_asset_account (Link) field in DocType 'Asset Category #. Account' -#: erpnext/assets/doctype/asset/asset.py:901 +#: erpnext/assets/doctype/asset/asset.py:902 #: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json #: erpnext/assets/doctype/asset_category_account/asset_category_account.json msgid "Fixed Asset Account" @@ -19419,7 +19678,7 @@ msgstr "للمورد الافتراضي (اختياري)" msgid "For Item" msgstr "للمنتج" -#: erpnext/controllers/stock_controller.py:1559 +#: erpnext/controllers/stock_controller.py:1600 msgid "For Item {0} cannot be received more than {1} qty against the {2} {3}" msgstr "لا يمكن استلام أكثر من الكمية {1} من المنتج {0} مقابل الكمية {2} {3}" @@ -19450,7 +19709,7 @@ msgstr "لائحة الأسعار" msgid "For Production" msgstr "للإنتاج" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:837 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:842 msgid "For Quantity (Manufactured Qty) is mandatory" msgstr "للكمية (الكمية المصنعة) إلزامية\\n
    \\nFor Quantity (Manufactured Qty) is mandatory" @@ -19460,7 +19719,7 @@ msgstr "للكمية (الكمية المصنعة) إلزامية\\n
    \\nFor Q msgid "For Raw Materials" msgstr "للمواد الخام" -#: erpnext/controllers/accounts_controller.py:1438 +#: erpnext/controllers/accounts_controller.py:1439 msgid "For Return Invoices with Stock effect, '0' qty Items are not allowed. Following rows are affected: {0}" msgstr "بالنسبة لفواتير الإرجاع ذات تأثير المخزون، لا يُسمح بوجود عناصر بكمية '0'. تتأثر الصفوف التالية: {0}" @@ -19518,7 +19777,7 @@ msgstr "كم تنفق = 1 نقطة الولاء" msgid "For individual supplier" msgstr "عن مورد فردي" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:330 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:372 msgid "For item {0}, only {1} asset have been created or linked to {2}. Please create or link {3} more asset with the respective document." msgstr "" @@ -19530,13 +19789,13 @@ msgstr "بالنسبة للعنصر {0}، يجب أن يكون السعر رقم msgid "For operation {0} at row {1}, please add raw materials or set a BOM against it." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2591 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2603 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})" msgstr "بالنسبة للعملية {0}: لا يمكن أن تكون الكمية ({1}) أكبر من الكمية المعلقة ({2})." #: erpnext/projects/doctype/project/project.js:208 -msgid "For project {0}, update your status" -msgstr "بالنسبة للمشروع {0}، قم بتحديث حالتك" +msgid "For project - {0}, update your status" +msgstr "" #. Description of the 'Parent Warehouse' (Link) field in DocType 'Master #. Production Schedule' @@ -19547,7 +19806,7 @@ msgstr "بالنسبة للمشروع {0}، قم بتحديث حالتك" msgid "For projected and forecast quantities, the system will consider all child warehouses under the selected parent warehouse." msgstr "بالنسبة للكميات المتوقعة والمتنبأ بها، سيأخذ النظام في الاعتبار جميع المستودعات الفرعية التابعة للمستودع الرئيسي المحدد." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1703 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1708 msgid "For quantity {0} should not be greater than allowed quantity {1}" msgstr "يجب ألا تتجاوز الكمية {0} الكمية المسموح بها {1}" @@ -19556,7 +19815,7 @@ msgstr "يجب ألا تتجاوز الكمية {0} الكمية المسموح msgid "For reference" msgstr "للرجوع إليها" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1548 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1552 #: erpnext/public/js/controllers/accounts.js:204 msgid "For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included" msgstr "بالنسبة للصف {0} في {1}، يجب تضمين الصف {2} في سعر الصنف. لإضافة الصف {3} إلى سعر الصنف، يجب أيضًا إضافة الصف {3}." @@ -19580,20 +19839,20 @@ msgstr "بالنسبة لشرط "تطبيق القاعدة على أخرى& msgid "For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes" msgstr "لتسهيل الأمر على العملاء، يمكن استخدام هذه الرموز في نماذج الطباعة مثل الفواتير وإشعارات التسليم." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:978 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:983 msgid "For the item {0}, the consumed quantity should be {1} according to the BOM {2}." msgstr "" -#: erpnext/public/js/controllers/transaction.js:1299 +#: erpnext/public/js/controllers/transaction.js:1400 msgctxt "Clear payment terms template and/or payment schedule when due date is changed" msgid "For the new {0} to take effect, would you like to clear the current {1}?" msgstr "لكي يسري مفعول {0} الجديد، هل ترغب في مسح {1}الحالي؟" -#: erpnext/controllers/stock_controller.py:401 +#: erpnext/controllers/stock_controller.py:442 msgid "For the {0}, no stock is available for the return in the warehouse {1}." msgstr "بالنسبة لـ {0}، لا يوجد مخزون متاح للإرجاع في المستودع {1}." -#: erpnext/controllers/sales_and_purchase_return.py:1238 +#: erpnext/controllers/sales_and_purchase_return.py:1245 msgid "For the {0}, the quantity is required to make the return entry" msgstr "بالنسبة لـ {0}، الكمية مطلوبة لإجراء قيد الإرجاع" @@ -19621,8 +19880,8 @@ msgstr "الكمية المتوقعة" msgid "Forecasting" msgstr "" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:280 -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:281 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:254 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:255 #: erpnext/accounts/report/consolidated_trial_balance/test_consolidated_trial_balance.py:88 msgid "Foreign Currency Translation Reserve" msgstr "احتياطي ترجمة العملات الأجنبية" @@ -19661,7 +19920,7 @@ msgstr "مشاركات المنتدى" msgid "Forum URL" msgstr "رابط المنتدى" -#: erpnext/setup/install.py:200 +#: erpnext/setup/install.py:201 msgid "Frappe School" msgstr "مدرسة فرابيه" @@ -20156,14 +20415,14 @@ msgstr "العقد الإضافية التي يمكن أن تنشأ إلا في #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:188 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:155 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1235 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1277 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:177 msgid "Future Payment Amount" msgstr "مبلغ الدفع المستقبلي" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:187 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:154 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1234 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1276 msgid "Future Payment Ref" msgstr "الدفع في المستقبل المرجع" @@ -20186,7 +20445,7 @@ msgid "GENERAL LEDGER" msgstr "دفتر الأستاذ العام" #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:170 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:238 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:250 msgid "GL Balance" msgstr "GL Balance" @@ -20254,7 +20513,7 @@ msgstr "الربح/الخسارة من إعادة التقييم" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:134 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:220 -#: erpnext/setup/doctype/company/company.py:680 +#: erpnext/setup/doctype/company/company.py:681 msgid "Gain/Loss on Asset Disposal" msgstr "الربح / الخسارة عند التخلص من الأصول" @@ -20368,7 +20627,7 @@ msgstr "إنشاء قيد إغلاق المخزون" msgid "Generate To Delete List" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:470 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:474 msgid "Generate To Delete list first" msgstr "" @@ -20475,9 +20734,9 @@ msgstr "الحصول على مواقع البند" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1125 #: erpnext/buying/doctype/purchase_order/purchase_order.js:540 #: erpnext/buying/doctype/purchase_order/purchase_order.js:563 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:376 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:398 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:443 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:383 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:405 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:450 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:75 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:108 #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:80 @@ -20495,12 +20754,12 @@ msgstr "الحصول على مواقع البند" #: erpnext/stock/doctype/material_request/material_request.js:238 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:144 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:244 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:351 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:398 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:431 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:522 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:696 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:164 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:352 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:399 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:432 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:523 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:697 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:165 msgid "Get Items From" msgstr "الحصول على البنود من" @@ -20515,12 +20774,12 @@ msgid "Get Items for Purchase Only" msgstr "احصل على المنتجات للشراء فقط" #: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:732 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:745 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:733 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:746 msgid "Get Items from BOM" msgstr "تنزيل الاصناف من BOM" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:415 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:422 msgid "Get Items from Material Requests against this Supplier" msgstr "الحصول على عناصر من طلبات المواد ضد هذا المورد" @@ -20610,12 +20869,12 @@ msgstr "احصل على الأسهم" msgid "Get Sub Assembly Items" msgstr "الحصول على عناصر التجميع الفرعية" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:457 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:477 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:464 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:484 msgid "Get Suppliers" msgstr "الحصول على الموردين" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:481 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:488 msgid "Get Suppliers By" msgstr "الحصول على الموردين من قبل" @@ -20636,7 +20895,7 @@ msgstr "الحصول على مدخلات لم تتم تسويتها" msgid "Get stops from" msgstr "احصل على نقاط التوقف من" -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:194 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:195 msgid "Getting Scrap Items" msgstr "الحصول على مواد خردة" @@ -20682,7 +20941,7 @@ msgstr "الأهداف" msgid "Goods" msgstr "البضائع" -#: erpnext/setup/doctype/company/company.py:385 +#: erpnext/setup/doctype/company/company.py:386 #: erpnext/stock/doctype/stock_entry/stock_entry_list.js:21 msgid "Goods In Transit" msgstr "البضائع في العبور" @@ -20691,7 +20950,7 @@ msgstr "البضائع في العبور" msgid "Goods Transferred" msgstr "نقل البضائع" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2221 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2226 msgid "Goods are already received against the outward entry {0}" msgstr "تم استلام البضائع بالفعل مقابل الإدخال الخارجي {0}" @@ -20800,6 +21059,7 @@ msgstr "غرام/لتر" #. Option for the 'Based On' (Select) field in DocType 'Authorization Rule' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Delivery Note' +#. Label of the base_grand_total (Currency) field in DocType 'Delivery Note' #. Label of the grand_total (Currency) field in DocType 'Delivery Note' #. Label of the grand_total (Currency) field in DocType 'Delivery Stop' #. Label of the grand_total (Currency) field in DocType 'Landed Cost Purchase @@ -20844,11 +21104,9 @@ msgstr "المجموع الإجمالي" #. Label of the base_grand_total (Currency) field in DocType 'POS Invoice' #. Label of the base_grand_total (Currency) field in DocType 'Supplier #. Quotation' -#. Label of the base_grand_total (Currency) field in DocType 'Delivery Note' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:169 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json -#: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Grand Total (Company Currency)" msgstr "المجموع الكلي (العملات شركة)" @@ -20856,6 +21114,10 @@ msgstr "المجموع الكلي (العملات شركة)" msgid "Grand Total (Transaction Currency)" msgstr "" +#: erpnext/accounts/doctype/payment_request/payment_request.py:125 +msgid "Grand Total must match sum of Payment References" +msgstr "" + #. Label of the grant_commission (Check) field in DocType 'POS Invoice Item' #. Label of the grant_commission (Check) field in DocType 'Sales Invoice Item' #. Label of the grant_commission (Check) field in DocType 'Sales Order Item' @@ -20869,7 +21131,7 @@ msgstr "" msgid "Grant Commission" msgstr "لجنة المنح" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:902 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:906 msgid "Greater Than Amount" msgstr "أكبر من المبلغ" @@ -20980,7 +21242,7 @@ msgstr "عقدة المجموعة" msgid "Group Same Items" msgstr "تجميع العناصر المتشابهة" -#: erpnext/stock/doctype/stock_settings/stock_settings.py:120 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:142 msgid "Group Warehouses cannot be used in transactions. Please change the value of {0}" msgstr "لا يمكن استخدام مستودعات المجموعة في المعاملات. يرجى تغيير قيمة {0}" @@ -21009,7 +21271,7 @@ msgstr "التجميع حسب طلب المبيعات" msgid "Group by Voucher" msgstr "المجموعة بواسطة قسيمة" -#: erpnext/stock/utils.py:416 +#: erpnext/stock/utils.py:419 msgid "Group node warehouse is not allowed to select for transactions" msgstr "لا يسمح مستودع عقدة مجموعة لتحديد للمعاملات" @@ -21285,7 +21547,7 @@ msgstr "يساعدك ذلك على توزيع الميزانية/الهدف عل msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "فيما يلي سجلات الأخطاء الخاصة بإدخالات الإهلاك الفاشلة المذكورة أعلاه: {0}" -#: erpnext/stock/stock_ledger.py:1996 +#: erpnext/stock/stock_ledger.py:1997 msgid "Here are the options to proceed:" msgstr "فيما يلي الخيارات المتاحة للمتابعة:" @@ -21313,7 +21575,7 @@ msgstr "هنا، يتم ملء أيام إجازاتك الأسبوعية مسب msgid "Hertz" msgstr "هيرتز" -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:525 +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:533 msgid "Hi," msgstr "أهلاً،" @@ -21507,7 +21769,7 @@ msgstr "كيفية تنسيق وعرض القيم في التقرير المال msgid "Hrs" msgstr "ساعات" -#: erpnext/setup/doctype/company/company.py:491 +#: erpnext/setup/doctype/company/company.py:492 msgid "Human Resources" msgstr "الموارد البشرية" @@ -21772,8 +22034,8 @@ msgstr "في حال التفعيل، سيتم تعطيل تقريب إجمالي #. Description of the 'Allow Internal Transfers at Arm's Length Price' (Check) #. field in DocType 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json -msgid "If enabled, the item rate won't adjust to the valuation rate during internal transfers, but accounting will still use the valuation rate." -msgstr "في حالة التفعيل، لن يتم تعديل سعر البند وفقًا لسعر التقييم أثناء التحويلات الداخلية، ولكن ستظل المحاسبة تستخدم سعر التقييم." +msgid "If enabled, the item rate won't adjust to the valuation rate during internal transfers, but accounting will still use the valuation rate. This will allow the user to specify a different rate for printing or taxation purposes." +msgstr "" #. Description of the 'Validate Material Transfer Warehouses' (Check) field in #. DocType 'Stock Settings' @@ -21867,7 +22129,7 @@ msgstr "إذا استمرت قواعد التسعير المتعددة في ال msgid "If no taxes are set, and Taxes and Charges Template is selected, the system will automatically apply the taxes from the chosen template." msgstr "إذا لم يتم تحديد أي ضرائب، وتم اختيار نموذج الضرائب والرسوم، فسيقوم النظام تلقائيًا بتطبيق الضرائب من النموذج المختار." -#: erpnext/stock/stock_ledger.py:2006 +#: erpnext/stock/stock_ledger.py:2007 msgid "If not, you can Cancel / Submit this entry" msgstr "وإلا يمكنك إلغاء / إرسال هذا الإدخال" @@ -21896,7 +22158,7 @@ msgstr "إذا نتج عن قائمة المواد مواد خردة، فيجب msgid "If the account is frozen, entries are allowed to restricted users." msgstr "إذا الحساب مجمد، يسمح بالدخول إلى المستخدمين المحددين." -#: erpnext/stock/stock_ledger.py:1999 +#: erpnext/stock/stock_ledger.py:2000 msgid "If the item is transacting as a Zero Valuation Rate item in this entry, please enable 'Allow Zero Valuation Rate' in the {0} Item table." msgstr "إذا كان العنصر يتعامل كعنصر سعر تقييم صفري في هذا الإدخال ، فالرجاء تمكين "السماح بمعدل تقييم صفري" في جدول العناصر {0}." @@ -21944,7 +22206,7 @@ msgstr "إذا كان هذا غير محدد ، فسيتم حفظ إدخالات msgid "If this is unchecked, direct GL entries will be created to book deferred revenue or expense" msgstr "إذا لم يتم تحديد ذلك ، فسيتم إنشاء إدخالات دفتر الأستاذ العام المباشرة لحجز الإيرادات أو المصاريف المؤجلة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:745 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:746 msgid "If this is undesirable please cancel the corresponding Payment Entry." msgstr "إذا كان هذا غير مرغوب فيه، فيرجى إلغاء عملية الدفع المقابلة." @@ -21983,7 +22245,7 @@ msgstr "إذا كانت مدة صلاحية نقاط الولاء غير محد msgid "If yes, then this warehouse will be used to store rejected materials" msgstr "إذا كانت الإجابة بنعم، فسيتم استخدام هذا المستودع لتخزين المواد المرفوضة" -#: erpnext/stock/doctype/item/item.js:1053 +#: erpnext/stock/doctype/item/item.js:1071 msgid "If you are maintaining stock of this Item in your Inventory, ERPNext will make a stock ledger entry for each transaction of this item." msgstr "إذا كنت تحتفظ بمخزون من هذا الصنف في مخزونك، فسيقوم نظام ERPNext بإجراء قيد في دفتر الأستاذ للمخزون لكل معاملة لهذا الصنف." @@ -22048,8 +22310,11 @@ msgstr "تجاهل الرصيد الختامي" #. 'Purchase Invoice' #. Label of the ignore_default_payment_terms_template (Check) field in DocType #. 'Sales Invoice' +#. Label of the ignore_default_payment_terms_template (Check) field in DocType +#. 'Sales Order' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json +#: erpnext/selling/doctype/sales_order/sales_order.json msgid "Ignore Default Payment Terms Template" msgstr "تجاهل نموذج شروط الدفع الافتراضية" @@ -22059,7 +22324,7 @@ msgstr "تجاهل نموذج شروط الدفع الافتراضية" msgid "Ignore Employee Time Overlap" msgstr "تجاهل تداخل وقت الموظف" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:143 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:145 msgid "Ignore Empty Stock" msgstr "تجاهل المخزون الفارغ" @@ -22208,7 +22473,7 @@ msgstr "استيراد صيغة MT940" msgid "Import Successful" msgstr "استيراد ناجح" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:562 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:566 msgid "Import Summary" msgstr "" @@ -22288,8 +22553,8 @@ msgstr "في الانتاج" #: erpnext/stock/report/available_serial_no/available_serial_no.py:112 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:82 -#: erpnext/stock/report/stock_balance/stock_balance.py:473 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:236 +#: erpnext/stock/report/stock_balance/stock_balance.py:546 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:300 msgid "In Qty" msgstr "كمية قادمة" @@ -22320,7 +22585,7 @@ msgstr "النقل أثناء العبور" msgid "In Transit Warehouse" msgstr "مستودع النقل" -#: erpnext/stock/report/stock_balance/stock_balance.py:479 +#: erpnext/stock/report/stock_balance/stock_balance.py:552 msgid "In Value" msgstr "القيمة القادمة" @@ -22337,6 +22602,7 @@ msgstr "القيمة القادمة" #. Label of the in_words (Data) field in DocType 'Quotation' #. Label of the base_in_words (Data) field in DocType 'Sales Order' #. Label of the in_words (Data) field in DocType 'Sales Order' +#. Label of the base_in_words (Data) field in DocType 'Delivery Note' #. Label of the in_words (Data) field in DocType 'Delivery Note' #. Label of the base_in_words (Data) field in DocType 'Purchase Receipt' #. Label of the in_words (Data) field in DocType 'Purchase Receipt' @@ -22358,11 +22624,9 @@ msgstr "في كلمات" #. Label of the base_in_words (Small Text) field in DocType 'Payment Entry' #. Label of the base_in_words (Data) field in DocType 'POS Invoice' #. Label of the base_in_words (Data) field in DocType 'Supplier Quotation' -#. Label of the base_in_words (Data) field in DocType 'Delivery Note' #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json -#: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "In Words (Company Currency)" msgstr "في الأحرف ( عملة الشركة )" @@ -22371,8 +22635,7 @@ msgstr "في الأحرف ( عملة الشركة )" msgid "In Words (Export) will be visible once you save the Delivery Note." msgstr "بالحروف (تصدير) سوف تكون مرئية بمجرد حفظ اشعار التسليم." -#. Description of the 'In Words (Company Currency)' (Data) field in DocType -#. 'Delivery Note' +#. Description of the 'In Words' (Data) field in DocType 'Delivery Note' #: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "In Words will be visible once you save the Delivery Note." msgstr "بالحروف سوف تكون مرئية بمجرد حفظ اشعارالتسليم." @@ -22416,7 +22679,7 @@ msgstr "في المخزن" msgid "In the case of multi-tier program, Customers will be auto assigned to the concerned tier as per their spent" msgstr "في حالة البرنامج متعدد المستويات، سيتم تعيين العملاء تلقائيًا إلى المستوى المعني وفقًا لإنفاقهم" -#: erpnext/stock/doctype/item/item.js:1086 +#: erpnext/stock/doctype/item/item.js:1104 msgid "In this section, you can define Company-wide transaction-related defaults for this Item. Eg. Default Warehouse, Default Price List, Supplier, etc." msgstr "في هذا القسم، يمكنك تحديد الإعدادات الافتراضية المتعلقة بالمعاملات على مستوى الشركة لهذا العنصر. على سبيل المثال: المستودع الافتراضي، وقائمة الأسعار الافتراضية، والمورد الافتراضي، وما إلى ذلك." @@ -22563,7 +22826,7 @@ msgstr "تشمل الاصناف الغير مخزنية" msgid "Include POS Transactions" msgstr "تشمل معاملات نقطه البيع" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:204 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:205 msgid "Include Payment" msgstr "يشمل الدفع" @@ -22653,10 +22916,10 @@ msgstr "بما في ذلك السلع للمجموعات الفرعية" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:236 #: erpnext/accounts/doctype/ledger_merge/ledger_merge.json #: erpnext/accounts/doctype/process_deferred_accounting/process_deferred_accounting.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:439 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:440 #: erpnext/accounts/report/account_balance/account_balance.js:27 #: erpnext/accounts/report/financial_statements.py:773 -#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:180 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:181 #: erpnext/accounts/report/profitability_analysis/profitability_analysis.py:192 msgid "Income" msgstr "الإيرادات" @@ -22714,8 +22977,8 @@ msgstr "دفعة واردة" #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:146 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:167 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:279 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:169 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:343 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:193 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:96 msgid "Incoming Rate" @@ -22734,6 +22997,10 @@ msgstr "مكالمة واردة من {0}" msgid "Incompatible Setting Detected" msgstr "تم الكشف عن إعدادات غير متوافقة" +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:193 +msgid "Incorrect Account" +msgstr "" + #. Name of a report #: erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.json msgid "Incorrect Balance Qty After Transaction" @@ -22747,24 +23014,28 @@ msgstr "تم استهلاك دفعة غير صحيحة" msgid "Incorrect Check in (group) Warehouse for Reorder" msgstr "تسجيل دخول غير صحيح (مجموعة) إلى مستودع إعادة الطلب" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:985 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:144 +msgid "Incorrect Company" +msgstr "" + +#: erpnext/stock/doctype/stock_entry/stock_entry.py:990 msgid "Incorrect Component Quantity" msgstr "كمية المكونات غير صحيحة" -#: erpnext/assets/doctype/asset/asset.py:390 +#: erpnext/assets/doctype/asset/asset.py:391 #: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py:56 msgid "Incorrect Date" msgstr "تاريخ غير صحيح" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:135 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:159 msgid "Incorrect Invoice" msgstr "فاتورة غير صحيحة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:359 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:360 msgid "Incorrect Payment Type" msgstr "نوع الدفع غير صحيح" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:108 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:115 msgid "Incorrect Reference Document (Purchase Receipt Item)" msgstr "وثيقة مرجعية غير صحيحة (بند إيصال الشراء)" @@ -22791,8 +23062,8 @@ msgstr "تقرير غير صحيح عن قيمة المخزون" msgid "Incorrect Type of Transaction" msgstr "نوع المعاملة غير صحيح" -#: erpnext/stock/doctype/pick_list/pick_list.py:175 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:123 +#: erpnext/stock/doctype/pick_list/pick_list.py:177 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:145 msgid "Incorrect Warehouse" msgstr "مستودع غير صحيح" @@ -22847,7 +23118,7 @@ msgstr "الزيادة" msgid "Increment cannot be 0" msgstr "لا يمكن أن تكون الزيادة 0\\n
    \\nIncrement cannot be 0" -#: erpnext/controllers/item_variant.py:113 +#: erpnext/controllers/item_variant.py:119 msgid "Increment for Attribute {0} cannot be 0" msgstr "الاضافة للخاصية {0} لا يمكن أن تكون 0" @@ -22948,14 +23219,14 @@ msgstr "بدأت" msgid "Inspected By" msgstr "تفتيش من قبل" -#: erpnext/controllers/stock_controller.py:1453 +#: erpnext/controllers/stock_controller.py:1494 #: erpnext/manufacturing/doctype/job_card/job_card.py:816 msgid "Inspection Rejected" msgstr "تم رفض التفتيش" #. Label of the inspection_required (Check) field in DocType 'Stock Entry' -#: erpnext/controllers/stock_controller.py:1423 -#: erpnext/controllers/stock_controller.py:1425 +#: erpnext/controllers/stock_controller.py:1464 +#: erpnext/controllers/stock_controller.py:1466 #: erpnext/stock/doctype/stock_entry/stock_entry.json msgid "Inspection Required" msgstr "التفتيش مطلوب" @@ -22972,7 +23243,7 @@ msgstr "التفتيش المطلوبة قبل تسليم" msgid "Inspection Required before Purchase" msgstr "التفتيش المطلوبة قبل الشراء" -#: erpnext/controllers/stock_controller.py:1438 +#: erpnext/controllers/stock_controller.py:1479 #: erpnext/manufacturing/doctype/job_card/job_card.py:797 msgid "Inspection Submission" msgstr "طلب فحص" @@ -23003,7 +23274,7 @@ msgstr "ملاحظة التثبيت" msgid "Installation Note Item" msgstr "ملاحظة تثبيت الإغلاق" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:639 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:640 msgid "Installation Note {0} has already been submitted" msgstr "مذكرة التسليم {0} ارسلت\\n
    \\nInstallation Note {0} has already been submitted" @@ -23038,30 +23309,30 @@ msgid "Instruction" msgstr "تعليمات" #: erpnext/stock/doctype/putaway_rule/putaway_rule.py:82 -#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:325 +#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:327 msgid "Insufficient Capacity" msgstr "سعة غير كافية" -#: erpnext/controllers/accounts_controller.py:3837 -#: erpnext/controllers/accounts_controller.py:3861 +#: erpnext/controllers/accounts_controller.py:3854 +#: erpnext/controllers/accounts_controller.py:3878 msgid "Insufficient Permissions" msgstr "أذونات غير كافية" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:462 -#: erpnext/stock/doctype/pick_list/pick_list.py:134 -#: erpnext/stock/doctype/pick_list/pick_list.py:152 -#: erpnext/stock/doctype/pick_list/pick_list.py:1019 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:957 -#: erpnext/stock/serial_batch_bundle.py:1198 erpnext/stock/stock_ledger.py:1708 -#: erpnext/stock/stock_ledger.py:2168 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:463 +#: erpnext/stock/doctype/pick_list/pick_list.py:136 +#: erpnext/stock/doctype/pick_list/pick_list.py:154 +#: erpnext/stock/doctype/pick_list/pick_list.py:1021 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:962 +#: erpnext/stock/serial_batch_bundle.py:1206 erpnext/stock/stock_ledger.py:1708 +#: erpnext/stock/stock_ledger.py:2167 msgid "Insufficient Stock" msgstr "المالية غير كافية" -#: erpnext/stock/stock_ledger.py:2183 +#: erpnext/stock/stock_ledger.py:2182 msgid "Insufficient Stock for Batch" msgstr "المخزون غير كافٍ للدفعة" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:440 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:441 msgid "Insufficient Stock for Product Bundle Items" msgstr "لا يوجد مخزون كافٍ من عناصر حزمة المنتج" @@ -23193,7 +23464,7 @@ msgstr "مصروفات الفائدة" msgid "Interest Income" msgstr "دخل الفوائد" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2974 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2997 msgid "Interest and/or dunning fee" msgstr "الفائدة و/أو رسوم المطالبة" @@ -23226,7 +23497,7 @@ msgstr "يوجد بالفعل عميل داخلي للشركة {0}" msgid "Internal Purchase Order" msgstr "أمر شراء داخلي" -#: erpnext/controllers/accounts_controller.py:800 +#: erpnext/controllers/accounts_controller.py:801 msgid "Internal Sale or Delivery Reference missing." msgstr "رقم مرجع البيع أو التسليم الداخلي مفقود." @@ -23234,7 +23505,7 @@ msgstr "رقم مرجع البيع أو التسليم الداخلي مفقود msgid "Internal Sales Order" msgstr "أمر بيع داخلي" -#: erpnext/controllers/accounts_controller.py:802 +#: erpnext/controllers/accounts_controller.py:803 msgid "Internal Sales Reference Missing" msgstr "رقم مرجع المبيعات الداخلي مفقود" @@ -23265,7 +23536,7 @@ msgstr "يوجد بالفعل مورد داخلي لشركة {0}" msgid "Internal Transfer" msgstr "نقل داخلي" -#: erpnext/controllers/accounts_controller.py:811 +#: erpnext/controllers/accounts_controller.py:812 msgid "Internal Transfer Reference Missing" msgstr "رقم مرجع التحويل الداخلي مفقود" @@ -23278,7 +23549,7 @@ msgstr "التحويلات الداخلية" msgid "Internal Work History" msgstr "سجل العمل الداخلي" -#: erpnext/controllers/stock_controller.py:1520 +#: erpnext/controllers/stock_controller.py:1561 msgid "Internal transfers can only be done in company's default currency" msgstr "لا يمكن إجراء التحويلات الداخلية إلا بالعملة الافتراضية للشركة" @@ -23292,43 +23563,47 @@ msgstr "النشر عبر الإنترنت" msgid "Interval should be between 1 to 59 MInutes" msgstr "يجب أن تكون الفترة الزمنية بين 1 و 59 دقيقة" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:380 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:388 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1019 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1029 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:381 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:389 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1020 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1030 #: erpnext/assets/doctype/asset_category/asset_category.py:69 #: erpnext/assets/doctype/asset_category/asset_category.py:97 -#: erpnext/controllers/accounts_controller.py:3204 -#: erpnext/controllers/accounts_controller.py:3212 +#: erpnext/controllers/accounts_controller.py:3210 +#: erpnext/controllers/accounts_controller.py:3218 msgid "Invalid Account" msgstr "حساب غير صالح" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:399 -#: erpnext/accounts/doctype/payment_request/payment_request.py:879 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:418 +msgid "Invalid Accounting Dimension" +msgstr "" + +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:400 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1004 msgid "Invalid Allocated Amount" msgstr "مبلغ مخصص غير صالح" -#: erpnext/accounts/doctype/payment_request/payment_request.py:124 +#: erpnext/accounts/doctype/payment_request/payment_request.py:147 msgid "Invalid Amount" msgstr "مبلغ غير صالح" -#: erpnext/controllers/item_variant.py:128 +#: erpnext/controllers/item_variant.py:134 msgid "Invalid Attribute" msgstr "خاصية غير صالحة" -#: erpnext/controllers/accounts_controller.py:622 +#: erpnext/controllers/accounts_controller.py:623 msgid "Invalid Auto Repeat Date" msgstr "تاريخ التكرار التلقائي غير صالح" -#: erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py:40 +#: erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.py:41 msgid "Invalid Barcode. There is no Item attached to this barcode." msgstr "الباركود غير صالح. لا يوجد عنصر مرفق بهذا الرمز الشريطي." -#: erpnext/public/js/controllers/transaction.js:3102 +#: erpnext/public/js/controllers/transaction.js:3204 msgid "Invalid Blanket Order for the selected Customer and Item" msgstr "طلب فارغ غير صالح للعميل والعنصر المحدد" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:496 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:500 msgid "Invalid CSV format. Expected column: doctype_name" msgstr "" @@ -23336,21 +23611,21 @@ msgstr "" msgid "Invalid Child Procedure" msgstr "إجراء الطفل غير صالح" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:225 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:227 msgid "Invalid Company Field" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2355 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2359 msgid "Invalid Company for Inter Company Transaction." msgstr "شركة غير صالحة للمعاملات بين الشركات." -#: erpnext/assets/doctype/asset/asset.py:361 -#: erpnext/assets/doctype/asset/asset.py:368 -#: erpnext/controllers/accounts_controller.py:3227 +#: erpnext/assets/doctype/asset/asset.py:362 +#: erpnext/assets/doctype/asset/asset.py:369 +#: erpnext/controllers/accounts_controller.py:3233 msgid "Invalid Cost Center" msgstr "مركز تكلفة غير صالح" -#: erpnext/selling/doctype/sales_order/sales_order.py:416 +#: erpnext/selling/doctype/sales_order/sales_order.py:418 msgid "Invalid Delivery Date" msgstr "تاريخ تسليم غير صالح" @@ -23358,11 +23633,11 @@ msgstr "تاريخ تسليم غير صالح" msgid "Invalid Discount" msgstr "خصم غير صالح" -#: erpnext/controllers/taxes_and_totals.py:797 +#: erpnext/controllers/taxes_and_totals.py:802 msgid "Invalid Discount Amount" msgstr "مبلغ الخصم غير صالح" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:122 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:131 msgid "Invalid Document" msgstr "مستند غير صالح" @@ -23370,8 +23645,8 @@ msgstr "مستند غير صالح" msgid "Invalid Document Type" msgstr "نوع المستند غير صالح" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:325 -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:330 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:327 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:332 msgid "Invalid Formula" msgstr "صيغة غير صالحة" @@ -23379,7 +23654,7 @@ msgstr "صيغة غير صالحة" msgid "Invalid Group By" msgstr "تجميع غير صالح" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:499 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:500 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:952 msgid "Invalid Item" msgstr "عنصر غير صالح" @@ -23393,16 +23668,16 @@ msgstr "القيم الافتراضية للعناصر غير صالحة" msgid "Invalid Ledger Entries" msgstr "إدخالات دفتر الأستاذ غير صالحة" -#: erpnext/assets/doctype/asset/asset.py:568 +#: erpnext/assets/doctype/asset/asset.py:569 msgid "Invalid Net Purchase Amount" msgstr "مبلغ الشراء الصافي غير صالح" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:77 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:79 #: erpnext/accounts/general_ledger.py:819 msgid "Invalid Opening Entry" msgstr "إدخال فتح غير صالح" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:142 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:144 msgid "Invalid POS Invoices" msgstr "فواتير نقاط البيع غير صالحة" @@ -23436,19 +23711,20 @@ msgstr "أولوية غير صالحة" msgid "Invalid Process Loss Configuration" msgstr "تكوين فقدان العملية غير صالح" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:706 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:707 msgid "Invalid Purchase Invoice" msgstr "فاتورة شراء غير صالحة" -#: erpnext/controllers/accounts_controller.py:3881 +#: erpnext/controllers/accounts_controller.py:3898 +#: erpnext/controllers/accounts_controller.py:3912 msgid "Invalid Qty" msgstr "كمية غير صالحة" -#: erpnext/controllers/accounts_controller.py:1456 +#: erpnext/controllers/accounts_controller.py:1457 msgid "Invalid Quantity" msgstr "كمية غير صحيحة" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:435 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:479 msgid "Invalid Query" msgstr "استعلام غير صالح" @@ -23456,12 +23732,12 @@ msgstr "استعلام غير صالح" msgid "Invalid Return" msgstr "إرجاع غير صالح" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:207 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:209 msgid "Invalid Sales Invoices" msgstr "فواتير مبيعات غير صالحة" -#: erpnext/assets/doctype/asset/asset.py:657 -#: erpnext/assets/doctype/asset/asset.py:685 +#: erpnext/assets/doctype/asset/asset.py:658 +#: erpnext/assets/doctype/asset/asset.py:686 msgid "Invalid Schedule" msgstr "جدول غير صالح" @@ -23469,16 +23745,16 @@ msgstr "جدول غير صالح" msgid "Invalid Selling Price" msgstr "سعر البيع غير صالح" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1746 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1751 msgid "Invalid Serial and Batch Bundle" msgstr "رقم تسلسلي وحزمة دفعات غير صالحة" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1019 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1041 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1024 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1046 msgid "Invalid Source and Target Warehouse" msgstr "مصدر ومستودع هدف غير صالحين" -#: erpnext/controllers/item_variant.py:145 +#: erpnext/controllers/item_variant.py:151 msgid "Invalid Value" msgstr "قيمة غير صالحة" @@ -23487,7 +23763,7 @@ msgstr "قيمة غير صالحة" msgid "Invalid Warehouse" msgstr "مستودع غير صالح" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:398 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:399 msgid "Invalid amount in accounting entries of {} {} for Account {}: {}" msgstr "مبلغ غير صالح في القيود المحاسبية لـ {} {} للحساب {}: {}" @@ -23495,7 +23771,7 @@ msgstr "مبلغ غير صالح في القيود المحاسبية لـ {} {} msgid "Invalid condition expression" msgstr "تعبير شرط غير صالح" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1053 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1057 msgid "Invalid file URL" msgstr "" @@ -23511,7 +23787,7 @@ msgstr "سبب ضائع غير صالح {0} ، يرجى إنشاء سبب ضائ msgid "Invalid naming series (. missing) for {0}" msgstr "سلسلة تسمية غير صالحة (. مفقود) لـ {0}" -#: erpnext/accounts/doctype/payment_request/payment_request.py:547 +#: erpnext/accounts/doctype/payment_request/payment_request.py:570 msgid "Invalid parameter. 'dn' should be of type str" msgstr "مُعامل غير صالح. يجب أن يكون نوع 'dn' سلسلة نصية (str)." @@ -23523,7 +23799,7 @@ msgstr "مرجع غير صالح {0} {1}" msgid "Invalid result key. Response:" msgstr "مفتاح نتيجة غير صالح. الرد:" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:435 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:479 msgid "Invalid search query" msgstr "استعلام بحث غير صالح" @@ -23538,7 +23814,7 @@ msgstr "قيمة غير صالحة {0} للحساب {1} مقابل الحساب msgid "Invalid {0}" msgstr "غير صالح {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2353 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2357 msgid "Invalid {0} for Inter Company Transaction." msgstr "غير صالح {0} للمعاملات بين الشركات." @@ -23548,7 +23824,7 @@ msgid "Invalid {0}: {1}" msgstr "{0} غير صالح : {1}\\n
    \\nInvalid {0}: {1}" #. Label of the inventory_section (Tab Break) field in DocType 'Item' -#: erpnext/setup/install.py:327 erpnext/stock/doctype/item/item.json +#: erpnext/setup/install.py:358 erpnext/stock/doctype/item/item.json msgid "Inventory" msgstr "جرد" @@ -23562,7 +23838,7 @@ msgstr "عملة حساب المخزون" #. Label of a Workspace Sidebar Item #: erpnext/patches/v15_0/refactor_closing_stock_balance.py:43 #: erpnext/stock/doctype/inventory_dimension/inventory_dimension.json -#: erpnext/stock/doctype/inventory_dimension/inventory_dimension.py:176 +#: erpnext/stock/doctype/inventory_dimension/inventory_dimension.py:178 #: erpnext/workspace_sidebar/stock.json msgid "Inventory Dimension" msgstr "بُعد المخزون" @@ -23602,6 +23878,12 @@ msgstr "الخدمات المصرفية الاستثمارية" msgid "Investments" msgstr "الاستثمارات" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Invite Users' +#: erpnext/setup/onboarding_step/invite_users/invite_users.json +msgid "Invite Users" +msgstr "" + #. Option for the 'Posting Date Inheritance for Exchange Gain / Loss' (Select) #. field in DocType 'Accounts Settings' #. Label of the sales_invoice (Link) field in DocType 'Discounted Invoice' @@ -23643,7 +23925,7 @@ msgstr "خصم الفواتير" msgid "Invoice Document Type Selection Error" msgstr "خطأ في تحديد نوع مستند الفاتورة" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1215 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1257 msgid "Invoice Grand Total" msgstr "الفاتورة الكبرى المجموع" @@ -23671,7 +23953,7 @@ msgstr "حد الفاتورة" msgid "Invoice Number" msgstr "رقم الفاتورة" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:865 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:866 msgid "Invoice Paid" msgstr "تم دفع الفاتورة" @@ -23746,7 +24028,7 @@ msgstr "لا يمكن إجراء الفاتورة لمدة صفر ساعة" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:171 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:144 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1217 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1259 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:164 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:194 msgid "Invoiced Amount" @@ -23766,7 +24048,7 @@ msgstr "الكمية المفوترة" #: erpnext/accounts/doctype/opening_invoice_creation_tool/opening_invoice_creation_tool.json #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_profile/pos_profile.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2404 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2408 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:62 msgid "Invoices" @@ -24436,11 +24718,11 @@ msgstr "تاريخ الإصدار" msgid "It can take upto few hours for accurate stock values to be visible after merging items." msgstr "قد يستغرق الأمر بضع ساعات حتى تظهر قيم المخزون الدقيقة بعد دمج العناصر." -#: erpnext/public/js/controllers/transaction.js:2504 +#: erpnext/public/js/controllers/transaction.js:2605 msgid "It is needed to fetch Item Details." msgstr "هناك حاجة لجلب تفاصيل البند." -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:171 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:213 msgid "It's not possible to distribute charges equally when total amount is zero, please set 'Distribute Charges Based On' as 'Quantity'" msgstr "لا يمكن توزيع الرسوم بالتساوي عندما يكون المبلغ الإجمالي صفرًا، يرجى ضبط \"توزيع الرسوم بناءً على\" على \"الكمية\"." @@ -24495,7 +24777,7 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:33 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:202 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/taxes_and_totals.py:1206 +#: erpnext/controllers/taxes_and_totals.py:1211 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/manufacturing/doctype/bom/bom.js:1058 #: erpnext/manufacturing/doctype/bom/bom.json @@ -24530,7 +24812,7 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/stock/doctype/batch/batch.json erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/putaway_rule/putaway_rule.json -#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:323 +#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:325 #: erpnext/stock/page/stock_balance/stock_balance.js:23 #: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js:36 #: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary_header.html:7 @@ -24552,9 +24834,9 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:28 #: erpnext/stock/report/stock_ageing/stock_ageing.js:46 #: erpnext/stock/report/stock_analytics/stock_analytics.js:15 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:28 -#: erpnext/stock/report/stock_balance/stock_balance.py:400 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:206 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:43 +#: erpnext/stock/report/stock_balance/stock_balance.py:473 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:270 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:27 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:51 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:28 @@ -24569,10 +24851,11 @@ msgstr "نص مائل للمجاميع الفرعية أو الملاحظات" #: erpnext/templates/form_grid/stock_entry_grid.html:8 #: erpnext/templates/generators/bom.html:19 #: erpnext/templates/pages/material_request_info.html:42 -#: erpnext/templates/pages/order.html:94 erpnext/workspace_sidebar/buying.json -#: erpnext/workspace_sidebar/home.json +#: erpnext/templates/pages/order.html:94 erpnext/workspace_sidebar/assets.json +#: erpnext/workspace_sidebar/buying.json erpnext/workspace_sidebar/home.json #: erpnext/workspace_sidebar/manufacturing.json #: erpnext/workspace_sidebar/selling.json erpnext/workspace_sidebar/stock.json +#: erpnext/workspace_sidebar/subcontracting.json #: erpnext/workspace_sidebar/subscription.json msgid "Item" msgstr "السلعة" @@ -24799,10 +25082,10 @@ msgstr "سلة التسوق" #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86 #: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:119 #: erpnext/projects/doctype/timesheet/timesheet.js:214 -#: erpnext/public/js/controllers/transaction.js:2798 +#: erpnext/public/js/controllers/transaction.js:2899 #: erpnext/public/js/stock_reservation.js:112 -#: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:488 -#: erpnext/public/js/utils.js:645 +#: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:553 +#: erpnext/public/js/utils.js:710 #: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/installation_note_item/installation_note_item.json @@ -24856,7 +25139,7 @@ msgstr "سلة التسوق" #: erpnext/stock/report/item_price_stock/item_price_stock.py:18 #: erpnext/stock/report/negative_batch_report/negative_batch_report.js:15 #: erpnext/stock/report/negative_batch_report/negative_batch_report.py:40 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:125 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:127 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.js:8 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:433 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.js:7 @@ -24893,7 +25176,7 @@ msgstr "رمز المنتج > مجموعة المنتجات > العلامة ا msgid "Item Code cannot be changed for Serial No." msgstr "لا يمكن تغيير رمز السلعة للرقم التسلسلي" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:455 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:456 msgid "Item Code required at Row No {0}" msgstr "رمز العنصر المطلوب في الصف رقم {0}\\n
    \\nItem Code required at Row No {0}" @@ -25061,11 +25344,11 @@ msgstr "بيانات الصنف" #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:99 #: erpnext/stock/report/stock_ageing/stock_ageing.py:141 #: erpnext/stock/report/stock_analytics/stock_analytics.js:8 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:37 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:52 #: erpnext/stock/report/stock_balance/stock_balance.js:32 -#: erpnext/stock/report/stock_balance/stock_balance.py:408 +#: erpnext/stock/report/stock_balance/stock_balance.py:481 #: erpnext/stock/report/stock_ledger/stock_ledger.js:71 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:264 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:328 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:39 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:113 #: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.js:33 @@ -25089,7 +25372,7 @@ msgstr "اسم مجموعة السلعة" msgid "Item Group Tree" msgstr "شجرة فئات البنود" -#: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:526 +#: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:525 msgid "Item Group not mentioned in item master for item {0}" msgstr "فئة البند غير مذكورة في ماستر البند لهذا البند {0}" @@ -25281,8 +25564,8 @@ msgstr "مادة المصنع" #: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:371 #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:92 #: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:138 -#: erpnext/public/js/controllers/transaction.js:2804 -#: erpnext/public/js/utils.js:740 +#: erpnext/public/js/controllers/transaction.js:2905 +#: erpnext/public/js/utils.js:805 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:1252 #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -25318,12 +25601,12 @@ msgstr "مادة المصنع" #: erpnext/stock/report/item_prices/item_prices.py:51 #: erpnext/stock/report/item_shortage_report/item_shortage_report.py:143 #: erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py:54 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:131 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:133 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:440 #: erpnext/stock/report/stock_ageing/stock_ageing.py:138 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:30 -#: erpnext/stock/report/stock_balance/stock_balance.py:406 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:212 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:45 +#: erpnext/stock/report/stock_balance/stock_balance.py:479 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:276 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:110 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:31 #: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:32 @@ -25339,12 +25622,16 @@ msgstr "مادة المصنع" msgid "Item Name" msgstr "اسم السلعة" +#: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:412 +msgid "Item Name is required." +msgstr "" + #. Label of the item_naming_by (Select) field in DocType 'Stock Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Item Naming By" msgstr "تسمية السلعة بواسطة" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:451 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:452 msgid "Item Out of Stock" msgstr "المنتج غير متوفر" @@ -25381,7 +25668,7 @@ msgstr "إعدادات سعر المنتج" msgid "Item Price Stock" msgstr "سعر صنف المخزون" -#: erpnext/stock/get_item_details.py:1100 +#: erpnext/stock/get_item_details.py:1112 msgid "Item Price added for {0} in Price List {1}" msgstr "تم اضافتة سعر الصنف لـ {0} في قائمة الأسعار {1}" @@ -25389,7 +25676,7 @@ msgstr "تم اضافتة سعر الصنف لـ {0} في قائمة الأسع msgid "Item Price appears multiple times based on Price List, Supplier/Customer, Currency, Item, Batch, UOM, Qty, and Dates." msgstr "يظهر سعر الصنف عدة مرات بناءً على قائمة الأسعار، والمورد/العميل، والعملة، والصنف، والدفعة، ووحدة القياس، والكمية، والتواريخ." -#: erpnext/stock/get_item_details.py:1079 +#: erpnext/stock/get_item_details.py:1091 msgid "Item Price updated for {0} in Price List {1}" msgstr "سعر الصنف محدث ل{0} في قائمة الأسعار {1}" @@ -25432,7 +25719,7 @@ msgstr "البند إعادة ترتيب" msgid "Item Row" msgstr "صف العنصر" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:145 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:169 msgid "Item Row {0}: {1} {2} does not exist in above '{1}' table" msgstr "صنف الصف {0}: {1} {2} غير موجود في جدول '{1}' أعلاه" @@ -25571,7 +25858,7 @@ msgstr "الصنف تفاصيل متغير" #. Name of a DocType #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:151 +#: erpnext/stock/doctype/item/item.js:169 #: erpnext/stock/doctype/item_variant_settings/item_variant_settings.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/erpnext_settings.json @@ -25579,7 +25866,7 @@ msgstr "الصنف تفاصيل متغير" msgid "Item Variant Settings" msgstr "إعدادات متنوع السلعة" -#: erpnext/stock/doctype/item/item.js:902 +#: erpnext/stock/doctype/item/item.js:920 msgid "Item Variant {0} already exists with same attributes" msgstr "متغير الصنف {0} موجود بالفعل مع نفس الخصائص" @@ -25587,7 +25874,7 @@ msgstr "متغير الصنف {0} موجود بالفعل مع نفس الخصا msgid "Item Variants updated" msgstr "تم تحديث متغيرات العنصر" -#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:85 +#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:86 msgid "Item Warehouse based reposting has been enabled." msgstr "تم تفعيل إعادة النشر بناءً على مستودع العناصر." @@ -25675,7 +25962,7 @@ msgstr "المنتج والمستودع" msgid "Item and Warranty Details" msgstr "البند والضمان تفاصيل" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3268 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3273 msgid "Item for row {0} does not match Material Request" msgstr "عنصر الصف {0} لا يتطابق مع طلب المواد" @@ -25691,7 +25978,7 @@ msgstr "هذا العنصر إلزامي في جدول المواد الخام." msgid "Item is removed since no serial / batch no selected." msgstr "تمت إزالة العنصر لعدم تحديد رقم تسلسلي/رقم دفعة." -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:141 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:165 msgid "Item must be added using 'Get Items from Purchase Receipts' button" msgstr "الصنف يجب اضافته مستخدما مفتاح \"احصل علي الأصناف من المشتريات المستلمة \"" @@ -25705,11 +25992,11 @@ msgstr "اسم السلعة" msgid "Item operation" msgstr "عملية الصنف" -#: erpnext/controllers/accounts_controller.py:3919 +#: erpnext/controllers/accounts_controller.py:3952 msgid "Item qty can not be updated as raw materials are already processed." msgstr "لا يمكن تحديث كمية الصنف لأن المواد الخام قد تمت معالجتها بالفعل." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1149 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1154 msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}" msgstr "تم تحديث سعر السلعة إلى الصفر حيث تم تحديد خيار \"السماح بسعر تقييم صفري\" للسلعة {0}" @@ -25727,7 +26014,7 @@ msgstr "الصنف الذي سيتم تصنيعه أو إعادة تعبئته" msgid "Item valuation rate is recalculated considering landed cost voucher amount" msgstr "يتم إعادة حساب معدل تقييم السلعة مع الأخذ في الاعتبار مبلغ قسيمة التكلفة النهائية." -#: erpnext/stock/utils.py:531 +#: erpnext/stock/utils.py:534 msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "جارٍ إعادة نشر تقييم الأصناف. قد يُظهر التقرير تقييمًا غير صحيح للأصناف." @@ -25747,7 +26034,7 @@ msgstr "لا يمكن إضافة العنصر {0} كجزء فرعي من نفس msgid "Item {0} cannot be ordered more than {1} against Blanket Order {2}." msgstr "لا يمكن طلب أكثر من {0} من المنتج {1} ضمن طلب شامل {2}." -#: erpnext/assets/doctype/asset/asset.py:343 +#: erpnext/assets/doctype/asset/asset.py:344 #: erpnext/stock/doctype/item/item.py:671 msgid "Item {0} does not exist" msgstr "العنصر {0} غير موجود\\n
    \\nItem {0} does not exist" @@ -25756,11 +26043,11 @@ msgstr "العنصر {0} غير موجود\\n
    \\nItem {0} does not exist" msgid "Item {0} does not exist in the system or has expired" msgstr "الصنف{0} غير موجود في النظام أو انتهت صلاحيته" -#: erpnext/controllers/stock_controller.py:515 +#: erpnext/controllers/stock_controller.py:556 msgid "Item {0} does not exist." msgstr "العنصر {0} غير موجود\\n
    \\nItem {0} does not exist." -#: erpnext/controllers/selling_controller.py:844 +#: erpnext/controllers/selling_controller.py:852 msgid "Item {0} entered multiple times." msgstr "تم إدخال العنصر {0} عدة مرات." @@ -25768,11 +26055,11 @@ msgstr "تم إدخال العنصر {0} عدة مرات." msgid "Item {0} has already been returned" msgstr "تمت إرجاع الصنف{0} من قبل" -#: erpnext/assets/doctype/asset/asset.py:345 +#: erpnext/assets/doctype/asset/asset.py:346 msgid "Item {0} has been disabled" msgstr "الصنف{0} تم تعطيله" -#: erpnext/selling/doctype/sales_order/sales_order.py:790 +#: erpnext/selling/doctype/sales_order/sales_order.py:792 msgid "Item {0} has no Serial No. Only serialized items can have delivery based on Serial No" msgstr "العنصر {0} ليس له رقم تسلسلي. يتم تسليم العناصر ذات الأرقام التسلسلية فقط بناءً على الرقم التسلسلي." @@ -25808,27 +26095,27 @@ msgstr "العنصر {0} ليس عنصر مخزون\\n
    \\nItem {0} is not a s msgid "Item {0} is not a subcontracted item" msgstr "العنصر {0} ليس عنصرًا متعاقدًا عليه من الباطن" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2133 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2138 msgid "Item {0} is not active or end of life has been reached" msgstr "البند {0} غير نشط أو تم التوصل إلى نهاية الحياة" -#: erpnext/assets/doctype/asset/asset.py:347 +#: erpnext/assets/doctype/asset/asset.py:348 msgid "Item {0} must be a Fixed Asset Item" msgstr "البند {0} يجب أن يكون بند أصول ثابتة" -#: erpnext/stock/get_item_details.py:347 +#: erpnext/stock/get_item_details.py:353 msgid "Item {0} must be a Non-Stock Item" msgstr "يجب أن يكون العنصر {0} عنصرًا غير متوفر في المخزون" -#: erpnext/stock/get_item_details.py:344 +#: erpnext/stock/get_item_details.py:350 msgid "Item {0} must be a Sub-contracted Item" msgstr "البند {0} يجب أن يكون عنصر التعاقد الفرعي" -#: erpnext/assets/doctype/asset/asset.py:349 +#: erpnext/assets/doctype/asset/asset.py:350 msgid "Item {0} must be a non-stock item" msgstr "الصنف {0} يجب ألا يكون صنف مخزن
    Item {0} must be a non-stock item" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1482 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1487 msgid "Item {0} not found in 'Raw Materials Supplied' table in {1} {2}" msgstr "العنصر {0} غير موجود في جدول \"المواد الخام الموردة\" في {1} {2}" @@ -25836,7 +26123,7 @@ msgstr "العنصر {0} غير موجود في جدول \"المواد الخا msgid "Item {0} not found." msgstr "العنصر {0} غير موجود." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:325 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:326 msgid "Item {0}: Ordered qty {1} cannot be less than minimum order qty {2} (defined in Item)." msgstr "البند {0} الكمية المطلوبة {1} لا يمكن أن تكون أقل من الحد الأدنى للطلب {2} (المحددة في البند)." @@ -25844,7 +26131,7 @@ msgstr "البند {0} الكمية المطلوبة {1} لا يمكن أن تك msgid "Item {0}: {1} qty produced. " msgstr "العنصر {0}: {1} الكمية المنتجة." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1449 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1460 msgid "Item {} does not exist." msgstr "العنصر {} غير موجود." @@ -25890,7 +26177,7 @@ msgstr "سجل حركة مبيعات وفقاً للصنف" msgid "Item-wise sales Register" msgstr "" -#: erpnext/stock/get_item_details.py:713 +#: erpnext/stock/get_item_details.py:725 msgid "Item/Item Code required to get Item Tax Template." msgstr "يلزم وجود رمز الصنف/الصنف للحصول على نموذج ضريبة الصنف." @@ -25938,11 +26225,11 @@ msgstr "اصناف يمكن طلبه" msgid "Items and Pricing" msgstr "السلع والتسعيرات" -#: erpnext/controllers/accounts_controller.py:4182 +#: erpnext/controllers/accounts_controller.py:4212 msgid "Items cannot be updated as Subcontracting Inward Order(s) exist against this Subcontracted Sales Order." msgstr "لا يمكن تحديث العناصر لوجود أوامر واردة من الباطن مرتبطة بأمر البيع هذا." -#: erpnext/controllers/accounts_controller.py:4175 +#: erpnext/controllers/accounts_controller.py:4205 msgid "Items cannot be updated as Subcontracting Order is created against the Purchase Order {0}." msgstr "لا يمكن تحديث العناصر لأن أمر التعاقد من الباطن يتم إنشاؤه مقابل أمر الشراء {0}." @@ -25954,7 +26241,7 @@ msgstr "عناصر لطلب المواد الخام" msgid "Items not found." msgstr "لم يتم العثور على العناصر." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1145 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1150 msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}" msgstr "تم تحديث سعر الأصناف إلى الصفر حيث تم تحديد خيار \"السماح بسعر تقييم صفري\" للأصناف التالية: {0}" @@ -25984,7 +26271,7 @@ msgstr "العناصر المراد حجزها" msgid "Items under this warehouse will be suggested" msgstr "وسيتم اقتراح العناصر الموجودة تحت هذا المستودع" -#: erpnext/controllers/stock_controller.py:125 +#: erpnext/controllers/stock_controller.py:166 msgid "Items {0} do not exist in the Item master." msgstr "العناصر {0} غير موجودة في قائمة العناصر الرئيسية." @@ -26169,7 +26456,7 @@ msgstr "اسم العامل" msgid "Job Worker Warehouse" msgstr "مستودع عامل التوظيف" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2644 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2656 msgid "Job card {0} created" msgstr "تم إنشاء بطاقة العمل {0}" @@ -26196,7 +26483,7 @@ msgstr "جول/متر" msgid "Journal Entries" msgstr "مدخلات دفتر اليومية" -#: erpnext/accounts/utils.py:1065 +#: erpnext/accounts/utils.py:1067 msgid "Journal Entries {0} are un-linked" msgstr "إدخالات قيد اليومية {0} غير مترابطة" @@ -26254,7 +26541,7 @@ msgstr "حساب قالب إدخال دفتر اليومية" msgid "Journal Entry Type" msgstr "نوع إدخال دفتر اليومية" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:547 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:548 msgid "Journal Entry for Asset scrapping cannot be cancelled. Please restore the Asset." msgstr "لا يمكن إلغاء قيد اليومية الخاص بتخريد الأصل. يرجى إعادة الأصل إلى حالته الأصلية." @@ -26263,11 +26550,11 @@ msgstr "لا يمكن إلغاء قيد اليومية الخاص بتخريد msgid "Journal Entry for Scrap" msgstr "قيد دفتر يومية للتخريد" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:343 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:344 msgid "Journal Entry type should be set as Depreciation Entry for asset depreciation" msgstr "يجب تحديد نوع قيد اليومية كقيد استهلاك لإهلاك الأصول." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:717 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:718 msgid "Journal Entry {0} does not have account {1} or already matched against other voucher" msgstr "قيد دفتر اليومية {0} ليس لديه حساب {1} أو قد تم مطابقته مسبقا مع إيصال أخرى" @@ -26509,7 +26796,7 @@ msgstr "تاريخ الاتصال الأخير" msgid "Last Completion Date" msgstr "تاريخ الانتهاء الأخير" -#: erpnext/accounts/doctype/account/account.py:658 +#: erpnext/accounts/doctype/account/account.py:660 msgid "Last GL Entry update was done {}. This operation is not allowed while system is actively being used. Please wait for 5 minutes before retrying." msgstr "تم آخر تحديث لإدخال دفتر الأستاذ العام {}. لا يُسمح بهذه العملية أثناء استخدام النظام. يُرجى الانتظار 5 دقائق قبل إعادة المحاولة." @@ -26591,7 +26878,7 @@ msgstr "آخر عملية تم إجراؤها" msgid "Latest" msgstr "اخير" -#: erpnext/stock/report/stock_balance/stock_balance.py:519 +#: erpnext/stock/report/stock_balance/stock_balance.py:592 msgid "Latest Age" msgstr "مرحلة متأخرة" @@ -26627,7 +26914,7 @@ msgstr "خط العرض" msgid "Lead" msgstr "مبادرة البيع" -#: erpnext/crm/doctype/lead/lead.py:549 +#: erpnext/crm/doctype/lead/lead.py:556 msgid "Lead -> Prospect" msgstr "عميل محتمل -> عميل متوقع" @@ -26672,7 +26959,7 @@ msgstr "مالك الزبون المحتمل" msgid "Lead Owner Efficiency" msgstr "يؤدي كفاءة المالك" -#: erpnext/crm/doctype/lead/lead.py:176 +#: erpnext/crm/doctype/lead/lead.py:178 msgid "Lead Owner cannot be same as the Lead Email Address" msgstr "لا يمكن أن يكون مالك العميل المحتمل هو نفسه عنوان البريد الإلكتروني للعميل المحتمل" @@ -26721,7 +27008,7 @@ msgstr "المهلة بالايام" msgid "Lead Type" msgstr "نوع الزبون المحتمل" -#: erpnext/crm/doctype/lead/lead.py:548 +#: erpnext/crm/doctype/lead/lead.py:555 msgid "Lead {0} has been added to prospect {1}." msgstr "تمت إضافة العميل المحتمل {0} إلى العميل المتوقع {1}." @@ -26734,6 +27021,18 @@ msgstr "العملاء المحتملين" msgid "Leads help you get business, add all your contacts and more as your leads" msgstr "العروض تساعدك للحصول على الأعمال التجارية،وإضافة كافة جهات الاتصال الخاصة بك والمزيد من عروضك" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Learn Asset' +#: erpnext/assets/onboarding_step/learn_asset/learn_asset.json +msgid "Learn Asset" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Learn Subcontracting' +#: erpnext/subcontracting/onboarding_step/learn_subcontracting/learn_subcontracting.json +msgid "Learn Subcontracting" +msgstr "" + #. Description of the 'Enable Common Party Accounting' (Check) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -26837,7 +27136,7 @@ msgstr "أسطورة" msgid "Length (cm)" msgstr "الطول (سم)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:907 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:911 msgid "Less Than Amount" msgstr "أقل من المبلغ" @@ -26866,7 +27165,7 @@ msgstr "المستوى (قائمة المواد)" msgid "Lft" msgstr "يسار" -#: erpnext/accounts/report/balance_sheet/balance_sheet.py:251 +#: erpnext/accounts/report/balance_sheet/balance_sheet.py:252 msgid "Liabilities" msgstr "المطلوبات" @@ -26946,7 +27245,7 @@ msgstr "ربط إجراءات الجودة الحالية." msgid "Link to Material Request" msgstr "رابط لطلب المواد" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:448 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:455 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:80 msgid "Link to Material Requests" msgstr "رابط لطلبات المواد" @@ -27018,7 +27317,7 @@ msgstr "لتر-جو" msgid "Load All Criteria" msgstr "تحميل جميع المعايير" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:81 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:68 msgid "Loading Invoices! Please Wait..." msgstr "جارٍ تحميل الفواتير! يرجى الانتظار..." @@ -27243,7 +27542,7 @@ msgstr "نقاط الولاء الفداء" msgid "Loyalty Points will be calculated from the spent done (via the Sales Invoice), based on collection factor mentioned." msgstr "سيتم احتساب نقاط الولاء من المبلغ المنفق (عبر فاتورة المبيعات)، بناءً على عامل التحصيل المذكور." -#: erpnext/public/js/utils.js:109 +#: erpnext/public/js/utils.js:174 msgid "Loyalty Points: {0}" msgstr "نقاط الولاء: {0}" @@ -27338,10 +27637,10 @@ msgstr "عطل الآلة" msgid "Machine operator errors" msgstr "أخطاء مشغل الآلة" -#: erpnext/setup/doctype/company/company.py:733 -#: erpnext/setup/doctype/company/company.py:748 +#: erpnext/setup/doctype/company/company.py:734 #: erpnext/setup/doctype/company/company.py:749 #: erpnext/setup/doctype/company/company.py:750 +#: erpnext/setup/doctype/company/company.py:751 msgid "Main" msgstr "رئيسي" @@ -27606,7 +27905,7 @@ msgstr "انشئ قيد اهلاك" msgid "Make Difference Entry" msgstr "جعل دخول الفرق" -#: erpnext/stock/doctype/item/item.js:591 +#: erpnext/stock/doctype/item/item.js:609 msgid "Make Lead Time" msgstr "حدد وقتاً كافياً للتنفيذ" @@ -27629,7 +27928,7 @@ msgid "Make Quotation" msgstr "اطلب عرض سعر" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:330 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:127 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:128 msgid "Make Return Entry" msgstr "إعادة إدخال البيانات" @@ -27661,15 +27960,15 @@ msgstr "إدخال التحويل" msgid "Make project from a template." msgstr "جعل المشروع من قالب." -#: erpnext/stock/doctype/item/item.js:699 +#: erpnext/stock/doctype/item/item.js:717 msgid "Make {0} Variant" msgstr "إنشاء نسخة {0}" -#: erpnext/stock/doctype/item/item.js:701 +#: erpnext/stock/doctype/item/item.js:719 msgid "Make {0} Variants" msgstr "إنشاء متغيرات {0}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:172 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:173 msgid "Making Journal Entries against advance accounts: {0} is not recommended. These Journals won't be available for Reconciliation." msgstr "لا يُنصح بإجراء قيود يومية على الحسابات المقدمة: {0} . لن تكون هذه القيود متاحة للمطابقة." @@ -27693,7 +27992,7 @@ msgstr "" msgid "Manage your orders" msgstr "إدارة طلباتك" -#: erpnext/setup/doctype/company/company.py:497 +#: erpnext/setup/doctype/company/company.py:498 msgid "Management" msgstr "الإدارة" @@ -27709,7 +28008,7 @@ msgstr "المدير العام" msgid "Mandatory Accounting Dimension" msgstr "البعد المحاسبي الإلزامي" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1885 msgid "Mandatory Field" msgstr "حقل إلزامي" @@ -27725,15 +28024,15 @@ msgstr "إلزامي للميزانية العمومية" msgid "Mandatory For Profit and Loss Account" msgstr "إلزامي لحساب الربح والخسارة" -#: erpnext/selling/doctype/quotation/quotation.py:625 +#: erpnext/selling/doctype/quotation/quotation.py:632 msgid "Mandatory Missing" msgstr "إلزامي مفقود" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:637 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:638 msgid "Mandatory Purchase Order" msgstr "أمر شراء إلزامي" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:658 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:659 msgid "Mandatory Purchase Receipt" msgstr "إيصال الشراء الإلزامي" @@ -27808,8 +28107,8 @@ msgstr "لا يمكن إنشاء الإدخال اليدوي! قم بتعطيل #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1226 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1242 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1231 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1247 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json @@ -27913,7 +28212,7 @@ msgstr "الشركات المصنعة المستخدمة في المنتجات" #: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:29 -#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:332 +#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:363 #: erpnext/setup/setup_wizard/data/industry_type.txt:31 #: erpnext/stock/doctype/batch/batch.json erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json @@ -27958,7 +28257,7 @@ msgstr "تاريخ التصنيع" msgid "Manufacturing Manager" msgstr "مدير التصنيع" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2386 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2391 msgid "Manufacturing Quantity is mandatory" msgstr "كمية التصنيع إلزامية\\n
    \\nManufacturing Quantity is mandatory" @@ -27977,6 +28276,11 @@ msgstr "قسم التصنيع" msgid "Manufacturing Settings" msgstr "إعدادات التصنيع" +#. Title of the Module Onboarding 'Manufacturing Onboarding' +#: erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json +msgid "Manufacturing Setup" +msgstr "" + #. Label of the manufacturing_time_in_mins (Int) field in DocType 'Item Lead #. Time' #. Label of the manufacturing_time_tab (Tab Break) field in DocType 'Item Lead @@ -28030,7 +28334,7 @@ msgstr "رسم خرائط طلبات الشراء الداخلية للتعاق msgid "Mapping Subcontracting Order ..." msgstr "تحديد ترتيب التعاقد من الباطن ..." -#: erpnext/public/js/utils.js:975 +#: erpnext/public/js/utils.js:1040 msgid "Mapping {0} ..." msgstr "رسم الخرائط {0}..." @@ -28130,13 +28434,13 @@ msgstr "تم إغلاق الملف" msgid "Market Segment" msgstr "سوق القطاع" -#: erpnext/setup/doctype/company/company.py:449 +#: erpnext/setup/doctype/company/company.py:450 msgid "Marketing" msgstr "التسويق" #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:112 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:191 -#: erpnext/setup/doctype/company/company.py:689 +#: erpnext/setup/doctype/company/company.py:690 msgid "Marketing Expenses" msgstr "نفقات تسويقية" @@ -28184,12 +28488,12 @@ msgstr "اهلاك المواد" #. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type' #: erpnext/setup/setup_wizard/operations/install_fixtures.py:114 #: erpnext/stock/doctype/stock_entry/stock_entry.json -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1227 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1232 #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json msgid "Material Consumption for Manufacture" msgstr "اهلاك المواد للتصنيع" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:576 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:577 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "لم يتم تعيين اهلاك المواد في إعدادات التصنيع." @@ -28257,7 +28561,7 @@ msgstr "أستلام مواد" #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json #: erpnext/buying/doctype/purchase_order/purchase_order.js:519 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:357 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:364 #: erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:56 #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json @@ -28276,13 +28580,13 @@ msgstr "أستلام مواد" #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:36 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:423 -#: erpnext/stock/doctype/material_request/material_request.py:473 +#: erpnext/stock/doctype/material_request/material_request.py:428 +#: erpnext/stock/doctype/material_request/material_request.py:478 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:252 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:355 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:253 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:356 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json @@ -28361,11 +28665,11 @@ msgstr "المادة طلب خطة البند" msgid "Material Request Type" msgstr "نوع طلب المواد" -#: erpnext/selling/doctype/sales_order/sales_order.py:1846 +#: erpnext/selling/doctype/sales_order/sales_order.py:1850 msgid "Material Request not created, as quantity for Raw Materials already available." msgstr "لم يتم إنشاء طلب المواد ، ككمية للمواد الخام المتاحة بالفعل." -#: erpnext/stock/doctype/material_request/material_request.py:137 +#: erpnext/stock/doctype/material_request/material_request.py:139 msgid "Material Request of maximum {0} can be made for Item {1} against Sales Order {2}" msgstr "المادة يمكن طلب الحد الأقصى {0} للبند {1} من أمر المبيعات {2}\\n
    \\nMaterial Request of maximum {0} can be made for Item {1} against Sales Order {2}" @@ -28494,7 +28798,7 @@ msgstr "مواد للمورد" msgid "Materials To Be Transferred" msgstr "" -#: erpnext/controllers/subcontracting_controller.py:1569 +#: erpnext/controllers/subcontracting_controller.py:1574 msgid "Materials are already received against the {0} {1}" msgstr "تم استلام المواد بالفعل مقابل {0} {1}" @@ -28569,7 +28873,7 @@ msgid "Max discount allowed for item: {0} is {1}%" msgstr "الحد الأقصى للخصم المسموح به لهذا المنتج: {0} هو {1}%" #: erpnext/manufacturing/doctype/work_order/work_order.js:982 -#: erpnext/stock/doctype/pick_list/pick_list.js:198 +#: erpnext/stock/doctype/pick_list/pick_list.js:200 msgid "Max: {0}" msgstr "الحد الأقصى: {0}" @@ -28590,11 +28894,11 @@ msgstr "الحد الأقصى للسعر الصافي" msgid "Maximum Payment Amount" msgstr "الحد الأقصى لمبلغ الدفع" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3871 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3876 msgid "Maximum Samples - {0} can be retained for Batch {1} and Item {2}." msgstr "الحد الأقصى للعينات - {0} يمكن الاحتفاظ بالدفعة {1} والبند {2}." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3862 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3867 msgid "Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}." msgstr "الحد الأقصى للعينات - {0} تم الاحتفاظ به مسبقا للدفعة {1} و العنصر {2} في الدفعة {3}." @@ -28649,7 +28953,7 @@ msgstr "ميغا جول" msgid "Megawatt" msgstr "ميغاواط" -#: erpnext/stock/stock_ledger.py:2012 +#: erpnext/stock/stock_ledger.py:2013 msgid "Mention Valuation Rate in the Item master." msgstr "اذكر معدل التقييم في مدير السلعة." @@ -28694,7 +28998,7 @@ msgstr "دمج التقدم" msgid "Merge Similar Account Heads" msgstr "دمج رؤوس الحسابات المتشابهة" -#: erpnext/public/js/utils.js:1007 +#: erpnext/public/js/utils.js:1072 msgid "Merge taxes from multiple documents" msgstr "دمج الضرائب من وثائق متعددة" @@ -28707,7 +29011,7 @@ msgstr "دمج مع حساب موجود" msgid "Merged" msgstr "تم الدمج" -#: erpnext/accounts/doctype/account/account.py:601 +#: erpnext/accounts/doctype/account/account.py:603 msgid "Merging is only possible if following properties are same in both records. Is Group, Root Type, Company and Account Currency" msgstr "لا يمكن دمج السجلات إلا إذا كانت الخصائص التالية متطابقة في كلا السجلين: المجموعة، والنوع الجذر، والشركة، وعملة الحساب." @@ -28717,6 +29021,7 @@ msgstr "دمج {0} من {1}" #. Label of the message_for_supplier (Text Editor) field in DocType 'Request #. for Quotation' +#. Label of the mfs_html (Code) field in DocType 'Request for Quotation' #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json msgid "Message for Supplier" msgstr "رسالة لمزود" @@ -28736,7 +29041,7 @@ msgstr "سيتم إرسال رسالة إلى المستخدمين للحصول msgid "Messages greater than 160 characters will be split into multiple messages" msgstr "سيتم تقسيم الرسائل التي تزيد عن 160 حرفا إلى رسائل متعددة" -#: erpnext/setup/install.py:127 +#: erpnext/setup/install.py:128 msgid "Messaging CRM Campaign" msgstr "" @@ -28935,7 +29240,7 @@ msgstr "الكمية الادنى لايمكن ان تكون اكبر من ال msgid "Min Qty should be greater than Recurse Over Qty" msgstr "يجب أن تكون الكمية الدنيا أكبر من الكمية المطلوبة للتكرار." -#: erpnext/stock/doctype/item/item.js:853 +#: erpnext/stock/doctype/item/item.js:871 msgid "Min Value: {0}, Max Value: {1}, in Increments of: {2}" msgstr "القيمة الدنيا: {0}، القيمة القصوى: {1}، بزيادات قدرها: {2}" @@ -29020,15 +29325,15 @@ msgstr "نفقات متنوعة" msgid "Mismatch" msgstr "عدم تطابق" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1450 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1461 msgid "Missing" msgstr "مفتقد" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:97 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:201 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:597 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2421 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3027 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:598 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2425 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3031 #: erpnext/assets/doctype/asset_category/asset_category.py:126 msgid "Missing Account" msgstr "حساب مفقود" @@ -29037,16 +29342,16 @@ msgstr "حساب مفقود" msgid "Missing Accounts" msgstr "" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:430 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:431 msgid "Missing Asset" msgstr "أصل مفقود" #: erpnext/accounts/doctype/gl_entry/gl_entry.py:186 -#: erpnext/assets/doctype/asset/asset.py:377 +#: erpnext/assets/doctype/asset/asset.py:378 msgid "Missing Cost Center" msgstr "مركز التكلفة المفقود" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1131 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1148 msgid "Missing Default in Company" msgstr "غياب الوضع الافتراضي في الشركة" @@ -29054,22 +29359,26 @@ msgstr "غياب الوضع الافتراضي في الشركة" msgid "Missing Filters" msgstr "فلاتر مفقودة" -#: erpnext/assets/doctype/asset/asset.py:422 +#: erpnext/assets/doctype/asset/asset.py:423 msgid "Missing Finance Book" msgstr "كتاب التمويل المفقود" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1681 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1686 msgid "Missing Finished Good" msgstr "مفقود، تم الانتهاء منه، جيد" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:310 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:312 msgid "Missing Formula" msgstr "الصيغة المفقودة" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:992 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:997 msgid "Missing Item" msgstr "العنصر المفقود" +#: erpnext/setup/doctype/employee/employee.py:451 +msgid "Missing Parameter" +msgstr "" + #: erpnext/utilities/__init__.py:53 msgid "Missing Payments App" msgstr "تطبيق المدفوعات المفقودة" @@ -29091,7 +29400,7 @@ msgid "Missing required filter: {0}" msgstr "الفلتر المطلوب مفقود: {0}" #: erpnext/manufacturing/doctype/bom/bom.py:1192 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1465 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1476 msgid "Missing value" msgstr "قيمة مفقودة" @@ -29198,11 +29507,6 @@ msgstr "تم التعديل بتاريخ" msgid "Module (for Export)" msgstr "وحدة (للتصدير)" -#. Label of the monitor_progress (Section Break) field in DocType 'Project' -#: erpnext/projects/doctype/project/project.json -msgid "Monitor Progress" -msgstr "التقدم المرئى" - #. Label of the monitor_for_last_x_days (Int) field in DocType 'Ledger Health #. Monitor' #: erpnext/accounts/doctype/ledger_health_monitor/ledger_health_monitor.json @@ -29339,7 +29643,7 @@ msgstr "منشئ قوائم المواد متعددة المستويات" msgid "Multiple Loyalty Programs found for Customer {}. Please select manually." msgstr "تم العثور على عدة برامج ولاء للعميل {}. يرجى الاختيار يدويًا." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1196 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1197 msgid "Multiple POS Opening Entry" msgstr "إدخال بيانات فتح نقاط البيع المتعددة" @@ -29353,11 +29657,11 @@ msgstr "توجد قواعد أسعار متعددة بنفس المعايير، msgid "Multiple Tier Program" msgstr "برنامج متعدد الطبقات" -#: erpnext/stock/doctype/item/item.js:175 +#: erpnext/stock/doctype/item/item.js:193 msgid "Multiple Variants" msgstr "متغيرات متعددة" -#: erpnext/stock/doctype/warehouse/warehouse.py:152 +#: erpnext/stock/doctype/warehouse/warehouse.py:153 msgid "Multiple Warehouse Accounts" msgstr "حسابات مستودعات متعددة" @@ -29365,11 +29669,11 @@ msgstr "حسابات مستودعات متعددة" msgid "Multiple company fields available: {0}. Please select manually." msgstr "" -#: erpnext/controllers/accounts_controller.py:1302 +#: erpnext/controllers/accounts_controller.py:1303 msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year" msgstr "يوجد سنوات مالية متعددة لنفس التاريخ {0}. الرجاء تحديد الشركة لهذه السنة المالية\\n
    \\nMultiple fiscal years exist for the date {0}. Please set company in Fiscal Year" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1688 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1693 msgid "Multiple items cannot be marked as finished item" msgstr "لا يمكن وضع علامة \"منتج نهائي\" على عدة عناصر" @@ -29378,10 +29682,10 @@ msgid "Music" msgstr "موسيقى" #. Label of the must_be_whole_number (Check) field in DocType 'UOM' -#: erpnext/manufacturing/doctype/work_order/work_order.py:1412 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1423 #: erpnext/setup/doctype/uom/uom.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267 -#: erpnext/utilities/transaction_base.py:567 +#: erpnext/utilities/transaction_base.py:568 msgid "Must be Whole Number" msgstr "يجب أن يكون عدد صحيح" @@ -29454,11 +29758,11 @@ msgstr "بادئة سلسلة التسمية" msgid "Naming Series and Price Defaults" msgstr "تسمية السلاسل والأسعار الافتراضية" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:95 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:97 msgid "Naming Series is mandatory" msgstr "سلسلة التسمية إلزامية" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:934 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:938 msgid "Naming series '{0}' for DocType '{1}' does not contain standard '.' or '{{' separator. Using fallback extraction." msgstr "" @@ -29502,16 +29806,16 @@ msgstr "تحليل الاحتياجات" msgid "Negative Batch Report" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:622 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:626 msgid "Negative Quantity is not allowed" msgstr "الكمية السلبية غير مسموح بها\\n
    \\nnegative Quantity is not allowed" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1491 -#: erpnext/stock/serial_batch_bundle.py:1521 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1533 +#: erpnext/stock/serial_batch_bundle.py:1529 msgid "Negative Stock Error" msgstr "خطأ في المخزون السالب" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:627 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:631 msgid "Negative Valuation Rate is not allowed" msgstr "معدل التقييم السلبي غير مسموح به\\n
    \\nNegative Valuation Rate is not allowed" @@ -29615,7 +29919,7 @@ msgid "Net Change in Accounts Receivable" msgstr "صافي التغير في الحسابات المدينة" #: erpnext/accounts/report/cash_flow/cash_flow.py:134 -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:254 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:257 msgid "Net Change in Cash" msgstr "صافي التغير في النقد" @@ -29648,7 +29952,7 @@ msgstr "صافي الربح" msgid "Net Profit Ratio" msgstr "نسبة صافي الربح" -#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:184 +#: erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py:185 msgid "Net Profit/Loss" msgstr "صافي الربح (الخسارة" @@ -29662,11 +29966,11 @@ msgstr "صافي الربح (الخسارة" msgid "Net Purchase Amount" msgstr "صافي مبلغ الشراء" -#: erpnext/assets/doctype/asset/asset.py:453 +#: erpnext/assets/doctype/asset/asset.py:454 msgid "Net Purchase Amount is mandatory" msgstr "مبلغ الشراء الصافي إلزامي" -#: erpnext/assets/doctype/asset/asset.py:563 +#: erpnext/assets/doctype/asset/asset.py:564 msgid "Net Purchase Amount should be equal to purchase amount of one single Asset." msgstr "" @@ -29817,7 +30121,7 @@ msgstr "الوزن الصافي" msgid "Net Weight UOM" msgstr "الوزن الصافي لوحدة القياس" -#: erpnext/controllers/accounts_controller.py:1662 +#: erpnext/controllers/accounts_controller.py:1663 msgid "Net total calculation precision loss" msgstr "صافي إجمالي فقدان دقة الحساب" @@ -30057,7 +30361,7 @@ msgstr "لا رد فعل" msgid "No Answer" msgstr "لا يوجد رد" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2526 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2530 msgid "No Customer found for Inter Company Transactions which represents company {0}" msgstr "لم يتم العثور على زبون للمعاملات بين الشركات التي تمثل الشركة {0}" @@ -30070,7 +30374,7 @@ msgstr "لم يتم العثور على عملاء بالخيارات المحد msgid "No Delivery Note selected for Customer {}" msgstr "لم يتم تحديد ملاحظة التسليم للعميل {}" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:751 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:755 msgid "No DocTypes in To Delete list. Please generate or import the list before submitting." msgstr "" @@ -30078,15 +30382,15 @@ msgstr "" msgid "No Impact on Accounting Ledger" msgstr "لا يوجد تأثير على دفتر الأستاذ المحاسبي" -#: erpnext/stock/get_item_details.py:318 +#: erpnext/stock/get_item_details.py:324 msgid "No Item with Barcode {0}" msgstr "أي عنصر مع الباركود {0}" -#: erpnext/stock/get_item_details.py:322 +#: erpnext/stock/get_item_details.py:328 msgid "No Item with Serial No {0}" msgstr "أي عنصر مع المسلسل لا {0}" -#: erpnext/controllers/subcontracting_controller.py:1483 +#: erpnext/controllers/subcontracting_controller.py:1490 msgid "No Items selected for transfer." msgstr "لم يتم تحديد أي عناصر للنقل." @@ -30110,13 +30414,13 @@ msgstr "لا توجد ملاحظات" msgid "No Outstanding Invoices found for this party" msgstr "لم يتم العثور على أي فواتير مستحقة لهذا الطرف" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:669 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:670 msgid "No POS Profile found. Please create a New POS Profile first" msgstr "لم يتم العثور على ملف تعريف نقطة البيع. يرجى إنشاء ملف تعريف نقطة بيع جديد أولاً" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1564 -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1624 -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1638 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1580 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1640 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1661 #: erpnext/stock/doctype/item/item.py:1405 msgid "No Permission" msgstr "لا يوجد تصريح" @@ -30130,8 +30434,8 @@ msgstr "لم يتم إنشاء أي أوامر شراء" msgid "No Records for these settings." msgstr "لا توجد سجلات لهذه الإعدادات." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:337 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1107 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:338 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1108 msgid "No Remarks" msgstr "لا ملاحظات" @@ -30151,7 +30455,7 @@ msgstr "لا يوجد مخزون متوفر حالياً" msgid "No Summary" msgstr "لا يوجد ملخص" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2510 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2514 msgid "No Supplier found for Inter Company Transactions which represents company {0}" msgstr "لم يتم العثور على مورد للمعاملات بين الشركات التي تمثل الشركة {0}" @@ -30180,12 +30484,12 @@ msgstr "لم يتم العثور على أي مدفوعات غير مطابقة msgid "No Work Orders were created" msgstr "لم يتم إنشاء أي أوامر عمل" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:826 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:828 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:861 msgid "No accounting entries for the following warehouses" msgstr "لا القيود المحاسبية للمستودعات التالية" -#: erpnext/selling/doctype/sales_order/sales_order.py:796 +#: erpnext/selling/doctype/sales_order/sales_order.py:798 msgid "No active BOM found for item {0}. Delivery by Serial No cannot be ensured" msgstr "لم يتم العثور على BOM نشط للعنصر {0}. لا يمكن ضمان التسليم عن طريق الرقم التسلسلي" @@ -30217,7 +30521,7 @@ msgstr "لم يتم العثور على بيانات. يبدو أنك قمت ب msgid "No description given" msgstr "لم يتم اعطاء وصف" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:225 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:226 msgid "No difference found for stock account {0}" msgstr "لم يتم العثور على أي فرق في حساب الأسهم {0}" @@ -30229,7 +30533,7 @@ msgstr "" msgid "No employee was scheduled for call popup" msgstr "لم يتم جدولة أي موظف للرد على مكالمة منبثقة" -#: erpnext/controllers/subcontracting_controller.py:1378 +#: erpnext/controllers/subcontracting_controller.py:1381 msgid "No item available for transfer." msgstr "لا يوجد عنصر متاح للتحويل." @@ -30250,7 +30554,7 @@ msgstr "لم يتم العثور على العناصر. امسح الباركو msgid "No items in cart" msgstr "لا توجد عناصر في سلة التسوق" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:456 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:460 msgid "No matches occurred via auto reconciliation" msgstr "لم يتم العثور على أي تطابقات عبر التوفيق التلقائي" @@ -30336,7 +30640,7 @@ msgstr "عدد محطات العمل" msgid "No open Material Requests found for the given criteria." msgstr "لم يتم العثور على أي طلبات مواد مفتوحة وفقًا للمعايير المحددة." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1190 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1191 msgid "No open POS Opening Entry found for POS Profile {0}." msgstr "لم يتم العثور على إدخال فتح نقطة بيع مفتوح لملف تعريف نقطة البيع {0}." @@ -30348,15 +30652,15 @@ msgstr "لا يوجد حدث مفتوح" msgid "No open task" msgstr "لا توجد عمليات مفتوحة" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:330 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:331 msgid "No outstanding invoices found" msgstr "لم يتم العثور على فواتير معلقة" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:328 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:329 msgid "No outstanding invoices require exchange rate revaluation" msgstr "لا تتطلب الفواتير المستحقة إعادة تقييم سعر الصرف" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2414 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2433 msgid "No outstanding {0} found for the {1} {2} which qualify the filters you have specified." msgstr "لم يتم العثور على أي {0} متميز لـ {1} {2} التي تفي بالمعايير التي حددتها." @@ -30364,6 +30668,10 @@ msgstr "لم يتم العثور على أي {0} متميز لـ {1} {2} الت msgid "No pending Material Requests found to link for the given items." msgstr "لم يتم العثور على طلبات المواد المعلقة للربط للعناصر المحددة." +#: erpnext/public/js/controllers/transaction.js:468 +msgid "No pending payment schedules available." +msgstr "" + #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py:502 msgid "No primary email found for customer: {0}" msgstr "لم يتم العثور على بريد إلكتروني أساسي للعميل: {0}" @@ -30386,15 +30694,15 @@ msgstr "" msgid "No record found" msgstr "لم يتم العثور على أي سجل" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:743 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:745 msgid "No records found in Allocation table" msgstr "لم يتم العثور على أي سجلات في جدول التخصيص" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:620 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:622 msgid "No records found in the Invoices table" msgstr "لم يتم العثور على أي سجلات في جدول الفواتير" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:623 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:625 msgid "No records found in the Payments table" msgstr "لم يتم العثور على أي سجلات في جدول المدفوعات" @@ -30406,7 +30714,7 @@ msgstr "لا توجد أسهم محجوزة لإلغاء حجزها." msgid "No rows with zero document count found" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:804 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:808 msgid "No stock ledger entries were created. Please set the quantity or valuation rate for the items properly and try again." msgstr "لم يتم إنشاء أي قيود في دفتر الأستاذ الخاص بالمخزون. يرجى تحديد الكمية أو سعر التقييم للأصناف بشكل صحيح والمحاولة مرة أخرى." @@ -30421,7 +30729,7 @@ msgstr "لا يمكن إنشاء أو تعديل أي معاملات أسهم ق msgid "No values" msgstr "لا توجد قيم" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2574 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2578 msgid "No {0} found for Inter Company Transactions." msgstr "لم يتم العثور على {0} معاملات Inter Company." @@ -30475,13 +30783,13 @@ msgstr "الالتزامات غير المتداولة" msgid "Non-Zeros" msgstr "غير الصفر" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:556 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:560 msgid "None of the items have any change in quantity or value." msgstr "لا يوجد أي من البنود لديها أي تغيير في كمية أو قيمة.\\n
    \\nNone of the items have any change in quantity or value." #. Name of a UOM -#: erpnext/setup/setup_wizard/data/uom_data.json erpnext/stock/utils.py:683 -#: erpnext/stock/utils.py:685 +#: erpnext/setup/setup_wizard/data/uom_data.json erpnext/stock/utils.py:686 +#: erpnext/stock/utils.py:688 msgid "Nos" msgstr "لا" @@ -30545,7 +30853,7 @@ msgstr "لم تبدأ" msgid "Not able to find the earliest Fiscal Year for the given company." msgstr "لم نتمكن من العثور على أقدم سنة مالية للشركة المذكورة." -#: erpnext/stock/doctype/item_alternative/item_alternative.py:33 +#: erpnext/stock/doctype/item_alternative/item_alternative.py:35 msgid "Not allow to set alternative item for the item {0}" msgstr "لا تسمح بتعيين عنصر بديل للعنصر {0}" @@ -30599,7 +30907,7 @@ msgstr "ملاحظة: إذا كنت ترغب في استخدام المنتج ا msgid "Note: Item {0} added multiple times" msgstr "ملاحظة: تمت إضافة العنصر {0} عدة مرات" -#: erpnext/controllers/accounts_controller.py:708 +#: erpnext/controllers/accounts_controller.py:709 msgid "Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified" msgstr "ملاحظة : لن يتم إنشاء تدوين المدفوعات نظرا لأن \" حساب النقد او المصرف\" لم يتم تحديده" @@ -30611,7 +30919,7 @@ msgstr "ملاحظة: مركز التكلفة هذا هو مجموعة. لا ي msgid "Note: To merge the items, create a separate Stock Reconciliation for the old item {0}" msgstr "ملاحظة: لدمج الأصناف، أنشئ مطابقة مخزون منفصلة للصنف القديم {0}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1021 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1022 msgid "Note: {0}" msgstr "ملاحظة : {0}" @@ -30963,6 +31271,11 @@ msgstr "عند تقديم معاملة المخزون، سيقوم النظام msgid "On-machine press checks" msgstr "الشيكات الصحفية على الجهاز" +#. Title of the Module Onboarding 'Stock Onboarding' +#: erpnext/selling/module_onboarding/stock_onboarding/stock_onboarding.json +msgid "Onboarding for Stock!" +msgstr "" + #. Description of the 'Release Date' (Date) field in DocType 'Purchase Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json msgid "Once set, this invoice will be on hold till the set date" @@ -31008,7 +31321,7 @@ msgstr "لا يتم دعم سوى \"إدخالات الدفع\" التي تتم msgid "Only CSV and Excel files can be used to for importing data. Please check the file format you are trying to upload" msgstr "لا يمكن استخدام سوى ملفات CSV و Excel لاستيراد البيانات. يرجى التحقق من تنسيق الملف الذي تحاول تحميله." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1067 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1071 msgid "Only CSV files are allowed" msgstr "" @@ -31064,7 +31377,7 @@ msgstr "يجب أن يكون أحد خياري الإيداع أو السحب ف msgid "Only one operation can have 'Is Final Finished Good' checked when 'Track Semi Finished Goods' is enabled." msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1241 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1246 msgid "Only one {0} entry can be created against the Work Order {1}" msgstr "لا يمكن إنشاء سوى إدخال واحد {0} مقابل أمر العمل {1}" @@ -31220,14 +31533,14 @@ msgstr "افتتاحي" msgid "Opening & Closing" msgstr "الافتتاح والإغلاق" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:437 -#: erpnext/accounts/report/trial_balance/trial_balance.py:508 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:417 +#: erpnext/accounts/report/trial_balance/trial_balance.py:516 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:198 msgid "Opening (Cr)" msgstr "افتتاحي (Cr)" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:430 -#: erpnext/accounts/report/trial_balance/trial_balance.py:501 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:410 +#: erpnext/accounts/report/trial_balance/trial_balance.py:509 #: erpnext/accounts/report/trial_balance_for_party/trial_balance_for_party.py:191 msgid "Opening (Dr)" msgstr "افتتاحي (Dr)" @@ -31329,8 +31642,8 @@ msgstr "فتح الفاتورة البند" msgid "Opening Invoice Tool" msgstr "" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1646 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1990 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1647 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1994 msgid "Opening Invoice has rounding adjustment of {0}.

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

    Or, '{3}' can be enabled to not post any rounding adjustment." msgstr "" @@ -31356,7 +31669,7 @@ msgid "Opening Purchase Invoices have been created." msgstr "تم إنشاء فواتير الشراء الافتتاحية." #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:81 -#: erpnext/stock/report/stock_balance/stock_balance.py:459 +#: erpnext/stock/report/stock_balance/stock_balance.py:532 msgid "Opening Qty" msgstr "الكمية الافتتاحية" @@ -31376,7 +31689,7 @@ msgstr "مخزون أول المدة" msgid "Opening Time" msgstr "يفتح من الساعة" -#: erpnext/stock/report/stock_balance/stock_balance.py:466 +#: erpnext/stock/report/stock_balance/stock_balance.py:539 msgid "Opening Value" msgstr "القيمة الافتتاحية" @@ -31498,7 +31811,7 @@ msgstr "رقم صف العملية" msgid "Operation Time" msgstr "وقت العملية" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1471 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1482 msgid "Operation Time must be greater than 0 for Operation {0}" msgstr "زمن العملية يجب أن يكون أكبر من 0 للعملية {0}\\n
    \\nOperation Time must be greater than 0 for Operation {0}" @@ -31535,7 +31848,7 @@ msgstr "العملية {0} أطول من أي ساعات عمل متاحة في #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/work_order/work_order.js:314 #: erpnext/manufacturing/doctype/work_order/work_order.json -#: erpnext/setup/doctype/company/company.py:467 +#: erpnext/setup/doctype/company/company.py:468 #: erpnext/setup/doctype/email_digest/email_digest.json #: erpnext/templates/generators/bom.html:61 msgid "Operations" @@ -31596,7 +31909,7 @@ msgstr "الفرص حسب المصدر" #. Label of the opportunity_name (Link) field in DocType 'Customer' #. Label of the opportunity (Link) field in DocType 'Quotation' #. Label of a Workspace Sidebar Item -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:381 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:388 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json #: erpnext/crm/doctype/crm_settings/crm_settings.json @@ -31852,7 +32165,7 @@ msgstr "الكمية التي تم طلبها" #: erpnext/buying/doctype/supplier/supplier_dashboard.py:11 #: erpnext/selling/doctype/customer/customer_dashboard.py:20 -#: erpnext/selling/doctype/sales_order/sales_order.py:968 +#: erpnext/selling/doctype/sales_order/sales_order.py:970 #: erpnext/setup/doctype/company/company_dashboard.py:23 msgid "Orders" msgstr "أوامر" @@ -31860,9 +32173,13 @@ msgstr "أوامر" #. Label of the organization_section (Section Break) field in DocType 'Lead' #. Label of the organization_details_section (Section Break) field in DocType #. 'Opportunity' +#. Label of a Desktop Icon +#. Title of a Workspace Sidebar #: erpnext/crm/doctype/lead/lead.json #: erpnext/crm/doctype/opportunity/opportunity.json #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py:30 +#: erpnext/desktop_icon/organization.json +#: erpnext/workspace_sidebar/organization.json msgid "Organization" msgstr "منظمة" @@ -31963,12 +32280,12 @@ msgstr "أونصة/غالون (الولايات المتحدة)" #: erpnext/stock/report/available_serial_no/available_serial_no.py:119 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:83 -#: erpnext/stock/report/stock_balance/stock_balance.py:481 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:243 +#: erpnext/stock/report/stock_balance/stock_balance.py:554 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:307 msgid "Out Qty" msgstr "كمية خارجة" -#: erpnext/stock/report/stock_balance/stock_balance.py:487 +#: erpnext/stock/report/stock_balance/stock_balance.py:560 msgid "Out Value" msgstr "القيمة الخارجه" @@ -31986,7 +32303,7 @@ msgstr "من AMC" msgid "Out of Order" msgstr "خارج عن السيطرة" -#: erpnext/stock/doctype/pick_list/pick_list.py:568 +#: erpnext/stock/doctype/pick_list/pick_list.py:570 msgid "Out of Stock" msgstr "إنتهى من المخزن" @@ -32002,7 +32319,7 @@ msgstr "لا تغطيه الضمان" msgid "Out of stock" msgstr "إنتهى من المخزن" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1203 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 #: erpnext/selling/page/point_of_sale/pos_controller.js:208 msgid "Outdated POS Opening Entry" msgstr "إدخال بيانات فتح نقاط البيع القديمة" @@ -32055,7 +32372,7 @@ msgstr "الرصيد المستحق (عملة الشركة)" #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/discounted_invoice/discounted_invoice.json #: erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:899 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:903 #: erpnext/accounts/doctype/payment_reconciliation_invoice/payment_reconciliation_invoice.json #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.js:300 @@ -32064,7 +32381,7 @@ msgstr "الرصيد المستحق (عملة الشركة)" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:149 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1224 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1266 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:167 #: erpnext/accounts/report/purchase_register/purchase_register.py:289 #: erpnext/accounts/report/sales_register/sales_register.py:319 @@ -32108,7 +32425,7 @@ msgstr "" msgid "Over Billing Allowance (%)" msgstr "نسبة السماح بالفواتير الزائدة (%)" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1309 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:1316 msgid "Over Billing Allowance exceeded for Purchase Receipt Item {0} ({1}) by {2}%" msgstr "تم تجاوز حدّ السماح بالفواتير الزائدة لبند إيصال الشراء {0} ({1}) بنسبة {2}%" @@ -32126,7 +32443,7 @@ msgstr "بدل التسليم/الاستلام الزائد (%)" msgid "Over Picking Allowance" msgstr "بدل الإفراط في الانتقاء" -#: erpnext/controllers/stock_controller.py:1690 +#: erpnext/controllers/stock_controller.py:1731 msgid "Over Receipt" msgstr "إيصال زائد" @@ -32154,7 +32471,7 @@ msgstr "مبالغ محجوزة" msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role." msgstr "تم تجاهل الفوترة الزائدة لـ {0} {1} للعنصر {2} لأن لديك الدور {3} ." -#: erpnext/controllers/accounts_controller.py:2178 +#: erpnext/controllers/accounts_controller.py:2179 msgid "Overbilling of {} ignored because you have {} role." msgstr "تم تجاهل الفوترة الزائدة لـ {} لأن لديك دور {} ." @@ -32170,7 +32487,7 @@ msgstr "تم تجاهل الفوترة الزائدة لـ {} لأن لديك د #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:282 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:283 #: erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.json #: erpnext/assets/doctype/asset_maintenance_task/asset_maintenance_task.json #: erpnext/projects/doctype/task/task.json @@ -32334,11 +32651,11 @@ msgstr "تفاصيل دخول إغلاق نقطة البيع" msgid "POS Closing Entry Taxes" msgstr "ضرائب الدخول الختامية لنقاط البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:31 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:18 msgid "POS Closing Failed" msgstr "فشل إغلاق نقطة البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:53 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js:40 msgid "POS Closing failed while running in a background process. You can resolve the {0} and retry the process again." msgstr "فشل إغلاق نقطة البيع أثناء تشغيلها في عملية خلفية. يمكنك حل المشكلة {0} وإعادة محاولة العملية مرة أخرى." @@ -32393,19 +32710,19 @@ msgstr "سجل دمج فاتورة نقاط البيع" msgid "POS Invoice Reference" msgstr "مرجع فاتورة نقاط البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:117 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:119 msgid "POS Invoice is already consolidated" msgstr "تم بالفعل دمج فاتورة نقاط البيع." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:125 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:127 msgid "POS Invoice is not submitted" msgstr "لم يتم تقديم فاتورة نقاط البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:128 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:130 msgid "POS Invoice isn't created by user {}" msgstr "لم ينشئ المستخدم فاتورة نقاط البيع {}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:204 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:205 msgid "POS Invoice should have the field {0} checked." msgstr "يجب أن يكون حقل {0} محددًا في فاتورة نقاط البيع." @@ -32414,7 +32731,7 @@ msgstr "يجب أن يكون حقل {0} محددًا في فاتورة نقاط msgid "POS Invoices" msgstr "فواتير نقاط البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:86 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:88 msgid "POS Invoices can't be added when Sales Invoice is enabled" msgstr "لا يمكن إضافة فواتير نقاط البيع عند تفعيل فاتورة المبيعات" @@ -32454,7 +32771,7 @@ msgstr "" msgid "POS Opening Entry" msgstr "دخول فتح نقاط البيع" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1204 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1205 msgid "POS Opening Entry - {0} is outdated. Please close the POS and create a new POS Opening Entry." msgstr "إدخال فتح نقطة البيع - {0} قديم. يرجى إغلاق نقطة البيع وإنشاء إدخال فتح جديد." @@ -32475,7 +32792,7 @@ msgstr "تفاصيل دخول فتح نقاط البيع" msgid "POS Opening Entry Exists" msgstr "تم إنشاء مدخل فتح نقطة البيع" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1189 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1190 msgid "POS Opening Entry Missing" msgstr "بيانات فتح نقطة البيع مفقودة" @@ -32511,11 +32828,11 @@ msgstr "طريقة الدفع في نقاط البيع" msgid "POS Profile" msgstr "الملف الشخصي لنقطة البيع" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1197 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1198 msgid "POS Profile - {0} has multiple open POS Opening Entries. Please close or cancel the existing entries before proceeding." msgstr "ملف تعريف نقطة البيع - {0} يحتوي على عدة إدخالات مفتوحة لفتح نقاط البيع. يرجى إغلاق أو إلغاء الإدخالات الحالية قبل المتابعة." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:247 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:249 msgid "POS Profile - {0} is currently open. Please close the POS or cancel the existing POS Opening Entry before cancelling this POS Closing Entry." msgstr "ملف تعريف نقطة البيع - {0} مفتوح حاليًا. يُرجى إغلاق نقطة البيع أو إلغاء إدخال فتح نقطة البيع الحالي قبل إلغاء إدخال إغلاق نقطة البيع هذا." @@ -32524,16 +32841,16 @@ msgstr "ملف تعريف نقطة البيع - {0} مفتوح حاليًا. ي msgid "POS Profile User" msgstr "نقاط البيع الشخصية الملف الشخصي" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:122 -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:187 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:124 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:189 msgid "POS Profile doesn't match {}" msgstr "ملف تعريف نقطة البيع لا يتطابق مع {}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1157 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1158 msgid "POS Profile is mandatory to mark this invoice as POS Transaction." msgstr "ملف تعريف نقطة البيع إلزامي لتمييز هذه الفاتورة كمعاملة نقطة بيع." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1386 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1387 msgid "POS Profile required to make POS Entry" msgstr "ملف نقطة البيع مطلوب للقيام بإدخال خاص بنقطة البيع" @@ -32639,7 +32956,7 @@ msgstr "عنصر معبأ" msgid "Packed Items" msgstr "عناصر معبأة" -#: erpnext/controllers/stock_controller.py:1524 +#: erpnext/controllers/stock_controller.py:1565 msgid "Packed Items cannot be transferred internally" msgstr "لا يمكن نقل العناصر المعبأة داخلياً" @@ -32676,7 +32993,7 @@ msgstr "قائمة بمحتويات الشحنة" msgid "Packing Slip Item" msgstr "مادة كشف التعبئة" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:655 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:656 msgid "Packing Slip(s) cancelled" msgstr "تم إلغاء قائمة الشحنة" @@ -32699,7 +33016,7 @@ msgstr "فاصل صفحات بعد كل بيان حقوق الملكية" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:288 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:289 msgid "Paid" msgstr "مدفوع" @@ -32718,7 +33035,7 @@ msgstr "مدفوع" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:146 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1218 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1260 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:165 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:201 #: erpnext/accounts/report/pos_register/pos_register.py:209 @@ -32753,7 +33070,7 @@ msgstr "المبلغ المدفوع بعد الضريبة" msgid "Paid Amount After Tax (Company Currency)" msgstr "المبلغ المدفوع بعد الضريبة (عملة الشركة)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1927 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1946 msgid "Paid Amount cannot be greater than total negative outstanding amount {0}" msgstr "المبلغ المدفوع لا يمكن أن يكون أكبر من إجمالي المبلغ القائم السالب {0}" @@ -32767,8 +33084,8 @@ msgstr "نوع الحساب المدفوع" msgid "Paid To Account Type" msgstr "نوع الحساب المدفوع" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:327 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1153 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:328 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1154 msgid "Paid amount + Write Off Amount can not be greater than Grand Total" msgstr "المبلغ المدفوع + المبلغ المشطوب لا يمكن ان يكون أكبر من المجموع الكلي\\n
    \\nPaid amount + Write Off Amount can not be greater than Grand Total" @@ -32844,7 +33161,7 @@ msgstr "الطرود" msgid "Parent Account" msgstr "حساب اب" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:379 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:381 msgid "Parent Account Missing" msgstr "حساب الوالدين مفقود" @@ -32858,7 +33175,7 @@ msgstr "دفعة الأم" msgid "Parent Company" msgstr "الشركة الام" -#: erpnext/setup/doctype/company/company.py:602 +#: erpnext/setup/doctype/company/company.py:603 msgid "Parent Company must be a group company" msgstr "يجب أن تكون الشركة الأم شركة مجموعة" @@ -32943,11 +33260,11 @@ msgstr "مجموعة موردي الآباء" msgid "Parent Task" msgstr "المهمة الرئيسية" -#: erpnext/projects/doctype/task/task.py:168 +#: erpnext/projects/doctype/task/task.py:170 msgid "Parent Task {0} is not a Template Task" msgstr "المهمة الأصلية {0} ليست مهمة نموذجية" -#: erpnext/projects/doctype/task/task.py:191 +#: erpnext/projects/doctype/task/task.py:193 msgid "Parent Task {0} must be a Group Task" msgstr "يجب أن تكون المهمة الرئيسية {0} مهمة جماعية" @@ -32980,7 +33297,7 @@ msgstr "خطأ في التحليل" msgid "Partial Material Transferred" msgstr "تم نقل جزء من المواد" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1176 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1177 msgid "Partial Payment in POS Transactions are not allowed." msgstr "لا يُسمح بالدفع الجزئي في معاملات نقاط البيع." @@ -33182,10 +33499,11 @@ msgstr "أجزاء في المليون" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:142 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:54 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1155 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1197 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:71 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:147 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:228 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:49 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:240 #: erpnext/accounts/report/general_ledger/general_ledger.js:74 #: erpnext/accounts/report/general_ledger/general_ledger.py:752 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:51 @@ -33208,7 +33526,7 @@ msgstr "الطرف المعني" #. Name of a DocType #: erpnext/accounts/doctype/party_account/party_account.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1166 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1208 msgid "Party Account" msgstr "حساب طرف" @@ -33235,7 +33553,7 @@ msgstr "عملة حساب الطرف" msgid "Party Account No. (Bank Statement)" msgstr "رقم حساب الطرف (كشف حساب بنكي)" -#: erpnext/controllers/accounts_controller.py:2452 +#: erpnext/controllers/accounts_controller.py:2453 msgid "Party Account {0} currency ({1}) and document currency ({2}) should be same" msgstr "يجب أن تكون عملة حساب الطرف {0} ({1}) وعملة المستند ({2}) متطابقتين." @@ -33356,10 +33674,11 @@ msgstr "عنصر خاص بالحزب" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:81 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:58 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:41 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1149 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1191 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:58 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:141 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:219 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:231 #: erpnext/accounts/report/general_ledger/general_ledger.js:65 #: erpnext/accounts/report/general_ledger/general_ledger.py:751 #: erpnext/accounts/report/payment_ledger/payment_ledger.js:41 @@ -33378,20 +33697,20 @@ msgstr "عنصر خاص بالحزب" msgid "Party Type" msgstr "نوع الطرف" -#: erpnext/accounts/party.py:824 +#: erpnext/accounts/party.py:826 msgid "Party Type and Party can only be set for Receivable / Payable account

    {0}" msgstr "" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:627 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:633 msgid "Party Type and Party is mandatory for {0} account" msgstr "نوع الطرف والحزب إلزامي لحساب {0}" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:161 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:165 msgid "Party Type and Party is required for Receivable / Payable account {0}" msgstr "نوع الطرف والطرف مطلوبان لحسابات القبض / الدفع {0}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:519 -#: erpnext/accounts/party.py:425 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:520 +#: erpnext/accounts/party.py:418 msgid "Party Type is mandatory" msgstr "حقل نوع المستفيد إلزامي\\n
    \\nParty Type is mandatory" @@ -33404,7 +33723,7 @@ msgstr "مستخدم الحزب" msgid "Party can only be one of {0}" msgstr "لا يمكن أن يكون الحزب إلا واحدًا من {0}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:522 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:523 msgid "Party is mandatory" msgstr "حقل المستفيد إلزامي\\n
    \\nParty is mandatory" @@ -33498,7 +33817,7 @@ msgid "Payable" msgstr "واجب الدفع" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:39 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1164 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1206 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:204 #: erpnext/accounts/report/purchase_register/purchase_register.py:194 #: erpnext/accounts/report/purchase_register/purchase_register.py:235 @@ -33608,7 +33927,7 @@ msgstr "تاريخ استحقاق السداد" msgid "Payment Entries" msgstr "ادخال دفعات" -#: erpnext/accounts/utils.py:1152 +#: erpnext/accounts/utils.py:1154 msgid "Payment Entries {0} are un-linked" msgstr "تدوين مدفوعات {0} غير مترابطة" @@ -33648,20 +33967,20 @@ msgstr "دفع الاشتراك خصم" msgid "Payment Entry Reference" msgstr "دفع الدخول المرجعي" -#: erpnext/accounts/doctype/payment_request/payment_request.py:453 +#: erpnext/accounts/doctype/payment_request/payment_request.py:476 msgid "Payment Entry already exists" msgstr "تدوين المدفوعات موجود بالفعل" -#: erpnext/accounts/utils.py:649 +#: erpnext/accounts/utils.py:651 msgid "Payment Entry has been modified after you pulled it. Please pull it again." msgstr "تم تعديل تدوين مدفوعات بعد سحبه. يرجى سحبه مرة أخرى." -#: erpnext/accounts/doctype/payment_request/payment_request.py:131 -#: erpnext/accounts/doctype/payment_request/payment_request.py:559 +#: erpnext/accounts/doctype/payment_request/payment_request.py:154 +#: erpnext/accounts/doctype/payment_request/payment_request.py:636 msgid "Payment Entry is already created" msgstr "تدوين المدفوعات تم انشاؤه بالفعل" -#: erpnext/controllers/accounts_controller.py:1613 +#: erpnext/controllers/accounts_controller.py:1614 msgid "Payment Entry {0} is linked against Order {1}, check if it should be pulled as advance in this invoice." msgstr "تم ربط إدخال الدفعة {0} بالطلب {1}، تحقق مما إذا كان يجب سحبه كدفعة مقدمة في هذه الفاتورة." @@ -33695,7 +34014,7 @@ msgstr "بوابة الدفع" msgid "Payment Gateway Account" msgstr "دفع حساب البوابة" -#: erpnext/accounts/utils.py:1438 +#: erpnext/accounts/utils.py:1447 msgid "Payment Gateway Account not created, please create one manually." msgstr "حساب بوابة الدفع لم يتم انشاءه، يرجى إنشاء واحد يدويا." @@ -33710,7 +34029,7 @@ msgstr "تفاصيل الدفع بوابة" msgid "Payment Ledger" msgstr "دفتر المدفوعات" -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:248 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:260 msgid "Payment Ledger Balance" msgstr "رصيد دفتر المدفوعات" @@ -33811,7 +34130,7 @@ msgid "Payment Received" msgstr "تم استلام الدفعة" #. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/payments.json +#: erpnext/workspace_sidebar/invoicing.json msgid "Payment Reconciliaition" msgstr "" @@ -33821,7 +34140,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.json -#: erpnext/workspace_sidebar/invoicing.json +#: erpnext/workspace_sidebar/payments.json msgid "Payment Reconciliation" msgstr "دفع المصالحة" @@ -33852,7 +34171,11 @@ msgstr "إعدادات مطابقة المدفوعات" #. Label of the payment_reference (Data) field in DocType 'Payment Order #. Reference' +#. Name of a DocType +#. Label of the payment_reference (Table) field in DocType 'Payment Request' #: erpnext/accounts/doctype/payment_order_reference/payment_order_reference.json +#: erpnext/accounts/doctype/payment_reference/payment_reference.json +#: erpnext/accounts/doctype/payment_request/payment_request.json msgid "Payment Reference" msgstr "إشارة دفع" @@ -33872,7 +34195,7 @@ msgstr "المراجع الدفع" #. Name of a DocType #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1722 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1726 #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json #: erpnext/accounts/doctype/payment_order/payment_order.js:19 #: erpnext/accounts/doctype/payment_order/payment_order.json @@ -33899,11 +34222,11 @@ msgstr "طلب دفع معلق" msgid "Payment Request Type" msgstr "نوع طلب الدفع" -#: erpnext/accounts/doctype/payment_request/payment_request.py:632 +#: erpnext/accounts/doctype/payment_request/payment_request.py:709 msgid "Payment Request for {0}" msgstr "طلب الدفع ل {0}" -#: erpnext/accounts/doctype/payment_request/payment_request.py:574 +#: erpnext/accounts/doctype/payment_request/payment_request.py:650 msgid "Payment Request is already created" msgstr "تم إنشاء طلب الدفع بالفعل" @@ -33911,7 +34234,7 @@ msgstr "تم إنشاء طلب الدفع بالفعل" msgid "Payment Request took too long to respond. Please try requesting for payment again." msgstr "استغرق طلب الدفع وقتاً طويلاً للرد. يرجى محاولة طلب الدفع مرة أخرى." -#: erpnext/accounts/doctype/payment_request/payment_request.py:544 +#: erpnext/accounts/doctype/payment_request/payment_request.py:567 msgid "Payment Requests cannot be created against: {0}" msgstr "لا يمكن إنشاء طلبات دفع مقابل: {0}" @@ -33922,6 +34245,7 @@ msgid "Payment Requests made from Sales / Purchase Invoice will be put in Draft msgstr "سيتم وضع طلبات الدفع المقدمة من فواتير المبيعات/المشتريات في حالة المسودة بشكل صريح." #. Label of the payment_schedule (Data) field in DocType 'Overdue Payment' +#. Label of the payment_schedule (Link) field in DocType 'Payment Reference' #. Name of a DocType #. Label of the payment_schedule (Table) field in DocType 'POS Invoice' #. Label of the payment_schedule (Table) field in DocType 'Purchase Invoice' @@ -33930,23 +34254,33 @@ msgstr "سيتم وضع طلبات الدفع المقدمة من فواتير #. Label of the payment_schedule (Table) field in DocType 'Quotation' #. Label of the payment_schedule (Table) field in DocType 'Sales Order' #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json +#: erpnext/accounts/doctype/payment_reference/payment_reference.json #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/controllers/accounts_controller.py:2729 +#: erpnext/controllers/accounts_controller.py:2733 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json msgid "Payment Schedule" msgstr "جدول الدفع" +#: erpnext/accounts/doctype/payment_request/payment_request.py:589 +msgid "Payment Schedule based Payment Requests cannot be created because a Payment Entry already exists for this document." +msgstr "" + +#: erpnext/public/js/controllers/transaction.js:478 +msgid "Payment Schedules" +msgstr "" + #: erpnext/accounts/print_format/sales_invoice_print/sales_invoice_print.html:123 msgid "Payment Status" msgstr "حالة الدفع" #. Label of the payment_term (Link) field in DocType 'Overdue Payment' #. Label of the payment_term (Link) field in DocType 'Payment Entry Reference' +#. Label of the payment_term (Link) field in DocType 'Payment Reference' #. Label of the payment_term (Link) field in DocType 'Payment Schedule' #. Name of a DocType #. Label of the payment_term (Link) field in DocType 'Payment Terms Template @@ -33955,12 +34289,14 @@ msgstr "حالة الدفع" #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/overdue_payment/overdue_payment.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json +#: erpnext/accounts/doctype/payment_reference/payment_reference.json #: erpnext/accounts/doctype/payment_schedule/payment_schedule.json #: erpnext/accounts/doctype/payment_term/payment_term.json #: erpnext/accounts/doctype/payment_terms_template_detail/payment_terms_template_detail.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1214 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1256 #: erpnext/accounts/report/gross_profit/gross_profit.py:449 #: erpnext/accounts/workspace/invoicing/invoicing.json +#: erpnext/public/js/controllers/transaction.js:492 #: erpnext/selling/report/payment_terms_status_for_sales_order/payment_terms_status_for_sales_order.py:30 #: erpnext/workspace_sidebar/accounts_setup.json msgid "Payment Term" @@ -34038,8 +34374,8 @@ msgstr "نموذج شروط الدفع" msgid "Payment Terms Template Detail" msgstr "شروط الدفع تفاصيل قالب" -#. Description of the 'Automatically Fetch Payment Terms from Order' (Check) -#. field in DocType 'Accounts Settings' +#. Description of the 'Automatically Fetch Payment Terms from Order/Quotation' +#. (Check) field in DocType 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json msgid "Payment Terms from orders will be fetched into the invoices as is" msgstr "سيتم استيراد شروط الدفع من الطلبات إلى الفواتير كما هي." @@ -34056,7 +34392,7 @@ msgstr "شروط الدفع:" msgid "Payment Type" msgstr "نوع الدفع" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:608 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:609 msgid "Payment Type must be one of Receive, Pay and Internal Transfer" msgstr "نوع الدفع يجب أن يكون إما استلام , دفع أو مناقلة داخلية\\n
    \\nPayment Type must be one of Receive, Pay and Internal Transfer" @@ -34065,15 +34401,15 @@ msgstr "نوع الدفع يجب أن يكون إما استلام , دفع أو msgid "Payment URL" msgstr "رابط الدفع" -#: erpnext/accounts/utils.py:1140 +#: erpnext/accounts/utils.py:1142 msgid "Payment Unlink Error" msgstr "خطأ في إلغاء ربط الدفع" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:889 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:890 msgid "Payment against {0} {1} cannot be greater than Outstanding Amount {2}" msgstr "الدفعة مقابل {0} {1} لا يمكن أن تكون أكبر من المبلغ القائم {2}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:801 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:802 msgid "Payment amount cannot be less than or equal to 0" msgstr "لا يمكن أن يكون مبلغ الدفعة أقل من أو يساوي 0" @@ -34090,7 +34426,7 @@ msgstr "تم استلام دفعة بقيمة {0} بنجاح." msgid "Payment of {0} received successfully. Waiting for other requests to complete..." msgstr "تم استلام المبلغ {0} بنجاح. جارٍ انتظار إتمام الطلبات الأخرى..." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:389 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:390 msgid "Payment related to {0} is not completed" msgstr "الدفع المتعلق بـ {0} لم يكتمل" @@ -34098,7 +34434,7 @@ msgstr "الدفع المتعلق بـ {0} لم يكتمل" msgid "Payment request failed" msgstr "فشلت عملية الدفع" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:822 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:823 msgid "Payment term {0} not used in {1}" msgstr "لم يتم استخدام مصطلح الدفع {0} في {1}" @@ -34465,7 +34801,7 @@ msgstr "المحاسبة الدورية" msgid "Periodic Accounting Entry" msgstr "قيد محاسبي دوري" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:251 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:252 msgid "Periodic Accounting Entry is not allowed for company {0} with perpetual inventory enabled" msgstr "لا يُسمح بإدخال القيد المحاسبي الدوري للشركة {0} التي تم تفعيل نظام الجرد الدائم لها" @@ -34548,7 +34884,7 @@ msgstr "رقم الهاتف الداخلي" #. Label of the phone_no (Data) field in DocType 'Company' #. Label of the phone_no (Data) field in DocType 'Warehouse' -#: erpnext/public/js/print.js:66 erpnext/setup/doctype/company/company.json +#: erpnext/public/js/print.js:77 erpnext/setup/doctype/company/company.json #: erpnext/stock/doctype/warehouse/warehouse.json msgid "Phone No" msgstr "رقم الهاتف" @@ -34578,7 +34914,7 @@ msgstr "رقم الهاتف" msgid "Pick List" msgstr "قائمة الانتقاء" -#: erpnext/stock/doctype/pick_list/pick_list.py:231 +#: erpnext/stock/doctype/pick_list/pick_list.py:233 msgid "Pick List Incomplete" msgstr "قائمة الاختيارات غير مكتملة" @@ -34897,7 +35233,7 @@ msgstr "أرضيات المصانع" msgid "Plants and Machineries" msgstr "وحدات التصنيع والآلات" -#: erpnext/stock/doctype/pick_list/pick_list.py:565 +#: erpnext/stock/doctype/pick_list/pick_list.py:567 msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List." msgstr "يرجى إعادة تخزين العناصر وتحديث قائمة الاختيار للمتابعة. للتوقف ، قم بإلغاء قائمة الاختيار." @@ -34916,7 +35252,7 @@ msgstr "الرجاء تحديد عميل" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:123 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:222 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:145 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:146 msgid "Please Select a Supplier" msgstr "الرجاء تحديد مورد" @@ -34928,7 +35264,7 @@ msgstr "يرجى تحديد الأولوية" msgid "Please Set Supplier Group in Buying Settings." msgstr "يرجى تعيين مجموعة الموردين في إعدادات الشراء." -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1893 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1897 msgid "Please Specify Account" msgstr "يرجى تحديد الحساب" @@ -34944,11 +35280,11 @@ msgstr "الرجاء إضافة طريقة الدفع وتفاصيل الرصي msgid "Please add Operations first." msgstr "يرجى إضافة العمليات أولاً." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:201 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:211 msgid "Please add Request for Quotation to the sidebar in Portal Settings." msgstr "يرجى إضافة \"طلب عرض أسعار\" إلى الشريط الجانبي في إعدادات البوابة." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:416 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:418 msgid "Please add Root Account for - {0}" msgstr "يرجى إضافة حساب الجذر لـ - {0}" @@ -34976,7 +35312,7 @@ msgstr "الرجاء إضافة الحساب إلى شركة على مستوى msgid "Please add {1} role to user {0}." msgstr "يرجى إضافة الدور {1} إلى المستخدم {0}." -#: erpnext/controllers/stock_controller.py:1701 +#: erpnext/controllers/stock_controller.py:1742 msgid "Please adjust the qty or edit {0} to proceed." msgstr "يرجى تعديل الكمية أو تحرير {0} للمتابعة." @@ -34984,11 +35320,11 @@ msgstr "يرجى تعديل الكمية أو تحرير {0} للمتابعة." msgid "Please attach CSV file" msgstr "يرجى إرفاق ملف CSV" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3164 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3170 msgid "Please cancel and amend the Payment Entry" msgstr "يرجى إلغاء وتعديل إدخال الدفع" -#: erpnext/accounts/utils.py:1139 +#: erpnext/accounts/utils.py:1141 msgid "Please cancel payment entry manually first" msgstr "يرجى إلغاء عملية الدفع يدويًا أولاً" @@ -34998,11 +35334,11 @@ msgid "Please cancel related transaction." msgstr "يرجى إلغاء المعاملة ذات الصلة." #: erpnext/assets/doctype/asset/asset.js:85 -#: erpnext/assets/doctype/asset/asset.py:249 +#: erpnext/assets/doctype/asset/asset.py:250 msgid "Please capitalize this asset before submitting." msgstr "يرجى كتابة هذا الأصل بأحرف كبيرة قبل الإرسال." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:963 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:964 msgid "Please check Multi Currency option to allow accounts with other currency" msgstr "يرجى اختيار الخيار عملات متعددة للسماح بحسابات مع عملة أخرى" @@ -35014,7 +35350,11 @@ msgstr "يرجى التحقق من معالجة المحاسبة المؤجلة msgid "Please check either with operations or FG Based Operating Cost." msgstr "يرجى التحقق إما من قسم العمليات أو من قسم تكاليف التشغيل القائمة على المنتجات النهائية." -#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:531 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:151 +msgid "Please check the 'Enable Serial and Batch No for Item' checkbox in the {0} to make Serial and Batch Bundle for the item." +msgstr "" + +#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py:539 msgid "Please check the error message and take necessary actions to fix the error and then restart the reposting again." msgstr "يرجى مراجعة رسالة الخطأ واتخاذ الإجراءات اللازمة لإصلاح الخطأ ثم إعادة تشغيل عملية إعادة النشر مرة أخرى." @@ -35055,11 +35395,11 @@ msgstr "يرجى الاتصال بمسؤول النظام لتمديد حدود msgid "Please convert the parent account in corresponding child company to a group account." msgstr "الرجاء تحويل الحساب الرئيسي في الشركة الفرعية المقابلة إلى حساب مجموعة." -#: erpnext/selling/doctype/quotation/quotation.py:623 +#: erpnext/selling/doctype/quotation/quotation.py:630 msgid "Please create Customer from Lead {0}." msgstr "الرجاء إنشاء عميل من العميل المحتمل {0}." -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:132 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:156 msgid "Please create Landed Cost Vouchers against Invoices that have 'Update Stock' enabled." msgstr "يرجى إنشاء قسائم تكلفة الشحن مقابل الفواتير التي تم تمكين خيار \"تحديث المخزون\" فيها." @@ -35067,11 +35407,11 @@ msgstr "يرجى إنشاء قسائم تكلفة الشحن مقابل الفو msgid "Please create a new Accounting Dimension if required." msgstr "يرجى إنشاء بُعد محاسبي جديد إذا لزم الأمر." -#: erpnext/controllers/accounts_controller.py:801 +#: erpnext/controllers/accounts_controller.py:802 msgid "Please create purchase from internal sale or delivery document itself" msgstr "يرجى إنشاء عملية شراء من مستند البيع أو التسليم الداخلي نفسه" -#: erpnext/assets/doctype/asset/asset.py:463 +#: erpnext/assets/doctype/asset/asset.py:464 msgid "Please create purchase receipt or purchase invoice for the item {0}" msgstr "الرجاء إنشاء إيصال شراء أو فاتورة شراء للعنصر {0}" @@ -35083,11 +35423,11 @@ msgstr "يرجى حذف حزمة المنتج {0}قبل دمج {1} في {2}" msgid "Please disable workflow temporarily for Journal Entry {0}" msgstr "يرجى تعطيل سير العمل مؤقتًا لإدخال دفتر اليومية {0}" -#: erpnext/assets/doctype/asset/asset.py:567 +#: erpnext/assets/doctype/asset/asset.py:568 msgid "Please do not book expense of multiple assets against one single Asset." msgstr "يرجى عدم تسجيل مصروفات أصول متعددة مقابل أصل واحد." -#: erpnext/controllers/item_variant.py:235 +#: erpnext/controllers/item_variant.py:241 msgid "Please do not create more than 500 items at a time" msgstr "يرجى عدم إنشاء أكثر من 500 عنصر في وقت واحد" @@ -35099,7 +35439,7 @@ msgstr "يرجى تمكين Applicable على Booking Actual Expenses" msgid "Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses" msgstr "يرجى تمكين Applicable على أمر الشراء والتطبيق على المصروفات الفعلية للحجز" -#: erpnext/stock/doctype/pick_list/pick_list.py:282 +#: erpnext/stock/doctype/pick_list/pick_list.py:284 msgid "Please enable Use Old Serial / Batch Fields to make_bundle" msgstr "يرجى تفعيل خيار \"استخدام الحقول التسلسلية/الدفعية القديمة\" لإنشاء الحزمة" @@ -35111,32 +35451,32 @@ msgstr "يرجى تفعيل هذا الخيار فقط إذا كنت تفهم آ msgid "Please enable {0} in the {1}." msgstr "يرجى تفعيل {0} في {1}." -#: erpnext/controllers/selling_controller.py:846 +#: erpnext/controllers/selling_controller.py:854 msgid "Please enable {} in {} to allow same item in multiple rows" msgstr "يرجى تفعيل {} في {} للسماح بظهور العنصر نفسه في صفوف متعددة" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:377 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:378 msgid "Please ensure that the {0} account is a Balance Sheet account. You can change the parent account to a Balance Sheet account or select a different account." msgstr "يرجى التأكد من أن الحساب {0} هو حساب في الميزانية العمومية. يمكنك تغيير الحساب الرئيسي إلى حساب في الميزانية العمومية أو اختيار حساب مختلف." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:385 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:386 msgid "Please ensure that the {0} account {1} is a Payable account. You can change the account type to Payable or select a different account." msgstr "يرجى التأكد من أن الحساب {0} {1} هو حساب قابل للدفع. يمكنك تغيير نوع الحساب إلى قابل للدفع أو اختيار حساب آخر." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1013 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1014 msgid "Please ensure {} account is a Balance Sheet account." msgstr "يرجى التأكد من أن حساب {} هو حساب في الميزانية العمومية." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1023 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1024 msgid "Please ensure {} account {} is a Receivable account." msgstr "يرجى التأكد من أن حساب {} هو حساب مستحق القبض." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:700 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:705 msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}" msgstr "الرجاء إدخال حساب الفرق أو تعيين حساب تسوية المخزون الافتراضي للشركة {0}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:554 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1288 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:555 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1289 msgid "Please enter Account for Change Amount" msgstr "الرجاء إدخال الحساب لمبلغ التغيير\\n
    \\nPlease enter Account for Change Amount" @@ -35144,15 +35484,15 @@ msgstr "الرجاء إدخال الحساب لمبلغ التغيير\\n
    \\ msgid "Please enter Approving Role or Approving User" msgstr "الرجاء إدخال صلاحية المخول بالتصديق أو المستخدم المخول بالتصديق" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:677 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:681 msgid "Please enter Batch No" msgstr "" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:970 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:974 msgid "Please enter Cost Center" msgstr "يرجى إدخال مركز التكلفة\\n
    \\nPlease enter Cost Center" -#: erpnext/selling/doctype/sales_order/sales_order.py:420 +#: erpnext/selling/doctype/sales_order/sales_order.py:422 msgid "Please enter Delivery Date" msgstr "الرجاء إدخال تاريخ التسليم" @@ -35160,16 +35500,16 @@ msgstr "الرجاء إدخال تاريخ التسليم" msgid "Please enter Employee Id of this sales person" msgstr "الرجاء إدخال معرف الموظف الخاص بشخص المبيعات هذا" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:979 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:983 msgid "Please enter Expense Account" msgstr "الرجاء إدخال حساب النفقات\\n
    \\nPlease enter Expense Account" -#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:83 +#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.js:84 #: erpnext/stock/doctype/stock_entry/stock_entry.js:87 msgid "Please enter Item Code to get Batch Number" msgstr "الرجاء إدخال رمز العنصر للحصول على رقم الدفعة\\n
    \\nPlease enter Item Code to get Batch Number" -#: erpnext/public/js/controllers/transaction.js:2959 +#: erpnext/public/js/controllers/transaction.js:3061 msgid "Please enter Item Code to get batch no" msgstr "الرجاء إدخال كود البند للحصول على رقم الدفعة" @@ -35197,19 +35537,19 @@ msgstr "الرجاء إدخال بند الإنتاج أولا" msgid "Please enter Purchase Receipt first" msgstr "الرجاء إدخال إيصال الشراء أولا\\n
    \\nPlease enter Purchase Receipt first" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:113 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:120 msgid "Please enter Receipt Document" msgstr "الرجاء إدخال مستند الاستلام\\n
    \\nPlease enter Receipt Document" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1027 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1028 msgid "Please enter Reference date" msgstr "الرجاء إدخال تاريخ المرجع\\n
    \\nPlease enter Reference date" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:395 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:397 msgid "Please enter Root Type for account- {0}" msgstr "الرجاء إدخال نوع الجذر للحساب - {0}" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:679 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:683 msgid "Please enter Serial No" msgstr "" @@ -35225,8 +35565,8 @@ msgstr "يرجى إدخال معلومات طرد الشحنة" msgid "Please enter Warehouse and Date" msgstr "الرجاء إدخال المستودع والتاريخ" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:662 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1284 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:663 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1285 msgid "Please enter Write Off Account" msgstr "الرجاء إدخال حساب الشطب" @@ -35246,7 +35586,7 @@ msgstr "يرجى إدخال تاريخ تسليم واحد على الأقل و msgid "Please enter company name first" msgstr "الرجاء إدخال اسم الشركة اولاً" -#: erpnext/controllers/accounts_controller.py:2955 +#: erpnext/controllers/accounts_controller.py:2959 msgid "Please enter default currency in Company Master" msgstr "الرجاء إدخال العملة الافتراضية في شركة الرئيسية" @@ -35282,7 +35622,7 @@ msgstr "الرجاء إدخال اسم الشركة للتأكيد" msgid "Please enter the first delivery date" msgstr "يرجى إدخال تاريخ التسليم الأول" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:804 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:805 msgid "Please enter the phone number first" msgstr "الرجاء إدخال رقم الهاتف أولاً" @@ -35298,7 +35638,7 @@ msgstr "الرجاء إدخال تاريخ بداية السنة المالية msgid "Please enter {0}" msgstr "الرجاء إدخال {0}" -#: erpnext/public/js/utils/party.js:322 +#: erpnext/public/js/utils/party.js:344 msgid "Please enter {0} first" msgstr "الرجاء إدخال {0} أولاً" @@ -35322,7 +35662,7 @@ msgstr "يرجى إصلاح الفترات الزمنية المتداخلة ل msgid "Please fix overlapping time slots for {0}." msgstr "يرجى إصلاح الفترات الزمنية المتداخلة لـ {0}." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:270 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:272 msgid "Please generate To Delete list before submitting" msgstr "" @@ -35338,7 +35678,7 @@ msgstr "يرجى استيراد الحسابات مقابل الشركة الأ msgid "Please make sure the employees above report to another Active employee." msgstr "يرجى التأكد من أن الموظفين أعلاه يقدمون تقارير إلى موظف نشط آخر." -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:374 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:376 msgid "Please make sure the file you are using has 'Parent Account' column present in the header." msgstr "" @@ -35346,7 +35686,7 @@ msgstr "" msgid "Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone." msgstr "يرجى التأكد من أنك تريد حقا حذف جميع المعاملات لهذه الشركة. ستبقى بياناتك الرئيسية (الماستر) كما هيا. لا يمكن التراجع عن هذا الإجراء." -#: erpnext/stock/doctype/item/item.js:604 +#: erpnext/stock/doctype/item/item.js:622 msgid "Please mention 'Weight UOM' along with Weight." msgstr "يرجى ذكر \"وحدة قياس الوزن\" مع كلمة \"الوزن\"." @@ -35396,12 +35736,12 @@ msgstr "يرجى حفظ أمر البيع قبل إضافة جدول التسل msgid "Please select Template Type to download template" msgstr "يرجى تحديد نوع القالب لتنزيل القالب" -#: erpnext/controllers/taxes_and_totals.py:803 -#: erpnext/public/js/controllers/taxes_and_totals.js:782 +#: erpnext/controllers/taxes_and_totals.py:808 +#: erpnext/public/js/controllers/taxes_and_totals.js:796 msgid "Please select Apply Discount On" msgstr "الرجاء اختيار (تطبيق تخفيض على)" -#: erpnext/selling/doctype/sales_order/sales_order.py:1792 +#: erpnext/selling/doctype/sales_order/sales_order.py:1796 msgid "Please select BOM against item {0}" msgstr "الرجاء اختيار بوم ضد العنصر {0}" @@ -35421,7 +35761,7 @@ msgstr "يرجى اختيار الحساب المصرفي" msgid "Please select Category first" msgstr "الرجاء تحديد التصنيف أولا\\n
    \\nPlease select Category first" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1504 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1508 #: erpnext/public/js/controllers/accounts.js:94 #: erpnext/public/js/controllers/accounts.js:145 msgid "Please select Charge Type first" @@ -35432,7 +35772,7 @@ msgid "Please select Company" msgstr "الرجاء اختيار شركة \\n
    \\nPlease select Company" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js:139 -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:75 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:76 msgid "Please select Company and Posting Date to getting entries" msgstr "يرجى تحديد الشركة وتاريخ النشر للحصول على إدخالات" @@ -35445,13 +35785,13 @@ msgstr "الرجاء تحديد الشركة أولا\\n
    \\nPlease select Com msgid "Please select Completion Date for Completed Asset Maintenance Log" msgstr "يرجى تحديد تاريخ الانتهاء لاستكمال سجل صيانة الأصول" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:200 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:201 #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:84 #: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:125 msgid "Please select Customer first" msgstr "يرجى اختيار العميل أولا" -#: erpnext/setup/doctype/company/company.py:533 +#: erpnext/setup/doctype/company/company.py:534 msgid "Please select Existing Company for creating Chart of Accounts" msgstr "الرجاء اختيار الشركة الحالية لإنشاء دليل الحسابات" @@ -35477,11 +35817,11 @@ msgstr "يرجى تحديد حالة الصيانة على أنها اكتملت msgid "Please select Party Type first" msgstr "يرجى تحديد نوع الطرف أولا" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:257 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:258 msgid "Please select Periodic Accounting Entry Difference Account" msgstr "الرجاء تحديد حساب الفرق في إدخالات المحاسبة الدورية" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:517 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:518 msgid "Please select Posting Date before selecting Party" msgstr "الرجاء تجديد تاريخ النشر قبل تحديد المستفيد\\n
    \\nPlease select Posting Date before selecting Party" @@ -35493,7 +35833,7 @@ msgstr "الرجاء تحديد تاريخ النشر أولا\\n
    \\nPlease s msgid "Please select Price List" msgstr "الرجاء اختيار قائمة الأسعار\\n
    \\nPlease select Price List" -#: erpnext/selling/doctype/sales_order/sales_order.py:1794 +#: erpnext/selling/doctype/sales_order/sales_order.py:1798 msgid "Please select Qty against item {0}" msgstr "الرجاء اختيار الكمية ضد العنصر {0}" @@ -35509,15 +35849,15 @@ msgstr "يرجى تحديد الأرقام التسلسلية/أرقام الد msgid "Please select Start Date and End Date for Item {0}" msgstr "الرجاء تحديد تاريخ البدء وتاريخ الانتهاء للبند {0}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:276 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:277 msgid "Please select Stock Asset Account" msgstr "الرجاء تحديد حساب أصول الأسهم" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1605 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1610 msgid "Please select Subcontracting Order instead of Purchase Order {0}" msgstr "يرجى اختيار أمر التعاقد من الباطن بدلاً من أمر الشراء {0}" -#: erpnext/controllers/accounts_controller.py:2804 +#: erpnext/controllers/accounts_controller.py:2808 msgid "Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}" msgstr "يرجى تحديد حساب الأرباح/الخسائر غير المحققة أو إضافة حساب الأرباح/الخسائر غير المحققة الافتراضي للشركة {0}" @@ -35525,8 +35865,8 @@ msgstr "يرجى تحديد حساب الأرباح/الخسائر غير الم msgid "Please select a BOM" msgstr "يرجى تحديد بوم" -#: erpnext/accounts/party.py:427 -#: erpnext/stock/doctype/pick_list/pick_list.py:1617 +#: erpnext/accounts/party.py:420 +#: erpnext/stock/doctype/pick_list/pick_list.py:1631 msgid "Please select a Company" msgstr "الرجاء اختيار الشركة" @@ -35534,7 +35874,7 @@ msgstr "الرجاء اختيار الشركة" #: erpnext/manufacturing/doctype/bom/bom.js:680 #: erpnext/manufacturing/doctype/bom/bom.py:277 #: erpnext/public/js/controllers/accounts.js:277 -#: erpnext/public/js/controllers/transaction.js:3258 +#: erpnext/public/js/controllers/transaction.js:3360 msgid "Please select a Company first." msgstr "الرجاء تحديد شركة أولاً." @@ -35627,6 +35967,10 @@ msgstr "يرجى تحديد صف واحد على الأقل لإصلاحه" msgid "Please select at least one row with difference value" msgstr "يرجى تحديد صف واحد على الأقل بقيمة مختلفة" +#: erpnext/public/js/controllers/transaction.js:519 +msgid "Please select at least one schedule." +msgstr "" + #: erpnext/selling/doctype/sales_order/sales_order.js:1296 msgid "Please select atleast one item to continue" msgstr "يرجى اختيار عنصر واحد على الأقل للمتابعة" @@ -35635,7 +35979,7 @@ msgstr "يرجى اختيار عنصر واحد على الأقل للمتابع msgid "Please select atleast one operation to create Job Card" msgstr "يرجى تحديد عملية واحدة على الأقل لإنشاء بطاقة عمل" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1703 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1726 msgid "Please select correct account" msgstr "يرجى اختيارالحساب الصحيح" @@ -35681,7 +36025,7 @@ msgstr "يرجى تحديد الشركة" msgid "Please select the Multiple Tier Program type for more than one collection rules." msgstr "يرجى تحديد نوع البرنامج متعدد الطبقات لأكثر من قواعد مجموعة واحدة." -#: erpnext/stock/doctype/item/item.js:323 +#: erpnext/stock/doctype/item/item.js:341 msgid "Please select the Warehouse first" msgstr "يرجى تحديد المستودع أولاً" @@ -35708,8 +36052,8 @@ msgstr "يرجى اختيار نوع مستند صالح." msgid "Please select weekly off day" msgstr "الرجاء اختيار يوم العطلة الاسبوعي" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1222 -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:616 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1226 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:618 msgid "Please select {0} first" msgstr "الرجاء تحديد {0} أولا\\n
    \\nPlease select {0} first" @@ -35733,7 +36077,7 @@ msgstr "يرجى تعيين '{0}' في الشركة: {1}" msgid "Please set Account" msgstr "يرجى إنشاء حساب" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1881 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1885 msgid "Please set Account for Change Amount" msgstr "يرجى تحديد الحساب لمبلغ الباقي" @@ -35785,7 +36129,7 @@ msgstr "يرجى تحديد الرمز المالي للإدارة العامة msgid "Please set Fixed Asset Account in Asset Category {0}" msgstr "يرجى تعيين حساب الأصول الثابتة في فئة الأصول {0}" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:594 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:595 msgid "Please set Fixed Asset Account in {} against {}." msgstr "يرجى تعيين حساب الأصول الثابتة في {} مقابل {}." @@ -35807,7 +36151,7 @@ msgstr "يرجى تحديد نوع الجذر" msgid "Please set Tax ID for the customer '%s'" msgstr "يرجى تعيين رقم التعريف الضريبي للعميل '%s'" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:339 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:340 msgid "Please set Unrealized Exchange Gain/Loss Account in Company {0}" msgstr "يرجى تعيين حساب أرباح / خسائر غير محققة في الشركة {0}" @@ -35823,7 +36167,7 @@ msgstr "يرجى تحديد حسابات ضريبة القيمة المضافة msgid "Please set a Company" msgstr "الرجاء تعيين شركة" -#: erpnext/assets/doctype/asset/asset.py:374 +#: erpnext/assets/doctype/asset/asset.py:375 msgid "Please set a Cost Center for the Asset or set an Asset Depreciation Cost Center for the Company {}" msgstr "يرجى تحديد مركز تكلفة للأصل أو تحديد مركز تكلفة استهلاك الأصول للشركة {}" @@ -35835,7 +36179,7 @@ msgstr "يرجى تحديد قائمة العطلات الافتراضية لل msgid "Please set a default Holiday List for Employee {0} or Company {1}" msgstr "يرجى تعيين قائمة العطل الافتراضية للموظف {0} أو الشركة {1}\\n
    \\nPlease set a default Holiday List for Employee {0} or Company {1}" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1115 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1116 msgid "Please set account in Warehouse {0}" msgstr "يرجى تعيين الحساب في مستودع {0}" @@ -35848,7 +36192,7 @@ msgstr "يرجى تحديد الطلب الفعلي أو توقعات المبي msgid "Please set an Address on the Company '%s'" msgstr "يرجى تحديد عنوان في الشركة '%s'" -#: erpnext/controllers/stock_controller.py:875 +#: erpnext/controllers/stock_controller.py:916 msgid "Please set an Expense Account in the Items table" msgstr "يرجى تحديد حساب مصروفات في جدول البنود" @@ -35864,23 +36208,23 @@ msgstr "يرجى ضبط صف واحد على الأقل في جدول الضرا msgid "Please set both the Tax ID and Fiscal Code on Company {0}" msgstr "يرجى تحديد كل من رقم التعريف الضريبي والرمز المالي للشركة {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2418 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2422 msgid "Please set default Cash or Bank account in Mode of Payment {0}" msgstr "الرجاء تحديد الحساب البنكي أو النقدي الافتراضي في نوع الدفع\\n
    \\nPlease set default Cash or Bank account in Mode of Payment {0}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:94 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:198 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3024 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3028 msgid "Please set default Cash or Bank account in Mode of Payment {}" msgstr "الرجاء تعيين حساب نقدي أو مصرفي افتراضي في طريقة الدفع {}" #: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:96 #: erpnext/accounts/doctype/pos_profile/pos_profile.py:200 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3026 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3030 msgid "Please set default Cash or Bank account in Mode of Payments {}" msgstr "الرجاء تعيين حساب نقدي أو مصرفي افتراضي في طريقة الدفع {}" -#: erpnext/accounts/utils.py:2452 +#: erpnext/accounts/utils.py:2463 msgid "Please set default Exchange Gain/Loss Account in Company {}" msgstr "يرجى تعيين حساب الربح/الخسارة الافتراضي في الشركة {}" @@ -35892,16 +36236,16 @@ msgstr "يرجى تعيين حساب المصروفات الافتراضي في msgid "Please set default UOM in Stock Settings" msgstr "يرجى تعيين الافتراضي UOM في إعدادات الأسهم" -#: erpnext/controllers/stock_controller.py:734 +#: erpnext/controllers/stock_controller.py:775 msgid "Please set default cost of goods sold account in company {0} for booking rounding gain and loss during stock transfer" msgstr "يرجى تحديد حساب تكلفة البضائع المباعة الافتراضي في الشركة {0} لتسجيل مكاسب وخسائر التقريب أثناء نقل المخزون" -#: erpnext/controllers/stock_controller.py:190 +#: erpnext/controllers/stock_controller.py:231 msgid "Please set default inventory account for item {0}, or their item group or brand." msgstr "يرجى تعيين حساب المخزون الافتراضي للعنصر {0}، أو مجموعة العناصر أو العلامة التجارية الخاصة به." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:277 -#: erpnext/accounts/utils.py:1161 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:278 +#: erpnext/accounts/utils.py:1163 msgid "Please set default {0} in Company {1}" msgstr "يرجى تعيين {0} الافتراضي للشركة {1}" @@ -35909,15 +36253,15 @@ msgstr "يرجى تعيين {0} الافتراضي للشركة {1}" msgid "Please set filter based on Item or Warehouse" msgstr "يرجى ضبط الفلتر على أساس البند أو المخزن" -#: erpnext/controllers/accounts_controller.py:2368 +#: erpnext/controllers/accounts_controller.py:2369 msgid "Please set one of the following:" msgstr "يرجى تحديد أحد الخيارات التالية:" -#: erpnext/assets/doctype/asset/asset.py:648 +#: erpnext/assets/doctype/asset/asset.py:649 msgid "Please set opening number of booked depreciations" msgstr "يرجى تحديد عدد الإهلاكات المحجوزة في بداية الفترة" -#: erpnext/public/js/controllers/transaction.js:2647 +#: erpnext/public/js/controllers/transaction.js:2748 msgid "Please set recurring after saving" msgstr "يرجى تحديد (تكرار) بعد الحفظ" @@ -35960,7 +36304,7 @@ msgstr "الرجاء تعيين {0}" msgid "Please set {0} first." msgstr "يرجى ضبط {0} أولاً." -#: erpnext/stock/doctype/batch/batch.py:214 +#: erpnext/stock/doctype/batch/batch.py:215 msgid "Please set {0} for Batched Item {1}, which is used to set {2} on Submit." msgstr "يرجى تعيين {0} للعنصر المجمّع {1} ، والذي يتم استخدامه لتعيين {2} عند الإرسال." @@ -35972,11 +36316,11 @@ msgstr "يرجى ضبط {0} للعنوان {1}" msgid "Please set {0} in BOM Creator {1}" msgstr "يرجى ضبط {0} في مُنشئ قائمة المواد {1}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1128 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1145 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "يرجى تعيين {0} في الشركة {1} لحساب مكاسب/خسائر الصرف" -#: erpnext/controllers/accounts_controller.py:590 +#: erpnext/controllers/accounts_controller.py:591 msgid "Please set {0} to {1}, the same account that was used in the original invoice {2}." msgstr "يرجى تعيين {0} إلى {1}، وهو نفس الحساب الذي تم استخدامه في الفاتورة الأصلية {2}." @@ -35988,7 +36332,7 @@ msgstr "يرجى إعداد وتفعيل حساب مجموعة بنوع الحس msgid "Please share this email with your support team so that they can find and fix the issue." msgstr "يرجى مشاركة هذه الرسالة الإلكترونية مع فريق الدعم الخاص بك حتى يتمكنوا من إيجاد المشكلة وحلها." -#: erpnext/stock/get_item_details.py:329 +#: erpnext/stock/get_item_details.py:335 msgid "Please specify Company" msgstr "يرجى تحديد شركة" @@ -35998,7 +36342,7 @@ msgstr "يرجى تحديد شركة" msgid "Please specify Company to proceed" msgstr "الرجاء تحديد الشركة للمضى قدما\\n
    \\nPlease specify Company to proceed" -#: erpnext/controllers/accounts_controller.py:3186 +#: erpnext/controllers/accounts_controller.py:3192 #: erpnext/public/js/controllers/accounts.js:117 msgid "Please specify a valid Row ID for row {0} in table {1}" msgstr "يرجى تحديد هوية الصف صالحة لصف {0} في الجدول {1}" @@ -36007,11 +36351,11 @@ msgstr "يرجى تحديد هوية الصف صالحة لصف {0} في الج msgid "Please specify a {0} first." msgstr "يرجى تحديد {0} أولاً." -#: erpnext/controllers/item_variant.py:46 +#: erpnext/controllers/item_variant.py:52 msgid "Please specify at least one attribute in the Attributes table" msgstr "يرجى تحديد خاصية واحدة على الأقل في جدول (الخاصيات)" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:617 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:621 msgid "Please specify either Quantity or Valuation Rate or both" msgstr "يرجى تحديد الكمية أو التقييم إما قيم أو كليهما" @@ -36074,7 +36418,7 @@ msgstr "مستخدم البوابة" msgid "Portal Users" msgstr "مستخدمو البوابة" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:403 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:410 msgid "Possible Supplier" msgstr "مورد محتمل" @@ -36168,7 +36512,7 @@ msgstr "نفقات بريدية" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json #: erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:886 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:890 #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json #: erpnext/accounts/doctype/payment_order/payment_order.json @@ -36184,7 +36528,7 @@ msgstr "نفقات بريدية" #: erpnext/accounts/report/accounts_payable/accounts_payable.js:16 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:15 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:18 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1147 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1189 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:15 #: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:35 #: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html:7 @@ -36224,7 +36568,7 @@ msgstr "نفقات بريدية" #: erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py:89 #: erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py:158 #: erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py:104 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:86 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:88 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:24 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py:150 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:144 @@ -36239,12 +36583,12 @@ msgstr "تاريخ الترحيل" msgid "Posting Date Inheritance for Exchange Gain / Loss" msgstr "تاريخ الترحيل الموروث لربح/خسارة الصرف" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:269 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:271 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:143 msgid "Posting Date cannot be future date" msgstr "لا يمكن أن يكون تاريخ النشر تاريخا مستقبلا\\n
    \\nPosting Date cannot be future date" -#: erpnext/public/js/controllers/transaction.js:1005 +#: erpnext/public/js/controllers/transaction.js:1105 msgid "Posting Date will change to today's date as Edit Posting Date and Time is unchecked. Are you sure want to proceed?" msgstr "سيتم تغيير تاريخ النشر إلى تاريخ اليوم لأن خيار \"تعديل تاريخ ووقت النشر\" غير مُفعّل. هل أنت متأكد من رغبتك في المتابعة؟" @@ -36307,7 +36651,7 @@ msgstr "تاريخ ووقت النشر" msgid "Posting Time" msgstr "نشر التوقيت" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2334 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2339 msgid "Posting date and posting time is mandatory" msgstr "تاريخ النشر و وقت النشر الزامي\\n
    \\nPosting date and posting time is mandatory" @@ -36448,7 +36792,7 @@ msgid "Preventive Maintenance" msgstr "الصيانة الوقائية" #. Label of the preview (Button) field in DocType 'Request for Quotation' -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:263 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:270 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json msgid "Preview Email" msgstr "معاينة البريد الإلكتروني" @@ -36460,7 +36804,7 @@ msgid "Preview Required Materials" msgstr "معاينة المواد المطلوبة" #: erpnext/accounts/report/balance_sheet/balance_sheet.py:181 -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:139 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:142 msgid "Previous Financial Year is not closed" msgstr "السنة المالية السابقة ليست مغلقة" @@ -36589,7 +36933,7 @@ msgstr "قائمة الأسعار البلد" msgid "Price List Currency" msgstr "قائمة الأسعار العملات" -#: erpnext/stock/get_item_details.py:1273 +#: erpnext/stock/get_item_details.py:1285 msgid "Price List Currency not selected" msgstr "قائمة أسعار العملات غير محددة" @@ -36940,7 +37284,7 @@ msgstr "اطبع الايصال" msgid "Print Receipt on Order Complete" msgstr "اطبع الإيصال عند إتمام الطلب" -#: erpnext/setup/install.py:104 +#: erpnext/setup/install.py:105 msgid "Print UOM after Quantity" msgstr "اطبع UOM بعد الكمية" @@ -36958,7 +37302,7 @@ msgstr "طباعة وقرطاسية" msgid "Print settings updated in respective print format" msgstr "تم تحديث إعدادات الطباعة في تنسيق الطباعة الخاصة\\n
    \\nPrint settings updated in respective print format" -#: erpnext/setup/install.py:111 +#: erpnext/setup/install.py:112 msgid "Print taxes with zero amount" msgstr "طباعة الضرائب مع مبلغ صفر" @@ -37353,7 +37697,7 @@ msgstr "معرف سعر المنتج" #. Label of a Card Break in the Manufacturing Workspace #: erpnext/manufacturing/doctype/workstation/workstation.json #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/company/company.py:473 +#: erpnext/setup/doctype/company/company.py:474 msgid "Production" msgstr "الإنتاج" @@ -37560,7 +37904,7 @@ msgstr "الربحية" msgid "Profitability Analysis" msgstr "تحليل الربحية" -#: erpnext/projects/doctype/task/task.py:154 +#: erpnext/projects/doctype/task/task.py:156 #, python-format msgid "Progress % for a task cannot be more than 100." msgstr "لا يمكن أن تتجاوز نسبة التقدم في مهمة ما 100%." @@ -37592,11 +37936,6 @@ msgstr "مدير المشروع" msgid "Project Name" msgstr "اسم المشروع" -#. Label of a Workspace Sidebar Item -#: erpnext/workspace_sidebar/projects.json -msgid "Project Profitability" -msgstr "" - #: erpnext/templates/pages/projects.html:112 msgid "Project Progress:" msgstr "تقدم المشروع:" @@ -37698,7 +38037,7 @@ msgstr "تتبع المشروع الحكيم" msgid "Project wise Stock Tracking " msgstr "مشروع تتبع حركة الأسهم الحكمة" -#: erpnext/controllers/trends.py:421 +#: erpnext/controllers/trends.py:423 msgid "Project-wise data is not available for Quotation" msgstr "البيانات الخاصة بالمشروع غير متوفرة للعرض المسعر" @@ -37774,6 +38113,11 @@ msgstr "مدير المشاريع" msgid "Projects Settings" msgstr "إعدادات المشاريع" +#. Title of the Module Onboarding 'Projects Onboarding' +#: erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json +msgid "Projects Setup" +msgstr "" + #. Name of a role #: erpnext/projects/doctype/activity_cost/activity_cost.json #: erpnext/projects/doctype/activity_type/activity_type.json @@ -37872,7 +38216,7 @@ msgstr "فرصة محتملة" msgid "Prospect Owner" msgstr "مالك محتمل" -#: erpnext/crm/doctype/lead/lead.py:313 +#: erpnext/crm/doctype/lead/lead.py:315 msgid "Prospect {0} already exists" msgstr "الاحتمال {0} موجود بالفعل" @@ -37889,8 +38233,8 @@ msgstr "تنقيب" msgid "Prospects Engaged But Not Converted" msgstr "آفاق تشارك ولكن لم تتحول" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:196 -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:781 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:198 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:785 msgid "Protected DocType" msgstr "" @@ -37905,7 +38249,7 @@ msgstr "تزويد بعنوان البريد الإلكتروني المسجل msgid "Providing" msgstr "توفير" -#: erpnext/setup/doctype/company/company.py:572 +#: erpnext/setup/doctype/company/company.py:573 msgid "Provisional Account" msgstr "الحساب المؤقت" @@ -37971,7 +38315,7 @@ msgstr "نشر" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json #: erpnext/projects/doctype/project/project_dashboard.py:16 -#: erpnext/setup/doctype/company/company.py:461 erpnext/setup/install.py:346 +#: erpnext/setup/doctype/company/company.py:462 erpnext/setup/install.py:377 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/item_lead_time/item_lead_time.json #: erpnext/stock/doctype/item_reorder/item_reorder.json @@ -38087,7 +38431,7 @@ msgstr "مصروفات شراء الصنف {0}" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt_list.js:30 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/stock/doctype/quality_inspection/quality_inspection.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:336 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:337 #: erpnext/workspace_sidebar/buying.json #: erpnext/workspace_sidebar/invoicing.json msgid "Purchase Invoice" @@ -38122,16 +38466,16 @@ msgstr "اصناف فاتورة المشتريات" msgid "Purchase Invoice Trends" msgstr "اتجهات فاتورة الشراء" -#: erpnext/assets/doctype/asset/asset.py:336 +#: erpnext/assets/doctype/asset/asset.py:337 msgid "Purchase Invoice cannot be made against an existing asset {0}" msgstr "لا يمكن إجراء فاتورة الشراء مقابل أصل موجود {0}" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:446 -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:460 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:448 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:462 msgid "Purchase Invoice {0} is already submitted" msgstr "فاتورة الشراء {0} تم ترحيلها من قبل" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1931 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1932 msgid "Purchase Invoices" msgstr "فواتير الشراء" @@ -38258,11 +38602,11 @@ msgstr "لم يتم استلام طلبات الشراء في الوقت الم msgid "Purchase Order Pricing Rule" msgstr "قاعدة تسعير أمر الشراء" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:633 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:634 msgid "Purchase Order Required" msgstr "أمر الشراء مطلوب" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:628 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:629 msgid "Purchase Order Required for item {}" msgstr "طلب الشراء مطلوب للعنصر {}" @@ -38280,7 +38624,7 @@ msgstr "اتجهات امر الشراء" msgid "Purchase Order already created for all Sales Order items" msgstr "تم إنشاء أمر الشراء بالفعل لجميع بنود أوامر المبيعات" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:335 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:337 msgid "Purchase Order number required for Item {0}" msgstr "عدد طلب الشراء مطلوب للبند\\n
    \\nPurchase Order number required for Item {0}" @@ -38288,11 +38632,11 @@ msgstr "عدد طلب الشراء مطلوب للبند\\n
    \\nPurchase Order msgid "Purchase Order {0} created" msgstr "تم إنشاء أمر الشراء {0}" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:671 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:672 msgid "Purchase Order {0} is not submitted" msgstr "طلب الشراء {0} يجب أن يعتمد\\n
    \\nPurchase Order {0} is not submitted" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:887 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:888 msgid "Purchase Orders" msgstr "طلبات الشراء" @@ -38307,7 +38651,7 @@ msgstr "عدد أوامر الشراء" msgid "Purchase Orders Items Overdue" msgstr "أوامر الشراء البنود المتأخرة" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:286 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:287 msgid "Purchase Orders are not allowed for {0} due to a scorecard standing of {1}." msgstr "لا يسمح بأوامر الشراء {0} بسبب وضع بطاقة النقاط {1}." @@ -38322,7 +38666,7 @@ msgstr "أوامر الشراء إلى الفاتورة" msgid "Purchase Orders to Receive" msgstr "أوامر الشراء لتلقي" -#: erpnext/controllers/accounts_controller.py:2010 +#: erpnext/controllers/accounts_controller.py:2011 msgid "Purchase Orders {0} are un-linked" msgstr "أوامر الشراء {0} غير مرتبطة" @@ -38364,7 +38708,7 @@ msgstr "قائمة أسعار الشراء" #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:67 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:68 #: erpnext/workspace_sidebar/stock.json msgid "Purchase Receipt" msgstr "إستلام المشتريات" @@ -38405,11 +38749,11 @@ msgstr "شراء السلعة استلام الموردة" msgid "Purchase Receipt No" msgstr "لا شراء استلام" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:654 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:655 msgid "Purchase Receipt Required" msgstr "إيصال استلام المشتريات مطلوب" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:649 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:650 msgid "Purchase Receipt Required for item {}" msgstr "إيصال الشراء مطلوب للعنصر {}" @@ -38437,7 +38781,7 @@ msgstr "لا يحتوي إيصال الشراء على أي عنصر تم تمك msgid "Purchase Receipt {0} created." msgstr "تم إنشاء إيصال الشراء {0} ." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:678 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:679 msgid "Purchase Receipt {0} is not submitted" msgstr "إيصال استلام المشتريات {0} لم يتم تقديمه" @@ -38555,14 +38899,14 @@ msgstr "المشتريات" #: erpnext/manufacturing/doctype/master_production_schedule/master_production_schedule.js:163 #: erpnext/stock/doctype/material_request/material_request.json #: erpnext/stock/doctype/pick_list/pick_list.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:371 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:372 #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json msgid "Purpose" msgstr "غرض" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:514 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:519 msgid "Purpose must be one of {0}" msgstr "الهدف يجب ان يكون واحد ل {0}\\n
    \\nPurpose must be one of {0}" @@ -38643,7 +38987,7 @@ msgstr "توجد بالفعل قاعدة التخزين للعنصر {0} في ا #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:398 #: erpnext/public/js/bom_configurator/bom_configurator.bundle.js:499 #: erpnext/public/js/stock_reservation.js:134 -#: erpnext/public/js/stock_reservation.js:336 erpnext/public/js/utils.js:778 +#: erpnext/public/js/stock_reservation.js:336 erpnext/public/js/utils.js:843 #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json #: erpnext/selling/doctype/product_bundle_item/product_bundle_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:390 @@ -38754,7 +39098,7 @@ msgstr "الكمية لكل وحدة" msgid "Qty To Manufacture" msgstr "الكمية للتصنيع" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1408 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1419 msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}." msgstr "لا يمكن أن تكون كمية التصنيع ({0}) كسرًا في وحدة القياس {2}. للسماح بذلك، عطّل '{1}' في وحدة القياس {2}." @@ -38822,12 +39166,12 @@ msgid "Qty in Stock UOM" msgstr "الكمية المتوفرة في المخزون وحدة القياس" #. Label of the for_qty (Float) field in DocType 'Pick List' -#: erpnext/stock/doctype/pick_list/pick_list.js:196 +#: erpnext/stock/doctype/pick_list/pick_list.js:198 #: erpnext/stock/doctype/pick_list/pick_list.json msgid "Qty of Finished Goods Item" msgstr "الكمية من السلع تامة الصنع" -#: erpnext/stock/doctype/pick_list/pick_list.py:612 +#: erpnext/stock/doctype/pick_list/pick_list.py:614 msgid "Qty of Finished Goods Item should be greater than 0." msgstr "يجب أن تكون كمية المنتج النهائي أكبر من صفر." @@ -39116,7 +39460,7 @@ msgstr "فحص الجودة" msgid "Quality Inspections" msgstr "عمليات فحص الجودة" -#: erpnext/setup/doctype/company/company.py:503 +#: erpnext/setup/doctype/company/company.py:504 msgid "Quality Management" msgstr "إدارة الجودة" @@ -39260,7 +39604,7 @@ msgstr "هدف مراجعة الجودة" #: erpnext/stock/doctype/material_request_item/material_request_item.json #: erpnext/stock/doctype/packing_slip_item/packing_slip_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:725 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:726 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:36 @@ -39358,7 +39702,7 @@ msgstr "كمية وقيم" msgid "Quantity and Warehouse" msgstr "الكمية والنماذج" -#: erpnext/stock/doctype/material_request/material_request.py:202 +#: erpnext/stock/doctype/material_request/material_request.py:204 msgid "Quantity cannot be greater than {0} for Item {1}" msgstr "لا يمكن أن تتجاوز الكمية {0} للعنصر {1}" @@ -39375,7 +39719,7 @@ msgid "Quantity must be greater than zero, and less or equal to {0}" msgstr "يجب أن تكون الكمية أكبر من الصفر، وأقل من أو تساوي {0}" #: erpnext/manufacturing/doctype/work_order/work_order.js:1010 -#: erpnext/stock/doctype/pick_list/pick_list.js:204 +#: erpnext/stock/doctype/pick_list/pick_list.js:206 msgid "Quantity must not be more than {0}" msgstr "الكمية يجب ألا تكون أكثر من {0}" @@ -39403,11 +39747,11 @@ msgstr "كمية لجعل" msgid "Quantity to Manufacture" msgstr "كمية لتصنيع" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2584 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2596 msgid "Quantity to Manufacture can not be zero for the operation {0}" msgstr "لا يمكن أن تكون الكمية للتصنيع صفراً للتشغيل {0}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1400 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1411 msgid "Quantity to Manufacture must be greater than 0." msgstr "\"الكمية لتصنيع\" يجب أن تكون أكبر من 0." @@ -39439,7 +39783,7 @@ msgid "Quart Liquid (US)" msgstr "كوارت ليكويد (الولايات المتحدة)" #: erpnext/selling/report/sales_analytics/sales_analytics.py:437 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:115 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:125 msgid "Quarter {0} {1}" msgstr "الربع {0} {1}" @@ -39556,11 +39900,11 @@ msgstr "مناقصة لـ" msgid "Quotation Trends" msgstr "مؤشرات المناقصة" -#: erpnext/selling/doctype/sales_order/sales_order.py:484 +#: erpnext/selling/doctype/sales_order/sales_order.py:486 msgid "Quotation {0} is cancelled" msgstr "العرض المسعر {0} تم إلغائه" -#: erpnext/selling/doctype/sales_order/sales_order.py:397 +#: erpnext/selling/doctype/sales_order/sales_order.py:399 msgid "Quotation {0} not of type {1}" msgstr "عرض مسعر {0} ليس من النوع {1}" @@ -39593,7 +39937,7 @@ msgstr "المبلغ المذكور" msgid "RFQ and Purchase Order Settings" msgstr "" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:120 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:130 msgid "RFQs are not allowed for {0} due to a scorecard standing of {1}" msgstr "لا يسمح ب رفق ل {0} بسبب وضع بطاقة الأداء ل {1}" @@ -39688,7 +40032,7 @@ msgstr "التي أثارها (بريد إلكتروني)" #: erpnext/manufacturing/doctype/bom_item/bom_item.json #: erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json #: erpnext/manufacturing/doctype/work_order_item/work_order_item.json -#: erpnext/public/js/utils.js:788 +#: erpnext/public/js/utils.js:853 #: erpnext/selling/doctype/product_bundle_item/product_bundle_item.json #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -39870,7 +40214,7 @@ msgstr "المعدل الذي يتم تحويل العملة إلى عملة ا msgid "Rate at which this tax is applied" msgstr "السعر الذي يتم فيه تطبيق هذه الضريبة" -#: erpnext/controllers/accounts_controller.py:4048 +#: erpnext/controllers/accounts_controller.py:4078 msgid "Rate of '{}' items cannot be changed" msgstr "لا يمكن تغيير سعر العناصر '{}'" @@ -39932,10 +40276,6 @@ msgstr "السعر أو الخصم مطلوب لخصم السعر." msgid "Rates" msgstr "معدلات" -#: erpnext/controllers/accounts_controller.py:4023 -msgid "Rates cannot be modified for quoted items" -msgstr "لا يمكن تعديل الأسعار للعناصر المذكورة في العرض" - #: erpnext/accounts/report/financial_ratios/financial_ratios.py:48 msgid "Ratios" msgstr "النسب" @@ -40045,7 +40385,7 @@ msgstr "المواد الخام المستهلكة" msgid "Raw Materials Consumption" msgstr "استهلاك المواد الخام" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:317 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:322 msgid "Raw Materials Missing" msgstr "" @@ -40282,7 +40622,7 @@ msgid "Receivable / Payable Account" msgstr "القبض / حساب الدائنة" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:68 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1162 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1204 #: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:234 #: erpnext/accounts/report/sales_register/sales_register.py:217 #: erpnext/accounts/report/sales_register/sales_register.py:271 @@ -40344,7 +40684,7 @@ msgstr "المبلغ المستلم بعد الضريبة" msgid "Received Amount After Tax (Company Currency)" msgstr "المبلغ المستلم بعد الضريبة (عملة الشركة)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:964 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:965 msgid "Received Amount cannot be greater than Paid Amount" msgstr "لا يمكن أن يكون المبلغ المستلم أكبر من المبلغ المدفوع" @@ -40407,7 +40747,7 @@ msgstr "الكمية المستلمة في المخزون وحدة القياس" msgid "Received Quantity" msgstr "الكمية المستلمة" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:320 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:321 msgid "Received Stock Entries" msgstr "تلقى إدخالات الأسهم" @@ -40647,11 +40987,11 @@ msgstr "الرمز المرجعي" msgid "Ref Date" msgstr "تاريخ المرجع" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1025 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1026 msgid "Reference #{0} dated {1}" msgstr "المرجع # {0} بتاريخ {1}" -#: erpnext/public/js/controllers/transaction.js:2760 +#: erpnext/public/js/controllers/transaction.js:2861 msgid "Reference Date for Early Payment Discount" msgstr "تاريخ مرجعي لخصم الدفع المبكر" @@ -40661,7 +41001,7 @@ msgstr "تاريخ مرجعي لخصم الدفع المبكر" msgid "Reference Detail No" msgstr "تفاصيل المرجع رقم" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:658 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:659 msgid "Reference Doctype must be one of {0}" msgstr "المستند المرجع يجب أن يكون واحد من {0}\\n
    \\nReference Doctype must be one of {0}" @@ -40685,15 +41025,15 @@ msgstr "سعر الصرف المرجعي" msgid "Reference No" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:639 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:640 msgid "Reference No & Reference Date is required for {0}" msgstr "رقم المرجع وتاريخه مطلوبان ل {0}\\n
    \\nReference No & Reference Date is required for {0}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1209 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1226 msgid "Reference No and Reference Date is mandatory for Bank transaction" msgstr "رقم المرجع و تاريخ المرجع إلزامي للمعاملة المصرفية" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:644 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:645 msgid "Reference No is mandatory if you entered Reference Date" msgstr "رقم المرجع إلزامي اذا أدخلت تاريخ المرجع\\n
    \\nReference No is mandatory if you entered Reference Date" @@ -40787,15 +41127,15 @@ msgstr "المرجع: {0}، رمز العنصر: {1} والعميل: {2}" msgid "References" msgstr "المراجع" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:399 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:400 msgid "References to Sales Invoices are Incomplete" msgstr "المراجع المتعلقة بفواتير المبيعات غير مكتملة" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:394 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:395 msgid "References to Sales Orders are Incomplete" msgstr "المراجع المتعلقة بأوامر البيع غير مكتملة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:738 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:739 msgid "References {0} of type {1} had no outstanding amount left before submitting the Payment Entry. Now they have a negative outstanding amount." msgstr "المراجع {0} من النوع {1} لم يكن لديها أي مبلغ مستحق قبل إرسال أمر الدفع. الآن أصبح لديها مبلغ مستحق سالب." @@ -40842,7 +41182,7 @@ msgstr "تفاصيل التسجيل" msgid "Regular" msgstr "منتظم" -#: erpnext/stock/doctype/inventory_dimension/inventory_dimension.py:198 +#: erpnext/stock/doctype/inventory_dimension/inventory_dimension.py:200 msgid "Rejected " msgstr "مرفوض " @@ -40928,7 +41268,7 @@ msgstr "علاقة" msgid "Release Date" msgstr "تاريخ النشر" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:318 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:319 msgid "Release date must be in the future" msgstr "يجب أن يكون تاريخ الإصدار في المستقبل" @@ -40947,7 +41287,7 @@ msgstr "المبلغ المتبقي" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:189 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:156 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1236 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1278 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:178 msgid "Remaining Balance" msgstr "الرصيد المتبقي" @@ -41000,7 +41340,7 @@ msgstr "كلام" #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:159 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:204 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:275 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1268 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1310 #: erpnext/accounts/report/general_ledger/general_ledger.html:90 #: erpnext/accounts/report/general_ledger/general_ledger.html:116 #: erpnext/accounts/report/general_ledger/general_ledger.py:794 @@ -41042,7 +41382,7 @@ msgstr "" msgid "Remove item if charges is not applicable to that item" msgstr "قم بإزالة المنتج إذا لم تكن الرسوم مطبقة عليه." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:563 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:567 msgid "Removed items with no change in quantity or value." msgstr "العناصر إزالتها مع أي تغيير في كمية أو قيمة." @@ -41050,7 +41390,7 @@ msgstr "العناصر إزالتها مع أي تغيير في كمية أو ق msgid "Removed {0} rows with zero document count. Please save to persist changes." msgstr "" -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:87 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:88 msgid "Removing rows without exchange gain or loss" msgstr "إزالة الصفوف دون تحقيق ربح أو خسارة في سعر الصرف" @@ -41065,7 +41405,7 @@ msgstr "إعادة تسمية سمة السمة في سمة البند." msgid "Rename Log" msgstr "إعادة تسمية الدخول" -#: erpnext/accounts/doctype/account/account.py:556 +#: erpnext/accounts/doctype/account/account.py:558 msgid "Rename Not Allowed" msgstr "إعادة تسمية غير مسموح به" @@ -41082,7 +41422,7 @@ msgstr "تمت إضافة مهام إعادة تسمية نوع المستند { msgid "Rename jobs for doctype {0} have not been enqueued." msgstr "لم يتم وضع مهام إعادة تسمية نوع المستند {0} في قائمة الانتظار." -#: erpnext/accounts/doctype/account/account.py:548 +#: erpnext/accounts/doctype/account/account.py:550 msgid "Renaming it is only allowed via parent company {0}, to avoid mismatch." msgstr "يُسمح بإعادة تسميته فقط عبر الشركة الأم {0} ، لتجنب عدم التطابق." @@ -41203,7 +41543,7 @@ msgstr "نموذج تقرير" msgid "Report Type is mandatory" msgstr "نوع التقرير إلزامي\\n
    \\nReport Type is mandatory" -#: erpnext/setup/install.py:206 +#: erpnext/setup/install.py:207 msgid "Report an Issue" msgstr "الإبلاغ عن مشكلة" @@ -41386,7 +41726,7 @@ msgstr "تاريخ الاستحقاق" msgid "Reqd Qty (BOM)" msgstr "الكمية المطلوبة (قائمة المواد)" -#: erpnext/public/js/utils.js:804 +#: erpnext/public/js/utils.js:869 msgid "Reqd by date" msgstr "مطلوب بالتاريخ" @@ -41428,8 +41768,8 @@ msgstr "طلب المعلومات" #. Label of a Workspace Sidebar Item #: erpnext/buying/doctype/buying_settings/buying_settings.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:312 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:414 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:325 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:427 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:88 #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70 @@ -41484,9 +41824,11 @@ msgstr "العناصر المطلوبة للطلب والاستلام" #. Label of the requested_qty (Float) field in DocType 'Job Card' #. Label of the requested_qty (Float) field in DocType 'Material Request Plan #. Item' +#. Label of the requested_qty (Float) field in DocType 'Sales Order Item' #. Label of the indented_qty (Float) field in DocType 'Bin' #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json +#: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/selling/report/pending_so_items_for_purchase_request/pending_so_items_for_purchase_request.py:44 #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:155 @@ -41612,7 +41954,7 @@ msgstr "يتطلب وفاء" msgid "Research" msgstr "ابحاث" -#: erpnext/setup/doctype/company/company.py:509 +#: erpnext/setup/doctype/company/company.py:510 msgid "Research & Development" msgstr "البحث و التطوير" @@ -41659,7 +42001,7 @@ msgstr "الحجز مبني على" #: erpnext/manufacturing/doctype/work_order/work_order.js:891 #: erpnext/selling/doctype/sales_order/sales_order.js:92 -#: erpnext/stock/doctype/pick_list/pick_list.js:148 +#: erpnext/stock/doctype/pick_list/pick_list.js:150 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:180 msgid "Reserve" msgstr "احتياطي" @@ -41702,7 +42044,7 @@ msgstr "مخصص للتجميع الفرعي" msgid "Reserved" msgstr "محجوز" -#: erpnext/controllers/stock_controller.py:1282 +#: erpnext/controllers/stock_controller.py:1323 msgid "Reserved Batch Conflict" msgstr "تعارض الدُفعات المحجوزة" @@ -41772,7 +42114,7 @@ msgstr "الكمية المحجوزة" msgid "Reserved Quantity for Production" msgstr "الكمية المحجوزة للإنتاج" -#: erpnext/stock/stock_ledger.py:2283 +#: erpnext/stock/stock_ledger.py:2282 msgid "Reserved Serial No." msgstr "رقم تسلسلي محجوز" @@ -41785,16 +42127,16 @@ msgstr "رقم تسلسلي محجوز" #: erpnext/selling/doctype/sales_order/sales_order.js:457 #: erpnext/stock/dashboard/item_dashboard_list.html:15 #: erpnext/stock/doctype/bin/bin.json -#: erpnext/stock/doctype/pick_list/pick_list.js:168 +#: erpnext/stock/doctype/pick_list/pick_list.js:170 #: erpnext/stock/report/reserved_stock/reserved_stock.json -#: erpnext/stock/report/stock_balance/stock_balance.py:499 -#: erpnext/stock/stock_ledger.py:2267 +#: erpnext/stock/report/stock_balance/stock_balance.py:572 +#: erpnext/stock/stock_ledger.py:2266 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:205 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:333 msgid "Reserved Stock" msgstr "المخزون المحجوز" -#: erpnext/stock/stock_ledger.py:2312 +#: erpnext/stock/stock_ledger.py:2311 msgid "Reserved Stock for Batch" msgstr "المخزون المحجوز للدفعة" @@ -41840,7 +42182,7 @@ msgstr "محجوزة للتعاقد من الباطن" #: erpnext/public/js/stock_reservation.js:203 #: erpnext/selling/doctype/sales_order/sales_order.js:410 -#: erpnext/stock/doctype/pick_list/pick_list.js:293 +#: erpnext/stock/doctype/pick_list/pick_list.js:295 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:293 msgid "Reserving Stock..." msgstr "حجز المخزون..." @@ -42109,7 +42451,7 @@ msgstr "إعادة محاولة المعاملات الفاشلة" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:284 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:285 #: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/delivery_note/delivery_note_list.js:16 #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -42177,7 +42519,7 @@ msgid "Return Issued" msgstr "تم إصدار الإرجاع" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:329 -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:126 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:127 msgid "Return Qty" msgstr "كمية الإرجاع" @@ -42185,7 +42527,7 @@ msgstr "كمية الإرجاع" #. 'Purchase Receipt Item' #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:305 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:102 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:103 msgid "Return Qty from Rejected Warehouse" msgstr "كمية الإرجاع من المستودع المرفوض" @@ -42197,7 +42539,7 @@ msgstr "كمية الإرجاع من المستودع المرفوض" msgid "Return Raw Material to Customer" msgstr "إعادة المواد الخام إلى العميل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1524 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1528 msgid "Return invoice of asset cancelled" msgstr "تم إلغاء فاتورة إرجاع الأصل" @@ -42334,11 +42676,52 @@ msgstr "عكس الإشارة" msgid "Review" msgstr "إعادة النظر" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review Accounts Settings' +#: erpnext/accounts/onboarding_step/review_accounts_settings/review_accounts_settings.json +msgid "Review Accounts Settings" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review Buying Settings' +#: erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json +msgid "Review Buying Settings" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/accounts/onboarding_step/chart_of_accounts/chart_of_accounts.json +msgid "Review Chart of Accounts" +msgstr "" + #. Label of the review_date (Date) field in DocType 'Task' #: erpnext/projects/doctype/task/task.json msgid "Review Date" msgstr "مراجعة تاريخ" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review Manufacturing Settings' +#: erpnext/manufacturing/onboarding_step/review_manufacturing_settings/review_manufacturing_settings.json +msgid "Review Manufacturing Settings" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review Selling Settings' +#: erpnext/selling/onboarding_step/review_selling_settings/review_selling_settings.json +msgid "Review Selling Settings" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review Stock Settings' +#: erpnext/stock/onboarding_step/review_stock_settings/review_stock_settings.json +msgid "Review Stock Settings" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Review System Settings' +#: erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json +msgid "Review System Settings" +msgstr "" + #. Label of a Card Break in the Quality Workspace #: erpnext/quality_management/workspace/quality/quality.json msgid "Review and Action" @@ -42467,7 +42850,7 @@ msgstr "شركة الجذر" msgid "Root Type" msgstr "نوع الجذر" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:399 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:401 msgid "Root Type for {0} must be one of the Asset, Liability, Income, Expense and Equity" msgstr "يجب أن يكون نوع الجذر لـ {0} أحد الأصول أو الخصوم أو الإيرادات أو المصروفات أو حقوق الملكية." @@ -42542,6 +42925,7 @@ msgstr "تقريب مبلغ الضريبة لكل صف" #. Label of the rounded_total (Currency) field in DocType 'Quotation' #. Label of the base_rounded_total (Currency) field in DocType 'Sales Order' #. Label of the rounded_total (Currency) field in DocType 'Sales Order' +#. Label of the base_rounded_total (Currency) field in DocType 'Delivery Note' #. Label of the rounded_total (Currency) field in DocType 'Delivery Note' #. Label of the base_rounded_total (Currency) field in DocType 'Purchase #. Receipt' @@ -42563,10 +42947,8 @@ msgstr "تقريب إجمالي" #. Label of the base_rounded_total (Currency) field in DocType 'POS Invoice' #. Label of the base_rounded_total (Currency) field in DocType 'Supplier #. Quotation' -#. Label of the base_rounded_total (Currency) field in DocType 'Delivery Note' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.json -#: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Rounded Total (Company Currency)" msgstr "" @@ -42590,6 +42972,8 @@ msgstr "" #. Label of the base_rounding_adjustment (Currency) field in DocType 'Sales #. Order' #. Label of the rounding_adjustment (Currency) field in DocType 'Sales Order' +#. Label of the base_rounding_adjustment (Currency) field in DocType 'Delivery +#. Note' #. Label of the rounding_adjustment (Currency) field in DocType 'Delivery Note' #. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase #. Receipt' @@ -42615,10 +42999,7 @@ msgstr "تعديل التقريب (عملة الشركة" #. Label of the base_rounding_adjustment (Currency) field in DocType 'POS #. Invoice' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Delivery -#. Note' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json -#: erpnext/stock/doctype/delivery_note/delivery_note.json msgid "Rounding Adjustment (Company Currency)" msgstr "" @@ -42629,12 +43010,12 @@ msgid "Rounding Loss Allowance" msgstr "مخصص خسائر التقريب" #: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.js:45 -#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:48 +#: erpnext/accounts/doctype/exchange_rate_revaluation/exchange_rate_revaluation.py:49 msgid "Rounding Loss Allowance should be between 0 and 1" msgstr "يجب أن يكون بدل خسائر التقريب بين 0 و 1" -#: erpnext/controllers/stock_controller.py:746 -#: erpnext/controllers/stock_controller.py:761 +#: erpnext/controllers/stock_controller.py:787 +#: erpnext/controllers/stock_controller.py:802 msgid "Rounding gain/loss Entry for Stock Transfer" msgstr "قيد تقريب الربح/الخسارة لنقل الأسهم" @@ -42661,11 +43042,11 @@ msgstr "اسم التوجيه" msgid "Row # {0}: Cannot return more than {1} for Item {2}" msgstr "الصف # {0}: لا يمكن الارجاع أكثر من {1} للبند {2}" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:186 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:190 msgid "Row # {0}: Please add Serial and Batch Bundle for Item {1}" msgstr "الصف رقم {0}: يرجى إضافة الرقم التسلسلي وحزمة الدفعة للعنصر {1}" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:205 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:209 msgid "Row # {0}: Please enter quantity for Item {1} as it is not zero." msgstr "الصف رقم {0}: يرجى إدخال الكمية للعنصر {1} لأنها ليست صفرًا." @@ -42677,17 +43058,17 @@ msgstr "الصف # {0}: لا يمكن أن يكون المعدل أكبر من msgid "Row # {0}: Returned Item {1} does not exist in {2} {3}" msgstr "الصف رقم {0}: العنصر الذي تم إرجاعه {1} غير موجود في {2} {3}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:270 +#: erpnext/manufacturing/doctype/work_order/work_order.py:275 msgid "Row #1: Sequence ID must be 1 for Operation {0}." msgstr "الصف رقم 1: يجب أن يكون معرف التسلسل 1 للعملية {0}." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:563 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2073 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:564 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2077 msgid "Row #{0} (Payment Table): Amount must be negative" msgstr "الصف # {0} (جدول الدفع): يجب أن يكون المبلغ سلبيًا" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:561 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2068 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:562 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2072 msgid "Row #{0} (Payment Table): Amount must be positive" msgstr "الصف رقم {0} (جدول الدفع): يجب أن يكون المبلغ موجبا" @@ -42695,11 +43076,11 @@ msgstr "الصف رقم {0} (جدول الدفع): يجب أن يكون المب msgid "Row #{0}: A reorder entry already exists for warehouse {1} with reorder type {2}." msgstr "الصف #{0}: يوجد بالفعل إدخال إعادة طلب للمستودع {1} بنوع إعادة الطلب {2}." -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:329 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:331 msgid "Row #{0}: Acceptance Criteria Formula is incorrect." msgstr "الصف #{0}: صيغة معايير القبول غير صحيحة." -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:309 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:311 msgid "Row #{0}: Acceptance Criteria Formula is required." msgstr "الصف #{0}: صيغة معايير القبول مطلوبة." @@ -42712,20 +43093,20 @@ msgstr "الصف #{0}: لا يمكن أن يكون المستودع المقبو msgid "Row #{0}: Accepted Warehouse is mandatory for the accepted Item {1}" msgstr "الصف #{0}: المستودع المقبول إلزامي للصنف المقبول {1}" -#: erpnext/controllers/accounts_controller.py:1290 +#: erpnext/controllers/accounts_controller.py:1291 msgid "Row #{0}: Account {1} does not belong to company {2}" msgstr "الصف # {0}: الحساب {1} لا ينتمي إلى الشركة {2}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:396 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:397 msgid "Row #{0}: Allocated Amount cannot be greater than Outstanding Amount of Payment Request {1}" msgstr "الصف #{0}: لا يمكن أن يكون المبلغ المخصص أكبر من المبلغ المستحق لطلب الدفع {1}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:372 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:477 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:373 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:478 msgid "Row #{0}: Allocated Amount cannot be greater than outstanding amount." msgstr "الصف # {0}: المبلغ المخصص لا يمكن أن يكون أكبر من المبلغ المستحق." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:489 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:490 msgid "Row #{0}: Allocated amount:{1} is greater than outstanding amount:{2} for Payment Term {3}" msgstr "الصف #{0}: المبلغ المخصص:{1} أكبر من المبلغ المستحق:{2} لفترة الدفع {3}" @@ -42733,19 +43114,19 @@ msgstr "الصف #{0}: المبلغ المخصص:{1} أكبر من المبلغ msgid "Row #{0}: Amount must be a positive number" msgstr "الصف #{0}: يجب أن يكون المبلغ عددًا موجبًا" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:417 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:418 msgid "Row #{0}: Asset {1} cannot be sold, it is already {2}" msgstr "الصف #{0}: الأصل {1} لا يمكن بيعه، فهو بالفعل {2}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:422 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:423 msgid "Row #{0}: Asset {1} is already sold" msgstr "الصف #{0}: الأصل {1} قد تم بيعه بالفعل" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:334 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:335 msgid "Row #{0}: BOM is not specified for subcontracting item {0}" msgstr "الصف #{0}: لم يتم تحديد قائمة المواد لعنصر التعاقد من الباطن {0}" -#: erpnext/selling/doctype/sales_order/sales_order.py:299 +#: erpnext/selling/doctype/sales_order/sales_order.py:301 msgid "Row #{0}: BOM not found for FG Item {1}" msgstr "الصف #{0}: لم يتم العثور على قائمة مكونات المنتج النهائي {1}" @@ -42757,7 +43138,7 @@ msgstr "الصف #{0}: تم تحديد رقم الدفعة {1} بالفعل." msgid "Row #{0}: Batch No(s) {1} is not a part of the linked Subcontracting Inward Order. Please select valid Batch No(s)." msgstr "الصف #{0}: رقم الدفعة {1} ليس جزءًا من أمر التوريد الداخلي المرتبط بالتعاقد من الباطن. يرجى تحديد رقم دفعة صحيح." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:868 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:869 msgid "Row #{0}: Cannot allocate more than {1} against payment term {2}" msgstr "الصف #{0}: لا يمكن تخصيص أكثر من {1} مقابل شرط الدفع {2}" @@ -42777,27 +43158,27 @@ msgstr "الصف #{0}: لا يمكن إلغاء إدخال المخزون هذا msgid "Row #{0}: Cannot create entry with different taxable AND withholding document links." msgstr "الصف #{0}: لا يمكن إنشاء إدخال بروابط مستندات مختلفة للضرائب والحجز." -#: erpnext/controllers/accounts_controller.py:3764 +#: erpnext/controllers/accounts_controller.py:3779 msgid "Row #{0}: Cannot delete item {1} which has already been billed." msgstr "الصف # {0}: لا يمكن حذف العنصر {1} الذي تم تحرير فاتورة به بالفعل." -#: erpnext/controllers/accounts_controller.py:3738 +#: erpnext/controllers/accounts_controller.py:3753 msgid "Row #{0}: Cannot delete item {1} which has already been delivered" msgstr "الصف # {0}: لا يمكن حذف العنصر {1} الذي تم تسليمه بالفعل" -#: erpnext/controllers/accounts_controller.py:3757 +#: erpnext/controllers/accounts_controller.py:3772 msgid "Row #{0}: Cannot delete item {1} which has already been received" msgstr "الصف # {0}: لا يمكن حذف العنصر {1} الذي تم استلامه بالفعل" -#: erpnext/controllers/accounts_controller.py:3744 +#: erpnext/controllers/accounts_controller.py:3759 msgid "Row #{0}: Cannot delete item {1} which has work order assigned to it." msgstr "الصف # {0}: لا يمكن حذف العنصر {1} الذي تم تعيين ترتيب العمل إليه." -#: erpnext/controllers/accounts_controller.py:3750 +#: erpnext/controllers/accounts_controller.py:3765 msgid "Row #{0}: Cannot delete item {1} which is already ordered against this Sales Order." msgstr "الصف #{0}: لا يمكن حذف العنصر {1} الذي تم طلبه بالفعل مقابل أمر البيع هذا." -#: erpnext/controllers/accounts_controller.py:4058 +#: erpnext/controllers/accounts_controller.py:4088 msgid "Row #{0}: Cannot set Rate if the billed amount is greater than the amount for Item {1}." msgstr "الصف #{0}: لا يمكن تحديد السعر إذا كان المبلغ المطلوب دفعه أكبر من المبلغ الخاص بالعنصر {1}." @@ -42851,11 +43232,11 @@ msgstr "الصف #{0}: لا يمكن إضافة العنصر المقدم من msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times in the Subcontracting Inward process." msgstr "الصف #{0}: لا يمكن إضافة العنصر المقدم من العميل {1} عدة مرات في عملية التعاقد من الباطن الواردة." -#: erpnext/manufacturing/doctype/work_order/work_order.py:347 +#: erpnext/manufacturing/doctype/work_order/work_order.py:352 msgid "Row #{0}: Customer Provided Item {1} cannot be added multiple times." msgstr "الصف #{0}: لا يمكن إضافة العنصر المقدم من العميل {1} عدة مرات." -#: erpnext/manufacturing/doctype/work_order/work_order.py:372 +#: erpnext/manufacturing/doctype/work_order/work_order.py:377 msgid "Row #{0}: Customer Provided Item {1} does not exist in the Required Items table linked to the Subcontracting Inward Order." msgstr "الصف #{0}: العنصر المقدم من العميل {1} غير موجود في جدول العناصر المطلوبة المرتبط بأمر التوريد الداخلي للتعاقد من الباطن." @@ -42863,7 +43244,7 @@ msgstr "الصف #{0}: العنصر المقدم من العميل {1} غير م msgid "Row #{0}: Customer Provided Item {1} exceeds quantity available through Subcontracting Inward Order" msgstr "الصف #{0}: يتجاوز المنتج المقدم من العميل {1} الكمية المتاحة من خلال طلب الشراء الداخلي للتعاقد من الباطن" -#: erpnext/manufacturing/doctype/work_order/work_order.py:360 +#: erpnext/manufacturing/doctype/work_order/work_order.py:365 msgid "Row #{0}: Customer Provided Item {1} has insufficient quantity in the Subcontracting Inward Order. Available quantity is {2}." msgstr "الصف #{0}: الكمية المتوفرة من الصنف المقدم من العميل {1} غير كافية في طلب الشراء الداخلي للمقاول من الباطن. الكمية المتاحة هي {2}." @@ -42880,23 +43261,23 @@ msgstr "الصف #{0}: العنصر المقدم من العميل {1} ليس ج msgid "Row #{0}: Dates overlapping with other row in group {1}" msgstr "الصف #{0}: التواريخ المتداخلة مع صف آخر في المجموعة {1}" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:358 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:359 msgid "Row #{0}: Default BOM not found for FG Item {1}" msgstr "الصف #{0}: لم يتم العثور على قائمة مكونات المنتج النهائية الافتراضية لعنصر المنتج النهائي {1}" -#: erpnext/assets/doctype/asset/asset.py:684 +#: erpnext/assets/doctype/asset/asset.py:685 msgid "Row #{0}: Depreciation Start Date is required" msgstr "الصف #{0}: تاريخ بداية الإهلاك مطلوب" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:333 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:334 msgid "Row #{0}: Duplicate entry in References {1} {2}" msgstr "الصف # {0}: إدخال مكرر في المراجع {1} {2}" -#: erpnext/selling/doctype/sales_order/sales_order.py:329 +#: erpnext/selling/doctype/sales_order/sales_order.py:331 msgid "Row #{0}: Expected Delivery Date cannot be before Purchase Order Date" msgstr "الصف # {0}: تاريخ التسليم المتوقع لا يمكن أن يكون قبل تاريخ أمر الشراء" -#: erpnext/controllers/stock_controller.py:877 +#: erpnext/controllers/stock_controller.py:918 msgid "Row #{0}: Expense Account not set for the Item {1}. {2}" msgstr "الصف #{0}: لم يتم تعيين حساب المصروفات للعنصر {1}. {2}" @@ -42904,22 +43285,22 @@ msgstr "الصف #{0}: لم يتم تعيين حساب المصروفات للع msgid "Row #{0}: Expense account {1} is not valid for Purchase Invoice {2}. Only expense accounts from non-stock items are allowed." msgstr "الصف #{0}: حساب المصروفات {1} غير صالح لفاتورة الشراء {2}. يُسمح فقط بحسابات المصروفات الخاصة بالعناصر غير المخزنة." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:363 -#: erpnext/selling/doctype/sales_order/sales_order.py:302 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:364 +#: erpnext/selling/doctype/sales_order/sales_order.py:304 msgid "Row #{0}: Finished Good Item Qty can not be zero" msgstr "الصف #{0}: لا يمكن أن تكون كمية المنتج النهائي صفرًا" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:345 -#: erpnext/selling/doctype/sales_order/sales_order.py:282 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:346 +#: erpnext/selling/doctype/sales_order/sales_order.py:284 msgid "Row #{0}: Finished Good Item is not specified for service item {1}" msgstr "الصف #{0}: لم يتم تحديد عنصر المنتج النهائي لعنصر الخدمة {1}" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:352 -#: erpnext/selling/doctype/sales_order/sales_order.py:289 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:353 +#: erpnext/selling/doctype/sales_order/sales_order.py:291 msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item" msgstr "الصف #{0}: يجب أن يكون المنتج النهائي {1} منتجًا تم التعاقد عليه من الباطن" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:470 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:475 msgid "Row #{0}: Finished Good must be {1}" msgstr "الصف #{0}: يجب أن يكون المنتج النهائي {1}" @@ -42932,15 +43313,15 @@ msgstr "الصف #{0}: مرجع المنتج النهائي إلزامي لعن msgid "Row #{0}: For Customer Provided Item {1}, Source Warehouse must be {2}" msgstr "الصف #{0}: بالنسبة للمنتج المقدم من العميل {1}، يجب أن يكون مستودع المصدر {2}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:687 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:688 msgid "Row #{0}: For {1}, you can select reference document only if account gets credited" msgstr "الصف #{0}: بالنسبة للصف {1}، يمكنك تحديد المستند المرجعي فقط في حالة إضافة رصيد إلى الحساب" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:697 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:698 msgid "Row #{0}: For {1}, you can select reference document only if account gets debited" msgstr "الصف #{0}: بالنسبة للصف {1}، يمكنك تحديد المستند المرجعي فقط في حالة خصم الحساب." -#: erpnext/assets/doctype/asset/asset.py:667 +#: erpnext/assets/doctype/asset/asset.py:668 msgid "Row #{0}: Frequency of Depreciation must be greater than zero" msgstr "الصف #{0}: يجب أن يكون معدل الاستهلاك أكبر من الصفر" @@ -42956,7 +43337,7 @@ msgstr "الصف #{0}: حقلا \"من وقت\" و\"إلى وقت\" مطلوبا msgid "Row #{0}: Item added" msgstr "الصف # {0}: تمت إضافة العنصر" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1536 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1541 msgid "Row #{0}: Item {1} cannot be transferred more than {2} against {3} {4}" msgstr "الصف #{0}: لا يمكن نقل العنصر {1} إلى أكثر من {2} مقابل {3} {4}" @@ -42968,15 +43349,15 @@ msgstr "الصف #{0}: العنصر {1} غير موجود" msgid "Row #{0}: Item {1} has been picked, please reserve stock from the Pick List." msgstr "الصف #{0}: تم اختيار العنصر {1} ، يرجى حجز المخزون من قائمة الاختيار." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:448 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:449 msgid "Row #{0}: Item {1} has no stock in warehouse {2}." msgstr "الصف #{0}: العنصر {1} ليس لديه مخزون في المستودع {2}." -#: erpnext/controllers/stock_controller.py:109 +#: erpnext/controllers/stock_controller.py:150 msgid "Row #{0}: Item {1} has zero rate but 'Allow Zero Valuation Rate' is not enabled." msgstr "الصف #{0}: العنصر {1} لديه معدل صفر ولكن \"السماح بمعدل تقييم صفري\" غير مفعل." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:455 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:456 msgid "Row #{0}: Item {1} in warehouse {2}: Available {3}, Needed {4}." msgstr "الصف #{0}: العنصر {1} في المستودع {2}: متوفر {3}، مطلوب {4}." @@ -42984,7 +43365,7 @@ msgstr "الصف #{0}: العنصر {1} في المستودع {2}: متوفر {3 msgid "Row #{0}: Item {1} is not a Customer Provided Item." msgstr "الصف #{0}: العنصر {1} ليس عنصرًا مقدمًا من العميل." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:760 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:764 msgid "Row #{0}: Item {1} is not a Serialized/Batched Item. It cannot have a Serial No/Batch No against it." msgstr "الصف # {0}: العنصر {1} ليس عنصرًا تسلسليًا / مُجمَّع. لا يمكن أن يكون له رقم مسلسل / لا دفعة ضده." @@ -43009,7 +43390,7 @@ msgstr "الصف #{0}: العنصر {1} غير متطابق. لا يُسمح ب msgid "Row #{0}: Item {1} mismatch. Changing of item code is not permitted." msgstr "الصف #{0}: عدم تطابق العنصر {1} . لا يُسمح بتغيير رمز العنصر." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:764 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:765 msgid "Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher" msgstr "الصف {1} : قيد اليومية {1} لا يحتوى على الحساب {2} أو بالفعل يوجد في قسيمة مقابلة أخرى\\n
    \\nRow #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher" @@ -43017,15 +43398,15 @@ msgstr "الصف {1} : قيد اليومية {1} لا يحتوى على الحس msgid "Row #{0}: Missing {1} for company {2}." msgstr "" -#: erpnext/assets/doctype/asset/asset.py:678 +#: erpnext/assets/doctype/asset/asset.py:679 msgid "Row #{0}: Next Depreciation Date cannot be before Available-for-use Date" msgstr "الصف #{0}: لا يمكن أن يكون تاريخ الاستهلاك التالي قبل تاريخ الإتاحة للاستخدام" -#: erpnext/assets/doctype/asset/asset.py:673 +#: erpnext/assets/doctype/asset/asset.py:674 msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date" msgstr "الصف #{0}: لا يمكن أن يكون تاريخ الاستهلاك التالي قبل تاريخ الشراء" -#: erpnext/selling/doctype/sales_order/sales_order.py:669 +#: erpnext/selling/doctype/sales_order/sales_order.py:671 msgid "Row #{0}: Not allowed to change Supplier as Purchase Order already exists" msgstr "الصف رقم {0}: غير مسموح تغيير المورد لأن أمر الشراء موجود مسبقاً\\n
    \\nRow #{0}: Not allowed to change Supplier as Purchase Order already exists" @@ -43033,11 +43414,11 @@ msgstr "الصف رقم {0}: غير مسموح تغيير المورد لأن أ msgid "Row #{0}: Only {1} available to reserve for the Item {2}" msgstr "الصف #{0}: الصف {1} فقط متاح للحجز للعنصر {2}" -#: erpnext/assets/doctype/asset/asset.py:641 +#: erpnext/assets/doctype/asset/asset.py:642 msgid "Row #{0}: Opening Accumulated Depreciation must be less than or equal to {1}" msgstr "الصف #{0}: يجب أن يكون الاستهلاك المتراكم الافتتاحي أقل من أو يساوي {1}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:869 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:874 msgid "Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}." msgstr "الصف # {0}: العملية {1} لم تكتمل لـ {2} الكمية من السلع تامة الصنع في أمر العمل {3}. يرجى تحديث حالة التشغيل عبر بطاقة العمل {4}." @@ -43066,7 +43447,7 @@ msgstr "الصف #{0}: الرجاء تحديد مستودع التجميع ال msgid "Row #{0}: Please set reorder quantity" msgstr "الصف # {0}: يرجى تعيين إعادة ترتيب الكمية\\n
    \\nRow #{0}: Please set reorder quantity" -#: erpnext/controllers/accounts_controller.py:613 +#: erpnext/controllers/accounts_controller.py:614 msgid "Row #{0}: Please update deferred revenue/expense account in item row or default account in company master" msgstr "الصف #{0}: يرجى تحديث حساب الإيرادات/المصروفات المؤجلة في صف البند أو الحساب الافتراضي في بيانات الشركة الرئيسية" @@ -43083,15 +43464,15 @@ msgstr "الصف #{0}: يجب أن تكون الكمية عددًا موجبًا msgid "Row #{0}: Qty should be less than or equal to Available Qty to Reserve (Actual Qty - Reserved Qty) {1} for Iem {2} against Batch {3} in Warehouse {4}." msgstr "الصف #{0}: يجب أن تكون الكمية أقل من أو تساوي الكمية المتاحة للحجز (الكمية الفعلية - الكمية المحجوزة) {1} للصنف {2} مقابل الدفعة {3} في المستودع {4}." -#: erpnext/controllers/stock_controller.py:1419 +#: erpnext/controllers/stock_controller.py:1460 msgid "Row #{0}: Quality Inspection is required for Item {1}" msgstr "الصف #{0}: يلزم فحص الجودة للعنصر {1}" -#: erpnext/controllers/stock_controller.py:1434 +#: erpnext/controllers/stock_controller.py:1475 msgid "Row #{0}: Quality Inspection {1} is not submitted for the item: {2}" msgstr "الصف #{0}: لم يتم تقديم فحص الجودة {1} للعنصر: {2}" -#: erpnext/controllers/stock_controller.py:1449 +#: erpnext/controllers/stock_controller.py:1490 msgid "Row #{0}: Quality Inspection {1} was rejected for item {2}" msgstr "الصف #{0}: تم رفض فحص الجودة {1} للعنصر {2}" @@ -43099,8 +43480,7 @@ msgstr "الصف #{0}: تم رفض فحص الجودة {1} للعنصر {2}" msgid "Row #{0}: Quantity cannot be a non-positive number. Please increase the quantity or remove the Item {1}" msgstr "الصف #{0}: لا يمكن أن تكون الكمية عددًا غير موجب. يُرجى زيادة الكمية أو إزالة العنصر {1}" -#: erpnext/controllers/accounts_controller.py:1453 -#: erpnext/controllers/accounts_controller.py:3878 +#: erpnext/controllers/accounts_controller.py:1454 msgid "Row #{0}: Quantity for Item {1} cannot be zero." msgstr "الصف # {0}: كمية البند {1} لا يمكن أن يكون صفرا" @@ -43112,18 +43492,18 @@ msgstr "الصف #{0}: لا يمكن أن تتجاوز كمية الصنف {1} msgid "Row #{0}: Quantity to reserve for the Item {1} should be greater than 0." msgstr "الصف #{0}: يجب أن تكون الكمية المراد حجزها للعنصر {1} أكبر من 0." -#: erpnext/controllers/accounts_controller.py:868 -#: erpnext/controllers/accounts_controller.py:880 +#: erpnext/controllers/accounts_controller.py:869 +#: erpnext/controllers/accounts_controller.py:881 #: erpnext/utilities/transaction_base.py:114 #: erpnext/utilities/transaction_base.py:120 msgid "Row #{0}: Rate must be same as {1}: {2} ({3} / {4})" msgstr "الصف #{0}: يجب أن يكون المعدل هو نفسه {1}: {2} ({3} / {4})" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1254 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1258 msgid "Row #{0}: Reference Document Type must be one of Purchase Order, Purchase Invoice or Journal Entry" msgstr "الصف {0} : نوع المستند المرجع يجب أن يكون واحدة من طلب شراء ,فاتورة شراء أو قيد يومبة\\n
    \\nRow #{0}: Reference Document Type must be one of Purchase Order, Purchase Invoice or Journal Entry" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1240 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1244 msgid "Row #{0}: Reference Document Type must be one of Sales Order, Sales Invoice, Journal Entry or Dunning" msgstr "الصف # {0}: يجب أن يكون نوع المستند المرجعي أحد أوامر المبيعات أو فاتورة المبيعات أو إدخال دفتر اليومية أو المطالبة" @@ -43139,7 +43519,7 @@ msgstr "الصف #{0}: المستودع المرفوض إلزامي للعنصر msgid "Row #{0}: Repair cost {1} exceeds available amount {2} for Purchase Invoice {3} and Account {4}" msgstr "الصف #{0}: تكلفة الإصلاح {1} تتجاوز المبلغ المتاح {2} لفاتورة الشراء {3} والحساب {4}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:425 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:426 msgid "Row #{0}: Return Against is required for returning asset" msgstr "الصف #{0}: مطلوب إرجاع الأصل." @@ -43162,11 +43542,11 @@ msgid "Row #{0}: Selling rate for item {1} is lower than its {2}.\n" "\t\t\t\t\tthis validation." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:276 +#: erpnext/manufacturing/doctype/work_order/work_order.py:281 msgid "Row #{0}: Sequence ID must be {1} or {2} for Operation {3}." msgstr "الصف #{0}: يجب أن يكون معرف التسلسل {1} أو {2} للعملية {3}." -#: erpnext/controllers/stock_controller.py:261 +#: erpnext/controllers/stock_controller.py:302 msgid "Row #{0}: Serial No {1} does not belong to Batch {2}" msgstr "الصف # {0}: الرقم التسلسلي {1} لا ينتمي إلى الدُفعة {2}" @@ -43182,19 +43562,19 @@ msgstr "الصف #{0}: تم تحديد الرقم التسلسلي {1} بالف msgid "Row #{0}: Serial No(s) {1} are not a part of the linked Subcontracting Inward Order. Please select valid Serial No(s)." msgstr "الصف #{0}: الأرقام التسلسلية {1} ليست جزءًا من أمر التوريد الداخلي المرتبط بالتعاقد من الباطن. يرجى تحديد رقم تسلسلي صحيح." -#: erpnext/controllers/accounts_controller.py:641 +#: erpnext/controllers/accounts_controller.py:642 msgid "Row #{0}: Service End Date cannot be before Invoice Posting Date" msgstr "الصف # {0}: لا يمكن أن يكون تاريخ انتهاء الخدمة قبل تاريخ ترحيل الفاتورة" -#: erpnext/controllers/accounts_controller.py:635 +#: erpnext/controllers/accounts_controller.py:636 msgid "Row #{0}: Service Start Date cannot be greater than Service End Date" msgstr "الصف # {0}: لا يمكن أن يكون تاريخ بدء الخدمة أكبر من تاريخ انتهاء الخدمة" -#: erpnext/controllers/accounts_controller.py:629 +#: erpnext/controllers/accounts_controller.py:630 msgid "Row #{0}: Service Start and End Date is required for deferred accounting" msgstr "الصف # {0}: مطلوب بداية وتاريخ انتهاء الخدمة للمحاسبة المؤجلة" -#: erpnext/selling/doctype/sales_order/sales_order.py:492 +#: erpnext/selling/doctype/sales_order/sales_order.py:494 msgid "Row #{0}: Set Supplier for item {1}" msgstr "الصف # {0}: حدد المورد للبند {1}" @@ -43206,19 +43586,19 @@ msgstr "الصف #{0}: بما أن خيار \"تتبع المنتجات نصف msgid "Row #{0}: Source Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "الصف #{0}: يجب أن يكون مستودع المصدر هو نفسه مستودع العميل {1} من أمر التوريد الداخلي المرتبط بالتعاقد من الباطن" -#: erpnext/manufacturing/doctype/work_order/work_order.py:381 +#: erpnext/manufacturing/doctype/work_order/work_order.py:386 msgid "Row #{0}: Source Warehouse {1} for item {2} cannot be a customer warehouse." msgstr "الصف #{0}: لا يمكن أن يكون مستودع المصدر {1} للعنصر {2} مستودع عميل." -#: erpnext/manufacturing/doctype/work_order/work_order.py:336 +#: erpnext/manufacturing/doctype/work_order/work_order.py:341 msgid "Row #{0}: Source Warehouse {1} for item {2} must be same as Source Warehouse {3} in the Work Order." msgstr "الصف #{0}: يجب أن يكون مستودع المصدر {1} للعنصر {2} هو نفسه مستودع المصدر {3} في أمر العمل." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1016 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1021 msgid "Row #{0}: Source and Target Warehouse cannot be the same for Material Transfer" msgstr "الصف #{0}: لا يمكن أن يكون مستودع المصدر ومستودع الهدف متطابقين لنقل المواد" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1038 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1043 msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer" msgstr "الصف #{0}: لا يمكن أن تكون أبعاد المستودع المصدر والمستودع الهدف والمخزون متطابقة تمامًا في عملية نقل المواد." @@ -43230,11 +43610,11 @@ msgstr "الصف #{0}: مطلوب وقت البدء ووقت الانتهاء" msgid "Row #{0}: Start Time must be before End Time" msgstr "الصف #{0}: يجب أن يكون وقت البدء قبل وقت الانتهاء" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:209 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:211 msgid "Row #{0}: Status is mandatory" msgstr "الصف #{0}: الحالة إلزامية" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:449 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:450 msgid "Row #{0}: Status must be {1} for Invoice Discounting {2}" msgstr "الصف # {0}: يجب أن تكون الحالة {1} بالنسبة لخصم الفاتورة {2}" @@ -43254,7 +43634,7 @@ msgstr "الصف #{0}: لا يمكن حجز المخزون في مستودع ا msgid "Row #{0}: Stock is already reserved for the Item {1}." msgstr "الصف #{0}: تم حجز المخزون بالفعل للصنف {1}." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:553 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:554 msgid "Row #{0}: Stock is reserved for item {1} in warehouse {2}." msgstr "الصف #{0}: تم حجز المخزون للصنف {1} في المستودع {2}." @@ -43267,7 +43647,7 @@ msgstr "الصف #{0}: المخزون غير متاح للحجز للصنف {1} msgid "Row #{0}: Stock not available to reserve for the Item {1} in Warehouse {2}." msgstr "الصف #{0}: المخزون غير متاح للحجز للصنف {1} في المستودع {2}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1270 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1271 msgid "Row #{0}: Stock quantity {1} ({2}) for item {3} cannot exceed {4}" msgstr "الصف #{0}: كمية المخزون {1} ({2}) للصنف {3} لا يمكن أن تتجاوز {4}" @@ -43275,7 +43655,7 @@ msgstr "الصف #{0}: كمية المخزون {1} ({2}) للصنف {3} لا ي msgid "Row #{0}: Target Warehouse must be same as Customer Warehouse {1} from the linked Subcontracting Inward Order" msgstr "الصف #{0}: يجب أن يكون المستودع المستهدف هو نفسه مستودع العميل {1} من أمر الشراء الداخلي المرتبط بالتعاقد من الباطن" -#: erpnext/controllers/stock_controller.py:274 +#: erpnext/controllers/stock_controller.py:315 msgid "Row #{0}: The batch {1} has already expired." msgstr "الصف رقم {0}: انتهت صلاحية الدفعة {1} بالفعل." @@ -43287,14 +43667,18 @@ msgstr "الصف #{0}: المستودع {1} ليس مستودعًا فرعيًا msgid "Row #{0}: Timings conflicts with row {1}" msgstr "الصف # {0}: التوقيت يتعارض مع الصف {1}" -#: erpnext/assets/doctype/asset/asset.py:654 +#: erpnext/assets/doctype/asset/asset.py:655 msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations" msgstr "الصف #{0}: لا يمكن أن يكون إجمالي عدد الإهلاكات أقل من أو يساوي عدد الإهلاكات المسجلة في بداية الفترة." -#: erpnext/assets/doctype/asset/asset.py:663 +#: erpnext/assets/doctype/asset/asset.py:664 msgid "Row #{0}: Total Number of Depreciations must be greater than zero" msgstr "الصف #{0}: يجب أن يكون إجمالي عدد الاستهلاكات أكبر من الصفر" +#: erpnext/controllers/stock_controller.py:105 +msgid "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." +msgstr "" + #: erpnext/accounts/doctype/tax_withholding_entry/tax_withholding_entry.py:94 msgid "Row #{0}: Withholding Amount {1} does not match calculated amount {2}." msgstr "الصف #{0}: مبلغ الاستقطاع {1} لا يتطابق مع المبلغ المحسوب {2}." @@ -43303,11 +43687,11 @@ msgstr "الصف #{0}: مبلغ الاستقطاع {1} لا يتطابق مع ا msgid "Row #{0}: Work Order exists against full or partial quantity of Item {1}" msgstr "الصف #{0}: يوجد أمر عمل مقابل كمية كاملة أو جزئية من العنصر {1}" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:99 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:103 msgid "Row #{0}: You cannot use the inventory dimension '{1}' in Stock Reconciliation to modify the quantity or valuation rate. Stock reconciliation with inventory dimensions is intended solely for performing opening entries." msgstr "الصف #{0}: لا يمكنك استخدام بُعد المخزون '{1}' في مطابقة المخزون لتعديل الكمية أو معدل التقييم. تُستخدم مطابقة المخزون باستخدام أبعاد المخزون فقط لإجراء قيود افتتاحية." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:429 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:430 msgid "Row #{0}: You must select an Asset for Item {1}." msgstr "الصف #{0}: يجب عليك تحديد أصل للعنصر {1}." @@ -43315,7 +43699,7 @@ msgstr "الصف #{0}: يجب عليك تحديد أصل للعنصر {1}." msgid "Row #{0}: {1} can not be negative for item {2}" msgstr "الصف # {0}: {1} لا يمكن أن يكون سالبا للبند {2}" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:322 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:324 msgid "Row #{0}: {1} is not a valid reading field. Please refer to the field description." msgstr "الصف #{0}: {1} ليس حقل قراءة صالحًا. يُرجى مراجعة وصف الحقل." @@ -43327,6 +43711,10 @@ msgstr "الصف رقم {0}: {1} مطلوب لإنشاء فواتير الافت msgid "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account." msgstr "الصف #{0}: {1} من {2} يجب أن يكون {3}. يرجى تحديث {1} أو اختيار حساب آخر." +#: erpnext/controllers/accounts_controller.py:3895 +msgid "Row #{0}:Quantity for Item {1} cannot be zero." +msgstr "" + #: erpnext/buying/utils.py:106 msgid "Row #{1}: Warehouse is mandatory for stock Item {0}" msgstr "الصف #{1}: المستودع إلزامي لعنصر المخزون {0}" @@ -43367,7 +43755,7 @@ msgstr "الصف #{idx}: {schedule_date} لا يمكن أن يكون قبل {tra msgid "Row #{}: Currency of {} - {} doesn't matches company currency." msgstr "الصف # {}: عملة {} - {} لا تطابق عملة الشركة." -#: erpnext/assets/doctype/asset/asset.py:421 +#: erpnext/assets/doctype/asset/asset.py:422 msgid "Row #{}: Finance Book should not be empty since you're using multiple." msgstr "الصف رقم {}: يجب ألا يكون دفتر المالية فارغًا لأنك تستخدم عدة دفاتر." @@ -43387,11 +43775,11 @@ msgstr "الصف رقم {}: فاتورة نقاط البيع {} لم يتم تق msgid "Row #{}: Please assign task to a member." msgstr "الصف رقم {}: يرجى إسناد المهمة إلى أحد الأعضاء." -#: erpnext/assets/doctype/asset/asset.py:413 +#: erpnext/assets/doctype/asset/asset.py:414 msgid "Row #{}: Please use a different Finance Book." msgstr "الصف رقم {}: يرجى استخدام كتاب مالي مختلف." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:523 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:524 msgid "Row #{}: Serial No {} cannot be returned since it was not transacted in original invoice {}" msgstr "الصف # {}: لا يمكن إرجاع الرقم التسلسلي {} لأنه لم يتم التعامل معه في الفاتورة الأصلية {}" @@ -43399,16 +43787,16 @@ msgstr "الصف # {}: لا يمكن إرجاع الرقم التسلسلي {} msgid "Row #{}: The original Invoice {} of return invoice {} is not consolidated." msgstr "الصف رقم {}: الفاتورة الأصلية {} للفاتورة المرتجعة {} غير مجمعة." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:496 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:497 msgid "Row #{}: You cannot add positive quantities in a return invoice. Please remove item {} to complete the return." msgstr "السطر رقم {}: لا يمكنك إضافة كميات موجبة في فاتورة الإرجاع. يرجى حذف العنصر {} لإتمام عملية الإرجاع." -#: erpnext/stock/doctype/pick_list/pick_list.py:198 +#: erpnext/stock/doctype/pick_list/pick_list.py:200 msgid "Row #{}: item {} has been picked already." msgstr "الصف رقم {}: تم اختيار العنصر {} بالفعل." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:140 -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:205 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:142 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:207 msgid "Row #{}: {}" msgstr "رقم الصف {}: {}" @@ -43420,7 +43808,7 @@ msgstr "الصف رقم {}: {} {} غير موجود." msgid "Row #{}: {} {} doesn't belong to Company {}. Please select valid {}." msgstr "الصف رقم {}: {} {} لا ينتمي إلى الشركة {}. يرجى اختيار {} صحيح." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:444 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:445 msgid "Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}" msgstr "رقم الصف {0}: مطلوب تحديد مستودع. يُرجى تحديد مستودع افتراضي للصنف {1} والشركة {2}" @@ -43428,11 +43816,11 @@ msgstr "رقم الصف {0}: مطلوب تحديد مستودع. يُرجى تح msgid "Row {0} : Operation is required against the raw material item {1}" msgstr "الصف {0}: العملية مطلوبة مقابل عنصر المادة الخام {1}" -#: erpnext/stock/doctype/pick_list/pick_list.py:228 +#: erpnext/stock/doctype/pick_list/pick_list.py:230 msgid "Row {0} picked quantity is less than the required quantity, additional {1} {2} required." msgstr "الكمية المختارة من الصف {0} أقل من الكمية المطلوبة، يلزم كمية إضافية {1} {2} ." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1560 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1565 msgid "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}" msgstr "الصف {0}# العنصر {1} غير موجود في جدول \"المواد الخام الموردة\" في {2} {3}" @@ -43440,7 +43828,7 @@ msgstr "الصف {0}# العنصر {1} غير موجود في جدول \"الم msgid "Row {0}: Accepted Qty and Rejected Qty can't be zero at the same time." msgstr "الصف {0}: لا يمكن أن تكون الكمية المقبولة والكمية المرفوضة صفرًا في نفس الوقت." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:602 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:603 msgid "Row {0}: Account {1} and Party Type {2} have different account types" msgstr "الصف {0}: الحساب {1} ونوع الطرف {2} لهما أنواع حسابات مختلفة" @@ -43448,31 +43836,31 @@ msgstr "الصف {0}: الحساب {1} ونوع الطرف {2} لهما أنوا msgid "Row {0}: Activity Type is mandatory." msgstr "الصف {0}: نوع النشاط إلزامي." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:668 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:669 msgid "Row {0}: Advance against Customer must be credit" msgstr "الصف {0}: الدفعة المقدمة مقابل الزبائن يجب أن تكون دائن" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:670 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:671 msgid "Row {0}: Advance against Supplier must be debit" msgstr "الصف {0}:المورد المقابل المتقدم يجب أن يكون مدين\\n
    \\nRow {0}: Advance against Supplier must be debit" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:737 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:739 msgid "Row {0}: Allocated amount {1} must be less than or equal to invoice outstanding amount {2}" msgstr "الصف {0}: يجب أن يكون المبلغ المخصص {1} أقل من أو يساوي المبلغ المستحق من الفاتورة {2}" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:729 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:731 msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}" msgstr "الصف {0}: يجب أن يكون المبلغ المخصص {1} أقل من أو يساوي مبلغ الدفعة المتبقية {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1221 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1226 msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials." msgstr "الصف {0}: بما أن {1} مُفعّل، فلا يمكن إضافة المواد الخام إلى المدخل {2} . استخدم المدخل {3} لاستهلاك المواد الخام." -#: erpnext/stock/doctype/material_request/material_request.py:885 +#: erpnext/stock/doctype/material_request/material_request.py:898 msgid "Row {0}: Bill of Materials not found for the Item {1}" msgstr "صف {0}: من مواد مشروع القانون لم يتم العثور على هذا البند {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:921 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:922 msgid "Row {0}: Both Debit and Credit values cannot be zero" msgstr "الصف {0}: لا يمكن أن تكون قيمتا المدين والدائن صفرًا" @@ -43486,15 +43874,15 @@ msgstr "الصف {0}: يجب أن تكون الكمية المستهلكة {1} { msgid "Row {0}: Conversion Factor is mandatory" msgstr "الصف {0}: معامل التحويل إلزامي" -#: erpnext/controllers/accounts_controller.py:3224 +#: erpnext/controllers/accounts_controller.py:3230 msgid "Row {0}: Cost Center {1} does not belong to Company {2}" msgstr "الصف {0}: مركز التكلفة {1} لا ينتمي إلى الشركة {2}" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:152 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:176 msgid "Row {0}: Cost center is required for an item {1}" msgstr "الصف {0}: مركز التكلفة مطلوب لعنصر {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:767 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:768 msgid "Row {0}: Credit entry can not be linked with a {1}" msgstr "صف {0}: لا يمكن ربط قيد دائن مع {1}" @@ -43502,11 +43890,11 @@ msgstr "صف {0}: لا يمكن ربط قيد دائن مع {1}" msgid "Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}" msgstr "الصف {0}: العملة للـ BOM #{1} يجب أن يساوي العملة المختارة {2}
    Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:762 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:763 msgid "Row {0}: Debit entry can not be linked with a {1}" msgstr "الصف {0}: لا يمكن ربط قيد مدين مع {1}" -#: erpnext/controllers/selling_controller.py:868 +#: erpnext/controllers/selling_controller.py:876 msgid "Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same" msgstr "الصف {0}: لا يمكن أن يكون مستودع التسليم ({1}) ومستودع العميل ({2}) متماثلين" @@ -43514,7 +43902,7 @@ msgstr "الصف {0}: لا يمكن أن يكون مستودع التسليم ({ msgid "Row {0}: Delivery Warehouse cannot be same as Customer Warehouse for Item {1}." msgstr "الصف {0}: لا يمكن أن يكون مستودع التسليم هو نفسه مستودع العميل بالنسبة للعنصر {1}." -#: erpnext/controllers/accounts_controller.py:2717 +#: erpnext/controllers/accounts_controller.py:2721 msgid "Row {0}: Due Date in the Payment Terms table cannot be before Posting Date" msgstr "الصف {0}: لا يمكن أن يكون تاريخ الاستحقاق في جدول شروط الدفع قبل تاريخ الترحيل" @@ -43522,32 +43910,36 @@ msgstr "الصف {0}: لا يمكن أن يكون تاريخ الاستحقاق msgid "Row {0}: Either Delivery Note Item or Packed Item reference is mandatory." msgstr "الصف {0}: يجب أن يكون مرجع عنصر إشعار التسليم أو العنصر المعبأ إلزاميًا." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1012 -#: erpnext/controllers/taxes_and_totals.py:1329 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1013 +#: erpnext/controllers/taxes_and_totals.py:1334 msgid "Row {0}: Exchange Rate is mandatory" msgstr "الصف {0}: سعر صرف إلزامي" -#: erpnext/assets/doctype/asset/asset.py:612 +#: erpnext/assets/doctype/asset/asset.py:613 msgid "Row {0}: Expected Value After Useful Life cannot be negative" msgstr "الصف {0}: لا يمكن أن تكون القيمة المتوقعة بعد العمر الإنتاجي سالبة" -#: erpnext/assets/doctype/asset/asset.py:615 +#: erpnext/assets/doctype/asset/asset.py:616 msgid "Row {0}: Expected Value After Useful Life must be less than Net Purchase Amount" msgstr "الصف {0}: يجب أن تكون القيمة المتوقعة بعد العمر الإنتاجي أقل من صافي مبلغ الشراء" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:534 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:185 +msgid "Row {0}: Expense Account {1} is linked to company {2}. Please select an account belonging to company {3}." +msgstr "" + +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:535 msgid "Row {0}: Expense Head changed to {1} as no Purchase Receipt is created against Item {2}." msgstr "الصف {0}: تم تغيير رأس المصروفات إلى {1} حيث لم يتم إنشاء إيصال شراء مقابل العنصر {2}." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:491 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:492 msgid "Row {0}: Expense Head changed to {1} because account {2} is not linked to warehouse {3} or it is not the default inventory account" msgstr "الصف {0}: تم تغيير بند المصروفات إلى {1} لأن الحساب {2} غير مرتبط بالمستودع {3} أو أنه ليس حساب المخزون الافتراضي" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:516 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:517 msgid "Row {0}: Expense Head changed to {1} because expense is booked against this account in Purchase Receipt {2}" msgstr "الصف {0}: تم تغيير بند المصروفات إلى {1} لأن المصروفات مسجلة مقابل هذا الحساب في إيصال الشراء {2}" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:143 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:153 msgid "Row {0}: For Supplier {1}, Email Address is Required to send an email" msgstr "الصف {0}: للمورد {1} ، مطلوب عنوان البريد الإلكتروني لإرسال بريد إلكتروني" @@ -43560,7 +43952,7 @@ msgstr "صف {0}: (من الوقت) و (إلى وقت) تكون إلزامية." msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "الصف {0}: من وقت إلى وقت {1} يتداخل مع {2}" -#: erpnext/controllers/stock_controller.py:1515 +#: erpnext/controllers/stock_controller.py:1556 msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "الصف {0}: من المستودع إلزامي للتحويلات الداخلية" @@ -43572,7 +43964,7 @@ msgstr "الصف {0}: من وقت يجب أن يكون أقل من الوقت" msgid "Row {0}: Hours value must be greater than zero." msgstr "صف {0}: يجب أن تكون قيمة الساعات أكبر من الصفر." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:787 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:788 msgid "Row {0}: Invalid reference {1}" msgstr "الصف {0}: مرجع غير صالحة {1}" @@ -43580,7 +43972,7 @@ msgstr "الصف {0}: مرجع غير صالحة {1}" msgid "Row {0}: Item Tax template updated as per validity and rate applied" msgstr "الصف {0}: تم تحديث نموذج ضريبة الصنف وفقًا للصلاحية والسعر المطبق" -#: erpnext/controllers/selling_controller.py:633 +#: erpnext/controllers/selling_controller.py:641 msgid "Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer" msgstr "الصف {0}: تم تحديث سعر الصنف وفقًا لسعر التقييم نظرًا لكونه تحويلًا داخليًا للمخزون" @@ -43600,7 +43992,7 @@ msgstr "" msgid "Row {0}: Item {1}'s quantity cannot be higher than the available quantity." msgstr "الصف {0}: لا يمكن أن تكون كمية العنصر {1}أعلى من الكمية المتاحة." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:610 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:611 msgid "Row {0}: Packed Qty must be equal to {1} Qty." msgstr "الصف {0}: يجب أن تكون الكمية المعبأة مساوية للكمية {1} ." @@ -43608,11 +44000,11 @@ msgstr "الصف {0}: يجب أن تكون الكمية المعبأة مساو msgid "Row {0}: Packing Slip is already created for Item {1}." msgstr "الصف {0}: تم إنشاء قائمة التعبئة بالفعل للعنصر {1}." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:813 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:814 msgid "Row {0}: Party / Account does not match with {1} / {2} in {3} {4}" msgstr "الصف {0}: حزب / حساب لا يتطابق مع {1} / {2} في {3} {4}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:591 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:592 msgid "Row {0}: Party Type and Party is required for Receivable / Payable account {1}" msgstr "الصف {0}: نوع الطرف المعني والطرف المعني مطلوب للحسابات المدينة / الدائنة {0}" @@ -43620,11 +44012,11 @@ msgstr "الصف {0}: نوع الطرف المعني والطرف المعني msgid "Row {0}: Payment Term is mandatory" msgstr "الصف {0}: شروط الدفع إلزامية" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:661 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:662 msgid "Row {0}: Payment against Sales/Purchase Order should always be marked as advance" msgstr "الصف {0}: الدفع لطلب الشراء/البيع يجب أن يكون دائما معلم كمتقدم\\n
    \\nRow {0}: Payment against Sales/Purchase Order should always be marked as advance" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:654 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:655 msgid "Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry." msgstr "الصف {0}: يرجى اختيار \"دفعة مقدمة\" مقابل الحساب {1} إذا كان هذا الادخال دفعة مقدمة." @@ -43660,7 +44052,7 @@ msgstr "الصف {0}: يرجى ضبط الكود الصحيح على طريقة msgid "Row {0}: Project must be same as the one set in the Timesheet: {1}." msgstr "الصف {0}: يجب أن يكون المشروع هو نفسه المشروع المحدد في جدول الدوام: {1}." -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:129 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:153 msgid "Row {0}: Purchase Invoice {1} has no stock impact." msgstr "الصف {0}: فاتورة الشراء {1} ليس لها أي تأثير على المخزون." @@ -43668,7 +44060,7 @@ msgstr "الصف {0}: فاتورة الشراء {1} ليس لها أي تأثي msgid "Row {0}: Qty cannot be greater than {1} for the Item {2}." msgstr "الصف {0}: لا يمكن أن تكون الكمية أكبر من {1} للعنصر {2}." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:566 msgid "Row {0}: Qty in Stock UOM can not be zero." msgstr "الصف {0}: لا يمكن أن تكون الكمية في المخزون بوحدة القياس صفرًا." @@ -43680,11 +44072,11 @@ msgstr "الصف {0}: يجب أن تكون الكمية أكبر من 0." msgid "Row {0}: Quantity cannot be negative." msgstr "الصف {0}: لا يمكن أن تكون الكمية سالبة." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:943 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:948 msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})" msgstr "الصف {0}: الكمية غير متوفرة {4} في المستودع {1} في وقت نشر الإدخال ({2} {3})" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:884 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:885 msgid "Row {0}: Sales Invoice {1} is already created for {2}" msgstr "الصف {0}: تم إنشاء فاتورة المبيعات {1} بالفعل لـ {2}" @@ -43692,11 +44084,11 @@ msgstr "الصف {0}: تم إنشاء فاتورة المبيعات {1} بالف msgid "Row {0}: Shift cannot be changed since the depreciation has already been processed" msgstr "الصف {0}: لا يمكن تغيير المناوبة لأن عملية الإهلاك قد تمت بالفعل" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1573 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1578 msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}" msgstr "الصف {0}: العنصر المتعاقد عليه من الباطن إلزامي للمادة الخام {1}" -#: erpnext/controllers/stock_controller.py:1506 +#: erpnext/controllers/stock_controller.py:1547 msgid "Row {0}: Target Warehouse is mandatory for internal transfers" msgstr "الصف {0}: المستودع المستهدف إلزامي للتحويلات الداخلية" @@ -43708,11 +44100,11 @@ msgstr "الصف {0}: المهمة {1} لا تنتمي إلى المشروع {2} msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated." msgstr "الصف {0}: تم تخصيص مبلغ المصروفات بالكامل للحساب {1} في {2} بالفعل." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:607 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:612 msgid "Row {0}: The item {1}, quantity must be positive number" msgstr "الصف {0}: العنصر {1} ، يجب أن تكون الكمية رقمًا موجبًا" -#: erpnext/controllers/accounts_controller.py:3201 +#: erpnext/controllers/accounts_controller.py:3207 msgid "Row {0}: The {3} Account {1} does not belong to the company {2}" msgstr "الصف {0}: الحساب {3} {1} لا ينتمي إلى الشركة {2}" @@ -43720,20 +44112,20 @@ msgstr "الصف {0}: الحساب {3} {1} لا ينتمي إلى الشركة { msgid "Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}" msgstr "الصف {0}: لتعيين دورية {1} ، يجب أن يكون الفرق بين تاريخي البداية والنهاية أكبر من أو يساوي {2}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3363 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3368 msgid "Row {0}: Transferred quantity cannot be greater than the requested quantity." msgstr "الصف {0}: لا يمكن أن تكون الكمية المنقولة أكبر من الكمية المطلوبة." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:555 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:560 msgid "Row {0}: UOM Conversion Factor is mandatory" msgstr "الصف {0}: عامل تحويل UOM إلزامي\\n
    \\nRow {0}: UOM Conversion Factor is mandatory" #: erpnext/manufacturing/doctype/bom/bom.py:1212 -#: erpnext/manufacturing/doctype/work_order/work_order.py:410 +#: erpnext/manufacturing/doctype/work_order/work_order.py:415 msgid "Row {0}: Workstation or Workstation Type is mandatory for an operation {1}" msgstr "الصف {0}: محطة العمل أو نوع محطة العمل إلزامي للعملية {1}" -#: erpnext/controllers/accounts_controller.py:1172 +#: erpnext/controllers/accounts_controller.py:1173 msgid "Row {0}: user has not applied the rule {1} on the item {2}" msgstr "الصف {0}: لم يطبق المستخدم القاعدة {1} على العنصر {2}" @@ -43745,19 +44137,23 @@ msgstr "الصف {0}: {1} تم تقديم طلب بالفعل للحساب في msgid "Row {0}: {1} must be greater than 0" msgstr "الصف {0}: يجب أن يكون {1} أكبر من 0" -#: erpnext/controllers/accounts_controller.py:778 +#: erpnext/controllers/accounts_controller.py:779 msgid "Row {0}: {1} {2} cannot be same as {3} (Party Account) {4}" msgstr "الصف {0}: {1} {2} لا يمكن أن يكون هو نفسه {3} (حساب الطرفية) {4}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:827 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:828 msgid "Row {0}: {1} {2} does not match with {3}" msgstr "الصف {0}: {1} {2} لا يتطابق مع {3}" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:102 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:135 +msgid "Row {0}: {1} {2} is linked to company {3}. Please select a document belonging to company {4}." +msgstr "" + +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:109 msgid "Row {0}: {2} Item {1} does not exist in {2} {3}" msgstr "الصف {0}: {2} العنصر {1} غير موجود في {2} {3}" -#: erpnext/utilities/transaction_base.py:562 +#: erpnext/utilities/transaction_base.py:563 msgid "Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}." msgstr "الصف {1}: لا يمكن أن تكون الكمية ({0}) كسرًا. للسماح بذلك ، قم بتعطيل '{2}' في UOM {3}." @@ -43787,7 +44183,7 @@ msgstr "تمت إزالة الصفوف في {0}" msgid "Rows with Same Account heads will be merged on Ledger" msgstr "سيتم دمج الصفوف التي تحتوي على نفس رؤوس الحسابات في دفتر الأستاذ" -#: erpnext/controllers/accounts_controller.py:2728 +#: erpnext/controllers/accounts_controller.py:2732 msgid "Rows with duplicate due dates in other rows were found: {0}" msgstr "تم العثور على صفوف ذات تواريخ استحقاق مكررة في صفوف أخرى: {0}" @@ -43795,7 +44191,7 @@ msgstr "تم العثور على صفوف ذات تواريخ استحقاق م msgid "Rows: {0} have 'Payment Entry' as reference_type. This should not be set manually." msgstr "الصفوف: {0} تحتوي على \"إدخال الدفع\" كنوع مرجعي. لا ينبغي تعيين هذا يدويًا." -#: erpnext/controllers/accounts_controller.py:280 +#: erpnext/controllers/accounts_controller.py:281 msgid "Rows: {0} in {1} section are Invalid. Reference Name should point to a valid Payment Entry or Journal Entry." msgstr "الصفوف: {0} في القسم {1} غير صالحة. يجب أن يشير اسم المرجع إلى قيد دفع أو قيد يومية صالح." @@ -43870,7 +44266,7 @@ msgstr "تم الوفاء باتفاقية مستوى الخدمة (SLA)" msgid "SLA Paused On" msgstr "تم إيقاف اتفاقية مستوى الخدمة مؤقتًا" -#: erpnext/public/js/utils.js:1164 +#: erpnext/public/js/utils.js:1233 msgid "SLA is on hold since {0}" msgstr "اتفاقية مستوى الخدمة معلقة منذ {0}" @@ -43960,23 +44356,23 @@ msgstr "طريقة تحصيل الراتب" #: erpnext/accounts/doctype/tax_category/tax_category_dashboard.py:9 #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/crm/doctype/opportunity/opportunity.js:288 -#: erpnext/crm/doctype/opportunity/opportunity.py:158 +#: erpnext/crm/doctype/opportunity/opportunity.py:159 #: erpnext/projects/doctype/project/project_dashboard.py:15 #: erpnext/regional/report/vat_audit_report/vat_audit_report.py:144 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json -#: erpnext/setup/doctype/company/company.py:455 -#: erpnext/setup/doctype/company/company.py:647 +#: erpnext/setup/doctype/company/company.py:456 +#: erpnext/setup/doctype/company/company.py:648 #: erpnext/setup/doctype/company/company_dashboard.py:9 #: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12 -#: erpnext/setup/install.py:341 +#: erpnext/setup/install.py:372 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:297 #: erpnext/stock/doctype/item/item.json #: erpnext/stock/doctype/pick_list/pick_list_dashboard.py:16 msgid "Sales" msgstr "مبيعات" -#: erpnext/setup/doctype/company/company.py:647 +#: erpnext/setup/doctype/company/company.py:648 msgid "Sales Account" msgstr "حساب مبيعات" @@ -44145,35 +44541,35 @@ msgstr "معاملات فواتير المبيعات" msgid "Sales Invoice Trends" msgstr "اتجاهات فاتورة المبيعات" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:182 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:184 msgid "Sales Invoice does not have Payments" msgstr "لا تحتوي فاتورة المبيعات على مدفوعات" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:178 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:180 msgid "Sales Invoice is already consolidated" msgstr "تم بالفعل تجميع فاتورة المبيعات." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:184 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:186 msgid "Sales Invoice is not created using POS" msgstr "لم يتم إنشاء فاتورة المبيعات باستخدام نظام نقاط البيع" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:190 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:192 msgid "Sales Invoice is not submitted" msgstr "لم يتم تقديم فاتورة المبيعات" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:193 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:195 msgid "Sales Invoice isn't created by user {}" msgstr "لم يتم إنشاء فاتورة المبيعات بواسطة المستخدم {}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:468 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:469 msgid "Sales Invoice mode is activated in POS. Please create Sales Invoice instead." msgstr "تم تفعيل وضع فاتورة المبيعات في نظام نقاط البيع. يرجى إنشاء فاتورة مبيعات بدلاً من ذلك." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:630 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:631 msgid "Sales Invoice {0} has already been submitted" msgstr "سبق أن تم ترحيل فاتورة المبيعات {0}" -#: erpnext/selling/doctype/sales_order/sales_order.py:588 +#: erpnext/selling/doctype/sales_order/sales_order.py:590 msgid "Sales Invoice {0} must be deleted before cancelling this Sales Order" msgstr "يجب حذف فاتورة المبيعات {0} قبل إلغاء أمر البيع هذا" @@ -44231,7 +44627,7 @@ msgstr "فرص المبيعات حسب المصدر" #: erpnext/accounts/report/sales_register/sales_register.py:238 #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json -#: erpnext/controllers/selling_controller.py:494 +#: erpnext/controllers/selling_controller.py:495 #: erpnext/crm/doctype/contract/contract.json #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:65 #: erpnext/maintenance/doctype/maintenance_schedule_item/maintenance_schedule_item.json @@ -44367,24 +44763,24 @@ msgstr "حالة طلب المبيعات" msgid "Sales Order Trends" msgstr "مجرى طلبات البيع" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:282 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:283 msgid "Sales Order required for Item {0}" msgstr "طلب البيع مطلوب للبند {0}\\n
    \\nSales Order required for Item {0}" -#: erpnext/selling/doctype/sales_order/sales_order.py:353 +#: erpnext/selling/doctype/sales_order/sales_order.py:355 msgid "Sales Order {0} already exists against Customer's Purchase Order {1}. To allow multiple Sales Orders, Enable {2} in {3}" msgstr "يوجد بالفعل أمر بيع {0} مرتبط بأمر شراء العميل {1}. للسماح بإنشاء أوامر بيع متعددة، فعّل الخيار {2} في {3}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1400 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1401 msgid "Sales Order {0} is not submitted" msgstr "لا يتم اعتماد أمر التوريد {0}\\n
    \\nSales Order {0} is not submitted" -#: erpnext/manufacturing/doctype/work_order/work_order.py:461 +#: erpnext/manufacturing/doctype/work_order/work_order.py:479 msgid "Sales Order {0} is not valid" msgstr "أمر البيع {0} غير موجود\\n
    \\nSales Order {0} is not valid" -#: erpnext/controllers/selling_controller.py:475 -#: erpnext/manufacturing/doctype/work_order/work_order.py:466 +#: erpnext/controllers/selling_controller.py:476 +#: erpnext/manufacturing/doctype/work_order/work_order.py:484 msgid "Sales Order {0} is {1}" msgstr "طلب المبيعات {0} هو {1}" @@ -44440,7 +44836,7 @@ msgstr "أوامر المبيعات لتقديم" #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:119 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1257 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1299 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:103 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:194 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:74 @@ -44547,7 +44943,7 @@ msgstr "ملخص دفع المبيعات" #: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts_accounts_receivable.html:158 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.html:137 #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:125 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1254 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1296 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:109 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:191 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:80 @@ -44674,6 +45070,11 @@ msgstr "قالب ضريبة المبيعات" msgid "Sales Tax Withholding Category" msgstr "فئة اقتطاع ضريبة المبيعات" +#. Label of a Workspace Sidebar Item +#: erpnext/workspace_sidebar/accounts_setup.json +msgid "Sales Taxes" +msgstr "" + #. Label of the taxes (Table) field in DocType 'POS Invoice' #. Label of the taxes (Table) field in DocType 'Sales Invoice' #. Name of a DocType @@ -44780,7 +45181,7 @@ msgstr "تم إدخال نفس الشركة أكثر من مره\\n
    \\nSame C msgid "Same Item" msgstr "نفس البند" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:599 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:603 msgid "Same item and warehouse combination already entered." msgstr "تم إدخال نفس المنتج ونفس تركيبة المستودع مسبقاً." @@ -44788,7 +45189,7 @@ msgstr "تم إدخال نفس المنتج ونفس تركيبة المستود msgid "Same item cannot be entered multiple times." msgstr "لا يمكن إدخال البند نفسه عدة مرات." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:112 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:122 msgid "Same supplier has been entered multiple times" msgstr "تم إدخال المورد نفسه عدة مرات" @@ -44800,7 +45201,7 @@ msgid "Sample Quantity" msgstr "كمية العينة" #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:269 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:447 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:448 msgid "Sample Retention Stock Entry" msgstr "إدخال بيانات المخزون للاحتفاظ بالعينات" @@ -44812,12 +45213,12 @@ msgstr "مستودع الاحتفاظ بالعينات" #. Label of the sample_size (Float) field in DocType 'Quality Inspection' #: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:93 -#: erpnext/public/js/controllers/transaction.js:2817 +#: erpnext/public/js/controllers/transaction.js:2918 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Sample Size" msgstr "حجم العينة" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3853 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3858 msgid "Sample quantity {0} cannot be more than received quantity {1}" msgstr "كمية العينة {0} لا يمكن أن تكون أكثر من الكمية المستلمة {1}" @@ -44895,7 +45296,7 @@ msgstr "رقم المسح التسلسلي" msgid "Scan barcode for item {0}" msgstr "امسح الرمز الشريطي للمنتج {0}" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:109 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js:111 msgid "Scan mode enabled, existing quantity will not be fetched." msgstr "تم تفعيل وضع المسح الضوئي، ولن يتم جلب الكمية الموجودة." @@ -44918,6 +45319,10 @@ msgstr "الكمية الممسوحة ضوئياً" msgid "Schedule Date" msgstr "جدول التسجيل" +#: erpnext/public/js/controllers/transaction.js:486 +msgid "Schedule Name" +msgstr "" + #. Label of the scheduled_date (Date) field in DocType 'Maintenance Schedule #. Detail' #: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:118 @@ -44925,6 +45330,10 @@ msgstr "جدول التسجيل" msgid "Scheduled Date" msgstr "المقرر تاريخ" +#: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py:427 +msgid "Scheduled Date is required." +msgstr "" + #. Label of the scheduled_time (Datetime) field in DocType 'Appointment' #. Label of the scheduled_time_section (Section Break) field in DocType 'Job #. Card' @@ -45173,7 +45582,7 @@ msgstr "فصل الحزم التسلسلية / الدفعية" msgid "Select Accounting Dimension." msgstr "حدد بُعد المحاسبة." -#: erpnext/public/js/utils.js:464 +#: erpnext/public/js/utils.js:529 msgid "Select Alternate Item" msgstr "اختر البند البديل" @@ -45181,7 +45590,7 @@ msgstr "اختر البند البديل" msgid "Select Alternative Items for Sales Order" msgstr "اختر عناصر بديلة لطلب البيع" -#: erpnext/stock/doctype/item/item.js:715 +#: erpnext/stock/doctype/item/item.js:733 msgid "Select Attribute Values" msgstr "حدد قيم السمات" @@ -45199,7 +45608,7 @@ msgstr "اختر قائمة المواد، الكمية، وإلى المخزن" #: erpnext/assets/doctype/asset_repair/asset_repair.js:234 #: erpnext/public/js/utils/sales_common.js:443 -#: erpnext/stock/doctype/pick_list/pick_list.js:385 +#: erpnext/stock/doctype/pick_list/pick_list.js:387 msgid "Select Batch No" msgstr "حدد رقم الدفعة" @@ -45223,7 +45632,7 @@ msgstr "تحديد الأعمدة والفلاتر" msgid "Select Company" msgstr "حدد الشركة" -#: erpnext/public/js/print.js:102 +#: erpnext/public/js/print.js:113 msgid "Select Company Address" msgstr "حدد عنوان الشركة" @@ -45288,7 +45697,7 @@ msgstr "اختيار العناصر" msgid "Select Items based on Delivery Date" msgstr "حدد العناصر بناءً على تاريخ التسليم" -#: erpnext/public/js/controllers/transaction.js:2856 +#: erpnext/public/js/controllers/transaction.js:2957 msgid "Select Items for Quality Inspection" msgstr "اختيار الأصناف لفحص الجودة" @@ -45318,24 +45727,28 @@ msgstr "حدد عنوان العامل" msgid "Select Loyalty Program" msgstr "اختر برنامج الولاء" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:407 +#: erpnext/public/js/controllers/transaction.js:473 +msgid "Select Payment Schedule" +msgstr "" + +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:414 msgid "Select Possible Supplier" msgstr "اختار المورد المحتمل" #: erpnext/manufacturing/doctype/work_order/work_order.js:1016 -#: erpnext/stock/doctype/pick_list/pick_list.js:214 +#: erpnext/stock/doctype/pick_list/pick_list.js:216 msgid "Select Quantity" msgstr "إختيار الكمية" #: erpnext/assets/doctype/asset_repair/asset_repair.js:234 #: erpnext/public/js/utils/sales_common.js:443 -#: erpnext/stock/doctype/pick_list/pick_list.js:385 +#: erpnext/stock/doctype/pick_list/pick_list.js:387 msgid "Select Serial No" msgstr "حدد الرقم التسلسلي" #: erpnext/assets/doctype/asset_repair/asset_repair.js:237 #: erpnext/public/js/utils/sales_common.js:446 -#: erpnext/stock/doctype/pick_list/pick_list.js:388 +#: erpnext/stock/doctype/pick_list/pick_list.js:390 msgid "Select Serial and Batch" msgstr "حدد التسلسل والدفعة" @@ -45409,7 +45822,7 @@ msgstr "حدد موردًا من الموردين الافتراضيين للع msgid "Select a company" msgstr "اختر شركة" -#: erpnext/stock/doctype/item/item.js:1048 +#: erpnext/stock/doctype/item/item.js:1066 msgid "Select an Item Group." msgstr "حدد مجموعة عناصر." @@ -45425,11 +45838,11 @@ msgstr "حدد فاتورة لتحميل ملخص البيانات" msgid "Select an item from each set to be used in the Sales Order." msgstr "اختر عنصرًا واحدًا من كل مجموعة لاستخدامه في أمر البيع." -#: erpnext/stock/doctype/item/item.js:728 +#: erpnext/stock/doctype/item/item.js:746 msgid "Select at least one value from each of the attributes." msgstr "اختر قيمة واحدة على الأقل من كل سمة من السمات." -#: erpnext/public/js/utils/party.js:357 +#: erpnext/public/js/utils/party.js:379 msgid "Select company first" msgstr "اختر الشركة أولا" @@ -45439,7 +45852,7 @@ msgstr "اختر الشركة أولا" msgid "Select company name first." msgstr "حدد اسم الشركة الأول." -#: erpnext/controllers/accounts_controller.py:2976 +#: erpnext/controllers/accounts_controller.py:2980 msgid "Select finance book for the item {0} at row {1}" msgstr "حدد دفتر تمويل للعنصر {0} في الصف {1}" @@ -45508,11 +45921,11 @@ msgstr "اختر يوم عطلتك الأسبوعية" msgid "Select, to make the customer searchable with these fields" msgstr "حدد، لجعل العميل قابلا للبحث باستخدام هذه الحقول" -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:77 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:79 msgid "Selected POS Opening Entry should be open." msgstr "يجب أن يكون الإدخال الافتتاحي المحدد لنقاط البيع مفتوحًا." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2569 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2573 msgid "Selected Price List should have buying and selling fields checked." msgstr "قائمة الأسعار المختارة يجب أن يكون لديها حقول بيع وشراء محددة." @@ -45562,7 +45975,7 @@ msgstr "بيع الكمية" msgid "Sell quantity cannot exceed the asset quantity" msgstr "لا يمكن أن تتجاوز كمية البيع كمية الأصل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1413 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1414 msgid "Sell quantity cannot exceed the asset quantity. Asset {0} has only {1} item(s)." msgstr "لا يمكن أن تتجاوز كمية البيع كمية الأصل. يحتوي الأصل {0} على {1} عنصر فقط." @@ -45619,11 +46032,16 @@ msgstr "معدل البيع" #: erpnext/selling/doctype/selling_settings/selling_settings.json #: erpnext/selling/workspace/selling/selling.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:222 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:244 #: erpnext/workspace_sidebar/erpnext_settings.json msgid "Selling Settings" msgstr "إعدادات البيع" +#. Title of the Module Onboarding 'Selling Onboarding' +#: erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json +msgid "Selling Setup" +msgstr "" + #: erpnext/accounts/doctype/pricing_rule/pricing_rule.py:214 msgid "Selling must be checked, if Applicable For is selected as {0}" msgstr "يجب أن يتم التحقق البيع، إذا تم تحديد مطبق للك {0}" @@ -45672,7 +46090,7 @@ msgid "Send Emails to Suppliers" msgstr "إرسال رسائل البريد الإلكتروني إلى الموردين" #. Label of the send_sms (Button) field in DocType 'SMS Center' -#: erpnext/public/js/controllers/transaction.js:589 +#: erpnext/public/js/controllers/transaction.js:689 #: erpnext/selling/doctype/sms_center/sms_center.json msgid "Send SMS" msgstr "SMS أرسل رسالة" @@ -45746,7 +46164,7 @@ msgstr "" msgid "Serial / Batch Bundle" msgstr "حزمة تسلسلية / دفعة" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:487 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:488 msgid "Serial / Batch Bundle Missing" msgstr "حزمة البيانات التسلسلية/الدفعية مفقودة" @@ -45756,7 +46174,7 @@ msgstr "حزمة البيانات التسلسلية/الدفعية مفقودة msgid "Serial / Batch No" msgstr "الرقم التسلسلي / رقم الدفعة" -#: erpnext/public/js/utils.js:126 +#: erpnext/public/js/utils.js:191 msgid "Serial / Batch Nos" msgstr "أرقام التسلسل / الدفعات" @@ -45808,14 +46226,14 @@ msgstr "أرقام التسلسل / الدفعات" #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:74 #: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:114 -#: erpnext/public/js/controllers/transaction.js:2830 +#: erpnext/public/js/controllers/transaction.js:2931 #: erpnext/public/js/utils/serial_no_batch_selector.js:422 #: erpnext/selling/doctype/installation_note_item/installation_note_item.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/packed_item/packed_item.json #: erpnext/stock/doctype/pick_list_item/pick_list_item.json #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:159 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:171 #: erpnext/stock/doctype/serial_and_batch_entry/serial_and_batch_entry.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -45823,12 +46241,12 @@ msgstr "أرقام التسلسل / الدفعات" #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json #: erpnext/stock/report/incorrect_serial_no_valuation/incorrect_serial_no_valuation.py:189 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:65 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:149 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:151 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.js:37 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:450 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.js:38 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:60 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:336 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:400 #: erpnext/stock/workspace/stock/stock.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json @@ -45869,7 +46287,7 @@ msgstr "دفتر الأستاذ ذو الرقم التسلسلي" msgid "Serial No Range" msgstr "نطاق الأرقام التسلسلية" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2538 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2594 msgid "Serial No Reserved" msgstr "الرقم التسلسلي محجوز" @@ -45926,7 +46344,7 @@ msgstr "لا يمكن استخدام الرقم التسلسلي ومحدد ال msgid "Serial No and Batch Traceability" msgstr "إمكانية تتبع الرقم التسلسلي والدفعة" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1114 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1142 msgid "Serial No is mandatory" msgstr "الرقم التسلسلي إلزامي" @@ -45955,11 +46373,11 @@ msgstr "الرقم المتسلسل {0} لا ينتمي إلى البند {1}\\n msgid "Serial No {0} does not exist" msgstr "الرقم المتسلسل {0} غير موجود\\n
    \\nSerial No {0} does not exist" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3278 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3362 msgid "Serial No {0} does not exists" msgstr "الرقم التسلسلي {0} غير موجود" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:358 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:380 msgid "Serial No {0} is already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "الرقم التسلسلي {0} مُسلّم بالفعل. لا يمكنك استخدامه مرة أخرى في عملية التصنيع/إعادة التعبئة." @@ -45971,7 +46389,7 @@ msgstr "تمت إضافة الرقم التسلسلي {0} بالفعل" msgid "Serial No {0} is already assigned to customer {1}. Can only be returned against the customer {1}" msgstr "الرقم التسلسلي {0} مُخصص بالفعل للعميل {1}. لا يمكن إرجاعه إلا للعميل {1}." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:430 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:452 msgid "Serial No {0} is not present in the {1} {2}, hence you can't return it against the {1} {2}" msgstr "الرقم التسلسلي {0} غير موجود في {1} {2}، لذا لا يمكنك إرجاعه إلى {1} {2}" @@ -45995,7 +46413,7 @@ msgstr "الرقم التسلسلي: تم بالفعل معاملة {0} في ف #: erpnext/public/js/utils/serial_no_batch_selector.js:16 #: erpnext/public/js/utils/serial_no_batch_selector.js:190 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:50 -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:159 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:171 msgid "Serial Nos" msgstr "الأرقام التسلسلية" @@ -46009,15 +46427,15 @@ msgstr "الأرقام التسلسلية / أرقام الدفعات" msgid "Serial Nos and Batches" msgstr "الرقم التسلسلي ودفعات" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1824 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1866 msgid "Serial Nos are created successfully" msgstr "تم إنشاء الأرقام التسلسلية بنجاح" -#: erpnext/stock/stock_ledger.py:2273 +#: erpnext/stock/stock_ledger.py:2272 msgid "Serial Nos are reserved in Stock Reservation Entries, you need to unreserve them before proceeding." msgstr "يتم حجز الأرقام التسلسلية في إدخالات حجز المخزون، لذا عليك إلغاء حجزها قبل المتابعة." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:364 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:386 msgid "Serial Nos {0} are already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "تم تسليم الأرقام التسلسلية {0} بالفعل. لا يمكنك استخدامها مرة أخرى في إدخال التصنيع / إعادة التعبئة." @@ -46062,8 +46480,6 @@ msgstr "التسلسل والدفعة" #. Detail' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Stock Ledger #. Entry' -#. Label of the serial_and_batch_bundle_section (Section Break) field in -#. DocType 'Stock Settings' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Subcontracting #. Receipt Item' #. Label of a Workspace Sidebar Item @@ -46082,26 +46498,25 @@ msgstr "التسلسل والدفعة" #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.json #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json #: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json -#: erpnext/stock/doctype/stock_settings/stock_settings.json #: erpnext/stock/report/available_serial_no/available_serial_no.py:188 #: erpnext/stock/report/incorrect_serial_and_batch_bundle/incorrect_serial_and_batch_bundle.py:31 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:80 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:343 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:82 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:407 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:177 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/workspace_sidebar/stock.json msgid "Serial and Batch Bundle" msgstr "حزمة التسلسل والدفعة" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2046 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2102 msgid "Serial and Batch Bundle created" msgstr "تم إنشاء حزمة التسلسل والدفعة" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2118 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2174 msgid "Serial and Batch Bundle updated" msgstr "تم تحديث حزمة التسلسل والدفعة" -#: erpnext/controllers/stock_controller.py:155 +#: erpnext/controllers/stock_controller.py:196 msgid "Serial and Batch Bundle {0} is already used in {1} {2}." msgstr "تم استخدام حزمة Serial and Batch {0} بالفعل في {1} {2}." @@ -46129,6 +46544,10 @@ msgstr "إدخال البيانات التسلسلي والدفعي" msgid "Serial and Batch No" msgstr "الرقم التسلسلي ورقم الدفعة" +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:154 +msgid "Serial and Batch No for Item Disabled" +msgstr "" + #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.js:53 msgid "Serial and Batch Nos" msgstr "أرقام التسلسل والدفعة" @@ -46153,7 +46572,7 @@ msgstr "الحجز التسلسلي والحجز الدفعي" msgid "Serial and Batch Summary" msgstr "ملخص الأرقام التسلسلية والدفعات" -#: erpnext/stock/utils.py:395 +#: erpnext/stock/utils.py:398 msgid "Serial number {0} entered more than once" msgstr "الرقم التسلسلي {0} دخلت أكثر من مرة" @@ -46464,12 +46883,12 @@ msgid "Service Stop Date" msgstr "تاريخ توقف الخدمة" #: erpnext/accounts/deferred_revenue.py:44 -#: erpnext/public/js/controllers/transaction.js:1671 +#: erpnext/public/js/controllers/transaction.js:1772 msgid "Service Stop Date cannot be after Service End Date" msgstr "لا يمكن أن يكون تاريخ إيقاف الخدمة بعد تاريخ انتهاء الخدمة" #: erpnext/accounts/deferred_revenue.py:41 -#: erpnext/public/js/controllers/transaction.js:1668 +#: erpnext/public/js/controllers/transaction.js:1769 msgid "Service Stop Date cannot be before Service Start Date" msgstr "لا يمكن أن يكون تاريخ إيقاف الخدمة قبل تاريخ بدء الخدمة" @@ -46493,7 +46912,7 @@ msgstr "تعيين السلف والتخصيص (FIFO)" #. Label of the set_basic_rate_manually (Check) field in DocType 'Stock Entry #. Detail' -#: erpnext/stock/doctype/stock_entry/stock_entry.py:297 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:302 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Set Basic Rate Manually" msgstr "قم بتعيين السعر الأساسي يدويًا" @@ -46684,11 +47103,11 @@ msgstr "على النحو المفتوحة" msgid "Set by Item Tax Template" msgstr "تم تعيينه بواسطة قالب ضريبة الصنف" -#: erpnext/setup/doctype/company/company.py:545 +#: erpnext/setup/doctype/company/company.py:546 msgid "Set default inventory account for perpetual inventory" msgstr "تعيين حساب المخزون الافتراضي للمخزون الدائم" -#: erpnext/setup/doctype/company/company.py:571 +#: erpnext/setup/doctype/company/company.py:572 msgid "Set default {0} account for non stock items" msgstr "قم بتعيين الحساب الافتراضي {0} للعناصر غير المخزنة" @@ -46728,15 +47147,15 @@ msgstr "قم بتعيين الحالة يدويًا." msgid "Set this if the customer is a Public Administration company." msgstr "حدد هذا إذا كان العميل شركة إدارة عامة." -#: erpnext/assets/doctype/asset/asset.py:900 +#: erpnext/assets/doctype/asset/asset.py:901 msgid "Set {0} in asset category {1} for company {2}" msgstr "قم بتعيين {0} في فئة الأصول {1} للشركة {2}" -#: erpnext/assets/doctype/asset/asset.py:1235 +#: erpnext/assets/doctype/asset/asset.py:1236 msgid "Set {0} in asset category {1} or company {2}" msgstr "تعيين {0} في فئة الأصول {1} أو الشركة {2}" -#: erpnext/assets/doctype/asset/asset.py:1232 +#: erpnext/assets/doctype/asset/asset.py:1233 msgid "Set {0} in company {1}" msgstr "قم بتعيين {0} في الشركة {1}" @@ -46804,7 +47223,7 @@ msgid "Setting up company" msgstr "تأسيس شركة" #: erpnext/manufacturing/doctype/bom/bom.py:1191 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1464 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1475 msgid "Setting {0} is required" msgstr "الإعداد {0} مطلوب" @@ -46824,6 +47243,44 @@ msgstr "إعدادات وحدة البيع" msgid "Settled" msgstr "تسوية" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Company' +#: erpnext/setup/onboarding_step/setup_company/setup_company.json +msgid "Setup Company" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Email Account' +#: erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json +msgid "Setup Email Account" +msgstr "" + +#. Title of the Module Onboarding 'Organization Onboarding' +#: erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json +msgid "Setup Organization" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'Setup Role Permissions' +#: erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json +msgid "Setup Role Permissions" +msgstr "" + +#. Label of an action in the Onboarding Step 'Setup Sales taxes' +#: erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json +msgid "Setup Sales Taxes" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/accounts/onboarding_step/setup_sales_taxes/setup_sales_taxes.json +msgid "Setup Sales taxes" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/stock/onboarding_step/setup_warehouse/setup_warehouse.json +msgid "Setup Warehouse" +msgstr "" + #: erpnext/public/js/setup_wizard.js:25 msgid "Setup your organization" msgstr "قم بتأسيس مؤسستك" @@ -46901,7 +47358,7 @@ msgstr "المساهم" msgid "Shelf Life In Days" msgstr "العمر الافتراضي في الأيام" -#: erpnext/stock/doctype/batch/batch.py:215 +#: erpnext/stock/doctype/batch/batch.py:216 msgid "Shelf Life in Days" msgstr "مدة الصلاحية بالأيام" @@ -46978,7 +47435,7 @@ msgstr "نوع الشحنة" msgid "Shipment details" msgstr "تفاصيل الشحنة" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:801 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:802 msgid "Shipments" msgstr "شحنات" @@ -47013,7 +47470,7 @@ msgstr "الشحن العنوان الاسم" msgid "Shipping Address Template" msgstr "نموذج عنوان الشحن" -#: erpnext/controllers/accounts_controller.py:572 +#: erpnext/controllers/accounts_controller.py:573 msgid "Shipping Address does not belong to the {0}" msgstr "عنوان الشحن لا ينتمي إلى {0}" @@ -47228,7 +47685,7 @@ msgstr "إظهار المدفوعات المستقبلية" msgid "Show GL Balance" msgstr "عرض رصيد دفتر الأستاذ العام" -#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:91 +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:97 #: erpnext/accounts/report/trial_balance/trial_balance.js:117 msgid "Show Group Accounts" msgstr "عرض حسابات المجموعة" @@ -47339,7 +47796,7 @@ msgstr "عرض الضرائب كجدول عند الطباعة" msgid "Show Variant Attributes" msgstr "عرض سمات متغير" -#: erpnext/stock/doctype/item/item.js:143 +#: erpnext/stock/doctype/item/item.js:161 msgid "Show Variants" msgstr "اظهار المتغيرات" @@ -47367,6 +47824,7 @@ msgstr "عرض في الموقع" msgid "Show negative values as positive (for expenses in P&L)" msgstr "أظهر القيم السالبة كقيم موجبة (للمصروفات في بيان الأرباح والخسائر)" +#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js:91 #: erpnext/accounts/report/trial_balance/trial_balance.js:111 msgid "Show net values in opening and closing columns" msgstr "عرض القيم الصافية في عمودَي الافتتاح والإغلاق" @@ -47379,7 +47837,7 @@ msgstr "إظهار نقاط البيع فقط" msgid "Show only the Immediate Upcoming Term" msgstr "اعرض الفصل الدراسي القادم مباشرة فقط" -#: erpnext/stock/utils.py:557 +#: erpnext/stock/utils.py:560 msgid "Show pending entries" msgstr "عرض الإدخالات المعلقة" @@ -47480,7 +47938,7 @@ msgstr "متزامن" msgid "Since there are active depreciable assets under this category, the following accounts are required.

    " msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:688 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:693 msgid "Since there is a process loss of {0} units for the finished good {1}, you should reduce the quantity by {0} units for the finished good {1} in the Items Table." msgstr "بما أن هناك خسارة في العملية قدرها {0} وحدة للمنتج النهائي {1}، فيجب عليك تقليل الكمية بمقدار {0} وحدة للمنتج النهائي {1} في جدول العناصر." @@ -47503,7 +47961,7 @@ msgstr "أعزب" msgid "Single Tier Program" msgstr "برنامج الطبقة الواحدة" -#: erpnext/stock/doctype/item/item.js:168 +#: erpnext/stock/doctype/item/item.js:186 msgid "Single Variant" msgstr "متغير واحد" @@ -47530,7 +47988,7 @@ msgstr "تخطي نقل المواد إلى العمل قيد التنفيذ" msgid "Skip Material Transfer to WIP Warehouse" msgstr "تخطي نقل المواد إلى مستودع WIP" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:561 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:565 msgid "Skipped {0} DocType(s):
    {1}" msgstr "" @@ -47581,7 +48039,7 @@ msgstr "يباع بواسطة" msgid "Solvency Ratios" msgstr "نسب الملاءة المالية" -#: erpnext/controllers/accounts_controller.py:4316 +#: erpnext/controllers/accounts_controller.py:4346 msgid "Some required Company details are missing. You don't have permission to update them. Please contact your System Manager." msgstr "بعض بيانات الشركة المطلوبة مفقودة. ليس لديك صلاحية لتحديثها. يرجى الاتصال بمدير النظام." @@ -47679,7 +48137,7 @@ msgstr "نوع المصدر" #: erpnext/selling/doctype/sales_order_item/sales_order_item.json #: erpnext/stock/dashboard/item_dashboard.js:227 #: erpnext/stock/doctype/material_request_item/material_request_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:716 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:717 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "مصدر مستودع" @@ -47699,7 +48157,7 @@ msgstr "رابط عنوان مستودع المصدر" msgid "Source Warehouse is mandatory for the Item {0}." msgstr "يُعد مستودع المصدر إلزاميًا للعنصر {0}." -#: erpnext/manufacturing/doctype/work_order/work_order.py:295 +#: erpnext/manufacturing/doctype/work_order/work_order.py:300 msgid "Source Warehouse {0} must be same as Customer Warehouse {1} in the Subcontracting Inward Order." msgstr "يجب أن يكون مستودع المصدر {0} هو نفسه مستودع العميل {1} في أمر التوريد الداخلي للتعاقد من الباطن." @@ -47707,7 +48165,7 @@ msgstr "يجب أن يكون مستودع المصدر {0} هو نفسه مست msgid "Source and Target Location cannot be same" msgstr "لا يمكن أن يكون المصدر و الموقع الهدف نفسه" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:817 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:822 msgid "Source and target warehouse cannot be same for row {0}" msgstr "المصدر والمستودع المستهدف لا يمكن أن يكون نفس الصف {0}\\n
    \\nSource and target warehouse cannot be same for row {0}" @@ -47720,9 +48178,9 @@ msgstr "ويجب أن تكون مصدر ومستودع الهدف مختلفة" msgid "Source of Funds (Liabilities)" msgstr "(مصدر الأموال (الخصوم" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:783 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:800 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:807 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:788 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:805 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:812 msgid "Source warehouse is mandatory for row {0}" msgstr "مستودع المصدر إلزامي للصف {0}\\n
    \\nSource warehouse is mandatory for row {0}" @@ -47795,11 +48253,11 @@ msgstr "تقسيم القضية" msgid "Split Qty" msgstr "تقسيم الكمية" -#: erpnext/assets/doctype/asset/asset.py:1384 +#: erpnext/assets/doctype/asset/asset.py:1385 msgid "Split Quantity must be less than Asset Quantity" msgstr "يجب أن تكون كمية التقسيم أقل من كمية الأصل" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2440 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2459 msgid "Splitting {0} {1} into {2} rows as per Payment Terms" msgstr "تقسيم {0} {1} إلى {2} صفوف وفقًا لشروط الدفع" @@ -47965,11 +48423,6 @@ msgstr "بداية السنة" msgid "Start Year and End Year are mandatory" msgstr "سنة البداية وسنة الانتهاء إلزامية" -#. Label of the section_break_18 (Section Break) field in DocType 'Project' -#: erpnext/projects/doctype/project/project.json -msgid "Start and End Dates" -msgstr "تواريخ البدء والانتهاء" - #. Description of the 'From Date' (Date) field in DocType 'Purchase Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json msgid "Start date of current invoice's period" @@ -48034,7 +48487,7 @@ msgstr "يجب إلغاء الحالة أو إكمالها" msgid "Status must be one of {0}" msgstr "يجب أن تكون حالة واحدة من {0}" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:275 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:277 msgid "Status set to rejected as there are one or more rejected readings." msgstr "تم تعيين الحالة إلى مرفوض لوجود قراءة واحدة أو أكثر مرفوضة." @@ -48066,8 +48519,8 @@ msgstr "المخازن" #: erpnext/accounts/doctype/account/account.json #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py:96 #: erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py:158 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1357 -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1383 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1358 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1384 #: erpnext/accounts/report/account_balance/account_balance.js:58 msgid "Stock Adjustment" msgstr "تسوية المخزون" @@ -48118,7 +48571,7 @@ msgstr "مخزون متاح" #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/quotation_item/quotation_item.json -#: erpnext/stock/doctype/item/item.js:90 +#: erpnext/stock/doctype/item/item.js:108 #: erpnext/stock/doctype/warehouse/warehouse.js:62 #: erpnext/stock/report/stock_balance/stock_balance.json #: erpnext/stock/report/warehouse_wise_stock_balance/warehouse_wise_stock_balance.py:107 @@ -48174,7 +48627,7 @@ msgstr "سجل إغلاق المخزون" msgid "Stock Details" msgstr "تفاصيل المخزون" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:911 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:916 msgid "Stock Entries already created for Work Order {0}: {1}" msgstr "تم إنشاء إدخالات المخزون بالفعل لأمر العمل {0}: {1}" @@ -48195,7 +48648,7 @@ msgstr "تم إنشاء إدخالات المخزون بالفعل لأمر ال #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/landed_cost_item/landed_cost_item.json #: erpnext/stock/doctype/landed_cost_purchase_receipt/landed_cost_purchase_receipt.json -#: erpnext/stock/doctype/pick_list/pick_list.js:138 +#: erpnext/stock/doctype/pick_list/pick_list.js:140 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json @@ -48233,7 +48686,7 @@ msgstr "بند إدخال المخزون" msgid "Stock Entry Type" msgstr "نوع إدخال الأسهم" -#: erpnext/stock/doctype/pick_list/pick_list.py:1436 +#: erpnext/stock/doctype/pick_list/pick_list.py:1440 msgid "Stock Entry has been already created against this Pick List" msgstr "تم إنشاء إدخال الأسهم بالفعل مقابل قائمة الاختيار هذه" @@ -48245,7 +48698,7 @@ msgstr "الأسهم الدخول {0} خلق" msgid "Stock Entry {0} has created" msgstr "تم إنشاء إدخال المخزون {0}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1306 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1307 msgid "Stock Entry {0} is not submitted" msgstr "الحركة المخزنية {0} غير مسجلة" @@ -48276,11 +48729,11 @@ msgstr "أصناف المخزن" #. Label of a Workspace Sidebar Item #: erpnext/public/js/controllers/stock_controller.js:67 #: erpnext/public/js/utils/ledger_preview.js:37 -#: erpnext/stock/doctype/item/item.js:100 +#: erpnext/stock/doctype/item/item.js:118 #: erpnext/stock/doctype/item/item_dashboard.py:8 #: erpnext/stock/report/stock_ledger/stock_ledger.json #: erpnext/stock/workspace/stock/stock.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:35 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:36 #: erpnext/workspace_sidebar/stock.json msgid "Stock Ledger" msgstr "سجل المخزن" @@ -48319,7 +48772,7 @@ msgid "Stock Ledgers won’t be reposted." msgstr "لن يتم إعادة نشر سجلات المخزون." #: erpnext/stock/doctype/batch/batch.js:79 -#: erpnext/stock/doctype/item/item.js:568 +#: erpnext/stock/doctype/item/item.js:586 msgid "Stock Levels" msgstr "مستوى المخزون" @@ -48387,7 +48840,7 @@ msgstr "تخطيط المخزون" #. Name of a report #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/stock/doctype/item/item.js:110 +#: erpnext/stock/doctype/item/item.js:128 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.json #: erpnext/stock/workspace/stock/stock.json #: erpnext/workspace_sidebar/stock.json @@ -48483,11 +48936,11 @@ msgstr "إعدادات إعادة نشر المخزون" #: erpnext/selling/doctype/sales_order/sales_order.js:109 #: erpnext/selling/doctype/sales_order/sales_order.js:122 #: erpnext/selling/doctype/sales_order/sales_order.js:250 -#: erpnext/stock/doctype/pick_list/pick_list.js:150 -#: erpnext/stock/doctype/pick_list/pick_list.js:165 -#: erpnext/stock/doctype/pick_list/pick_list.js:170 +#: erpnext/stock/doctype/pick_list/pick_list.js:152 +#: erpnext/stock/doctype/pick_list/pick_list.js:167 +#: erpnext/stock/doctype/pick_list/pick_list.js:172 #: erpnext/stock/doctype/stock_entry/stock_entry_dashboard.py:12 -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:737 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:741 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:674 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1237 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1644 @@ -48497,9 +48950,9 @@ msgstr "إعدادات إعادة نشر المخزون" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1699 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1716 #: erpnext/stock/doctype/stock_settings/stock_settings.json -#: erpnext/stock/doctype/stock_settings/stock_settings.py:179 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:191 -#: erpnext/stock/doctype/stock_settings/stock_settings.py:205 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:201 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:213 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:227 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:182 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:195 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:207 @@ -48514,7 +48967,7 @@ msgstr "تم إلغاء إدخالات حجز المخزون" #: erpnext/controllers/subcontracting_inward_controller.py:1003 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:2248 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2114 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2126 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1777 msgid "Stock Reservation Entries Created" msgstr "تم إنشاء قيود حجز المخزون" @@ -48542,7 +48995,7 @@ msgstr "لا يمكن تحديث إدخال حجز المخزون لأنه تم msgid "Stock Reservation Entry created against a Pick List cannot be updated. If you need to make changes, we recommend canceling the existing entry and creating a new one." msgstr "لا يمكن تعديل إدخال حجز المخزون المُنشأ مقابل قائمة الاختيار. إذا كنت ترغب في إجراء تغييرات، فننصحك بإلغاء الإدخال الحالي وإنشاء إدخال جديد." -#: erpnext/stock/doctype/delivery_note/delivery_note.py:563 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:564 msgid "Stock Reservation Warehouse Mismatch" msgstr "عدم تطابق مستودع حجز المخزون" @@ -48590,6 +49043,11 @@ msgstr "الكمية المحجوزة من المخزون (وحدة قياس ا msgid "Stock Settings" msgstr "إعدادات المخزون" +#. Title of the Module Onboarding 'Stock Onboarding' +#: erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json +msgid "Stock Setup" +msgstr "" + #. Label of the stock_summary_tab (Tab Break) field in DocType 'Plant Floor' #. Label of the stock_summary (HTML) field in DocType 'Plant Floor' #. Label of a Link in the Stock Workspace @@ -48690,8 +49148,8 @@ msgstr "إعدادات معاملات الأسهم" #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:35 #: erpnext/stock/report/reserved_stock/reserved_stock.py:110 -#: erpnext/stock/report/stock_balance/stock_balance.py:438 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:214 +#: erpnext/stock/report/stock_balance/stock_balance.py:511 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:278 #: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_received_item/subcontracting_inward_order_received_item.json #: erpnext/subcontracting/doctype/subcontracting_inward_order_scrap_item/subcontracting_inward_order_scrap_item.json @@ -48784,8 +49242,8 @@ msgstr "التحقق من صحة المخزون" #. Label of the stock_value (Float) field in DocType 'Bin' #. Label of the value (Currency) field in DocType 'Quick Stock Balance' -#: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.py:35 -#: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py:50 +#: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.py:37 +#: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.py:52 #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/doctype/quick_stock_balance/quick_stock_balance.json #: erpnext/stock/report/incorrect_stock_value_report/incorrect_stock_value_report.py:134 @@ -48816,15 +49274,15 @@ msgstr "لا يمكن حجز المخزون في مستودع المجموعة { msgid "Stock cannot be reserved in the group warehouse {0}." msgstr "لا يمكن حجز المخزون في مستودع المجموعة {0}." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:736 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:737 msgid "Stock cannot be updated against Purchase Receipt {0}" msgstr "لا يمكن تحديث المخزون مقابل إيصال الشراء {0}\\n
    \\nStock cannot be updated against Purchase Receipt {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1228 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1229 msgid "Stock cannot be updated against the following Delivery Notes: {0}" msgstr "لا يمكن تحديث المخزون بناءً على إشعارات التسليم التالية: {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1297 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1298 msgid "Stock cannot be updated because the invoice contains a drop shipping item. Please disable 'Update Stock' or remove the drop shipping item." msgstr "لا يمكن تحديث المخزون لأن الفاتورة تحتوي على منتج يتم شحنه مباشرة من المورد. يرجى تعطيل خيار \"تحديث المخزون\" أو إزالة المنتج الذي يتم شحنه مباشرة من المورد." @@ -48856,7 +49314,7 @@ msgstr "لا يمكن تعديل معاملات الأسهم التي مضى ع msgid "Stock will be reserved on submission of Purchase Receipt created against Material Request for Sales Order." msgstr "" -#: erpnext/stock/utils.py:548 +#: erpnext/stock/utils.py:551 msgid "Stock/Accounts can not be frozen as processing of backdated entries is going on. Please try again later." msgstr "لا يمكن تجميد المخزون/الحسابات لأن معالجة القيود المؤرخة بأثر رجعي جارية. يرجى المحاولة مرة أخرى لاحقاً." @@ -48871,11 +49329,11 @@ msgstr "حجر" msgid "Stop Reason" msgstr "توقف السبب" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1074 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1089 msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "لا يمكن إلغاء طلب العمل المتوقف ، قم بإلغاء إيقافه أولاً للإلغاء" -#: erpnext/setup/doctype/company/company.py:382 +#: erpnext/setup/doctype/company/company.py:383 #: erpnext/setup/setup_wizard/operations/defaults_setup.py:33 #: erpnext/setup/setup_wizard/operations/install_fixtures.py:528 #: erpnext/stock/doctype/item/item.py:321 @@ -49004,7 +49462,7 @@ msgstr "طلب مقاولة فرعية" msgid "Subcontract Order Summary" msgstr "ملخص أمر التعاقد من الباطن" -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:83 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:84 msgid "Subcontract Return" msgstr "إرجاع عقد من الباطن" @@ -49179,7 +49637,7 @@ msgstr "التعاقد من الباطن في بيئات داخلية" #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.json -#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:140 +#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:141 #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_supplied_item/subcontracting_receipt_supplied_item.json #: erpnext/workspace_sidebar/subcontracting.json @@ -49212,7 +49670,7 @@ msgstr "بند خدمة طلب التعاقد من الباطن" msgid "Subcontracting Order Supplied Item" msgstr "بند مورد من طلب التعاقد من الباطن" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:930 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:931 msgid "Subcontracting Order {0} created." msgstr "تم إنشاء أمر التعاقد من الباطن {0} ." @@ -49291,12 +49749,17 @@ msgstr "أمر بيع تعاقد من الباطن" msgid "Subcontracting Settings" msgstr "إعدادات التعاقد من الباطن" +#. Title of the Module Onboarding 'Subcontracting Onboarding' +#: erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json +msgid "Subcontracting Setup" +msgstr "" + #. Label of the subdivision (Autocomplete) field in DocType 'Holiday List' #: erpnext/setup/doctype/holiday_list/holiday_list.json msgid "Subdivision" msgstr "تقسيم فرعي" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:926 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:927 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1054 msgid "Submit Action Failed" msgstr "فشل إرسال الإجراء" @@ -49321,7 +49784,7 @@ msgstr "إرسال إدخالات دفتر اليومية" msgid "Submit this Work Order for further processing." msgstr "أرسل طلب العمل هذا لمزيد من المعالجة." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:297 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:307 msgid "Submit your Quotation" msgstr "أرسل عرض الأسعار الخاص بك" @@ -49475,7 +49938,7 @@ msgstr "إعدادات النجاح" msgid "Successful" msgstr "ناجح" -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:578 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:580 msgid "Successfully Reconciled" msgstr "تمت التسوية بنجاح\\n
    \\nSuccessfully Reconciled" @@ -49631,7 +50094,7 @@ msgstr "الموردة الكمية" #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:188 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:266 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:273 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json #: erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json #: erpnext/buying/doctype/supplier/supplier.json @@ -49757,14 +50220,14 @@ msgstr "تفاصيل المورد" #: erpnext/accounts/doctype/tax_rule/tax_rule.json #: erpnext/accounts/report/accounts_payable/accounts_payable.js:108 #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:91 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1261 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1303 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:198 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py:178 #: erpnext/accounts/report/purchase_register/purchase_register.js:27 #: erpnext/accounts/report/purchase_register/purchase_register.py:186 #: erpnext/accounts/report/supplier_ledger_summary/supplier_ledger_summary.js:55 #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:499 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:506 #: erpnext/buying/doctype/supplier/supplier.json #: erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.py:105 #: erpnext/buying/workspace/buying/buying.json @@ -49818,7 +50281,7 @@ msgstr "المورد فاتورة التسجيل" msgid "Supplier Invoice No" msgstr "رقم فاتورة المورد" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1773 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1774 msgid "Supplier Invoice No exists in Purchase Invoice {0}" msgstr "المورد فاتورة لا يوجد في شراء الفاتورة {0}" @@ -49861,7 +50324,7 @@ msgstr "ملخص دفتر الأستاذ" #. Label of the supplier_name (Data) field in DocType 'Purchase Receipt' #. Label of the supplier_name (Data) field in DocType 'Stock Entry' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1178 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1220 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:156 #: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:191 #: erpnext/accounts/report/purchase_register/purchase_register.py:177 @@ -49978,7 +50441,7 @@ msgstr "مقارنة عروض أسعار الموردين" msgid "Supplier Quotation Item" msgstr "المورد اقتباس الإغلاق" -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:485 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:498 msgid "Supplier Quotation {0} Created" msgstr "تم إنشاء عرض أسعار المورد {0}" @@ -50200,7 +50663,7 @@ msgstr "بدأت عملية المزامنة" msgid "Synchronize all accounts every hour" msgstr "مزامنة جميع الحسابات كل ساعة" -#: erpnext/accounts/doctype/account/account.py:661 +#: erpnext/accounts/doctype/account/account.py:663 msgid "System In Use" msgstr "النظام قيد الاستخدام" @@ -50230,7 +50693,7 @@ msgstr "" msgid "System will fetch all the entries if limit value is zero." msgstr "سيقوم النظام بجلب كل الإدخالات إذا كانت قيمة الحد صفرا." -#: erpnext/controllers/accounts_controller.py:2223 +#: erpnext/controllers/accounts_controller.py:2224 msgid "System will not check over billing since amount for Item {0} in {1} is zero" msgstr "لن يتحقق النظام من الفواتير الزائدة لأن مبلغ العنصر {0} في {1} يساوي صفرًا" @@ -50247,7 +50710,7 @@ msgstr "سيُعلم النظام بزيادة أو تقليل الكمية أو msgid "TDS Computation Summary" msgstr "ملخص حساب TDS" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1534 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:1535 msgid "TDS Deducted" msgstr "تم خصم ضريبة الدخل المقتطعة" @@ -50386,7 +50849,7 @@ msgstr "الهدف الكمية" #: erpnext/stock/dashboard/item_dashboard.js:234 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json #: erpnext/stock/doctype/material_request_item/material_request_item.json -#: erpnext/stock/doctype/stock_entry/stock_entry.js:722 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:723 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "المخزن المستهدف" @@ -50402,7 +50865,7 @@ msgstr "عنوان المستودع المستهدف" msgid "Target Warehouse Address Link" msgstr "رابط عنوان مستودع تارجت" -#: erpnext/manufacturing/doctype/work_order/work_order.py:240 +#: erpnext/manufacturing/doctype/work_order/work_order.py:245 msgid "Target Warehouse Reservation Error" msgstr "خطأ في حجز مستودع تارجت" @@ -50410,21 +50873,21 @@ msgstr "خطأ في حجز مستودع تارجت" msgid "Target Warehouse for Finished Good must be same as Finished Good Warehouse {1} in Work Order {2} linked to the Subcontracting Inward Order." msgstr "يجب أن يكون المستودع المستهدف للمنتج النهائي هو نفسه مستودع المنتج النهائي {1} في أمر العمل {2} المرتبط بأمر التوريد الداخلي للمقاول من الباطن." -#: erpnext/manufacturing/doctype/work_order/work_order.py:753 +#: erpnext/manufacturing/doctype/work_order/work_order.py:777 msgid "Target Warehouse is required before Submit" msgstr "يلزم وجود مستودع Target قبل الإرسال" -#: erpnext/controllers/selling_controller.py:874 +#: erpnext/controllers/selling_controller.py:882 msgid "Target Warehouse is set for some items but the customer is not an internal customer." msgstr "تم إعداد مستودع Target لبعض المنتجات، لكن العميل ليس عميلاً داخلياً." -#: erpnext/manufacturing/doctype/work_order/work_order.py:311 +#: erpnext/manufacturing/doctype/work_order/work_order.py:316 msgid "Target Warehouse {0} must be same as Delivery Warehouse {1} in the Subcontracting Inward Order Item." msgstr "يجب أن يكون المستودع المستهدف {0} هو نفسه مستودع التسليم {1} في بند أمر التوريد الداخلي للتعاقد من الباطن." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:789 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:796 -#: erpnext/stock/doctype/stock_entry/stock_entry.py:811 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:794 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:801 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:816 msgid "Target warehouse is mandatory for row {0}" msgstr "المستودع المستهدف إلزامي للصف {0}\\n
    \\nTarget warehouse is mandatory for row {0}" @@ -50723,7 +51186,7 @@ msgstr "صف الضرائب" msgid "Tax Rule" msgstr "القاعدة الضريبية" -#: erpnext/accounts/doctype/tax_rule/tax_rule.py:134 +#: erpnext/accounts/doctype/tax_rule/tax_rule.py:137 msgid "Tax Rule Conflicts with {0}" msgstr "تضارب القاعدة الضريبية مع {0}" @@ -50738,7 +51201,7 @@ msgstr "إعدادات الضرائب" msgid "Tax Template" msgstr "" -#: erpnext/accounts/doctype/tax_rule/tax_rule.py:83 +#: erpnext/accounts/doctype/tax_rule/tax_rule.py:85 msgid "Tax Template is mandatory." msgstr "قالب الضرائب إلزامي." @@ -50895,7 +51358,7 @@ msgstr "يتم اقتطاع الضريبة فقط على المبلغ الذي #. Detail' #: erpnext/accounts/doctype/item_wise_tax_detail/item_wise_tax_detail.json #: erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py:157 -#: erpnext/controllers/taxes_and_totals.py:1206 +#: erpnext/controllers/taxes_and_totals.py:1211 msgid "Taxable Amount" msgstr "المبلغ الخاضع للضريبة" @@ -51107,7 +51570,7 @@ msgstr "تلفزيون" msgid "Template Item" msgstr "عنصر القالب" -#: erpnext/stock/get_item_details.py:338 +#: erpnext/stock/get_item_details.py:344 msgid "Template Item Selected" msgstr "تم تحديد عنصر القالب" @@ -51330,7 +51793,7 @@ msgstr "قالب الشروط والأحكام" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/accounts/doctype/territory_item/territory_item.json #: erpnext/accounts/report/accounts_receivable/accounts_receivable.js:131 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1245 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1287 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.js:97 #: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:182 #: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:68 @@ -51429,7 +51892,7 @@ msgstr "النص المعروض في البيان المالي (على سبيل msgid "The 'From Package No.' field must neither be empty nor it's value less than 1." msgstr "و "من حزمة رقم" يجب ألا يكون الحقل فارغا ولا قيمة أقل من 1." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:399 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:412 msgid "The Access to Request for Quotation From Portal is Disabled. To Allow Access, Enable it in Portal Settings." msgstr "تم تعطيل الوصول إلى طلب عرض الأسعار من البوابة. للسماح بالوصول ، قم بتمكينه في إعدادات البوابة." @@ -51438,7 +51901,7 @@ msgstr "تم تعطيل الوصول إلى طلب عرض الأسعار من ا msgid "The BOM which will be replaced" msgstr "وBOM التي سيتم استبدالها" -#: erpnext/stock/serial_batch_bundle.py:1518 +#: erpnext/stock/serial_batch_bundle.py:1526 msgid "The Batch {0} has negative batch quantity {1}. To fix this, go to the batch and click on Recalculate Batch Qty. If the issue still persists, create an inward entry." msgstr "تحتوي الدفعة {0} على كمية سالبة {1}. لحل هذه المشكلة، انتقل إلى الدفعة وانقر على \"إعادة حساب كمية الدفعة\". إذا استمرت المشكلة، فأنشئ إدخالًا داخليًا." @@ -51466,11 +51929,11 @@ msgstr "ستتم معالجة قيود دفتر الأستاذ العام وال msgid "The GL Entries will be cancelled in the background, it can take a few minutes." msgstr "سيتم إلغاء إدخالات دفتر الأستاذ العام في الخلفية، وقد يستغرق ذلك بضع دقائق." -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:178 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:179 msgid "The Loyalty Program isn't valid for the selected company" msgstr "برنامج الولاء غير صالح للشركة المختارة" -#: erpnext/accounts/doctype/payment_request/payment_request.py:981 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1106 msgid "The Payment Request {0} is already paid, cannot process payment twice" msgstr "تم دفع طلب الدفع {0} بالفعل، ولا يمكن معالجة الدفع مرتين." @@ -51478,11 +51941,11 @@ msgstr "تم دفع طلب الدفع {0} بالفعل، ولا يمكن معا msgid "The Payment Term at row {0} is possibly a duplicate." msgstr "قد يكون مصطلح الدفع في الصف {0} مكررا." -#: erpnext/stock/doctype/pick_list/pick_list.py:306 +#: erpnext/stock/doctype/pick_list/pick_list.py:308 msgid "The Pick List having Stock Reservation Entries cannot be updated. If you need to make changes, we recommend canceling the existing Stock Reservation Entries before updating the Pick List." msgstr "لا يمكن تحديث قائمة الاختيار التي تحتوي على إدخالات حجز المخزون. إذا كنت ترغب في إجراء تغييرات، فننصحك بإلغاء إدخالات حجز المخزون الحالية قبل تحديث قائمة الاختيار." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:2610 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:2615 msgid "The Process Loss Qty has reset as per job cards Process Loss Qty" msgstr "تمت إعادة ضبط كمية الفاقد في العملية وفقًا لبطاقات العمل." @@ -51490,15 +51953,15 @@ msgstr "تمت إعادة ضبط كمية الفاقد في العملية وف msgid "The Sales Person is linked with {0}" msgstr "يرتبط مندوب المبيعات بـ {0}" -#: erpnext/stock/doctype/pick_list/pick_list.py:172 +#: erpnext/stock/doctype/pick_list/pick_list.py:174 msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "الرقم التسلسلي في الصف #{0}: {1} غير متوفر في المستودع {2}." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2535 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2591 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "الرقم التسلسلي {0} محجوز مقابل {1} {2} ولا يمكن استخدامه لأي معاملة أخرى." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1743 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1748 msgid "The Serial and Batch Bundle {0} is not valid for this transaction. The 'Type of Transaction' should be 'Outward' instead of 'Inward' in Serial and Batch Bundle {0}" msgstr "حزمة البيانات التسلسلية والدفعية {0} غير صالحة لهذه المعاملة. يجب أن يكون \"نوع المعاملة\" \"خارجي\" بدلاً من \"داخلي\" في حزمة البيانات التسلسلية والدفعية {0}" @@ -51512,15 +51975,15 @@ msgstr "يُعرف إدخال المخزون من نوع "التصنيع&qu msgid "The account head under Liability or Equity, in which Profit/Loss will be booked" msgstr "رئيس الحساب تحت المسؤولية أو الأسهم، والتي سيتم حجز الربح / الخسارة" -#: erpnext/accounts/doctype/payment_request/payment_request.py:876 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1001 msgid "The allocated amount is greater than the outstanding amount of Payment Request {0}" msgstr "المبلغ المخصص أكبر من المبلغ المستحق لطلب الدفع {0}" -#: erpnext/accounts/doctype/payment_request/payment_request.py:175 +#: erpnext/accounts/doctype/payment_request/payment_request.py:198 msgid "The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document." msgstr "يختلف مبلغ {0} المحدد في طلب الدفع هذا عن المبلغ المحسوب لجميع خطط الدفع: {1}. تأكد من صحة ذلك قبل إرسال المستند." -#: erpnext/controllers/stock_controller.py:1271 +#: erpnext/controllers/stock_controller.py:1312 msgid "The batch {0} is already reserved in {1} {2}. So, cannot proceed with the {3} {4}, which is created against the {5} {6}." msgstr "تم حجز الدفعة {0} بالفعل في {1} {2}. لذا، لا يمكن المتابعة مع {3} {4}، والتي تم إنشاؤها مقابل {5} {6}." @@ -51561,7 +52024,7 @@ msgstr "لا يمكن ترك الحقل من المساهمين فارغا" msgid "The field To Shareholder cannot be blank" msgstr "لا يمكن ترك الحقل للمساهم فارغا" -#: erpnext/stock/doctype/delivery_note/delivery_note.py:413 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:414 msgid "The field {0} in row {1} is not set" msgstr "الحقل {0} في الصف {1} غير مُعيّن" @@ -51577,7 +52040,7 @@ msgstr "" msgid "The folio numbers are not matching" msgstr "أرقام الورقة غير متطابقة" -#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:305 +#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:307 msgid "The following Items, having Putaway Rules, could not be accomodated:" msgstr "لا يمكن استيعاب العناصر التالية، التي تخضع لقواعد التخزين:" @@ -51589,11 +52052,11 @@ msgstr "لم يتم تقديم فواتير الشراء التالية:" msgid "The following assets have failed to automatically post depreciation entries: {0}" msgstr "فشلت الأصول التالية في تسجيل قيود الإهلاك تلقائيًا: {0}" -#: erpnext/stock/doctype/pick_list/pick_list.py:270 +#: erpnext/stock/doctype/pick_list/pick_list.py:272 msgid "The following batches are expired, please restock them:
    {0}" msgstr "" -#: erpnext/controllers/accounts_controller.py:423 +#: erpnext/controllers/accounts_controller.py:424 msgid "The following cancelled repost entries exist for {0}:

    {1}

    Kindly delete these entries before continuing." msgstr "" @@ -51609,11 +52072,16 @@ msgstr "لا يزال الموظفون التالي ذكرهم يتبعون حا msgid "The following invalid Pricing Rules are deleted:" msgstr "تم حذف قواعد التسعير غير الصالحة التالية:" +#: erpnext/accounts/doctype/payment_request/payment_request.py:622 +msgid "The following payment schedule(s) already exist:\n" +"{0}" +msgstr "" + #: erpnext/assets/doctype/asset_repair/asset_repair.py:112 msgid "The following rows are duplicates:" msgstr "الصفوف التالية مكررة:" -#: erpnext/stock/doctype/material_request/material_request.py:895 +#: erpnext/stock/doctype/material_request/material_request.py:908 msgid "The following {0} were created: {1}" msgstr "تم إنشاء {0} التالية: {1}" @@ -51650,7 +52118,7 @@ msgstr "بطاقة العمل {0} في حالة {1} ولا يمكنك تشغيل msgid "The last scanned warehouse has been cleared and won't be set in the subsequently scanned items" msgstr "تم مسح آخر مستودع تم مسحه ضوئيًا ولن يتم تعيينه في العناصر التي سيتم مسحها ضوئيًا لاحقًا" -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:47 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:48 msgid "The lowest tier must have a minimum spent amount of 0. Customers need to be part of a tier as soon as they are enrolled in the program." msgstr "يجب أن يكون الحد الأدنى للإنفاق في أدنى مستوى هو 0. يجب أن يكون العملاء جزءًا من مستوى بمجرد تسجيلهم في البرنامج." @@ -51680,15 +52148,15 @@ msgstr "لا يمكن أن تكون العملية {0} عملية فرعية" msgid "The original invoice should be consolidated before or along with the return invoice." msgstr "ينبغي تجميع الفاتورة الأصلية قبل أو مع فاتورة الإرجاع." -#: erpnext/controllers/accounts_controller.py:202 +#: erpnext/controllers/accounts_controller.py:203 msgid "The outstanding amount {0} in {1} is lesser than {2}. Updating the outstanding to this invoice." msgstr "" -#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:229 +#: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:231 msgid "The parent account {0} does not exists in the uploaded template" msgstr "الحساب الأصل {0} غير موجود في القالب الذي تم تحميله" -#: erpnext/accounts/doctype/payment_request/payment_request.py:164 +#: erpnext/accounts/doctype/payment_request/payment_request.py:187 msgid "The payment gateway account in plan {0} is different from the payment gateway account in this payment request" msgstr "يختلف حساب بوابة الدفع في الخطة {0} عن حساب بوابة الدفع في طلب الدفع هذا" @@ -51716,11 +52184,11 @@ msgstr "النسبة المئوية المسموح لك باستلام أو تس msgid "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units." msgstr "النسبة المئوية المسموح لك بنقلها زيادةً عن الكمية المطلوبة. على سبيل المثال، إذا طلبت 100 وحدة، وكانت نسبة الزيادة المسموح بها 10%، فيُسمح لك بنقل 110 وحدات." -#: erpnext/public/js/utils.js:876 +#: erpnext/public/js/utils.js:941 msgid "The reserved stock will be released when you update items. Are you certain you wish to proceed?" msgstr "سيتم تحرير المخزون المحجوز عند تحديث العناصر. هل أنت متأكد من رغبتك في المتابعة؟" -#: erpnext/stock/doctype/pick_list/pick_list.js:159 +#: erpnext/stock/doctype/pick_list/pick_list.js:161 msgid "The reserved stock will be released. Are you certain you wish to proceed?" msgstr "سيتم تحرير المخزون المحجوز. هل أنت متأكد من رغبتك في المتابعة؟" @@ -51732,11 +52200,11 @@ msgstr "يجب أن يكون حساب الجذر {0} مجموعة" msgid "The selected BOMs are not for the same item" msgstr "قواائم المواد المحددة ليست لنفس البند" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:539 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:540 msgid "The selected change account {} doesn't belongs to Company {}." msgstr "حساب التغيير المحدد {} لا ينتمي إلى الشركة {}." -#: erpnext/stock/doctype/batch/batch.py:157 +#: erpnext/stock/doctype/batch/batch.py:158 msgid "The selected item cannot have Batch" msgstr "العنصر المحدد لا يمكن أن يكون دفعة" @@ -51748,12 +52216,12 @@ msgstr "كمية البيع أقل من إجمالي كمية الأصل. سيت msgid "The seller and the buyer cannot be the same" msgstr "البائع والمشتري لا يمكن أن يكون هو نفسه" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:176 #: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:188 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:200 msgid "The serial and batch bundle {0} not linked to {1} {2}" msgstr "الحزمة التسلسلية وحزمة الدفعات {0} غير مرتبطة بـ {1} {2}" -#: erpnext/stock/doctype/batch/batch.py:432 +#: erpnext/stock/doctype/batch/batch.py:433 msgid "The serial no {0} does not belong to item {1}" msgstr "الرقم التسلسلي {0} لا ينتمي إلى العنصر {1}" @@ -51773,7 +52241,7 @@ msgstr "الأسهم غير موجودة مع {0}" msgid "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." msgstr "كان رصيد الصنف {0} في المستودع {1} سالبًا في {2}. يجب عليك إنشاء قيد موجب {3} قبل التاريخ {4} والوقت {5} لتسجيل معدل التقييم الصحيح. لمزيد من التفاصيل، يُرجى قراءة الوثائق ." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:731 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:735 msgid "The stock has been reserved for the following Items and Warehouses, un-reserve the same to {0} the Stock Reconciliation:

    {1}" msgstr "تم حجز المخزون للأصناف والمستودعات التالية، قم بإلغاء حجزها في {0} تسوية المخزون:

    {1}" @@ -51787,19 +52255,19 @@ msgstr "بدأت عملية المزامنة في الخلفية، يرجى ال msgid "The system will create a Sales Invoice or a POS Invoice from the POS interface based on this setting. For high-volume transactions, it is recommended to use POS Invoice." msgstr "سيقوم النظام بإنشاء فاتورة مبيعات أو فاتورة نقاط بيع من واجهة نقاط البيع بناءً على هذا الإعداد. يُنصح باستخدام فاتورة نقاط البيع في حالة المعاملات ذات الحجم الكبير." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1026 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1030 msgid "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage" msgstr "وقد تم إرساء المهمة كعمل خلفية. في حالة وجود أي مشكلة في المعالجة في الخلفية ، سيقوم النظام بإضافة تعليق حول الخطأ في تسوية المخزون هذا والعودة إلى مرحلة المسودة" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1037 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1041 msgid "The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage" msgstr "تمت إضافة المهمة إلى قائمة الانتظار كعملية خلفية. في حال وجود أي مشكلة أثناء المعالجة في الخلفية، سيضيف النظام تعليقًا حول الخطأ في عملية مطابقة المخزون هذه، ثم يعود إلى حالة \"تم الإرسال\"." -#: erpnext/stock/doctype/material_request/material_request.py:338 +#: erpnext/stock/doctype/material_request/material_request.py:343 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}" msgstr "لا يمكن أن تتجاوز كمية الإصدار/التحويل الإجمالية {0} في طلب المواد {1} الكمية المطلوبة المسموح بها {2} للصنف {3}" -#: erpnext/stock/doctype/material_request/material_request.py:345 +#: erpnext/stock/doctype/material_request/material_request.py:350 msgid "The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}" msgstr "لا يمكن أن تتجاوز كمية الإصدار / التحويل الإجمالية {0} في طلب المواد {1} الكمية المطلوبة {2} للصنف {3}" @@ -51827,11 +52295,11 @@ msgstr "سيتمكن المستخدم من نقل مواد إضافية من ا msgid "The users with this Role are allowed to create/modify a stock transaction, even though the transaction is frozen." msgstr "يُسمح للمستخدمين الذين لديهم هذا الدور بإنشاء/تعديل معاملة أسهم، حتى لو كانت المعاملة مجمدة." -#: erpnext/stock/doctype/item_alternative/item_alternative.py:55 +#: erpnext/stock/doctype/item_alternative/item_alternative.py:57 msgid "The value of {0} differs between Items {1} and {2}" msgstr "تختلف قيمة {0} بين العناصر {1} و {2}" -#: erpnext/controllers/item_variant.py:148 +#: erpnext/controllers/item_variant.py:154 msgid "The value {0} is already assigned to an existing Item {1}." msgstr "تم تعيين القيمة {0} بالفعل لعنصر موجود {1}." @@ -51851,7 +52319,7 @@ msgstr "المستودع الذي ستُنقل إليه منتجاتك عند ب msgid "The {0} ({1}) must be equal to {2} ({3})" msgstr "يجب أن يكون {0} ({1}) مساويًا لـ {2} ({3})" -#: erpnext/public/js/controllers/transaction.js:3297 +#: erpnext/public/js/controllers/transaction.js:3399 msgid "The {0} contains Unit Price Items." msgstr "يحتوي {0} على عناصر سعر الوحدة." @@ -51859,7 +52327,7 @@ msgstr "يحتوي {0} على عناصر سعر الوحدة." msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error." msgstr "البادئة {0} '{1}' موجودة بالفعل. يُرجى تغيير رقم التسلسل، وإلا ستظهر لك رسالة خطأ \"إدخال مكرر\"." -#: erpnext/stock/doctype/material_request/material_request.py:901 +#: erpnext/stock/doctype/material_request/material_request.py:914 msgid "The {0} {1} created successfully" msgstr "تم إنشاء {0} {1} بنجاح" @@ -51875,7 +52343,7 @@ msgstr "يتم استخدام {0} {1} لحساب تكلفة التقييم لل msgid "Then Pricing Rules are filtered out based on Customer, Customer Group, Territory, Supplier, Supplier Type, Campaign, Sales Partner etc." msgstr "ثم يتم تصفية قواعد التسعير بناءً على العميل، ومجموعة العملاء، والمنطقة، والمورد، ونوع المورد، والحملة، وشريك المبيعات، وما إلى ذلك." -#: erpnext/assets/doctype/asset/asset.py:730 +#: erpnext/assets/doctype/asset/asset.py:731 msgid "There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset." msgstr "هناك صيانة نشطة أو إصلاحات ضد الأصل. يجب عليك إكمالها جميعًا قبل إلغاء الأصل." @@ -51899,7 +52367,7 @@ msgstr "لا توجد سنوات مالية نشطة يمكن إنشاء بيا msgid "There are no slots available on this date" msgstr "لا توجد مواعيد متاحة في هذا التاريخ" -#: erpnext/stock/doctype/item/item.js:1072 +#: erpnext/stock/doctype/item/item.js:1090 msgid "There are two options to maintain valuation of stock. FIFO (first in - first out) and Moving Average. To understand this topic in detail please visit
    Item Valuation, FIFO and Moving Average." msgstr "هناك خياران لتقييم المخزون: طريقة الوارد أولاً يُصرف أولاً (FIFO) وطريقة المتوسط المتحرك. لفهم هذا الموضوع بالتفصيل، يُرجى زيارة تقييم الأصناف، وطريقة الوارد أولاً يُصرف أولاً، وطريقة المتوسط المتحرك." @@ -51911,7 +52379,7 @@ msgstr "لا توجد أي خيارات أخرى للعنصر المحدد" msgid "There can be multiple tiered collection factor based on the total spent. But the conversion factor for redemption will always be same for all the tier." msgstr "قد يكون هناك عدة مستويات لعامل التجميع بناءً على إجمالي الإنفاق. لكن عامل التحويل للاسترداد سيكون دائمًا هو نفسه لجميع المستويات." -#: erpnext/accounts/party.py:585 +#: erpnext/accounts/party.py:578 msgid "There can only be 1 Account per Company in {0} {1}" msgstr "يمكن أن يكون هناك سوى 1 في حساب الشركة في {0} {1}" @@ -51927,11 +52395,11 @@ msgstr "توجد بالفعل شهادة خصم أقل صالحة {0} للمور msgid "There is already an active Subcontracting BOM {0} for the Finished Good {1}." msgstr "يوجد بالفعل قائمة مواد تعاقد فرعي نشطة {0} للمنتج النهائي {1}." -#: erpnext/stock/doctype/batch/batch.py:440 +#: erpnext/stock/doctype/batch/batch.py:441 msgid "There is no batch found against the {0}: {1}" msgstr "لم يتم العثور على دفعة بالمقابلة مع {0}: {1}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:1680 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:1685 msgid "There must be atleast 1 Finished Good in this Stock Entry" msgstr "يجب أن يكون هناك منتج نهائي واحد على الأقل في هذا الإدخال المخزوني." @@ -51952,7 +52420,7 @@ msgstr "حدث خطأ أثناء تحديث الحساب المصرفي {} أث msgid "There was an issue connecting to Plaid's authentication server. Check browser console for more information" msgstr "حدثت مشكلة في الاتصال بخادم مصادقة Plaid. راجع وحدة تحكم المتصفح لمزيد من المعلومات." -#: erpnext/accounts/utils.py:1137 +#: erpnext/accounts/utils.py:1139 msgid "There were issues unlinking payment entry {0}." msgstr "كانت هناك مشاكل في فصل إدخال الدفع {0}." @@ -51962,11 +52430,11 @@ msgstr "كانت هناك مشاكل في فصل إدخال الدفع {0}." msgid "This Account has '0' balance in either Base Currency or Account Currency" msgstr "يحتوي هذا الحساب على رصيد \"0\" سواء بالعملة الأساسية أو بعملة الحساب" -#: erpnext/stock/doctype/item/item.js:136 +#: erpnext/stock/doctype/item/item.js:154 msgid "This Item is a Template and cannot be used in transactions.
    All fields present in the 'Copy Fields to Variant' table in Item Variant Settings will be copied to its variant items." msgstr "هذا العنصر عبارة عن قالب ولا يمكن استخدامه في المعاملات.
    سيتم نسخ جميع الحقول الموجودة في جدول \"نسخ الحقول إلى المتغير\" في إعدادات متغير العنصر إلى متغيراته." -#: erpnext/stock/doctype/item/item.js:195 +#: erpnext/stock/doctype/item/item.js:213 msgid "This Item is a Variant of {0} (Template)." msgstr "هذا العنصر هو متغير {0} (قالب)." @@ -51974,11 +52442,11 @@ msgstr "هذا العنصر هو متغير {0} (قالب)." msgid "This Month's Summary" msgstr "ملخص هذا الشهر" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:939 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:940 msgid "This Purchase Order has been fully subcontracted." msgstr "تم التعاقد من الباطن بالكامل على أمر الشراء هذا." -#: erpnext/selling/doctype/sales_order/sales_order.py:2064 +#: erpnext/selling/doctype/sales_order/sales_order.py:2068 msgid "This Sales Order has been fully subcontracted." msgstr "تم التعاقد من الباطن بالكامل على أمر البيع هذا." @@ -51994,7 +52462,7 @@ msgstr "سيوقف هذا الإجراء الفوترة المستقبلية. ه msgid "This action will unlink this account from any external service integrating ERPNext with your bank accounts. It cannot be undone. Are you certain ?" msgstr "سيؤدي هذا الإجراء إلى إلغاء ربط هذا الحساب بأي خدمة خارجية تدمج ERPNext مع حساباتك المصرفية. لا يمكن التراجع. هل أنت متأكد؟" -#: erpnext/assets/doctype/asset/asset.py:432 +#: erpnext/assets/doctype/asset/asset.py:433 msgid "This asset category is marked as non-depreciable. Please disable depreciation calculation or choose a different category." msgstr "تم تصنيف هذه الفئة من الأصول على أنها غير قابلة للاستهلاك. يرجى تعطيل حساب الاستهلاك أو اختيار فئة أخرى." @@ -52016,7 +52484,7 @@ msgstr "يُستخدم هذا الحقل لتعيين \"العميل\"." msgid "This filter will be applied to Journal Entry." msgstr "سيتم تطبيق هذا الفلتر على إدخال دفتر اليومية." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:865 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:866 msgid "This invoice has already been paid." msgstr "تم دفع هذه الفاتورة بالفعل." @@ -52045,7 +52513,7 @@ msgstr "هذا هو المكان الذي تتوفر فيه المواد الخ msgid "This is a location where scraped materials are stored." msgstr "هذا هو الموقع حيث يتم تخزين المواد كشط." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:315 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:322 msgid "This is a preview of the email to be sent. A PDF of the document will automatically be attached with the email." msgstr "هذه معاينة للبريد الإلكتروني الذي سيتم إرساله. سيتم إرفاق نسخة PDF من المستند تلقائيًا مع البريد الإلكتروني." @@ -52093,7 +52561,7 @@ msgstr "هذا يعتمد على المعاملات ضد هذا الشخص ال msgid "This is considered dangerous from accounting point of view." msgstr "يُعتبر هذا الأمر خطيراً من وجهة نظر المحاسبة." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:540 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:541 msgid "This is done to handle accounting for cases when Purchase Receipt is created after Purchase Invoice" msgstr "يتم إجراء ذلك للتعامل مع محاسبة الحالات التي يتم فيها إنشاء إيصال الشراء بعد فاتورة الشراء" @@ -52101,7 +52569,7 @@ msgstr "يتم إجراء ذلك للتعامل مع محاسبة الحالات msgid "This is enabled by default. If you want to plan materials for sub-assemblies of the Item you're manufacturing leave this enabled. If you plan and manufacture the sub-assemblies separately, you can disable this checkbox." msgstr "هذا الخيار مُفعّل افتراضيًا. إذا كنت ترغب في تخطيط المواد اللازمة لتجميعات فرعية للمنتج الذي تقوم بتصنيعه، فاترك هذا الخيار مُفعّلًا. أما إذا كنت تخطط وتُصنّع التجميعات الفرعية بشكل منفصل، فيمكنك تعطيل هذا الخيار." -#: erpnext/stock/doctype/item/item.js:1060 +#: erpnext/stock/doctype/item/item.js:1078 msgid "This is for raw material Items that'll be used to create finished goods. If the Item is an additional service like 'washing' that'll be used in the BOM, keep this unchecked." msgstr "هذا الخيار مخصص للمواد الخام التي ستُستخدم في تصنيع المنتجات النهائية. إذا كانت المادة خدمة إضافية مثل \"الغسيل\" التي ستُستخدم في قائمة المواد، فاترك هذا الخيار غير مُحدد." @@ -52135,7 +52603,7 @@ msgstr "تم إنشاء هذا الجدول عندما تم استهلاك ال msgid "This schedule was created when Asset {0} was repaired through Asset Repair {1}." msgstr "تم إنشاء هذا الجدول عندما تم إصلاح الأصل {0} من خلال إصلاح الأصل {1}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1501 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1505 msgid "This schedule was created when Asset {0} was restored due to Sales Invoice {1} cancellation." msgstr "تم إنشاء هذا الجدول عندما تم استعادة الأصل {0} بسبب إلغاء فاتورة المبيعات {1} ." @@ -52147,7 +52615,7 @@ msgstr "تم إنشاء هذا الجدول عندما تمت استعادة ا msgid "This schedule was created when Asset {0} was restored." msgstr "تم إنشاء هذا الجدول عند استعادة الأصل {0} ." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1497 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1501 msgid "This schedule was created when Asset {0} was returned through Sales Invoice {1}." msgstr "تم إنشاء هذا الجدول عندما تم إرجاع الأصل {0} من خلال فاتورة المبيعات {1}." @@ -52155,11 +52623,11 @@ msgstr "تم إنشاء هذا الجدول عندما تم إرجاع الأص msgid "This schedule was created when Asset {0} was scrapped." msgstr "تم إنشاء هذا الجدول عندما تم إلغاء الأصل {0} ." -#: erpnext/assets/doctype/asset/asset.py:1519 +#: erpnext/assets/doctype/asset/asset.py:1520 msgid "This schedule was created when Asset {0} was {1} into new Asset {2}." msgstr "تم إنشاء هذا الجدول عندما تم تحويل الأصل {0} إلى الأصل الجديد {2}{1} ." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1473 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1477 msgid "This schedule was created when Asset {0} was {1} through Sales Invoice {2}." msgstr "تم إنشاء هذا الجدول عندما كان الأصل {0} هو {1} من خلال فاتورة المبيعات {2}." @@ -52203,7 +52671,7 @@ msgstr "سيتم إلحاق هذا إلى بند رمز للمتغير. على msgid "This will restrict user access to other employee records" msgstr "سيؤدي هذا إلى تقييد وصول المستخدم لسجلات الموظفين الأخرى" -#: erpnext/controllers/selling_controller.py:875 +#: erpnext/controllers/selling_controller.py:883 msgid "This {} will be treated as material transfer." msgstr "سيتم التعامل مع هذا {} على أنه نقل مواد." @@ -52326,6 +52794,13 @@ msgstr "الفترة الزمنية غير متاحة" msgid "Time(in mins)" msgstr "الوقت (دقيقة)" +#. Label of the section_break_18 (Section Break) field in DocType 'Project' +#. Label of the sb_timeline (Section Break) field in DocType 'Task' +#: erpnext/projects/doctype/project/project.json +#: erpnext/projects/doctype/task/task.json +msgid "Timeline" +msgstr "" + #: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:36 #: erpnext/public/js/projects/timer.js:5 msgid "Timer" @@ -52369,7 +52844,7 @@ msgstr "تفاصيل الجدول الزمني" msgid "Timesheet for tasks." msgstr "الجدول الزمني للمهام." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:893 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:894 msgid "Timesheet {0} cannot be invoiced in its current state" msgstr "لا يمكن إصدار فاتورة لجدول الدوام {0} في حالته الحالية" @@ -52416,7 +52891,7 @@ msgstr "على فاتورة" msgid "To Currency" msgstr "إلى العملات" -#: erpnext/controllers/accounts_controller.py:622 +#: erpnext/controllers/accounts_controller.py:623 #: erpnext/setup/doctype/holiday_list/holiday_list.py:121 msgid "To Date cannot be before From Date" msgstr "(الى تاريخ) لا يمكن ان يكون قبل (من تاريخ)" @@ -52663,15 +53138,15 @@ msgstr "لتطبيق شرط على الحقل الأصل، استخدم parent.f msgid "To be Delivered to Customer" msgstr "سيتم تسليمها إلى العميل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:557 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:558 msgid "To cancel a {} you need to cancel the POS Closing Entry {}." msgstr "لإلغاء {}، عليك إلغاء إدخال إغلاق نقطة البيع {}." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:570 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:571 msgid "To cancel this Sales Invoice you need to cancel the POS Closing Entry {}." msgstr "لإلغاء فاتورة المبيعات هذه، عليك إلغاء إدخال إغلاق نقطة البيع {}." -#: erpnext/accounts/doctype/payment_request/payment_request.py:118 +#: erpnext/accounts/doctype/payment_request/payment_request.py:139 msgid "To create a Payment Request reference document is required" msgstr "لإنشاء مستند مرجع طلب الدفع مطلوب" @@ -52679,6 +53154,10 @@ msgstr "لإنشاء مستند مرجع طلب الدفع مطلوب" msgid "To enable Capital Work in Progress Accounting," msgstr "لتمكين المحاسبة عن أعمال رأس المال قيد التنفيذ،" +#: erpnext/stock/doctype/item/item.js:94 +msgid "To enable the Serial No and Batch No feature, please check the 'Enable Serial / Batch No for Item' checkbox in Stock Settings." +msgstr "" + #: erpnext/manufacturing/doctype/production_plan/production_plan.js:733 msgid "To include non-stock items in the material request planning. i.e. Items for which 'Maintain Stock' checkbox is unticked." msgstr "لإدراج الأصناف غير المخزنة في تخطيط طلب المواد. أي الأصناف التي لم يتم تحديد خانة \"الحفاظ على المخزون\" لها." @@ -52689,8 +53168,8 @@ msgstr "لإدراج الأصناف غير المخزنة في تخطيط طلب msgid "To include sub-assembly costs and scrap items in Finished Goods on a work order without using a job card, when the 'Use Multi-Level BOM' option is enabled." msgstr "لإدراج تكاليف التجميع الفرعي وعناصر الخردة في السلع النهائية في أمر العمل دون استخدام بطاقة عمل، عند تمكين خيار \"استخدام قائمة المواد متعددة المستويات\"." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2230 -#: erpnext/controllers/accounts_controller.py:3234 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2249 +#: erpnext/controllers/accounts_controller.py:3240 msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "ل تشمل الضريبة في الصف {0} في معدل الإغلاق ، {1} ويجب أيضا تضمين الضرائب في الصفوف" @@ -52702,19 +53181,19 @@ msgstr "لدمج ، يجب أن يكون نفس الخصائص التالية ل msgid "To not apply Pricing Rule in a particular transaction, all applicable Pricing Rules should be disabled." msgstr "ولعدم تطبيق قاعدة التسعير في معاملة معينة، يجب تعطيل جميع قواعد التسعير المعمول بها." -#: erpnext/accounts/doctype/account/account.py:552 +#: erpnext/accounts/doctype/account/account.py:554 msgid "To overrule this, enable '{0}' in company {1}" msgstr "لإلغاء هذا ، قم بتمكين "{0}" في الشركة {1}" -#: erpnext/controllers/item_variant.py:151 +#: erpnext/controllers/item_variant.py:157 msgid "To still proceed with editing this Attribute Value, enable {0} in Item Variant Settings." msgstr "للاستمرار في تعديل قيمة السمة هذه ، قم بتمكين {0} في إعدادات متغير العنصر." -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:630 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:631 msgid "To submit the invoice without purchase order please set {0} as {1} in {2}" msgstr "لإرسال الفاتورة بدون أمر شراء، يرجى تعيين {0} كـ {1} في {2}" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:651 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:652 msgid "To submit the invoice without purchase receipt please set {0} as {1} in {2}" msgstr "لإرسال الفاتورة بدون إيصال الشراء، يرجى تعيين {0} كـ {1} في {2}" @@ -52764,26 +53243,6 @@ msgstr "طن-قوة (متري)" msgid "Too many columns. Export the report and print it using a spreadsheet application." msgstr "عدد الأعمدة كبير جدًا. قم بتصدير التقرير وطباعته باستخدام برنامج جداول البيانات." -#. Label of a Card Break in the Manufacturing Workspace -#. Label of the tools (Column Break) field in DocType 'Email Digest' -#. Label of a Card Break in the Stock Workspace -#. Label of a Workspace Sidebar Item -#: erpnext/buying/doctype/purchase_order/purchase_order.js:578 -#: erpnext/buying/doctype/purchase_order/purchase_order.js:654 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:61 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:148 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:452 -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:461 -#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:84 -#: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:123 -#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json -#: erpnext/setup/doctype/email_digest/email_digest.json -#: erpnext/stock/workspace/stock/stock.json -#: erpnext/workspace_sidebar/manufacturing.json -#: erpnext/workspace_sidebar/stock.json -msgid "Tools" -msgstr "" - #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Torr" @@ -52839,7 +53298,7 @@ msgstr "الإجمالي المحقق" msgid "Total Active Items" msgstr "إجمالي العناصر النشطة" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 msgid "Total Actual" msgstr "الإجمالي الفعلي" @@ -52910,7 +53369,7 @@ msgstr "إجمالي المبلغ المستحق" msgid "Total Amount in Words" msgstr "إجمالي المبلغ بالنص" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:218 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:260 msgid "Total Applicable Charges in Purchase Receipt Items table must be same as Total Taxes and Charges" msgstr "مجموع الرسوم المطبقة في شراء طاولة إيصال عناصر يجب أن يكون نفس مجموع الضرائب والرسوم" @@ -52972,7 +53431,7 @@ msgstr "المبلغ الكلي الفواتير" msgid "Total Billing Hours" msgstr "إجمالي ساعات العمل المدفوعة" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 msgid "Total Budget" msgstr "الميزانية الإجمالية" @@ -53047,7 +53506,7 @@ msgstr "إجمالي مبلغ التكلفة (عبر الجداول الزمني msgid "Total Credit" msgstr "إجمالي الائتمان" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:336 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:337 msgid "Total Credit/ Debit Amount should be same as linked Journal Entry" msgstr "يجب أن يكون إجمالي مبلغ الائتمان / المدين هو نفسه المرتبطة بإدخال المجلة" @@ -53056,7 +53515,7 @@ msgstr "يجب أن يكون إجمالي مبلغ الائتمان / المدي msgid "Total Debit" msgstr "مجموع الخصم" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:927 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:928 msgid "Total Debit must be equal to Total Credit. The difference is {0}" msgstr "يجب أن يكون إجمالي الخصم يساوي إجمالي الائتمان ." @@ -53265,11 +53724,11 @@ msgstr "إجمالي المبلغ المستحق" msgid "Total Paid Amount" msgstr "إجمالي المبلغ المدفوع" -#: erpnext/controllers/accounts_controller.py:2782 +#: erpnext/controllers/accounts_controller.py:2786 msgid "Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total" msgstr "يجب أن يكون إجمالي مبلغ الدفع في جدول الدفع مساويا للمجموع الكبير / المستدير" -#: erpnext/accounts/doctype/payment_request/payment_request.py:143 +#: erpnext/accounts/doctype/payment_request/payment_request.py:166 msgid "Total Payment Request amount cannot be greater than {0} amount" msgstr "لا يمكن أن يكون إجمالي مبلغ طلب الدفع أكبر من {0} المبلغ" @@ -53277,7 +53736,7 @@ msgstr "لا يمكن أن يكون إجمالي مبلغ طلب الدفع أك msgid "Total Payments" msgstr "مجموع المدفوعات" -#: erpnext/selling/doctype/sales_order/sales_order.py:724 +#: erpnext/selling/doctype/sales_order/sales_order.py:726 msgid "Total Picked Quantity {0} is more than ordered qty {1}. You can set the Over Picking Allowance in Stock Settings." msgstr "إجمالي الكمية المختارة {0} أكبر من الكمية المطلوبة {1}. يمكنك ضبط سماحية الاختيار الزائد في إعدادات المخزون." @@ -53490,7 +53949,7 @@ msgstr "الوقت الإجمالي (بالدقائق)" msgid "Total Time in Mins" msgstr "إجمالي الوقت بالدقائق" -#: erpnext/public/js/utils.js:102 +#: erpnext/public/js/utils.js:167 msgid "Total Unpaid: {0}" msgstr "عدد غير مدفوع: {0}" @@ -53507,7 +53966,7 @@ msgstr "القيمة الإجمالية" msgid "Total Value Difference (Incoming - Outgoing)" msgstr "فرق القيمة الإجمالية (الوارد - الصادر)" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:352 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:359 #: erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py:144 msgid "Total Variance" msgstr "مجموع الفروق" @@ -53585,8 +54044,8 @@ msgstr "يجب أن تساوي نسبة التوزيع الإجمالية 100% ( msgid "Total hours: {0}" msgstr "" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:569 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:541 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:570 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:542 msgid "Total payments amount can't be greater than {}" msgstr "لا يمكن أن يكون إجمالي المدفوعات أكبر من {}" @@ -53598,14 +54057,14 @@ msgstr "يجب أن تكون النسبة المئوية الإجمالية لم msgid "Total quantity in delivery schedule cannot be greater than the item quantity" msgstr "لا يمكن أن تتجاوز الكمية الإجمالية في جدول التسليم كمية الصنف" -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:746 -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:747 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:760 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:761 #: erpnext/accounts/report/financial_statements.py:352 #: erpnext/accounts/report/financial_statements.py:353 msgid "Total {0} ({1})" msgstr "إجمالي {0} ({1})" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:199 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:241 msgid "Total {0} for all items is zero, may be you should change 'Distribute Charges Based On'" msgstr "إجمالي {0} لجميع العناصر هو صفر، قد يكون عليك تغيير 'توزيع الرسوم على أساس'\\n
    \\nTotal {0} for all items is zero, may be you should change 'Distribute Charges Based On'" @@ -53627,6 +54086,8 @@ msgstr "إجمالي (الكمية)" #. 'Quotation' #. Label of the base_totals_section (Section Break) field in DocType 'Sales #. Order' +#. Label of the base_totals_section (Section Break) field in DocType 'Delivery +#. Note' #. Label of the base_totals_section (Section Break) field in DocType 'Purchase #. Receipt' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -53634,6 +54095,7 @@ msgstr "إجمالي (الكمية)" #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/selling/doctype/sales_order/sales_order.json +#: erpnext/stock/doctype/delivery_note/delivery_note.json #: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json msgid "Totals (Company Currency)" msgstr "" @@ -53687,7 +54149,7 @@ msgstr "رابط التتبع" #. Label of the transaction_tab (Tab Break) field in DocType 'Selling Settings' #. Label of the transaction (Select) field in DocType 'Authorization Rule' #. Option for the 'Based On' (Select) field in DocType 'Repost Item Valuation' -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:467 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:471 #: erpnext/accounts/doctype/pricing_rule/pricing_rule.json #: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json #: erpnext/manufacturing/doctype/workstation/workstation_dashboard.py:10 @@ -53723,7 +54185,7 @@ msgstr "عملية العملات" msgid "Transaction Date" msgstr "تاريخ المعاملة" -#: erpnext/setup/doctype/company/company.py:1102 +#: erpnext/setup/doctype/company/company.py:1106 msgid "Transaction Deletion Document {0} has been triggered for company {1}" msgstr "" @@ -53747,11 +54209,11 @@ msgstr "عنصر سجل حذف المعاملة" msgid "Transaction Deletion Record To Delete" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1098 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1102 msgid "Transaction Deletion Record {0} is already running. {1}" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1117 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1121 msgid "Transaction Deletion Record {0} is currently deleting {1}. Cannot save documents until deletion completes." msgstr "" @@ -53813,7 +54275,7 @@ msgstr "عتبة المعاملة" msgid "Transaction Type" msgstr "نوع المعاملة" -#: erpnext/accounts/doctype/payment_request/payment_request.py:153 +#: erpnext/accounts/doctype/payment_request/payment_request.py:176 msgid "Transaction currency must be same as Payment Gateway currency" msgstr "يجب أن تكون العملة المعاملة نفس العملة بوابة الدفع" @@ -53841,13 +54303,13 @@ msgstr "المعاملة التي يتم اقتطاع الضريبة منها" msgid "Transaction not allowed against stopped Work Order {0}" msgstr "المعاملة غير مسموح بها في مقابل أمر العمل المتوقف {0}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1235 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1252 msgid "Transaction reference no {0} dated {1}" msgstr "إشارة عملية لا {0} بتاريخ {1}" #. Group in Bank Account's connections #: erpnext/accounts/doctype/bank_account/bank_account.json -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:467 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:471 #: erpnext/accounts/doctype/purchase_taxes_and_charges_template/purchase_taxes_and_charges_template_dashboard.py:12 #: erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template_dashboard.py:13 #: erpnext/manufacturing/doctype/job_card/job_card_dashboard.py:9 @@ -53866,7 +54328,7 @@ msgstr "المعاملات السنوية التاريخ" msgid "Transactions against the Company already exist! Chart of Accounts can only be imported for a Company with no transactions." msgstr "توجد بالفعل معاملات مسجلة على الشركة! لا يمكن استيراد دليل الحسابات إلا لشركة ليس لديها أي معاملات." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1161 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1162 msgid "Transactions using Sales Invoice in POS are disabled." msgstr "تم تعطيل المعاملات التي تستخدم فاتورة المبيعات في نظام نقاط البيع." @@ -53965,7 +54427,7 @@ msgstr "المواد الخام المنقولة" msgid "Transit" msgstr "عبور" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:501 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:502 msgid "Transit Entry" msgstr "مدخل النقل" @@ -54250,7 +54712,7 @@ msgstr "إعدادات ضريبة القيمة المضافة في الإمار #: erpnext/manufacturing/doctype/workstation/workstation.js:480 #: erpnext/manufacturing/report/bom_explorer/bom_explorer.py:70 #: erpnext/manufacturing/report/bom_operations_time/bom_operations_time.py:110 -#: erpnext/public/js/stock_analytics.js:94 erpnext/public/js/utils.js:749 +#: erpnext/public/js/stock_analytics.js:94 erpnext/public/js/utils.js:814 #: erpnext/quality_management/doctype/quality_goal_objective/quality_goal_objective.json #: erpnext/quality_management/doctype/quality_review_objective/quality_review_objective.json #: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json @@ -54278,7 +54740,7 @@ msgstr "إعدادات ضريبة القيمة المضافة في الإمار #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:93 #: erpnext/stock/report/stock_ageing/stock_ageing.py:178 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:44 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:59 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:134 #: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:60 #: erpnext/subcontracting/doctype/subcontracting_inward_order_service_item/subcontracting_inward_order_service_item.json @@ -54346,7 +54808,7 @@ msgstr "معامل تحويل وحدة القياس مطلوب في الصف: {0 msgid "UOM Name" msgstr "اسم وحدة القايس" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:3775 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:3780 msgid "UOM conversion factor required for UOM: {0} in Item: {1}" msgstr "معامل تحويل وحدة القياس المطلوب لوحدة القياس: {0} في العنصر: {1}" @@ -54406,11 +54868,11 @@ msgstr "عدم المصالحة" msgid "UnReconcile Allocations" msgstr "تخصيصات غير متوافقة" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:464 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:468 msgid "Unable to fetch DocType details. Please contact system administrator." msgstr "" -#: erpnext/setup/utils.py:182 +#: erpnext/setup/utils.py:187 msgid "Unable to find exchange rate for {0} to {1} for key date {2}. Please create a Currency Exchange record manually" msgstr "تعذر العثور على سعر الصرف من {0} إلى {1} لتاريخ المفتاح {2}. يرجى إنشاء سجل صرف العملات يدويا" @@ -54423,7 +54885,7 @@ msgstr "تعذر العثور على سعر الصرف من {0} إلى {1} لت msgid "Unable to find score starting at {0}. You need to have standing scores covering 0 to 100" msgstr "تعذر العثور على النتيجة بدءا من {0}. يجب أن يكون لديك درجات دائمة تغطي 0 إلى 100" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1032 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1047 msgid "Unable to find the time slot in the next {0} days for the operation {1}. Please increase the 'Capacity Planning For (Days)' in the {2}." msgstr "لم يتم العثور على الفترة الزمنية المناسبة للعملية {1}خلال الأيام {0} القادمة. يرجى زيادة \"تخطيط السعة لـ (أيام)\" في {2}." @@ -54440,7 +54902,7 @@ msgstr "تعذر العثور على المتغير:" msgid "Unallocated Amount" msgstr "المبلغ غير المخصصة" -#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:323 +#: erpnext/stock/doctype/putaway_rule/putaway_rule.py:325 msgid "Unassigned Qty" msgstr "كمية غير محددة" @@ -54454,8 +54916,8 @@ msgstr "الافراج عن الفاتورة" #: erpnext/accounts/report/balance_sheet/balance_sheet.py:83 #: erpnext/accounts/report/balance_sheet/balance_sheet.py:84 -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:87 -#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:88 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:90 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:91 msgid "Unclosed Fiscal Years Profit / Loss (Credit)" msgstr "غير مغلقة سنتين الماليتين الربح / الخسارة (الائتمان)" @@ -54495,7 +54957,7 @@ msgstr "تحت سبب محجوب" msgid "Under Working Hours table, you can add start and end times for a Workstation. For example, a Workstation may be active from 9 am to 1 pm, then 2 pm to 5 pm. You can also specify the working hours based on shifts. While scheduling a Work Order, the system will check for the availability of the Workstation based on the working hours specified." msgstr "ضمن جدول ساعات العمل، يمكنك إضافة أوقات بدء وانتهاء العمل لمحطة العمل. على سبيل المثال، قد تكون محطة العمل نشطة من الساعة 9 صباحًا إلى 1 ظهرًا، ثم من 2 ظهرًا إلى 5 مساءً. كما يمكنك تحديد ساعات العمل بناءً على الورديات. عند جدولة أمر عمل، سيتحقق النظام من توافر محطة العمل بناءً على ساعات العمل المحددة." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:933 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:937 msgid "Unexpected Naming Series Pattern" msgstr "" @@ -54509,7 +54971,7 @@ msgstr "لم تتحقق" msgid "Unit" msgstr "وحدة" -#: erpnext/controllers/accounts_controller.py:4048 +#: erpnext/controllers/accounts_controller.py:4078 msgid "Unit Price" msgstr "سعر الوحدة" @@ -54568,7 +55030,7 @@ msgstr "غير مرتبط" #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:279 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:280 #: erpnext/accounts/doctype/subscription/subscription.json #: erpnext/accounts/doctype/subscription/subscription_list.js:12 msgid "Unpaid" @@ -54662,7 +55124,7 @@ msgstr "إدخالات غير مُطابقة" #: erpnext/manufacturing/doctype/work_order/work_order.js:900 #: erpnext/selling/doctype/sales_order/sales_order.js:107 -#: erpnext/stock/doctype/pick_list/pick_list.js:156 +#: erpnext/stock/doctype/pick_list/pick_list.js:158 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:193 msgid "Unreserve" msgstr "بدون تحفظ" @@ -54683,7 +55145,7 @@ msgstr "إلغاء الحجز للتجميع الفرعي" #: erpnext/public/js/stock_reservation.js:281 #: erpnext/selling/doctype/sales_order/sales_order.js:514 -#: erpnext/stock/doctype/pick_list/pick_list.js:308 +#: erpnext/stock/doctype/pick_list/pick_list.js:310 #: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:390 msgid "Unreserving Stock..." msgstr "إلغاء الحجز على الأسهم..." @@ -54705,7 +55167,7 @@ msgstr "غير المجدولة" msgid "Unsecured Loans" msgstr "القروض غير المضمونة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1726 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1730 msgid "Unset Matched Payment Request" msgstr "طلب دفع غير مطابق" @@ -54856,7 +55318,7 @@ msgstr "تحديث اسم / رقم مركز التكلفة" msgid "Update Costing and Billing" msgstr "تحديث التكاليف والفواتير" -#: erpnext/stock/doctype/pick_list/pick_list.js:126 +#: erpnext/stock/doctype/pick_list/pick_list.js:128 msgid "Update Current Stock" msgstr "تحديث المخزون الحالي" @@ -54868,7 +55330,7 @@ msgstr "تحديث قائمة الأسعار الحالية" #: erpnext/buying/doctype/purchase_order/purchase_order.js:324 #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:43 -#: erpnext/public/js/utils.js:855 +#: erpnext/public/js/utils.js:920 #: erpnext/selling/doctype/quotation/quotation.js:135 #: erpnext/selling/doctype/sales_order/sales_order.js:75 #: erpnext/selling/doctype/sales_order/sales_order.js:940 @@ -54881,7 +55343,7 @@ msgstr "تحديث العناصر" #. Invoice' #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/controllers/accounts_controller.py:195 +#: erpnext/controllers/accounts_controller.py:196 msgid "Update Outstanding for Self" msgstr "تحديث رائع للذات" @@ -54932,7 +55394,7 @@ msgstr "تحديث وتيرة المشروع" msgid "Update latest price in all BOMs" msgstr "تحديث آخر الأسعار في جميع بومس" -#: erpnext/assets/doctype/asset/asset.py:474 +#: erpnext/assets/doctype/asset/asset.py:475 msgid "Update stock must be enabled for the purchase invoice {0}" msgstr "يجب تفعيل خيار تحديث المخزون لفاتورة الشراء {0}" @@ -54974,7 +55436,7 @@ msgstr "جارٍ تحديث المتغيرات ..." msgid "Updating Work Order status" msgstr "تحديث حالة أمر العمل" -#: erpnext/public/js/print.js:140 +#: erpnext/public/js/print.js:151 msgid "Updating details." msgstr "جارٍ تحديث التفاصيل." @@ -55187,7 +55649,7 @@ msgstr "تستخدم لخطة الإنتاج" msgid "Used with Financial Report Template" msgstr "يُستخدم مع نموذج التقرير المالي" -#: erpnext/setup/install.py:194 +#: erpnext/setup/install.py:195 msgid "User Forum" msgstr "منتدى المستخدمين" @@ -55513,8 +55975,8 @@ msgstr "طريقة التقييم" #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:85 #: erpnext/stock/report/item_prices/item_prices.py:57 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:67 -#: erpnext/stock/report/stock_balance/stock_balance.py:489 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:297 +#: erpnext/stock/report/stock_balance/stock_balance.py:562 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:361 msgid "Valuation Rate" msgstr "سعر التقييم" @@ -55522,11 +55984,11 @@ msgstr "سعر التقييم" msgid "Valuation Rate (In / Out)" msgstr "معدل التقييم (داخل / خارج)" -#: erpnext/stock/stock_ledger.py:2015 +#: erpnext/stock/stock_ledger.py:2016 msgid "Valuation Rate Missing" msgstr "معدل التقييم مفقود" -#: erpnext/stock/stock_ledger.py:1993 +#: erpnext/stock/stock_ledger.py:1994 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "معدل التقييم للعنصر {0} ، مطلوب لإجراء إدخالات محاسبية لـ {1} {2}." @@ -55534,7 +55996,7 @@ msgstr "معدل التقييم للعنصر {0} ، مطلوب لإجراء إد msgid "Valuation Rate is mandatory if Opening Stock entered" msgstr "معدل التقييم إلزامي إذا ادخلت قيمة مبدئية للمخزون\\n
    \\nValuation Rate is mandatory if Opening Stock entered" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:783 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:787 msgid "Valuation Rate required for Item {0} at row {1}" msgstr "معدل التقييم مطلوب للبند {0} في الصف {1}" @@ -55544,7 +56006,7 @@ msgstr "معدل التقييم مطلوب للبند {0} في الصف {1}" msgid "Valuation and Total" msgstr "التقييم والمجموع" -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1003 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1007 msgid "Valuation rate for customer provided items has been set to zero." msgstr "تم تحديد معدل تقييم العناصر التي يقدمها العملاء عند الصفر." @@ -55557,8 +56019,8 @@ msgstr "تم تحديد معدل تقييم العناصر التي يقدمها msgid "Valuation rate for the item as per Sales Invoice (Only for Internal Transfers)" msgstr "معدل تقييم السلعة وفقًا لفاتورة المبيعات (للتحويلات الداخلية فقط)" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2254 -#: erpnext/controllers/accounts_controller.py:3258 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2273 +#: erpnext/controllers/accounts_controller.py:3264 msgid "Valuation type charges can not be marked as Inclusive" msgstr "لا يمكن تحديد رسوم نوع التقييم على أنها شاملة" @@ -55619,7 +56081,7 @@ msgstr "نوع القيمة" msgid "Value as on" msgstr "القيمة كما في" -#: erpnext/controllers/item_variant.py:124 +#: erpnext/controllers/item_variant.py:130 msgid "Value for Attribute {0} must be within the range of {1} to {2} in the increments of {3} for Item {4}" msgstr "يجب أن تكون قيمة للسمة {0} ضمن مجموعة من {1} إلى {2} في الزيادات من {3} لالبند {4}" @@ -55671,10 +56133,10 @@ msgstr "اسم المتغير" msgid "Variables" msgstr "المتغيرات" -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:240 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:244 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:326 -#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:336 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:247 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:251 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:333 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:343 msgid "Variance" msgstr "فرق" @@ -55682,7 +56144,7 @@ msgstr "فرق" msgid "Variance ({})" msgstr "التباين ({})" -#: erpnext/stock/doctype/item/item.js:183 +#: erpnext/stock/doctype/item/item.js:201 #: erpnext/stock/doctype/item/item_list.js:22 #: erpnext/stock/report/item_variant_details/item_variant_details.py:74 msgid "Variant" @@ -55711,7 +56173,7 @@ msgstr "البديل القائم على" msgid "Variant Based On cannot be changed" msgstr "لا يمكن تغيير المتغير بناءً على" -#: erpnext/stock/doctype/item/item.js:159 +#: erpnext/stock/doctype/item/item.js:177 msgid "Variant Details Report" msgstr "تفاصيل تقرير التقرير" @@ -55736,7 +56198,7 @@ msgstr "العناصر المتغيرة" msgid "Variant Of" msgstr "البديل من" -#: erpnext/stock/doctype/item/item.js:752 +#: erpnext/stock/doctype/item/item.js:770 msgid "Variant creation has been queued." msgstr "وقد وضعت قائمة الانتظار في قائمة الانتظار." @@ -55851,6 +56313,14 @@ msgstr "عرض تغطية الحساب" msgid "View BOM Update Log" msgstr "عرض سجل تحديثات قائمة المواد" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'View Balance Sheet' +#. Description of a report in the Onboarding Step 'View Balance Sheet' +#: erpnext/accounts/onboarding_step/view_balance_sheet/view_balance_sheet.json +#: erpnext/assets/onboarding_step/view_balance_sheet/view_balance_sheet.json +msgid "View Balance Sheet" +msgstr "" + #: erpnext/public/js/setup_wizard.js:47 msgid "View Chart of Accounts" msgstr "عرض الرسم البياني للحسابات" @@ -55884,10 +56354,42 @@ msgstr "عرض سعر التجزئة المقترح" msgid "View Now" msgstr "عرض الآن" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'View Project Summary' +#. Description of a report in the Onboarding Step 'View Project Summary' +#: erpnext/projects/onboarding_step/view_project_summary/view_project_summary.json +msgid "View Project Summary" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'View Purchase Order Analysis' +#. Description of a report in the Onboarding Step 'View Purchase Order +#. Analysis' +#: erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json +msgid "View Purchase Order Analysis" +msgstr "" + +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'View Sales Order Analysis' +#. Description of a report in the Onboarding Step 'View Sales Order Analysis' +#: erpnext/selling/onboarding_step/view_sales_order_analysis/view_sales_order_analysis.json +msgid "View Sales Order Analysis" +msgstr "" + +#. Label of an action in the Onboarding Step 'View Stock Balance Report' +#: erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json #: erpnext/stock/report/stock_ledger/stock_ledger.js:139 msgid "View Stock Balance" msgstr "عرض رصيد الأسهم" +#. Title of an Onboarding Step +#. Label of an action in the Onboarding Step 'View Stock Balance Report' +#. Description of a report in the Onboarding Step 'View Stock Balance Report' +#: erpnext/selling/onboarding_step/view_stock_balance_report/view_stock_balance_report.json +#: erpnext/stock/onboarding_step/view_stock_balance_report/view_stock_balance_report.json +msgid "View Stock Balance Report" +msgstr "" + #: erpnext/stock/report/stock_balance/stock_balance.js:156 msgid "View Stock Ledger" msgstr "عرض سجل المخزون" @@ -55896,6 +56398,16 @@ msgstr "عرض سجل المخزون" msgid "View Type" msgstr "نوع العرض" +#. Label of an action in the Onboarding Step 'View Work Order Summary Report' +#: erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json +msgid "View Work Order Summary" +msgstr "" + +#. Title of an Onboarding Step +#: erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json +msgid "View Work Order Summary Report" +msgstr "" + #. Label of the view_attachments (Check) field in DocType 'Project User' #: erpnext/projects/doctype/project_user/project_user.json msgid "View attachments" @@ -55910,7 +56422,7 @@ msgstr "عرض سجل المكالمات" msgid "Vimeo" msgstr "فيميو" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:214 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:216 msgid "Virtual DocType" msgstr "" @@ -55952,7 +56464,7 @@ msgstr "" #: erpnext/stock/report/available_serial_no/available_serial_no.js:56 #: erpnext/stock/report/available_serial_no/available_serial_no.py:196 #: erpnext/stock/report/stock_ledger/stock_ledger.js:97 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:322 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:386 msgid "Voucher #" msgstr "سند #" @@ -56010,9 +56522,9 @@ msgstr "رقم مرجع تفاصيل القسيمة" #: erpnext/accounts/doctype/repost_accounting_ledger_items/repost_accounting_ledger_items.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1200 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:209 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1242 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:56 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:221 #: erpnext/accounts/report/general_ledger/general_ledger.js:49 #: erpnext/accounts/report/general_ledger/general_ledger.py:744 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.js:41 @@ -56034,7 +56546,7 @@ msgstr "رقم مرجع تفاصيل القسيمة" #: erpnext/stock/report/reserved_stock/reserved_stock.js:77 #: erpnext/stock/report/reserved_stock/reserved_stock.py:151 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:51 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:112 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:114 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:33 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py:154 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:165 @@ -56042,7 +56554,7 @@ msgstr "رقم مرجع تفاصيل القسيمة" msgid "Voucher No" msgstr "رقم السند" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1340 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1382 msgid "Voucher No is mandatory" msgstr "رقم القسيمة إلزامي" @@ -56083,8 +56595,8 @@ msgstr "نوع القسيمة الفرعي" #: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.json #: erpnext/accounts/doctype/repost_payment_ledger_items/repost_payment_ledger_items.json #: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1198 -#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:200 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1240 +#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:212 #: erpnext/accounts/report/general_ledger/general_ledger.py:736 #: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:31 #: erpnext/accounts/report/payment_ledger/payment_ledger.py:165 @@ -56106,11 +56618,11 @@ msgstr "نوع القسيمة الفرعي" #: erpnext/stock/report/reserved_stock/reserved_stock.js:65 #: erpnext/stock/report/reserved_stock/reserved_stock.py:145 #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.js:40 -#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:107 +#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:109 #: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:486 #: erpnext/stock/report/serial_no_ledger/serial_no_ledger.py:27 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.py:152 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:320 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:384 #: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:159 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:68 msgid "Voucher Type" @@ -56270,7 +56782,7 @@ msgstr "موازنة المخزون في المستودع" msgid "Warehouse and Reference" msgstr "مستودع والمراجع" -#: erpnext/stock/doctype/warehouse/warehouse.py:100 +#: erpnext/stock/doctype/warehouse/warehouse.py:101 msgid "Warehouse can not be deleted as stock ledger entry exists for this warehouse." msgstr "لا يمكن حذف مستودع كما دخول دفتر الأستاذ موجود لهذا المستودع.\\n
    \\nWarehouse can not be deleted as stock ledger entry exists for this warehouse." @@ -56282,12 +56794,12 @@ msgstr "المستودع لا يمكن ان يكون متغير لرقم تسل msgid "Warehouse is mandatory" msgstr "المستودع إلزامي" -#: erpnext/stock/doctype/warehouse/warehouse.py:259 +#: erpnext/stock/doctype/warehouse/warehouse.py:266 msgid "Warehouse not found against the account {0}" msgstr "لم يتم العثور على المستودع مقابل الحساب {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1218 -#: erpnext/stock/doctype/delivery_note/delivery_note.py:440 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1219 +#: erpnext/stock/doctype/delivery_note/delivery_note.py:441 msgid "Warehouse required for stock Item {0}" msgstr "مستودع الأسهم المطلوبة لل تفاصيل {0}" @@ -56296,7 +56808,7 @@ msgstr "مستودع الأسهم المطلوبة لل تفاصيل {0}" msgid "Warehouse wise Item Balance Age and Value" msgstr "مستودع الحكيم البند الرصيد العمر والقيمة" -#: erpnext/stock/doctype/warehouse/warehouse.py:94 +#: erpnext/stock/doctype/warehouse/warehouse.py:95 msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}" msgstr "مستودع {0} لا يمكن حذف كما توجد كمية القطعة ل {1}" @@ -56304,23 +56816,23 @@ msgstr "مستودع {0} لا يمكن حذف كما توجد كمية القط msgid "Warehouse {0} does not belong to Company {1}." msgstr "المستودع {0} لا ينتمي إلى الشركة {1}." -#: erpnext/stock/utils.py:409 +#: erpnext/stock/utils.py:412 msgid "Warehouse {0} does not belong to company {1}" msgstr "مستودع {0} لا تنتمي إلى شركة {1}" -#: erpnext/stock/doctype/warehouse/warehouse.py:306 +#: erpnext/stock/doctype/warehouse/warehouse.py:315 msgid "Warehouse {0} does not exist" msgstr "المستودع {0} غير موجود" -#: erpnext/manufacturing/doctype/work_order/work_order.py:237 +#: erpnext/manufacturing/doctype/work_order/work_order.py:242 msgid "Warehouse {0} is not allowed for Sales Order {1}, it should be {2}" msgstr "لا يُسمح باستخدام المستودع {0} في أمر البيع {1}، بل يجب أن يكون {2}" -#: erpnext/controllers/stock_controller.py:774 +#: erpnext/controllers/stock_controller.py:815 msgid "Warehouse {0} is not linked to any account, please mention the account in the warehouse record or set default inventory account in company {1}." msgstr "المستودع {0} غير مرتبط بأي حساب، يرجى ذكر الحساب في سجل المستودع أو تعيين حساب المخزون الافتراضي في الشركة {1}." -#: erpnext/stock/doctype/warehouse/warehouse.py:144 +#: erpnext/stock/doctype/warehouse/warehouse.py:145 msgid "Warehouse's Stock Value has already been booked in the following accounts:" msgstr "تم بالفعل تسجيل قيمة مخزون المستودع في الحسابات التالية:" @@ -56337,15 +56849,15 @@ msgstr "المستودع: {0} لا ينتمي إلى {1}" msgid "Warehouses" msgstr "المستودعات" -#: erpnext/stock/doctype/warehouse/warehouse.py:173 +#: erpnext/stock/doctype/warehouse/warehouse.py:174 msgid "Warehouses with child nodes cannot be converted to ledger" msgstr "المستودعات مع العقد التابعة لا يمكن أن يتم تحويلها إلى دفتر الاستاذ" -#: erpnext/stock/doctype/warehouse/warehouse.py:183 +#: erpnext/stock/doctype/warehouse/warehouse.py:184 msgid "Warehouses with existing transaction can not be converted to group." msgstr "لا يمكن تحويل المستودعات مع المعاملات الحالية إلى مجموعة.\\n
    \\nWarehouses with existing transaction can not be converted to group." -#: erpnext/stock/doctype/warehouse/warehouse.py:175 +#: erpnext/stock/doctype/warehouse/warehouse.py:176 msgid "Warehouses with existing transaction can not be converted to ledger." msgstr "المستودعات مع الصفقة الحالية لا يمكن أن يتم تحويلها إلى دفتر الأستاذ." @@ -56429,7 +56941,7 @@ msgstr "تحذير بشأن الأسهم السلبية" msgid "Warning!" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1312 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1313 msgid "Warning: Another {0} # {1} exists against stock entry {2}" msgstr "تحذير: {0} أخر # {1} موجود في مدخل المخزن {2}\\n
    \\nWarning: Another {0} # {1} exists against stock entry {2}" @@ -56437,11 +56949,11 @@ msgstr "تحذير: {0} أخر # {1} موجود في مدخل المخزن {2}\\ msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "تحذير : كمية المواد المطلوبة هي أقل من الحد الأدنى للطلب الكمية" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1449 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1460 msgid "Warning: Quantity exceeds maximum producible quantity based on quantity of raw materials received through the Subcontracting Inward Order {0}." msgstr "تحذير: الكمية تتجاوز الحد الأقصى للكمية القابلة للإنتاج بناءً على كمية المواد الخام المستلمة من خلال أمر التوريد الداخلي للتعاقد من الباطن {0}." -#: erpnext/selling/doctype/sales_order/sales_order.py:346 +#: erpnext/selling/doctype/sales_order/sales_order.py:348 msgid "Warning: Sales Order {0} already exists against Customer's Purchase Order {1}" msgstr "تحذير: أمر البيع {0} موجود مسبقاً لأمر الشراء الخاص بالعميل {1}\\n
    \\nWarning: Sales Order {0} already exists against Customer's Purchase Order {1}" @@ -56502,6 +57014,10 @@ msgstr "فترة الضمان (أيام)" msgid "Warranty Period (in days)" msgstr "فترة الضمان (بالأيام)" +#: erpnext/utilities/doctype/video/video.js:7 +msgid "Watch Video" +msgstr "" + #. Name of a UOM #: erpnext/setup/setup_wizard/data/uom_data.json msgid "Watt" @@ -56527,7 +57043,7 @@ msgstr "الطول الموجي بالكيلومترات" msgid "Wavelength In Megametres" msgstr "الطول الموجي بالميغامتر" -#: erpnext/controllers/accounts_controller.py:190 +#: erpnext/controllers/accounts_controller.py:191 msgid "We can see {0} is made against {1}. If you want {1}'s outstanding to be updated, uncheck the '{2}' checkbox." msgstr "" @@ -56571,7 +57087,7 @@ msgid "Website:" msgstr "الموقع:" #: erpnext/selling/report/sales_analytics/sales_analytics.py:433 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:111 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:121 msgid "Week {0} {1}" msgstr "الأسبوع {0} {1}" @@ -56707,11 +57223,11 @@ msgstr "عند التحديد، سيتم تطبيق حد المعاملة فقط msgid "When checked, the system will use the posting datetime of the document for naming the document instead of the creation datetime of the document." msgstr "" -#: erpnext/stock/doctype/item/item.js:1079 +#: erpnext/stock/doctype/item/item.js:1097 msgid "When creating an Item, entering a value for this field will automatically create an Item Price at the backend." msgstr "عند إنشاء عنصر، سيؤدي إدخال قيمة لهذا الحقل إلى إنشاء سعر العنصر تلقائيًا في الواجهة الخلفية." -#: erpnext/stock/doctype/stock_entry/stock_entry.py:294 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:299 msgid "When there are multiple finished goods ({0}) in a Repack stock entry, the basic rate for all finished goods must be set manually. To set rate manually, enable the checkbox 'Set Basic Rate Manually' in the respective finished good row." msgstr "" @@ -56829,7 +57345,7 @@ msgstr "العمل المنجز" #: erpnext/assets/doctype/asset/asset_list.js:12 #: erpnext/manufacturing/doctype/job_card/job_card.json #: erpnext/manufacturing/doctype/job_card_operation/job_card_operation.json -#: erpnext/setup/doctype/company/company.py:383 +#: erpnext/setup/doctype/company/company.py:384 #: erpnext/support/doctype/warranty_claim/warranty_claim.json msgid "Work In Progress" msgstr "التقدم في العمل" @@ -56866,7 +57382,7 @@ msgstr "التقدم في العمل" #: erpnext/selling/doctype/sales_order/sales_order.js:1050 #: erpnext/stock/doctype/material_request/material_request.js:216 #: erpnext/stock/doctype/material_request/material_request.json -#: erpnext/stock/doctype/material_request/material_request.py:902 +#: erpnext/stock/doctype/material_request/material_request.py:915 #: erpnext/stock/doctype/pick_list/pick_list.json #: erpnext/stock/doctype/serial_no/serial_no.json #: erpnext/stock/doctype/stock_entry/stock_entry.json @@ -56931,16 +57447,22 @@ msgstr "تقرير مخزون أمر العمل" msgid "Work Order Summary" msgstr "ملخص أمر العمل" -#: erpnext/stock/doctype/material_request/material_request.py:908 +#. Description of a report in the Onboarding Step 'View Work Order Summary +#. Report' +#: erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json +msgid "Work Order Summary Report" +msgstr "" + +#: erpnext/stock/doctype/material_request/material_request.py:921 msgid "Work Order cannot be created for following reason:
    {0}" msgstr "لا يمكن إنشاء أمر العمل للسبب التالي:
    {0}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1393 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1404 msgid "Work Order cannot be raised against a Item Template" msgstr "لا يمكن رفع أمر العمل مقابل قالب العنصر" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2448 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2528 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2460 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2540 msgid "Work Order has been {0}" msgstr "تم عمل الطلب {0}" @@ -56952,12 +57474,12 @@ msgstr "أمر العمل لم يتم إنشاؤه" msgid "Work Order {0} created" msgstr "تم إنشاء أمر العمل {0}" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:861 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:866 msgid "Work Order {0}: Job Card not found for the operation {1}" msgstr "أمر العمل {0}: لم يتم العثور على بطاقة المهمة للعملية {1}" #: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56 -#: erpnext/stock/doctype/material_request/material_request.py:896 +#: erpnext/stock/doctype/material_request/material_request.py:909 msgid "Work Orders" msgstr "طلبات العمل" @@ -56982,7 +57504,7 @@ msgstr "التقدم في العمل" msgid "Work-in-Progress Warehouse" msgstr "مستودع العمل قيد التنفيذ" -#: erpnext/manufacturing/doctype/work_order/work_order.py:751 +#: erpnext/manufacturing/doctype/work_order/work_order.py:775 msgid "Work-in-Progress Warehouse is required before Submit" msgstr "مستودع أعمال جارية مطلوب قبل التسجيل\\n
    \\nWork-in-Progress Warehouse is required before Submit" @@ -57128,7 +57650,7 @@ msgstr "محطات العمل" #: erpnext/accounts/doctype/pos_profile/pos_profile.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json -#: erpnext/setup/doctype/company/company.py:665 +#: erpnext/setup/doctype/company/company.py:666 msgid "Write Off" msgstr "لا تصلح" @@ -57273,7 +57795,7 @@ msgstr "تاريخ بدء العام" msgid "Year of Passing" msgstr "سنة التخرج" -#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:85 +#: erpnext/accounts/doctype/fiscal_year/fiscal_year.py:91 msgid "Year start date or end date is overlapping with {0}. To avoid please set company" msgstr "تاريخ البدء أو تاريخ الانتهاء العام يتداخل مع {0}. لتجنب ذلك الرجاء تعيين الشركة\\n
    \\nYear start date or end date is overlapping with {0}. To avoid please set company" @@ -57281,7 +57803,7 @@ msgstr "تاريخ البدء أو تاريخ الانتهاء العام يتد msgid "You are importing data for the code list:" msgstr "أنت بصدد استيراد بيانات لقائمة الرموز:" -#: erpnext/controllers/accounts_controller.py:3858 +#: erpnext/controllers/accounts_controller.py:3875 msgid "You are not allowed to update as per the conditions set in {} Workflow." msgstr "غير مسموح لك بالتحديث وفقًا للشروط المحددة في {} سير العمل." @@ -57297,7 +57819,7 @@ msgstr "أنت غير مخول بإجراء/تعديل معاملات المخز msgid "You are not authorized to set Frozen value" msgstr ".أنت غير مخول لتغيير القيم المجمدة" -#: erpnext/stock/doctype/pick_list/pick_list.py:477 +#: erpnext/stock/doctype/pick_list/pick_list.py:479 msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}." msgstr "أنت تختار كمية أكبر من الكمية المطلوبة للصنف {0}. تحقق مما إذا كانت هناك أي قائمة اختيار أخرى تم إنشاؤها لطلب البيع {1}." @@ -57313,7 +57835,7 @@ msgstr "يمكنك أيضا نسخ - لصق هذا الرابط في متصفح msgid "You can also set default CWIP account in Company {}" msgstr "يمكنك أيضًا تعيين حساب CWIP الافتراضي في الشركة {}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1016 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1017 msgid "You can change the parent account to a Balance Sheet account or select a different account." msgstr "يمكنك تغيير الحساب الرئيسي إلى حساب الميزانية العمومية أو تحديد حساب مختلف." @@ -57321,7 +57843,7 @@ msgstr "يمكنك تغيير الحساب الرئيسي إلى حساب الم msgid "You can either configure default depreciation accounts in the Company or set the required accounts in the following rows:

    " msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:703 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:704 msgid "You can not enter current voucher in 'Against Journal Entry' column" msgstr "لا يمكنك إدخال القسيمة الحالية في عمود 'قيد اليومية المقابل'.\\n
    \\nYou can not enter current voucher in 'Against Journal Entry' column" @@ -57346,7 +57868,7 @@ msgstr "يمكنك استرداد ما يصل إلى {0}." msgid "You can set it as a machine name or operation type. For example, stiching machine 12" msgstr "يمكنك تعيينه كاسم للآلة أو نوع العملية. على سبيل المثال، آلة خياطة 12" -#: erpnext/controllers/accounts_controller.py:211 +#: erpnext/controllers/accounts_controller.py:212 msgid "You can use {0} to reconcile against {1} later." msgstr "" @@ -57354,11 +57876,11 @@ msgstr "" msgid "You can't make any changes to Job Card since Work Order is closed." msgstr "لا يمكنك إجراء أي تغييرات على بطاقة العمل لأن أمر العمل مغلق." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:219 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:231 msgid "You can't process the serial number {0} as it has already been used in the SABB {1}. {2} if you want to inward same serial number multiple times then enabled 'Allow existing Serial No to be Manufactured/Received again' in the {3}" msgstr "لا يمكنك معالجة الرقم التسلسلي {0} لأنه مستخدم بالفعل في جهاز SABB {1}. {2} إذا كنت ترغب في إدخال نفس الرقم التسلسلي عدة مرات، فقم بتمكين خيار \"السماح بتصنيع/استلام الرقم التسلسلي الحالي مرة أخرى\" في {3}" -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:192 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:193 msgid "You can't redeem Loyalty Points having more value than the Total Amount." msgstr "لا يمكنك استبدال نقاط الولاء التي تزيد قيمتها عن المبلغ الإجمالي." @@ -57378,7 +57900,7 @@ msgstr "لا يمكنك إنشاء أو إلغاء أي قيود محاسبية msgid "You cannot create/amend any accounting entries till this date." msgstr "لا يمكنك إنشاء/تعديل أي قيود محاسبية حتى هذا التاريخ." -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:936 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:937 msgid "You cannot credit and debit same account at the same time" msgstr "لا يمكن إعطاء الحساب قيمة مدين وقيمة دائن في نفس الوقت" @@ -57394,7 +57916,7 @@ msgstr "لا يمكنك تحرير عقدة الجذر." msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "لا يمكنك تفعيل كل من الإعدادين '{0}' و '{1}'." -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:157 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:169 msgid "You cannot outward following {0} as either they are Delivered, Inactive or located in a different warehouse." msgstr "لا يمكنك المتابعة الخارجية {0} لأنها إما تم تسليمها أو غير نشطة أو موجودة في مستودع مختلف." @@ -57422,11 +57944,11 @@ msgstr "لا يمكنك تقديم الطلب بدون دفع." msgid "You cannot {0} this document because another Period Closing Entry {1} exists after {2}" msgstr "" -#: erpnext/controllers/accounts_controller.py:3834 +#: erpnext/controllers/accounts_controller.py:3851 msgid "You do not have permissions to {} items in a {}." msgstr "ليس لديك أذونات لـ {} من العناصر في {}." -#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:186 +#: erpnext/accounts/doctype/loyalty_program/loyalty_program.py:187 msgid "You don't have enough Loyalty Points to redeem" msgstr "ليس لديك ما يكفي من نقاط الولاء لاستردادها" @@ -57438,7 +57960,7 @@ msgstr "ليس لديك ما يكفي من النقاط لاستردادها." msgid "You had {} errors while creating opening invoices. Check {} for more details" msgstr "كان لديك {} من الأخطاء أثناء إنشاء الفواتير الافتتاحية. تحقق من {} لمزيد من التفاصيل" -#: erpnext/public/js/utils.js:955 +#: erpnext/public/js/utils.js:1020 msgid "You have already selected items from {0} {1}" msgstr "لقد حددت العناصر من {0} {1}" @@ -57446,7 +57968,7 @@ msgstr "لقد حددت العناصر من {0} {1}" msgid "You have been invited to collaborate on the project {0}." msgstr "لقد تمت دعوتك للمشاركة في المشروع {0}." -#: erpnext/stock/doctype/stock_settings/stock_settings.py:217 +#: erpnext/stock/doctype/stock_settings/stock_settings.py:239 msgid "You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted in the transaction price list." msgstr "لقد قمت بتفعيل {0} و {1} في {2}. قد يؤدي هذا إلى إدراج أسعار من قائمة الأسعار الافتراضية في قائمة أسعار المعاملة." @@ -57470,11 +57992,11 @@ msgstr "لديك تغييرات غير محفوظة. هل تريد حفظ الف msgid "You must select a customer before adding an item." msgstr "يجب عليك تحديد عميل قبل إضافة عنصر." -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:278 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:279 msgid "You need to cancel POS Closing Entry {} to be able to cancel this document." msgstr "يجب عليك إلغاء إدخال إغلاق نقطة البيع {} لتتمكن من إلغاء هذا المستند." -#: erpnext/controllers/accounts_controller.py:3209 +#: erpnext/controllers/accounts_controller.py:3215 msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account." msgstr "لقد اخترت مجموعة الحسابات {1} كحساب {2} في الصف {0}. يرجى اختيار حساب واحد." @@ -57525,7 +58047,7 @@ msgstr "رصيد صفري" msgid "Zero Rated" msgstr "معدل صفري" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:561 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:566 msgid "Zero quantity" msgstr "الكمية صفر" @@ -57542,7 +58064,7 @@ msgstr "[هام] [ERPNext] إعادة ترتيب الأخطاء تلقائيًا msgid "`Allow Negative rates for Items`" msgstr "السماح بأسعار سلبية للعناصر" -#: erpnext/stock/stock_ledger.py:2007 +#: erpnext/stock/stock_ledger.py:2008 msgid "after" msgstr "بعد" @@ -57562,7 +58084,7 @@ msgstr "كعنوان" msgid "as a percentage of finished item quantity" msgstr "كنسبة مئوية من كمية المنتج النهائي" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1472 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1514 msgid "as of {0}" msgstr "" @@ -57582,8 +58104,8 @@ msgstr "بواسطة {}" msgid "cannot be greater than 100" msgstr "لا يمكن أن يكون أكبر من 100" -#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:334 -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1104 +#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:335 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1105 msgid "dated {0}" msgstr "مؤرخة {0}" @@ -57707,11 +58229,11 @@ msgstr "أو ذريتها" msgid "out of 5" msgstr "من أصل 5" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1228 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1245 msgid "paid to" msgstr "مدفوع لـ" -#: erpnext/public/js/utils.js:372 +#: erpnext/public/js/utils.js:437 msgid "payments app is not installed. Please install it from {0} or {1}" msgstr "تطبيق الدفع غير مثبت. يرجى تثبيته من {0} أو {1}" @@ -57732,7 +58254,7 @@ msgstr "تطبيق الدفع غير مثبت. يرجى تثبيته من {} أ msgid "per hour" msgstr "كل ساعة" -#: erpnext/stock/stock_ledger.py:2008 +#: erpnext/stock/stock_ledger.py:2009 msgid "performing either one below:" msgstr "أداء أحد الخيارين التاليين:" @@ -57757,11 +58279,11 @@ msgstr "عنصر_اقتباس" msgid "ratings" msgstr "التقييمات" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1228 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1245 msgid "received from" msgstr "مستلم من" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1479 msgid "returned" msgstr "تم إرجاعه" @@ -57796,7 +58318,7 @@ msgstr "RGT" msgid "sandbox" msgstr "رمل" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1475 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1479 msgid "sold" msgstr "تم البيع" @@ -57823,7 +58345,7 @@ msgstr "عنوان" msgid "to" msgstr "إلى" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3166 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3172 msgid "to unallocate the amount of this Return Invoice before cancelling it." msgstr "لإلغاء تخصيص مبلغ فاتورة الإرجاع هذه قبل إلغائها." @@ -57850,23 +58372,23 @@ msgstr "عبر أداة تحديث قائمة المواد" msgid "you must select Capital Work in Progress Account in accounts table" msgstr "يجب عليك تحديد حساب رأس المال قيد التقدم في جدول الحسابات" -#: erpnext/controllers/accounts_controller.py:1282 +#: erpnext/controllers/accounts_controller.py:1283 msgid "{0} '{1}' is disabled" msgstr "{0} '{1}' معطل" -#: erpnext/accounts/utils.py:197 +#: erpnext/accounts/utils.py:198 msgid "{0} '{1}' not in Fiscal Year {2}" msgstr "{0} '{1}' ليس في السنة المالية {2}" -#: erpnext/manufacturing/doctype/work_order/work_order.py:643 +#: erpnext/manufacturing/doctype/work_order/work_order.py:661 msgid "{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}" msgstr "{0} ({1}) لا يمكن أن يكون أكبر من الكمية المخطط لها ({2}) في أمر العمل {3}" -#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:341 +#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py:383 msgid "{0} {1} has submitted Assets. Remove Item {2} from table to continue." msgstr "قام كل من {0} و و{1}و بإرسال الأصول. للمتابعة، قم بإزالة العنصر و{2}و من الجدول." -#: erpnext/controllers/accounts_controller.py:2367 +#: erpnext/controllers/accounts_controller.py:2368 msgid "{0} Account not found against Customer {1}." msgstr "{0} لم يتم العثور على حساب مقابل العميل {1}." @@ -57890,7 +58412,7 @@ msgstr "{0} القسيمة المستخدمة هي {1}. الكمية المسم msgid "{0} Digest" msgstr "{0} الملخص" -#: erpnext/accounts/utils.py:1498 +#: erpnext/accounts/utils.py:1509 msgid "{0} Number {1} is already used in {2} {3}" msgstr "{0} الرقم {1} مستخدم بالفعل في {2} {3}" @@ -57902,7 +58424,7 @@ msgstr "{0} تكلفة التشغيل للعملية {1}" msgid "{0} Operations: {1}" msgstr "{0} العمليات: {1}" -#: erpnext/stock/doctype/material_request/material_request.py:220 +#: erpnext/stock/doctype/material_request/material_request.py:222 msgid "{0} Request for {1}" msgstr "{0} طلب {1}" @@ -57910,7 +58432,7 @@ msgstr "{0} طلب {1}" msgid "{0} Retain Sample is based on batch, please check Has Batch No to retain sample of item" msgstr "{0} يعتمد الاحتفاظ بالعينة على الدُفعة ، يُرجى تحديد "رقم الدُفعة" للاحتفاظ بعينة من العنصر" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:461 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:465 msgid "{0} Transaction(s) Reconciled" msgstr "{0} تمت مطابقة المعاملة (المعاملات)" @@ -57922,23 +58444,23 @@ msgstr "الحساب {0} ليس تابعاً للشركة {1}" msgid "{0} account is not of type {1}" msgstr "الحساب {0} ليس من النوع {1}" -#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:512 +#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:514 msgid "{0} account not found while submitting purchase receipt" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1056 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1057 msgid "{0} against Bill {1} dated {2}" msgstr "{0} مقابل الفاتورة {1} بتاريخ {2}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1065 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1066 msgid "{0} against Purchase Order {1}" msgstr "{0} مقابل أمر الشراء {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1032 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1033 msgid "{0} against Sales Invoice {1}" msgstr "{0} مقابل فاتورة المبيعات {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1039 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1040 msgid "{0} against Sales Order {1}" msgstr "{0} مقابل طلب مبيعات {1}" @@ -57967,13 +58489,13 @@ msgstr "لا يمكن تغيير {0} باستخدام إدخالات الفتح msgid "{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}" msgstr "لا يمكن استخدام {0} كمركز تكلفة رئيسي لأنه تم استخدامه كمركز تكلفة فرعي في تخصيص مركز التكلفة {1}" -#: erpnext/accounts/doctype/payment_request/payment_request.py:123 +#: erpnext/accounts/doctype/payment_request/payment_request.py:146 msgid "{0} cannot be zero" msgstr "لا يمكن أن تكون قيمة {0} صفرًا" #: erpnext/manufacturing/doctype/production_plan/production_plan.py:915 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:1031 -#: erpnext/stock/doctype/pick_list/pick_list.py:1258 +#: erpnext/stock/doctype/pick_list/pick_list.py:1260 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.py:323 msgid "{0} created" msgstr "{0} تم انشاؤه" @@ -57982,15 +58504,15 @@ msgstr "{0} تم انشاؤه" msgid "{0} creation for the following records will be skipped." msgstr "سيتم تخطي إنشاء السجلات التالية {0} ." -#: erpnext/setup/doctype/company/company.py:290 +#: erpnext/setup/doctype/company/company.py:291 msgid "{0} currency must be same as company's default currency. Please select another account." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.py:295 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:296 msgid "{0} currently has a {1} Supplier Scorecard standing, and Purchase Orders to this supplier should be issued with caution." msgstr "{0} لديها حاليا {1} بطاقة أداء بطاقة الموردين، ويجب إصدار أوامر الشراء إلى هذا المورد بحذر." -#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:128 +#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:138 msgid "{0} currently has a {1} Supplier Scorecard standing, and RFQs to this supplier should be issued with caution." msgstr "{0} لديه حاليا {1} بطاقة أداء بطاقة الموردين، ويجب أن يتم إصدار طلبات إعادة الشراء إلى هذا المورد بحذر." @@ -57998,7 +58520,7 @@ msgstr "{0} لديه حاليا {1} بطاقة أداء بطاقة المورد msgid "{0} does not belong to Company {1}" msgstr "{0} لا تنتمي إلى شركة {1}" -#: erpnext/controllers/accounts_controller.py:349 +#: erpnext/controllers/accounts_controller.py:350 msgid "{0} does not belong to the Company {1}." msgstr "لا ينتمي {0} إلى الشركة {1}." @@ -58011,16 +58533,16 @@ msgstr "{0} ادخل مرتين في ضريبة البند" msgid "{0} entered twice {1} in Item Taxes" msgstr "تم إدخال {0} مرتين {1} في ضرائب الأصناف" -#: erpnext/accounts/utils.py:134 +#: erpnext/accounts/utils.py:135 #: erpnext/projects/doctype/activity_cost/activity_cost.py:40 msgid "{0} for {1}" msgstr "{0} ل {1}" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:452 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:453 msgid "{0} has Payment Term based allocation enabled. Select a Payment Term for Row #{1} in Payment References section" msgstr "تم تفعيل تخصيص الدفعات بناءً على شروط الدفع للصف {0} . حدد شرط دفع للصف #{1} في قسم مراجع الدفع." -#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:805 +#: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:807 msgid "{0} has been modified after you pulled it. Please pull it again." msgstr "تم تعديل {0} بعد سحبه. يرجى سحبه مرة أخرى." @@ -58032,11 +58554,11 @@ msgstr "{0} تم التقديم بنجاح" msgid "{0} hours" msgstr "{0} ساعات" -#: erpnext/controllers/accounts_controller.py:2722 +#: erpnext/controllers/accounts_controller.py:2726 msgid "{0} in row {1}" msgstr "{0} في الحقل {1}" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:450 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:454 msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "" @@ -58044,25 +58566,25 @@ msgstr "" msgid "{0} is a mandatory Accounting Dimension.
    Please set a value for {0} in Accounting Dimensions section." msgstr "{0} بُعد محاسبي إلزامي.
    يُرجى تحديد قيمة لـ {0} في قسم الأبعاد المحاسبية." -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:100 -#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:153 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:102 +#: erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.py:155 #: erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py:60 msgid "{0} is added multiple times on rows: {1}" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:626 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:630 msgid "{0} is already running for {1}" msgstr "{0} قيد التشغيل بالفعل لـ {1}" -#: erpnext/controllers/accounts_controller.py:172 +#: erpnext/controllers/accounts_controller.py:173 msgid "{0} is blocked so this transaction cannot proceed" msgstr "تم حظر {0} حتى لا تتم متابعة هذه المعاملة" -#: erpnext/assets/doctype/asset/asset.py:508 +#: erpnext/assets/doctype/asset/asset.py:509 msgid "{0} is in Draft. Submit it before creating the Asset." msgstr "{0} في وضع المسودة. يرجى إرساله قبل إنشاء الأصل." -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1133 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1134 msgid "{0} is mandatory for Item {1}" msgstr "{0} إلزامي للصنف {1}\\n
    \\n{0} is mandatory for Item {1}" @@ -58075,7 +58597,7 @@ msgstr "{0} إلزامي للحساب {1}" msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}" msgstr "{0} إلزامي. ربما لم يتم إنشاء سجل صرف العملات من {1} إلى {2}" -#: erpnext/controllers/accounts_controller.py:3166 +#: erpnext/controllers/accounts_controller.py:3172 msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}." msgstr "{0} إلزامي. ربما لم يتم إنشاء سجل سعر صرف العملة ل{1} إلى {2}." @@ -58087,11 +58609,15 @@ msgstr "{0} ليس حسابًا مصرفيًا للشركة" msgid "{0} is not a group node. Please select a group node as parent cost center" msgstr "{0} ليست عقدة مجموعة. يرجى تحديد عقدة المجموعة كمركز تكلفة الأصل" -#: erpnext/stock/doctype/stock_entry/stock_entry.py:613 +#: erpnext/stock/doctype/stock_entry/stock_entry.py:618 msgid "{0} is not a stock Item" msgstr "{0} ليس من نوع المخزون" -#: erpnext/controllers/item_variant.py:141 +#: erpnext/accounts/report/budget_variance_report/budget_variance_report.py:419 +msgid "{0} is not a valid Accounting Dimension." +msgstr "" + +#: erpnext/controllers/item_variant.py:147 msgid "{0} is not a valid Value for Attribute {1} of Item {2}." msgstr "{0} ليست قيمة صالحة للسمة {1} للعنصر {2}." @@ -58103,15 +58629,15 @@ msgstr "{0} لم تتم إضافته في الجدول" msgid "{0} is not enabled in {1}" msgstr "{0} غير ممكّن في {1}" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:634 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:638 msgid "{0} is not running. Cannot trigger events for this Document" msgstr "{0} لا يعمل. لا يمكن تشغيل الأحداث لهذا المستند." -#: erpnext/stock/doctype/material_request/material_request.py:652 +#: erpnext/stock/doctype/material_request/material_request.py:663 msgid "{0} is not the default supplier for any items." msgstr "{0} ليس المورد الافتراضي لأية عناصر." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2936 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2959 msgid "{0} is on hold till {1}" msgstr "{0} معلق حتى {1}" @@ -58135,7 +58661,7 @@ msgstr "{0} عناصر منتجة" msgid "{0} must be negative in return document" msgstr "{0} يجب أن يكون سالبة في وثيقة الارجاع" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2366 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2370 msgid "{0} not allowed to transact with {1}. Please change the Company or add the Company in the 'Allowed To Transact With'-Section in the Customer record." msgstr "لا يُسمح لـ {0} بالتعامل مع {1}. يُرجى تغيير الشركة أو إضافتها في قسم \"مسموح بالتعامل معه\" في سجل العميل." @@ -58151,19 +58677,19 @@ msgstr "{0} المعلمة غير صالحة" msgid "{0} payment entries can not be filtered by {1}" msgstr "{0} لا يمكن فلترة المدفوعات المدخلة {1}" -#: erpnext/controllers/stock_controller.py:1693 +#: erpnext/controllers/stock_controller.py:1734 msgid "{0} qty of Item {1} is being received into Warehouse {2} with capacity {3}." msgstr "يتم استلام كمية {0} من الصنف {1} في المستودع {2} بسعة {3}." -#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:721 +#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:725 msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation." msgstr "تم حجز الوحدات {0} للصنف {1} في المستودع {2}، يرجى إلغاء حجزها لـ {3} في عملية مطابقة المخزون." -#: erpnext/stock/doctype/pick_list/pick_list.py:1016 +#: erpnext/stock/doctype/pick_list/pick_list.py:1018 msgid "{0} units of Item {1} is not available in any of the warehouses." msgstr "" -#: erpnext/stock/doctype/pick_list/pick_list.py:1009 +#: erpnext/stock/doctype/pick_list/pick_list.py:1011 msgid "{0} units of Item {1} is not available in any of the warehouses. Other Pick Lists exist for this item." msgstr "" @@ -58171,12 +58697,12 @@ msgstr "" msgid "{0} units of {1} are required in {2} with the inventory dimension: {3} on {4} {5} for {6} to complete the transaction." msgstr "يلزم {0} وحدة من {1} في {2} مع بُعد المخزون: {3} على {4} {5} لـ {6} لإكمال المعاملة." -#: erpnext/stock/stock_ledger.py:1681 erpnext/stock/stock_ledger.py:2159 -#: erpnext/stock/stock_ledger.py:2173 +#: erpnext/stock/stock_ledger.py:1681 erpnext/stock/stock_ledger.py:2158 +#: erpnext/stock/stock_ledger.py:2172 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "{0} وحدات من {1} لازمة ل {2} في {3} {4} ل {5} لإكمال هذه المعاملة." -#: erpnext/stock/stock_ledger.py:2260 erpnext/stock/stock_ledger.py:2305 +#: erpnext/stock/stock_ledger.py:2259 erpnext/stock/stock_ledger.py:2304 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "{0} وحدة من {1} مطلوبة في {2} على {3} {4} لإكمال هذه المعاملة." @@ -58188,11 +58714,11 @@ msgstr "{0} وحدات من {1} لازمة في {2} لإكمال هذه الم msgid "{0} until {1}" msgstr "{0} حتى {1}" -#: erpnext/stock/utils.py:400 +#: erpnext/stock/utils.py:403 msgid "{0} valid serial nos for Item {1}" msgstr "{0} أرقام تسلسلية صالحة للبند {1}" -#: erpnext/stock/doctype/item/item.js:757 +#: erpnext/stock/doctype/item/item.js:775 msgid "{0} variants created." msgstr "تم إنشاء المتغيرات {0}." @@ -58216,7 +58742,7 @@ msgstr "{0} {1}" msgid "{0} {1} Manually" msgstr "{0} {1} يدويًا" -#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:465 +#: erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py:469 msgid "{0} {1} Partially Reconciled" msgstr "{0} {1} مُوَحَّد جزئيًا" @@ -58228,31 +58754,31 @@ msgstr "لا يمكن تحديث {0} {1} . إذا كنت ترغب في إجرا msgid "{0} {1} created" msgstr "{0} {1} إنشاء" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:612 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:665 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2678 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:613 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:666 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2697 msgid "{0} {1} does not exist" msgstr "{0} {1} غير موجود\\n
    \\n{0} {1} does not exist" -#: erpnext/accounts/party.py:565 +#: erpnext/accounts/party.py:558 msgid "{0} {1} has accounting entries in currency {2} for company {3}. Please select a receivable or payable account with currency {2}." msgstr "{0} يحتوي {1} على إدخالات محاسبية بالعملة {2} للشركة {3}. الرجاء تحديد حساب مستحق أو دائن بالعملة {2}." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:462 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:463 msgid "{0} {1} has already been fully paid." msgstr "تم دفع المبلغ بالكامل بالفعل {0} {1} ." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:472 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:473 msgid "{0} {1} has already been partly paid. Please use the 'Get Outstanding Invoice' or the 'Get Outstanding Orders' button to get the latest outstanding amounts." msgstr "تم سداد جزء من المبلغ المستحق {0} {1} . يُرجى استخدام زر \"الحصول على الفاتورة المستحقة\" أو زر \"الحصول على الطلبات المستحقة\" للاطلاع على أحدث المبالغ المستحقة." -#: erpnext/buying/doctype/purchase_order/purchase_order.py:435 -#: erpnext/selling/doctype/sales_order/sales_order.py:597 -#: erpnext/stock/doctype/material_request/material_request.py:247 +#: erpnext/buying/doctype/purchase_order/purchase_order.py:436 +#: erpnext/selling/doctype/sales_order/sales_order.py:599 +#: erpnext/stock/doctype/material_request/material_request.py:249 msgid "{0} {1} has been modified. Please refresh." msgstr "تم تعديل {0} {1}، يرجى تحديث الصفحة من المتصفح" -#: erpnext/stock/doctype/material_request/material_request.py:274 +#: erpnext/stock/doctype/material_request/material_request.py:276 msgid "{0} {1} has not been submitted so the action cannot be completed" msgstr "{0} {1} لم يتم إرسالها، ولذلك لا يمكن إكمال الإجراء" @@ -58264,61 +58790,61 @@ msgstr "يتم تخصيص {0} {1} مرتين في هذه المعاملة الم msgid "{0} {1} is already linked to Common Code {2}." msgstr "{0} {1} مرتبط بالفعل بالرمز المشترك {2}." -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:695 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:696 msgid "{0} {1} is associated with {2}, but Party Account is {3}" msgstr "{0} {1} مرتبط ب {2}، ولكن حساب الطرف هو {3}" -#: erpnext/controllers/selling_controller.py:494 +#: erpnext/controllers/selling_controller.py:495 #: erpnext/controllers/subcontracting_controller.py:1166 msgid "{0} {1} is cancelled or closed" msgstr "{0} {1} تم إلغائه أو مغلق" -#: erpnext/stock/doctype/material_request/material_request.py:423 +#: erpnext/stock/doctype/material_request/material_request.py:428 msgid "{0} {1} is cancelled or stopped" msgstr "{0} {1} يتم إلغاؤه أو إيقافه\\n
    \\n{0} {1} is cancelled or stopped" -#: erpnext/stock/doctype/material_request/material_request.py:264 +#: erpnext/stock/doctype/material_request/material_request.py:266 msgid "{0} {1} is cancelled so the action cannot be completed" msgstr "{0} {1} تم إلغاؤه لذلك لا يمكن إكمال الإجراء" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:851 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:852 msgid "{0} {1} is closed" msgstr "{0} {1} مغلقة" -#: erpnext/accounts/party.py:803 +#: erpnext/accounts/party.py:805 msgid "{0} {1} is disabled" msgstr "{0} {1} معطل" -#: erpnext/accounts/party.py:809 +#: erpnext/accounts/party.py:811 msgid "{0} {1} is frozen" msgstr "{0} {1} مجمد" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:848 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:849 msgid "{0} {1} is fully billed" msgstr "{0} {1} قدمت الفواتير بشكل كامل" -#: erpnext/accounts/party.py:813 +#: erpnext/accounts/party.py:815 msgid "{0} {1} is not active" msgstr "{0} {1} غير نشطة" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:672 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:673 msgid "{0} {1} is not associated with {2} {3}" msgstr "{0} {1} غير مرتبط {2} {3}" -#: erpnext/accounts/utils.py:130 +#: erpnext/accounts/utils.py:131 msgid "{0} {1} is not in any active Fiscal Year" msgstr "{0} {1} ليس في أي سنة مالية نشطة" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:845 -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:884 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:846 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:885 msgid "{0} {1} is not submitted" msgstr "{0} {1} لم يتم تقديمه" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:705 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:706 msgid "{0} {1} is on hold" msgstr "{0} {1} معلق" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:711 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:712 msgid "{0} {1} must be submitted" msgstr "{0} {1} يجب أن يتم اعتماده\\n
    \\n{0} {1} must be submitted" @@ -58357,7 +58883,7 @@ msgstr "{0} {1}: الحساب {2} غير فعال \\n
    \\n{0} {1}: Account {2} msgid "{0} {1}: Accounting Entry for {2} can only be made in currency: {3}" msgstr "{0} {1}: قيد محاسبي ل {2} يمكن ان يتم فقط بالعملة : {3}" -#: erpnext/controllers/stock_controller.py:906 +#: erpnext/controllers/stock_controller.py:947 msgid "{0} {1}: Cost Center is mandatory for Item {2}" msgstr "{0} {1}: مركز التكلفة إلزامي للبند {2}" @@ -58411,35 +58937,39 @@ msgstr "" msgid "{0}, complete the operation {1} before the operation {2}." msgstr "{0} ، أكمل العملية {1} قبل العملية {2}." -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:521 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:525 msgid "{0}: Child table (auto-deleted with parent)" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:516 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:520 msgid "{0}: Not found" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:512 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:516 msgid "{0}: Protected DocType" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:526 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:530 msgid "{0}: Virtual DocType (no database table)" msgstr "" -#: erpnext/controllers/accounts_controller.py:539 +#: erpnext/controllers/accounts_controller.py:540 msgid "{0}: {1} does not belong to the Company: {2}" msgstr "{0}: {1} لا ينتمي إلى الشركة: {2}" -#: erpnext/accounts/party.py:78 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1392 +msgid "{0}: {1} does not exist" +msgstr "" + +#: erpnext/accounts/party.py:79 msgid "{0}: {1} does not exists" msgstr "{0}: {1} غير موجود" -#: erpnext/setup/doctype/company/company.py:277 +#: erpnext/setup/doctype/company/company.py:278 msgid "{0}: {1} is a group account." msgstr "{0}: {1} هو حساب جماعي." -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:989 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:993 msgid "{0}: {1} must be less than {2}" msgstr "{0}: {1} يجب أن يكون أقل من {2}" @@ -58455,7 +58985,7 @@ msgstr "{doctype} {name} تم إلغائه أو مغلق." msgid "{field_label} is mandatory for sub-contracted {doctype}." msgstr "{field_label} إلزامي للمقاولين من الباطن {doctype}." -#: erpnext/controllers/stock_controller.py:2098 +#: erpnext/controllers/stock_controller.py:2141 msgid "{item_name}'s Sample Size ({sample_size}) cannot be greater than the Accepted Quantity ({accepted_quantity})" msgstr "لا يمكن أن يكون حجم العينة {item_name}({sample_size}) أكبر من الكمية المقبولة ({accepted_quantity})" @@ -58467,7 +58997,7 @@ msgstr "{ref_doctype} {ref_name} هو {status}." msgid "{}" msgstr "{}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2132 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2136 msgid "{} can't be cancelled since the Loyalty Points earned has been redeemed. First cancel the {} No {}" msgstr "لا يمكن إلغاء {} نظرًا لاسترداد نقاط الولاء المكتسبة. قم أولاً بإلغاء {} لا {}" @@ -58488,7 +59018,7 @@ msgstr "{} {} مرتبط بالفعل بـ {} آخر" msgid "{} {} is already linked with {} {}" msgstr "{} {} مرتبط بالفعل بـ {} {}" -#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:390 +#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:391 msgid "{} {} is not affecting bank account {}" msgstr "{} {} لا يؤثر على الحساب المصرفي {}" diff --git a/erpnext/locale/bs.po b/erpnext/locale/bs.po index 7f911a0b497..0d1feaf658b 100644 --- a/erpnext/locale/bs.po +++ b/erpnext/locale/bs.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-02-22 09:43+0000\n" -"PO-Revision-Date: 2026-02-22 16:38\n" +"POT-Creation-Date: 2026-03-08 09:42+0000\n" +"PO-Revision-Date: 2026-03-09 16:58\n" "Last-Translator: hello@frappe.io\n" "Language-Team: Bosnian\n" "MIME-Version: 1.0\n" @@ -18,7 +18,7 @@ msgstr "" "X-Crowdin-File-ID: 46\n" "Language: bs_BA\n" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1474 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1516 msgid "\n" "\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}{3}.\n" "\t\t\tPlease add a stock quantity of {4} to proceed with this entry.\n" @@ -268,11 +268,11 @@ msgstr "% materijala isporučenih prema ovoj Listi Odabira" msgid "% of materials delivered against this Sales Order" msgstr "% materijala dostavljenog naspram ovog Prodajnog Naloga" -#: erpnext/controllers/accounts_controller.py:2371 +#: erpnext/controllers/accounts_controller.py:2372 msgid "'Account' in the Accounting section of Customer {0}" msgstr "'Račun' u sekciji Knjigovodstvo Klijenta {0}" -#: erpnext/selling/doctype/sales_order/sales_order.py:359 +#: erpnext/selling/doctype/sales_order/sales_order.py:361 msgid "'Allow Multiple Sales Orders Against a Customer's Purchase Order'" msgstr "'Dozvoli višestruke Prodajne Naloge naspram Kupovnog Naloga Klijenta'" @@ -284,17 +284,17 @@ msgstr "'Na Osnovu' i 'Grupiraj Po' ne mogu biti isti" msgid "'Days Since Last Order' must be greater than or equal to zero" msgstr "'Dana od posljednje narudžbe' mora biti veći ili jednako nuli" -#: erpnext/controllers/accounts_controller.py:2376 +#: erpnext/controllers/accounts_controller.py:2377 msgid "'Default {0} Account' in Company {1}" msgstr "'Standard {0} račun' u {1}" -#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1220 +#: erpnext/accounts/doctype/journal_entry/journal_entry.py:1221 msgid "'Entries' cannot be empty" msgstr "Polje 'Unosi' ne može biti prazno" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:24 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:127 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:312 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:322 msgid "'From Date' is required" msgstr "'Od datuma' je obavezan" @@ -306,22 +306,23 @@ msgstr "'Od datuma' mora biti nakon 'Do datuma'" msgid "'Has Serial No' can not be 'Yes' for non-stock item" msgstr "'Ima Serijski Broj' ne može biti 'Da' za artikal koji nije na zalihama" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:143 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:145 msgid "'Inspection Required before Delivery' has disabled for the item {0}, no need to create the QI" msgstr "'Kontrola Obavezna prije Dostave' je onemogućena za artikal {0}, nema potrebe za kreiranjem Kontrole Kvaliteta" -#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:134 +#: erpnext/stock/doctype/quality_inspection/quality_inspection.py:136 msgid "'Inspection Required before Purchase' has disabled for the item {0}, no need to create the QI" msgstr "'Potrebna kontrola prije kupovine' je onemogućena za artikal {0}, nema potrebe za kreiranjem kvaliteta kontrole" -#: erpnext/stock/report/stock_ledger/stock_ledger.py:600 -#: erpnext/stock/report/stock_ledger/stock_ledger.py:633 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:664 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:704 +#: erpnext/stock/report/stock_ledger/stock_ledger.py:809 msgid "'Opening'" msgstr "'Početno'" #: erpnext/stock/report/batch_item_expiry_status/batch_item_expiry_status.py:27 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:129 -#: erpnext/stock/report/stock_analytics/stock_analytics.py:318 +#: erpnext/stock/report/stock_analytics/stock_analytics.py:328 msgid "'To Date' is required" msgstr "'Do Datuma' je obavezno" @@ -333,7 +334,7 @@ msgstr "'Do Paketa Broj' ne može biti manje od 'Od Paketa Broj.'" msgid "'Update Stock' can not be checked because items are not delivered via {0}" msgstr "'Ažuriraj Zalihe' se ne može provjeriti jer se artikli ne isporučuju putem {0}" -#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:413 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:414 msgid "'Update Stock' cannot be checked for fixed asset sale" msgstr "'Ažuriraj Zalihe' ne može se provjeriti za prodaju osnovne Imovine" @@ -345,8 +346,8 @@ msgstr "Račun '{0}' već koristi {1}. Koristite drugi račun." msgid "'{0}' has been already added." msgstr "'{0}' je već dodan." -#: erpnext/setup/doctype/company/company.py:302 -#: erpnext/setup/doctype/company/company.py:313 +#: erpnext/setup/doctype/company/company.py:303 +#: erpnext/setup/doctype/company/company.py:314 msgid "'{0}' should be in company currency {1}." msgstr "'{0}' bi trebao biti u valuti {1}." @@ -602,12 +603,12 @@ msgstr "90 - 120 dana" msgid "90 Above" msgstr "Iznad 90" -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1288 -#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1289 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1330 +#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1331 msgid "<0" msgstr "<0" -#: erpnext/assets/doctype/asset/asset.py:544 +#: erpnext/assets/doctype/asset/asset.py:545 msgid "Cannot create asset.

    You're trying to create {0} asset(s) from {2} {3}.
    However, only {1} item(s) were purchased and {4} asset(s) already exist against {5}." msgstr "Nije moguće kreirati imovinu.

    Pokušavate kreirati {0} imovinu od {2} {3}.
    Međutim, kupljeno je samo {1} artikala i {4} imovina već postoji za {5}." @@ -615,7 +616,7 @@ msgstr "Nije moguće kreirati imovinu.

    Pokušavate kreirati {0} msgid "From Time cannot be later than To Time for {0}" msgstr "Od Vremena ne može biti kasnije od Do Vremena za {0}" -#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:432 +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:433 msgid "Row #{0}: Bundle {1} in warehouse {2} has insufficient packed items:
    " msgstr "Red #{0}: Paket {1} u skladištu {2} ima nedovoljno spakovanih artikala:
    " @@ -788,11 +789,11 @@ msgstr "