From 0312d58dca19ce78fedbbf04a534268aef54c7d9 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Wed, 4 Feb 2026 04:29:22 +0000 Subject: [PATCH 01/85] chore(release): Bumped to Version 16.4.0 # [16.4.0](https://github.com/frappe/erpnext/compare/v16.3.0...v16.4.0) (2026-02-04) ### Bug Fixes * add precision to rejected batch no qty calculation ([b365444](https://github.com/frappe/erpnext/commit/b365444027a8c9d41cfd8af4f4d21fa4de26a602)) * allow sales invoice to be renamed ([f7b915d](https://github.com/frappe/erpnext/commit/f7b915dfe6ce7085d5a0644b5c4e323bd1929ca4)) * **barcode:** failing request when item has both batch and serial ([e4cdd97](https://github.com/frappe/erpnext/commit/e4cdd971c8c3ec4f16083949d6c0b594a7d2a95e)) * batch selector not working if Use Legacy (Client side) Reactivity disabled ([2a3642b](https://github.com/frappe/erpnext/commit/2a3642b55a7844e737bcf50cba6fdbaa620b211a)) * better fix for aac39b2671ebe8aed562a9b92ee26876979b0650 ([b8ab55f](https://github.com/frappe/erpnext/commit/b8ab55fee8b370bb5e88a39516b1409dbdef695f)) * correct exchange gain loss in ppr ([e09406d](https://github.com/frappe/erpnext/commit/e09406d08599b09ccdd8b16e3761fe18b8ea33de)) * correct Sales Tax Template sidebar link to proper DocType ([4c14e74](https://github.com/frappe/erpnext/commit/4c14e74a121205ac30f93da4ca4004478f8d6a44)) * correct spelling of Payment Reconciliation in Accounting ([c80b554](https://github.com/frappe/erpnext/commit/c80b554cd7aad9fe64d32dbffd654cee3917f3bc)) * **credit-note:** set incoming rate as zero for expired batch ([0f9bf08](https://github.com/frappe/erpnext/commit/0f9bf08685df67c7981eccd37c61e1ee945908e8)) * **demo:** removed toolbar eventlistener (backport [#52171](https://github.com/frappe/erpnext/issues/52171)) ([#52172](https://github.com/frappe/erpnext/issues/52172)) ([6608601](https://github.com/frappe/erpnext/commit/66086010fc9b719f48e45ebaad130cb3cc977337)) * duplicate account number (Indonesia COA) (backport [#52080](https://github.com/frappe/erpnext/issues/52080)) ([#52317](https://github.com/frappe/erpnext/issues/52317)) ([81e6575](https://github.com/frappe/erpnext/commit/81e65757ee00e589c437e89e0fceeb199bf2568a)) * failing test cases ([136b2cf](https://github.com/frappe/erpnext/commit/136b2cfba545dd9a951cda253bb539514a7569e0)) * group item wise tax details by tax row ([45e4c04](https://github.com/frappe/erpnext/commit/45e4c04830113676e87008fd91f60fdd418370be)) * hide close button on WO if WO is completed ([0d1c30f](https://github.com/frappe/erpnext/commit/0d1c30f3f044885b36499defaf43a4313f8eb047)) * hide item_wise_tax_details table from print ([c619be9](https://github.com/frappe/erpnext/commit/c619be989bfde5934cbabf30c0433693d53c5b4f)) * include credit notes in project gross margin calculation ([e755a4a](https://github.com/frappe/erpnext/commit/e755a4ad98e89d6e5056140975963940f5b4962f)) * item code not showing in report view ([af167f9](https://github.com/frappe/erpnext/commit/af167f91fe882364ff54222cd5014022d6fd18a5)) * journal auditing voucher print date to use posting_date ([7e5eab2](https://github.com/frappe/erpnext/commit/7e5eab261cf71926580e03b760a203d9687ec285)) * **journal-entry:** normalize exchange rate to float ([3f0032d](https://github.com/frappe/erpnext/commit/3f0032d7930e846c8f998ed0b3d46ef83ea3f771)) * js error if user does not have write permission for date field ([3944dfd](https://github.com/frappe/erpnext/commit/3944dfde3104049f95d20a7c7448b4c0f5e67821)) * lead time calculation for FG item ([5595602](https://github.com/frappe/erpnext/commit/5595602f24f3c695b83dd0ded061ade6bb4a78b0)) * make item name editable in RFQ ([dbe5846](https://github.com/frappe/erpnext/commit/dbe58469082557480bf968847894082a59ceeb98)) * merge taxes in purchase receipt when get items from multiple purchase invoices ([#51422](https://github.com/frappe/erpnext/issues/51422)) ([d80c8d1](https://github.com/frappe/erpnext/commit/d80c8d14b0a3042fb8715e1d390a857232781550)) * missing depr_series causing error on jv creation (backport [#52085](https://github.com/frappe/erpnext/issues/52085)) ([#52206](https://github.com/frappe/erpnext/issues/52206)) ([78c4f01](https://github.com/frappe/erpnext/commit/78c4f0173300de1d1191fa040345d3829efe3263)) * negative stock for purchase return ([220a528](https://github.com/frappe/erpnext/commit/220a528d7f0172e58c89b16be3111ba7eb14783f)) * populate contact fields when creating quotation from customer ([55129e6](https://github.com/frappe/erpnext/commit/55129e697d9cc86d134dc327c5344607fb5d5c32)) * production plan not considering planning datetime when creating WO ([7e7b16b](https://github.com/frappe/erpnext/commit/7e7b16b23e8dcd47b0227b9ffefc7603c1e4f326)) * **profit and loss statement:** exclude non period columns ([28e8c40](https://github.com/frappe/erpnext/commit/28e8c40bfc8894f6c6ca17a2f3500ef32e4fdada)) * reset incoming rate in selling controller if there are changes in item ([024e7b0](https://github.com/frappe/erpnext/commit/024e7b01ac18da61a5ed26c1e8ef877ac2fd603a)) * **RFQ:** render email templates for preview and sending ([687a80d](https://github.com/frappe/erpnext/commit/687a80d74c47b4d63f25563680f456204ab357e4)) * **stock:** add stock recon opening stock condition ([f9a8fc1](https://github.com/frappe/erpnext/commit/f9a8fc1f2de3637f954af378bb25da1f247e3371)) * **stock:** fetch batch wise valuation rate in get_items ([b132e3f](https://github.com/frappe/erpnext/commit/b132e3f22a6da31432c0962428c710decab215e6)) * **stock:** ignore packing slip while cancelling the sales invoice ([f425f89](https://github.com/frappe/erpnext/commit/f425f89a26fabfb855fb28c55424696e663c3ef8)) * **stock:** include subcontracting order qty while calculating the bin qty ([de244e0](https://github.com/frappe/erpnext/commit/de244e0af742cabace0f1ab2de6bd9ec23247e84)) * **stock:** remove is_return condition on pos batch qty calculation ([9dcaf38](https://github.com/frappe/erpnext/commit/9dcaf381420d0a2f7e57399ca0ef9602dd141a7d)) * **stock:** set incoming_rate with lcv rate for internal purchase ([f462639](https://github.com/frappe/erpnext/commit/f462639aa0080429370507e0a53d939643362ea5)) * **subcontracting:** include item bom in supplied items grouping key ([95c4b8d](https://github.com/frappe/erpnext/commit/95c4b8de064f93e137c4b5f27bd42f674d35ee8b)) * test cases ([e74389f](https://github.com/frappe/erpnext/commit/e74389f01ca7467163c7d465a5853135e1b05d83)) * validate over ordering of quotation ([e7ace8e](https://github.com/frappe/erpnext/commit/e7ace8e620602501941afd3c48906814bc53ba1c)) * validation when more than one FG items in repack stock entry ([a2d302b](https://github.com/frappe/erpnext/commit/a2d302b3fa9843d9ed1c3599a8ad464faa356b1b)) * zero valuation rate if returning from different warehouse ([8ce51b2](https://github.com/frappe/erpnext/commit/8ce51b2f8035bdb1073a6490f796de4f546dc8b0)) ### Features * clear demo data from desktop screen (backport [#52128](https://github.com/frappe/erpnext/issues/52128)) ([#52147](https://github.com/frappe/erpnext/issues/52147)) ([05e30dc](https://github.com/frappe/erpnext/commit/05e30dc01163170ae6d01aafbf5c5b6e0471211d)) * **credit-note:** add checkbox to set valuation rate as zero for expired batch ([b84fd46](https://github.com/frappe/erpnext/commit/b84fd468411a7ddd79b3bfade9e27760aa212ece)) * **delivery-note:** add status indicator when document is partially billed ([6048add](https://github.com/frappe/erpnext/commit/6048add4c04dab7253d48d2b6486b340f0ee9b35)) * document naming rule will now use posting date of the document ([b03494b](https://github.com/frappe/erpnext/commit/b03494bb67afcc9d363002ec4cc165f44968fcce)) * **Transaction Deletion Record:** Editable "DocTypes To Delete" List with CSV import/export ([#50592](https://github.com/frappe/erpnext/issues/50592)) ([4963261](https://github.com/frappe/erpnext/commit/4963261dc8249c012c47e0466c99f91bd40dd02c)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index b5ded4ee0fa..f9ab4753303 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.3.0" +__version__ = "16.4.0" def get_default_company(user=None): From e0093199b179df5f596a0d929a176b93fd9e8ab6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 5 Feb 2026 14:32:48 +0530 Subject: [PATCH 02/85] fix: stock balance report issue (cherry picked from commit 7e584dd84aef472c80385cc3f7f55f4301e9f98b) (cherry picked from commit 62616ad9e1685faf09fdada25dfb9da637c774c4) --- erpnext/stock/report/stock_balance/stock_balance.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index 559e1b31a36..524b8d830d2 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -282,10 +282,8 @@ class StockBalanceReport: for field in self.inventory_dimensions: qty_dict[field] = entry.get(field) - if ( - entry.voucher_type == "Stock Reconciliation" - and frappe.get_cached_value(entry.voucher_type, entry.voucher_no, "purpose") != "Opening Stock" - and (not entry.batch_no or entry.serial_no) + if entry.voucher_type == "Stock Reconciliation" and ( + not entry.batch_no or not entry.serial_no or not entry.serial_and_batch_bundle ): qty_diff = flt(entry.qty_after_transaction) - flt(qty_dict.bal_qty) else: From 4305415ed95a51605ae051ccc080f38b2a2b2a53 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 5 Feb 2026 15:02:47 +0530 Subject: [PATCH 03/85] chore: fix issue (cherry picked from commit 1d24abf5ddccabce25863d793dd6dd3c67922e70) --- erpnext/stock/report/stock_balance/stock_balance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index 524b8d830d2..ccee40ce25f 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -283,7 +283,7 @@ class StockBalanceReport: qty_dict[field] = entry.get(field) if entry.voucher_type == "Stock Reconciliation" and ( - not entry.batch_no or not entry.serial_no or not entry.serial_and_batch_bundle + not entry.batch_no and not entry.serial_no and not entry.serial_and_batch_bundle ): qty_diff = flt(entry.qty_after_transaction) - flt(qty_dict.bal_qty) else: From d74a649016d8bb12ee3c5a24361171cebe860bfc Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 5 Feb 2026 10:52:48 +0000 Subject: [PATCH 04/85] chore(release): Bumped to Version 16.4.1 ## [16.4.1](https://github.com/frappe/erpnext/compare/v16.4.0...v16.4.1) (2026-02-05) ### Bug Fixes * stock balance report issue ([e009319](https://github.com/frappe/erpnext/commit/e0093199b179df5f596a0d929a176b93fd9e8ab6)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index f9ab4753303..220a888de81 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.4.0" +__version__ = "16.4.1" def get_default_company(user=None): From 6e7e219f712c55a162bf37366ca94f7e5e2aba59 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Wed, 11 Feb 2026 06:03:37 +0000 Subject: [PATCH 05/85] chore(release): Bumped to Version 16.5.0 # [16.5.0](https://github.com/frappe/erpnext/compare/v16.4.1...v16.5.0) (2026-02-11) ### Bug Fixes * Added a missing option to the currency field (backport [#52528](https://github.com/frappe/erpnext/issues/52528)) ([#52587](https://github.com/frappe/erpnext/issues/52587)) ([1c3fe00](https://github.com/frappe/erpnext/commit/1c3fe000ba534a910851151667379ee8ccf5c365)) * Added validation for quality inspection in job card ([a1ec68c](https://github.com/frappe/erpnext/commit/a1ec68cd1eee257ad148f8773d61818b2d3e469d)) * apply composite asset logic only in draft ([d2387a3](https://github.com/frappe/erpnext/commit/d2387a3af87bc1984bbd7cd66f9a710e9874c64f)) * **balance sheet:** removed the extra labels from the chart ([6a9a28b](https://github.com/frappe/erpnext/commit/6a9a28b4ae4c069e8437c3ab7f8265e7a89d1af4)) * **buying:** add supplier group link filters in field level ([9886b46](https://github.com/frappe/erpnext/commit/9886b46cb45b371d96da30636dcc454471cf9214)) * correctly calculate running balances for financial report ([7df18af](https://github.com/frappe/erpnext/commit/7df18af799fae30a385d2d8a6c5ac04bde22d916)) * do not show update stock flag unneccessarily ([c0c6cc5](https://github.com/frappe/erpnext/commit/c0c6cc58ed7da80558ec48e6d2579904a9ff42d5)) * email campaign timeout issue (backport [#51994](https://github.com/frappe/erpnext/issues/51994)) ([#52556](https://github.com/frappe/erpnext/issues/52556)) ([e753df8](https://github.com/frappe/erpnext/commit/e753df8ff05c12f94017db4bb23b1bdd30369817)) * enabling skip delivery option for order type maintenance ([7a78e97](https://github.com/frappe/erpnext/commit/7a78e9705ccf4f15a0ba0768d0bc95c4a1826a3e)) * **gross profit report:** translate column Sales Invoice ([6ff8820](https://github.com/frappe/erpnext/commit/6ff882073220534d990451f2a3587c2961f99514)) * **gross-profit:** handle item group filters ([0d02bbb](https://github.com/frappe/erpnext/commit/0d02bbb01af0c392374b82ff41a0157f53a0a715)) * **gross-profit:** handle returns outside sale period ([9b32c84](https://github.com/frappe/erpnext/commit/9b32c84462327fb0e6621e1d518a3897f77c6058)) * handle gross profit and percentage for return invoices ([d081a26](https://github.com/frappe/erpnext/commit/d081a26608c003be23f22313a816015031867c0f)) * item code is tuple with operation id ([9d14c0b](https://github.com/frappe/erpnext/commit/9d14c0b60ec59508eb4d97e947a8d1c15efe9e69)) * **manufacturing:** fix chart period keys ([b99ca48](https://github.com/frappe/erpnext/commit/b99ca486d7bc7fcaea771ea79a508b0be14e5bfd)) * **manufacturing:** handle None value for actual_end_date ([b1b75ec](https://github.com/frappe/erpnext/commit/b1b75eca3d5010d94b96f2467e8a81e7f3e86a3f)) * **map_current_doc:** prevent mutation of query args in get_query (backport [#52202](https://github.com/frappe/erpnext/issues/52202)) ([#52584](https://github.com/frappe/erpnext/issues/52584)) ([b8256e5](https://github.com/frappe/erpnext/commit/b8256e5f318ca8e30de71f97a959b78e7c4be990)) * move company field to first position in sales invoice, purchase invoice, sales order, purchase order and journal entry ([e53ccd0](https://github.com/frappe/erpnext/commit/e53ccd07450c64e0a0d9d82ee4969673bcffe714)) * not able to complete job card ([c5ff534](https://github.com/frappe/erpnext/commit/c5ff534d58a8a96f51e3a90693c4eb8d0547dd79)) * operation status and bom validation ([1122265](https://github.com/frappe/erpnext/commit/11222653ce0e562e73b3cb7a2c37aa7cd9127882)) * Period Closing Voucher doesn't exist for GL Entry ([921584c](https://github.com/frappe/erpnext/commit/921584c769aea54be6dbc23c41007f8aa4b8b9a3)) * process loss error incorrectly thrown even when semi FG BOM does not have any process loss ([4a7ffce](https://github.com/frappe/erpnext/commit/4a7ffce32013849c7936ade59938af019167014d)) * **quotation:** ignore zero ordered_qty ([cf7c127](https://github.com/frappe/erpnext/commit/cf7c127dc66d0d3ccab5038a7f7680a20e394d62)) * rate comparison in stock reco ([1f78f45](https://github.com/frappe/erpnext/commit/1f78f45aee164cc37a178f368664b04385ae6e32)) * remove customer_pos_id reference ([#52396](https://github.com/frappe/erpnext/issues/52396)) ([ab59f73](https://github.com/frappe/erpnext/commit/ab59f730648932603464472dd6efcf78c63c4530)) * remove incorrect validation from email digest throwing spurious error (backport [#51827](https://github.com/frappe/erpnext/issues/51827)) ([#52579](https://github.com/frappe/erpnext/issues/52579)) ([dffb6ac](https://github.com/frappe/erpnext/commit/dffb6ac4cf83d2d36b20f2ea6397da362940942b)) * return None instead of 0 if valuation rate is falsy ([64a7956](https://github.com/frappe/erpnext/commit/64a7956a4a59022242e5f6c6a550a21750566b61)) * stock balance report issue ([62616ad](https://github.com/frappe/erpnext/commit/62616ad9e1685faf09fdada25dfb9da637c774c4)) * stock reservation created against job card ([305483e](https://github.com/frappe/erpnext/commit/305483e07475361c9228ca166896c2fc48351522)) * **stock:** add is group filter for warehouse fields ([23a26b5](https://github.com/frappe/erpnext/commit/23a26b540bcb675ff97bda627b52a9065ad524d1)) * **stock:** ignore pos reserved batches for stock levels ([e2c1204](https://github.com/frappe/erpnext/commit/e2c12043aec418a4d629e955b4bfd03642fe3104)) * **stock:** inward stock for pick list test record ([801a26a](https://github.com/frappe/erpnext/commit/801a26ae67f98d8ebc74d9dcf4019a555e7f5c45)) * **stock:** set source warehouse for issue type ([53e512c](https://github.com/frappe/erpnext/commit/53e512ceaf6fb81e0b9222f7d700070fea95917f)) * **stock:** update target field attribute ([96dfecf](https://github.com/frappe/erpnext/commit/96dfecf0d5b3281d81ecd475d53d1cd7053d0556)) * test cases ([ece8d00](https://github.com/frappe/erpnext/commit/ece8d0041572fc6ffdbe4acb9f2a6b64b8f4a7b5)) * validate asset movement transaction date ([#52340](https://github.com/frappe/erpnext/issues/52340)) ([898d2e3](https://github.com/frappe/erpnext/commit/898d2e3c9a6e5502f11fff838257e90a5da1d227)) * Workspace sidebar links for Debit/Credit Notes ([29d33b3](https://github.com/frappe/erpnext/commit/29d33b31394d4633205d80db4e1c4728cec64de1)) ### Features * **accounts:** expand Journal Entry Template to support dimensions and party ([#51621](https://github.com/frappe/erpnext/issues/51621)) ([d06a46a](https://github.com/frappe/erpnext/commit/d06a46ae8516dddff98e0cbff21766c314a52333)) * allow negative stock for the batch item ([b6afe7f](https://github.com/frappe/erpnext/commit/b6afe7f4da2fe24ccd5c6178be9026cd756b70b5)) ### Reverts * "fix: allow sales invoice to be renamed" ([abef910](https://github.com/frappe/erpnext/commit/abef9109b0caf67554d8cf999dc072cf9942101e)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 220a888de81..49f603e7d2e 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.4.1" +__version__ = "16.5.0" def get_default_company(user=None): From 372b0119bbd7e0de1fd836cc49636af5b8f34f9e Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 17 Feb 2026 14:10:20 +0000 Subject: [PATCH 06/85] chore(release): Bumped to Version 16.6.0 # [16.6.0](https://github.com/frappe/erpnext/compare/v16.5.0...v16.6.0) (2026-02-17) ### Bug Fixes * allow non-stock items while updating items ([e2183eb](https://github.com/frappe/erpnext/commit/e2183ebde9034d826e985706090ff06705529540)) * allow sequence id edit in BOM if routing is not set ([6f812cc](https://github.com/frappe/erpnext/commit/6f812ccaf5eb55fa9253f7d90093711db24aeeaa)) * better validation for negative batch ([e46e874](https://github.com/frappe/erpnext/commit/e46e8741b44c6ade4d2ae0f116657486cb05c324)) * cancel SABB if SLE cancelled from LCV ([ac90975](https://github.com/frappe/erpnext/commit/ac90975f4306d191059f4caa898fedeb9b49b043)) * consider sle for negative stock validation ([ca8f324](https://github.com/frappe/erpnext/commit/ca8f324b51ca0580742d7b7d38b46b2890b2f63a)) * consider table multiselect in delete transaction ([38679d6](https://github.com/frappe/erpnext/commit/38679d6d147b098adf83ab7466697d5752cef9ea)) * correct typos in marketing campaign custom fields function ([531bdbc](https://github.com/frappe/erpnext/commit/531bdbc7276a52c72378602d460d862eaf5d318d)) * do not allow plant floor company and warehouse to be updated ([a039c17](https://github.com/frappe/erpnext/commit/a039c176c8ae820791f14b1f3d811c052c12c6aa)) * ensure layout has Bootstrap row and column (backport [#52649](https://github.com/frappe/erpnext/issues/52649)) ([#52719](https://github.com/frappe/erpnext/issues/52719)) ([53e400c](https://github.com/frappe/erpnext/commit/53e400cca158da772242784406c51ce6bf5710a7)) * log changes made to accounts settings ([2200b9a](https://github.com/frappe/erpnext/commit/2200b9aa678f799f43539411165950d44951e7d2)) * **manufacturing:** add sales order fields in subassembly child table ([605c0db](https://github.com/frappe/erpnext/commit/605c0db976b3be2b97b42a6c22837dfece3062a9)) * **manufacturing:** set sales order references in subassembly child table ([f4b0e64](https://github.com/frappe/erpnext/commit/f4b0e646b401c920a4925acb5d81ee596168b8a4)) * **pos_invoice:** add correct depends on condition ([#52689](https://github.com/frappe/erpnext/issues/52689)) ([28592d0](https://github.com/frappe/erpnext/commit/28592d01802266b6a61eaf7df93a6ed39dd6d13b)) * prevent rows from being added to sub_assembly_items and mr_items ([80c98cd](https://github.com/frappe/erpnext/commit/80c98cdcf4838301ffa9a123472291a3529bdab2)) * production plan status ([62ea18f](https://github.com/frappe/erpnext/commit/62ea18f1cc620473b8bace56868bc982b1b7b275)) * removed lost reason detail ([3c33a19](https://github.com/frappe/erpnext/commit/3c33a19634cca72e206db05953f97e662ed2969c)) * **selling-workspace-sidebar:** changed order of pos profile ([1820c35](https://github.com/frappe/erpnext/commit/1820c35880e9ce5718493e5d8ab9dd94ada587ea)) * standalone credit/debit notes should not fetch any serial or batch by default ([dd4e186](https://github.com/frappe/erpnext/commit/dd4e1867f5f7fe3cbeca06d867b0afe124a0ad01)) * **stock:** remove hardcoded letter_head from report ([1d444e5](https://github.com/frappe/erpnext/commit/1d444e53eb16d5859295916daaa9a51561d9e0c4)), closes [#52569](https://github.com/frappe/erpnext/issues/52569) * total weight does not update when updating items ([46b5884](https://github.com/frappe/erpnext/commit/46b588442071cf8ef43e4639a61f1fe17968216e)) * wrong display_depends_on condition for item group and brand child tables ([6ae1b18](https://github.com/frappe/erpnext/commit/6ae1b18616357b511dd78f4e58f15625a664aed2)) ### Features * Negative Batch report ([8649543](https://github.com/frappe/erpnext/commit/8649543ae062addaafb99ab837f64df44f5faed2)) * show formatted currency symbol on ledger preview ([b844afe](https://github.com/frappe/erpnext/commit/b844afe0ec4c27f7c01dca8764f08df049ce37df)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 49f603e7d2e..424779a2599 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.5.0" +__version__ = "16.6.0" def get_default_company(user=None): From 78fc9424d9085c2eafe1211931e22d7044f85fc7 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 16 Feb 2026 13:19:10 +0530 Subject: [PATCH 07/85] fix: better permissions on make payment request (cherry picked from commit f36962fc5842361872caccc13ec56567a5c1e203) --- erpnext/accounts/doctype/payment_request/payment_request.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 7d21a4ba41a..028cb6b20f3 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -546,6 +546,9 @@ def make_payment_request(**args): if args.dn and not isinstance(args.dn, str): frappe.throw(_("Invalid parameter. 'dn' should be of type str")) + frappe.has_permission("Payment Request", "create", throw=True) + frappe.has_permission(args.dt, "read", args.dn, throw=True) + ref_doc = args.ref_doc or frappe.get_doc(args.dt, args.dn) if not args.get("company"): args.company = ref_doc.company @@ -819,7 +822,7 @@ def get_print_format_list(ref_doctype): return {"print_format": print_format_list} -@frappe.whitelist(allow_guest=True) +@frappe.whitelist() def resend_payment_email(docname): return frappe.get_doc("Payment Request", docname).send_email() From 9a0b54c649be924a23d6f1db7675f9df01416ebb Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 19 Feb 2026 05:04:10 +0000 Subject: [PATCH 08/85] chore(release): Bumped to Version 16.6.1 ## [16.6.1](https://github.com/frappe/erpnext/compare/v16.6.0...v16.6.1) (2026-02-19) ### Bug Fixes * better permissions on make payment request ([78fc942](https://github.com/frappe/erpnext/commit/78fc9424d9085c2eafe1211931e22d7044f85fc7)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 424779a2599..15589b1dc24 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.6.0" +__version__ = "16.6.1" def get_default_company(user=None): From ca9f9de39ffa66a810aa8e790e6658f3fe1ffef5 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Wed, 25 Feb 2026 06:34:28 +0000 Subject: [PATCH 09/85] chore(release): Bumped to Version 16.7.0 # [16.7.0](https://github.com/frappe/erpnext/compare/v16.6.1...v16.7.0) (2026-02-25) ### Bug Fixes * **`fiscal_year_company`:** made `company` field mandatory ([54bed64](https://github.com/frappe/erpnext/commit/54bed643562179891467cb74ff634d7784292d4f)) * **`fiscal_year`:** `Fiscal Year` auto-generation and notification ([92c2c7b](https://github.com/frappe/erpnext/commit/92c2c7bf826ee1cfe58011ddcdadf259b0f6c153)) * Add handling for Sales Invoice Item quantity field ([f6a1ea8](https://github.com/frappe/erpnext/commit/f6a1ea804a6a4d61df43f2b9b75178c4cc3b8234)) * add missing property_type ([dd41f2c](https://github.com/frappe/erpnext/commit/dd41f2ceb75a53ffcdf65e7934397c38b84e0bca)) * add purchase invoice as well ([2d864bb](https://github.com/frappe/erpnext/commit/2d864bb599f44b325f2d4a00f3ea836a36f0db87)) * addresses portal (backport [#52712](https://github.com/frappe/erpnext/issues/52712)) ([#52786](https://github.com/frappe/erpnext/issues/52786)) ([d7b61b9](https://github.com/frappe/erpnext/commit/d7b61b945f07902a542597f12e813e9c55dc0991)) * **asset:** handle partial asset sales by splitting remaining quantity (backport [#51363](https://github.com/frappe/erpnext/issues/51363)) ([#52394](https://github.com/frappe/erpnext/issues/52394)) ([10be8f1](https://github.com/frappe/erpnext/commit/10be8f19e211fd7fa5b420dcee9d0f62b065d817)) * avoid duplicate taxes and charges rows in payment entry (backport [#52178](https://github.com/frappe/erpnext/issues/52178)) ([#52319](https://github.com/frappe/erpnext/issues/52319)) ([e6f7a7e](https://github.com/frappe/erpnext/commit/e6f7a7e979fffd5c24b1be4076a393efdf84c1ef)) * better permissions on make payment request ([a5c83dd](https://github.com/frappe/erpnext/commit/a5c83dd11ec27030bd29e62a3210afbe89ad090a)) * bug with comparison regarding `None` values and empty string ([66d1b7c](https://github.com/frappe/erpnext/commit/66d1b7c837977a64898edc34909fb1ff998723a9)) * check gl account of an associated bank account in bank transaction ([746b5d9](https://github.com/frappe/erpnext/commit/746b5d96de47d441a5642ef90ae58498c1aa256b)) * enfore permission on make_payment_request ([8184599](https://github.com/frappe/erpnext/commit/81845992a65597f64db961a75e1f47dc570ca0ad)) * fiscal year notification subject ([e8c5d57](https://github.com/frappe/erpnext/commit/e8c5d5710d0d38a001b3d7f1aa9733b82eeaab21)) * get employee email with priority if preferred is not set ([116361c](https://github.com/frappe/erpnext/commit/116361c1dc983d563f3e491140d4775cdfd7136c)) * ignore permissions instead of saving parent ([715dbc0](https://github.com/frappe/erpnext/commit/715dbc00931b547915e1f944f1dc004c0197050f)) * inconsistent label name between parent and child ([b56c444](https://github.com/frappe/erpnext/commit/b56c444f185c2459ff91a7bda757f96a03e894f1)) * item code shows undefined ([0fd9fc4](https://github.com/frappe/erpnext/commit/0fd9fc48f33a5d787ca6a0a6f2063b53a1b30080)) * link field displays incorrect value when empty ([b67d42e](https://github.com/frappe/erpnext/commit/b67d42ee58d8d2f95832d8ffc8d10e876241ee36)) * **manufacturing:** remove delete query of job card & batch and serial no ([#52840](https://github.com/frappe/erpnext/issues/52840)) ([9ff924e](https://github.com/frappe/erpnext/commit/9ff924e8317a221a6c29ff90e652ca85ba84343b)) * **manufacturing:** set pick list purpose while creating it from work order ([131e279](https://github.com/frappe/erpnext/commit/131e279a0cd1668bd61934771ea63fd066580b93)) * **manufacturing:** update status for work order before calculating planned qty ([61d339c](https://github.com/frappe/erpnext/commit/61d339cfa72aeeeddb0a313a609a6678e04159f7)) * material request on receive notification condition ([785773b](https://github.com/frappe/erpnext/commit/785773b0ac084c7b76c6d2bbe67195653d97e82d)) * permission issue for quotation item during update item ([bccca6f](https://github.com/frappe/erpnext/commit/bccca6f58e3bc8c46985cd22666c0a72727a74c6)) * populate doctypes to be ignored table in validate ([237e458](https://github.com/frappe/erpnext/commit/237e4583e2f49bc112739afdf8504cbd4a572aa7)) * prevent precision errors in discount distribution with inclusive tax ([0e2e89c](https://github.com/frappe/erpnext/commit/0e2e89c355a711438895f27a9ffc4c4a1639b18d)) * **Purchase Receipt:** copy project from first row when adding items ([77da330](https://github.com/frappe/erpnext/commit/77da3306b5c9897ab387676bfe2a3a4019aceec1)) * remove form tour for sales and purchase order ([aac7fc3](https://github.com/frappe/erpnext/commit/aac7fc30d5a095a5c925219a5ceda66178ed4499)) * remove supplier invoice date/posting date validation ([cfad7e1](https://github.com/frappe/erpnext/commit/cfad7e17f12e0df8d050cf7f9af3dd6ec7657eba)) * reservation based on field should be read only in SRE ([a499b7e](https://github.com/frappe/erpnext/commit/a499b7e0469f4ce807228b80e7309a49b5202b37)) * sales and purchase modules forms clean-up (backport [#52875](https://github.com/frappe/erpnext/issues/52875)) ([#52911](https://github.com/frappe/erpnext/issues/52911)) ([2177098](https://github.com/frappe/erpnext/commit/217709836bf1d84c4c72bba5be251ffb6f7e1864)) * **sales-order:** update quotation status while cancelling sales order ([#52822](https://github.com/frappe/erpnext/issues/52822)) ([3a0f90c](https://github.com/frappe/erpnext/commit/3a0f90c433363ca5beea32fbd2b86302f74925ce)) * sensible insufficient stock message in pick list ([dbe2a87](https://github.com/frappe/erpnext/commit/dbe2a87a8463195bf02a5a14b0a266fae9c0cb4d)) * setup fails to set abbr to departments ([b15db05](https://github.com/frappe/erpnext/commit/b15db05ef87fc2248d6e4f2e0cb018151aeceef4)) * skip empty dimension values in exchange gain loss ([780b626](https://github.com/frappe/erpnext/commit/780b626ae50c94a93456d04feb1c140c4121867e)) * standalone sales invoice return should not fallback to item master for valuation rate ([6e1a808](https://github.com/frappe/erpnext/commit/6e1a8083a5db36137dc597dc1e00ee2e4a6b8132)) * supplier_type appears multiple times ([9a2eb91](https://github.com/frappe/erpnext/commit/9a2eb91eec67e8cda610f25a341a841068f4ee5e)) * test cases related to default letterhead change ([1e64dea](https://github.com/frappe/erpnext/commit/1e64dea6a078c3fe388220017aac3036ea1af114)) * typo ([d0c2cc8](https://github.com/frappe/erpnext/commit/d0c2cc848c11d2800ed6bf3cf892263ca2904595)) * typo ([0c4b9ea](https://github.com/frappe/erpnext/commit/0c4b9ea9ca779d5467e179a78b96ba2854278041)) * unable to submit subcontracting order if created from material request ([c5bc92d](https://github.com/frappe/erpnext/commit/c5bc92d50ee1a3e81d9e1ade8adc6c4f1ee5a4b8)) * unhide book_advance_payments_in_separate_party_account check field in Payment Entry doctype ([13d153c](https://github.com/frappe/erpnext/commit/13d153c196c7e1cbd066c4bcbedd8b137116edef)) * update items fetches wrong item code ([3355c60](https://github.com/frappe/erpnext/commit/3355c60c799a9dfc0a2da0a975a1bbaab4a5781f)) * update modified timestamp in json ([74a3965](https://github.com/frappe/erpnext/commit/74a3965a12b61761739c96d12f103959fd0b6e87)) * use stock qty instead of qty when updating transferred qty in WO ([90e61ab](https://github.com/frappe/erpnext/commit/90e61abff44da5ac94903a123ab65c770a236626)) * user permission on reports (backport [#52709](https://github.com/frappe/erpnext/issues/52709)) ([#52757](https://github.com/frappe/erpnext/issues/52757)) ([893683a](https://github.com/frappe/erpnext/commit/893683a512e0e00ad420b1ccf3ff0c5c7598b909)) * **work_order:** update returned qty ([c4ba3c9](https://github.com/frappe/erpnext/commit/c4ba3c9c4b788b0e009e4bf3dab9208f90ec8d2e)) ### Features * default letterhead and print format ([4adcc1c](https://github.com/frappe/erpnext/commit/4adcc1c52167304b26b624291095f1e0512bae04)) * **Journal Entry Account:** add Bank Transaction as Reference Type (backport [#52760](https://github.com/frappe/erpnext/issues/52760)) ([#52816](https://github.com/frappe/erpnext/issues/52816)) ([2c5bdef](https://github.com/frappe/erpnext/commit/2c5bdefd1367c45016025a72daada40d4bc4cba2)) * module onboarding ([858119f](https://github.com/frappe/erpnext/commit/858119f907f736ac3127a3cd448e2a8951fd5431)) * **payment request:** create payment request as per payment schedules ([751a081](https://github.com/frappe/erpnext/commit/751a0812538cf77c0967f4356f9d1275466f8d26)) * **payment_request:** add option to calculate request amount using payment schedule ([298ea33](https://github.com/frappe/erpnext/commit/298ea33922700f094e1d7e38249e0f3f2dd0f09a)) * retrieve employee basic contact information ([f701407](https://github.com/frappe/erpnext/commit/f701407e23e3c7b450596e6809d60223eb4d4053)) * retrieve employee contact details ([94f9f8b](https://github.com/frappe/erpnext/commit/94f9f8b30a4c432a2785301c442338cdb9fc70a4)) * standard print format for Sales Order and Purchase Invoice ([222f51b](https://github.com/frappe/erpnext/commit/222f51b4d02edf5c84fad50c365e9f04de454e21)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 15589b1dc24..5c19e15db66 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.6.1" +__version__ = "16.7.0" def get_default_company(user=None): From c3700f1b31f26de4a2738550a2b170e14e3a89f6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 25 Feb 2026 17:23:57 +0530 Subject: [PATCH 10/85] fix: patch to complete onboarding stpes for existing records (cherry picked from commit d90ec49241d1e65aad267a09a92d61ea2bb3e82c) # Conflicts: # erpnext/patches.txt (cherry picked from commit 941a78e1a8d2932bb15c022d05739cfc5bcf2eac) --- .../asset_onboarding/asset_onboarding.json | 4 +-- .../learn_asset/learn_asset.json | 2 +- .../buying_onboarding/buying_onboarding.json | 4 +-- .../create_item/create_item.json | 4 +-- .../create_purchase_invoice.json | 2 +- .../create_purchase_order.json | 2 +- .../create_supplier/create_supplier.json | 2 +- .../review_buying_settings.json | 2 +- .../setup_company/setup_company.json | 21 ----------- .../view_purchase_order_analysis.json | 2 +- .../manufacturing_onboarding.json | 4 +-- .../view_work_order_summary_report.json | 2 +- erpnext/patches.txt | 4 +++ ...mplete_onboarding_steps_for_older_sites.py | 36 +++++++++++++++++++ .../projects_onboarding.json | 4 +-- .../selling_onboarding.json | 4 +-- .../create_customer/create_customer.json | 2 +- .../create_item/create_item.json | 4 +-- .../setup_company/setup_company.json | 21 ----------- .../stock_onboarding/stock_onboarding.json | 4 +-- .../create_item/create_item.json | 4 +-- .../subcontracting_onboarding.json | 4 +-- 22 files changed, 68 insertions(+), 70 deletions(-) delete mode 100644 erpnext/buying/onboarding_step/setup_company/setup_company.json create mode 100644 erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py delete mode 100644 erpnext/selling/onboarding_step/setup_company/setup_company.json diff --git a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json index fe4bac23091..b0b4b35094f 100644 --- a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json +++ b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json @@ -15,7 +15,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-23 22:51:11.027665", + "modified": "2026-02-25 16:59:52.159087", "modified_by": "Administrator", "module": "Assets", "name": "Asset Onboarding", @@ -40,5 +40,5 @@ "step": "View Balance Sheet" } ], - "title": "Assets Setup!" + "title": "Assets Setup" } diff --git a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json index 54377ef0ac2..baf2f186592 100644 --- a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json +++ b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:44:25.734547", + "modified": "2026-02-25 15:09:37.450763", "modified_by": "Administrator", "name": "Learn Asset", "owner": "Administrator", diff --git a/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json index 96d08fecb1a..814c87f27d0 100644 --- a/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json +++ b/erpnext/buying/module_onboarding/buying_onboarding/buying_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-24 16:57:55.172763", + "modified": "2026-02-25 16:59:28.328912", "modified_by": "Administrator", "module": "Buying", "name": "Buying Onboarding", @@ -37,5 +37,5 @@ "step": "Review Buying Settings" } ], - "title": "Buying Setup! " + "title": "Buying Setup" } diff --git a/erpnext/buying/onboarding_step/create_item/create_item.json b/erpnext/buying/onboarding_step/create_item/create_item.json index f1dc6a0ac91..8e1420e2add 100644 --- a/erpnext/buying/onboarding_step/create_item/create_item.json +++ b/erpnext/buying/onboarding_step/create_item/create_item.json @@ -4,11 +4,11 @@ "creation": "2026-02-19 12:38:40.865013", "docstatus": 0, "doctype": "Onboarding Step", - "idx": 7, + "idx": 8, "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-24 16:57:14.098288", + "modified": "2026-02-25 16:58:56.384284", "modified_by": "Administrator", "name": "Create Item", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json b/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json index 8c35d155793..a3c63749621 100644 --- a/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json +++ b/erpnext/buying/onboarding_step/create_purchase_invoice/create_purchase_invoice.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 20:26:00.223899", + "modified": "2026-02-25 16:58:56.386439", "modified_by": "Administrator", "name": "Create Purchase Invoice", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json index c39c5404046..b743a06c086 100644 --- a/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json +++ b/erpnext/buying/onboarding_step/create_purchase_order/create_purchase_order.json @@ -9,7 +9,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-24 16:57:37.904322", + "modified": "2026-02-25 16:58:56.379480", "modified_by": "Administrator", "name": "Create Purchase Order", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/create_supplier/create_supplier.json b/erpnext/buying/onboarding_step/create_supplier/create_supplier.json index 580fefedf16..470011efd5e 100644 --- a/erpnext/buying/onboarding_step/create_supplier/create_supplier.json +++ b/erpnext/buying/onboarding_step/create_supplier/create_supplier.json @@ -10,7 +10,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:16:40.903633", + "modified": "2026-02-25 16:58:56.375824", "modified_by": "Administrator", "name": "Create Supplier", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json index 2703b14c6f9..52038d11800 100644 --- a/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json +++ b/erpnext/buying/onboarding_step/review_buying_settings/review_buying_settings.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 1, "is_skipped": 0, - "modified": "2026-02-24 16:57:14.031766", + "modified": "2026-02-25 16:58:56.388794", "modified_by": "Administrator", "name": "Review Buying Settings", "owner": "Administrator", diff --git a/erpnext/buying/onboarding_step/setup_company/setup_company.json b/erpnext/buying/onboarding_step/setup_company/setup_company.json deleted file mode 100644 index 89ae9a52553..00000000000 --- a/erpnext/buying/onboarding_step/setup_company/setup_company.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "action": "Go to Page", - "action_label": "Set up company", - "creation": "2026-02-20 11:12:50.373049", - "docstatus": 0, - "doctype": "Onboarding Step", - "idx": 1, - "is_complete": 0, - "is_single": 0, - "is_skipped": 0, - "modified": "2026-02-22 16:44:20.499954", - "modified_by": "Administrator", - "name": "Setup Company", - "owner": "Administrator", - "path": "company", - "reference_document": "Company", - "show_form_tour": 0, - "show_full_form": 0, - "title": "Setup Company", - "validate_action": 1 -} diff --git a/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json b/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json index 656b5c1fb44..9583034f337 100644 --- a/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json +++ b/erpnext/buying/onboarding_step/view_purchase_order_analysis/view_purchase_order_analysis.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:44:35.794807", + "modified": "2026-02-25 10:33:43.731928", "modified_by": "Administrator", "name": "View Purchase Order Analysis", "owner": "Administrator", diff --git a/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json b/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json index 613b855aee4..be86ce22c9b 100644 --- a/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json +++ b/erpnext/manufacturing/module_onboarding/manufacturing_onboarding/manufacturing_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-23 22:51:27.390568", + "modified": "2026-02-25 16:59:39.508221", "modified_by": "Administrator", "module": "Manufacturing", "name": "Manufacturing Onboarding", @@ -40,5 +40,5 @@ "step": "Review Manufacturing Settings" } ], - "title": "Manufacturing Setup!" + "title": "Manufacturing Setup" } diff --git a/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json b/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json index 62875c8904f..16b8a54b13a 100644 --- a/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json +++ b/erpnext/manufacturing/onboarding_step/view_work_order_summary_report/view_work_order_summary_report.json @@ -8,7 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 22:44:32.658354", + "modified": "2026-02-25 16:49:31.440969", "modified_by": "Administrator", "name": "View Work Order Summary Report", "owner": "Administrator", diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1a488324212..d90b4eda72a 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -467,3 +467,7 @@ erpnext.patches.v16_0.update_company_custom_field_in_bin erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v15_0.delete_quotation_lost_record_detail erpnext.patches.v16_0.add_portal_redirects +<<<<<<< HEAD +======= +erpnext.patches.v16_0.complete_onboarding_steps_for_older_sites #2 +>>>>>>> d90ec49241 (fix: patch to complete onboarding stpes for existing records) diff --git a/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py b/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py new file mode 100644 index 00000000000..73d50a976ee --- /dev/null +++ b/erpnext/patches/v16_0/complete_onboarding_steps_for_older_sites.py @@ -0,0 +1,36 @@ +import frappe +from frappe.utils import date_diff, getdate, today + + +def execute(): + steps = frappe.get_all( + "Onboarding Step", + filters={"is_complete": 0}, + fields=["name", "action", "reference_document"], + ) + + if not steps: + return + + company_creation = frappe.get_all("Company", fields=["creation"], order_by="creation asc", limit=1) + days_diff = date_diff(getdate(today()), getdate(company_creation[0].creation)) + + if days_diff > 15: + complete_all_onboarding_steps(steps) + else: + complete_onboarding_steps_if_record_exists(steps) + + +def complete_all_onboarding_steps(steps): + for step in steps: + frappe.db.set_value("Onboarding Step", step.name, "is_complete", 1, update_modified=False) + + +def complete_onboarding_steps_if_record_exists(steps): + for step in steps: + if ( + step.action == "Create Entry" + and step.reference_document + and frappe.get_all(step.reference_document, limit=1) + ): + frappe.db.set_value("Onboarding Step", step.name, "is_complete", 1, update_modified=False) diff --git a/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json b/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json index 64cc95e1b2d..1316558a0bb 100644 --- a/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json +++ b/erpnext/projects/module_onboarding/projects_onboarding/projects_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-23 22:50:58.003699", + "modified": "2026-02-25 16:59:59.005097", "modified_by": "Administrator", "module": "Projects", "name": "Projects Onboarding", @@ -31,5 +31,5 @@ "step": "View Project Summary" } ], - "title": "Projects Setup!" + "title": "Projects Setup" } diff --git a/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json index d211ab6abf1..10e7ce5b33f 100644 --- a/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json +++ b/erpnext/selling/module_onboarding/selling_onboarding/selling_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 1, "is_complete": 0, - "modified": "2026-02-24 16:57:50.753045", + "modified": "2026-02-25 16:59:32.154164", "modified_by": "Administrator", "module": "Selling", "name": "Selling Onboarding", @@ -37,5 +37,5 @@ "step": "Review Selling Settings" } ], - "title": "Selling Setup!" + "title": "Selling Setup" } diff --git a/erpnext/selling/onboarding_step/create_customer/create_customer.json b/erpnext/selling/onboarding_step/create_customer/create_customer.json index 142c395e55c..bd03a710b80 100644 --- a/erpnext/selling/onboarding_step/create_customer/create_customer.json +++ b/erpnext/selling/onboarding_step/create_customer/create_customer.json @@ -5,7 +5,7 @@ "docstatus": 0, "doctype": "Onboarding Step", "form_tour": "Customer Form Tour", - "idx": 0, + "idx": 1, "is_complete": 0, "is_single": 0, "is_skipped": 0, diff --git a/erpnext/selling/onboarding_step/create_item/create_item.json b/erpnext/selling/onboarding_step/create_item/create_item.json index f1dc6a0ac91..8e1420e2add 100644 --- a/erpnext/selling/onboarding_step/create_item/create_item.json +++ b/erpnext/selling/onboarding_step/create_item/create_item.json @@ -4,11 +4,11 @@ "creation": "2026-02-19 12:38:40.865013", "docstatus": 0, "doctype": "Onboarding Step", - "idx": 7, + "idx": 8, "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-24 16:57:14.098288", + "modified": "2026-02-25 16:58:56.384284", "modified_by": "Administrator", "name": "Create Item", "owner": "Administrator", diff --git a/erpnext/selling/onboarding_step/setup_company/setup_company.json b/erpnext/selling/onboarding_step/setup_company/setup_company.json deleted file mode 100644 index 98c2d9fa693..00000000000 --- a/erpnext/selling/onboarding_step/setup_company/setup_company.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "action": "Go to Page", - "action_label": "Setup Company", - "creation": "2026-02-20 11:12:50.373049", - "docstatus": 0, - "doctype": "Onboarding Step", - "idx": 1, - "is_complete": 0, - "is_single": 0, - "is_skipped": 0, - "modified": "2026-02-20 11:37:46.922137", - "modified_by": "Administrator", - "name": "Setup Company", - "owner": "Administrator", - "path": "company", - "reference_document": "Company", - "show_form_tour": 0, - "show_full_form": 0, - "title": "Setup Company", - "validate_action": 1 -} diff --git a/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json b/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json index dbc838eb83c..a910f1a5c22 100644 --- a/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json +++ b/erpnext/stock/module_onboarding/stock_onboarding/stock_onboarding.json @@ -12,7 +12,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, - "modified": "2026-02-23 22:51:17.460108", + "modified": "2026-02-25 16:59:45.630766", "modified_by": "Administrator", "module": "Stock", "name": "Stock Onboarding", @@ -40,5 +40,5 @@ "step": "Review Stock Settings" } ], - "title": "Stock Setup!" + "title": "Stock Setup" } diff --git a/erpnext/stock/onboarding_step/create_item/create_item.json b/erpnext/stock/onboarding_step/create_item/create_item.json index eb917d65b4f..8e1420e2add 100644 --- a/erpnext/stock/onboarding_step/create_item/create_item.json +++ b/erpnext/stock/onboarding_step/create_item/create_item.json @@ -4,11 +4,11 @@ "creation": "2026-02-19 12:38:40.865013", "docstatus": 0, "doctype": "Onboarding Step", - "idx": 7, + "idx": 8, "is_complete": 0, "is_single": 0, "is_skipped": 0, - "modified": "2026-02-23 20:30:37.698459", + "modified": "2026-02-25 16:58:56.384284", "modified_by": "Administrator", "name": "Create Item", "owner": "Administrator", diff --git a/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json b/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json index afd9160103b..867dca4a380 100644 --- a/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json +++ b/erpnext/subcontracting/module_onboarding/subcontracting_onboarding/subcontracting_onboarding.json @@ -15,7 +15,7 @@ "doctype": "Module Onboarding", "idx": 1, "is_complete": 0, - "modified": "2026-02-23 22:51:04.595547", + "modified": "2026-02-25 16:59:55.409759", "modified_by": "Administrator", "module": "Subcontracting", "name": "Subcontracting Onboarding", @@ -43,5 +43,5 @@ "step": "Create Subcontracting Order" } ], - "title": "Subcontracting Setup!" + "title": "Subcontracting Setup" } From 76d27877c2c74c359dfb04769fca995ff2786bf8 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 25 Feb 2026 18:13:42 +0530 Subject: [PATCH 11/85] chore: fix conflicts (cherry picked from commit 8f922382e4780d9591a53e37bfb9c477df22e2b4) --- erpnext/patches.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index d90b4eda72a..3c59e1ff550 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -467,7 +467,4 @@ erpnext.patches.v16_0.update_company_custom_field_in_bin erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v15_0.delete_quotation_lost_record_detail erpnext.patches.v16_0.add_portal_redirects -<<<<<<< HEAD -======= erpnext.patches.v16_0.complete_onboarding_steps_for_older_sites #2 ->>>>>>> d90ec49241 (fix: patch to complete onboarding stpes for existing records) From 5d2822df978f97e3a1f6f434bf3a27afb262f264 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 26 Feb 2026 10:47:56 +0530 Subject: [PATCH 12/85] fix: broekn link of docs in asset onboarding (cherry picked from commit 1cdf439e38f4d0364e238e972bc0996d374f961b) (cherry picked from commit 5c48f74d4c1a833f40e6eca37de087080ebb2b49) # Conflicts: # erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json # erpnext/assets/onboarding_step/learn_asset/learn_asset.json --- .../asset_onboarding/asset_onboarding.json | 4 ++++ erpnext/assets/onboarding_step/learn_asset/learn_asset.json | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json index fe4bac23091..6985d41775d 100644 --- a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json +++ b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json @@ -15,7 +15,11 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, +<<<<<<< HEAD "modified": "2026-02-23 22:51:11.027665", +======= + "modified": "2026-02-26 10:45:47.970714", +>>>>>>> 5c48f74d4c (fix: broekn link of docs in asset onboarding) "modified_by": "Administrator", "module": "Assets", "name": "Asset Onboarding", diff --git a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json index 54377ef0ac2..8e02f16cff4 100644 --- a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json +++ b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json @@ -8,11 +8,15 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, +<<<<<<< HEAD "modified": "2026-02-23 22:44:25.734547", +======= + "modified": "2026-02-26 10:44:59.557156", +>>>>>>> 5c48f74d4c (fix: broekn link of docs in asset onboarding) "modified_by": "Administrator", "name": "Learn Asset", "owner": "Administrator", - "path": "https://docs.frappe.io/erpnext/assets/setup/asset-category", + "path": "https://docs.frappe.io/erpnext/assets/introduction", "show_form_tour": 0, "show_full_form": 0, "title": "Learn Asset", From 6bebf5108780a05aad21503fec9149d08169b051 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 26 Feb 2026 11:30:57 +0530 Subject: [PATCH 13/85] chore: fix conflicts --- .../module_onboarding/asset_onboarding/asset_onboarding.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json index 6985d41775d..ba38d0af6f6 100644 --- a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json +++ b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json @@ -15,11 +15,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, -<<<<<<< HEAD - "modified": "2026-02-23 22:51:11.027665", -======= "modified": "2026-02-26 10:45:47.970714", ->>>>>>> 5c48f74d4c (fix: broekn link of docs in asset onboarding) "modified_by": "Administrator", "module": "Assets", "name": "Asset Onboarding", From 38c49dfed6e50d882d5266f33da9da439bf8d35c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 26 Feb 2026 11:31:16 +0530 Subject: [PATCH 14/85] chore: fix conflicts Updated the modified date in learn_asset.json. --- erpnext/assets/onboarding_step/learn_asset/learn_asset.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json index 8e02f16cff4..8feef0073f5 100644 --- a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json +++ b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json @@ -8,11 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, -<<<<<<< HEAD - "modified": "2026-02-23 22:44:25.734547", -======= "modified": "2026-02-26 10:44:59.557156", ->>>>>>> 5c48f74d4c (fix: broekn link of docs in asset onboarding) "modified_by": "Administrator", "name": "Learn Asset", "owner": "Administrator", From 5d86e9697aaf935b14359bc5f62c8c892a8100d5 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 26 Feb 2026 06:03:21 +0000 Subject: [PATCH 15/85] chore(release): Bumped to Version 16.7.1 ## [16.7.1](https://github.com/frappe/erpnext/compare/v16.7.0...v16.7.1) (2026-02-26) ### Bug Fixes * patch to complete onboarding stpes for existing records ([c3700f1](https://github.com/frappe/erpnext/commit/c3700f1b31f26de4a2738550a2b170e14e3a89f6)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 5c19e15db66..51a41a8bfc4 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.7.0" +__version__ = "16.7.1" def get_default_company(user=None): From e1782901e4fd402ce9f547a25d4fcfc108776912 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 26 Feb 2026 06:48:40 +0000 Subject: [PATCH 16/85] chore(release): Bumped to Version 16.7.2 ## [16.7.2](https://github.com/frappe/erpnext/compare/v16.7.1...v16.7.2) (2026-02-26) ### Bug Fixes * broekn link of docs in asset onboarding ([5d2822d](https://github.com/frappe/erpnext/commit/5d2822df978f97e3a1f6f434bf3a27afb262f264)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 51a41a8bfc4..b4439c23ad2 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.7.1" +__version__ = "16.7.2" def get_default_company(user=None): From e7e52851d677e025dfa95c63992196ed79844b04 Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Thu, 29 Jan 2026 16:05:22 +0530 Subject: [PATCH 17/85] fix(payment entry): round unallocated amount (cherry picked from commit b0d67517778daa3a5f527c7729c9862b1194d36e) --- .../doctype/payment_entry/payment_entry.py | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 350e8b700a9..b7cd768a829 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -1082,20 +1082,32 @@ class PaymentEntry(AccountsController): self.base_paid_amount + deductions_to_consider ): self.unallocated_amount = ( - self.base_paid_amount - + deductions_to_consider - - self.base_total_allocated_amount - - included_taxes - ) / self.source_exchange_rate + flt( + ( + self.base_paid_amount + + deductions_to_consider + - self.base_total_allocated_amount + - included_taxes + ), + self.precision("unallocated_amount"), + ) + / self.source_exchange_rate + ) elif self.payment_type == "Pay" and self.base_total_allocated_amount < ( self.base_received_amount - deductions_to_consider ): self.unallocated_amount = ( - self.base_received_amount - - deductions_to_consider - - self.base_total_allocated_amount - - included_taxes - ) / self.target_exchange_rate + flt( + ( + self.base_received_amount + - deductions_to_consider + - self.base_total_allocated_amount + - included_taxes + ), + self.precision("unallocated_amount"), + ) + / self.target_exchange_rate + ) def set_exchange_gain_loss(self): exchange_gain_loss = flt( From e671f5a3ac7f6eab682454bf4aa3357d5b901509 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 26 Feb 2026 08:29:46 +0000 Subject: [PATCH 18/85] chore(release): Bumped to Version 16.7.3 ## [16.7.3](https://github.com/frappe/erpnext/compare/v16.7.2...v16.7.3) (2026-02-26) ### Bug Fixes * **payment entry:** round unallocated amount ([e7e5285](https://github.com/frappe/erpnext/commit/e7e52851d677e025dfa95c63992196ed79844b04)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index b4439c23ad2..cd0d56fca5f 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document from frappe.utils.user import is_website_user -__version__ = "16.7.2" +__version__ = "16.7.3" def get_default_company(user=None): From c61c748cbd21eb84725c9e8425884a4d330fc8cc Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Thu, 26 Feb 2026 14:28:25 +0530 Subject: [PATCH 19/85] fix(payment_entry): fix precision for `total_allocated_amount` and `base_total_allocated_amount` Co-authored-by: Ahuahuachi (cherry picked from commit d82a0a9455e83ad6dadd15e8bfa7dad59e36c0f8) --- erpnext/accounts/doctype/payment_entry/payment_entry.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index b7cd768a829..c68672466c2 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -1065,8 +1065,12 @@ class PaymentEntry(AccountsController): total_allocated_amount += flt(d.allocated_amount) base_total_allocated_amount += self.calculate_base_allocated_amount_for_reference(d) - self.total_allocated_amount = abs(total_allocated_amount) - self.base_total_allocated_amount = abs(base_total_allocated_amount) + self.total_allocated_amount = flt( + abs(total_allocated_amount), self.precision("total_allocated_amount") + ) + self.base_total_allocated_amount = flt( + abs(base_total_allocated_amount), self.precision("base_total_allocated_amount") + ) def set_unallocated_amount(self): self.unallocated_amount = 0 From 865895649e7f70219f7a753d933ce568b02fbf6e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 07:40:41 +0000 Subject: [PATCH 20/85] fix: `Trial Balance` and `Consolidated Trial Balance` total row calculation (backport #53014) (#53015) Co-authored-by: diptanilsaha --- .../consolidated_trial_balance.js | 6 ++ .../consolidated_trial_balance.py | 64 +++++++------------ .../report/trial_balance/trial_balance.py | 22 +++++-- 3 files changed, 43 insertions(+), 49 deletions(-) diff --git a/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js b/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js index 65f2e3b905a..df023f91c02 100644 --- a/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js +++ b/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.js @@ -86,6 +86,12 @@ frappe.query_reports["Consolidated Trial Balance"] = { fieldtype: "Check", default: 1, }, + { + fieldname: "show_net_values", + label: __("Show net values in opening and closing columns"), + fieldtype: "Check", + default: 1, + }, { fieldname: "show_group_accounts", label: __("Show Group Accounts"), diff --git a/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py b/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py index 78201ca63c6..fc4affad3a7 100644 --- a/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py +++ b/erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py @@ -14,6 +14,7 @@ from erpnext.accounts.report.financial_statements import ( ) from erpnext.accounts.report.trial_balance.trial_balance import ( accumulate_values_into_parents, + calculate_total_row, calculate_values, get_opening_balances, hide_group_accounts, @@ -44,7 +45,6 @@ def execute(filters: dict | None = None): def validate_filters(filters): validate_companies(filters) - filters.show_net_values = True tb_validate_filters(filters) @@ -99,16 +99,20 @@ def get_data(filters) -> list[list]: tb_data = get_company_wise_tb_data(company_filter, reporting_currency, ignore_reporting_currency) consolidate_trial_balance_data(data, tb_data) - for d in data: - prepare_opening_closing(d) - - total_row = calculate_total_row(data, reporting_currency) - - data.extend([{}, total_row]) + if filters.get("show_net_values"): + prepare_opening_closing_for_ctb(data) if not filters.get("show_group_accounts"): data = hide_group_accounts(data) + total_row = calculate_total_row( + data, reporting_currency, show_group_accounts=filters.get("show_group_accounts") + ) + + calculate_foreign_currency_translation_reserve(total_row, data, filters=filters) + + data.extend([total_row]) + if filters.get("presentation_currency"): update_to_presentation_currency( data, @@ -207,10 +211,6 @@ def prepare_companywise_tb_data(accounts, filters, parent_children_map, reportin data = [] for d in accounts: - # Prepare opening closing for group account - if parent_children_map.get(d.account) and filters.get("show_net_values"): - prepare_opening_closing(d) - has_value = False row = { "account": d.name, @@ -242,35 +242,9 @@ def prepare_companywise_tb_data(accounts, filters, parent_children_map, reportin return data -def calculate_total_row(data, reporting_currency): - total_row = { - "account": "'" + _("Total") + "'", - "account_name": "'" + _("Total") + "'", - "warn_if_negative": True, - "opening_debit": 0.0, - "opening_credit": 0.0, - "debit": 0.0, - "credit": 0.0, - "closing_debit": 0.0, - "closing_credit": 0.0, - "parent_account": None, - "indent": 0, - "has_value": True, - "currency": reporting_currency, - } - - for d in data: - if not d.get("parent_account"): - for field in value_fields: - total_row[field] += d[field] - - if data: - calculate_foreign_currency_translation_reserve(total_row, data) - - return total_row - - -def calculate_foreign_currency_translation_reserve(total_row, data): +def calculate_foreign_currency_translation_reserve(total_row, data, filters): + if not data or not total_row: + return opening_dr_cr_diff = total_row["opening_debit"] - total_row["opening_credit"] dr_cr_diff = total_row["debit"] - total_row["credit"] @@ -289,7 +263,7 @@ def calculate_foreign_currency_translation_reserve(total_row, data): "root_type": data[idx].get("root_type"), "account_type": "Equity", "parent_account": data[idx].get("account"), - "indent": data[idx].get("indent") + 1, + "indent": data[idx].get("indent") + 1 if filters.get("show_group_accounts") else 0, "has_value": True, "currency": total_row.get("currency"), } @@ -297,7 +271,8 @@ def calculate_foreign_currency_translation_reserve(total_row, data): fctr_row["closing_debit"] = fctr_row["opening_debit"] + fctr_row["debit"] fctr_row["closing_credit"] = fctr_row["opening_credit"] + fctr_row["credit"] - prepare_opening_closing(fctr_row) + if filters.get("show_net_values"): + prepare_opening_closing(fctr_row) data.insert(idx + 1, fctr_row) @@ -396,6 +371,11 @@ def update_to_presentation_currency(data, from_currency, to_currency, date, igno d.update(currency=to_currency) +def prepare_opening_closing_for_ctb(data): + for d in data: + prepare_opening_closing(d) + + def get_columns(): return [ { diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py index 66185c94297..186a9eb71f0 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.py +++ b/erpnext/accounts/report/trial_balance/trial_balance.py @@ -390,7 +390,7 @@ def calculate_values( prepare_opening_closing(d) -def calculate_total_row(accounts, company_currency): +def calculate_total_row(data, company_currency, show_group_accounts=True): total_row = { "account": "'" + _("Total") + "'", "account_name": "'" + _("Total") + "'", @@ -407,10 +407,16 @@ def calculate_total_row(accounts, company_currency): "currency": company_currency, } - for d in accounts: - if not d.parent_account: - for field in value_fields: - total_row[field] += d[field] + def sum_value_fields(row): + for field in value_fields: + total_row[field] += row[field] + + for d in data: + if not show_group_accounts: + sum_value_fields(d) + + elif show_group_accounts and not d.get("parent_account"): + sum_value_fields(d) return total_row @@ -456,11 +462,13 @@ def prepare_data(accounts, filters, parent_children_map, company_currency): row["has_value"] = has_value data.append(row) - total_row = calculate_total_row(accounts, company_currency) - if not filters.get("show_group_accounts"): data = hide_group_accounts(data) + total_row = calculate_total_row( + data, company_currency, show_group_accounts=filters.get("show_group_accounts") + ) + data.extend([{}, total_row]) return data From 6727c86d0a762a084d764e507f5d3a590d5eebc6 Mon Sep 17 00:00:00 2001 From: Thomas antony <77287334+thomasantony12@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:11:28 +0530 Subject: [PATCH 21/85] feat: UOM query filter for opportunity items Add UOM query filter based on item code in opportunity form. (cherry picked from commit b33f06701c13a9c6d543349c73de1f13f9155a6b) --- erpnext/crm/doctype/opportunity/opportunity.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js index 74251e21b3c..1bda0e5568f 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.js +++ b/erpnext/crm/doctype/opportunity/opportunity.js @@ -307,6 +307,21 @@ erpnext.crm.Opportunity = class Opportunity extends frappe.ui.form.Controller { }; }); + this.frm.set_query("uom", "items", function (doc, cdt, cdn) { + let row = locals[cdt][cdn]; + + if (!row.item_code) { + return; + } + + return { + query: "erpnext.controllers.queries.get_item_uom_query", + filters: { + item_code: row.item_code, + }, + }; + }); + me.frm.set_query("contact_person", erpnext.queries["contact_query"]); if (me.frm.doc.opportunity_from == "Lead") { From ea5ad3179cf4a4601f8035b0b8ef7df8a3362b22 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 27 Feb 2026 12:00:16 +0530 Subject: [PATCH 22/85] fix: old stock reco entries causing issue in the stock balance report (cherry picked from commit 0874cbc268b6e33072a18c220de43e317308e732) --- .../report/stock_balance/stock_balance.py | 37 +++++++++++++++++-- .../stock_ledger_invariant_check.js | 2 +- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index ccee40ce25f..c4c67c4abaf 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -8,7 +8,7 @@ from typing import Any, TypedDict import frappe from frappe import _ -from frappe.query_builder.functions import Coalesce +from frappe.query_builder.functions import Coalesce, Count from frappe.utils import add_days, cint, date_diff, flt, getdate from frappe.utils.nestedset import get_descendants_of @@ -165,6 +165,7 @@ class StockBalanceReport: sle.serial_no, sle.serial_and_batch_bundle, sle.has_serial_no, + sle.voucher_detail_no, item_table.item_group, item_table.stock_uom, item_table.item_name, @@ -190,6 +191,8 @@ class StockBalanceReport: if self.filters.get("show_stock_ageing_data"): self.sle_entries = self.sle_query.run(as_dict=True) + self.prepare_stock_reco_voucher_wise_count() + # HACK: This is required to avoid causing db query in flt _system_settings = frappe.get_cached_doc("System Settings") with frappe.db.unbuffered_cursor(): @@ -207,6 +210,30 @@ class StockBalanceReport: self.item_warehouse_map, self.float_precision, self.inventory_dimensions ) + def prepare_stock_reco_voucher_wise_count(self): + self.stock_reco_voucher_wise_count = frappe._dict() + + doctype = frappe.qb.DocType("Stock Ledger Entry") + item = frappe.qb.DocType("Item") + + query = ( + frappe.qb.from_(doctype) + .inner_join(item) + .on(doctype.item_code == item.name) + .select(doctype.voucher_detail_no, Count(doctype.name).as_("count")) + .where( + (doctype.voucher_type == "Stock Reconciliation") + & (doctype.docstatus < 2) + & (doctype.is_cancelled == 0) + & (item.has_serial_no == 1) + ) + .groupby(doctype.voucher_detail_no) + ) + + data = query.run(as_list=True) + if data: + self.stock_reco_voucher_wise_count = frappe._dict(data) + def prepare_new_data(self): if self.filters.get("show_stock_ageing_data"): self.filters["show_warehouse_wise_stock"] = True @@ -283,9 +310,13 @@ class StockBalanceReport: qty_dict[field] = entry.get(field) if entry.voucher_type == "Stock Reconciliation" and ( - not entry.batch_no and not entry.serial_no and not entry.serial_and_batch_bundle + not entry.batch_no or entry.serial_no or entry.serial_and_batch_bundle ): - qty_diff = flt(entry.qty_after_transaction) - flt(qty_dict.bal_qty) + if entry.serial_no and self.stock_reco_voucher_wise_count.get(entry.voucher_detail_no, 0) == 1: + qty_dict.bal_qty = 0.0 + qty_diff = flt(entry.actual_qty) + else: + qty_diff = flt(entry.qty_after_transaction) - flt(qty_dict.bal_qty) else: qty_diff = flt(entry.actual_qty) diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js index df65654e36b..1f405cda78f 100644 --- a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js +++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js @@ -21,7 +21,7 @@ frappe.query_reports["Stock Ledger Invariant Check"] = { options: "Item", get_query: function () { return { - filters: { is_stock_item: 1, has_serial_no: 0 }, + filters: { is_stock_item: 1 }, }; }, }, From e2800e343ebeea207a5955b8b0daee5faaa7e3b2 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Thu, 26 Feb 2026 17:18:40 +0530 Subject: [PATCH 23/85] refactor: use query builder for Tax Rule validation query (cherry picked from commit 235e3adbcb7f436521a5319185f0383e3abc7b86) --- erpnext/accounts/doctype/tax_rule/tax_rule.py | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py index f122e41ef70..3a36e57ae60 100644 --- a/erpnext/accounts/doctype/tax_rule/tax_rule.py +++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py @@ -8,6 +8,8 @@ import frappe from frappe import _ from frappe.contacts.doctype.address.address import get_default_address from frappe.model.document import Document +from frappe.query_builder import DocType +from frappe.query_builder.functions import IfNull from frappe.utils import cstr from frappe.utils.nestedset import get_root_of @@ -83,6 +85,8 @@ class TaxRule(Document): frappe.throw(_("Tax Template is mandatory.")) def validate_filters(self): + TaxRule = DocType("Tax Rule") + filters = { "tax_type": self.tax_type, "customer": self.customer, @@ -105,33 +109,34 @@ class TaxRule(Document): "company": self.company, } - conds = "" - for d in filters: - if conds: - conds += " and " - conds += f"""ifnull({d}, '') = {frappe.db.escape(cstr(filters[d]))}""" - - if self.from_date and self.to_date: - conds += f""" and ((from_date > '{self.from_date}' and from_date < '{self.to_date}') or - (to_date > '{self.from_date}' and to_date < '{self.to_date}') or - ('{self.from_date}' > from_date and '{self.from_date}' < to_date) or - ('{self.from_date}' = from_date and '{self.to_date}' = to_date))""" - - elif self.from_date and not self.to_date: - conds += f""" and to_date > '{self.from_date}'""" - - elif self.to_date and not self.from_date: - conds += f""" and from_date < '{self.to_date}'""" - - tax_rule = frappe.db.sql( - f"select name, priority \ - from `tabTax Rule` where {conds} and name != '{self.name}'", - as_dict=1, + query = ( + frappe.qb.from_(TaxRule).select(TaxRule.name, TaxRule.priority).where(TaxRule.name != self.name) ) - if tax_rule: - if tax_rule[0].priority == self.priority: - frappe.throw(_("Tax Rule Conflicts with {0}").format(tax_rule[0].name), ConflictingTaxRule) + for field, value in filters.items(): + query = query.where(IfNull(TaxRule[field], "") == cstr(value)) + + if self.from_date and self.to_date: + query = query.where( + ((TaxRule.from_date > self.from_date) & (TaxRule.from_date < self.to_date)) + | ((TaxRule.to_date > self.from_date) & (TaxRule.to_date < self.to_date)) + | ((self.from_date > TaxRule.from_date) & (self.from_date < TaxRule.to_date)) + | ((TaxRule.from_date == self.from_date) & (TaxRule.to_date == self.to_date)) + ) + + elif self.from_date: + query = query.where(TaxRule.to_date > self.from_date) + + elif self.to_date: + query = query.where(TaxRule.from_date < self.to_date) + + tax_rule = query.run(as_dict=True) + + if tax_rule and tax_rule[0].priority == self.priority: + frappe.throw( + _("Tax Rule Conflicts with {0}").format(tax_rule[0].name), + ConflictingTaxRule, + ) @frappe.whitelist() From c28568f4fd026be07f20a80f954bd7f3e3886f25 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 26 Feb 2026 12:14:05 +0530 Subject: [PATCH 24/85] fix: same reposting entry picked by multiple rq jobs (cherry picked from commit 4dfbacfd9230365b2f4ce0875bb4d0f4c36628c5) --- .../repost_item_valuation.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py index d487fa091ed..f5b4ef3e8f5 100644 --- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py +++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py @@ -570,7 +570,20 @@ def run_parallel_reposting(): riv_entries = get_repost_item_valuation_entries() + rq_jobs = frappe.get_all( + "RQ Job", + fields=["arguments"], + filters={ + "status": ("like", "%started%"), + "job_name": "erpnext.stock.doctype.repost_item_valuation.repost_item_valuation.execute_reposting_entry", + }, + ) + for row in riv_entries: + if rq_jobs: + if job_running_for_entry(row.name, rq_jobs): + continue + if row.based_on != "Item and Warehouse" or row.repost_only_accounting_ledgers: execute_reposting_entry(row.name) continue @@ -719,3 +732,19 @@ def get_existing_reposting_only_gl_entries(reposting_reference): reposting_map[key] = d.reposting_reference return reposting_map + + +def job_running_for_entry(reposting_entry, rq_jobs): + for job in rq_jobs: + if not job.arguments: + continue + + try: + job_args = json.loads(job.arguments) + except (TypeError, json.JSONDecodeError): + continue + + if isinstance(job_args, dict) and job_args.get("kwargs", {}).get("name") == reposting_entry: + return True + + return False From f939e980a693e296656e126610837469dca421c3 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sun, 1 Mar 2026 14:48:17 +0530 Subject: [PATCH 25/85] fix: use conversion factor when creating stock entry from pick list (cherry picked from commit 5f12b0db3f2927acbab85da8fda41887bae7a604) --- erpnext/stock/doctype/pick_list/pick_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index 4d7f4586d6b..472502bd80e 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -1587,7 +1587,7 @@ def update_common_item_properties(item, location): item.item_code = location.item_code item.s_warehouse = location.warehouse item.transfer_qty = location.picked_qty - item.qty = location.qty + item.qty = flt(location.picked_qty / (location.conversion_factor or 1), location.precision("qty")) item.uom = location.uom item.conversion_factor = location.conversion_factor item.stock_uom = location.stock_uom From b26631d8b187df97ba81bccae1d79f41321af335 Mon Sep 17 00:00:00 2001 From: frappe-pr-bot Date: Sun, 1 Mar 2026 09:43:26 +0000 Subject: [PATCH 26/85] chore: update POT file --- erpnext/locale/main.pot | 1808 +++++++++++++++++++++++++-------------- 1 file changed, 1166 insertions(+), 642 deletions(-) diff --git a/erpnext/locale/main.pot b/erpnext/locale/main.pot index af2482560fe..7d4ba39e4a8 100644 --- a/erpnext/locale/main.pot +++ b/erpnext/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: ERPNext VERSION\n" "Report-Msgid-Bugs-To: hello@frappe.io\n" -"POT-Creation-Date: 2026-02-22 09:43+0000\n" -"PO-Revision-Date: 2026-02-22 09:43+0000\n" +"POT-Creation-Date: 2026-03-01 09:43+0000\n" +"PO-Revision-Date: 2026-03-01 09:43+0000\n" "Last-Translator: hello@frappe.io\n" "Language-Team: hello@frappe.io\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.16.0\n" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1475 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1485 msgid "" "\n" "\t\t\tThe Batch {0} of an item {1} has negative stock in the warehouse {2}{3}.\n" @@ -288,7 +288,7 @@ 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 "" @@ -315,7 +315,7 @@ 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 "" @@ -914,11 +914,11 @@ msgstr "" msgid "Your Shortcuts" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1008 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1133 msgid "Grand Total: {0}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:1009 +#: erpnext/accounts/doctype/payment_request/payment_request.py:1134 msgid "Outstanding Amount: {0}" msgstr "" @@ -973,7 +973,7 @@ msgstr "" msgid "A - C" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:329 +#: erpnext/selling/doctype/customer/customer.py:353 msgid "A Customer Group exists with same name please change the Customer name or rename the Customer Group" msgstr "" @@ -1182,7 +1182,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:2807 +#: erpnext/public/js/controllers/transaction.js:2914 #: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json #: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json msgid "Accepted Quantity" @@ -1346,9 +1346,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 "" @@ -1359,9 +1359,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 "" @@ -1563,7 +1563,7 @@ msgstr "" msgid "Account: {0} can only be updated via Stock Transactions" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2709 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2721 msgid "Account: {0} is not permitted under Payment Entry" msgstr "" @@ -1893,7 +1893,7 @@ msgstr "" #: erpnext/accounts/doctype/invoice_discounting/invoice_discounting.js:193 #: erpnext/assets/doctype/asset_repair/asset_repair.js:171 -#: erpnext/buying/doctype/supplier/supplier.js:92 +#: erpnext/buying/doctype/supplier/supplier.js:98 #: erpnext/public/js/controllers/stock_controller.js:88 #: erpnext/public/js/utils/ledger_preview.js:8 #: erpnext/selling/doctype/customer/customer.js:173 @@ -1906,6 +1906,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 @@ -1954,7 +1959,7 @@ msgstr "" #: 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 "" @@ -1989,7 +1994,7 @@ msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/report/accounts_payable/accounts_payable.json #: erpnext/accounts/report/accounts_payable_summary/accounts_payable_summary.js:113 -#: erpnext/buying/doctype/supplier/supplier.js:104 +#: erpnext/buying/doctype/supplier/supplier.js:110 #: erpnext/workspace_sidebar/financial_reports.json #: erpnext/workspace_sidebar/invoicing.json #: erpnext/workspace_sidebar/payments.json @@ -2497,7 +2502,7 @@ msgstr "" msgid "Actual qty in stock" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1542 +#: 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 "" @@ -2736,7 +2741,7 @@ msgstr "" msgid "Added On" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:134 +#: erpnext/buying/doctype/supplier/supplier.py:135 msgid "Added Supplier Role to User {0}." msgstr "" @@ -2802,14 +2807,15 @@ msgstr "" #. Label of the section_break_49 (Section Break) field in DocType 'POS Invoice' #. Label of the section_break_44 (Section Break) field in DocType 'Purchase #. Invoice' -#. Label of the section_break_49 (Section Break) field in DocType 'Sales -#. Invoice' +#. Label of the additional_discount_section (Section Break) field in DocType +#. 'Sales Invoice' #. Label of the discount_section (Section Break) field in DocType 'Purchase #. Order' #. Label of the section_break_41 (Section Break) field in DocType 'Supplier #. Quotation' #. Label of the section_break_44 (Section Break) field in DocType 'Quotation' -#. Label of the section_break_48 (Section Break) field in DocType 'Sales Order' +#. Label of the additional_discount_section (Section Break) field in DocType +#. 'Sales Order' #. Label of the section_break_49 (Section Break) field in DocType 'Delivery #. Note' #. Label of the section_break_42 (Section Break) field in DocType 'Purchase @@ -2835,6 +2841,7 @@ msgstr "" #. Label of the discount_amount (Currency) field in DocType 'Supplier #. Quotation' #. Label of the discount_amount (Currency) field in DocType 'Quotation' +#. Label of the base_discount_amount (Currency) field in DocType 'Sales Order' #. Label of the discount_amount (Currency) field in DocType 'Sales Order' #. Label of the discount_amount (Currency) field in DocType 'Delivery Note' #. Label of the discount_amount (Currency) field in DocType 'Purchase Receipt' @@ -2861,7 +2868,6 @@ msgstr "" #. Label of the base_discount_amount (Currency) field in DocType 'Supplier #. Quotation' #. Label of the base_discount_amount (Currency) field in DocType 'Quotation' -#. Label of the base_discount_amount (Currency) field in DocType 'Sales Order' #. Label of the base_discount_amount (Currency) field in DocType 'Delivery #. Note' #. Label of the base_discount_amount (Currency) field in DocType 'Purchase @@ -2872,13 +2878,12 @@ msgstr "" #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.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 "Additional Discount Amount (Company Currency)" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:791 +#: erpnext/controllers/taxes_and_totals.py:796 msgid "Additional Discount Amount ({discount_amount}) cannot exceed the total before such discount ({total_before_discount})" msgstr "" @@ -2915,6 +2920,7 @@ msgstr "" msgid "Additional Discount Percentage" msgstr "" +#. Label of the addtional_info (Section Break) field in DocType 'Journal Entry' #. Label of the additional_info_section (Section Break) field in DocType #. 'Purchase Invoice' #. Label of the more_information (Section Break) field in DocType 'Sales @@ -2930,6 +2936,7 @@ msgstr "" #. Label of the more_info (Section Break) field in DocType 'Delivery Note' #. Label of the additional_info_section (Section Break) field in DocType #. 'Purchase Receipt' +#: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json #: erpnext/assets/doctype/asset/asset.json @@ -3179,13 +3186,16 @@ msgstr "" msgid "Advance Amount" msgstr "" -#. Label of the advance_paid (Currency) field in DocType 'Purchase Order' #. Label of the advance_paid (Currency) field in DocType 'Sales Order' -#: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/selling/doctype/sales_order/sales_order.json msgid "Advance Paid" msgstr "" +#. Label of the advance_paid (Currency) field in DocType 'Purchase Order' +#: erpnext/buying/doctype/purchase_order/purchase_order.json +msgid "Advance Paid (Company Currency)" +msgstr "" + #: erpnext/buying/doctype/purchase_order/purchase_order_list.js:75 #: erpnext/selling/doctype/sales_order/sales_order_list.js:122 msgid "Advance Payment" @@ -3256,7 +3266,7 @@ msgstr "" msgid "Advance amount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:928 +#: erpnext/controllers/taxes_and_totals.py:933 msgid "Advance amount cannot be greater than {0} {1}" msgstr "" @@ -3574,7 +3584,7 @@ msgstr "" #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:165 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.js:185 #: erpnext/accounts/doctype/chart_of_accounts_importer/chart_of_accounts_importer.py:166 -#: erpnext/accounts/utils.py:1554 erpnext/public/js/setup_wizard.js:184 +#: erpnext/accounts/utils.py:1555 erpnext/public/js/setup_wizard.js:184 msgid "All Accounts" msgstr "" @@ -3747,7 +3757,7 @@ msgstr "" msgid "All items have already been transferred for this Work Order." msgstr "" -#: erpnext/public/js/controllers/transaction.js:2915 +#: erpnext/public/js/controllers/transaction.js:3022 msgid "All items in this document already have a linked Quality Inspection." msgstr "" @@ -3792,7 +3802,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 "" @@ -3802,7 +3812,7 @@ msgstr "" msgid "Allocate Payment Based On Payment Terms" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1732 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1735 msgid "Allocate Payment Request" msgstr "" @@ -3828,7 +3838,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:1723 +#: 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 @@ -3854,11 +3864,11 @@ msgstr "" msgid "Allocated amount" msgstr "" -#: erpnext/accounts/utils.py:657 +#: erpnext/accounts/utils.py:658 msgid "Allocated amount cannot be greater than unadjusted amount" msgstr "" -#: erpnext/accounts/utils.py:655 +#: erpnext/accounts/utils.py:656 msgid "Allocated amount cannot be negative" msgstr "" @@ -3960,7 +3970,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:854 msgid "Allow Item to Be Added Multiple Times in a Transaction" msgstr "" @@ -4380,6 +4390,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' @@ -4466,7 +4477,7 @@ msgstr "" #: erpnext/accounts/doctype/bank_guarantee/bank_guarantee.json #: erpnext/accounts/doctype/budget_distribution/budget_distribution.json #: erpnext/accounts/doctype/cashier_closing_payments/cashier_closing_payments.json -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:627 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:623 #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json @@ -4474,6 +4485,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 @@ -4521,6 +4533,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 @@ -4673,19 +4686,19 @@ msgstr "" msgid "Amount to Bill" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1243 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1255 msgid "Amount {0} {1} against {2} {3}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1254 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1266 msgid "Amount {0} {1} deducted against {2}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1218 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1230 msgid "Amount {0} {1} transferred from {2} to {3}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1224 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1236 msgid "Amount {0} {1} {2} {3}" msgstr "" @@ -4724,7 +4737,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 "" @@ -4745,6 +4758,12 @@ msgstr "" msgid "Analyst" msgstr "" +#. Label of the analytics_section (Section Break) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Analytical Accounting" +msgstr "" + #: erpnext/public/js/utils.js:93 msgid "Annual Billing: {0}" msgstr "" @@ -4784,7 +4803,7 @@ msgstr "" msgid "Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}" msgstr "" -#: 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 "" @@ -5040,6 +5059,12 @@ msgstr "" msgid "Apply SLA for Resolution Time" msgstr "" +#. Description of the 'Enable Discounts and Margin' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Apply discounts and margins on products" +msgstr "" + #. Label of the apply_restriction_on_values (Check) field in DocType #. 'Accounting Dimension Filter' #: erpnext/accounts/doctype/accounting_dimension_filter/accounting_dimension_filter.json @@ -5775,7 +5800,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 @@ -5783,6 +5808,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 "" @@ -5819,7 +5849,7 @@ msgstr "" msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} in the warehouse {4}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1358 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1368 msgid "At Row {0}: In Serial and Batch Bundle {1} must have docstatus as 1 and not 0" msgstr "" @@ -5876,7 +5906,7 @@ msgstr "" msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1120 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1130 msgid "At row {0}: Batch No is mandatory for Item {1}" msgstr "" @@ -5884,11 +5914,11 @@ msgstr "" msgid "At row {0}: Parent Row No cannot be set for item {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1105 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1115 msgid "At row {0}: Qty is mandatory for the batch {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1112 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1122 msgid "At row {0}: Serial No is mandatory for Item {1}" msgstr "" @@ -6154,7 +6184,7 @@ msgstr "" msgid "Auto Reserve Stock for Sales Order on Purchase" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:148 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:185 msgid "Auto Tax Settings Error" msgstr "" @@ -6243,6 +6273,12 @@ msgstr "" msgid "Available" msgstr "" +#. Label of the available__future_inventory_section (Section Break) field in +#. DocType 'Bin' +#: erpnext/stock/doctype/bin/bin.json +msgid "Available / Future Inventory" +msgstr "" + #. Label of the actual_batch_qty (Float) field in DocType 'Delivery Note Item' #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json msgid "Available Batch Qty at From Warehouse" @@ -6376,7 +6412,7 @@ 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:548 msgid "Average Age" msgstr "" @@ -6494,7 +6530,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:689 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:706 #: 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 @@ -6750,7 +6786,7 @@ msgstr "" msgid "BOM and Finished Good Quantity is mandatory for Disassembly" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1327 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1344 msgid "BOM and Manufacturing Quantity are required" msgstr "" @@ -6761,7 +6797,7 @@ msgid "BOM and Production" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:386 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:741 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:758 msgid "BOM does not contain any stock item" msgstr "" @@ -6875,7 +6911,7 @@ msgstr "" #: erpnext/stock/report/available_batch_report/available_batch_report.py:63 #: erpnext/stock/report/available_serial_no/available_serial_no.py:126 #: erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py:84 -#: erpnext/stock/report/stock_balance/stock_balance.py:445 +#: erpnext/stock/report/stock_balance/stock_balance.py:476 #: erpnext/stock/report/stock_ledger/stock_ledger.py:251 msgid "Balance Qty" msgstr "" @@ -6940,7 +6976,7 @@ 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_balance/stock_balance.py:483 #: erpnext/stock/report/stock_ledger/stock_ledger.py:308 msgid "Balance Value" msgstr "" @@ -7064,7 +7100,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 "" @@ -7515,7 +7551,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:2833 +#: erpnext/public/js/controllers/transaction.js:2940 #: erpnext/public/js/utils/barcode_scanner.js:281 #: erpnext/public/js/utils/serial_no_batch_selector.js:438 #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -7546,19 +7582,19 @@ msgstr "" msgid "Batch No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1123 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1133 msgid "Batch No is mandatory" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3285 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3321 msgid "Batch No {0} does not exists" msgstr "" -#: erpnext/stock/utils.py:618 +#: erpnext/stock/utils.py:619 msgid "Batch No {0} is linked with Item {1} which has serial no. Please scan serial no instead." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:438 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:448 msgid "Batch No {0} is not present in the original {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -7573,7 +7609,7 @@ msgstr "" msgid "Batch Nos" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1876 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1886 msgid "Batch Nos are created successfully" msgstr "" @@ -7627,7 +7663,7 @@ msgstr "" msgid "Batch and Serial No" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:896 +#: erpnext/manufacturing/doctype/work_order/work_order.py:897 msgid "Batch not created for item {} since it does not have a batch series." msgstr "" @@ -7710,10 +7746,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:1318 #: erpnext/manufacturing/workspace/manufacturing/manufacturing.json #: erpnext/stock/doctype/material_request/material_request.js:139 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:675 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:692 +#: erpnext/workspace_sidebar/subcontracting.json msgid "Bill of Materials" msgstr "" @@ -7919,7 +7957,7 @@ msgstr "" msgid "Billing Zipcode" msgstr "" -#: erpnext/accounts/party.py:609 +#: erpnext/accounts/party.py:597 msgid "Billing currency must be equal to either default company's currency or party account currency" msgstr "" @@ -8526,6 +8564,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" @@ -8848,7 +8891,7 @@ msgstr "" msgid "Can be approved by {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2504 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2500 msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state." msgstr "" @@ -8877,11 +8920,11 @@ 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:2863 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2875 msgid "Can only make payment against unbilled {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1514 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1517 #: erpnext/controllers/accounts_controller.py:3175 #: 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'" @@ -8947,7 +8990,7 @@ msgstr "" msgid "Cannot Optimize Route as Driver Address is Missing." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:182 +#: erpnext/setup/doctype/employee/employee.py:181 msgid "Cannot Relieve Employee" msgstr "" @@ -8955,7 +8998,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 "" @@ -8987,7 +9030,7 @@ msgstr "" msgid "Cannot cancel as processing of cancelled documents is pending." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1081 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1075 msgid "Cannot cancel because submitted Stock Entry {0} exists" msgstr "" @@ -9081,7 +9124,7 @@ msgstr "" msgid "Cannot deduct when category is for 'Valuation' or 'Valuation and Total'" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1829 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1832 msgid "Cannot delete Exchange Gain/Loss row" msgstr "" @@ -9093,12 +9136,12 @@ msgstr "" 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:782 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 "" @@ -9119,6 +9162,10 @@ msgstr "" msgid "Cannot ensure delivery by Serial No as Item {0} is added with and without Ensure Delivery by Serial No." msgstr "" +#: 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 "" @@ -9131,7 +9178,7 @@ msgstr "" msgid "Cannot find a default warehouse for item {0}. Please set one in the Item Master or in Stock Settings." msgstr "" -#: erpnext/accounts/party.py:1075 +#: erpnext/accounts/party.py:1063 msgid "Cannot merge {0} '{1}' into '{2}' as both have existing accounting entries in different currencies for company '{3}'." msgstr "" @@ -9139,11 +9186,11 @@ msgstr "" msgid "Cannot produce more Item {0} than Sales Order quantity {1} {2}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1436 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1426 msgid "Cannot produce more item for {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1440 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1430 msgid "Cannot produce more than {0} items for {1}" msgstr "" @@ -9155,7 +9202,7 @@ msgstr "" msgid "Cannot reduce quantity than ordered or purchased quantity" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1527 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1530 #: erpnext/controllers/accounts_controller.py:3190 #: erpnext/public/js/controllers/accounts.js:120 msgid "Cannot refer row number greater than or equal to current row number for this Charge type" @@ -9169,12 +9216,12 @@ msgstr "" msgid "Cannot retrieve link token. Check Error Log for more information" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1520 -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1698 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1811 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1523 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1701 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1823 #: erpnext/controllers/accounts_controller.py:3180 #: erpnext/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 "" @@ -9202,11 +9249,11 @@ msgstr "" msgid "Cannot set the field {0} for copying in variants" msgstr "" -#: 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:1921 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1933 msgid "Cannot {0} from {1} without any negative outstanding invoice" msgstr "" @@ -9225,12 +9272,6 @@ msgstr "" msgid "Capacity" msgstr "" -#. Label of the capacity_in_days_section (Section Break) field in DocType -#. 'Item' -#: erpnext/stock/doctype/item/item.json -msgid "Capacity (In Days)" -msgstr "" - #: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js:69 msgid "Capacity (Stock UOM)" msgstr "" @@ -9241,7 +9282,7 @@ msgstr "" msgid "Capacity Planning" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1067 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1061 msgid "Capacity Planning Error, planned start time can not be same as end time" msgstr "" @@ -9598,7 +9639,7 @@ msgstr "" msgid "Change this date manually to setup the next synchronization start date" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:133 +#: erpnext/selling/doctype/customer/customer.py:157 msgid "Changed customer name to '{}' as '{}' already exists." msgstr "" @@ -9620,7 +9661,7 @@ msgstr "" msgid "Channel Partner" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2240 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2252 #: erpnext/controllers/accounts_controller.py:3243 msgid "Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount" msgstr "" @@ -9807,7 +9848,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:2744 +#: erpnext/public/js/controllers/transaction.js:2851 msgid "Cheque/Reference Date" msgstr "" @@ -9861,12 +9902,12 @@ msgstr "" #. Label of the child_row_reference (Data) field in DocType 'Quality #. Inspection' -#: erpnext/public/js/controllers/transaction.js:2839 +#: erpnext/public/js/controllers/transaction.js:2946 #: 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 "" @@ -10029,7 +10070,7 @@ msgstr "" msgid "Closed Documents" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2427 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2423 msgid "Closed Work Order can not be stopped or Re-opened" msgstr "" @@ -10042,14 +10083,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 "" @@ -10184,8 +10225,8 @@ msgstr "" #. Label of the sales_team_section_break (Section Break) field in DocType 'POS #. Invoice' -#. Label of the sales_team_section_break (Section Break) field in DocType -#. 'Sales Invoice' +#. Label of the commission_section (Section Break) field in DocType 'Sales +#. Invoice' #. Label of the sales_team_section_break (Section Break) field in DocType #. 'Sales Order' #. Label of the sales_team_section_break (Section Break) field in DocType @@ -10261,7 +10302,7 @@ msgstr "" msgid "Communication Medium Type" msgstr "" -#: erpnext/setup/install.py:97 +#: erpnext/setup/install.py:98 msgid "Compact Item Print" msgstr "" @@ -10652,8 +10693,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 @@ -10704,7 +10745,7 @@ msgstr "" #: erpnext/stock/report/stock_analytics/stock_analytics.js:41 #: erpnext/stock/report/stock_and_account_value_comparison/stock_and_account_value_comparison.js:7 #: erpnext/stock/report/stock_balance/stock_balance.js:8 -#: erpnext/stock/report/stock_balance/stock_balance.py:506 +#: erpnext/stock/report/stock_balance/stock_balance.py:537 #: erpnext/stock/report/stock_ledger/stock_ledger.js:8 #: erpnext/stock/report/stock_ledger/stock_ledger.py:358 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:18 @@ -10860,7 +10901,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 "" @@ -10891,7 +10932,7 @@ msgid "Company currencies of both the companies should match for Inter Company T msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:380 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:735 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:752 msgid "Company field is required" msgstr "" @@ -11034,7 +11075,7 @@ msgstr "" msgid "Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1350 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1344 msgid "Completed Qty cannot be greater than 'Qty to Manufacture'" msgstr "" @@ -11130,6 +11171,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 "" @@ -11273,7 +11319,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 "" @@ -11356,7 +11402,7 @@ msgstr "" msgid "Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1729 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1720 msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}" msgstr "" @@ -12252,12 +12298,50 @@ msgstr "" msgid "Cr" msgstr "" +#. 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 "" @@ -12278,6 +12362,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" @@ -12291,6 +12391,14 @@ msgstr "" 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 "" @@ -12322,7 +12430,7 @@ msgstr "" msgid "Create Ledger Entries for Change Amount" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:218 +#: erpnext/buying/doctype/supplier/supplier.js:216 #: erpnext/selling/doctype/customer/customer.js:285 msgid "Create Link" msgstr "" @@ -12353,6 +12461,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 "" @@ -12361,7 +12479,10 @@ 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 "" @@ -12369,6 +12490,10 @@ msgstr "" 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 "" @@ -12377,10 +12502,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" @@ -12390,10 +12530,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" @@ -12408,12 +12566,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 "" @@ -12422,23 +12587,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 @@ -12463,6 +12680,17 @@ msgstr "" 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 "" @@ -12472,7 +12700,7 @@ msgstr "" msgid "Create a variant with the template image." msgstr "" -#: erpnext/stock/stock_ledger.py:2013 +#: erpnext/stock/stock_ledger.py:2011 msgid "Create an incoming stock transaction for the Item." msgstr "" @@ -12480,6 +12708,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 @@ -12492,6 +12725,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 "" @@ -12539,7 +12777,7 @@ msgid "Creating Purchase Order ..." msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:704 -#: erpnext/buying/doctype/purchase_order/purchase_order.js:518 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:497 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:73 msgid "Creating Purchase Receipt ..." msgstr "" @@ -12557,7 +12795,7 @@ msgstr "" msgid "Creating Subcontracting Inward Order ..." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:533 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:512 msgid "Creating Subcontracting Order ..." msgstr "" @@ -12604,11 +12842,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" @@ -12622,7 +12860,7 @@ msgstr "" msgid "Credit ({0})" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:641 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:637 msgid "Credit Account" msgstr "" @@ -12700,7 +12938,7 @@ msgstr "" msgid "Credit Limit" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:606 +#: erpnext/selling/doctype/customer/customer.py:630 msgid "Credit Limit Crossed" msgstr "" @@ -12793,16 +13031,16 @@ msgstr "" msgid "Credit in Company Currency" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:572 -#: erpnext/selling/doctype/customer/customer.py:627 +#: erpnext/selling/doctype/customer/customer.py:596 +#: erpnext/selling/doctype/customer/customer.py:651 msgid "Credit limit has been crossed for customer {0} ({1}/{2})" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:358 +#: erpnext/selling/doctype/customer/customer.py:382 msgid "Credit limit is already defined for the Company {0}" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:626 +#: erpnext/selling/doctype/customer/customer.py:650 msgid "Credit limit reached for customer {0}" msgstr "" @@ -12857,7 +13095,7 @@ msgstr "" msgid "Criteria weights must add up to 100%" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:135 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:172 msgid "Cron Interval should be between 1 and 59 Min" msgstr "" @@ -12984,9 +13222,9 @@ msgstr "" msgid "Currency filters are currently unsupported in Custom Financial Report." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1588 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1656 -#: erpnext/accounts/utils.py:2455 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1600 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1668 +#: erpnext/accounts/utils.py:2456 msgid "Currency for {0} must be {1}" msgstr "" @@ -13132,11 +13370,6 @@ msgstr "" msgid "Current Stock" msgstr "" -#. Label of the current_time (Int) field in DocType 'Job Card' -#: erpnext/manufacturing/doctype/job_card/job_card.json -msgid "Current Time" -msgstr "" - #. Label of the current_valuation_rate (Currency) field in DocType 'Stock #. Reconciliation Item' #: erpnext/stock/doctype/stock_reconciliation_item/stock_reconciliation_item.json @@ -13278,7 +13511,7 @@ msgstr "" #: erpnext/accounts/report/sales_register/sales_register.py:187 #: erpnext/assets/doctype/asset/asset.json #: erpnext/buying/doctype/purchase_order/purchase_order.json -#: erpnext/buying/doctype/supplier/supplier.js:186 +#: erpnext/buying/doctype/supplier/supplier.js:184 #: erpnext/crm/doctype/contract/contract.json #: erpnext/crm/doctype/lead/lead.js:32 #: erpnext/crm/doctype/opportunity/opportunity.js:99 @@ -13731,7 +13964,7 @@ msgstr "" #. Label of the customer_pos_id (Data) field in DocType 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Customer POS id" +msgid "Customer POS ID" msgstr "" #. Label of the portal_users (Table) field in DocType 'Customer' @@ -14018,7 +14251,7 @@ msgstr "" msgid "Date of Birth" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:147 +#: erpnext/setup/doctype/employee/employee.py:146 msgid "Date of Birth cannot be greater than today." msgstr "" @@ -14173,11 +14406,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" @@ -14197,7 +14430,7 @@ msgstr "" msgid "Debit / Credit Note Posting Date" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:631 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:627 msgid "Debit Account" msgstr "" @@ -14311,11 +14544,11 @@ msgstr "" msgid "Debtor Turnover Ratio" msgstr "" -#: erpnext/accounts/party.py:616 +#: erpnext/accounts/party.py:604 msgid "Debtor/Creditor" msgstr "" -#: erpnext/accounts/party.py:619 +#: erpnext/accounts/party.py:607 msgid "Debtor/Creditor Advance" msgstr "" @@ -14444,7 +14677,7 @@ msgstr "" msgid "Default BOM ({0}) must be active for this item or its template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2229 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2220 msgid "Default BOM for {0} not found" msgstr "" @@ -14452,7 +14685,7 @@ msgstr "" msgid "Default BOM not found for FG Item {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2226 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2217 msgid "Default BOM not found for Item {0} and Project {1}" msgstr "" @@ -14814,11 +15047,14 @@ msgstr "" msgid "Default Valuation Method" msgstr "" +#. Label of the default_warehouse_section (Section Break) field in DocType +#. 'BOM' #. Label of the default_warehouse (Link) field in DocType 'Item Default' #. Label of the section_break_jwgn (Section Break) field in DocType 'Stock #. Entry' #. Label of the set_warehouse (Link) field in DocType 'Stock Reconciliation' #. Label of the default_warehouse (Link) field in DocType 'Stock Settings' +#: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/stock/doctype/item_default/item_default.json #: erpnext/stock/doctype/stock_entry/stock_entry.json #: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.json @@ -15028,8 +15264,8 @@ msgstr "" msgid "Deleting {0} and all associated Common Code documents..." msgstr "" -#: 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:1099 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1118 msgid "Deletion in Progress!" msgstr "" @@ -15894,7 +16130,7 @@ msgstr "" msgid "Disabled Account Selected" msgstr "" -#: erpnext/stock/utils.py:422 +#: erpnext/stock/utils.py:423 msgid "Disabled Warehouse {0} cannot be used for this transaction." msgstr "" @@ -16142,7 +16378,7 @@ msgstr "" msgid "Discount must be less than 100" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3341 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:3353 msgid "Discount of {} applied as per Payment Term" msgstr "" @@ -16490,8 +16726,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:445 msgid "DocType {0} does not exist" msgstr "" @@ -16542,7 +16778,7 @@ msgstr "" msgid "Document Type already used as a dimension" msgstr "" -#: erpnext/setup/install.py:188 +#: erpnext/setup/install.py:189 msgid "Documentation" msgstr "" @@ -16725,11 +16961,11 @@ msgstr "" msgid "Drops existing SQL Procedures and Function setup by Accounts Receivable report" msgstr "" -#: erpnext/accounts/party.py:702 +#: erpnext/accounts/party.py:690 msgid "Due Date cannot be after {0}" msgstr "" -#: erpnext/accounts/party.py:678 +#: erpnext/accounts/party.py:666 msgid "Due Date cannot be before {0}" msgstr "" @@ -16792,7 +17028,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 "" @@ -16826,6 +17062,10 @@ msgstr "" 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 "" @@ -16850,7 +17090,7 @@ msgstr "" msgid "Duplicate entry against the item code {0} and manufacturer {1}" msgstr "" -#: 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 "" @@ -16962,7 +17202,7 @@ msgstr "" msgid "Earliest" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:518 +#: erpnext/stock/report/stock_balance/stock_balance.py:549 msgid "Earliest Age" msgstr "" @@ -17358,10 +17598,14 @@ msgstr "" msgid "Employee User Id" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:214 +#: erpnext/setup/doctype/employee/employee.py:213 msgid "Employee cannot report to himself." msgstr "" +#: erpnext/setup/doctype/employee/employee.py:445 +msgid "Employee is required" +msgstr "" + #: erpnext/assets/doctype/asset_movement/asset_movement.py:109 msgid "Employee is required while issuing Asset {0}" msgstr "" @@ -17371,10 +17615,14 @@ msgstr "" msgid "Employee {0} does not belong to the company {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:359 +#: erpnext/manufacturing/doctype/job_card/job_card.py:357 msgid "Employee {0} is currently working on another workstation. Please assign another employee." msgstr "" +#: erpnext/setup/doctype/employee/employee.py:470 +msgid "Employee {0} not found" +msgstr "" + #: erpnext/manufacturing/doctype/workstation/workstation.js:351 msgid "Employees" msgstr "" @@ -17383,7 +17631,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:754 msgid "Empty To Delete List" msgstr "" @@ -17392,6 +17640,12 @@ msgstr "" msgid "Ems(Pica)" msgstr "" +#. Label of the enable_accounting_dimensions (Check) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Accounting Dimensions" +msgstr "" + #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1721 msgid "Enable Allow Partial Reservation in the Stock Settings to reserve partial stock." msgstr "" @@ -17461,6 +17715,12 @@ msgstr "" msgid "Enable Discount Accounting for Selling" msgstr "" +#. Label of the enable_discounts_and_margin (Check) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Discounts and Margin" +msgstr "" + #. Label of the enable_european_access (Check) field in DocType 'Plaid #. Settings' #: erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json @@ -17491,6 +17751,12 @@ msgstr "" msgid "Enable Item-wise Inventory Account" msgstr "" +#. Label of the enable_loyalty_point_program (Check) field in DocType 'Accounts +#. Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable Loyalty Point Program" +msgstr "" + #. Label of the enable_parallel_reposting (Check) field in DocType 'Stock #. Reposting Settings' #: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json @@ -17508,18 +17774,40 @@ 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_stock_reservation (Check) field in DocType 'Stock #. Settings' #: erpnext/stock/doctype/stock_settings/stock_settings.json msgid "Enable Stock Reservation" msgstr "" +#. Label of the enable_utm (Check) field in DocType 'Selling Settings' +#: erpnext/selling/doctype/selling_settings/selling_settings.json +msgid "Enable UTM" +msgstr "" + +#. Description of the 'Enable UTM' (Check) field in DocType 'Selling Settings' +#: erpnext/selling/doctype/selling_settings/selling_settings.json +msgid "Enable Urchin Tracking Module parameters in Quotation, Sales Order, Sales Invoice, POS Invoice, Lead, and Delivery Note." +msgstr "" + #. Label of the enable_youtube_tracking (Check) field in DocType 'Video #. Settings' #: erpnext/utilities/doctype/video_settings/video_settings.json msgid "Enable YouTube Tracking" msgstr "" +#. Description of the 'Enable Accounting Dimensions' (Check) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Enable cost center, projects and other custom accounting dimensions" +msgstr "" + #. Description of the 'Consider Rejected Warehouses' (Check) field in DocType #. 'Pick List' #: erpnext/stock/doctype/pick_list/pick_list.json @@ -17541,6 +17829,12 @@ msgstr "" msgid "Enable to apply SLA on every {0}" msgstr "" +#. Label of the enable_tracking_sales_commissions (Check) field in DocType +#. 'Selling Settings' +#: erpnext/selling/doctype/selling_settings/selling_settings.json +msgid "Enable tracking sales commissions" +msgstr "" + #. Description of the 'Fetch Timesheet in Sales Invoice' (Check) field in #. DocType 'Projects Settings' #: erpnext/projects/doctype/projects_settings/projects_settings.json @@ -17664,7 +17958,7 @@ msgstr "" msgid "Enter API key in Google Settings." msgstr "" -#: erpnext/public/js/print.js:51 +#: erpnext/public/js/print.js:62 msgid "Enter Company Details" msgstr "" @@ -17802,7 +18096,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 "" @@ -17854,7 +18148,7 @@ msgstr "" msgid "Error while processing deferred accounting for {0}" msgstr "" -#: 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 "" @@ -17865,7 +18159,7 @@ msgid "" "\t\t\t\t\tPlease correct the dates accordingly." msgstr "" -#: 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 "" @@ -17927,7 +18221,7 @@ msgstr "" msgid "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings." msgstr "" -#: erpnext/stock/stock_ledger.py:2279 +#: erpnext/stock/stock_ledger.py:2275 msgid "Example: Serial No {0} reserved in {1}." msgstr "" @@ -17941,7 +18235,7 @@ msgstr "" msgid "Excess Materials Consumed" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1117 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1115 msgid "Excess Transfer" msgstr "" @@ -18082,7 +18376,7 @@ msgstr "" msgid "Excise Entry" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:1395 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:1412 msgid "Excise Invoice" msgstr "" @@ -18268,7 +18562,7 @@ msgstr "" #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:605 #: 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 "" @@ -18441,7 +18735,7 @@ msgstr "" msgid "Extra Consumed Qty" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:256 +#: erpnext/manufacturing/doctype/job_card/job_card.py:254 msgid "Extra Job Card Quantity" msgstr "" @@ -18656,16 +18950,10 @@ msgid "Fetch Value From" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:372 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:712 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:729 msgid "Fetch exploded BOM (including sub-assemblies)" msgstr "" -#. Description of the 'Get Items from Open Material Requests' (Button) field in -#. DocType 'Purchase Order' -#: erpnext/buying/doctype/purchase_order/purchase_order.json -msgid "Fetch items based on Default Supplier." -msgstr "" - #: erpnext/selling/page/point_of_sale/pos_item_details.js:455 msgid "Fetched only {0} available serial numbers." msgstr "" @@ -18683,7 +18971,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:1588 msgid "Fetching exchange rates ..." msgstr "" @@ -18691,7 +18979,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 "" @@ -18713,15 +19001,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:1066 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:1060 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:1074 msgid "File not found on server" msgstr "" @@ -19180,7 +19468,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 "" @@ -19324,7 +19612,7 @@ msgstr "" msgid "Following Material Requests have been raised automatically based on Item's re-order level" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:797 +#: erpnext/selling/doctype/customer/customer.py:821 msgid "Following fields are mandatory to create address:" msgstr "" @@ -19496,7 +19784,7 @@ msgstr "" msgid "For operation {0} at row {1}, please add raw materials or set a BOM against it." msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2574 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2570 msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})" msgstr "" @@ -19522,7 +19810,7 @@ msgstr "" msgid "For reference" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1549 +#: 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 "" @@ -19550,7 +19838,7 @@ msgstr "" 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:1398 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 "" @@ -19587,8 +19875,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 "" @@ -19627,7 +19915,7 @@ msgstr "" msgid "Forum URL" msgstr "" -#: erpnext/setup/install.py:200 +#: erpnext/setup/install.py:201 msgid "Frappe School" msgstr "" @@ -19841,11 +20129,6 @@ msgstr "" msgid "From Invoice Date" msgstr "" -#. Label of the lead_name (Link) field in DocType 'Customer' -#: erpnext/selling/doctype/customer/customer.json -msgid "From Lead" -msgstr "" - #. Label of the from_no (Int) field in DocType 'Share Balance' #. Label of the from_no (Int) field in DocType 'Share Transfer' #: erpnext/accounts/doctype/share_balance/share_balance.json @@ -19853,11 +20136,6 @@ msgstr "" msgid "From No" msgstr "" -#. Label of the opportunity_name (Link) field in DocType 'Customer' -#: erpnext/selling/doctype/customer/customer.json -msgid "From Opportunity" -msgstr "" - #. Label of the from_case_no (Int) field in DocType 'Packing Slip' #: erpnext/stock/doctype/packing_slip/packing_slip.json msgid "From Package No." @@ -19877,11 +20155,6 @@ msgstr "" msgid "From Posting Date" msgstr "" -#. Label of the prospect_name (Link) field in DocType 'Customer' -#: erpnext/selling/doctype/customer/customer.json -msgid "From Prospect" -msgstr "" - #. Label of the from_range (Float) field in DocType 'Item Attribute' #. Label of the from_range (Float) field in DocType 'Item Variant Attribute' #: erpnext/stock/doctype/item_attribute/item_attribute.json @@ -20290,7 +20563,7 @@ msgstr "" msgid "General Ledger" msgstr "" -#: erpnext/stock/doctype/warehouse/warehouse.js:77 +#: erpnext/stock/doctype/warehouse/warehouse.js:82 msgctxt "Warehouse" msgid "General Ledger" msgstr "" @@ -20349,7 +20622,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:472 msgid "Generate To Delete list first" msgstr "" @@ -20454,8 +20727,8 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:325 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:359 #: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1125 -#: erpnext/buying/doctype/purchase_order/purchase_order.js:561 -#: erpnext/buying/doctype/purchase_order/purchase_order.js:584 +#: 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 @@ -20480,7 +20753,7 @@ msgstr "" #: 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:679 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:696 #: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:164 msgid "Get Items From" msgstr "" @@ -20496,8 +20769,8 @@ msgid "Get Items for Purchase Only" msgstr "" #: erpnext/stock/doctype/material_request/material_request.js:346 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:715 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:728 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:732 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:745 msgid "Get Items from BOM" msgstr "" @@ -20505,12 +20778,6 @@ msgstr "" msgid "Get Items from Material Requests against this Supplier" msgstr "" -#. Label of the get_items_from_open_material_requests (Button) field in DocType -#. 'Purchase Order' -#: erpnext/buying/doctype/purchase_order/purchase_order.json -msgid "Get Items from Open Material Requests" -msgstr "" - #: erpnext/public/js/controllers/buying.js:604 msgid "Get Items from Product Bundle" msgstr "" @@ -20597,10 +20864,6 @@ msgstr "" msgid "Get Sub Assembly Items" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:115 -msgid "Get Supplier Group Details" -msgstr "" - #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:457 #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:477 msgid "Get Suppliers" @@ -20763,6 +21026,7 @@ msgstr "" #. Option for the 'Apply Discount On' (Select) field in DocType 'Pricing Rule' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Purchase Invoice' +#. Label of the base_grand_total (Currency) field in DocType 'Purchase Invoice' #. Label of the grand_total (Currency) field in DocType 'Purchase Invoice' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Sales Invoice' @@ -20771,6 +21035,7 @@ msgstr "" #. 'Subscription' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Purchase Order' +#. Label of the base_grand_total (Currency) field in DocType 'Purchase Order' #. Label of the grand_total (Currency) field in DocType 'Purchase Order' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Supplier Quotation' @@ -20782,16 +21047,19 @@ msgstr "" #. Label of the grand_total (Currency) field in DocType 'Quotation' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Sales Order' +#. Label of the base_grand_total (Currency) field in DocType 'Sales Order' #. Label of the grand_total (Currency) field in DocType 'Sales Order' #. 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 #. Receipt' #. Option for the 'Apply Additional Discount On' (Select) field in DocType #. 'Purchase Receipt' +#. Label of the base_grand_total (Currency) field in DocType 'Purchase Receipt' #. Label of the grand_total (Currency) field in DocType 'Purchase Receipt' #: erpnext/accounts/doctype/dunning/dunning.json #: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json @@ -20826,26 +21094,19 @@ msgstr "" msgid "Grand Total" msgstr "" -#. Label of the base_grand_total (Currency) field in DocType 'POS Invoice' -#. Label of the base_grand_total (Currency) field in DocType 'Purchase Invoice' #. Label of the base_grand_total (Currency) field in DocType 'Sales Invoice' -#. Label of the base_grand_total (Currency) field in DocType 'Purchase Order' +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json +msgid "Grand Total (Company Currency" +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 'Quotation' -#. Label of the base_grand_total (Currency) field in DocType 'Sales Order' -#. Label of the base_grand_total (Currency) field in DocType 'Delivery Note' -#. Label of the base_grand_total (Currency) field in DocType 'Purchase Receipt' #: 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/report/tax_withholding_details/tax_withholding_details.py:169 -#: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/supplier_quotation/supplier_quotation.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 "Grand Total (Company Currency)" msgstr "" @@ -20853,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' @@ -20866,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 "" @@ -21006,7 +21271,7 @@ msgstr "" msgid "Group by Voucher" msgstr "" -#: erpnext/stock/utils.py:416 +#: erpnext/stock/utils.py:417 msgid "Group node warehouse is not allowed to select for transactions" msgstr "" @@ -21282,7 +21547,7 @@ msgstr "" msgid "Here are the error logs for the aforementioned failed depreciation entries: {0}" msgstr "" -#: erpnext/stock/stock_ledger.py:1998 +#: erpnext/stock/stock_ledger.py:1996 msgid "Here are the options to proceed:" msgstr "" @@ -21310,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 "" @@ -21772,7 +22037,7 @@ 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." +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 @@ -21867,7 +22132,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:2008 +#: erpnext/stock/stock_ledger.py:2006 msgid "If not, you can Cancel / Submit this entry" msgstr "" @@ -21896,7 +22161,7 @@ msgstr "" msgid "If the account is frozen, entries are allowed to restricted users." msgstr "" -#: erpnext/stock/stock_ledger.py:2001 +#: erpnext/stock/stock_ledger.py:1999 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 "" @@ -22208,7 +22473,7 @@ msgstr "" 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:564 msgid "Import Summary" msgstr "" @@ -22288,7 +22553,7 @@ 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_balance/stock_balance.py:504 #: erpnext/stock/report/stock_ledger/stock_ledger.py:237 msgid "In Qty" msgstr "" @@ -22320,19 +22585,25 @@ msgstr "" msgid "In Transit Warehouse" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:479 +#: erpnext/stock/report/stock_balance/stock_balance.py:510 msgid "In Value" msgstr "" #. Label of the in_words (Small Text) field in DocType 'Payment Entry' #. Label of the in_words (Data) field in DocType 'POS Invoice' +#. Label of the base_in_words (Data) field in DocType 'Purchase Invoice' #. Label of the in_words (Data) field in DocType 'Purchase Invoice' +#. Label of the base_in_words (Small Text) field in DocType 'Sales Invoice' #. Label of the in_words (Small Text) field in DocType 'Sales Invoice' +#. Label of the base_in_words (Data) field in DocType 'Purchase Order' #. Label of the in_words (Data) field in DocType 'Purchase Order' #. Label of the in_words (Data) field in DocType 'Supplier Quotation' #. 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' #. Label of the in_words (Data) field in DocType 'Subcontracting Receipt' #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -22351,24 +22622,12 @@ 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 'Purchase Invoice' -#. Label of the base_in_words (Small Text) field in DocType 'Sales Invoice' -#. Label of the base_in_words (Data) field in DocType 'Purchase Order' #. Label of the base_in_words (Data) field in DocType 'Supplier Quotation' #. Label of the base_in_words (Data) field in DocType 'Quotation' -#. Label of the base_in_words (Data) field in DocType 'Sales Order' -#. Label of the base_in_words (Data) field in DocType 'Delivery Note' -#. Label of the base_in_words (Data) field in DocType 'Purchase Receipt' #: erpnext/accounts/doctype/payment_entry/payment_entry.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/buying/doctype/supplier_quotation/supplier_quotation.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 "In Words (Company Currency)" msgstr "" @@ -22377,23 +22636,20 @@ 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 "" #. Description of the 'In Words (Company Currency)' (Data) field in DocType #. 'POS Invoice' -#. Description of the 'In Words (Company Currency)' (Small Text) field in -#. DocType 'Sales Invoice' +#. Description of the 'In Words' (Small Text) field in DocType 'Sales Invoice' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json msgid "In Words will be visible once you save the Sales Invoice." msgstr "" -#. Description of the 'In Words (Company Currency)' (Data) field in DocType -#. 'Sales Order' +#. Description of the 'In Words' (Data) field in DocType 'Sales Order' #: erpnext/selling/doctype/sales_order/sales_order.json msgid "In Words will be visible once you save the Sales Order." msgstr "" @@ -22664,7 +22920,7 @@ msgstr "" #: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:439 #: 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 "" @@ -22951,7 +23207,7 @@ msgid "Inspected By" msgstr "" #: erpnext/controllers/stock_controller.py:1453 -#: erpnext/manufacturing/doctype/job_card/job_card.py:817 +#: erpnext/manufacturing/doctype/job_card/job_card.py:815 msgid "Inspection Rejected" msgstr "" @@ -22975,7 +23231,7 @@ msgid "Inspection Required before Purchase" msgstr "" #: erpnext/controllers/stock_controller.py:1438 -#: erpnext/manufacturing/doctype/job_card/job_card.py:798 +#: erpnext/manufacturing/doctype/job_card/job_card.py:796 msgid "Inspection Submission" msgstr "" @@ -23055,11 +23311,11 @@ msgstr "" #: erpnext/stock/doctype/pick_list/pick_list.py:1019 #: erpnext/stock/doctype/stock_entry/stock_entry.py:957 #: erpnext/stock/serial_batch_bundle.py:1197 erpnext/stock/stock_ledger.py:1710 -#: erpnext/stock/stock_ledger.py:2170 +#: erpnext/stock/stock_ledger.py:2166 msgid "Insufficient Stock" msgstr "" -#: erpnext/stock/stock_ledger.py:2185 +#: erpnext/stock/stock_ledger.py:2181 msgid "Insufficient Stock for Batch" msgstr "" @@ -23195,7 +23451,7 @@ msgstr "" msgid "Interest Income" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2975 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2987 msgid "Interest and/or dunning fee" msgstr "" @@ -23217,10 +23473,10 @@ msgstr "" #. Label of the internal_customer_section (Section Break) field in DocType #. 'Customer' #: erpnext/selling/doctype/customer/customer.json -msgid "Internal Customer" +msgid "Internal Customer Accounting" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:230 +#: erpnext/selling/doctype/customer/customer.py:254 msgid "Internal Customer for company {0} already exists" msgstr "" @@ -23243,10 +23499,10 @@ msgstr "" #. Label of the internal_supplier_section (Section Break) field in DocType #. 'Supplier' #: erpnext/buying/doctype/supplier/supplier.json -msgid "Internal Supplier" +msgid "Internal Supplier Accounting" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:182 +#: erpnext/buying/doctype/supplier/supplier.py:181 msgid "Internal Supplier for company {0} already exists" msgstr "" @@ -23306,11 +23562,11 @@ msgid "Invalid Account" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:400 -#: erpnext/accounts/doctype/payment_request/payment_request.py:879 +#: 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 "" @@ -23326,11 +23582,11 @@ msgstr "" msgid "Invalid Barcode. There is no Item attached to this barcode." msgstr "" -#: erpnext/public/js/controllers/transaction.js:3099 +#: erpnext/public/js/controllers/transaction.js:3206 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:498 msgid "Invalid CSV format. Expected column: doctype_name" msgstr "" @@ -23338,7 +23594,7 @@ 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 "" @@ -23360,7 +23616,7 @@ msgstr "" msgid "Invalid Discount" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:798 +#: erpnext/controllers/taxes_and_totals.py:803 msgid "Invalid Discount Amount" msgstr "" @@ -23489,7 +23745,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 "" @@ -23497,7 +23753,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:1055 msgid "Invalid file URL" msgstr "" @@ -23513,7 +23769,7 @@ msgstr "" msgid "Invalid naming series (. missing) for {0}" msgstr "" -#: 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 "" @@ -23550,7 +23806,7 @@ msgid "Invalid {0}: {1}" msgstr "" #. 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 "" @@ -23589,6 +23845,12 @@ msgstr "" msgid "Inventory Turnover Ratio" msgstr "" +#. Label of the inventory_valuation_section (Section Break) field in DocType +#. 'Item' +#: erpnext/stock/doctype/item/item.json +msgid "Inventory Valuation" +msgstr "" + #: erpnext/setup/setup_wizard/data/industry_type.txt:29 msgid "Investment Banking" msgstr "" @@ -24447,7 +24709,7 @@ 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:2501 +#: erpnext/public/js/controllers/transaction.js:2608 msgid "It is needed to fetch Item Details." msgstr "" @@ -24506,7 +24768,7 @@ msgstr "" #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:33 #: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:204 #: erpnext/buying/workspace/buying/buying.json -#: erpnext/controllers/taxes_and_totals.py:1207 +#: erpnext/controllers/taxes_and_totals.py:1212 #: erpnext/manufacturing/doctype/blanket_order/blanket_order.json #: erpnext/manufacturing/doctype/bom/bom.js:1058 #: erpnext/manufacturing/doctype/bom/bom.json @@ -24563,8 +24825,8 @@ 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_analytics/stock_analytics.py:43 +#: erpnext/stock/report/stock_balance/stock_balance.py:431 #: erpnext/stock/report/stock_ledger/stock_ledger.py:207 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:27 #: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:51 @@ -24580,10 +24842,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 "" @@ -24810,7 +25073,7 @@ 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:2795 +#: erpnext/public/js/controllers/transaction.js:2902 #: 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 @@ -25072,9 +25335,9 @@ msgstr "" #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:100 #: 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:439 #: erpnext/stock/report/stock_ledger/stock_ledger.js:71 #: erpnext/stock/report/stock_ledger/stock_ledger.py:265 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:39 @@ -25292,7 +25555,7 @@ 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:2801 +#: erpnext/public/js/controllers/transaction.js:2908 #: erpnext/public/js/utils.js:740 #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/selling/doctype/sales_order/sales_order.js:1252 @@ -25332,8 +25595,8 @@ msgstr "" #: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:131 #: 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_analytics/stock_analytics.py:45 +#: erpnext/stock/report/stock_balance/stock_balance.py:437 #: erpnext/stock/report/stock_ledger/stock_ledger.py:213 #: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:110 #: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:31 @@ -25598,7 +25861,7 @@ msgstr "" 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 "" @@ -25672,8 +25935,11 @@ msgstr "" #. Label of the section_break_rrrx (Section Break) field in DocType 'Sales #. Forecast' +#. Label of the item_and_warehouse_section (Section Break) field in DocType +#. 'Bin' #. Option for the 'Based On' (Select) field in DocType 'Repost Item Valuation' #: erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json +#: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json msgid "Item and Warehouse" msgstr "" @@ -25735,7 +26001,7 @@ msgstr "" msgid "Item valuation rate is recalculated considering landed cost voucher amount" msgstr "" -#: erpnext/stock/utils.py:531 +#: erpnext/stock/utils.py:532 msgid "Item valuation reposting in progress. Report might show incorrect item valuation." msgstr "" @@ -25768,7 +26034,7 @@ msgstr "" msgid "Item {0} does not exist." msgstr "" -#: erpnext/controllers/selling_controller.py:844 +#: erpnext/controllers/selling_controller.py:851 msgid "Item {0} entered multiple times." msgstr "" @@ -26037,7 +26303,7 @@ msgstr "" #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/manufacturing/doctype/bom/bom.json #: erpnext/manufacturing/doctype/job_card/job_card.json -#: erpnext/manufacturing/doctype/job_card/job_card.py:982 +#: erpnext/manufacturing/doctype/job_card/job_card.py:980 #: erpnext/manufacturing/doctype/operation/operation.json #: erpnext/manufacturing/doctype/work_order/work_order.js:396 #: erpnext/manufacturing/doctype/work_order/work_order.json @@ -26101,7 +26367,7 @@ msgstr "" msgid "Job Card and Capacity Planning" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1458 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1456 msgid "Job Card {0} has been completed" msgstr "" @@ -26177,7 +26443,7 @@ msgstr "" msgid "Job Worker Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2627 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2623 msgid "Job card {0} created" msgstr "" @@ -26204,7 +26470,7 @@ msgstr "" msgid "Journal Entries" msgstr "" -#: erpnext/accounts/utils.py:1063 +#: erpnext/accounts/utils.py:1064 msgid "Journal Entries {0} are un-linked" msgstr "" @@ -26393,7 +26659,7 @@ msgstr "" msgid "Kilowatt-Hour" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:984 +#: erpnext/manufacturing/doctype/job_card/job_card.py:982 msgid "Kindly cancel the Manufacturing Entries first against the work order {0}." msgstr "" @@ -26599,7 +26865,7 @@ msgstr "" msgid "Latest" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:519 +#: erpnext/stock/report/stock_balance/stock_balance.py:550 msgid "Latest Age" msgstr "" @@ -26616,6 +26882,7 @@ msgstr "" #. Name of a DocType #. Option for the 'Status' (Select) field in DocType 'Lead' #. Label of the lead (Link) field in DocType 'Prospect Lead' +#. Label of the lead_name (Link) field in DocType 'Customer' #. Label of a Link in the Home Workspace #. Label of the lead (Link) field in DocType 'Issue' #. Label of a Workspace Sidebar Item @@ -26627,7 +26894,9 @@ msgstr "" #: erpnext/crm/report/lead_details/lead_details.py:18 #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.js:8 #: erpnext/crm/report/prospects_engaged_but_not_converted/prospects_engaged_but_not_converted.py:28 -#: erpnext/public/js/communication.js:25 erpnext/setup/workspace/home/home.json +#: erpnext/public/js/communication.js:25 +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/setup/workspace/home/home.json #: erpnext/support/doctype/issue/issue.json erpnext/workspace_sidebar/crm.json msgid "Lead" msgstr "" @@ -26739,10 +27008,22 @@ 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 -msgid "Learn about Common Party" +msgid "Learn about Common Party" msgstr "" #. Label of the leave_encashed (Select) field in DocType 'Employee' @@ -26842,7 +27123,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 "" @@ -26871,7 +27152,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 "" @@ -26947,7 +27228,7 @@ msgstr "" msgid "Link existing Quality Procedure." msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:603 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:582 msgid "Link to Material Request" msgstr "" @@ -26956,7 +27237,7 @@ msgstr "" msgid "Link to Material Requests" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:127 +#: erpnext/buying/doctype/supplier/supplier.js:125 msgid "Link with Customer" msgstr "" @@ -26985,12 +27266,12 @@ msgstr "" msgid "Linked with submitted documents" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:212 +#: erpnext/buying/doctype/supplier/supplier.js:210 #: erpnext/selling/doctype/customer/customer.js:279 msgid "Linking Failed" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:211 +#: erpnext/buying/doctype/supplier/supplier.js:209 msgid "Linking to Customer Failed. Please try again." msgstr "" @@ -27697,6 +27978,12 @@ msgstr "" msgid "Manage cost of operations" msgstr "" +#. Description of the 'Enable tracking sales commissions' (Check) field in +#. DocType 'Selling Settings' +#: erpnext/selling/doctype/selling_settings/selling_settings.json +msgid "Manage sales partner's and sales team's commissions" +msgstr "" + #: erpnext/utilities/activation.py:95 msgid "Manage your orders" msgstr "" @@ -27921,11 +28208,12 @@ 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 #: erpnext/stock/doctype/material_request/material_request_dashboard.py:18 +#: erpnext/stock/doctype/pick_list/pick_list_dashboard.py:20 #: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order_dashboard.py:13 #: erpnext/workspace_sidebar/manufacturing.json msgid "Manufacturing" @@ -27984,6 +28272,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 @@ -28196,7 +28489,7 @@ msgstr "" msgid "Material Consumption for Manufacture" msgstr "" -#: erpnext/stock/doctype/stock_entry/stock_entry.js:559 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:576 msgid "Material Consumption is not set in Manufacturing Settings." msgstr "" @@ -28262,7 +28555,7 @@ msgstr "" #. Service Item' #. Label of a Workspace Sidebar Item #: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json -#: erpnext/buying/doctype/purchase_order/purchase_order.js:540 +#: 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_item/request_for_quotation_item.json @@ -28505,8 +28798,8 @@ msgstr "" msgid "Materials are already received against the {0} {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:183 -#: erpnext/manufacturing/doctype/job_card/job_card.py:838 +#: erpnext/manufacturing/doctype/job_card/job_card.py:181 +#: erpnext/manufacturing/doctype/job_card/job_card.py:836 msgid "Materials needs to be transferred to the work in progress warehouse for the job card {0}" msgstr "" @@ -28656,7 +28949,7 @@ msgstr "" msgid "Megawatt" msgstr "" -#: erpnext/stock/stock_ledger.py:2014 +#: erpnext/stock/stock_ledger.py:2012 msgid "Mention Valuation Rate in the Item master." msgstr "" @@ -28743,7 +29036,7 @@ msgstr "" msgid "Messages greater than 160 characters will be split into multiple messages" msgstr "" -#: erpnext/setup/install.py:127 +#: erpnext/setup/install.py:128 msgid "Messaging CRM Campaign" msgstr "" @@ -29044,7 +29337,7 @@ msgstr "" msgid "Missing Cost Center" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1132 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1144 msgid "Missing Default in Company" msgstr "" @@ -29068,6 +29361,10 @@ msgstr "" msgid "Missing Item" msgstr "" +#: erpnext/setup/doctype/employee/employee.py:445 +msgid "Missing Parameter" +msgstr "" + #: erpnext/utilities/__init__.py:53 msgid "Missing Payments App" msgstr "" @@ -29085,7 +29382,7 @@ msgid "Missing required filter: {0}" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1183 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1462 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1452 msgid "Missing value" msgstr "" @@ -29329,7 +29626,7 @@ msgstr "" msgid "Multi-level BOM Creator" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:403 +#: erpnext/selling/doctype/customer/customer.py:427 msgid "Multiple Loyalty Programs found for Customer {}. Please select manually." msgstr "" @@ -29372,7 +29669,7 @@ msgid "Music" msgstr "" #. Label of the must_be_whole_number (Check) field in DocType 'UOM' -#: erpnext/manufacturing/doctype/work_order/work_order.py:1409 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1399 #: erpnext/setup/doctype/uom/uom.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267 #: erpnext/utilities/transaction_base.py:566 @@ -29452,7 +29749,7 @@ msgstr "" 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:936 msgid "Naming series '{0}' for DocType '{1}' does not contain standard '.' or '{{' separator. Using fallback extraction." msgstr "" @@ -29500,7 +29797,7 @@ msgstr "" msgid "Negative Quantity is not allowed" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1492 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1502 #: erpnext/stock/serial_batch_bundle.py:1520 msgid "Negative Stock Error" msgstr "" @@ -29609,7 +29906,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 "" @@ -29642,7 +29939,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 "" @@ -29984,7 +30281,7 @@ msgstr "" msgid "New Workplace" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:368 +#: erpnext/selling/doctype/customer/customer.py:392 msgid "New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}" msgstr "" @@ -30064,7 +30361,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:753 msgid "No DocTypes in To Delete list. Please generate or import the list before submitting." msgstr "" @@ -30080,7 +30377,7 @@ msgstr "" msgid "No Item with Serial No {0}" msgstr "" -#: erpnext/controllers/subcontracting_controller.py:1484 +#: erpnext/controllers/subcontracting_controller.py:1488 msgid "No Items selected for transfer." msgstr "" @@ -30350,7 +30647,7 @@ msgstr "" msgid "No outstanding invoices require exchange rate revaluation" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2415 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2427 msgid "No outstanding {0} found for the {1} {2} which qualify the filters you have specified." msgstr "" @@ -30358,6 +30655,10 @@ msgstr "" 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 "" @@ -30474,8 +30775,8 @@ msgid "None of the items have any change in quantity or value." msgstr "" #. 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:684 +#: erpnext/stock/utils.py:686 msgid "Nos" msgstr "" @@ -30575,7 +30876,7 @@ msgstr "" msgid "Note: Automatic log deletion only applies to logs of type Update Cost" msgstr "" -#: erpnext/accounts/party.py:697 +#: erpnext/accounts/party.py:685 msgid "Note: Due Date exceeds allowed {0} credit days by {1} day(s)" msgstr "" @@ -30957,6 +31258,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" @@ -31002,7 +31308,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 "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1067 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:1069 msgid "Only CSV files are allowed" msgstr "" @@ -31214,14 +31520,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 "" -#: 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 "" @@ -31350,7 +31656,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:490 msgid "Opening Qty" msgstr "" @@ -31370,7 +31676,7 @@ msgstr "" msgid "Opening Time" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:466 +#: erpnext/stock/report/stock_balance/stock_balance.py:497 msgid "Opening Value" msgstr "" @@ -31488,7 +31794,7 @@ msgstr "" msgid "Operation Time" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1468 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1458 msgid "Operation Time must be greater than 0 for Operation {0}" msgstr "" @@ -31507,11 +31813,11 @@ msgstr "" msgid "Operation {0} added multiple times in the work order {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1231 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1229 msgid "Operation {0} does not belong to the work order {1}" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:432 +#: erpnext/manufacturing/doctype/workstation/workstation.py:433 msgid "Operation {0} longer than any available working hours in workstation {1}, break down the operation into multiple operations" msgstr "" @@ -31583,6 +31889,7 @@ msgstr "" #. Option for the 'Status' (Select) field in DocType 'Lead' #. Name of a DocType #. Label of the opportunity (Link) field in DocType 'Prospect Opportunity' +#. 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 @@ -31596,6 +31903,7 @@ msgstr "" #: erpnext/crm/report/lead_details/lead_details.js:36 #: erpnext/crm/report/lost_opportunity/lost_opportunity.py:17 #: erpnext/public/js/communication.js:35 +#: erpnext/selling/doctype/customer/customer.json #: erpnext/selling/doctype/quotation/quotation.js:155 #: erpnext/selling/doctype/quotation/quotation.json #: erpnext/workspace_sidebar/crm.json @@ -31953,12 +32261,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_balance/stock_balance.py:512 #: erpnext/stock/report/stock_ledger/stock_ledger.py:244 msgid "Out Qty" msgstr "" -#: erpnext/stock/report/stock_balance/stock_balance.py:487 +#: erpnext/stock/report/stock_balance/stock_balance.py:518 msgid "Out Value" msgstr "" @@ -32045,7 +32353,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 @@ -32720,7 +33028,7 @@ msgstr "" msgid "Paid Amount After Tax (Company Currency)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1928 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1940 msgid "Paid Amount cannot be greater than total negative outstanding amount {0}" msgstr "" @@ -33345,7 +33653,7 @@ msgstr "" msgid "Party Type" msgstr "" -#: erpnext/accounts/party.py:826 +#: erpnext/accounts/party.py:814 msgid "Party Type and Party can only be set for Receivable / Payable account

{0}" msgstr "" @@ -33358,7 +33666,7 @@ msgid "Party Type and Party is required for Receivable / Payable account {0}" msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:520 -#: erpnext/accounts/party.py:427 +#: erpnext/accounts/party.py:415 msgid "Party Type is mandatory" msgstr "" @@ -33575,7 +33883,7 @@ msgstr "" msgid "Payment Entries" msgstr "" -#: erpnext/accounts/utils.py:1150 +#: erpnext/accounts/utils.py:1151 msgid "Payment Entries {0} are un-linked" msgstr "" @@ -33615,16 +33923,16 @@ 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:650 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 "" @@ -33662,7 +33970,7 @@ msgstr "" msgid "Payment Gateway Account" msgstr "" -#: erpnext/accounts/utils.py:1436 +#: erpnext/accounts/utils.py:1437 msgid "Payment Gateway Account not created, please create one manually." msgstr "" @@ -33709,6 +34017,12 @@ msgstr "" msgid "Payment Mode" msgstr "" +#. Label of the payment_options_section (Section Break) field in DocType +#. 'Accounts Settings' +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json +msgid "Payment Options" +msgstr "" + #. Label of the payment_order (Link) field in DocType 'Journal Entry' #. Label of the payment_order (Link) field in DocType 'Payment Entry' #. Name of a DocType @@ -33772,7 +34086,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 "" @@ -33782,7 +34096,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 "" @@ -33813,7 +34127,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 "" @@ -33833,7 +34151,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:1723 +#: 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 @@ -33860,11 +34178,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 "" -#: 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 "" @@ -33872,7 +34190,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 "" @@ -33883,6 +34201,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' @@ -33891,6 +34210,7 @@ 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 @@ -33902,12 +34222,21 @@ msgstr "" 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 @@ -33916,12 +34245,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/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" @@ -34026,7 +34357,7 @@ msgstr "" msgid "Payment URL" msgstr "" -#: erpnext/accounts/utils.py:1138 +#: erpnext/accounts/utils.py:1139 msgid "Payment Unlink Error" msgstr "" @@ -34063,6 +34394,7 @@ msgstr "" msgid "Payment term {0} not used in {1}" msgstr "" +#. Label of the payments_tab (Tab Break) field in DocType 'Accounts Settings' #. Label of the payments (Table) field in DocType 'Cashier Closing' #. Label of the payments (Table) field in DocType 'Payment Reconciliation' #. Label of the payments_section (Section Break) field in DocType 'POS Invoice' @@ -34078,6 +34410,7 @@ msgstr "" #. Label of a Desktop Icon #. Label of a Workspace Sidebar Item #. Title of a Workspace Sidebar +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.js:286 @@ -34507,7 +34840,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 "" @@ -34887,11 +35220,11 @@ msgstr "" msgid "Please Set Supplier Group in Buying Settings." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1894 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1897 msgid "Please Specify Account" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:128 +#: erpnext/buying/doctype/supplier/supplier.py:129 msgid "Please add 'Supplier' role to user {0}." msgstr "" @@ -34947,7 +35280,7 @@ msgstr "" msgid "Please cancel and amend the Payment Entry" msgstr "" -#: erpnext/accounts/utils.py:1137 +#: erpnext/accounts/utils.py:1138 msgid "Please cancel payment entry manually first" msgstr "" @@ -34973,7 +35306,7 @@ 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/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 "" @@ -34998,7 +35331,7 @@ msgstr "" msgid "Please click on 'Generate Schedule' to get schedule" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:598 +#: erpnext/selling/doctype/customer/customer.py:622 msgid "Please contact any of the following users to extend the credit limits for {0}: {1}" msgstr "" @@ -35006,7 +35339,7 @@ msgstr "" msgid "Please contact any of the following users to {} this transaction." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:591 +#: erpnext/selling/doctype/customer/customer.py:615 msgid "Please contact your administrator to extend the credit limits for {0}." msgstr "" @@ -35070,7 +35403,7 @@ msgstr "" msgid "Please enable {0} in the {1}." msgstr "" -#: erpnext/controllers/selling_controller.py:846 +#: erpnext/controllers/selling_controller.py:853 msgid "Please enable {} in {} to allow same item in multiple rows" msgstr "" @@ -35128,7 +35461,7 @@ msgstr "" msgid "Please enter Item Code to get Batch Number" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2956 +#: erpnext/public/js/controllers/transaction.js:3063 msgid "Please enter Item Code to get batch no" msgstr "" @@ -35225,7 +35558,7 @@ msgstr "" msgid "Please enter quantity for item {0}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:184 +#: erpnext/setup/doctype/employee/employee.py:183 msgid "Please enter relieving date." msgstr "" @@ -35253,11 +35586,11 @@ msgstr "" msgid "Please enter valid Financial Year Start and End Dates" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:222 +#: erpnext/setup/doctype/employee/employee.py:221 msgid "Please enter {0}" msgstr "" -#: erpnext/public/js/utils/party.js:322 +#: erpnext/public/js/utils/party.js:344 msgid "Please enter {0} first" msgstr "" @@ -35281,7 +35614,7 @@ msgstr "" msgid "Please fix overlapping time slots for {0}." msgstr "" -#: 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 "" @@ -35293,7 +35626,7 @@ msgstr "" msgid "Please import accounts against parent company or enable {} in company master." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:181 +#: erpnext/setup/doctype/employee/employee.py:180 msgid "Please make sure the employees above report to another Active employee." msgstr "" @@ -35355,8 +35688,8 @@ msgstr "" msgid "Please select Template Type to download template" msgstr "" -#: erpnext/controllers/taxes_and_totals.py:804 -#: erpnext/public/js/controllers/taxes_and_totals.js:782 +#: erpnext/controllers/taxes_and_totals.py:809 +#: erpnext/public/js/controllers/taxes_and_totals.js:796 msgid "Please select Apply Discount On" msgstr "" @@ -35380,13 +35713,13 @@ msgstr "" msgid "Please select Category first" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1505 +#: 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" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:494 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:490 msgid "Please select Company" msgstr "" @@ -35395,7 +35728,7 @@ msgstr "" msgid "Please select Company and Posting Date to getting entries" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:736 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:732 #: erpnext/manufacturing/doctype/plant_floor/plant_floor.js:28 msgid "Please select Company first" msgstr "" @@ -35440,11 +35773,11 @@ msgstr "" 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 "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:737 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:733 msgid "Please select Posting Date first" msgstr "" @@ -35484,7 +35817,7 @@ msgstr "" msgid "Please select a BOM" msgstr "" -#: erpnext/accounts/party.py:429 +#: erpnext/accounts/party.py:417 #: erpnext/stock/doctype/pick_list/pick_list.py:1617 msgid "Please select a Company" msgstr "" @@ -35493,7 +35826,7 @@ msgstr "" #: erpnext/manufacturing/doctype/bom/bom.js:680 #: erpnext/manufacturing/doctype/bom/bom.py:276 #: erpnext/public/js/controllers/accounts.js:277 -#: erpnext/public/js/controllers/transaction.js:3255 +#: erpnext/public/js/controllers/transaction.js:3362 msgid "Please select a Company first." msgstr "" @@ -35517,7 +35850,7 @@ msgstr "" msgid "Please select a Warehouse" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1572 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1570 msgid "Please select a Work Order first." msgstr "" @@ -35586,6 +35919,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 "" @@ -35667,7 +36004,7 @@ msgstr "" msgid "Please select weekly off day" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1222 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1226 #: erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py:616 msgid "Please select {0} first" msgstr "" @@ -35790,7 +36127,7 @@ msgstr "" msgid "Please set a default Holiday List for Company {0}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:273 +#: erpnext/setup/doctype/employee/employee.py:272 msgid "Please set a default Holiday List for Employee {0} or Company {1}" msgstr "" @@ -35839,7 +36176,7 @@ msgstr "" msgid "Please set default Cash or Bank account in Mode of Payments {}" msgstr "" -#: erpnext/accounts/utils.py:2450 +#: erpnext/accounts/utils.py:2451 msgid "Please set default Exchange Gain/Loss Account in Company {}" msgstr "" @@ -35860,7 +36197,7 @@ msgid "Please set default inventory account for item {0}, or their item group or msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:278 -#: erpnext/accounts/utils.py:1159 +#: erpnext/accounts/utils.py:1160 msgid "Please set default {0} in Company {1}" msgstr "" @@ -35876,7 +36213,7 @@ msgstr "" msgid "Please set opening number of booked depreciations" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2644 +#: erpnext/public/js/controllers/transaction.js:2751 msgid "Please set recurring after saving" msgstr "" @@ -35892,11 +36229,11 @@ msgstr "" msgid "Please set the Item Code first" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1635 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1633 msgid "Please set the Target Warehouse in the Job Card" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1639 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1637 msgid "Please set the WIP Warehouse in the Job Card" msgstr "" @@ -35931,7 +36268,7 @@ msgstr "" msgid "Please set {0} in BOM Creator {1}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1129 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1141 msgid "Please set {0} in Company {1} to account for Exchange Gain / Loss" msgstr "" @@ -36127,7 +36464,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 @@ -36203,7 +36540,7 @@ msgstr "" msgid "Posting Date cannot be future date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:1005 +#: erpnext/public/js/controllers/transaction.js:1104 msgid "Posting Date will change to today's date as Edit Posting Date and Time is unchecked. Are you sure want to proceed?" msgstr "" @@ -36419,7 +36756,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 "" @@ -36893,7 +37230,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 "" @@ -36911,7 +37248,7 @@ msgstr "" msgid "Print settings updated in respective print format" msgstr "" -#: erpnext/setup/install.py:111 +#: erpnext/setup/install.py:112 msgid "Print taxes with zero amount" msgstr "" @@ -37338,6 +37675,15 @@ msgstr "" msgid "Production Item" msgstr "" +#. Label of the production_item_info_section (Section Break) field in DocType +#. 'BOM' +#. Label of the production_item_info_section (Section Break) field in DocType +#. 'Work Order' +#: erpnext/manufacturing/doctype/bom/bom.json +#: erpnext/manufacturing/doctype/work_order/work_order.json +msgid "Production Item Info" +msgstr "" + #. Label of the production_plan (Link) field in DocType 'Purchase Order Item' #. Name of a DocType #. Label of the production_plan (Link) field in DocType 'Work Order' @@ -37536,11 +37882,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 "" @@ -37718,6 +38059,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 @@ -37791,10 +38137,13 @@ msgstr "" #. Name of a DocType #. Label of a Link in the CRM Workspace +#. Label of the prospect_name (Link) field in DocType 'Customer' #. Label of a Workspace Sidebar Item #: erpnext/crm/doctype/lead/lead.js:36 erpnext/crm/doctype/lead/lead.js:62 #: erpnext/crm/doctype/prospect/prospect.json -#: erpnext/crm/workspace/crm/crm.json erpnext/workspace_sidebar/crm.json +#: erpnext/crm/workspace/crm/crm.json +#: erpnext/selling/doctype/customer/customer.json +#: erpnext/workspace_sidebar/crm.json msgid "Prospect" msgstr "" @@ -37830,8 +38179,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:783 msgid "Protected DocType" msgstr "" @@ -37912,7 +38261,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:463 erpnext/setup/install.py:346 +#: erpnext/setup/doctype/company/company.py:463 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 @@ -38695,11 +39044,11 @@ msgstr "" msgid "Qty To Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1405 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1395 msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:253 +#: erpnext/manufacturing/doctype/job_card/job_card.py:251 msgid "Qty To Manufacture in the job card cannot be greater than Qty To Manufacture in the work order for the operation {0}.

Solution: Either you can reduce the Qty To Manufacture in the job card or set the 'Overproduction Percentage For Work Order' in the {1}." msgstr "" @@ -38802,7 +39151,7 @@ msgid "Qty to Fetch" msgstr "" #: erpnext/manufacturing/doctype/job_card/job_card.js:304 -#: erpnext/manufacturing/doctype/job_card/job_card.py:874 +#: erpnext/manufacturing/doctype/job_card/job_card.py:872 msgid "Qty to Manufacture" msgstr "" @@ -38935,6 +39284,7 @@ msgstr "" #. Label of the quality_inspection (Link) field in DocType 'Sales Invoice Item' #. Label of the quality_inspection_section_break (Section Break) field in #. DocType 'BOM' +#. Label of the quality_inspection_tab (Tab Break) field in DocType 'BOM' #. Label of the quality_inspection (Link) field in DocType 'Job Card' #. Label of the quality_inspection_section (Section Break) field in DocType #. 'Job Card' @@ -39032,22 +39382,22 @@ msgstr "" msgid "Quality Inspection Template Name" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:783 +#: erpnext/manufacturing/doctype/job_card/job_card.py:781 msgid "Quality Inspection is required for the item {0} before completing the job card {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:794 -#: erpnext/manufacturing/doctype/job_card/job_card.py:803 +#: erpnext/manufacturing/doctype/job_card/job_card.py:792 +#: erpnext/manufacturing/doctype/job_card/job_card.py:801 msgid "Quality Inspection {0} is not submitted for the item: {1}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:813 -#: erpnext/manufacturing/doctype/job_card/job_card.py:822 +#: erpnext/manufacturing/doctype/job_card/job_card.py:811 +#: erpnext/manufacturing/doctype/job_card/job_card.py:820 msgid "Quality Inspection {0} is rejected for the item: {1}" msgstr "" #: erpnext/public/js/controllers/transaction.js:384 -#: erpnext/stock/doctype/stock_entry/stock_entry.js:197 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:196 msgid "Quality Inspection(s)" msgstr "" @@ -39200,7 +39550,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:708 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:725 #: 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 @@ -39343,11 +39693,11 @@ msgstr "" msgid "Quantity to Manufacture" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2567 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2563 msgid "Quantity to Manufacture can not be zero for the operation {0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1397 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1387 msgid "Quantity to Manufacture must be greater than 0." msgstr "" @@ -39379,7 +39729,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 "" @@ -39388,11 +39738,11 @@ msgstr "" msgid "Query Route String" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:139 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:176 msgid "Queue Size should be between 5 and 100" msgstr "" -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:625 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:621 msgid "Quick Journal Entry" msgstr "" @@ -39527,6 +39877,12 @@ msgstr "" msgid "Quoted Amount" msgstr "" +#. Label of the rfq_and_purchase_order_settings_section (Section Break) field +#. in DocType 'Supplier' +#: erpnext/buying/doctype/supplier/supplier.json +msgid "RFQ and Purchase Order Settings" +msgstr "" + #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:119 msgid "RFQs are not allowed for {0} due to a scorecard standing of {1}" msgstr "" @@ -40134,7 +40490,7 @@ msgstr "" msgid "Reason for Failure" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:700 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:679 #: erpnext/selling/doctype/sales_order/sales_order.js:1760 msgid "Reason for Hold" msgstr "" @@ -40585,7 +40941,7 @@ msgstr "" msgid "Reference #{0} dated {1}" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2757 +#: erpnext/public/js/controllers/transaction.js:2864 msgid "Reference Date for Early Payment Discount" msgstr "" @@ -40623,7 +40979,7 @@ msgstr "" msgid "Reference No & Reference Date is required for {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1210 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1222 msgid "Reference No and Reference Date is mandatory for Bank transaction" msgstr "" @@ -40702,6 +41058,7 @@ msgstr "" #. Label of the references_section (Section Break) field in DocType 'Purchase #. Order Item' #. Label of the sb_references (Section Break) field in DocType 'Contract' +#. Label of the references_section (Section Break) field in DocType 'Customer' #. Label of the references_section (Section Break) field in DocType #. 'Subcontracting Order Item' #: erpnext/accounts/doctype/fiscal_year/fiscal_year_dashboard.py:10 @@ -40715,6 +41072,7 @@ msgstr "" #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/crm/doctype/contract/contract.json #: erpnext/projects/doctype/timesheet/timesheet_dashboard.py:7 +#: erpnext/selling/doctype/customer/customer.json #: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json msgid "References" msgstr "" @@ -41140,7 +41498,7 @@ msgstr "" msgid "Report Type is mandatory" msgstr "" -#: erpnext/setup/install.py:206 +#: erpnext/setup/install.py:207 msgid "Report an Issue" msgstr "" @@ -41643,6 +42001,12 @@ msgstr "" msgid "Reserved Batch Conflict" msgstr "" +#. Label of the reserved_inventory_section (Section Break) field in DocType +#. 'Bin' +#: erpnext/stock/doctype/bin/bin.json +msgid "Reserved Inventory" +msgstr "" + #. Label of the reserved_qty (Float) field in DocType 'Bin' #. Label of the reserved_qty (Float) field in DocType 'Stock Reservation Entry' #. Label of the stock_reserved_qty (Float) field in DocType 'Subcontracting @@ -41703,7 +42067,7 @@ msgstr "" msgid "Reserved Quantity for Production" msgstr "" -#: erpnext/stock/stock_ledger.py:2285 +#: erpnext/stock/stock_ledger.py:2281 msgid "Reserved Serial No." msgstr "" @@ -41718,14 +42082,14 @@ msgstr "" #: erpnext/stock/doctype/bin/bin.json #: erpnext/stock/doctype/pick_list/pick_list.js:168 #: erpnext/stock/report/reserved_stock/reserved_stock.json -#: erpnext/stock/report/stock_balance/stock_balance.py:499 -#: erpnext/stock/stock_ledger.py:2269 +#: erpnext/stock/report/stock_balance/stock_balance.py:530 +#: erpnext/stock/stock_ledger.py:2265 #: 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:2314 +#: erpnext/stock/stock_ledger.py:2310 msgid "Reserved Stock for Batch" msgstr "" @@ -42265,11 +42629,46 @@ 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 "" + #. Label of a Card Break in the Quality Workspace #: erpnext/quality_management/workspace/quality/quality.json msgid "Review and Action" @@ -42461,13 +42860,21 @@ msgid "Round Tax Amount Row-wise" msgstr "" #. Label of the rounded_total (Currency) field in DocType 'POS Invoice' +#. Label of the base_rounded_total (Currency) field in DocType 'Purchase +#. Invoice' #. Label of the rounded_total (Currency) field in DocType 'Purchase Invoice' +#. Label of the base_rounded_total (Currency) field in DocType 'Sales Invoice' #. Label of the rounded_total (Currency) field in DocType 'Sales Invoice' +#. Label of the base_rounded_total (Currency) field in DocType 'Purchase Order' #. Label of the rounded_total (Currency) field in DocType 'Purchase Order' #. Label of the rounded_total (Currency) field in DocType 'Supplier Quotation' #. 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' #. Label of the rounded_total (Currency) field in DocType 'Purchase Receipt' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -42484,40 +42891,38 @@ msgid "Rounded Total" msgstr "" #. Label of the base_rounded_total (Currency) field in DocType 'POS Invoice' -#. Label of the base_rounded_total (Currency) field in DocType 'Purchase -#. Invoice' -#. Label of the base_rounded_total (Currency) field in DocType 'Sales Invoice' -#. Label of the base_rounded_total (Currency) field in DocType 'Purchase Order' #. Label of the base_rounded_total (Currency) field in DocType 'Supplier #. Quotation' #. Label of the base_rounded_total (Currency) field in DocType 'Quotation' -#. Label of the base_rounded_total (Currency) field in DocType 'Sales Order' -#. Label of the base_rounded_total (Currency) field in DocType 'Delivery Note' -#. Label of the base_rounded_total (Currency) field in DocType 'Purchase -#. Receipt' #: 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/buying/doctype/supplier_quotation/supplier_quotation.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 "Rounded Total (Company Currency)" msgstr "" #. Label of the rounding_adjustment (Currency) field in DocType 'POS Invoice' +#. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase +#. Invoice' #. Label of the rounding_adjustment (Currency) field in DocType 'Purchase #. Invoice' +#. Label of the base_rounding_adjustment (Currency) field in DocType 'Sales +#. Invoice' #. Label of the rounding_adjustment (Currency) field in DocType 'Sales Invoice' +#. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase +#. Order' #. Label of the rounding_adjustment (Currency) field in DocType 'Purchase #. Order' #. Label of the rounding_adjustment (Currency) field in DocType 'Supplier #. Quotation' #. Label of the rounding_adjustment (Currency) field in DocType 'Quotation' +#. 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' #. Label of the rounding_adjustment (Currency) field in DocType 'Purchase #. Receipt' #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -42540,28 +42945,10 @@ msgstr "" #. Label of the base_rounding_adjustment (Currency) field in DocType 'POS #. Invoice' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase -#. Invoice' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Sales -#. Invoice' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase -#. Order' #. Label of the base_rounding_adjustment (Currency) field in DocType #. 'Quotation' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Sales -#. Order' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Delivery -#. Note' -#. Label of the base_rounding_adjustment (Currency) field in DocType 'Purchase -#. Receipt' #: 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/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 "Rounding Adjustment (Company Currency)" msgstr "" @@ -42744,7 +43131,7 @@ msgstr "" msgid "Row #{0}: Cannot set Rate if the billed amount is greater than the amount for Item {1}." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1112 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1110 msgid "Row #{0}: Cannot transfer more than Required Qty {1} for Item {2} against Job Card {3}" msgstr "" @@ -42891,7 +43278,7 @@ msgstr "" msgid "Row #{0}: From Date cannot be before To Date" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:864 +#: erpnext/manufacturing/doctype/job_card/job_card.py:862 msgid "Row #{0}: From Time and To Time fields are required" msgstr "" @@ -43058,11 +43445,11 @@ msgstr "" msgid "Row #{0}: Rate must be same as {1}: {2} ({3} / {4})" msgstr "" -#: 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 "" -#: 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 "" @@ -43364,7 +43751,7 @@ msgstr "" msgid "Row No {0}: Warehouse is required. Please set a Default Warehouse for Item {1} and Company {2}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:731 +#: erpnext/manufacturing/doctype/job_card/job_card.py:729 msgid "Row {0} : Operation is required against the raw material item {1}" msgstr "" @@ -43446,7 +43833,7 @@ msgstr "" msgid "Row {0}: Debit entry can not be linked with a {1}" msgstr "" -#: erpnext/controllers/selling_controller.py:868 +#: erpnext/controllers/selling_controller.py:875 msgid "Row {0}: Delivery Warehouse ({1}) and Customer Warehouse ({2}) can not be same" msgstr "" @@ -43463,7 +43850,7 @@ msgid "Row {0}: Either Delivery Note Item or Packed Item reference is mandatory. msgstr "" #: erpnext/accounts/doctype/journal_entry/journal_entry.py:1012 -#: erpnext/controllers/taxes_and_totals.py:1335 +#: erpnext/controllers/taxes_and_totals.py:1340 msgid "Row {0}: Exchange Rate is mandatory" msgstr "" @@ -43495,7 +43882,7 @@ msgstr "" msgid "Row {0}: From Time and To Time is mandatory." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:308 +#: erpnext/manufacturing/doctype/job_card/job_card.py:306 #: erpnext/projects/doctype/timesheet/timesheet.py:225 msgid "Row {0}: From Time and To Time of {1} is overlapping with {2}" msgstr "" @@ -43504,7 +43891,7 @@ msgstr "" msgid "Row {0}: From Warehouse is mandatory for internal transfers" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:299 +#: erpnext/manufacturing/doctype/job_card/job_card.py:297 msgid "Row {0}: From time must be less than to time" msgstr "" @@ -43520,7 +43907,7 @@ msgstr "" msgid "Row {0}: Item Tax template updated as per validity and rate applied" msgstr "" -#: erpnext/controllers/selling_controller.py:633 +#: erpnext/controllers/selling_controller.py:640 msgid "Row {0}: Item rate has been updated as per valuation rate since its an internal stock transfer" msgstr "" @@ -43810,7 +44197,7 @@ msgstr "" msgid "SLA Paused On" msgstr "" -#: erpnext/public/js/utils.js:1164 +#: erpnext/public/js/utils.js:1168 msgid "SLA is on hold since {0}" msgstr "" @@ -43909,9 +44296,10 @@ msgstr "" #: erpnext/setup/doctype/company/company.py:649 #: 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 "" @@ -44613,6 +45001,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 @@ -44657,7 +45050,8 @@ msgstr "" #. Label of the section_break2 (Section Break) field in DocType 'POS Invoice' #. Label of the sales_team (Table) field in DocType 'POS Invoice' -#. Label of the section_break2 (Section Break) field in DocType 'Sales Invoice' +#. Label of the sales_team_section (Section Break) field in DocType 'Sales +#. Invoice' #. Label of the sales_team (Table) field in DocType 'Customer' #. Label of the sales_team_tab (Tab Break) field in DocType 'Customer' #. Label of the section_break1 (Section Break) field in DocType 'Sales Order' @@ -44750,7 +45144,7 @@ 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:2814 +#: erpnext/public/js/controllers/transaction.js:2921 #: erpnext/stock/doctype/quality_inspection/quality_inspection.json msgid "Sample Size" msgstr "" @@ -44856,6 +45250,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 @@ -45160,7 +45558,7 @@ msgstr "" msgid "Select Company" msgstr "" -#: erpnext/public/js/print.js:102 +#: erpnext/public/js/print.js:113 msgid "Select Company Address" msgstr "" @@ -45225,7 +45623,7 @@ msgstr "" msgid "Select Items based on Delivery Date" msgstr "" -#: erpnext/public/js/controllers/transaction.js:2853 +#: erpnext/public/js/controllers/transaction.js:2960 msgid "Select Items for Quality Inspection" msgstr "" @@ -45255,6 +45653,10 @@ msgstr "" msgid "Select Loyalty Program" msgstr "" +#: erpnext/public/js/controllers/transaction.js:473 +msgid "Select Payment Schedule" +msgstr "" + #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:407 msgid "Select Possible Supplier" msgstr "" @@ -45322,7 +45724,7 @@ msgstr "" msgid "Select a Company this Employee belongs to." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:182 +#: erpnext/buying/doctype/supplier/supplier.js:180 msgid "Select a Customer" msgstr "" @@ -45366,7 +45768,7 @@ msgstr "" 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 "" @@ -45562,6 +45964,11 @@ msgstr "" 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 "" @@ -45610,7 +46017,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:688 #: erpnext/selling/doctype/sms_center/sms_center.json msgid "Send SMS" msgstr "" @@ -45670,6 +46077,11 @@ msgstr "" msgid "Serial & Batch Item Settings" msgstr "" +#. Label of the section_break_jcmx (Section Break) field in DocType 'Job Card' +#: erpnext/manufacturing/doctype/job_card/job_card.json +msgid "Serial / Batch" +msgstr "" + #. Label of the serial_and_batch_bundle (Link) field in DocType 'Stock #. Reconciliation Item' #. Label of the serial_and_batch_bundle (Link) field in DocType 'Subcontracting @@ -45741,7 +46153,7 @@ 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:2827 +#: erpnext/public/js/controllers/transaction.js:2934 #: erpnext/public/js/utils/serial_no_batch_selector.js:421 #: erpnext/selling/doctype/installation_note_item/installation_note_item.json #: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json @@ -45802,7 +46214,7 @@ msgstr "" msgid "Serial No Range" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2539 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2549 msgid "Serial No Reserved" msgstr "" @@ -45859,7 +46271,7 @@ msgstr "" msgid "Serial No and Batch Traceability" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1115 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1125 msgid "Serial No is mandatory" msgstr "" @@ -45888,11 +46300,11 @@ msgstr "" msgid "Serial No {0} does not exist" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3279 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3315 msgid "Serial No {0} does not exists" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:359 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:369 msgid "Serial No {0} is already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -45904,7 +46316,7 @@ msgstr "" msgid "Serial No {0} is already assigned to customer {1}. Can only be returned against the customer {1}" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:431 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:441 msgid "Serial No {0} is not present in the {1} {2}, hence you can't return it against the {1} {2}" msgstr "" @@ -45942,15 +46354,15 @@ msgstr "" msgid "Serial Nos and Batches" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1825 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1835 msgid "Serial Nos are created successfully" msgstr "" -#: erpnext/stock/stock_ledger.py:2275 +#: erpnext/stock/stock_ledger.py:2271 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:365 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:375 msgid "Serial Nos {0} are already Delivered. You cannot use them again in Manufacture / Repack entry." msgstr "" @@ -46026,11 +46438,11 @@ msgstr "" msgid "Serial and Batch Bundle" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2047 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2057 msgid "Serial and Batch Bundle created" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2119 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2129 msgid "Serial and Batch Bundle updated" msgstr "" @@ -46086,7 +46498,7 @@ msgstr "" msgid "Serial and Batch Summary" msgstr "" -#: erpnext/stock/utils.py:395 +#: erpnext/stock/utils.py:396 msgid "Serial number {0} entered more than once" msgstr "" @@ -46152,7 +46564,7 @@ msgstr "" #: erpnext/accounts/doctype/budget/budget.json #: erpnext/accounts/doctype/cashier_closing/cashier_closing.json #: erpnext/accounts/doctype/dunning/dunning.json -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:659 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:655 #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_template/journal_entry_template.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -46208,7 +46620,7 @@ msgstr "" msgid "Series for Asset Depreciation Entry (Journal Entry)" msgstr "" -#: erpnext/buying/doctype/supplier/supplier.py:142 +#: erpnext/buying/doctype/supplier/supplier.py:143 msgid "Series is mandatory" msgstr "" @@ -46397,12 +46809,12 @@ msgid "Service Stop Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:45 -#: erpnext/public/js/controllers/transaction.js:1671 +#: erpnext/public/js/controllers/transaction.js:1770 msgid "Service Stop Date cannot be after Service End Date" msgstr "" #: erpnext/accounts/deferred_revenue.py:42 -#: erpnext/public/js/controllers/transaction.js:1668 +#: erpnext/public/js/controllers/transaction.js:1767 msgid "Service Stop Date cannot be before Service Start Date" msgstr "" @@ -46737,7 +47149,7 @@ msgid "Setting up company" msgstr "" #: erpnext/manufacturing/doctype/bom/bom.py:1182 -#: erpnext/manufacturing/doctype/work_order/work_order.py:1461 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1451 msgid "Setting {0} is required" msgstr "" @@ -46757,6 +47169,21 @@ msgstr "" msgid "Settled" 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 "" @@ -47161,7 +47588,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 "" @@ -47300,6 +47727,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 "" @@ -47312,7 +47740,7 @@ msgstr "" msgid "Show only the Immediate Upcoming Term" msgstr "" -#: erpnext/stock/utils.py:557 +#: erpnext/stock/utils.py:558 msgid "Show pending entries" msgstr "" @@ -47460,7 +47888,7 @@ msgstr "" msgid "Skip Material Transfer to WIP Warehouse" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:561 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:563 msgid "Skipped {0} DocType(s):
{1}" msgstr "" @@ -47609,7 +48037,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:699 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:716 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Source Warehouse" msgstr "" @@ -47729,7 +48157,7 @@ msgstr "" msgid "Split Quantity must be less than Asset Quantity" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2441 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2453 msgid "Splitting {0} {1} into {2} rows as per Payment Terms" msgstr "" @@ -47787,7 +48215,7 @@ msgstr "" msgid "Stale Days" msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:109 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:146 msgid "Stale Days should start from 1." msgstr "" @@ -47913,11 +48341,6 @@ msgstr "" msgid "Start date should be less than end date for task {0}" msgstr "" -#. Label of the started_time (Datetime) field in DocType 'Job Card' -#: erpnext/manufacturing/doctype/job_card/job_card.json -msgid "Started Time" -msgstr "" - #: erpnext/utilities/bulk_transaction.py:44 msgid "Started a background job to create {1} {0}. {2}" msgstr "" @@ -47956,6 +48379,11 @@ msgstr "" msgid "Status Illustration" msgstr "" +#. Label of the section_break_dfoc (Section Break) field in DocType 'Job Card' +#: erpnext/manufacturing/doctype/job_card/job_card.json +msgid "Status and Reference" +msgstr "" + #: erpnext/projects/doctype/project/project.py:712 msgid "Status must be Cancelled or Completed" msgstr "" @@ -48049,7 +48477,7 @@ msgstr "" #. Label of a Workspace Sidebar Item #: erpnext/selling/doctype/quotation_item/quotation_item.json #: erpnext/stock/doctype/item/item.js:90 -#: erpnext/stock/doctype/warehouse/warehouse.js:61 +#: 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 #: erpnext/stock/workspace/stock/stock.json @@ -48171,7 +48599,7 @@ msgstr "" msgid "Stock Entry {0} created" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1498 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1496 msgid "Stock Entry {0} has created" msgstr "" @@ -48444,7 +48872,7 @@ msgstr "" #: erpnext/controllers/subcontracting_inward_controller.py:1003 #: erpnext/manufacturing/doctype/production_plan/production_plan.py:2234 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2109 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2100 #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:1777 msgid "Stock Reservation Entries Created" msgstr "" @@ -48509,7 +48937,7 @@ msgstr "" #. Name of a DocType #. Label of a Link in the Stock Workspace #. Label of a Workspace Sidebar Item -#: erpnext/selling/doctype/selling_settings/selling_settings.py:94 +#: erpnext/selling/doctype/selling_settings/selling_settings.py:115 #: erpnext/setup/doctype/company/company.json #: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json #: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:675 @@ -48520,6 +48948,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 @@ -48620,7 +49053,7 @@ 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_balance/stock_balance.py:469 #: erpnext/stock/report/stock_ledger/stock_ledger.py:215 #: 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 @@ -48786,7 +49219,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:549 msgid "Stock/Accounts can not be frozen as processing of backdated entries is going on. Please try again later." msgstr "" @@ -48801,7 +49234,7 @@ msgstr "" msgid "Stop Reason" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1071 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1065 msgid "Stopped Work Order cannot be cancelled, Unstop it first to cancel" msgstr "" @@ -49221,6 +49654,11 @@ 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" @@ -49255,6 +49693,8 @@ msgstr "" msgid "Submit your Quotation" msgstr "" +#. Label of the subscription_section (Section Break) field in DocType 'Journal +#. Entry' #. Label of the subscription (Link) field in DocType 'Process Subscription' #. Label of the subscription_section (Section Break) field in DocType 'Purchase #. Invoice' @@ -49267,6 +49707,7 @@ msgstr "" #. Label of a Desktop Icon #. Title of a Workspace Sidebar #. Label of a Workspace Sidebar Item +#: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/process_subscription/process_subscription.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice_dashboard.py:26 @@ -49337,8 +49778,6 @@ msgstr "" msgid "Subscription Price Based On" msgstr "" -#. Label of the subscription_section (Section Break) field in DocType 'Journal -#. Entry' #. Label of the subscription_section (Section Break) field in DocType 'Payment #. Entry' #. Label of the subscription_section (Section Break) field in DocType 'Payment @@ -49347,7 +49786,6 @@ msgstr "" #. Invoice' #. Label of the subscription_section (Section Break) field in DocType 'Delivery #. Note' -#: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/payment_request/payment_request.json #: erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -49433,7 +49871,7 @@ msgstr "" msgid "Successfully imported {0} records." msgstr "" -#: erpnext/buying/doctype/supplier/supplier.js:204 +#: erpnext/buying/doctype/supplier/supplier.js:202 msgid "Successfully linked to Customer" msgstr "" @@ -49826,6 +50264,8 @@ msgid "Supplier Number At Customer" msgstr "" #. Label of the supplier_numbers (Table) field in DocType 'Customer' +#. Label of the supplier_numbers_section (Section Break) field in DocType +#. 'Customer' #: erpnext/selling/doctype/customer/customer.json msgid "Supplier Numbers" msgstr "" @@ -49872,7 +50312,7 @@ msgstr "" #. Label of a Link in the Buying Workspace #. Label of the supplier_quotation (Link) field in DocType 'Quotation' #. Label of a Workspace Sidebar Item -#: erpnext/buying/doctype/purchase_order/purchase_order.js:565 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:544 #: erpnext/buying/doctype/purchase_order/purchase_order.json #: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json #: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:40 @@ -50350,7 +50790,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:705 +#: erpnext/stock/doctype/stock_entry/stock_entry.js:722 #: erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json msgid "Target Warehouse" msgstr "" @@ -50378,7 +50818,7 @@ msgstr "" msgid "Target Warehouse is required before Submit" msgstr "" -#: erpnext/controllers/selling_controller.py:874 +#: erpnext/controllers/selling_controller.py:881 msgid "Target Warehouse is set for some items but the customer is not an internal customer." msgstr "" @@ -50715,6 +51155,12 @@ msgstr "" msgid "Tax Type" msgstr "" +#. Label of the tax_withholding_tab (Tab Break) field in DocType 'Journal +#. Entry' +#: erpnext/accounts/doctype/journal_entry/journal_entry.json +msgid "Tax Withholding" +msgstr "" + #. Name of a DocType #: erpnext/accounts/doctype/tax_withholding_account/tax_withholding_account.json msgid "Tax Withholding Account" @@ -50773,8 +51219,6 @@ msgstr "" msgid "Tax Withholding Entries" msgstr "" -#. Label of the section_tax_withholding_entry (Section Break) field in DocType -#. 'Journal Entry' #. Label of the section_tax_withholding_entry (Section Break) field in DocType #. 'Payment Entry' #. Label of the section_tax_withholding_entry (Section Break) field in DocType @@ -50782,7 +51226,6 @@ msgstr "" #. Label of the section_tax_withholding_entry (Section Break) field in DocType #. 'Sales Invoice' #. Name of a DocType -#: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/payment_entry/payment_entry.json #: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json #: erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -50856,7 +51299,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:1207 +#: erpnext/controllers/taxes_and_totals.py:1212 msgid "Taxable Amount" msgstr "" @@ -51429,7 +51872,7 @@ msgstr "" 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 "" @@ -51453,7 +51896,7 @@ msgstr "" msgid "The Serial No at Row #{0}: {1} is not available in warehouse {2}." msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2536 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:2546 msgid "The Serial No {0} is reserved against the {1} {2} and cannot be used for any other transaction." msgstr "" @@ -51471,11 +51914,11 @@ msgstr "" 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 "" -#: 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 "" @@ -51483,7 +51926,7 @@ msgstr "" 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 "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1304 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1302 msgid "The completed quantity {0} of an operation {1} cannot be greater than the completed quantity {2} of a previous operation {3}." msgstr "" @@ -51560,7 +52003,7 @@ msgstr "" msgid "The following deleted attributes exist in Variants but not in the Template. You can either delete the Variants or keep the attribute(s) in template." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:176 +#: erpnext/setup/doctype/employee/employee.py:175 msgid "The following employees are currently still reporting to {0}:" msgstr "" @@ -51568,6 +52011,12 @@ 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 "" @@ -51647,7 +52096,7 @@ msgstr "" msgid "The parent account {0} does not exists in the uploaded template" msgstr "" -#: 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 "" @@ -51806,11 +52255,11 @@ msgstr "" msgid "The warehouse where your Items will be transferred when you begin production. Group Warehouse can also be selected as a Work in Progress warehouse." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:877 +#: erpnext/manufacturing/doctype/job_card/job_card.py:875 msgid "The {0} ({1}) must be equal to {2} ({3})" msgstr "" -#: erpnext/public/js/controllers/transaction.js:3294 +#: erpnext/public/js/controllers/transaction.js:3401 msgid "The {0} contains Unit Price Items." msgstr "" @@ -51826,7 +52275,7 @@ msgstr "" msgid "The {0} {1} does not match with the {0} {2} in the {3} {4}" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:980 +#: erpnext/manufacturing/doctype/job_card/job_card.py:978 msgid "The {0} {1} is used to calculate the valuation cost for the finished good {2}." msgstr "" @@ -51870,7 +52319,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:587 +#: erpnext/accounts/party.py:575 msgid "There can only be 1 Account per Company in {0} {1}" msgstr "" @@ -51911,7 +52360,7 @@ msgstr "" msgid "There was an issue connecting to Plaid's authentication server. Check browser console for more information" msgstr "" -#: erpnext/accounts/utils.py:1135 +#: erpnext/accounts/utils.py:1136 msgid "There were issues unlinking payment entry {0}." msgstr "" @@ -52162,7 +52611,7 @@ msgstr "" msgid "This will restrict user access to other employee records" msgstr "" -#: erpnext/controllers/selling_controller.py:875 +#: erpnext/controllers/selling_controller.py:882 msgid "This {} will be treated as material transfer." msgstr "" @@ -52273,7 +52722,7 @@ msgstr "" msgid "Time in mins." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:856 +#: erpnext/manufacturing/doctype/job_card/job_card.py:854 msgid "Time logs are required for {0} {1}" msgstr "" @@ -52630,7 +53079,7 @@ msgstr "" 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 "" @@ -52648,7 +53097,7 @@ 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:2231 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2243 #: erpnext/controllers/accounts_controller.py:3234 msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included" msgstr "" @@ -52723,26 +53172,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:599 -#: erpnext/buying/doctype/purchase_order/purchase_order.js:675 -#: 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" @@ -52954,12 +53383,12 @@ msgstr "" #. Label of the total_completed_qty (Float) field in DocType 'Job Card' #: erpnext/manufacturing/doctype/job_card/job_card.json -#: erpnext/manufacturing/doctype/job_card/job_card.py:873 +#: erpnext/manufacturing/doctype/job_card/job_card.py:871 #: erpnext/manufacturing/report/job_card_summary/job_card_summary.py:174 msgid "Total Completed Qty" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:190 +#: erpnext/manufacturing/doctype/job_card/job_card.py:188 msgid "Total Completed Qty is required for Job Card {0}, please start and complete the job card before submission" msgstr "" @@ -53228,7 +53657,7 @@ msgstr "" 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 "" @@ -53528,7 +53957,7 @@ msgstr "" msgid "Total allocated percentage for sales team should be 100" msgstr "" -#: erpnext/selling/doctype/customer/customer.py:168 +#: erpnext/selling/doctype/customer/customer.py:192 msgid "Total contribution percentage should be equal to 100" msgstr "" @@ -53557,8 +53986,8 @@ 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:756 +#: erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py:757 #: erpnext/accounts/report/financial_statements.py:352 #: erpnext/accounts/report/financial_statements.py:353 msgid "Total {0} ({1})" @@ -53576,6 +54005,27 @@ msgstr "" msgid "Total(Qty)" msgstr "" +#. Label of the base_totals_section (Section Break) field in DocType 'Purchase +#. Invoice' +#. Label of the base_totals_section (Section Break) field in DocType 'Sales +#. Invoice' +#. Label of the base_totals_section (Section Break) field in DocType 'Purchase +#. Order' +#. 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 +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json +#: erpnext/buying/doctype/purchase_order/purchase_order.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 "" + #: erpnext/stock/doctype/item/item_dashboard.py:33 msgid "Traceability" msgstr "" @@ -53685,11 +54135,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:1100 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:1119 msgid "Transaction Deletion Record {0} is currently deleting {1}. Cannot save documents until deletion completes." msgstr "" @@ -53751,7 +54201,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 "" @@ -53775,11 +54225,11 @@ msgstr "" msgid "Transaction from which tax is withheld" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:849 +#: erpnext/manufacturing/doctype/job_card/job_card.py:847 msgid "Transaction not allowed against stopped Work Order {0}" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1236 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1248 msgid "Transaction reference no {0} dated {1}" msgstr "" @@ -54216,7 +54666,7 @@ msgstr "" #: erpnext/stock/report/item_prices/item_prices.py:55 #: erpnext/stock/report/product_bundle_balance/product_bundle_balance.py:94 #: 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 @@ -54311,6 +54761,24 @@ msgstr "" msgid "URL can only be a string" msgstr "" +#. Label of the utm_analytics_section (Section Break) field in DocType 'POS +#. Invoice' +#. Label of the utm_analytics_section (Section Break) field in DocType 'Sales +#. Invoice' +#. Label of the utm_analytics_section (Section Break) field in DocType +#. 'Quotation' +#. Label of the utm_analytics_section (Section Break) field in DocType 'Sales +#. Order' +#. Label of the utm_analytics_section (Section Break) field in DocType +#. 'Delivery Note' +#: erpnext/accounts/doctype/pos_invoice/pos_invoice.json +#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json +#: erpnext/selling/doctype/quotation/quotation.json +#: erpnext/selling/doctype/sales_order/sales_order.json +#: erpnext/stock/doctype/delivery_note/delivery_note.json +msgid "UTM Analytics" +msgstr "" + #. Option for the 'Data Fetch Method' (Select) field in DocType 'Accounts #. Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -54326,7 +54794,7 @@ 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:466 msgid "Unable to fetch DocType details. Please contact system administrator." msgstr "" @@ -54343,7 +54811,7 @@ msgstr "" msgid "Unable to find score starting at {0}. You need to have standing scores covering 0 to 100" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1029 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1023 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 "" @@ -54374,8 +54842,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 "" @@ -54415,7 +54883,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 "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:933 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:935 msgid "Unexpected Naming Series Pattern" msgstr "" @@ -54625,7 +55093,7 @@ msgstr "" msgid "Unsecured Loans" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1727 +#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1730 msgid "Unset Matched Payment Request" msgstr "" @@ -54820,7 +55288,7 @@ msgstr "" msgid "Update Rate and Availability" msgstr "" -#: erpnext/buying/doctype/purchase_order/purchase_order.js:588 +#: erpnext/buying/doctype/purchase_order/purchase_order.js:567 msgid "Update Rate as per Last Purchase" msgstr "" @@ -54894,7 +55362,7 @@ msgstr "" msgid "Updating Work Order status" msgstr "" -#: erpnext/public/js/print.js:140 +#: erpnext/public/js/print.js:151 msgid "Updating details." msgstr "" @@ -55107,7 +55575,7 @@ msgstr "" msgid "Used with Financial Report Template" msgstr "" -#: erpnext/setup/install.py:194 +#: erpnext/setup/install.py:195 msgid "User Forum" msgstr "" @@ -55118,7 +55586,7 @@ msgstr "" #. Label of the user_remark (Small Text) field in DocType 'Journal Entry' #. Label of the user_remark (Small Text) field in DocType 'Journal Entry #. Account' -#: erpnext/accounts/doctype/journal_entry/journal_entry.js:655 +#: erpnext/accounts/doctype/journal_entry/journal_entry.js:651 #: erpnext/accounts/doctype/journal_entry/journal_entry.json #: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json msgid "User Remark" @@ -55133,7 +55601,7 @@ msgstr "" msgid "User has not applied rule on the invoice {0}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:191 +#: erpnext/setup/doctype/employee/employee.py:190 msgid "User {0} does not exist" msgstr "" @@ -55141,15 +55609,15 @@ msgstr "" msgid "User {0} doesn't have any default POS Profile. Check Default at Row {1} for this User." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:208 +#: erpnext/setup/doctype/employee/employee.py:207 msgid "User {0} is already assigned to Employee {1}" msgstr "" -#: erpnext/setup/doctype/employee/employee.py:246 +#: erpnext/setup/doctype/employee/employee.py:245 msgid "User {0}: Removed Employee Self Service role as there is no mapped employee." msgstr "" -#: erpnext/setup/doctype/employee/employee.py:241 +#: erpnext/setup/doctype/employee/employee.py:240 msgid "User {0}: Removed Employee role as there is no mapped employee." msgstr "" @@ -55157,18 +55625,18 @@ msgstr "" msgid "User {} is disabled. Please select valid user/cashier" msgstr "" -#. Description of the 'Track Semi Finished Goods' (Check) field in DocType -#. 'BOM' -#: erpnext/manufacturing/doctype/bom/bom.json -msgid "Users can consume raw materials and add semi-finished goods or final finished goods against the operation using job cards." -msgstr "" - #. Description of the 'Set Landed Cost Based on Purchase Invoice Rate' (Check) #. field in DocType 'Buying Settings' #: erpnext/buying/doctype/buying_settings/buying_settings.json msgid "Users can enable the checkbox If they want to adjust the incoming rate (set using purchase receipt) based on the purchase invoice rate." msgstr "" +#. Description of the 'Track Semi Finished Goods' (Check) field in DocType +#. 'BOM' +#: erpnext/manufacturing/doctype/bom/bom.json +msgid "Users can make manufacture entry against Job Cards" +msgstr "" + #. Description of the 'Role Allowed to Over Bill ' (Link) field in DocType #. 'Accounts Settings' #: erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -55433,7 +55901,7 @@ 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_balance/stock_balance.py:520 #: erpnext/stock/report/stock_ledger/stock_ledger.py:298 msgid "Valuation Rate" msgstr "" @@ -55442,11 +55910,11 @@ msgstr "" msgid "Valuation Rate (In / Out)" msgstr "" -#: erpnext/stock/stock_ledger.py:2017 +#: erpnext/stock/stock_ledger.py:2015 msgid "Valuation Rate Missing" msgstr "" -#: erpnext/stock/stock_ledger.py:1995 +#: erpnext/stock/stock_ledger.py:1993 msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}." msgstr "" @@ -55477,7 +55945,7 @@ msgstr "" msgid "Valuation rate for the item as per Sales Invoice (Only for Internal Transfers)" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2255 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2267 #: erpnext/controllers/accounts_controller.py:3258 msgid "Valuation type charges can not be marked as Inclusive" msgstr "" @@ -55771,6 +56239,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 "" @@ -55808,10 +56284,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 "" @@ -55820,6 +56328,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" @@ -55834,7 +56352,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 "" @@ -55966,7 +56484,7 @@ msgstr "" msgid "Voucher No" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1341 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1351 msgid "Voucher No is mandatory" msgstr "" @@ -56228,7 +56746,7 @@ msgstr "" msgid "Warehouse {0} does not belong to Company {1}." msgstr "" -#: erpnext/stock/utils.py:409 +#: erpnext/stock/utils.py:410 msgid "Warehouse {0} does not belong to company {1}" msgstr "" @@ -56361,7 +56879,7 @@ msgstr "" msgid "Warning: Material Requested Qty is less than Minimum Order Qty" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1446 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1436 msgid "Warning: Quantity exceeds maximum producible quantity based on quantity of raw materials received through the Subcontracting Inward Order {0}." msgstr "" @@ -56495,7 +57013,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 "" @@ -56855,16 +57373,22 @@ msgstr "" msgid "Work Order Summary" msgstr "" +#. 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:908 msgid "Work Order cannot be created for following reason:
{0}" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:1390 +#: erpnext/manufacturing/doctype/work_order/work_order.py:1380 msgid "Work Order cannot be raised against a Item Template" msgstr "" -#: erpnext/manufacturing/doctype/work_order/work_order.py:2431 -#: erpnext/manufacturing/doctype/work_order/work_order.py:2511 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2427 +#: erpnext/manufacturing/doctype/work_order/work_order.py:2507 msgid "Work Order has been {0}" msgstr "" @@ -57029,7 +57553,7 @@ msgstr "" msgid "Workstation Working Hour" msgstr "" -#: erpnext/manufacturing/doctype/workstation/workstation.py:452 +#: erpnext/manufacturing/doctype/workstation/workstation.py:453 msgid "Workstation is closed on the following dates as per Holiday List: {0}" msgstr "" @@ -57192,7 +57716,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 "" @@ -57265,7 +57789,7 @@ msgstr "" msgid "You can use {0} to reconcile against {1} later." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1316 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1314 msgid "You can't make any changes to Job Card since Work Order is closed." msgstr "" @@ -57305,7 +57829,7 @@ msgstr "" msgid "You cannot edit root node." msgstr "" -#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:144 +#: erpnext/accounts/doctype/accounts_settings/accounts_settings.py:181 msgid "You cannot enable both the settings '{0}' and '{1}'." msgstr "" @@ -57365,7 +57889,7 @@ msgstr "" 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 "" -#: erpnext/selling/doctype/selling_settings/selling_settings.py:89 +#: erpnext/selling/doctype/selling_settings/selling_settings.py:110 msgid "You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted into the transaction price list." msgstr "" @@ -57457,7 +57981,7 @@ msgstr "" msgid "`Allow Negative rates for Items`" msgstr "" -#: erpnext/stock/stock_ledger.py:2009 +#: erpnext/stock/stock_ledger.py:2007 msgid "after" msgstr "" @@ -57477,7 +58001,7 @@ msgstr "" msgid "as a percentage of finished item quantity" msgstr "" -#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1473 +#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:1483 msgid "as of {0}" msgstr "" @@ -57622,7 +58146,7 @@ msgstr "" msgid "out of 5" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1229 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1241 msgid "paid to" msgstr "" @@ -57647,7 +58171,7 @@ msgstr "" msgid "per hour" msgstr "" -#: erpnext/stock/stock_ledger.py:2010 +#: erpnext/stock/stock_ledger.py:2008 msgid "performing either one below:" msgstr "" @@ -57672,7 +58196,7 @@ msgstr "" msgid "ratings" msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1229 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1241 msgid "received from" msgstr "" @@ -57805,7 +58329,7 @@ msgstr "" msgid "{0} Digest" msgstr "" -#: erpnext/accounts/utils.py:1496 +#: erpnext/accounts/utils.py:1497 msgid "{0} Number {1} is already used in {2} {3}" msgstr "" @@ -57882,7 +58406,7 @@ msgstr "" msgid "{0} cannot be used as a Main Cost Center because it has been used as child in Cost Center Allocation {1}" msgstr "" -#: erpnext/accounts/doctype/payment_request/payment_request.py:123 +#: erpnext/accounts/doctype/payment_request/payment_request.py:146 msgid "{0} cannot be zero" msgstr "" @@ -57951,7 +58475,7 @@ msgstr "" msgid "{0} in row {1}" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:450 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:452 msgid "{0} is a child table and will be deleted automatically with its parent" msgstr "" @@ -57965,7 +58489,7 @@ msgstr "" 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:628 msgid "{0} is already running for {1}" msgstr "" @@ -57994,7 +58518,7 @@ msgstr "" msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}." msgstr "" -#: erpnext/selling/doctype/customer/customer.py:210 +#: erpnext/selling/doctype/customer/customer.py:234 msgid "{0} is not a company bank account" msgstr "" @@ -58018,7 +58542,7 @@ msgstr "" msgid "{0} is not enabled in {1}" msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:634 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:636 msgid "{0} is not running. Cannot trigger events for this Document" msgstr "" @@ -58026,7 +58550,7 @@ msgstr "" msgid "{0} is not the default supplier for any items." msgstr "" -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2937 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2949 msgid "{0} is on hold till {1}" msgstr "" @@ -58086,12 +58610,12 @@ msgstr "" msgid "{0} units of {1} are required in {2} with the inventory dimension: {3} on {4} {5} for {6} to complete the transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:1683 erpnext/stock/stock_ledger.py:2161 -#: erpnext/stock/stock_ledger.py:2175 +#: erpnext/stock/stock_ledger.py:1683 erpnext/stock/stock_ledger.py:2157 +#: erpnext/stock/stock_ledger.py:2171 msgid "{0} units of {1} needed in {2} on {3} {4} for {5} to complete this transaction." msgstr "" -#: erpnext/stock/stock_ledger.py:2262 erpnext/stock/stock_ledger.py:2307 +#: erpnext/stock/stock_ledger.py:2258 erpnext/stock/stock_ledger.py:2303 msgid "{0} units of {1} needed in {2} on {3} {4} to complete this transaction." msgstr "" @@ -58103,7 +58627,7 @@ msgstr "" msgid "{0} until {1}" msgstr "" -#: erpnext/stock/utils.py:400 +#: erpnext/stock/utils.py:401 msgid "{0} valid serial nos for Item {1}" msgstr "" @@ -58123,7 +58647,7 @@ msgstr "" msgid "{0} will be set as the {1} in subsequently scanned items" msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:989 +#: erpnext/manufacturing/doctype/job_card/job_card.py:987 msgid "{0} {1}" msgstr "" @@ -58145,11 +58669,11 @@ msgstr "" #: erpnext/accounts/doctype/payment_entry/payment_entry.py:613 #: erpnext/accounts/doctype/payment_entry/payment_entry.py:666 -#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2679 +#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2691 msgid "{0} {1} does not exist" msgstr "" -#: erpnext/accounts/party.py:567 +#: erpnext/accounts/party.py:555 msgid "{0} {1} has accounting entries in currency {2} for company {3}. Please select a receivable or payable account with currency {2}." msgstr "" @@ -58200,11 +58724,11 @@ msgstr "" msgid "{0} {1} is closed" msgstr "" -#: erpnext/accounts/party.py:805 +#: erpnext/accounts/party.py:793 msgid "{0} {1} is disabled" msgstr "" -#: erpnext/accounts/party.py:811 +#: erpnext/accounts/party.py:799 msgid "{0} {1} is frozen" msgstr "" @@ -58212,7 +58736,7 @@ msgstr "" msgid "{0} {1} is fully billed" msgstr "" -#: erpnext/accounts/party.py:815 +#: erpnext/accounts/party.py:803 msgid "{0} {1} is not active" msgstr "" @@ -58321,24 +58845,24 @@ msgstr "" msgid "{0}'s {1} cannot be after {2}'s Expected End Date." msgstr "" -#: erpnext/manufacturing/doctype/job_card/job_card.py:1288 -#: erpnext/manufacturing/doctype/job_card/job_card.py:1296 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1286 +#: erpnext/manufacturing/doctype/job_card/job_card.py:1294 msgid "{0}, complete the operation {1} before the operation {2}." msgstr "" -#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:521 +#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py:523 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:518 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:514 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:528 msgid "{0}: Virtual DocType (no database table)" msgstr "" @@ -58346,7 +58870,7 @@ msgstr "" msgid "{0}: {1} does not belong to the Company: {2}" msgstr "" -#: erpnext/accounts/party.py:80 +#: erpnext/accounts/party.py:78 msgid "{0}: {1} does not exists" msgstr "" @@ -58354,7 +58878,7 @@ msgstr "" msgid "{0}: {1} is a group account." msgstr "" -#: 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 "" @@ -58403,7 +58927,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 "" From 1e4478765a605756a64276127af25e8c33bed5d6 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sun, 1 Mar 2026 15:04:17 +0530 Subject: [PATCH 27/85] fix: use stock qty instead of qty when creating stock entry from MR (cherry picked from commit 30c3ff2efed41d71b178a84e365e3ad83d83ff06) --- erpnext/stock/doctype/material_request/material_request.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 1868730ffd3..47822ba1dae 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -330,7 +330,8 @@ class MaterialRequest(BuyingController): if mr_qty_allowance: allowed_qty = flt( - (d.qty + (d.qty * (mr_qty_allowance / 100))), d.precision("ordered_qty") + (d.stock_qty + (d.stock_qty * (mr_qty_allowance / 100))), + d.precision("ordered_qty"), ) if d.ordered_qty and flt(d.ordered_qty, precision) > flt(allowed_qty, precision): From c274b7cc2e25b5be6e0b0ef57e9ab44e5cf1eb33 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sun, 1 Mar 2026 15:16:38 +0530 Subject: [PATCH 28/85] fix: allow allowed roles to bypass over billing validation (cherry picked from commit 04127019f9c4ea7776a85ef583118d1b283adbe8) --- .../stock/doctype/purchase_receipt/purchase_receipt.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index f3e56c3b239..8cbe865f072 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -1246,7 +1246,9 @@ def get_billed_amount_against_po(po_items): def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate=False): # Update Billing % based on pending accepted qty buying_settings = frappe.get_single("Buying Settings") - over_billing_allowance = frappe.get_single_value("Accounts Settings", "over_billing_allowance") + over_billing_allowance, role_allowed_to_over_bill = frappe.get_single_value( + "Accounts Settings", ["over_billing_allowance", "role_allowed_to_over_bill"] + ) total_amount, total_billed_amount, pi_landed_cost_amount = 0, 0, 0 item_wise_returned_qty = get_item_wise_returned_qty(pr_doc) @@ -1304,7 +1306,10 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate item.db_set("amount_difference_with_purchase_invoice", adjusted_amt, update_modified=False) elif amount and item.billed_amt > amount: per_over_billed = (flt(item.billed_amt / amount, 2) * 100) - 100 - if per_over_billed > over_billing_allowance: + if ( + per_over_billed > over_billing_allowance + and role_allowed_to_over_bill not in frappe.get_roles() + ): frappe.throw( _("Over Billing Allowance exceeded for Purchase Receipt Item {0} ({1}) by {2}%").format( item.name, frappe.bold(item.item_code), per_over_billed - over_billing_allowance From 788cd82b4b5f504bb5c27c26c2c549e7e9376b0e Mon Sep 17 00:00:00 2001 From: Sanjesh Date: Sun, 1 Mar 2026 16:31:53 +0530 Subject: [PATCH 29/85] fix: correct sle voucher_type comparison in get_ref_doctype (cherry picked from commit cffb59ae73c2b973d52512bc3ea09de4da123d6d) --- erpnext/stock/stock_ledger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 4bbd476edfd..d1bad37a9cc 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1305,7 +1305,7 @@ class update_entries_after: else: if sle.voucher_type in ("Delivery Note", "Sales Invoice"): ref_doctype = "Packed Item" - elif sle == "Subcontracting Receipt": + elif sle.voucher_type == "Subcontracting Receipt": ref_doctype = "Subcontracting Receipt Supplied Item" else: ref_doctype = "Purchase Receipt Item Supplied" From c92fd26e1b1ade9bed96b3197094767b4b26306b Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sun, 1 Mar 2026 20:48:33 +0530 Subject: [PATCH 30/85] fix: use the correct precision value in stock reco (cherry picked from commit 36726b0f7b3d5c0c155be20f04cca67ec9dac8d6) --- .../doctype/stock_reconciliation/stock_reconciliation.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index ac9e94f1e6a..277ab61865b 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -523,9 +523,9 @@ class StockReconciliation(StockController): if abs(difference_amount) > 0: return True - float_precision = frappe.db.get_default("float_precision") or 3 - item_dict["rate"] = flt(item_dict.get("rate"), float_precision) - item.valuation_rate = flt(item.valuation_rate, float_precision) if item.valuation_rate else None + rate_precision = item.precision("valuation_rate") + item_dict["rate"] = flt(item_dict.get("rate"), rate_precision) + item.valuation_rate = flt(item.valuation_rate, rate_precision) if item.valuation_rate else None if ( (item.qty is None or item.qty == item_dict.get("qty")) and (item.valuation_rate is None or item.valuation_rate == item_dict.get("rate")) From 744d7a2793abeb5a5dff836618499d84243043e6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 1 Mar 2026 13:32:00 +0530 Subject: [PATCH 31/85] fix: voucher detail no in SABB (cherry picked from commit c37a56ec899f30638fb1f489e28a7e33b346c81d) --- .../controllers/sales_and_purchase_return.py | 9 ++++++- .../serial_and_batch_bundle.py | 24 +++++++++++++++++-- erpnext/stock/serial_batch_bundle.py | 3 +++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 5deaeca975c..e3c571e71d8 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -1012,7 +1012,14 @@ def get_serial_batches_based_on_bundle(doctype, field, _bundle_ids): if doctype == "Packed Item": if key is None: - key = frappe.get_cached_value("Packed Item", row.voucher_detail_no, field) + key = frappe.get_cached_value( + "Packed Item", + {"parent_detail_docname": row.voucher_detail_no, "item_code": row.item_code}, + field, + ) + if key is None: + key = frappe.get_cached_value("Packed Item", row.voucher_detail_no, field) + if row.voucher_type == "Delivery Note": key = frappe.get_cached_value("Delivery Note Item", key, "dn_detail") elif row.voucher_type == "Sales Invoice": diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index 012503a3d9c..ba332231951 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -717,10 +717,13 @@ class SerialandBatchBundle(Document): if rate is None and child_table in ["Delivery Note Item", "Sales Invoice Item"]: rate = frappe.db.get_value( "Packed Item", - self.voucher_detail_no, + {"parent_detail_docname": self.voucher_detail_no, "item_code": self.item_code}, "incoming_rate", ) + if rate is None: + rate = frappe.db.get_value("Packed Item", self.voucher_detail_no, "incoming_rate") + if rate is not None: is_packed_item = True @@ -787,6 +790,9 @@ class SerialandBatchBundle(Document): if not self.voucher_detail_no or self.voucher_detail_no != row.name: values_to_set["voucher_detail_no"] = row.name + if row.get("doctype") == "Packed Item" and row.get("parent_detail_docname"): + values_to_set["voucher_detail_no"] = row.get("parent_detail_docname") + if parent.get("posting_date") and parent.get("posting_time"): posting_datetime = combine_datetime(parent.posting_date, parent.posting_time) if not self.posting_datetime or self.posting_datetime != posting_datetime: @@ -1325,7 +1331,21 @@ class SerialandBatchBundle(Document): ) if not vouchers and self.voucher_type == "Delivery Note": - frappe.db.set_value("Packed Item", self.voucher_detail_no, "serial_and_batch_bundle", None) + if frappe.db.exists("Packed Item", self.voucher_detail_no): + frappe.db.set_value("Packed Item", self.voucher_detail_no, "serial_and_batch_bundle", None) + else: + packed_items = frappe.get_all( + "Packed Item", + filters={ + "parent_detail_docname": self.voucher_detail_no, + "serial_and_batch_bundle": self.name, + }, + pluck="name", + ) + + for packed_item in packed_items: + frappe.db.set_value("Packed Item", packed_item, "serial_and_batch_bundle", None) + return for voucher in vouchers: diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 199672871dc..5e37aea5498 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -401,6 +401,9 @@ class SerialBatchBundle: def submit_serial_and_batch_bundle(self): doc = frappe.get_doc("Serial and Batch Bundle", self.sle.serial_and_batch_bundle) + if self.sle.voucher_detail_no and doc.voucher_detail_no != self.sle.voucher_detail_no: + doc.voucher_detail_no = self.sle.voucher_detail_no + self.validate_actual_qty(doc) doc.flags.ignore_voucher_validation = True From f632c5c79689969a63190c8884cad75dbab75185 Mon Sep 17 00:00:00 2001 From: trustedcomputer Date: Sat, 28 Feb 2026 18:10:07 -0800 Subject: [PATCH 32/85] fix: remove read-only property from Sales Invoice Timesheet Table (cherry picked from commit b9d95711a236b65855acdac76afe00b8d207b07f) --- erpnext/accounts/doctype/sales_invoice/sales_invoice.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index f33576f6d9c..da4d71ebd87 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -800,8 +800,7 @@ "hide_seconds": 1, "label": "Time Sheets", "options": "Sales Invoice Timesheet", - "print_hide": 1, - "read_only": 1 + "print_hide": 1 }, { "default": "0", @@ -2331,7 +2330,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-02-25 12:41:57.043459", + "modified": "2026-02-28 17:58:56.453076", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", From f2ff0de296f45c0e6af4f3b50e2fbaf01ec23ba9 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sun, 8 Feb 2026 13:14:06 +0530 Subject: [PATCH 33/85] fix(budget-variance-report): validate 'budget_against' filter (cherry picked from commit 79d0708ea75726cff1ef7524da7917b7fdf11733) --- .../budget_variance_report.py | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py index 6c245acf8d8..f41ba74388b 100644 --- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py +++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py @@ -5,6 +5,7 @@ import frappe from frappe import _ from frappe.utils import add_months, flt, formatdate +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_dimensions from erpnext.accounts.utils import get_fiscal_year from erpnext.controllers.trends import get_period_date_ranges @@ -13,6 +14,8 @@ def execute(filters=None): if not filters: filters = {} + validate_filters(filters) + columns = get_columns(filters) if filters.get("budget_against_filter"): dimensions = filters.get("budget_against_filter") @@ -31,6 +34,10 @@ def execute(filters=None): return columns, data, None, chart_data +def validate_filters(filters): + validate_budget_dimensions(filters) + + def get_budget_records(filters, dimensions): budget_against_field = frappe.scrub(filters["budget_against"]) @@ -51,7 +58,7 @@ def get_budget_records(filters, dimensions): b.company = %s AND b.docstatus = 1 AND b.budget_against = %s - AND b.{budget_against_field} IN ({', '.join(['%s'] * len(dimensions))}) + AND b.{budget_against_field} IN ({", ".join(["%s"] * len(dimensions))}) AND ( b.from_fiscal_year <= %s AND b.to_fiscal_year >= %s @@ -404,6 +411,17 @@ def get_budget_dimensions(filters): ) # nosec +def validate_budget_dimensions(filters): + dimensions = [d.get("document_type") for d in get_dimensions(with_cost_center_and_project=True)[0]] + if filters.get("budget_against") and filters.get("budget_against") not in dimensions: + frappe.throw( + title=_("Invalid Accounting Dimension"), + msg=_("{0} is not a valid Accounting Dimension.").format( + frappe.bold(filters.get("budget_against")) + ), + ) + + def build_comparison_chart_data(filters, columns, data): if not data: return None From 2526876eaa2bc38eeb9b4117215d5e5a9de2bd82 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Mon, 2 Mar 2026 01:58:52 +0530 Subject: [PATCH 34/85] fix(accounts): add transaction time field (cherry picked from commit 9538a9870ce19cf73231ed4192458f8c295325c2) # Conflicts: # erpnext/buying/doctype/purchase_order/purchase_order.json # erpnext/selling/doctype/sales_order/sales_order.json --- .../doctype/purchase_order/purchase_order.json | 13 +++++++++++++ .../buying/doctype/purchase_order/purchase_order.py | 1 + .../selling/doctype/sales_order/sales_order.json | 13 +++++++++++++ erpnext/selling/doctype/sales_order/sales_order.py | 1 + 4 files changed, 28 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 3dd4d927255..4746ebf700f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -17,6 +17,7 @@ "order_confirmation_date", "column_break_7", "transaction_date", + "transaction_time", "schedule_date", "column_break1", "company", @@ -1311,6 +1312,14 @@ { "fieldname": "section_break_tnkm", "fieldtype": "Section Break" + }, + { + "default": "Now", + "depends_on": "is_internal_supplier", + "fieldname": "transaction_time", + "fieldtype": "Time", + "label": "Time", + "mandatory_depends_on": "is_internal_supplier" } ], "grid_page_length": 50, @@ -1318,7 +1327,11 @@ "idx": 105, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2026-02-23 14:22:33.323946", +======= + "modified": "2026-03-02 00:40:47.119584", +>>>>>>> 9538a9870c (fix(accounts): add transaction time field) "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 1f945da1682..aaace54db63 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -166,6 +166,7 @@ class PurchaseOrder(BuyingController): total_qty: DF.Float total_taxes_and_charges: DF.Currency transaction_date: DF.Date + transaction_time: DF.Time | None # end: auto-generated types def __init__(self, *args, **kwargs): diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 00a8f8d3b12..22ad9300529 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -18,6 +18,7 @@ "column_break_7", "order_type", "transaction_date", + "transaction_time", "delivery_date", "column_break1", "tax_id", @@ -1724,6 +1725,14 @@ "fieldname": "utm_analytics_section", "fieldtype": "Section Break", "label": "UTM Analytics" + }, + { + "default": "Now", + "depends_on": "is_internal_customer", + "fieldname": "transaction_time", + "fieldtype": "Time", + "label": "Time", + "mandatory_depends_on": "is_internal_customer" } ], "grid_page_length": 50, @@ -1731,7 +1740,11 @@ "idx": 105, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2026-02-10 11:55:52.796522", +======= + "modified": "2026-03-02 00:42:18.834823", +>>>>>>> 9538a9870c (fix(accounts): add transaction time field) "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 9d39c38505d..1759356c63d 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -186,6 +186,7 @@ class SalesOrder(SellingController): total_qty: DF.Float total_taxes_and_charges: DF.Currency transaction_date: DF.Date + transaction_time: DF.Time | None utm_campaign: DF.Link | None utm_content: DF.Data | None utm_medium: DF.Link | None From 8b3c5baa9e8608d9f38ec9560724b383dea62276 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Mon, 2 Mar 2026 02:01:04 +0530 Subject: [PATCH 35/85] fix(accounts): set posting time to get incoming rate (cherry picked from commit c5b3673a3073628905dddacfc975972b39eb6224) --- erpnext/utilities/transaction_base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py index 375c2a4409a..fb1628fe305 100644 --- a/erpnext/utilities/transaction_base.py +++ b/erpnext/utilities/transaction_base.py @@ -341,6 +341,7 @@ class TransactionBase(StatusUpdater): args.update( { "posting_date": self.transaction_date, + "posting_time": self.transaction_time, } ) else: From b8de82f0e47b5deed275919336717ba8cb220cf6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 2 Mar 2026 12:08:54 +0530 Subject: [PATCH 36/85] fix: validate warehouse of SABB for draft entry (cherry picked from commit 9b8f685c8206c184db26f6c083ec4eadf280c5c1) --- erpnext/controllers/stock_controller.py | 41 +++++++++++++++++++ .../stock/doctype/stock_entry/stock_entry.py | 1 + 2 files changed, 42 insertions(+) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 7ff2c4061f2..0ae1d232171 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -63,6 +63,8 @@ class StockController(AccountsController): if not self.get("is_return"): self.validate_inspection() + + self.validate_warehouse_of_sabb() self.validate_serialized_batch() self.clean_serial_nos() self.validate_customer_provided_item() @@ -75,6 +77,45 @@ class StockController(AccountsController): super().on_update() self.check_zero_rate() + def validate_warehouse_of_sabb(self): + if self.is_internal_transfer(): + return + + doc_before_save = self.get_doc_before_save() + + for row in self.items: + if not row.get("serial_and_batch_bundle"): + continue + + sabb_details = frappe.db.get_value( + "Serial and Batch Bundle", + row.serial_and_batch_bundle, + ["type_of_transaction", "warehouse", "has_serial_no"], + as_dict=True, + ) + if not sabb_details: + continue + + if sabb_details.type_of_transaction != "Outward": + continue + + warehouse = row.get("warehouse") or row.get("s_warehouse") + if sabb_details.warehouse != warehouse: + frappe.throw( + _( + "Row #{0}: Warehouse {1} does not match with the warehouse {2} in Serial and Batch Bundle {3}." + ).format(row.idx, warehouse, sabb_details.warehouse, row.serial_and_batch_bundle) + ) + + if self.doctype == "Stock Reconciliation": + continue + + if sabb_details.has_serial_no and doc_before_save and doc_before_save.get("items"): + prev_row = doc_before_save.get("items", {"idx": row.idx}) + if prev_row and prev_row[0].serial_and_batch_bundle != row.serial_and_batch_bundle: + sabb_doc = frappe.get_doc("Serial and Batch Bundle", row.serial_and_batch_bundle) + sabb_doc.validate_serial_no_status() + def reset_conversion_factor(self): for row in self.get("items"): if row.uom != row.stock_uom: diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 2e2639080cf..bdcbbed0e18 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -236,6 +236,7 @@ class StockEntry(StockController, SubcontractingInwardController): self.validate_uom_is_integer("uom", "qty") self.validate_uom_is_integer("stock_uom", "transfer_qty") self.validate_warehouse() + self.validate_warehouse_of_sabb() self.validate_work_order() self.validate_bom() self.set_process_loss_qty() From b4a5bbc7e2e02f2c2bd2df476a12682992fb5955 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 2 Mar 2026 14:38:28 +0530 Subject: [PATCH 37/85] chore: fix conflicts --- erpnext/buying/doctype/purchase_order/purchase_order.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 4746ebf700f..212a034763a 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -1327,11 +1327,7 @@ "idx": 105, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-02-23 14:22:33.323946", -======= "modified": "2026-03-02 00:40:47.119584", ->>>>>>> 9538a9870c (fix(accounts): add transaction time field) "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", From 664f1f1675b45f7e17c48a5a7209cb248ac755ca Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Mon, 2 Mar 2026 14:05:40 +0530 Subject: [PATCH 38/85] perf: add index on reference_purchase_receipt column (cherry picked from commit 8c94396ad9251db15ab1f792a96192a66b498c0a) --- .../stock/doctype/stock_entry_detail/stock_entry_detail.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json index fd1212f6fda..eceba634bf3 100644 --- a/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json +++ b/erpnext/stock/doctype/stock_entry_detail/stock_entry_detail.json @@ -498,7 +498,8 @@ "fieldtype": "Link", "label": "Reference Purchase Receipt", "options": "Purchase Receipt", - "read_only": 1 + "read_only": 1, + "search_index": 1 }, { "fieldname": "project", @@ -660,7 +661,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-10-16 11:50:50.573443", + "modified": "2026-03-02 14:05:23.116017", "modified_by": "Administrator", "module": "Stock", "name": "Stock Entry Detail", From bf44f466ad316f222933c3381ebe881825792caf Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 2 Mar 2026 14:38:55 +0530 Subject: [PATCH 39/85] chore: fix conflicts --- erpnext/selling/doctype/sales_order/sales_order.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 22ad9300529..1b186352bfa 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -1740,11 +1740,7 @@ "idx": 105, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-02-10 11:55:52.796522", -======= "modified": "2026-03-02 00:42:18.834823", ->>>>>>> 9538a9870c (fix(accounts): add transaction time field) "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", From 1f2342cf4be44182eb268b99c95af99b7729344d Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 2 Mar 2026 16:30:43 +0530 Subject: [PATCH 40/85] fix: opening qty in stock balance (cherry picked from commit d7fdab99cb6f5f9981f962a769254b194d6957f2) --- .../report/stock_balance/stock_balance.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index c4c67c4abaf..ed0c31c07d9 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -230,9 +230,18 @@ class StockBalanceReport: .groupby(doctype.voucher_detail_no) ) - data = query.run(as_list=True) - if data: - self.stock_reco_voucher_wise_count = frappe._dict(data) + data = query.run(as_dict=True) + if not data: + return + + for row in data: + if row.count != 1: + continue + + current_qty = frappe.db.get_value( + "Stock Reconciliation Item", row.voucher_detail_no, "current_qty" + ) + self.stock_reco_voucher_wise_count[row.voucher_detail_no] = current_qty def prepare_new_data(self): if self.filters.get("show_stock_ageing_data"): @@ -312,7 +321,8 @@ class StockBalanceReport: if entry.voucher_type == "Stock Reconciliation" and ( not entry.batch_no or entry.serial_no or entry.serial_and_batch_bundle ): - if entry.serial_no and self.stock_reco_voucher_wise_count.get(entry.voucher_detail_no, 0) == 1: + if entry.serial_no and entry.voucher_detail_no in self.stock_reco_voucher_wise_count: + qty_dict.opening_qty -= self.stock_reco_voucher_wise_count.get(entry.voucher_detail_no, 0) qty_dict.bal_qty = 0.0 qty_diff = flt(entry.actual_qty) else: From 7e09bf306ad7aa0fad529d8d149116964d2d1825 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:07:57 +0530 Subject: [PATCH 41/85] fix(accounts receivable): include invoice payment terms template (backport #51940) (#53106) Co-authored-by: Ravibharathi <131471282+ravibharathi656@users.noreply.github.com> --- .../accounts_payable/test_accounts_payable.py | 65 +++++++++++- .../accounts_receivable.py | 98 ++++++++++++++----- .../test_accounts_receivable.py | 63 ++++++++++++ 3 files changed, 200 insertions(+), 26 deletions(-) diff --git a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py index d07b0aa43ad..8da40ea3aa4 100644 --- a/erpnext/accounts/report/accounts_payable/test_accounts_payable.py +++ b/erpnext/accounts/report/accounts_payable/test_accounts_payable.py @@ -1,6 +1,6 @@ import frappe from frappe.tests import IntegrationTestCase -from frappe.utils import today +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 @@ -57,3 +57,66 @@ class TestAccountsPayable(AccountsTestMixin, IntegrationTestCase): if not do_not_submit: pi = pi.submit() return pi + + def test_payment_terms_template_filters(self): + from erpnext.controllers.accounts_controller import get_payment_terms + + payment_term1 = frappe.get_doc( + {"doctype": "Payment Term", "payment_term_name": "_Test 50% on 15 Days"} + ).insert() + payment_term2 = frappe.get_doc( + {"doctype": "Payment Term", "payment_term_name": "_Test 50% on 30 Days"} + ).insert() + + template = frappe.get_doc( + { + "doctype": "Payment Terms Template", + "template_name": "_Test 50-50", + "terms": [ + { + "doctype": "Payment Terms Template Detail", + "due_date_based_on": "Day(s) after invoice date", + "payment_term": payment_term1.name, + "description": "_Test 50-50", + "invoice_portion": 50, + "credit_days": 15, + }, + { + "doctype": "Payment Terms Template Detail", + "due_date_based_on": "Day(s) after invoice date", + "payment_term": payment_term2.name, + "description": "_Test 50-50", + "invoice_portion": 50, + "credit_days": 30, + }, + ], + } + ) + template.insert() + + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + "based_on_payment_terms": 1, + "payment_terms_template": template.name, + "ageing_based_on": "Posting Date", + } + + pi = self.create_purchase_invoice(do_not_submit=True) + pi.payment_terms_template = template.name + schedule = get_payment_terms(template.name) + pi.set("payment_schedule", []) + + for row in schedule: + row["due_date"] = add_days(pi.posting_date, row.get("credit_days", 0)) + pi.append("payment_schedule", row) + + pi.save() + pi.submit() + + report = execute(filters) + row = report[1][0] + + self.assertEqual(len(report[1]), 2) + self.assertEqual([pi.name, payment_term1.payment_term_name], [row.voucher_no, row.payment_term]) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 0b4f59d6aae..e29ed79cc49 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -1035,9 +1035,8 @@ class ReceivablePayableReport: self, ): self.customer = qb.DocType("Customer") - if self.filters.get("customer_group"): - groups = get_customer_group_with_children(self.filters.customer_group) + groups = get_party_group_with_children("Customer", self.filters.customer_group) customers = ( qb.from_(self.customer) .select(self.customer.name) @@ -1049,14 +1048,18 @@ class ReceivablePayableReport: self.get_hierarchical_filters("Territory", "territory") if self.filters.get("payment_terms_template"): - self.qb_selection_filter.append( - self.ple.party.isin( - qb.from_(self.customer) - .select(self.customer.name) - .where(self.customer.payment_terms == self.filters.get("payment_terms_template")) - ) + customer_ptt = self.ple.party.isin( + qb.from_(self.customer) + .select(self.customer.name) + .where(self.customer.payment_terms == self.filters.get("payment_terms_template")) ) + si_ptt = self.add_payment_term_template_filters("Sales Invoice") + + sales_ptt = self.ple.against_voucher_no.isin(si_ptt) + + self.qb_selection_filter.append(Criterion.any([customer_ptt, sales_ptt])) + if self.filters.get("sales_partner"): self.qb_selection_filter.append( self.ple.party.isin( @@ -1081,14 +1084,53 @@ class ReceivablePayableReport: ) if self.filters.get("payment_terms_template"): - self.qb_selection_filter.append( - self.ple.party.isin( - qb.from_(supplier) - .select(supplier.name) - .where(supplier.payment_terms == self.filters.get("supplier_group")) - ) + supplier_ptt = self.ple.party.isin( + qb.from_(supplier) + .select(supplier.name) + .where(supplier.payment_terms == self.filters.get("payment_terms_template")) ) + pi_ptt = self.add_payment_term_template_filters("Purchase Invoice") + + purchase_ptt = self.ple.against_voucher_no.isin(pi_ptt) + + self.qb_selection_filter.append(Criterion.any([supplier_ptt, purchase_ptt])) + + def add_payment_term_template_filters(self, dtype): + voucher_type = qb.DocType(dtype) + + ptt = ( + qb.from_(voucher_type) + .select(voucher_type.name) + .where(voucher_type.payment_terms_template == self.filters.get("payment_terms_template")) + .where(voucher_type.company == self.filters.company) + ) + + if dtype == "Purchase Invoice": + party = "Supplier" + party_group_type = "supplier_group" + acc_type = "credit_to" + else: + party = "Customer" + party_group_type = "customer_group" + acc_type = "debit_to" + + if self.filters.get(party_group_type): + party_groups = get_party_group_with_children(party, self.filters.get(party_group_type)) + ptt = ptt.where((voucher_type[party_group_type]).isin(party_groups)) + + if self.filters.party: + ptt = ptt.where((voucher_type[party.lower()]).isin(self.filters.party)) + + if self.filters.cost_center: + cost_centers = get_cost_centers_with_children(self.filters.cost_center) + ptt = ptt.where(voucher_type.cost_center.isin(cost_centers)) + + if self.filters.party_account: + ptt = ptt.where(voucher_type[acc_type] == self.filters.party_account) + + return ptt + def get_hierarchical_filters(self, doctype, key): lft, rgt = frappe.db.get_value(doctype, self.filters.get(key), ["lft", "rgt"]) @@ -1330,20 +1372,26 @@ class ReceivablePayableReport: self.err_journals = [x[0] for x in results] if results else [] -def get_customer_group_with_children(customer_groups): - if not isinstance(customer_groups, list): - customer_groups = [d.strip() for d in customer_groups.strip().split(",") if d] +def get_party_group_with_children(party, party_groups): + if party not in ("Customer", "Supplier"): + return [] - all_customer_groups = [] - for d in customer_groups: - if frappe.db.exists("Customer Group", d): - lft, rgt = frappe.db.get_value("Customer Group", d, ["lft", "rgt"]) - children = frappe.get_all("Customer Group", filters={"lft": [">=", lft], "rgt": ["<=", rgt]}) - all_customer_groups += [c.name for c in children] + group_dtype = f"{party} Group" + if not isinstance(party_groups, list): + party_groups = [d.strip() for d in party_groups.strip().split(",") if d] + + all_party_groups = [] + for d in party_groups: + if frappe.db.exists(group_dtype, d): + lft, rgt = frappe.db.get_value(group_dtype, d, ["lft", "rgt"]) + children = frappe.get_all( + group_dtype, filters={"lft": [">=", lft], "rgt": ["<=", rgt]}, pluck="name" + ) + all_party_groups += children else: - frappe.throw(_("Customer Group: {0} does not exist").format(d)) + frappe.throw(_("{0}: {1} does not exist").format(group_dtype, d)) - return list(set(all_customer_groups)) + return list(set(all_party_groups)) class InitSQLProceduresForAR: diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py index afaba697fb1..907840e8ff4 100644 --- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py @@ -1139,3 +1139,66 @@ class TestAccountsReceivable(AccountsTestMixin, IntegrationTestCase): self.assertEqual(len(report[1]), 1) row = report[1][0] self.assertEqual(expected_data_after_payment, [row.voucher_no, row.cost_center, row.outstanding]) + + def test_payment_terms_template_filters(self): + from erpnext.controllers.accounts_controller import get_payment_terms + + payment_term1 = frappe.get_doc( + {"doctype": "Payment Term", "payment_term_name": "_Test 50% on 15 Days"} + ).insert() + payment_term2 = frappe.get_doc( + {"doctype": "Payment Term", "payment_term_name": "_Test 50% on 30 Days"} + ).insert() + + template = frappe.get_doc( + { + "doctype": "Payment Terms Template", + "template_name": "_Test 50-50", + "terms": [ + { + "doctype": "Payment Terms Template Detail", + "due_date_based_on": "Day(s) after invoice date", + "payment_term": payment_term1.name, + "description": "_Test 50-50", + "invoice_portion": 50, + "credit_days": 15, + }, + { + "doctype": "Payment Terms Template Detail", + "due_date_based_on": "Day(s) after invoice date", + "payment_term": payment_term2.name, + "description": "_Test 50-50", + "invoice_portion": 50, + "credit_days": 30, + }, + ], + } + ) + template.insert() + + filters = { + "company": self.company, + "report_date": today(), + "range": "30, 60, 90, 120", + "based_on_payment_terms": 1, + "payment_terms_template": template.name, + "ageing_based_on": "Posting Date", + } + + si = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True) + si.payment_terms_template = template.name + schedule = get_payment_terms(template.name) + si.set("payment_schedule", []) + + for row in schedule: + row["due_date"] = add_days(si.posting_date, row.get("credit_days", 0)) + si.append("payment_schedule", row) + + si.save() + si.submit() + + report = execute(filters) + row = report[1][0] + + self.assertEqual(len(report[1]), 2) + self.assertEqual([si.name, payment_term1.payment_term_name], [row.voucher_no, row.payment_term]) From 7d950f71dacd6d0dfeeda94fb67f85aa2fc9148c Mon Sep 17 00:00:00 2001 From: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com> Date: Tue, 3 Mar 2026 14:32:08 +0530 Subject: [PATCH 42/85] fix: avoid circular dependency (#53109) (cherry picked from commit d2e04750b52ef2eb79cdefc012df9da7fe99f51f) --- .../doctype/pos_closing_entry/pos_closing_entry.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js b/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js index bea821fed40..afb8f179fe3 100644 --- a/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js +++ b/erpnext/accounts/doctype/pos_closing_entry/pos_closing_entry.js @@ -4,19 +4,6 @@ frappe.ui.form.on("POS Closing Entry", { onload: async function (frm) { frm.ignore_doctypes_on_cancel_all = ["POS Invoice Merge Log", "Sales Invoice"]; - frm.set_query("pos_profile", function (doc) { - return { - filters: { user: doc.user }, - }; - }); - - frm.set_query("user", function (doc) { - return { - query: "erpnext.accounts.doctype.pos_closing_entry.pos_closing_entry.get_cashiers", - filters: { parent: doc.pos_profile }, - }; - }); - frm.set_query("pos_opening_entry", function (doc) { return { filters: { status: "Open", docstatus: 1 } }; }); From 396727e26f5dbef7e203df9ffdd0f8f8dddee7b0 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Tue, 3 Mar 2026 14:08:49 +0530 Subject: [PATCH 43/85] fix(pricing_rule): strict validation of `transaction_type` (cherry picked from commit 7ec0354a79176f858aff3d99dce1c5a06b2cf77d) --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 5a4f3ca3249..c450d080522 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -346,8 +346,7 @@ def apply_pricing_rule(args, doc=None): args = frappe._dict(args) - if not args.transaction_type: - set_transaction_type(args) + set_transaction_type(args) # list of dictionaries out = [] @@ -684,7 +683,7 @@ def remove_pricing_rules(item_list): def set_transaction_type(args): - if args.transaction_type: + if args.transaction_type in ["buying", "selling"]: return if args.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): args.transaction_type = "selling" From e4ce6e4e6ffcbc22841fe58c4ef33a303c63a7a0 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Tue, 3 Mar 2026 14:41:30 +0530 Subject: [PATCH 44/85] refactor: renamed `args` to `pricing_ctx` in `set_transaction_type` for clarity (cherry picked from commit 6342e7830546b9a952146eb349534bfb6874d506) --- .../doctype/pricing_rule/pricing_rule.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index c450d080522..810c50852c5 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -682,23 +682,23 @@ def remove_pricing_rules(item_list): return out -def set_transaction_type(args): - if args.transaction_type in ["buying", "selling"]: +def set_transaction_type(pricing_ctx: frappe._dict) -> None: + if pricing_ctx.transaction_type in ["buying", "selling"]: return - if args.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): - args.transaction_type = "selling" - elif args.doctype in ( + if pricing_ctx.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): + pricing_ctx.transaction_type = "selling" + elif pricing_ctx.doctype in ( "Material Request", "Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice", ): - args.transaction_type = "buying" - elif args.customer: - args.transaction_type = "selling" + pricing_ctx.transaction_type = "buying" + elif pricing_ctx.customer: + pricing_ctx.transaction_type = "selling" else: - args.transaction_type = "buying" + pricing_ctx.transaction_type = "buying" @frappe.whitelist() From 32c33631a64dde18e707e41ba4c13c21bd9cf721 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Tue, 3 Mar 2026 15:46:34 +0530 Subject: [PATCH 45/85] chore: fix onboarding doctype merge conflicts (#53118) --- .../module_onboarding/asset_onboarding/asset_onboarding.json | 4 ---- erpnext/assets/onboarding_step/learn_asset/learn_asset.json | 4 ---- 2 files changed, 8 deletions(-) diff --git a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json index 7a4b953696a..d8a8c4ba00b 100644 --- a/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json +++ b/erpnext/assets/module_onboarding/asset_onboarding/asset_onboarding.json @@ -15,11 +15,7 @@ "doctype": "Module Onboarding", "idx": 0, "is_complete": 0, -<<<<<<< version-16-hotfix - "modified": "2026-02-26 10:45:47.970714", -======= "modified": "2026-02-26 10:50:47.970714", ->>>>>>> version-16 "modified_by": "Administrator", "module": "Assets", "name": "Asset Onboarding", diff --git a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json index 890e092b21a..265d6759150 100644 --- a/erpnext/assets/onboarding_step/learn_asset/learn_asset.json +++ b/erpnext/assets/onboarding_step/learn_asset/learn_asset.json @@ -8,11 +8,7 @@ "is_complete": 0, "is_single": 0, "is_skipped": 0, -<<<<<<< version-16-hotfix - "modified": "2026-02-26 10:44:59.557156", -======= "modified": "2026-02-26 10:50:59.557156", ->>>>>>> version-16 "modified_by": "Administrator", "name": "Learn Asset", "owner": "Administrator", From 58fbb2f4d7d5193b1351b8ec75f79f50e7a15240 Mon Sep 17 00:00:00 2001 From: shariquerik Date: Tue, 3 Mar 2026 16:56:00 +0530 Subject: [PATCH 46/85] fix: ensure contacts are processed only if present in create_prospect_against_crm_deal (cherry picked from commit 800810d23d9e687c0f6372f65744f00795e24964) --- erpnext/crm/frappe_crm_api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/crm/frappe_crm_api.py b/erpnext/crm/frappe_crm_api.py index 0bf78429b36..86521586b28 100644 --- a/erpnext/crm/frappe_crm_api.py +++ b/erpnext/crm/frappe_crm_api.py @@ -59,7 +59,9 @@ def create_prospect_against_crm_deal(): ) pass - create_contacts(json.loads(doc.contacts), prospect.company_name, "Prospect", prospect_name) + if doc.contacts and len(doc.contacts): + create_contacts(json.loads(doc.contacts), prospect.company_name, "Prospect", prospect_name) + create_address("Prospect", prospect_name, doc.address) frappe.response["message"] = prospect_name From dc0592a9057c08982c988d3bfd22e26c81a8e81f Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 3 Mar 2026 17:11:53 +0530 Subject: [PATCH 47/85] fix: serial no status for Disassemble entry (cherry picked from commit 81acefa8adf625b4b9905abda43832c25a9d8847) --- erpnext/stock/serial_batch_bundle.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 5e37aea5498..7fc143e38d4 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -463,6 +463,11 @@ class SerialBatchBundle: if sle.voucher_type in ["Sales Invoice", "Delivery Note"] and sle.actual_qty < 0: customer = frappe.get_cached_value(sle.voucher_type, sle.voucher_no, "customer") + if sle.voucher_type in ["Stock Entry"] and sle.actual_qty < 0: + purpose = frappe.get_cached_value("Stock Entry", sle.voucher_no, "purpose") + if purpose in ["Disassemble", "Material Receipt"]: + status = "Inactive" + sn_table = frappe.qb.DocType("Serial No") query = ( From acdb8f2b784142dc44af5881bdfb96be90c3ead5 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Mon, 2 Mar 2026 23:40:40 +0530 Subject: [PATCH 48/85] fix: populate mr owner and set po owner as fallback (cherry picked from commit bdf4e51da3e9036d238ed5dcf7808b7a5dac64cc) --- .../buying/report/procurement_tracker/procurement_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py index 6f610d2dc20..10169c554fb 100644 --- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py @@ -165,7 +165,7 @@ def get_data(filters): "cost_center": po.cost_center, "project": po.project, "requesting_site": po.warehouse, - "requestor": po.owner, + "requestor": mr_record.get("owner", po.owner), "material_request_no": po.material_request, "item_code": po.item_code, "quantity": flt(po.qty), From d61ad3bd95a14dc432512722bf2b77d415a561f9 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Sat, 28 Feb 2026 13:01:07 +0530 Subject: [PATCH 49/85] fix(stock): pass company to avoid document naming rule issue in QI When a Document Naming Rule is configured in QI with a condition based on the company, the system was not passing the company value properly. As a result, the naming rule condition was skipped and the document name was generated using the default series. This fix ensures that the company is passed correctly so that the configured Document Naming Rule is evaluated and applied as expected. (cherry picked from commit 74def423ed5b3d7f2960100a306341b2547cf90e) # Conflicts: # erpnext/controllers/stock_controller.py --- erpnext/controllers/stock_controller.py | 7 +++++++ erpnext/public/js/controllers/transaction.js | 1 + 2 files changed, 8 insertions(+) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 0ae1d232171..13df4f5d34b 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -2128,7 +2128,13 @@ def check_item_quality_inspection(doctype, items): @frappe.whitelist() +<<<<<<< HEAD def make_quality_inspections(doctype, docname, items, inspection_type): +======= +def make_quality_inspections( + company: str, doctype: str, docname: str, items: str | list, inspection_type: str +): +>>>>>>> 74def423ed (fix(stock): pass company to avoid document naming rule issue in QI) if isinstance(items, str): items = json.loads(items) @@ -2147,6 +2153,7 @@ def make_quality_inspections(doctype, docname, items, inspection_type): quality_inspection = frappe.get_doc( { + "company": company, "doctype": "Quality Inspection", "inspection_type": inspection_type, "inspected_by": frappe.session.user, diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index aa02eec7b62..650611ee709 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -2966,6 +2966,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe frappe.call({ method: "erpnext.controllers.stock_controller.make_quality_inspections", args: { + company: me.frm.doc.company, doctype: me.frm.doc.doctype, docname: me.frm.doc.name, items: selected_data, From 384498282463eb61f77d26510c66c4cfff14090c Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Sat, 28 Feb 2026 16:36:22 +0530 Subject: [PATCH 50/85] test: add unit test to handle company condition in naming rule (cherry picked from commit 4c39cf2d650207c3d02d1da8490fcf2657ddc488) --- .../doctype/stock_entry/test_stock_entry.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 04f87d3348e..583cb4bedc6 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -2415,6 +2415,54 @@ class TestStockEntry(IntegrationTestCase): frappe.get_doc(_make_stock_entry(work_order.name, "Material Consumption for Manufacture", 5)).submit() frappe.get_doc(_make_stock_entry(work_order.name, "Manufacture", 5)).submit() + def test_qi_creation_with_naming_rule_company_condition(self): + """ + Unit test case to check the document naming rule with company condition + For Quality Inspection, when created from Stock Entry. + """ + from erpnext.accounts.report.trial_balance.test_trial_balance import create_company + from erpnext.controllers.stock_controller import make_quality_inspections + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + # create a separate company to handle document naming rule with company condition + qc_company = create_company(company_name="Test Quality Company") + + # create document naming rule based on that for Quality Inspection Doctype + qc_naming_rule = frappe.new_doc( + "Document Naming Rule", document_type="Quality Inspection", prefix="NQC.-ST-", prefix_digits=5 + ) + qc_naming_rule.append("conditions", {"field": "company", "condition": "=", "value": qc_company}) + qc_naming_rule.save() + + warehouse = create_warehouse(warehouse_name="Test QI Warehouse", company=qc_company) + item = create_item( + item_code="Test QI DNR Item", + is_stock_item=1, + ) + + # create inward stock entry + stock_entry = make_stock_entry( + item_code=item.item_code, + target=warehouse, + qty=10, + basic_rate=100, + inspection_required=True, + do_not_submit=True, + ) + + # create QI from Stock Entry and check the naming series generated. + qi = make_quality_inspections( + stock_entry.company, + stock_entry.doctype, + stock_entry.name, + stock_entry.as_dict().get("items"), + "Incoming", + ) + self.assertEqual(qi[0], "NQC-ST-00001") + + # delete naming rule + frappe.delete_doc("Document Naming Rule", qc_naming_rule.name) + def make_serialized_item(self, **args): args = frappe._dict(args) From 417e8a43718f7156891abbbadfedec066ce64445 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Mon, 2 Mar 2026 13:05:27 +0530 Subject: [PATCH 51/85] fix: pass company in test case using make_quality_inspections (cherry picked from commit 397de1274f17dfea53f2c9e4fc7aaea8a33cb8cc) --- .../doctype/quality_inspection/test_quality_inspection.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py index 8c4622a8ae2..3885df7c74a 100644 --- a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py +++ b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py @@ -142,7 +142,9 @@ class TestQualityInspection(IntegrationTestCase): inspection_type = "Outgoing" for item in dn.items: item.sample_size = item.qty - quality_inspections = make_quality_inspections(dn.doctype, dn.name, dn.items, inspection_type) + quality_inspections = make_quality_inspections( + dn.company, dn.doctype, dn.name, dn.items, inspection_type + ) self.assertEqual(len(dn.items), len(quality_inspections)) # cleanup From 2daf9f4ce7d8a7c8535c2da287412cce3d78569b Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Mon, 2 Mar 2026 12:26:55 +0530 Subject: [PATCH 52/85] fix(manufacturing): ignore sales order validation for subassembly item (cherry picked from commit 6b1aac4aee35df0d8b339f3389e8330fee7bf2cd) --- .../doctype/work_order/work_order.py | 80 ++++++++++++------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index b442f5becfc..b74281308b7 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -225,7 +225,12 @@ class WorkOrder(Document): frappe.throw(_("Actual End Date cannot be before Actual Start Date")) def validate_fg_warehouse_for_reservation(self): - if self.reserve_stock and self.sales_order and not self.subcontracting_inward_order: + if ( + self.reserve_stock + and self.sales_order + and not self.subcontracting_inward_order + and not self.production_plan_sub_assembly_item + ): warehouses = frappe.get_all( "Sales Order Item", filters={"parent": self.sales_order, "item_code": self.production_item}, @@ -413,39 +418,52 @@ class WorkOrder(Document): ) def validate_sales_order(self): + if self.production_plan_sub_assembly_item: + return + if self.sales_order: self.check_sales_order_on_hold_or_close() - so = frappe.db.sql( - """ - select so.name, so_item.delivery_date, so.project - from `tabSales Order` so - inner join `tabSales Order Item` so_item on so_item.parent = so.name - left join `tabProduct Bundle Item` pk_item on so_item.item_code = pk_item.parent - where so.name=%s and so.docstatus = 1 - and so.skip_delivery_note = 0 and ( - so_item.item_code=%s or - pk_item.item_code=%s ) - """, - (self.sales_order, self.production_item, self.production_item), - as_dict=1, + + SalesOrder = frappe.qb.DocType("Sales Order") + SalesOrderItem = frappe.qb.DocType("Sales Order Item") + PackedItem = frappe.qb.DocType("Packed Item") + ProductBundleItem = frappe.qb.DocType("Product Bundle Item") + + so = ( + frappe.qb.from_(SalesOrder) + .inner_join(SalesOrderItem) + .on(SalesOrderItem.parent == SalesOrder.name) + .left_join(ProductBundleItem) + .on(ProductBundleItem.parent == SalesOrderItem.item_code) + .select(SalesOrder.name, SalesOrder.project, SalesOrderItem.delivery_date) + .where( + (SalesOrder.skip_delivery_note == 0) + & (SalesOrder.docstatus == 1) + & (SalesOrder.name == self.sales_order) + & ( + (SalesOrderItem.item_code == self.production_item) + | (ProductBundleItem.item_code == self.production_item) + ) + ) + .run(as_dict=1) ) if not so: - so = frappe.db.sql( - """ - select - so.name, so_item.delivery_date, so.project - from - `tabSales Order` so, `tabSales Order Item` so_item, `tabPacked Item` packed_item - where so.name=%s - and so.name=so_item.parent - and so.name=packed_item.parent - and so.skip_delivery_note = 0 - and so_item.item_code = packed_item.parent_item - and so.docstatus = 1 and packed_item.item_code=%s - """, - (self.sales_order, self.production_item), - as_dict=1, + so = ( + frappe.qb.from_(SalesOrder) + .inner_join(SalesOrderItem) + .on(SalesOrderItem.parent == SalesOrder.name) + .inner_join(PackedItem) + .on(PackedItem.parent == SalesOrder.name) + .select(SalesOrder.name, SalesOrder.project, SalesOrderItem.delivery_date) + .where( + (SalesOrder.name == self.sales_order) + & (SalesOrder.skip_delivery_note == 0) + & (SalesOrderItem.item_code == PackedItem.parent_item) + & (SalesOrder.docstatus == 1) + & (PackedItem.item_code == self.production_item) + ) + .run(as_dict=1) ) if len(so): @@ -651,7 +669,7 @@ class WorkOrder(Document): from erpnext.selling.doctype.sales_order.sales_order import update_produced_qty_in_so_item - if self.sales_order and self.sales_order_item: + if self.sales_order and self.sales_order_item and not self.production_plan_sub_assembly_item: update_produced_qty_in_so_item(self.sales_order, self.sales_order_item) if self.production_plan: @@ -1159,7 +1177,7 @@ class WorkOrder(Document): doc.db_set("status", doc.status) def update_work_order_qty_in_so(self): - if not self.sales_order and not self.sales_order_item: + if (not self.sales_order and not self.sales_order_item) or self.production_plan_sub_assembly_item: return total_bundle_qty = 1 From 3e8ebf8c14589a8a75958bc336fc8aad474995be Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 3 Mar 2026 20:44:40 +0530 Subject: [PATCH 53/85] chore: resolve conflicts --- erpnext/controllers/stock_controller.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 13df4f5d34b..5436cd3e54f 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -2128,13 +2128,9 @@ def check_item_quality_inspection(doctype, items): @frappe.whitelist() -<<<<<<< HEAD -def make_quality_inspections(doctype, docname, items, inspection_type): -======= def make_quality_inspections( company: str, doctype: str, docname: str, items: str | list, inspection_type: str ): ->>>>>>> 74def423ed (fix(stock): pass company to avoid document naming rule issue in QI) if isinstance(items, str): items = json.loads(items) From 317873621a0bedc2298cae80cd36497560bb5f6a Mon Sep 17 00:00:00 2001 From: Pugazhendhi Velu Date: Sun, 1 Mar 2026 18:21:09 +0000 Subject: [PATCH 54/85] fix: handle html email template separately in RFQ to avoid jinja context error (cherry picked from commit 49d363b1748640e3addb23d4ee5a186210cb4d62) --- .../request_for_quotation.js | 15 ++++++++--- .../request_for_quotation.json | 25 ++++++++++++++++--- .../request_for_quotation.py | 21 +++++++++++++--- 3 files changed, 50 insertions(+), 11 deletions(-) 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 335bb28b0fb..3171ad595b1 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -250,10 +250,17 @@ frappe.ui.form.on("Request for Quotation", { "subject", ]) .then((r) => { - frm.set_value( - "message_for_supplier", - r.message.use_html ? r.message.response_html : r.message.response - ); + if (r.message.use_html) { + frm.set_value({ + mfs_html: r.message.response_html, + use_html: 1, + }); + } else { + frm.set_value({ + message_for_supplier: r.message.response, + use_html: 0, + }); + } frm.set_value("subject", r.message.subject); }); } 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 005078584bb..a10497702ce 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -31,7 +31,9 @@ "send_document_print", "sec_break_email_2", "subject", + "use_html", "message_for_supplier", + "mfs_html", "terms_section_break", "incoterm", "named_place", @@ -142,12 +144,13 @@ { "allow_on_submit": 1, "default": "Please supply the specified items at the best possible rates", + "depends_on": "eval:doc.use_html == 0", "fieldname": "message_for_supplier", "fieldtype": "Text Editor", "in_list_view": 1, "label": "Message for Supplier", - "print_hide": 1, - "reqd": 1 + "mandatory_depends_on": "eval:doc.use_html == 0", + "print_hide": 1 }, { "collapsible": 1, @@ -324,6 +327,22 @@ "label": "Subject", "not_nullable": 1, "reqd": 1 + }, + { + "allow_on_submit": 1, + "depends_on": "eval:doc.use_html == 1", + "fieldname": "mfs_html", + "fieldtype": "Code", + "label": "Message for Supplier", + "mandatory_depends_on": "eval:doc.use_html == 1", + "print_hide": 1 + }, + { + "default": "0", + "fieldname": "use_html", + "fieldtype": "Check", + "hidden": 1, + "label": "Use HTML" } ], "grid_page_length": 50, @@ -331,7 +350,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-01-06 10:31:08.747043", + "modified": "2026-03-01 23:38:48.079274", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 95727472112..38ab9af4eab 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -47,7 +47,8 @@ class RequestforQuotation(BuyingController): incoterm: DF.Link | None items: DF.Table[RequestforQuotationItem] letter_head: DF.Link | None - message_for_supplier: DF.TextEditor + message_for_supplier: DF.TextEditor | None + mfs_html: DF.Code | None named_place: DF.Data | None naming_series: DF.Literal["PUR-RFQ-.YYYY.-"] opportunity: DF.Link | None @@ -61,6 +62,7 @@ class RequestforQuotation(BuyingController): tc_name: DF.Link | None terms: DF.TextEditor | None transaction_date: DF.Date + use_html: DF.Check vendor: DF.Link | None # end: auto-generated types @@ -100,8 +102,16 @@ class RequestforQuotation(BuyingController): ["use_html", "response", "response_html", "subject"], as_dict=True, ) - if not self.message_for_supplier: - self.message_for_supplier = data.response_html if data.use_html else data.response + + self.use_html = data.use_html + + if data.use_html: + if not self.mfs_html: + self.mfs_html = data.response_html + else: + if not self.message_for_supplier: + self.message_for_supplier = data.response + if not self.subject: self.subject = data.subject @@ -304,7 +314,10 @@ class RequestforQuotation(BuyingController): else: sender = frappe.session.user not in STANDARD_USERS and frappe.session.user or None - rendered_message = frappe.render_template(self.message_for_supplier, doc_args) + message_template = self.mfs_html if self.use_html else self.message_for_supplier + # nosemgrep: frappe-semgrep-rules.rules.security.frappe-ssti + rendered_message = frappe.render_template(message_template, doc_args) + subject_source = ( self.subject or frappe.get_value("Email Template", self.email_template, "subject") From c7928a074934465af4474ca5d1901c5cc9d4e8e7 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Tue, 3 Mar 2026 19:41:50 +0530 Subject: [PATCH 55/85] fix(selling): handle selling price validation for FG item System checks valuation rate in incoming_rate field, since SO has it in valuation_rate field of item row, need to handle the field name dynamically based upon the doctype name in Selling Controller. (cherry picked from commit 433531848259db472715f9f8991a4537c1a75710) --- erpnext/controllers/selling_controller.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 6db30b41a8a..742d8627fdf 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -333,9 +333,10 @@ class SellingController(StockController): if is_internal_customer or not is_stock_item: continue - if item.get("incoming_rate") and item.base_net_rate < ( + rate_field = "valuation_rate" if self.doctype in ["Sales Order", "Quotation"] else "incoming_rate" + if item.get(rate_field) and item.base_net_rate < ( valuation_rate := flt( - item.incoming_rate * (item.conversion_factor or 1), item.precision("base_net_rate") + item.get(rate_field) * (item.conversion_factor or 1), item.precision("base_net_rate") ) ): throw_message( From 7713d25b7ee72cea825273e54eef4a032b5b9b33 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Tue, 3 Mar 2026 20:33:55 +0530 Subject: [PATCH 56/85] test: add unit test for FG Item selling price validation (cherry picked from commit 723993fdf69aaed40d8bcf24f40f3aef7de04d6d) --- .../doctype/sales_order/test_sales_order.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 3cb326cbcc3..6c7ae9c0660 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -2647,6 +2647,49 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase): si2 = make_sales_invoice(so.name) self.assertEqual(si2.items[0].qty, 20) + @change_settings("Selling Settings", {"validate_selling_price": 1}) + def test_selling_price_validation_for_manufactured_item(self): + """ + Unit test to check the selling price validation for manufactured item, without last purchae rate in Item master. + """ + + from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + # create a FG Item and RM Item + rm_item = make_item( + "_Test RM Item for SO selling validation", + {"is_stock_item": 1, "valuation_rate": 100, "stock_uom": "Nos"}, + ).name + rm_warehouse = create_warehouse("_Test RM SPV Warehouse") + fg_item = make_item("_Test FG Item for SO selling validation", {"is_stock_item": 1}).name + fg_warehouse = create_warehouse("_Test FG SPV Warehouse") + + # create BOM and inward entry for RM Item + bom_no = make_bom(item=fg_item, raw_materials=[rm_item]).name + make_stock_entry(item_code=rm_item, target=rm_warehouse, qty=10, rate=100) + + # create a manufacture entry, so system won't update the last purchase rate in Item master. + se = make_stock_entry(item_code=fg_item, qty=10, purpose="Manufacture", do_not_save=True) + + se.from_bom = 1 + se.use_multi_level_bom = 1 + se.bom_no = bom_no + se.fg_completed_qty = 1 + se.from_warehouse = rm_warehouse + se.to_warehouse = fg_warehouse + + se.get_items() + se.save() + se.submit() + + # check valuation of FG Item + self.assertEqual(se.items[1].valuation_rate, 100) + + # create a SO for FG Item with selling rate than valuation rate. + so = make_sales_order(item_code=fg_item, qty=10, rate=50, warehouse=fg_warehouse, do_not_save=1) + self.assertRaises(frappe.ValidationError, so.save) + def compare_payment_schedules(doc, doc1, doc2): for index, schedule in enumerate(doc1.get("payment_schedule")): From c6e0eb6d179c11a8765eff40f1c94e259d509ed5 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Wed, 18 Feb 2026 23:59:42 +0530 Subject: [PATCH 57/85] fix(stock): validate company for receipt documents and expense accounts (cherry picked from commit 15dfc08a3181063f18147af0ad6170393531cfae) --- .../landed_cost_voucher.py | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py index 9d23eda3755..f57a8792598 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py @@ -75,6 +75,7 @@ class LandedCostVoucher(Document): self.check_mandatory() self.validate_receipt_documents() self.validate_line_items() + self.validate_expense_accounts() init_landed_taxes_and_totals(self) self.set_total_taxes_and_charges() if not self.get("items"): @@ -116,11 +117,27 @@ class LandedCostVoucher(Document): receipt_documents = [] for d in self.get("purchase_receipts"): - docstatus = frappe.db.get_value(d.receipt_document_type, d.receipt_document, "docstatus") + docstatus, company = frappe.get_cached_value( + d.receipt_document_type, d.receipt_document, ["docstatus", "company"] + ) if docstatus != 1: msg = f"Row {d.idx}: {d.receipt_document_type} {frappe.bold(d.receipt_document)} must be submitted" frappe.throw(_(msg), title=_("Invalid Document")) + if company != self.company: + frappe.throw( + _( + "Row {0}: {1} {2} is linked to company {3}. Please select a document belonging to company {4}." + ).format( + d.idx, + d.receipt_document_type, + frappe.bold(d.receipt_document), + frappe.bold(company), + frappe.bold(self.company), + ), + title=_("Incorrect Company"), + ) + if d.receipt_document_type == "Purchase Invoice": update_stock = frappe.db.get_value( d.receipt_document_type, d.receipt_document, "update_stock" @@ -152,6 +169,23 @@ class LandedCostVoucher(Document): _("Row {0}: Cost center is required for an item {1}").format(item.idx, item.item_code) ) + def validate_expense_accounts(self): + for t in self.taxes: + company = frappe.get_cached_value("Account", t.expense_account, "company") + + if company != self.company: + frappe.throw( + _( + "Row {0}: Expense Account {1} is linked to company {2}. Please select an account belonging to company {3}." + ).format( + t.idx, + frappe.bold(t.expense_account), + frappe.bold(company), + frappe.bold(self.company), + ), + title=_("Incorrect Account"), + ) + def set_total_taxes_and_charges(self): self.total_taxes_and_charges = sum(flt(d.base_amount) for d in self.get("taxes")) From 25c134d11ce6a50b1786b4f5194340581e2aec2b Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Fri, 20 Feb 2026 12:15:40 +0530 Subject: [PATCH 58/85] fix: set company based expense account (cherry picked from commit d54d0c25a23ac65c6fe1fd971bdcc0c1cab5ca1a) --- .../landed_cost_voucher/test_landed_cost_voucher.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index 586e95f3ab2..440d828cd61 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -1260,6 +1260,7 @@ def make_landed_cost_voucher(**args): lcv = frappe.new_doc("Landed Cost Voucher") lcv.company = args.company or "_Test Company" lcv.distribute_charges_based_on = args.distribute_charges_based_on or "Amount" + expense_account = get_expense_account(args.company or "_Test Company") lcv.set( "purchase_receipts", @@ -1280,7 +1281,7 @@ def make_landed_cost_voucher(**args): [ { "description": "Shipping Charges", - "expense_account": args.expense_account or "Expenses Included In Valuation - TCP1", + "expense_account": args.expense_account or expense_account, "amount": args.charges, } ], @@ -1300,6 +1301,7 @@ def create_landed_cost_voucher(receipt_document_type, receipt_document, company, lcv = frappe.new_doc("Landed Cost Voucher") lcv.company = company lcv.distribute_charges_based_on = "Amount" + expense_account = get_expense_account(company) lcv.set( "purchase_receipts", @@ -1319,7 +1321,7 @@ def create_landed_cost_voucher(receipt_document_type, receipt_document, company, [ { "description": "Insurance Charges", - "expense_account": "Expenses Included In Valuation - TCP1", + "expense_account": expense_account, "amount": charges, } ], @@ -1334,6 +1336,11 @@ def create_landed_cost_voucher(receipt_document_type, receipt_document, company, return lcv +def get_expense_account(company): + company_abbr = frappe.get_cached_value("Company", company, "abbr") + return f"Expenses Included In Valuation - {company_abbr}" + + def distribute_landed_cost_on_items(lcv): based_on = lcv.distribute_charges_based_on.lower() total = sum(flt(d.get(based_on)) for d in lcv.get("items")) From 4350c6b9e394167c88d74c0d64e23ec4f7e9db42 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Mon, 23 Feb 2026 01:59:25 +0530 Subject: [PATCH 59/85] test(stock): add test to validate company for receipts and expense accounts (cherry picked from commit d58171987c4a63de234acfd2c1f2cd53c767ad03) --- .../landed_cost_voucher.py | 6 ++++ .../test_landed_cost_voucher.py | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py index f57a8792598..fc4bc589f9d 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py @@ -14,6 +14,10 @@ from erpnext.controllers.taxes_and_totals import init_landed_taxes_and_totals from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos +class IncorrectCompanyValidationError(frappe.ValidationError): + pass + + class LandedCostVoucher(Document): # begin: auto-generated types # This code is auto-generated. Do not modify anything in this block. @@ -136,6 +140,7 @@ class LandedCostVoucher(Document): frappe.bold(self.company), ), title=_("Incorrect Company"), + exc=IncorrectCompanyValidationError, ) if d.receipt_document_type == "Purchase Invoice": @@ -184,6 +189,7 @@ class LandedCostVoucher(Document): frappe.bold(self.company), ), title=_("Incorrect Account"), + exc=IncorrectCompanyValidationError, ) def set_total_taxes_and_charges(self): diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index 440d828cd61..f68351a5611 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -178,6 +178,39 @@ class TestLandedCostVoucher(IntegrationTestCase): self.assertEqual(last_sle.qty_after_transaction, last_sle_after_landed_cost.qty_after_transaction) self.assertEqual(last_sle_after_landed_cost.stock_value - last_sle.stock_value, 50.0) + def test_lcv_validates_company(self): + from erpnext.stock.doctype.landed_cost_voucher.landed_cost_voucher import ( + IncorrectCompanyValidationError, + ) + + company_a = "_Test Company" + company_b = "_Test Company with perpetual inventory" + + pr = make_purchase_receipt( + company=company_a, + warehouse="Stores - _TC", + qty=1, + rate=100, + ) + + lcv = make_landed_cost_voucher( + company=company_b, + receipt_document_type="Purchase Receipt", + receipt_document=pr.name, + charges=50, + do_not_save=True, + ) + + self.assertRaises(IncorrectCompanyValidationError, lcv.validate_receipt_documents) + lcv.company = company_a + + self.assertRaises(IncorrectCompanyValidationError, lcv.validate_expense_accounts) + lcv.taxes[0].expense_account = get_expense_account(company_a) + + lcv.save() + distribute_landed_cost_on_items(lcv) + lcv.submit() + def test_landed_cost_voucher_for_zero_purchase_rate(self): "Test impact of LCV on future stock balances." from erpnext.stock.doctype.item.test_item import make_item From 8463cf88df8103cd47d6430f6e650b6957d85eff Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 4 Mar 2026 12:06:28 +0530 Subject: [PATCH 60/85] fix: do not update fg_completed_qty when changing qty of fg line item (cherry picked from commit 2d83069b82518aa1ef9d6c48be3ddc2c3082f64c) --- erpnext/stock/doctype/stock_entry/stock_entry.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 94b396e996a..5d7704a6d03 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -930,10 +930,6 @@ frappe.ui.form.on("Stock Entry Detail", { ); }, - qty(frm, cdt, cdn) { - frm.events.set_rate_and_fg_qty(frm, cdt, cdn); - }, - conversion_factor(frm, cdt, cdn) { frm.events.set_rate_and_fg_qty(frm, cdt, cdn); }, From 69b217065c9b9b2e158406536494d50bf170f8c4 Mon Sep 17 00:00:00 2001 From: Nishka Gosalia Date: Wed, 4 Mar 2026 10:27:27 +0530 Subject: [PATCH 61/85] feat: allowing rate modification in update item in quotation (cherry picked from commit 2ec02e477f6a9141b6a0c6b875fb9dd8ef6a95e6) --- .../test_supplier_quotation.py | 18 +++++++- erpnext/controllers/accounts_controller.py | 33 +++++++++----- .../doctype/quotation/test_quotation.py | 45 +++++++++++++++++-- 3 files changed, 82 insertions(+), 14 deletions(-) diff --git a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py index ffbec9bd73e..7c2714ba671 100644 --- a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py @@ -34,7 +34,7 @@ class TestPurchaseOrder(IntegrationTestCase): self.assertEqual(sq.get("items")[1].rate, 300) self.assertEqual(sq.get("items")[1].description, "test") - def test_update_supplier_quotation_child_rate_disallow(self): + def test_update_supplier_quotation_child_rate(self): sq = frappe.copy_doc(self.globalTestRecords["Supplier Quotation"][0]) sq.submit() trans_item = json.dumps( @@ -47,6 +47,22 @@ class TestPurchaseOrder(IntegrationTestCase): }, ] ) + update_child_qty_rate("Supplier Quotation", trans_item, sq.name) + sq.reload() + self.assertEqual(sq.get("items")[0].rate, 300) + po = make_purchase_order(sq.name) + po.schedule_date = add_days(today(), 1) + po.submit() + trans_item = json.dumps( + [ + { + "item_code": sq.items[0].item_code, + "rate": 20, + "qty": sq.items[0].qty, + "docname": sq.items[0].name, + }, + ] + ) self.assertRaises( frappe.ValidationError, update_child_qty_rate, "Supplier Quotation", trans_item, sq.name ) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 6a75859cdb0..b0b5c4e25bb 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -3872,20 +3872,28 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil return frappe.db.get_single_value("Buying Settings", "allow_zero_qty_in_purchase_order") or False return False - def validate_quantity(child_item, new_data): + def validate_quantity_and_rate(child_item, new_data): if not flt(new_data.get("qty")) and not is_allowed_zero_qty(): frappe.throw( - _("Row #{0}: Quantity for Item {1} cannot be zero.").format( + _("Row #{0}:Quantity for Item {1} cannot be zero.").format( new_data.get("idx"), frappe.bold(new_data.get("item_code")) ), title=_("Invalid Qty"), ) - if parent_doctype == "Sales Order" and flt(new_data.get("qty")) < flt(child_item.delivered_qty): - frappe.throw(_("Cannot set quantity less than delivered quantity")) + qty_limits = { + "Sales Order": ("delivered_qty", _("Cannot set quantity less than delivered quantity")), + "Purchase Order": ("received_qty", _("Cannot set quantity less than received quantity")), + } - if parent_doctype == "Purchase Order" and flt(new_data.get("qty")) < flt(child_item.received_qty): - frappe.throw(_("Cannot set quantity less than received quantity")) + if parent_doctype in qty_limits: + qty_field, error_message = qty_limits[parent_doctype] + if flt(new_data.get("qty")) < flt(child_item.get(qty_field)): + frappe.throw( + _("Row #{0}:").format(new_data.get("idx")) + + error_message.format(frappe.bold(new_data.get("item_code"))), + title=_("Invalid Qty"), + ) if parent_doctype in ["Quotation", "Supplier Quotation"]: if (parent_doctype == "Quotation" and not ordered_items) or ( @@ -3898,7 +3906,15 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil if parent_doctype == "Quotation" else purchased_items.get(child_item.name) ) + if qty_to_check: + if not rate_unchanged: + frappe.throw( + _( + "Cannot update rate as item {0} is already ordered or purchased against this quotation" + ).format(frappe.bold(new_data.get("item_code"))) + ) + if flt(new_data.get("qty")) < qty_to_check: frappe.throw(_("Cannot reduce quantity than ordered or purchased quantity")) @@ -4017,10 +4033,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil ): continue - validate_quantity(child_item, d) - if parent_doctype in ["Quotation", "Supplier Quotation"]: - if not rate_unchanged: - frappe.throw(_("Rates cannot be modified for quoted items")) + validate_quantity_and_rate(child_item, d) if flt(child_item.get("qty")) != flt(d.get("qty")): any_qty_changed = True diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index 49f921d9865..ad8f2881873 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -59,8 +59,22 @@ class TestQuotation(IntegrationTestCase): qo.payment_schedule[0].due_date = add_days(qo.transaction_date, -2) self.assertRaises(frappe.ValidationError, qo.save) - def test_update_child_disallow_rate_change(self): - qo = make_quotation(qty=4) + def test_update_child_rate_change(self): + from erpnext.stock.doctype.item.test_item import make_item + + item_1 = make_item("_Test Item") + item_2 = make_item("_Test Item 1") + + item_list = [ + {"item_code": item_1.item_code, "warehouse": "_Test Warehouse - _TC", "qty": 10, "rate": 300}, + {"item_code": item_2.item_code, "warehouse": "_Test Warehouse - _TC", "qty": 5, "rate": 400}, + ] + + qo = make_quotation(item_list=item_list) + so = make_sales_order(qo.name, args={"filtered_children": [qo.items[0].name]}) + so.delivery_date = nowdate() + so.submit() + qo.reload() trans_item = json.dumps( [ { @@ -68,10 +82,35 @@ class TestQuotation(IntegrationTestCase): "rate": 5000, "qty": qo.items[0].qty, "docname": qo.items[0].name, - } + }, + { + "item_code": qo.items[1].item_code, + "rate": qo.items[1].rate, + "qty": qo.items[1].qty, + "docname": qo.items[1].name, + }, ] ) self.assertRaises(frappe.ValidationError, update_child_qty_rate, "Quotation", trans_item, qo.name) + trans_item = json.dumps( + [ + { + "item_code": qo.items[0].item_code, + "rate": qo.items[0].rate, + "qty": qo.items[0].qty, + "docname": qo.items[0].name, + }, + { + "item_code": qo.items[1].item_code, + "rate": 50, + "qty": qo.items[1].qty, + "docname": qo.items[1].name, + }, + ] + ) + update_child_qty_rate("Quotation", trans_item, qo.name) + qo.reload() + self.assertEqual(qo.items[1].rate, 50) def test_update_child_removing_item(self): qo = make_quotation(qty=10) From 76a6ff9026ffb3f0a07aecaca2a4044c36805dfa Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 07:23:39 +0000 Subject: [PATCH 62/85] Merge pull request #53096 from frappe/mergify/bp/version-16-hotfix/pr-52838 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: correct fields being updated on material request and purchase or… (backport #52838) --- erpnext/patches.txt | 1 + ...ty_and_requested_qty_based_on_mr_and_po.py | 33 +++++++++++++++++++ .../sales_order_item/sales_order_item.json | 11 ++++++- .../sales_order_item/sales_order_item.py | 1 + .../material_request/material_request.py | 4 ++- 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 3c59e1ff550..51c27e774ec 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -468,3 +468,4 @@ erpnext.patches.v15_0.replace_http_with_https_in_sales_partner erpnext.patches.v15_0.delete_quotation_lost_record_detail erpnext.patches.v16_0.add_portal_redirects erpnext.patches.v16_0.complete_onboarding_steps_for_older_sites #2 +erpnext.patches.v16_0.update_order_qty_and_requested_qty_based_on_mr_and_po diff --git a/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py new file mode 100644 index 00000000000..59a84ec11d0 --- /dev/null +++ b/erpnext/patches/v16_0/update_order_qty_and_requested_qty_based_on_mr_and_po.py @@ -0,0 +1,33 @@ +import frappe +from frappe.query_builder import DocType +from frappe.query_builder.functions import Sum + + +def execute(): + PurchaseOrderItem = DocType("Purchase Order Item") + MaterialRequestItem = DocType("Material Request Item") + + poi_query = ( + frappe.qb.from_(PurchaseOrderItem) + .select(PurchaseOrderItem.sales_order_item, Sum(PurchaseOrderItem.stock_qty)) + .where(PurchaseOrderItem.sales_order_item.isnotnull() & PurchaseOrderItem.docstatus == 1) + .groupby(PurchaseOrderItem.sales_order_item) + ) + + mri_query = ( + frappe.qb.from_(MaterialRequestItem) + .select(MaterialRequestItem.sales_order_item, Sum(MaterialRequestItem.stock_qty)) + .where(MaterialRequestItem.sales_order_item.isnotnull() & MaterialRequestItem.docstatus == 1) + .groupby(MaterialRequestItem.sales_order_item) + ) + + poi_data = poi_query.run() + mri_data = mri_query.run() + + updates_against_poi = {data[0]: {"ordered_qty": data[1]} for data in poi_data} + updates_against_mri = {data[0]: {"requested_qty": data[1], "ordered_qty": 0} for data in mri_data} + + frappe.db.auto_commit_on_many_writes = 1 + frappe.db.bulk_update("Sales Order Item", updates_against_mri) + frappe.db.bulk_update("Sales Order Item", updates_against_poi) + frappe.db.auto_commit_on_many_writes = 0 diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 312b882a7df..d98dc8dccc4 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -95,6 +95,7 @@ "ordered_qty", "planned_qty", "production_plan_qty", + "requested_qty", "column_break_69", "work_order_qty", "delivered_qty", @@ -1010,13 +1011,21 @@ "fieldtype": "Float", "label": "Finished Good Qty", "mandatory_depends_on": "eval:parent.is_subcontracted" + }, + { + "fieldname": "requested_qty", + "fieldtype": "Float", + "label": "Requested Qty", + "no_copy": 1, + "print_hide": 1, + "read_only": 1 } ], "grid_page_length": 50, "idx": 1, "istable": 1, "links": [], - "modified": "2026-02-20 16:39:00.200328", + "modified": "2026-02-21 16:39:00.200328", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.py b/erpnext/selling/doctype/sales_order_item/sales_order_item.py index 9128f8a3e41..98298f22036 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.py +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.py @@ -80,6 +80,7 @@ class SalesOrderItem(Document): quotation_item: DF.Data | None rate: DF.Currency rate_with_margin: DF.Currency + requested_qty: DF.Float reserve_stock: DF.Check returned_qty: DF.Float stock_qty: DF.Float diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 47822ba1dae..15e13561afc 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -90,7 +90,7 @@ class MaterialRequest(BuyingController): { "source_dt": "Material Request Item", "target_dt": "Sales Order Item", - "target_field": "ordered_qty", + "target_field": "requested_qty", "target_parent_dt": "Sales Order", "target_parent_field": "", "join_field": "sales_order_item", @@ -280,6 +280,8 @@ class MaterialRequest(BuyingController): def on_cancel(self): self.update_requested_qty_in_production_plan(cancel=True) self.update_requested_qty() + if self.material_request_type == "Purchase": + self.update_prevdoc_status() def get_mr_items_ordered_qty(self, mr_items): mr_items_ordered_qty = {} From d251c94ea31ecd9d250a7e2e6055f2e31ca37482 Mon Sep 17 00:00:00 2001 From: Nishka Gosalia Date: Wed, 4 Mar 2026 14:40:24 +0530 Subject: [PATCH 63/85] fix: updating costing based on employee change in timesheet (cherry picked from commit e37d4a6f7c0f13d420c2844368192cdd59eadedf) --- .../projects/doctype/timesheet/timesheet.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js index 97095dfa007..8001dffad86 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.js +++ b/erpnext/projects/doctype/timesheet/timesheet.js @@ -260,6 +260,33 @@ frappe.ui.form.on("Timesheet", { parent_project: function (frm) { set_project_in_timelog(frm); }, + + employee: function (frm) { + if (frm.doc.employee && frm.doc.time_logs) { + const selected_employee = frm.doc.employee; + frm.doc.time_logs.forEach((row) => { + if (row.activity_type) { + frappe.call({ + method: "erpnext.projects.doctype.timesheet.timesheet.get_activity_cost", + args: { + employee: frm.doc.employee, + activity_type: row.activity_type, + currency: frm.doc.currency, + }, + callback: function (r) { + if (r.message) { + if (selected_employee !== frm.doc.employee) return; + row.billing_rate = r.message["billing_rate"]; + row.costing_rate = r.message["costing_rate"]; + frm.refresh_fields("time_logs"); + calculate_billing_costing_amount(frm, row.doctype, row.name); + } + }, + }); + } + }); + } + }, }); frappe.ui.form.on("Timesheet Detail", { From 12cfd8e05265cca702e9ada8aa383346727d06fd Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Wed, 4 Mar 2026 14:20:14 +0530 Subject: [PATCH 64/85] fix: skip asset sale processing for internal transfer invoices (cherry picked from commit 9cb3dad079a4c06637091b20388464cad8f1e435) --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index d586d091707..fb32b4db364 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1451,6 +1451,9 @@ class SalesInvoice(SellingController): return asset_qty_map def process_asset_depreciation(self): + if self.is_internal_transfer(): + return + if (self.is_return and self.docstatus == 2) or (not self.is_return and self.docstatus == 1): self.depreciate_asset_on_sale() else: From 57aab56baa53be732c063e0c259693ad500ab41c Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 4 Mar 2026 16:05:24 +0530 Subject: [PATCH 65/85] fix: disallow all actions on job card if work order is closed (cherry picked from commit ee19c32c3aa0c4b5fa1ec44b2af46b651a80a853) --- erpnext/manufacturing/doctype/job_card/job_card.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py index 46209c88117..d283bc8dadb 100644 --- a/erpnext/manufacturing/doctype/job_card/job_card.py +++ b/erpnext/manufacturing/doctype/job_card/job_card.py @@ -1321,9 +1321,9 @@ class JobCard(Document): def is_work_order_closed(self): if self.work_order: - status = frappe.get_value("Work Order", self.work_order) + status = frappe.get_value("Work Order", self.work_order, "status") - if status == "Closed": + if status in ["Closed", "Stopped"]: return True return False From 78fa2c5477e8eb5ce2c52098beb294d954e82475 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Wed, 4 Mar 2026 20:17:37 +0530 Subject: [PATCH 66/85] fix: WO produced qty should be calculated using finished item child table transfer qty (cherry picked from commit 5fead1d17a158761d01737201eea8af26d9612ca) --- .../doctype/work_order/work_order.py | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index b74281308b7..3c27d502088 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -713,19 +713,25 @@ class WorkOrder(Document): self.db_set("disassembled_qty", self.disassembled_qty) def get_transferred_or_manufactured_qty(self, purpose, fieldname): - table = frappe.qb.DocType("Stock Entry") - query = frappe.qb.from_(table).where( - (table.work_order == self.name) & (table.docstatus == 1) & (table.purpose == purpose) + parent = frappe.qb.DocType("Stock Entry") + + query = frappe.qb.from_(parent).where( + (parent.work_order == self.name) + & (parent.docstatus == 1) + & (parent.purpose == purpose) + & (parent.is_additional_transfer_entry == cint(fieldname == "additional_transferred_qty")) ) if purpose == "Manufacture": - query = query.select(Sum(table.fg_completed_qty) - Sum(table.process_loss_qty)) + child = frappe.qb.DocType("Stock Entry Detail") + query = ( + query.join(child) + .on(parent.name == child.parent) + .select(Sum(child.transfer_qty)) + .where(child.is_finished_item == 1) + ) else: - query = query.select(Sum(table.fg_completed_qty)) - - query = query.where( - table.is_additional_transfer_entry == cint(fieldname == "additional_transferred_qty") - ) + query = query.select(Sum(parent.fg_completed_qty)) return flt(query.run()[0][0]) From c8560fa0d3b5672601bd340d3870499436a8557e Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Thu, 5 Feb 2026 09:56:41 +0530 Subject: [PATCH 67/85] fix(project template): clear subject when task is empty (cherry picked from commit c1431105f4860baf8debfb7841cc1af9486d4876) --- .../projects/doctype/project_template/project_template.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/projects/doctype/project_template/project_template.js b/erpnext/projects/doctype/project_template/project_template.js index a2d008af027..b929c59126e 100644 --- a/erpnext/projects/doctype/project_template/project_template.js +++ b/erpnext/projects/doctype/project_template/project_template.js @@ -19,6 +19,13 @@ frappe.ui.form.on("Project Template", { frappe.ui.form.on("Project Template Task", { task: function (frm, cdt, cdn) { var row = locals[cdt][cdn]; + + if (!row.task) { + row.subject = null; + refresh_field("tasks"); + return; + } + frappe.db.get_value("Task", row.task, "subject", (value) => { row.subject = value.subject; refresh_field("tasks"); From 2ccf8d050f9e3690a29cfcc2608edfaabadacb42 Mon Sep 17 00:00:00 2001 From: ravibharathi656 Date: Thu, 5 Feb 2026 09:59:05 +0530 Subject: [PATCH 68/85] fix(task): allow is_template field in quick entry (cherry picked from commit 7801dd53534f178a65caf7eef5d8d2806dd047ef) --- erpnext/projects/doctype/task/task.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index b9b70a207da..8673455dbfa 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -368,6 +368,7 @@ "options": "User" }, { + "allow_in_quick_entry": 1, "default": "0", "fieldname": "is_template", "fieldtype": "Check", @@ -404,11 +405,11 @@ "is_tree": 1, "links": [], "max_attachments": 5, - "modified": "2025-10-16 08:39:12.214577", + "modified": "2026-02-05 09:58:38.052875", "modified_by": "Administrator", "module": "Projects", "name": "Task", - "naming_rule": "Expression (old style)", + "naming_rule": "Expression", "nsm_parent_field": "parent_task", "owner": "Administrator", "permissions": [ @@ -425,6 +426,7 @@ } ], "quick_entry": 1, + "row_format": "Dynamic", "search_fields": "subject", "show_name_in_global_search": 1, "show_preview_popup": 1, @@ -434,4 +436,4 @@ "timeline_field": "project", "title_field": "subject", "track_seen": 1 -} \ No newline at end of file +} From f7dd730bc3a2ecde73c2292e155bd01c6e8291af Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Wed, 28 Jan 2026 15:38:17 +0530 Subject: [PATCH 69/85] feat(selling-settings): add checkbox to recalculate payment date (cherry picked from commit 70b401e610c51adbb221bbe83b89cca664c3c755) --- erpnext/selling/doctype/quotation/quotation.py | 10 ++++++++-- .../doctype/selling_settings/selling_settings.json | 7 +++++++ .../doctype/selling_settings/selling_settings.py | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 3db03a18513..9d954acec7a 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -7,7 +7,7 @@ import json import frappe from frappe import _ from frappe.model.mapper import get_mapped_doc -from frappe.utils import flt, getdate, nowdate +from frappe.utils import cint, flt, getdate, nowdate from erpnext.controllers.selling_controller import SellingController @@ -462,13 +462,19 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar }, "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, - "Payment Schedule": {"doctype": "Payment Schedule", "add_if_empty": True}, }, target_doc, set_missing_values, ignore_permissions=ignore_permissions, ) + automatically_fetch_payment_terms = cint( + frappe.get_single_value("Selling Settings", "automatically_fetch_payment_terms_from_quotation") + ) + + if automatically_fetch_payment_terms: + doclist.set_payment_schedule() + return doclist diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 53e9d42a7ab..375d2e2d465 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -41,6 +41,7 @@ "allow_zero_qty_in_quotation", "allow_zero_qty_in_sales_order", "set_zero_rate_for_expired_batch", + "automatically_fetch_payment_terms_from_quotation", "section_break_avhb", "enable_utm", "experimental_section", @@ -320,6 +321,12 @@ "fieldname": "enable_utm", "fieldtype": "Check", "label": "Enable UTM" + }, + { + "default": "0", + "fieldname": "automatically_fetch_payment_terms_from_quotation", + "fieldtype": "Check", + "label": "Automatically Fetch Payment Terms from Quotation" } ], "grid_page_length": 50, diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py index 8621f5f066d..837b6357825 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.py +++ b/erpnext/selling/doctype/selling_settings/selling_settings.py @@ -38,6 +38,7 @@ class SellingSettings(Document): allow_sales_order_creation_for_expired_quotation: DF.Check allow_zero_qty_in_quotation: DF.Check allow_zero_qty_in_sales_order: DF.Check + automatically_fetch_payment_terms_from_quotation: DF.Check blanket_order_allowance: DF.Float cust_master_name: DF.Literal["Customer Name", "Naming Series", "Auto Name"] customer_group: DF.Link | None From 1470a79a1b394cbe780d0f6065f38e6a7363e704 Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Wed, 28 Jan 2026 22:23:10 +0530 Subject: [PATCH 70/85] fix: consider payment term only when enabled (cherry picked from commit b1149fe950bcdbba2b2e55e5314617b0e611e0f5) --- .../selling/doctype/quotation/quotation.py | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 9d954acec7a..c8be6ef82fc 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -446,34 +446,33 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar child_filter = d.name in filtered_items if filtered_items else True return child_filter - doclist = get_mapped_doc( - "Quotation", - source_name, - { - "Quotation": { - "doctype": "Sales Order", - "validation": {"docstatus": ["=", 1]}, - }, - "Quotation Item": { - "doctype": "Sales Order Item", - "field_map": {"parent": "prevdoc_docname", "name": "quotation_item"}, - "postprocess": update_item, - "condition": lambda d: can_map_row(d) and select_item(d), - }, - "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, - "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, - }, - target_doc, - set_missing_values, - ignore_permissions=ignore_permissions, - ) - automatically_fetch_payment_terms = cint( frappe.get_single_value("Selling Settings", "automatically_fetch_payment_terms_from_quotation") ) + mapping = { + "Quotation": {"doctype": "Sales Order", "validation": {"docstatus": ["=", 1]}}, + "Quotation Item": { + "doctype": "Sales Order Item", + "field_map": {"parent": "prevdoc_docname", "name": "quotation_item"}, + "postprocess": update_item, + "condition": lambda d: can_map_row(d) and select_item(d), + }, + "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, + "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, + } + if automatically_fetch_payment_terms: - doclist.set_payment_schedule() + mapping["Payment Schedule"] = {"doctype": "Payment Schedule", "add_if_empty": True} + + doclist = get_mapped_doc( + "Quotation", + source_name, + mapping, + target_doc, + set_missing_values, + ignore_permissions=ignore_permissions, + ) return doclist From 8f26168a55486eea20e381e2fa7aea0a6db0de0c Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Wed, 28 Jan 2026 22:24:59 +0530 Subject: [PATCH 71/85] test: enable automatically_fetch_payment_terms_from_quotation (cherry picked from commit 5611e9168ec742c1e1300c9cd48fd7190d6c07d8) --- erpnext/selling/doctype/quotation/test_quotation.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index ad8f2881873..970c1816b8f 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -182,6 +182,10 @@ class TestQuotation(IntegrationTestCase): self.assertTrue(quotation.payment_schedule) + @IntegrationTestCase.change_settings( + "Selling Settings", + {"automatically_fetch_payment_terms_from_quotation": 1}, + ) def test_make_sales_order_terms_copied(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order @@ -326,6 +330,10 @@ class TestQuotation(IntegrationTestCase): "Accounts Settings", {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 0}, ) + @IntegrationTestCase.change_settings( + "Selling Settings", + {"automatically_fetch_payment_terms_from_quotation": 1}, + ) def test_make_sales_order_with_terms(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order From 80c20531aa8d98c44fd92bfe3af52ce1c860bbb6 Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Thu, 5 Feb 2026 11:08:38 +0530 Subject: [PATCH 72/85] fix: handle payment terms template when disabled (cherry picked from commit f23dc079147b2a09e01a08ae94146bb5c48077d3) --- erpnext/selling/doctype/quotation/quotation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index c8be6ef82fc..50e0e1c1d01 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -464,6 +464,8 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar if automatically_fetch_payment_terms: mapping["Payment Schedule"] = {"doctype": "Payment Schedule", "add_if_empty": True} + else: + mapping["Quotation"]["field_no_map"] = ["payment_terms_template"] doclist = get_mapped_doc( "Quotation", From 3b7410f2d367794687458aafabd3a0f954ee0230 Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Wed, 18 Feb 2026 21:28:26 +0530 Subject: [PATCH 73/85] fix: set default to 1 (cherry picked from commit 8b9e02fd44a3b3fbb76386ffecba5638dfeddb03) --- .../selling/doctype/selling_settings/selling_settings.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 375d2e2d465..48fffc77f9b 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -321,9 +321,9 @@ "fieldname": "enable_utm", "fieldtype": "Check", "label": "Enable UTM" - }, + }, { - "default": "0", + "default": "1", "fieldname": "automatically_fetch_payment_terms_from_quotation", "fieldtype": "Check", "label": "Automatically Fetch Payment Terms from Quotation" @@ -336,7 +336,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-12 10:38:34.605126", + "modified": "2026-02-18 21:25:56.307468", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", From b2f695310c3356f1eed0859bcbf2ecdc4bd17d2f Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Fri, 27 Feb 2026 01:09:09 +0530 Subject: [PATCH 74/85] fix: fetch payment terms from quotation (cherry picked from commit 99ed1c34f35344613aca48c82a2fa18b4a204c45) --- .../accounts_settings/accounts_settings.json | 4 +- erpnext/controllers/accounts_controller.py | 29 +++++++------- erpnext/public/js/controllers/transaction.js | 1 + .../selling/doctype/quotation/quotation.py | 38 +++++++++---------- .../doctype/sales_order/sales_order.json | 11 +++++- .../doctype/sales_order/sales_order.py | 1 + .../selling_settings/selling_settings.json | 9 +---- .../selling_settings/selling_settings.py | 1 - 8 files changed, 50 insertions(+), 44 deletions(-) diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 874da99bdbf..ee734184452 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -205,7 +205,7 @@ "description": "Payment Terms from orders will be fetched into the invoices as is", "fieldname": "automatically_fetch_payment_terms", "fieldtype": "Check", - "label": "Automatically Fetch Payment Terms from Order" + "label": "Automatically Fetch Payment Terms from Order/Quotation" }, { "description": "The percentage you are allowed to bill more against the amount ordered. For example, if the order value is $100 for an item and tolerance is set as 10%, then you are allowed to bill up to $110 ", @@ -697,7 +697,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-04 17:15:38.609327", + "modified": "2026-02-27 01:04:09.415288", "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index b0b5c4e25bb..43eaffa786b 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2525,13 +2525,14 @@ class AccountsController(TransactionBase): grand_total = flt(self.get("rounded_total") or self.grand_total) automatically_fetch_payment_terms = 0 - if self.doctype in ("Sales Invoice", "Purchase Invoice"): - base_grand_total = base_grand_total - flt(self.base_write_off_amount) - grand_total = grand_total - flt(self.write_off_amount) + if self.doctype in ("Sales Invoice", "Purchase Invoice", "Sales Order"): po_or_so, doctype, fieldname = self.get_order_details() automatically_fetch_payment_terms = cint( frappe.get_single_value("Accounts Settings", "automatically_fetch_payment_terms") ) + if self.doctype != "Sales Order": + base_grand_total = base_grand_total - flt(self.base_write_off_amount) + grand_total = grand_total - flt(self.write_off_amount) if self.get("total_advance"): if party_account_currency == self.company_currency: @@ -2547,7 +2548,7 @@ class AccountsController(TransactionBase): if not self.get("payment_schedule"): if ( - self.doctype in ["Sales Invoice", "Purchase Invoice"] + self.doctype in ["Sales Invoice", "Purchase Invoice", "Sales Order"] and automatically_fetch_payment_terms and self.linked_order_has_payment_terms(po_or_so, fieldname, doctype) ): @@ -2605,16 +2606,18 @@ class AccountsController(TransactionBase): if not self.get("items"): return None, None, None if self.doctype == "Sales Invoice": - po_or_so = self.get("items")[0].get("sales_order") - po_or_so_doctype = "Sales Order" - po_or_so_doctype_name = "sales_order" - + prev_doc = self.get("items")[0].get("sales_order") + prev_doctype = "Sales Order" + prev_doctype_name = "sales_order" + elif self.doctype == "Purchase Invoice": + prev_doc = self.get("items")[0].get("purchase_order") + prev_doctype = "Purchase Order" + prev_doctype_name = "purchase_order" else: - po_or_so = self.get("items")[0].get("purchase_order") - po_or_so_doctype = "Purchase Order" - po_or_so_doctype_name = "purchase_order" - - return po_or_so, po_or_so_doctype, po_or_so_doctype_name + prev_doc = self.get("items")[0].get("prevdoc_docname") + prev_doctype = "Quotation" + prev_doctype_name = "prevdoc_docname" + return prev_doc, prev_doctype, prev_doctype_name def linked_order_has_payment_terms(self, po_or_so, fieldname, doctype): if po_or_so and self.all_items_have_same_po_or_so(po_or_so, fieldname): diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 650611ee709..744a78222de 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1307,6 +1307,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe if (this.frm.doc.transaction_date) { this.frm.transaction_date = this.frm.doc.transaction_date; frappe.ui.form.trigger(this.frm.doc.doctype, "currency"); + this.recalculate_terms(); } } diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 50e0e1c1d01..4583b6cc1e5 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -447,35 +447,35 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False, ar return child_filter automatically_fetch_payment_terms = cint( - frappe.get_single_value("Selling Settings", "automatically_fetch_payment_terms_from_quotation") + frappe.get_single_value("Accounts Settings", "automatically_fetch_payment_terms") ) - mapping = { - "Quotation": {"doctype": "Sales Order", "validation": {"docstatus": ["=", 1]}}, - "Quotation Item": { - "doctype": "Sales Order Item", - "field_map": {"parent": "prevdoc_docname", "name": "quotation_item"}, - "postprocess": update_item, - "condition": lambda d: can_map_row(d) and select_item(d), - }, - "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, - "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, - } - - if automatically_fetch_payment_terms: - mapping["Payment Schedule"] = {"doctype": "Payment Schedule", "add_if_empty": True} - else: - mapping["Quotation"]["field_no_map"] = ["payment_terms_template"] - doclist = get_mapped_doc( "Quotation", source_name, - mapping, + { + "Quotation": { + "doctype": "Sales Order", + "validation": {"docstatus": ["=", 1]}, + "field_no_map": ["payment_terms_template"], + }, + "Quotation Item": { + "doctype": "Sales Order Item", + "field_map": {"parent": "prevdoc_docname", "name": "quotation_item"}, + "postprocess": update_item, + "condition": lambda d: can_map_row(d) and select_item(d), + }, + "Sales Taxes and Charges": {"doctype": "Sales Taxes and Charges", "reset_value": True}, + "Sales Team": {"doctype": "Sales Team", "add_if_empty": True}, + }, target_doc, set_missing_values, ignore_permissions=ignore_permissions, ) + if automatically_fetch_payment_terms: + doclist.set_payment_schedule() + return doclist diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 1b186352bfa..87816741728 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -123,6 +123,7 @@ "company_contact_person", "payment_schedule_section", "payment_terms_section", + "ignore_default_payment_terms_template", "payment_terms_template", "payment_schedule", "terms_section_break", @@ -1733,6 +1734,14 @@ "fieldtype": "Time", "label": "Time", "mandatory_depends_on": "is_internal_customer" + }, + { + "default": "0", + "fieldname": "ignore_default_payment_terms_template", + "fieldtype": "Check", + "hidden": 1, + "label": "Ignore Default Payment Terms Template", + "read_only": 1 } ], "grid_page_length": 50, @@ -1740,7 +1749,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-02 00:42:18.834823", + "modified": "2026-03-04 18:04:05.873483", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 1759356c63d..5c6f64278af 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -116,6 +116,7 @@ class SalesOrder(SellingController): grand_total: DF.Currency group_same_items: DF.Check has_unit_price_items: DF.Check + ignore_default_payment_terms_template: DF.Check ignore_pricing_rule: DF.Check in_words: DF.Data | None incoterm: DF.Link | None diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 48fffc77f9b..6304a55c7d8 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -41,7 +41,6 @@ "allow_zero_qty_in_quotation", "allow_zero_qty_in_sales_order", "set_zero_rate_for_expired_batch", - "automatically_fetch_payment_terms_from_quotation", "section_break_avhb", "enable_utm", "experimental_section", @@ -321,12 +320,6 @@ "fieldname": "enable_utm", "fieldtype": "Check", "label": "Enable UTM" - }, - { - "default": "1", - "fieldname": "automatically_fetch_payment_terms_from_quotation", - "fieldtype": "Check", - "label": "Automatically Fetch Payment Terms from Quotation" } ], "grid_page_length": 50, @@ -336,7 +329,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-02-18 21:25:56.307468", + "modified": "2026-02-27 00:47:46.003305", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py index 837b6357825..8621f5f066d 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.py +++ b/erpnext/selling/doctype/selling_settings/selling_settings.py @@ -38,7 +38,6 @@ class SellingSettings(Document): allow_sales_order_creation_for_expired_quotation: DF.Check allow_zero_qty_in_quotation: DF.Check allow_zero_qty_in_sales_order: DF.Check - automatically_fetch_payment_terms_from_quotation: DF.Check blanket_order_allowance: DF.Float cust_master_name: DF.Literal["Customer Name", "Naming Series", "Auto Name"] customer_group: DF.Link | None From 92003df7f919b0601623715a25a7240f827afe2f Mon Sep 17 00:00:00 2001 From: SowmyaArunachalam Date: Fri, 27 Feb 2026 01:10:51 +0530 Subject: [PATCH 75/85] test: test payment terms with backdated entries (cherry picked from commit 8aae46a25ed7ff0ca6329df787802c6c594e1937) --- .../doctype/quotation/test_quotation.py | 71 ++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py index 970c1816b8f..367b7bae0f9 100644 --- a/erpnext/selling/doctype/quotation/test_quotation.py +++ b/erpnext/selling/doctype/quotation/test_quotation.py @@ -183,8 +183,8 @@ class TestQuotation(IntegrationTestCase): self.assertTrue(quotation.payment_schedule) @IntegrationTestCase.change_settings( - "Selling Settings", - {"automatically_fetch_payment_terms_from_quotation": 1}, + "Accounts Settings", + {"automatically_fetch_payment_terms": 1}, ) def test_make_sales_order_terms_copied(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order @@ -328,11 +328,11 @@ class TestQuotation(IntegrationTestCase): @IntegrationTestCase.change_settings( "Accounts Settings", - {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 0}, - ) - @IntegrationTestCase.change_settings( - "Selling Settings", - {"automatically_fetch_payment_terms_from_quotation": 1}, + { + "add_taxes_from_item_tax_template": 0, + "add_taxes_from_taxes_and_charges_template": 0, + "automatically_fetch_payment_terms": 1, + }, ) def test_make_sales_order_with_terms(self): from erpnext.selling.doctype.quotation.quotation import make_sales_order @@ -370,10 +370,13 @@ class TestQuotation(IntegrationTestCase): sales_order.save() self.assertEqual(sales_order.payment_schedule[0].payment_amount, 8906.00) - self.assertEqual(sales_order.payment_schedule[0].due_date, getdate(quotation.transaction_date)) + self.assertEqual( + getdate(sales_order.payment_schedule[0].due_date), getdate(quotation.transaction_date) + ) self.assertEqual(sales_order.payment_schedule[1].payment_amount, 8906.00) self.assertEqual( - sales_order.payment_schedule[1].due_date, getdate(add_days(quotation.transaction_date, 30)) + getdate(sales_order.payment_schedule[1].due_date), + getdate(add_days(quotation.transaction_date, 30)), ) def test_valid_till_before_transaction_date(self): @@ -1073,6 +1076,56 @@ class TestQuotation(IntegrationTestCase): quotation.reload() self.assertEqual(quotation.status, "Open") + @IntegrationTestCase.change_settings( + "Accounts Settings", + {"automatically_fetch_payment_terms": 1}, + ) + def test_make_sales_order_with_payment_terms(self): + from erpnext.selling.doctype.quotation.quotation import make_sales_order + + template = frappe.get_doc( + { + "doctype": "Payment Terms Template", + "template_name": "_Test Payment Terms Template for Quotation", + "terms": [ + { + "doctype": "Payment Terms Template Detail", + "invoice_portion": 50.00, + "credit_days_based_on": "Day(s) after invoice date", + "credit_days": 0, + }, + { + "doctype": "Payment Terms Template Detail", + "invoice_portion": 50.00, + "credit_days_based_on": "Day(s) after invoice date", + "credit_days": 10, + }, + ], + } + ).save() + + quotation = make_quotation(qty=10, rate=1000, do_not_submit=1) + quotation.transaction_date = add_days(nowdate(), -2) + quotation.valid_till = add_days(nowdate(), 10) + quotation.update({"payment_terms_template": template.name, "payment_schedule": []}) + quotation.save() + quotation.submit() + + self.assertEqual(quotation.payment_schedule[0].payment_amount, 5000) + self.assertEqual(quotation.payment_schedule[1].payment_amount, 5000) + self.assertEqual(quotation.payment_schedule[0].due_date, quotation.transaction_date) + self.assertEqual(quotation.payment_schedule[1].due_date, add_days(quotation.transaction_date, 10)) + + sales_order = make_sales_order(quotation.name) + sales_order.transaction_date = nowdate() + sales_order.delivery_date = nowdate() + sales_order.save() + + self.assertEqual(sales_order.payment_schedule[0].due_date, sales_order.transaction_date) + self.assertEqual(sales_order.payment_schedule[1].due_date, add_days(sales_order.transaction_date, 10)) + self.assertEqual(sales_order.payment_schedule[0].payment_amount, 5000) + self.assertEqual(sales_order.payment_schedule[1].payment_amount, 5000) + def enable_calculate_bundle_price(enable=1): selling_settings = frappe.get_doc("Selling Settings") From 4386af1df7fad6d70ef264561092417f4a25d20b Mon Sep 17 00:00:00 2001 From: Nishka Gosalia Date: Tue, 24 Feb 2026 14:35:55 +0530 Subject: [PATCH 76/85] refactor: project module form cleanup (cherry picked from commit 3c9f520e68c113dde9755b38c53e15f32d643ad9) --- erpnext/projects/doctype/project/project.js | 2 +- erpnext/projects/doctype/project/project.json | 66 ++++++++++++------- erpnext/projects/doctype/task/task.json | 40 +++++++---- erpnext/projects/doctype/task/task.py | 2 + .../projects/doctype/timesheet/timesheet.json | 25 ++++--- 5 files changed, 88 insertions(+), 47 deletions(-) diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index 4d4c4ece745..96023492516 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -205,7 +205,7 @@ frappe.ui.form.on("Project", { collect_progress: function (frm) { if (frm.doc.collect_progress && !frm.doc.subject) { - frm.set_value("subject", __("For project {0}, update your status", [frm.doc.name])); + frm.set_value("subject", __("For project - {0}, update your status", [frm.doc.project_name])); } }, }); diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index 7094a5a7226..dca5c94b78d 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -12,29 +12,21 @@ "project_name", "status", "project_type", - "is_active", "percent_complete_method", - "percent_complete", "column_break_5", "project_template", - "expected_start_date", - "expected_end_date", "priority", "department", - "customer_details", - "customer", - "column_break_14", - "sales_order", - "users_section", - "users", - "copied_from", - "section_break0", - "notes", + "is_active", + "percent_complete", "section_break_18", + "expected_start_date", "actual_start_date", "actual_time", "column_break_20", + "expected_end_date", "actual_end_date", + "costing_tab", "project_details", "estimated_costing", "total_costing_amount", @@ -50,7 +42,7 @@ "gross_margin", "column_break_37", "per_gross_margin", - "monitor_progress", + "monitor_progress_tab", "collect_progress", "holiday_list", "frequency", @@ -63,7 +55,18 @@ "weekly_time_to_send", "column_break_45", "subject", - "message" + "message", + "more_info_tab", + "customer_details", + "customer", + "column_break_14", + "sales_order", + "users_section", + "users", + "copied_from", + "section_break0", + "notes", + "connections_tab" ], "fields": [ { @@ -231,7 +234,7 @@ "collapsible": 1, "fieldname": "section_break_18", "fieldtype": "Section Break", - "label": "Start and End Dates" + "label": "Timeline" }, { "fieldname": "actual_start_date", @@ -258,7 +261,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "project_details", "fieldtype": "Section Break", "label": "Costing and Billing", @@ -329,7 +331,6 @@ "options": "Cost Center" }, { - "collapsible": 1, "fieldname": "margin", "fieldtype": "Section Break", "label": "Margin", @@ -357,12 +358,6 @@ "oldfieldtype": "Currency", "read_only": 1 }, - { - "collapsible": 1, - "fieldname": "monitor_progress", - "fieldtype": "Section Break", - "label": "Monitor Progress" - }, { "default": "0", "fieldname": "collect_progress", @@ -455,6 +450,27 @@ "fieldtype": "Data", "label": "Subject", "mandatory_depends_on": "collect_progress" + }, + { + "fieldname": "costing_tab", + "fieldtype": "Tab Break", + "label": "Costing" + }, + { + "fieldname": "monitor_progress_tab", + "fieldtype": "Tab Break", + "label": "Progress" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "connections_tab", + "fieldtype": "Tab Break", + "label": "Connections", + "show_dashboard": 1 } ], "icon": "fa fa-puzzle-piece", @@ -462,7 +478,7 @@ "index_web_pages_for_search": 1, "links": [], "max_attachments": 4, - "modified": "2025-08-21 17:57:58.314809", + "modified": "2026-03-04 11:09:55.253367", "modified_by": "Administrator", "module": "Projects", "name": "Project", diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index 8673455dbfa..9335a196989 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -13,7 +13,6 @@ "type", "color", "is_group", - "is_template", "column_break0", "status", "priority", @@ -21,17 +20,21 @@ "parent_task", "completed_by", "completed_on", + "section_break_dafi", + "is_template", + "column_break_vvfp", + "start", + "duration", "sb_timeline", "exp_start_date", "expected_time", - "start", "column_break_11", "exp_end_date", "progress", - "duration", "is_milestone", "sb_details", "description", + "dependencies_tab", "sb_depends_on", "depends_on", "depends_on_tasks", @@ -44,12 +47,13 @@ "total_costing_amount", "column_break_20", "total_billing_amount", + "more_info_tab", "sb_more_info", + "company", "review_date", "closing_date", "column_break_22", "department", - "company", "lft", "rgt", "old_parent", @@ -78,7 +82,6 @@ "oldfieldname": "project", "oldfieldtype": "Link", "options": "Project", - "remember_last_selected_value": 1, "search_index": 1 }, { @@ -218,7 +221,6 @@ { "fieldname": "sb_depends_on", "fieldtype": "Section Break", - "label": "Dependencies", "oldfieldtype": "Section Break" }, { @@ -298,10 +300,9 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "sb_more_info", "fieldtype": "Section Break", - "label": "More Info" + "label": "Additional Info" }, { "depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"", @@ -334,8 +335,7 @@ "fieldname": "company", "fieldtype": "Link", "label": "Company", - "options": "Company", - "remember_last_selected_value": 1 + "options": "Company" }, { "fieldname": "lft", @@ -398,6 +398,24 @@ "fieldtype": "Data", "hidden": 1, "label": "Template Task" + }, + { + "fieldname": "dependencies_tab", + "fieldtype": "Tab Break", + "label": "Dependencies" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "section_break_dafi", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_vvfp", + "fieldtype": "Column Break" } ], "icon": "fa fa-check", @@ -405,7 +423,7 @@ "is_tree": 1, "links": [], "max_attachments": 5, - "modified": "2026-02-05 09:58:38.052875", + "modified": "2026-03-04 11:47:10.454548", "modified_by": "Administrator", "module": "Projects", "name": "Task", diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index ba06dccb0b9..9b1e3bfcde4 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -138,6 +138,8 @@ class Task(NestedSet): def validate_status(self): if self.is_template and self.status != "Template": self.status = "Template" + if self.status == "Template" and not self.is_template: + self.status = "Open" if self.status != self.get_db_value("status") and self.status == "Completed": for d in self.depends_on: if frappe.db.get_value("Task", d.task, "status") not in ("Completed", "Cancelled"): diff --git a/erpnext/projects/doctype/timesheet/timesheet.json b/erpnext/projects/doctype/timesheet/timesheet.json index 0022ef9193b..bd38d7c6414 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.json +++ b/erpnext/projects/doctype/timesheet/timesheet.json @@ -18,28 +18,29 @@ "column_break_3", "status", "parent_project", - "employee_detail", - "employee", - "employee_name", - "department", - "column_break_9", "user", "start_date", "end_date", + "employee_detail", + "employee", + "department", + "column_break_9", + "employee_name", "section_break_5", "time_logs", "working_hours", "total_hours", + "billing_tab", "billing_details", "total_billable_hours", + "total_billable_amount", + "total_costing_amount", "base_total_billable_amount", - "base_total_billed_amount", "base_total_costing_amount", "column_break_10", "total_billed_hours", - "total_billable_amount", "total_billed_amount", - "total_costing_amount", + "base_total_billed_amount", "per_billed", "section_break_18", "note", @@ -176,7 +177,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "billing_details", "fieldtype": "Section Break", "label": "Billing Details", @@ -304,13 +304,18 @@ "fieldname": "exchange_rate", "fieldtype": "Float", "label": "Exchange Rate" + }, + { + "fieldname": "billing_tab", + "fieldtype": "Tab Break", + "label": "Billing" } ], "icon": "fa fa-clock-o", "idx": 1, "is_submittable": 1, "links": [], - "modified": "2025-12-19 13:48:23.453636", + "modified": "2026-03-04 11:56:51.438298", "modified_by": "Administrator", "module": "Projects", "name": "Timesheet", From f97e0f8c9c220f7146d0b27ffb49dfa9b527b242 Mon Sep 17 00:00:00 2001 From: jacob-salvi Date: Thu, 29 Jan 2026 11:47:57 +0530 Subject: [PATCH 77/85] chore: new accounting icons (cherry picked from commit 728c678cf9b25691c73da1423176b620868b7bbe) --- erpnext/public/icons/desktop_icons/solid/account_setup.svg | 4 ++++ erpnext/public/icons/desktop_icons/subtle/account_setup.svg | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 erpnext/public/icons/desktop_icons/solid/account_setup.svg create mode 100644 erpnext/public/icons/desktop_icons/subtle/account_setup.svg diff --git a/erpnext/public/icons/desktop_icons/solid/account_setup.svg b/erpnext/public/icons/desktop_icons/solid/account_setup.svg new file mode 100644 index 00000000000..e4139c73feb --- /dev/null +++ b/erpnext/public/icons/desktop_icons/solid/account_setup.svg @@ -0,0 +1,4 @@ + + + + diff --git a/erpnext/public/icons/desktop_icons/subtle/account_setup.svg b/erpnext/public/icons/desktop_icons/subtle/account_setup.svg new file mode 100644 index 00000000000..f34a59f4337 --- /dev/null +++ b/erpnext/public/icons/desktop_icons/subtle/account_setup.svg @@ -0,0 +1,4 @@ + + + + From 1938a56164faf3eb7ef3e8eebc1ddb8293c5a06c Mon Sep 17 00:00:00 2001 From: jacob-salvi Date: Thu, 5 Mar 2026 10:14:45 +0530 Subject: [PATCH 78/85] chore: new organisation icon (cherry picked from commit 6f93210b9b543eece9b949b20549ea80b3ab297c) --- erpnext/public/icons/desktop_icons/solid/organaisation.svg | 4 ++++ erpnext/public/icons/desktop_icons/subtle/organaisation.svg | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 erpnext/public/icons/desktop_icons/solid/organaisation.svg create mode 100644 erpnext/public/icons/desktop_icons/subtle/organaisation.svg diff --git a/erpnext/public/icons/desktop_icons/solid/organaisation.svg b/erpnext/public/icons/desktop_icons/solid/organaisation.svg new file mode 100644 index 00000000000..61443b883ab --- /dev/null +++ b/erpnext/public/icons/desktop_icons/solid/organaisation.svg @@ -0,0 +1,4 @@ + + + + diff --git a/erpnext/public/icons/desktop_icons/subtle/organaisation.svg b/erpnext/public/icons/desktop_icons/subtle/organaisation.svg new file mode 100644 index 00000000000..95eeac954a2 --- /dev/null +++ b/erpnext/public/icons/desktop_icons/subtle/organaisation.svg @@ -0,0 +1,4 @@ + + + + From fb17a00fb625be17f9dd4cecb87a51a80b6f307f Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 17 Feb 2026 17:58:44 +0530 Subject: [PATCH 79/85] fix: balance qty for inv dimension (cherry picked from commit a3eafe5b188ee160bc8507d298f987cb1ec4b894) --- .../stock/report/stock_ledger/stock_ledger.py | 153 +++++++++++++++++- erpnext/stock/stock_ledger.py | 3 + 2 files changed, 148 insertions(+), 8 deletions(-) diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 8e37799e8ce..225d9010592 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -27,10 +27,23 @@ def execute(filters=None): items = get_items(filters) sl_entries = get_stock_ledger_entries(filters, items) item_details = get_item_details(items, sl_entries, include_uom) + + inv_dimension_key = [] + inv_dimension_wise_value = get_inv_dimension_wise_value(filters) + if inv_dimension_wise_value: + for key in inv_dimension_wise_value: + value = inv_dimension_wise_value[key] + if isinstance(value, list): + inv_dimension_key.extend(value) + else: + inv_dimension_key.append(value) + if filters.get("batch_no"): opening_row = get_opening_balance_from_batch(filters, columns, sl_entries) + elif inv_dimension_wise_value: + opening_row = get_opening_balance_for_inv_dimension(filters, inv_dimension_wise_value) else: - opening_row = get_opening_balance(filters, columns, sl_entries) + opening_row = get_opening_balance(filters, columns, sl_entries, inv_dimension_wise_value) precision = cint(frappe.db.get_single_value("System Settings", "float_precision")) bundle_details = {} @@ -50,12 +63,16 @@ def execute(filters=None): stock_value = opening_row.get("stock_value") available_serial_nos = {} - inventory_dimension_filters_applied = check_inventory_dimension_filters_applied(filters) batch_balance_dict = frappe._dict({}) if actual_qty and filters.get("batch_no"): batch_balance_dict[filters.batch_no] = [actual_qty, stock_value] + inv_dimension_wise_dict = frappe._dict({}) + set_opening_row_for_inv_dimension( + inv_dimension_wise_dict, filters, inv_dimension_key=inv_dimension_key, opening_row=opening_row + ) + for sle in sl_entries: item_detail = item_details[sle.item_code] @@ -64,7 +81,10 @@ def execute(filters=None): data.extend(get_segregated_bundle_entries(sle, bundle_info, batch_balance_dict, filters)) continue - if filters.get("batch_no") or inventory_dimension_filters_applied: + if inv_dimension_key: + set_balance_value_for_inv_dimesion(inv_dimension_key, inv_dimension_wise_dict, sle) + + if filters.get("batch_no"): actual_qty += flt(sle.actual_qty, precision) stock_value += sle.stock_value_difference if sle.batch_no: @@ -103,6 +123,50 @@ def execute(filters=None): return columns, data +def set_opening_row_for_inv_dimension( + inv_dimension_wise_dict, filters, inv_dimension_key=None, opening_row=None +): + if ( + not inv_dimension_key + or not opening_row + or not filters.get("item_code") + or not filters.get("warehouse") + ): + return + + if len(filters.get("item_code")) > 1 or len(filters.get("warehouse")) > 1: + return + + if inv_dimension_key and opening_row and filters.get("item_code") and filters.get("warehouse"): + new_key = copy.deepcopy(inv_dimension_key) + new_key.extend([filters.item_code[0], filters.warehouse[0]]) + + opening_key = tuple(new_key) + inv_dimension_wise_dict[opening_key] = { + "qty_after_transaction": flt(opening_row.get("qty_after_transaction")), + "dimension_stock_value": flt(opening_row.get("stock_value")), + } + + +def set_balance_value_for_inv_dimesion(inv_dimension_key, inv_dimension_wise_dict, sle): + new_key = copy.deepcopy(inv_dimension_key) + new_key.extend([sle.item_code, sle.warehouse]) + new_key = tuple(new_key) + + if new_key not in inv_dimension_wise_dict: + inv_dimension_wise_dict[new_key] = {"qty_after_transaction": 0, "dimension_stock_value": 0} + + inv_dimesion_value = inv_dimension_wise_dict[new_key] + inv_dimesion_value["qty_after_transaction"] += sle.actual_qty + inv_dimesion_value["dimension_stock_value"] += sle.stock_value_difference + sle.update( + { + "qty_after_transaction": inv_dimesion_value["qty_after_transaction"], + "stock_value": inv_dimesion_value["dimension_stock_value"], + } + ) + + def get_segregated_bundle_entries(sle, bundle_details, batch_balance_dict, filters): segregated_entries = [] qty_before_transaction = sle.qty_after_transaction - sle.actual_qty @@ -605,19 +669,26 @@ def get_opening_balance_from_batch(filters, columns, sl_entries): } -def get_opening_balance(filters, columns, sl_entries): +def get_opening_balance(filters, columns, sl_entries, inv_dimension_wise_value=None): if not (filters.item_code and filters.warehouse and filters.from_date): return from erpnext.stock.stock_ledger import get_previous_sle + project = None + if filters.get("project") and not frappe.get_all( + "Inventory Dimension", filters={"reference_document": "Project"} + ): + project = filters.get("project") + last_entry = get_previous_sle( { "item_code": filters.item_code, "warehouse_condition": get_warehouse_condition(filters.warehouse), "posting_date": filters.from_date, "posting_time": "00:00:00", - } + "project": project, + }, ) # check if any SLEs are actually Opening Stock Reconciliation @@ -689,9 +760,75 @@ def get_item_group_condition(item_group, item_table=None): where ig.lft >= {item_group_details.lft} and ig.rgt <= {item_group_details.rgt} and item.item_group = ig.name)" -def check_inventory_dimension_filters_applied(filters) -> bool: +def get_opening_balance_for_inv_dimension(filters, inv_dimension_wise_value): + if not filters.item_code or not filters.warehouse or not filters.from_date: + return + + if len(filters.get("item_code")) > 1 or len(filters.get("warehouse")) > 1: + return + + sl_doctype = frappe.qb.DocType("Stock Ledger Entry") + + query = ( + frappe.qb.from_(sl_doctype) + .select( + sl_doctype.item_code, + sl_doctype.warehouse, + Sum(sl_doctype.actual_qty).as_("qty_after_transaction"), + Sum(sl_doctype.stock_value_difference).as_("stock_value"), + ) + .where( + (sl_doctype.posting_date < filters.from_date) + & (sl_doctype.docstatus < 2) + & (sl_doctype.is_cancelled == 0) + ) + ) + + if filters.get("item_code"): + if isinstance(filters.item_code, list | tuple): + query = query.where(sl_doctype.item_code.isin(filters.item_code)) + else: + query = query.where(sl_doctype.item_code == filters.item_code) + + if filters.get("warehouse"): + if isinstance(filters.warehouse, list | tuple): + query = query.where(sl_doctype.warehouse.isin(filters.warehouse)) + else: + query = query.where(sl_doctype.warehouse == filters.warehouse) + + for key, value in inv_dimension_wise_value.items(): + if isinstance(value, list | tuple): + query = query.where(sl_doctype[key].isin(value)) + else: + query = query.where(sl_doctype[key] == value) + + opening_data = query.run(as_dict=True) + + if opening_data: + return frappe._dict( + { + "item_code": _("'Opening'"), + "qty_after_transaction": opening_data[0].qty_after_transaction, + "stock_value": opening_data[0].stock_value, + "valuation_rate": flt(opening_data[0].stock_value) + / flt(opening_data[0].qty_after_transaction) + if opening_data[0].qty_after_transaction + else 0, + } + ) + + return frappe._dict({}) + + +def get_inv_dimension_wise_value(filters) -> list: + inv_dimension_key = frappe._dict({}) for dimension in get_inventory_dimensions(): if dimension.fieldname in filters and filters.get(dimension.fieldname): - return True + inv_dimension_key[dimension.fieldname] = filters.get(dimension.fieldname) - return False + if filters.get("project") and not frappe.get_all( + "Inventory Dimension", filters={"reference_document": "Project"} + ): + inv_dimension_key["project"] = filters.get("project") + + return inv_dimension_key diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index d1bad37a9cc..43ac974a88b 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1862,6 +1862,9 @@ def get_stock_ledger_entries( if extra_cond: conditions += f"{extra_cond}" + if previous_sle.get("project"): + conditions += " and project = %(project)s" + # nosemgrep return frappe.db.sql( """ From e89aaca87034f63fb1bc6252c7be212c2917a41b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 25 Feb 2026 14:14:32 +0530 Subject: [PATCH 80/85] feat: organization desktop icon (cherry picked from commit 4e9a2a327f7ba1a00f264a813a51bef469b1c317) --- erpnext/desktop_icon/organization.json | 21 ++++ .../{organaisation.svg => organization.svg} | 1 + .../organization_onboarding.json | 47 ++++++++ .../invite_users/invite_users.json | 20 ++++ .../review_system_settings.json | 21 ++++ .../setup_company/setup_company.json | 21 ++++ .../setup_email_account.json | 20 ++++ .../setup_role_permissions.json | 20 ++++ erpnext/workspace_sidebar/organization.json | 102 ++++++++++++++++++ 9 files changed, 273 insertions(+) create mode 100644 erpnext/desktop_icon/organization.json rename erpnext/public/icons/desktop_icons/solid/{organaisation.svg => organization.svg} (99%) create mode 100644 erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json create mode 100644 erpnext/setup/onboarding_step/invite_users/invite_users.json create mode 100644 erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json create mode 100644 erpnext/setup/onboarding_step/setup_company/setup_company.json create mode 100644 erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json create mode 100644 erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json create mode 100644 erpnext/workspace_sidebar/organization.json diff --git a/erpnext/desktop_icon/organization.json b/erpnext/desktop_icon/organization.json new file mode 100644 index 00000000000..dbc86a5e6e0 --- /dev/null +++ b/erpnext/desktop_icon/organization.json @@ -0,0 +1,21 @@ +{ + "app": "erpnext", + "bg_color": "blue", + "creation": "2026-02-24 17:43:08.379896", + "docstatus": 0, + "doctype": "Desktop Icon", + "hidden": 0, + "icon_type": "Link", + "idx": 0, + "label": "Organization", + "link_to": "Organization", + "link_type": "Workspace Sidebar", + "modified": "2026-02-24 17:59:39.885360", + "modified_by": "Administrator", + "name": "Organization", + "owner": "Administrator", + "parent_icon": "", + "restrict_removal": 0, + "roles": [], + "standard": 1 +} diff --git a/erpnext/public/icons/desktop_icons/solid/organaisation.svg b/erpnext/public/icons/desktop_icons/solid/organization.svg similarity index 99% rename from erpnext/public/icons/desktop_icons/solid/organaisation.svg rename to erpnext/public/icons/desktop_icons/solid/organization.svg index 61443b883ab..9f1763c8050 100644 --- a/erpnext/public/icons/desktop_icons/solid/organaisation.svg +++ b/erpnext/public/icons/desktop_icons/solid/organization.svg @@ -1,3 +1,4 @@ + diff --git a/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json b/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json new file mode 100644 index 00000000000..c34f962ffec --- /dev/null +++ b/erpnext/setup/module_onboarding/organization_onboarding/organization_onboarding.json @@ -0,0 +1,47 @@ +{ + "allow_roles": [ + { + "role": "System Manager" + }, + { + "role": "Sales Manager" + }, + { + "role": "Accounts Manager" + }, + { + "role": "Manufacturing Manager" + }, + { + "role": "Stock Manager" + } + ], + "creation": "2026-02-24 18:03:53.158438", + "docstatus": 0, + "doctype": "Module Onboarding", + "idx": 0, + "is_complete": 0, + "modified": "2026-02-24 18:07:36.808560", + "modified_by": "Administrator", + "module": "Setup", + "name": "Organization Onboarding", + "owner": "Administrator", + "steps": [ + { + "step": "Setup Company" + }, + { + "step": "Invite Users" + }, + { + "step": "Setup Email Account" + }, + { + "step": "Setup Role Permissions" + }, + { + "step": "Review System Settings" + } + ], + "title": "Setup Organization" +} diff --git a/erpnext/setup/onboarding_step/invite_users/invite_users.json b/erpnext/setup/onboarding_step/invite_users/invite_users.json new file mode 100644 index 00000000000..3ee88e4d876 --- /dev/null +++ b/erpnext/setup/onboarding_step/invite_users/invite_users.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Invite Users", + "creation": "2026-02-24 18:04:21.585575", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:04:21.585575", + "modified_by": "Administrator", + "name": "Invite Users", + "owner": "Administrator", + "reference_document": "User", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Invite Users", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json b/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json new file mode 100644 index 00000000000..987aeac7c98 --- /dev/null +++ b/erpnext/setup/onboarding_step/review_system_settings/review_system_settings.json @@ -0,0 +1,21 @@ +{ + "action": "Update Settings", + "action_label": "Review System Settings", + "creation": "2026-02-24 18:06:56.781335", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 1, + "is_skipped": 0, + "modified": "2026-02-24 18:06:56.781335", + "modified_by": "Administrator", + "name": "Review System Settings", + "owner": "Administrator", + "reference_document": "System Settings", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Review System Settings", + "validate_action": 0, + "value_to_validate": "" +} diff --git a/erpnext/setup/onboarding_step/setup_company/setup_company.json b/erpnext/setup/onboarding_step/setup_company/setup_company.json new file mode 100644 index 00000000000..b795c88396d --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_company/setup_company.json @@ -0,0 +1,21 @@ +{ + "action": "Go to Page", + "action_label": "Setup Company", + "creation": "2026-02-20 11:12:50.373049", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 1, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-23 21:10:17.680053", + "modified_by": "Administrator", + "name": "Setup Company", + "owner": "Administrator", + "path": "company", + "reference_document": "Company", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Company", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json b/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json new file mode 100644 index 00000000000..a8b4921a2c5 --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_email_account/setup_email_account.json @@ -0,0 +1,20 @@ +{ + "action": "Create Entry", + "action_label": "Setup Email Account", + "creation": "2026-02-24 18:04:39.983155", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:04:39.983155", + "modified_by": "Administrator", + "name": "Setup Email Account", + "owner": "Administrator", + "reference_document": "Email Account", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Email Account", + "validate_action": 1 +} diff --git a/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json b/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json new file mode 100644 index 00000000000..e7755a8ade0 --- /dev/null +++ b/erpnext/setup/onboarding_step/setup_role_permissions/setup_role_permissions.json @@ -0,0 +1,20 @@ +{ + "action": "Go to Page", + "action_label": "Setup Role Permissions", + "creation": "2026-02-24 18:05:10.485778", + "docstatus": 0, + "doctype": "Onboarding Step", + "idx": 0, + "is_complete": 0, + "is_single": 0, + "is_skipped": 0, + "modified": "2026-02-24 18:05:10.485778", + "modified_by": "Administrator", + "name": "Setup Role Permissions", + "owner": "Administrator", + "path": "permission-manager", + "show_form_tour": 0, + "show_full_form": 0, + "title": "Setup Role Permissions", + "validate_action": 1 +} diff --git a/erpnext/workspace_sidebar/organization.json b/erpnext/workspace_sidebar/organization.json new file mode 100644 index 00000000000..8ea0a44faca --- /dev/null +++ b/erpnext/workspace_sidebar/organization.json @@ -0,0 +1,102 @@ +{ + "app": "erpnext", + "creation": "2026-02-24 17:39:43.793115", + "docstatus": 0, + "doctype": "Workspace Sidebar", + "header_icon": "organization", + "idx": 1, + "items": [ + { + "child": 0, + "collapsible": 1, + "icon": "organization", + "indent": 0, + "keep_closed": 0, + "label": "Company", + "link_to": "Company", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "book-text", + "indent": 0, + "keep_closed": 0, + "label": "Letter Head", + "link_to": "Letter Head", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "file-user", + "indent": 0, + "keep_closed": 0, + "label": "Department", + "link_to": "Department", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "book-user", + "indent": 0, + "keep_closed": 0, + "label": "Branch", + "link_to": "Branch", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "users", + "indent": 0, + "keep_closed": 0, + "label": "User", + "link_to": "User", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "user-round-check", + "indent": 0, + "keep_closed": 0, + "label": "Role Permissions", + "link_to": "permission-manager", + "link_type": "Page", + "show_arrow": 0, + "type": "Link" + }, + { + "child": 0, + "collapsible": 1, + "icon": "mail", + "indent": 0, + "keep_closed": 0, + "label": "Email Account", + "link_to": "Email Account", + "link_type": "DocType", + "show_arrow": 0, + "type": "Link" + } + ], + "modified": "2026-02-24 18:08:00.796746", + "modified_by": "Administrator", + "module": "Setup", + "module_onboarding": "Organization Onboarding", + "name": "Organization", + "owner": "Administrator", + "standard": 1, + "title": "Organization" +} From 83f2fadbcffc4461fc6648a150883bc88e70f626 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 18:40:54 +0530 Subject: [PATCH 81/85] fix(help): escape query (backport #53192) (#53195) fix(help): escape query (#53192) (cherry picked from commit 702adda00046fc0a1f6501bba9c2d1d03438798a) Signed-off-by: Akhil Narang Co-authored-by: Akhil Narang --- erpnext/templates/pages/help.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/templates/pages/help.html b/erpnext/templates/pages/help.html index 1cfe358efd6..726d5e1b881 100644 --- a/erpnext/templates/pages/help.html +++ b/erpnext/templates/pages/help.html @@ -8,7 +8,7 @@