From a66ce02520f421f13c350fc5fb8252c5f450e08e Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 25 Nov 2025 15:02:30 +0000 Subject: [PATCH 01/31] chore(release): Bumped to Version 15.90.0 # [15.90.0](https://github.com/frappe/erpnext/compare/v15.89.2...v15.90.0) (2025-11-25) ### Bug Fixes * add filter company and status to job card employee ([015f946](https://github.com/frappe/erpnext/commit/015f946a1471e1c062ae27d1d30c7f23e6053950)) * add missing translate function ([475eada](https://github.com/frappe/erpnext/commit/475eada727780bc7d3fcab7a4bc7ca3ffe0e1ffa)) * add return status for purchase receipt ([8ccb9a5](https://github.com/frappe/erpnext/commit/8ccb9a5ad2049bbc5effb98095e6cbbd41b14a75)) * add validation for FG Items as per BOM qty (backport [#50579](https://github.com/frappe/erpnext/issues/50579)) ([#50715](https://github.com/frappe/erpnext/issues/50715)) ([1995291](https://github.com/frappe/erpnext/commit/1995291194078c725c8de645e38b76b905bb9ebc)) * apply precision for scrap items amount ([5b60fbb](https://github.com/frappe/erpnext/commit/5b60fbbd309c7b4b6511439d6d6656f6a08870f5)) * **customer:** link contact and addresses if created from lead/opportunity/prospect ([b1d40de](https://github.com/frappe/erpnext/commit/b1d40de87eaeb8e579bab893db619c045bcfaa80)) * ignore reserved batches from total available batches ([673b893](https://github.com/frappe/erpnext/commit/673b893942ca789d7ea554120b75c2f444b28780)) * incorrect query filter when selecting primary customer adr ([#50727](https://github.com/frappe/erpnext/issues/50727)) ([e8e09cf](https://github.com/frappe/erpnext/commit/e8e09cf8eafe1205585531b28b7f32a27dc1899c)) * **ledger-summary-report:** show party group and territory ([56f03ae](https://github.com/frappe/erpnext/commit/56f03aee027486897a4ed4e327473bf957895112)) * **manufacturing:** apply precision for bom amount and rm_cost_per_qty ([2678694](https://github.com/frappe/erpnext/commit/2678694c5f2185f3a4f55394e9f491b3b86de0ad)) * pick list status doesn't update when DN created from it and PL was created from SO ([2809c46](https://github.com/frappe/erpnext/commit/2809c46a6e175f095fe98e9445b25eb3c46e1bfd)) * prevent pi status from changing on asset repair ([3f2081b](https://github.com/frappe/erpnext/commit/3f2081b440f1a85160911232a20c92272f18d687)) * pricing rule was ignoring time validity ([f62e5e6](https://github.com/frappe/erpnext/commit/f62e5e69b855edf5da59f19ac13053a95b10ed70)) * **product bundle:** fields reset if doc is new ([4ba4da0](https://github.com/frappe/erpnext/commit/4ba4da090dace52f0f1d49a30cad9dc0b36c625c)) * **purchase_receipt:** add internal_and_external_links field to show purchase invoice connection count ([89fcdbf](https://github.com/frappe/erpnext/commit/89fcdbf56b5496d53ab432e1283df5992df6ec88)) * redundant message on bom save ([5b16740](https://github.com/frappe/erpnext/commit/5b1674018b9e58d60fe657b0494c4901dec7e01c)) * remove disabled warehouse in get_warehouses_based_on_account ([aa94c91](https://github.com/frappe/erpnext/commit/aa94c91c12689e04d56c24e7a55d567f65609951)) * serial batch selector shown only once ([25cd230](https://github.com/frappe/erpnext/commit/25cd230471060d2672ea754cc3ec933d8eceeb1c)) * show current company warehouse only in get material from bom MR ([1d6e3e4](https://github.com/frappe/erpnext/commit/1d6e3e4e7dd39d9fad07eca6b205fbe88b358e78)) * tests ([45bc218](https://github.com/frappe/erpnext/commit/45bc218acbc63214f985131d70263a08b55bbc87)) * unhide zero val checkbox ([a247337](https://github.com/frappe/erpnext/commit/a24733791d3070a89d06c29a8e39751623e5fe4b)) * unknown column error ([2e9a0cb](https://github.com/frappe/erpnext/commit/2e9a0cb01c22fe682cade44ada4d4ca2cf6981b2)) * use current_tax_amount value for base_total_taxes_and_charges ([7ed3c6d](https://github.com/frappe/erpnext/commit/7ed3c6d18a51e8151d571f0168447b5e594f41a2)) * validate sabb autocreation when disabled ([85c0c16](https://github.com/frappe/erpnext/commit/85c0c1696430d75af4f6d2c9cd527e96a699335c)) * validation for SABB deletion ([0bc98b6](https://github.com/frappe/erpnext/commit/0bc98b609fcf70a8037038671a8ebd357caffada)) ### Features * **accounting-dimension:** add dynamic triggers for custom accounting dimensions ([#50621](https://github.com/frappe/erpnext/issues/50621)) ([2b7d586](https://github.com/frappe/erpnext/commit/2b7d58602d3a85edab89e63d450494c9463b5040)) * modify accounting dimension as multiselect field ([6b6e017](https://github.com/frappe/erpnext/commit/6b6e017e36e4367afe41204c2c3c4754719325f5)) * **reports:** preserve accounting dimension filters while navigating between reports ([02a1f81](https://github.com/frappe/erpnext/commit/02a1f815da9f8df1ab21142087fe15a7f741446e)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index ec16de1a135..f668df9ba00 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.89.2" +__version__ = "15.90.0" def get_default_company(user=None): From 38c44533b3da27e91d34a1d43cf9ab794660cfba Mon Sep 17 00:00:00 2001 From: ljain112 Date: Wed, 26 Nov 2025 12:51:14 +0530 Subject: [PATCH 02/31] fix: enhance SalesOrderController setup method to call super.setup (cherry picked from commit 563c2998ca1bee4d342642117a35dd3f068adb42) (cherry picked from commit 7805ccf176230f9dedfea59da354afefb226665d) --- erpnext/selling/doctype/sales_order/sales_order.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index ce20966a25e..18b4bab4188 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -574,8 +574,9 @@ frappe.ui.form.on("Sales Order Item", { }); erpnext.selling.SalesOrderController = class SalesOrderController extends erpnext.selling.SellingController { - setup() { + setup(doc) { this.setup_accounting_dimension_triggers(); + super.setup(doc); } onload(doc, dt, dn) { super.onload(doc, dt, dn); From 2bf12a66838a07d35eba1d84c241796aadc63129 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Wed, 26 Nov 2025 09:12:23 +0000 Subject: [PATCH 03/31] chore(release): Bumped to Version 15.90.1 ## [15.90.1](https://github.com/frappe/erpnext/compare/v15.90.0...v15.90.1) (2025-11-26) ### Bug Fixes * enhance SalesOrderController setup method to call super.setup ([38c4453](https://github.com/frappe/erpnext/commit/38c44533b3da27e91d34a1d43cf9ab794660cfba)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index f668df9ba00..a23b8c0be8f 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.90.0" +__version__ = "15.90.1" def get_default_company(user=None): From dab17c194c824b57b7e260ab3844a6dc8f697d2e Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 2 Dec 2025 16:31:39 +0000 Subject: [PATCH 04/31] chore(release): Bumped to Version 15.91.0 # [15.91.0](https://github.com/frappe/erpnext/compare/v15.90.1...v15.91.0) (2025-12-02) ### Bug Fixes * add validation for cancelled reposting entries ([085d685](https://github.com/frappe/erpnext/commit/085d685488110c4f03e47c98e6be7fae6f44f664)) * add validation for company linked address fields ([0aed8c0](https://github.com/frappe/erpnext/commit/0aed8c04c685b05cb349d6522f0999b738c95503)) * **barcode_scanner:** set serial and batch before item to prevent FIFO override ([7d7f929](https://github.com/frappe/erpnext/commit/7d7f929cfc69687fe5c414f80aa233d5fd0dd9b0)) * conflicts ([199e25e](https://github.com/frappe/erpnext/commit/199e25ec063aecfbd95ec348b8c22834c7869720)) * correct field name for subcontracted items in material request ([4b49080](https://github.com/frappe/erpnext/commit/4b49080bc4eb1977f6d916e85d9d12878568fce2)) * do not override source document in serial no ([69c6b2f](https://github.com/frappe/erpnext/commit/69c6b2f4635c13ea09551e8305293b4cffca32db)) * **email campaign:** send emails using bcc ([b660b90](https://github.com/frappe/erpnext/commit/b660b90adc4ea62d05cf499c784c073cc143ccbd)) * **Employee:** add/delete user permission (backport [#47016](https://github.com/frappe/erpnext/issues/47016)) ([#50761](https://github.com/frappe/erpnext/issues/50761)) ([821f3f5](https://github.com/frappe/erpnext/commit/821f3f58845db91a574d36d8d0c43b0b8c12f962)) * enhance SalesOrderController setup method to call super.setup ([7805ccf](https://github.com/frappe/erpnext/commit/7805ccf176230f9dedfea59da354afefb226665d)) * exclude is_group records ([a444325](https://github.com/frappe/erpnext/commit/a444325bd167abbc99a62b30e367a66f9463b970)) * include accounting dimensions in stock entries created during asset repair. ([26872c3](https://github.com/frappe/erpnext/commit/26872c3c25c58174413468e9ec114ad9562de6bf)) * incorrect positional param for `get_field_precision` util (backport [#50764](https://github.com/frappe/erpnext/issues/50764)) ([#50795](https://github.com/frappe/erpnext/issues/50795)) ([ff1ca9d](https://github.com/frappe/erpnext/commit/ff1ca9d4804680eb324deaa3f55c66b2e0ebb576)) * item price not considering based on valid_upto ([dfda8e6](https://github.com/frappe/erpnext/commit/dfda8e6241aaebc9ce48f0a81a82387976a67a37)) * **Job Card:** avoid Type Error when completed_qty is None ([#50447](https://github.com/frappe/erpnext/issues/50447)) ([cac9eed](https://github.com/frappe/erpnext/commit/cac9eed306023ab6342b176ad6502e509a70d682)) * label for warehouse based on material request type ([8ee7c47](https://github.com/frappe/erpnext/commit/8ee7c47fdf7528469e23c0aaab07160c1aca35da)) * mandatory depends on for the rejected inventory dimension field ([8c62080](https://github.com/frappe/erpnext/commit/8c620802f0478b5aa2e435a3d95ab305c3c50938)) * negative batch in subcontracting receipt ([5def006](https://github.com/frappe/erpnext/commit/5def006033aa8ce1c1365fda85fd41c0b07d6de4)) * **payment reconciliation:** added a hint that posting date can be changed on exchange gain/loss reconcile dialog ([0e03607](https://github.com/frappe/erpnext/commit/0e0360781e4a317a80237408efc19d936ddd4c76)) * **payment-recon:** add validation for outstanding of dr_cr ([70feb50](https://github.com/frappe/erpnext/commit/70feb500f6b6731b2360332a0384d4ef4dc54f69)) * **pos:** add negative stock validation for product bundle ([46a49a1](https://github.com/frappe/erpnext/commit/46a49a134d0ec89138702cd3df7b0bf412046ca4)) * remove unused translation files (<100 lines) ([7f7c5f2](https://github.com/frappe/erpnext/commit/7f7c5f2381ea10f55dc7f0b3039071cced98cccd)) * resolve conflict ([bd795f5](https://github.com/frappe/erpnext/commit/bd795f5546765263712b04cd3b06255cb7d1c7ec)) * **stock entry:** use fg item expense account for direct manufacturing entry ([4ca5e9e](https://github.com/frappe/erpnext/commit/4ca5e9eef8c7dbe9b99feb25a9dfea08efb26367)) * two primary buttons ([1d2fccf](https://github.com/frappe/erpnext/commit/1d2fccfc0b6e0212b2838a308f75aa0a445e3d36)) * use asset in against_voucher while posting gl entries for capitalized asset repairs ([80642ed](https://github.com/frappe/erpnext/commit/80642edf4f5021ae7a56fef08ff9b72e0e18ca15)) * use posting_date instead of bill_date from purchase invoice ([c12a560](https://github.com/frappe/erpnext/commit/c12a560c63d2b5fc395aaf9ff67cf62e3c775214)) ### Features * add stock uom read only field to stock reconciliation item doctype ([5711225](https://github.com/frappe/erpnext/commit/57112258e6a571bbd7fdb795af87d7bf60613f85)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index a23b8c0be8f..57b8726af16 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.90.1" +__version__ = "15.91.0" def get_default_company(user=None): From a2b676b340e0bdba79ecc6a4afbddb02a6ae3b16 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 9 Dec 2025 17:00:25 +0000 Subject: [PATCH 05/31] chore(release): Bumped to Version 15.91.1 ## [15.91.1](https://github.com/frappe/erpnext/compare/v15.91.0...v15.91.1) (2025-12-09) ### Bug Fixes * add return status for delivery note ([ebb6296](https://github.com/frappe/erpnext/commit/ebb62966d3ae298f5c4cd620f64991db52ac85ce)) * Adjust asset purchase amounts based on docstatus ([a31fb2a](https://github.com/frappe/erpnext/commit/a31fb2ac6cd94c1b2bbab920747dc4cfb0ca01c0)) * change is_return value in filter from Yes to 1 ([52e26b6](https://github.com/frappe/erpnext/commit/52e26b6da8b6be95ce1a73d35a536159b70805db)) * conflicts ([bd00a48](https://github.com/frappe/erpnext/commit/bd00a484ea04c5b834e7fdd853e3eeae292d5bb6)) * conflicts ([1427b4a](https://github.com/frappe/erpnext/commit/1427b4ac3f6c49feebda25727d8ed8e3c60d3bf2)) * cost center not reset ([8a3148e](https://github.com/frappe/erpnext/commit/8a3148eee63eb55881ccfdbc6a7e0da4142f057f)) * ensure payment request button only shows for submitted invoices ([b4053ee](https://github.com/frappe/erpnext/commit/b4053ee0d81002bf602b11566289ee9080de2d3b)) * fg qty uom in manufacture entry ([70d5726](https://github.com/frappe/erpnext/commit/70d57260d666631cfd4b49bcd7e5a205e19fce6e)) * handle duplicate description in item-wise report ([1a278e7](https://github.com/frappe/erpnext/commit/1a278e7ca096304369c535cc97401af012e9fdda)) * include return invoice discount in discount validation ([bf1c606](https://github.com/frappe/erpnext/commit/bf1c60661010ce3358669f09d4ff4540cde0e597)) * incorrect condition ([d9e9f35](https://github.com/frappe/erpnext/commit/d9e9f35230cb458f359586cc37308dca3e70fa01)) * inward same serial / batches in disassembly which were used ([cfbd716](https://github.com/frappe/erpnext/commit/cfbd71693ba1c2f969a7e7b7d404eff0fa25b705)) * LCV is not changing the valuation of the repacked item ([8b22d9d](https://github.com/frappe/erpnext/commit/8b22d9d95ecaf2a9ce96316638a856472d1bc359)) * missing attribute error when restoring asset ([bde209b](https://github.com/frappe/erpnext/commit/bde209b077242a6de1bae3c19961ab099b8c7c4f)) * performance of the reposting ([8d734df](https://github.com/frappe/erpnext/commit/8d734df63b601fae621cdf2028d9eb10825f920b)) * **picklist:** calculate picked qty excluding the delivered qty ([3785ffe](https://github.com/frappe/erpnext/commit/3785ffe5c9ca85d4ca7074069019a24771e19560)) * quality inspection showing Not Saved ([abe599a](https://github.com/frappe/erpnext/commit/abe599a49de694fced1f849b8d40d55d47388882)) * remove comment ([da88196](https://github.com/frappe/erpnext/commit/da88196a891b2ceb7910918afabaf04d7c1fde36)) * remove set_only_once from is_fixed_asset ([fd6e42e](https://github.com/frappe/erpnext/commit/fd6e42e15e529c53f10390d02d6dc19bddf0148d)) * **sales invoice:** 100% additional discount gl issue with discount accounting ([bd6210a](https://github.com/frappe/erpnext/commit/bd6210a212cce72ad43e81f52a98eb21f0cd8e89)) * tds for customer and supplier in Journal Entry (backport [#49963](https://github.com/frappe/erpnext/issues/49963)) ([#50985](https://github.com/frappe/erpnext/issues/50985)) ([f2c556a](https://github.com/frappe/erpnext/commit/f2c556a6cc26138ebed7ac2c70bca492c4700285)) * untranslated string in job card ([b2f6d07](https://github.com/frappe/erpnext/commit/b2f6d07c251475257f0b11b6cb346859fa9dec80)) * variant items not fetched while making BOM for Variant Item ([176ce0d](https://github.com/frappe/erpnext/commit/176ce0d4d67459ab1305c20682fa04f2b2d3218c)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 57b8726af16..78a148846bf 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.91.0" +__version__ = "15.91.1" def get_default_company(user=None): From 1e0532f3877b8a27763511731b73f6f77c811298 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 11 Dec 2025 10:12:42 +0530 Subject: [PATCH 06/31] fix: Serial/Batches not fetching when creating Material Transfer from Purchase Receipt (cherry picked from commit d16c50486a7191ce6fa128fada3c4e87d4649404) # Conflicts: # erpnext/stock/doctype/purchase_receipt/purchase_receipt.py (cherry picked from commit f3c70a66b5daa8eab56cf169b896d771e67a606c) --- .../purchase_receipt/purchase_receipt.py | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 53aad87e2da..47e89269b35 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -19,6 +19,15 @@ from erpnext.buying.utils import check_on_hold_or_closed_status from erpnext.controllers.accounts_controller import merge_taxes from erpnext.controllers.buying_controller import BuyingController from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_transaction +<<<<<<< HEAD +======= +from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import StockReservation +from erpnext.stock.serial_batch_bundle import ( + SerialBatchCreation, + get_batches_from_bundle, + get_serial_nos_from_bundle, +) +>>>>>>> d16c50486a (fix: Serial/Batches not fetching when creating Material Transfer from Purchase Receipt) form_grid_templates = {"items": "templates/form_grid/item_grid.html"} @@ -1411,6 +1420,35 @@ def make_stock_entry(source_name, target_doc=None): target.purpose = "Material Transfer" target.set_missing_values() + def update_item(source_doc, target_doc, source_parent): + if source_doc.serial_and_batch_bundle: + serial_nos = get_serial_nos_from_bundle(source_doc.serial_and_batch_bundle) + if serial_nos: + serial_nos = "\n".join(serial_nos) + + batches = get_batches_from_bundle(source_doc.serial_and_batch_bundle) + if batches: + if len(batches) == 1: + target_doc.use_serial_batch_fields = 1 + target_doc.batch_no = next(iter(batches)) + elif not serial_nos: + cls_obj = SerialBatchCreation( + { + "type_of_transaction": "Outward", + "serial_and_batch_bundle": source_doc.serial_and_batch_bundle, + "item_code": source_doc.item_code, + "warehouse": source_doc.warehouse, + } + ) + + cls_obj.duplicate_package() + + target_doc.serial_and_batch_bundle = cls_obj.serial_and_batch_bundle + + if serial_nos: + target_doc.use_serial_batch_fields = 1 + target_doc.serial_no = serial_nos + doclist = get_mapped_doc( "Purchase Receipt", source_name, @@ -1425,6 +1463,7 @@ def make_stock_entry(source_name, target_doc=None): "parent": "reference_purchase_receipt", "batch_no": "batch_no", }, + "postprocess": update_item, }, }, target_doc, From 580e825ec2941f4526ce7b36df1ac05f8822362c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 11 Dec 2025 11:36:31 +0530 Subject: [PATCH 07/31] chore: fix conflicts (cherry picked from commit c8565c47a2c2fce59baa6844f73b8205290b2c85) --- erpnext/stock/doctype/purchase_receipt/purchase_receipt.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 47e89269b35..7a4101e9dfb 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -19,15 +19,11 @@ from erpnext.buying.utils import check_on_hold_or_closed_status from erpnext.controllers.accounts_controller import merge_taxes from erpnext.controllers.buying_controller import BuyingController from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_transaction -<<<<<<< HEAD -======= -from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import StockReservation from erpnext.stock.serial_batch_bundle import ( SerialBatchCreation, get_batches_from_bundle, get_serial_nos_from_bundle, ) ->>>>>>> d16c50486a (fix: Serial/Batches not fetching when creating Material Transfer from Purchase Receipt) form_grid_templates = {"items": "templates/form_grid/item_grid.html"} From 23c82d410b21fe76e57d22f12934d0a99de78bf8 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 11 Dec 2025 13:43:58 +0530 Subject: [PATCH 08/31] fix: putaway rule not applying on serial nos (cherry picked from commit 6bb0bdcdcac7bf0d65a7640ab3c2aff650312957) (cherry picked from commit df820aece678ab6d18a54eb491a72066c6002d5d) --- .../doctype/putaway_rule/putaway_rule.py | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/putaway_rule/putaway_rule.py b/erpnext/stock/doctype/putaway_rule/putaway_rule.py index 53af3e12896..a335d19afa5 100644 --- a/erpnext/stock/doctype/putaway_rule/putaway_rule.py +++ b/erpnext/stock/doctype/putaway_rule/putaway_rule.py @@ -11,6 +11,7 @@ from frappe import _ from frappe.model.document import Document from frappe.utils import cint, cstr, floor, flt, nowdate +from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos from erpnext.stock.utils import get_stock_balance @@ -119,13 +120,19 @@ def apply_putaway_rule(doctype, items, company, sync=None, purpose=None): item = frappe._dict(item) source_warehouse = item.get("s_warehouse") + serial_nos = [] + if item.get("serial_no"): + serial_nos = get_serial_nos(item.get("serial_no")) + item.conversion_factor = flt(item.conversion_factor) or 1.0 pending_qty, item_code = flt(item.qty), item.item_code pending_stock_qty = flt(item.transfer_qty) if doctype == "Stock Entry" else flt(item.stock_qty) uom_must_be_whole_number = frappe.db.get_value("UOM", item.uom, "must_be_whole_number") if not pending_qty or not item_code: - updated_table = add_row(item, pending_qty, source_warehouse or item.warehouse, updated_table) + updated_table = add_row( + item, pending_qty, source_warehouse or item.warehouse, updated_table, serial_nos=serial_nos + ) continue at_capacity, rules = get_ordered_putaway_rules(item_code, company, source_warehouse=source_warehouse) @@ -141,7 +148,7 @@ def apply_putaway_rule(doctype, items, company, sync=None, purpose=None): # rules available, but no free space items_not_accomodated.append([item_code, pending_qty]) else: - updated_table = add_row(item, pending_qty, warehouse, updated_table) + updated_table = add_row(item, pending_qty, warehouse, updated_table, serial_nos=serial_nos) continue # maintain item/item-warehouse wise rules, to handle if item is entered twice @@ -167,7 +174,9 @@ def apply_putaway_rule(doctype, items, company, sync=None, purpose=None): if not qty_to_allocate: break - updated_table = add_row(item, qty_to_allocate, rule.warehouse, updated_table, rule.name) + updated_table = add_row( + item, qty_to_allocate, rule.warehouse, updated_table, rule.name, serial_nos=serial_nos + ) pending_stock_qty -= stock_qty_to_allocate pending_qty -= qty_to_allocate @@ -265,7 +274,7 @@ def get_ordered_putaway_rules(item_code, company, source_warehouse=None): return False, vacant_rules -def add_row(item, to_allocate, warehouse, updated_table, rule=None): +def add_row(item, to_allocate, warehouse, updated_table, rule=None, serial_nos=None): new_updated_table_row = copy.deepcopy(item) new_updated_table_row.idx = 1 if not updated_table else cint(updated_table[-1].idx) + 1 new_updated_table_row.name = None @@ -283,6 +292,9 @@ def add_row(item, to_allocate, warehouse, updated_table, rule=None): if rule: new_updated_table_row.putaway_rule = rule + if serial_nos: + new_updated_table_row.serial_no = get_serial_nos_to_allocate(serial_nos, to_allocate) + new_updated_table_row.serial_and_batch_bundle = "" updated_table.append(new_updated_table_row) @@ -311,3 +323,12 @@ def show_unassigned_items_message(items_not_accomodated): """.format(_("Item"), _("Unassigned Qty"), formatted_item_rows) frappe.msgprint(msg, title=_("Insufficient Capacity"), is_minimizable=True, wide=True) + + +def get_serial_nos_to_allocate(serial_nos, to_allocate): + if serial_nos: + allocated_serial_nos = serial_nos[0 : cint(to_allocate)] + serial_nos[:] = serial_nos[cint(to_allocate) :] # pop out allocated serial nos and modify list + return "\n".join(allocated_serial_nos) if allocated_serial_nos else "" + else: + return "" From ca21f16db2b81ea8dd2f7216f25e5a0813e7a1ff Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 11 Dec 2025 10:48:40 +0000 Subject: [PATCH 09/31] chore(release): Bumped to Version 15.91.2 ## [15.91.2](https://github.com/frappe/erpnext/compare/v15.91.1...v15.91.2) (2025-12-11) ### Bug Fixes * putaway rule not applying on serial nos ([23c82d4](https://github.com/frappe/erpnext/commit/23c82d410b21fe76e57d22f12934d0a99de78bf8)) * Serial/Batches not fetching when creating Material Transfer from Purchase Receipt ([1e0532f](https://github.com/frappe/erpnext/commit/1e0532f3877b8a27763511731b73f6f77c811298)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 78a148846bf..59831f5af29 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.91.1" +__version__ = "15.91.2" def get_default_company(user=None): From 5d01cad1d5d08c97a7c9692c87a3a1e45a0ad30c Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 11 Dec 2025 12:57:08 +0530 Subject: [PATCH 10/31] fix(accounts): handle drop ship in company linked address validation (cherry picked from commit 2ec119e561cdfdb9f0d1f987348fa62171697992) (cherry picked from commit b340d7d4f42cff1e5ae1bf27bf401f9455596196) --- erpnext/controllers/accounts_controller.py | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index a087236529c..1f6b6ca17c9 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -312,13 +312,30 @@ class AccountsController(TransactionBase): def validate_company_linked_addresses(self): address_fields = [] - if self.doctype in ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): + sales_doctypes = ("Quotation", "Sales Order", "Delivery Note", "Sales Invoice") + purchase_doctypes = ("Purchase Order", "Purchase Receipt", "Purchase Invoice", "Supplier Quotation") + + if self.doctype in sales_doctypes: address_fields = ["dispatch_address_name", "company_address"] - elif self.doctype in ("Purchase Order", "Purchase Receipt", "Purchase Invoice", "Supplier Quotation"): + elif self.doctype in purchase_doctypes: address_fields = ["billing_address", "shipping_address"] + if not address_fields: + return + + # Determine if drop ship applies + is_drop_ship = self.doctype in { + "Purchase Order", + "Sales Order", + "Sales Invoice", + } and self.is_drop_ship(self.items) + for field in address_fields: address = self.get(field) + + if (field in ["dispatch_address_name", "shipping_address"]) and is_drop_ship: + continue + if address and not frappe.db.exists( "Dynamic Link", { @@ -329,11 +346,15 @@ class AccountsController(TransactionBase): }, ): frappe.throw( - _("{0} does not belong to the {1}.").format( + _("{0} does not belong to the Company {1}.").format( _(self.meta.get_label(field)), bold(self.company) ) ) + @staticmethod + def is_drop_ship(items): + return any(item.delivered_by_supplier for item in items) + def set_default_letter_head(self): if hasattr(self, "letter_head") and not self.letter_head: self.letter_head = frappe.db.get_value("Company", self.company, "default_letter_head") From b46d93c709500490229f94a85b81a44d3fc50cb7 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Thu, 11 Dec 2025 13:01:53 +0530 Subject: [PATCH 11/31] test(accounts): add validation test for dispatch address with drop ship enabled (cherry picked from commit f6a96e5563340236c5672e9b11c38c105f410630) (cherry picked from commit 2263f9a4777c641fc3f17813b01063caf6aacd23) --- .../controllers/tests/test_accounts_controller.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/erpnext/controllers/tests/test_accounts_controller.py b/erpnext/controllers/tests/test_accounts_controller.py index dde95899b7f..a120da6f852 100644 --- a/erpnext/controllers/tests/test_accounts_controller.py +++ b/erpnext/controllers/tests/test_accounts_controller.py @@ -2434,6 +2434,7 @@ class TestAccountsController(FrappeTestCase): def test_company_linked_address(self): from erpnext.crm.doctype.prospect.test_prospect import make_address + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order company_address = make_address( address_title="Company", address_type="Shipping", address_line1="100", city="Mumbai" @@ -2462,3 +2463,16 @@ class TestAccountsController(FrappeTestCase): po.billing_address = company_address.name po.reload() po.save() + + si = make_sales_order(do_not_save=1, do_not_submit=1) + si.dispatch_address_name = supplier_billing.name + self.assertRaises(frappe.ValidationError, si.save) + si.items[0].delivered_by_supplier = 1 + si.items[0].supplier = "_Test Supplier" + si.save() + + po = create_purchase_order(do_not_save=True) + po.shipping_address = customer_shipping.name + self.assertRaises(frappe.ValidationError, po.save) + po.items[0].delivered_by_supplier = 1 + po.save() From 3a74968cede16e87864731d437c48ba68365ca8f Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Fri, 12 Dec 2025 08:57:31 +0000 Subject: [PATCH 12/31] chore(release): Bumped to Version 15.91.3 ## [15.91.3](https://github.com/frappe/erpnext/compare/v15.91.2...v15.91.3) (2025-12-12) ### Bug Fixes * **accounts:** handle drop ship in company linked address validation ([5d01cad](https://github.com/frappe/erpnext/commit/5d01cad1d5d08c97a7c9692c87a3a1e45a0ad30c)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 59831f5af29..828d00f3c19 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.91.2" +__version__ = "15.91.3" def get_default_company(user=None): From 66b2b89bcdf67d215aa304e5fb381d410ecbc9f3 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 16 Dec 2025 15:33:15 +0000 Subject: [PATCH 13/31] chore(release): Bumped to Version 15.92.0 # [15.92.0](https://github.com/frappe/erpnext/compare/v15.91.3...v15.92.0) (2025-12-16) ### Bug Fixes * **accounts:** handle drop ship in company linked address validation ([b340d7d](https://github.com/frappe/erpnext/commit/b340d7d4f42cff1e5ae1bf27bf401f9455596196)) * add link filters for item group in quickentry ([981c9c7](https://github.com/frappe/erpnext/commit/981c9c76c1b8b3916eea1f3809290b5958a0a3b5)) * add missing query key in 'Reports To' field filter ([e1dc80b](https://github.com/frappe/erpnext/commit/e1dc80b6d859efc955f88083d0c7accdd3e0b38c)) * add validation for transferred qty and handle MR transfer status for in-transit entry. (backport [#50683](https://github.com/frappe/erpnext/issues/50683)) ([#51134](https://github.com/frappe/erpnext/issues/51134)) ([6a6398a](https://github.com/frappe/erpnext/commit/6a6398a3928b83fa0da6e85fecd387e9f24bf86e)) * **currency exchange settings:** added backward compatibility for frankfurter api ([8d32ba9](https://github.com/frappe/erpnext/commit/8d32ba9a2eeadb855df9d77cb028b0ef304763b3)) * delayed tasks summary chart color ([325fc61](https://github.com/frappe/erpnext/commit/325fc619dc2e03cb68d0f77534c5b31eddab2d48)) * ensure fresh `grand_total_diff` is used for each calculation ([2d198e6](https://github.com/frappe/erpnext/commit/2d198e698abeaf79352c106f62c6b53d4bdc02c4)) * ensure type on method parameter ([16c8b74](https://github.com/frappe/erpnext/commit/16c8b74d52fd48e99f063ee4e42ea7934f646b24)) * incorrect invoice qty ([ebbecdb](https://github.com/frappe/erpnext/commit/ebbecdba23ff3e0f9b7cc710b23616ee75c0dab3)) * **manufacturing:** add validation for disassemble qty ([cdc0429](https://github.com/frappe/erpnext/commit/cdc04292f2aecd74e84e4c9465da768a2a80f293)) * **manufacturing:** get items for disassembly order ([279cf6f](https://github.com/frappe/erpnext/commit/279cf6fe007528f624f8f1e5ef7d169124584756)) * mark navbar item as translatable ([ec3a226](https://github.com/frappe/erpnext/commit/ec3a226a83c3ec2245d668f5b8877596e83fa319)) * only show net gl balance as opening in general ledger ([0d5e45b](https://github.com/frappe/erpnext/commit/0d5e45bb7c45dce5b8368ec63c5721ba4bcadb42)) * **payment entry:** fetch gain loss account from company boot ([c01e40d](https://github.com/frappe/erpnext/commit/c01e40da3cc5f8e7441dce86ba96a917348d27f8)) * precision issue on job card submission ([4ee4a57](https://github.com/frappe/erpnext/commit/4ee4a57f722499c3b72765b6e4dde807bd930f83)) * preserve user-entered exchange rates in ERR journal entries ([fa04e36](https://github.com/frappe/erpnext/commit/fa04e368d3e32452f45b49863bb40d7a2136daaa)) * prevent dispatch address copying on drop ship ([5d5dff9](https://github.com/frappe/erpnext/commit/5d5dff9103c45ebb8f157d168184477163ffba42)) * prevent self in "Reports To" dropdown (UI-level check) ([9e8bb9b](https://github.com/frappe/erpnext/commit/9e8bb9b235f6723b28fe0568915ee52ed2e52262)) * putaway rule not applying on serial nos ([df820ae](https://github.com/frappe/erpnext/commit/df820aece678ab6d18a54eb491a72066c6002d5d)) * re-calculate outstanding / write-off amount during submission ([5bfdc01](https://github.com/frappe/erpnext/commit/5bfdc010f3392d8df3e7b3841218df8456a84e62)) * **Rename Tool:** use "Link" field instead of "Select" ([2aff169](https://github.com/frappe/erpnext/commit/2aff16928c7b242ea74de9829b1ca330de72e999)) * **Rename Tool:** use "Link" field instead of "Select" (backport [#50995](https://github.com/frappe/erpnext/issues/50995)) ([#51138](https://github.com/frappe/erpnext/issues/51138)) ([53bb2cf](https://github.com/frappe/erpnext/commit/53bb2cf7c0e9c6f41ac436942cf7cf74c5153b36)) * Serial/Batches not fetching when creating Material Transfer from Purchase Receipt ([f3c70a6](https://github.com/frappe/erpnext/commit/f3c70a66b5daa8eab56cf169b896d771e67a606c)) * **share balance:** use currency field instead of int for rate and amount ([a8ed281](https://github.com/frappe/erpnext/commit/a8ed2815a47601ae2ba507afe5c979e3b622592b)) * Short circuit guest perm checks ([dab8ac7](https://github.com/frappe/erpnext/commit/dab8ac7b1d36446785310de5c15a88275241c583)) * stock ageing report ([d098572](https://github.com/frappe/erpnext/commit/d09857294cb4ab6c670d45f60d44f053febb7515)) * **stock:** remove total bar in chart view ([918f8ca](https://github.com/frappe/erpnext/commit/918f8ca79b66bb291ade3782bc009c4474f73586)) * **subcontract:** ignore BOM qty validation for alternative items (backport [#51122](https://github.com/frappe/erpnext/issues/51122)) ([#51135](https://github.com/frappe/erpnext/issues/51135)) ([2c9c6c3](https://github.com/frappe/erpnext/commit/2c9c6c379829fc889fe1e2bb3c1dbe98d9309aad)) * **trial_balance:** remove hardcoded precision for currency values ([99b69c1](https://github.com/frappe/erpnext/commit/99b69c121e9cc28ab146228bbc5f1e8aed8d13e1)) * use dummy translations for custom field labels ([#49875](https://github.com/frappe/erpnext/issues/49875)) ([088bbac](https://github.com/frappe/erpnext/commit/088bbac543a228319f5ee4dd1247c7b6e48eb794)) * validate available stock with multiple dimensions (backport [#50937](https://github.com/frappe/erpnext/issues/50937)) ([#50983](https://github.com/frappe/erpnext/issues/50983)) ([98eeff8](https://github.com/frappe/erpnext/commit/98eeff8775ec9ca4f6ae1d040cfe37343ffaa1da)) * validate budget after cost center allocation ([a2b6e4a](https://github.com/frappe/erpnext/commit/a2b6e4a1c587ce2f7e017f39944899f76e3e2f7d)) ### Features * introduce extended bank transaction fields (backport [#50021](https://github.com/frappe/erpnext/issues/50021)) ([#51112](https://github.com/frappe/erpnext/issues/51112)) ([a61890e](https://github.com/frappe/erpnext/commit/a61890ec2b5dfbe77b286d5c32c6e560b9eca075)) ### Performance Improvements * move all hourly/daily jobs to maintenance queue (backport [#47504](https://github.com/frappe/erpnext/issues/47504)) ([#51005](https://github.com/frappe/erpnext/issues/51005)) ([46ca347](https://github.com/frappe/erpnext/commit/46ca347578732b2be08ba43e7c6ec5f1ebd590b0)) * sabb validate serial no ([#51132](https://github.com/frappe/erpnext/issues/51132)) ([3a9888a](https://github.com/frappe/erpnext/commit/3a9888aad93d030af773b09b35be313232d8109f)) ### Reverts * changes to install_fixtures ([19dc26e](https://github.com/frappe/erpnext/commit/19dc26ea16cbb963fb6353c4c16d2aebb1be26fa)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 828d00f3c19..3b3642b6625 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.91.3" +__version__ = "15.92.0" def get_default_company(user=None): From 552c5b5911756bbbd6d7c32d7af191f251ed1fe7 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 13:46:31 +0530 Subject: [PATCH 14/31] fix: incorrect current qty in stock reco (backport #51152) (#51158) * fix: incorrect current qty in stock reco (#51152) (cherry picked from commit dec474ef3a48ea1e0daa4dd6d14257bbf30b81bc) * chore: fix conflicts --------- Co-authored-by: rohitwaghchaure (cherry picked from commit 89d6a8f02ec7b4ec9886b4b44621da3cb7d5bf70) --- erpnext/stock/doctype/batch/batch.py | 4 +- .../stock_reconciliation.py | 37 +++++++------------ 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index 699b7a9562d..20dd94da906 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -166,7 +166,9 @@ class Batch(Document): for row in batches: batch_qty += row.get("qty") - self.db_set("batch_qty", batch_qty) + if self.batch_qty != batch_qty: + self.db_set("batch_qty", batch_qty) + frappe.msgprint(_("Batch Qty updated to {0}").format(batch_qty), alert=True) def set_batchwise_valuation(self): diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index cc4b08b50f4..2bf4333b14e 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -1227,32 +1227,23 @@ class StockReconciliation(StockController): def get_batch_qty_for_stock_reco( item_code, warehouse, batch_no, posting_date, posting_time, voucher_no, sle_creation ): - ledger = frappe.qb.DocType("Stock Ledger Entry") - posting_datetime = get_combine_datetime(posting_date, posting_time) - - query = ( - frappe.qb.from_(ledger) - .select( - Sum(ledger.actual_qty).as_("batch_qty"), + qty = ( + get_batch_qty( + batch_no, + warehouse, + item_code, + creation=sle_creation, + posting_date=posting_date, + posting_time=posting_time, + ignore_voucher_nos=[voucher_no], + for_stock_levels=True, + consider_negative_batches=True, + do_not_check_future_batches=True, ) - .where( - (ledger.item_code == item_code) - & (ledger.warehouse == warehouse) - & (ledger.docstatus == 1) - & (ledger.is_cancelled == 0) - & (ledger.batch_no == batch_no) - & (ledger.voucher_no != voucher_no) - & ( - (ledger.posting_datetime < posting_datetime) - | ((ledger.posting_datetime == posting_datetime) & (ledger.creation < sle_creation)) - ) - ) - .groupby(ledger.batch_no) + or 0 ) - sle = query.run(as_dict=True) - - return flt(sle[0].batch_qty) if sle else 0 + return flt(qty) @frappe.whitelist() From 1e527381502a17ad22eab36666ec7d3116afc223 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Wed, 17 Dec 2025 09:34:54 +0000 Subject: [PATCH 15/31] chore(release): Bumped to Version 15.92.1 ## [15.92.1](https://github.com/frappe/erpnext/compare/v15.92.0...v15.92.1) (2025-12-17) ### Bug Fixes * incorrect current qty in stock reco (backport [#51152](https://github.com/frappe/erpnext/issues/51152)) ([#51158](https://github.com/frappe/erpnext/issues/51158)) ([552c5b5](https://github.com/frappe/erpnext/commit/552c5b5911756bbbd6d7c32d7af191f251ed1fe7)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 3b3642b6625..9c9c1fba2fc 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.0" +__version__ = "15.92.1" def get_default_company(user=None): From 195f90232d0605e8d9542313e5482b0eb8c9349a Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 17:05:39 +0530 Subject: [PATCH 16/31] fix(pegged currencies): skip adding currencies_to_add items on pegged_currency_item if source_currency or pegged_against currency doc does not exist (backport #51188) (#51203) Co-authored-by: Diptanil Saha fix(pegged currencies): skip adding currencies_to_add items on pegged_currency_item if source_currency or pegged_against currency doc does not exist (#51188) (cherry picked from commit 8ef09c0dc00db0f21472d7be419a866418600e16) --- erpnext/setup/install.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index ccae5136a9e..fffe9b9bdf0 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -296,8 +296,20 @@ def update_pegged_currencies(): {"source_currency": "SAR", "pegged_against": "USD", "pegged_exchange_rate": 3.75}, ] + # Add items on pegged_currency_item if source_currency and pegged_against currency doc exist. + + currencies_exist = frappe.db.get_list( + "Currency", {"name": ["in", ["AED", "BHD", "JOD", "OMR", "QAR", "SAR", "USD"]]}, pluck="name" + ) + + if "USD" not in currencies_exist: + return + for currency in currencies_to_add: - if currency["source_currency"] not in existing_sources: + if ( + currency["source_currency"] in currencies_exist + and currency["source_currency"] not in existing_sources + ): doc.append("pegged_currency_item", currency) doc.save() From 54ed428225db6d04ac3adf2625306f58e5cf6551 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Thu, 18 Dec 2025 12:38:51 +0000 Subject: [PATCH 17/31] chore(release): Bumped to Version 15.92.2 ## [15.92.2](https://github.com/frappe/erpnext/compare/v15.92.1...v15.92.2) (2025-12-18) ### Bug Fixes * **pegged currencies:** skip adding currencies_to_add items on pegged_currency_item if source_currency or pegged_against currency doc does not exist (backport [#51188](https://github.com/frappe/erpnext/issues/51188)) ([#51203](https://github.com/frappe/erpnext/issues/51203)) ([195f902](https://github.com/frappe/erpnext/commit/195f90232d0605e8d9542313e5482b0eb8c9349a)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 9c9c1fba2fc..bc72b20ab27 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.1" +__version__ = "15.92.2" def get_default_company(user=None): From 35478bbf913de49374ab043bc6515675df805e8e Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Fri, 19 Dec 2025 12:11:04 +0530 Subject: [PATCH 18/31] fix(stock): ignore reserved stock while calculating batch qty (cherry picked from commit b23c6e2687af087702409d3cd669519da0565044) # Conflicts: # erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py (cherry picked from commit ac2402dd2a6ce89a54e73070c1959eaad464e510) --- erpnext/stock/doctype/batch/batch.py | 9 ++++++++- .../serial_and_batch_bundle/serial_and_batch_bundle.py | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py index 20dd94da906..ba9aaa6c48a 100644 --- a/erpnext/stock/doctype/batch/batch.py +++ b/erpnext/stock/doctype/batch/batch.py @@ -159,8 +159,13 @@ class Batch(Document): @frappe.whitelist() def recalculate_batch_qty(self): batches = get_batch_qty( - batch_no=self.name, item_code=self.item, for_stock_levels=True, consider_negative_batches=True + batch_no=self.name, + item_code=self.item, + for_stock_levels=True, + consider_negative_batches=True, + ignore_reserved_stock=True, ) + batch_qty = 0.0 if batches: for row in batches: @@ -240,6 +245,7 @@ def get_batch_qty( for_stock_levels=False, consider_negative_batches=False, do_not_check_future_batches=False, + ignore_reserved_stock=False, ): """Returns batch actual qty if warehouse is passed, or returns dict of qty by warehouse if warehouse is None @@ -269,6 +275,7 @@ def get_batch_qty( "for_stock_levels": for_stock_levels, "consider_negative_batches": consider_negative_batches, "do_not_check_future_batches": do_not_check_future_batches, + "ignore_reserved_stock": ignore_reserved_stock, } ) 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 e20363cec3a..238d6600830 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 @@ -2332,6 +2332,12 @@ def get_auto_batch_nos(kwargs): sre_reserved_batches = frappe._dict() if not kwargs.ignore_reserved_stock: sre_reserved_batches = get_reserved_batches_for_sre(kwargs) +<<<<<<< HEAD +======= + + if kwargs.against_sales_order and only_consider_batches: + kwargs.batch_no = kwargs.warehouse = None +>>>>>>> b23c6e2687 (fix(stock): ignore reserved stock while calculating batch qty) picked_batches = frappe._dict() if kwargs.get("is_pick_list"): From 08cd08adcd5f50ba2b56b1cee2097b8e7da2d844 Mon Sep 17 00:00:00 2001 From: Sudharsanan11 Date: Fri, 19 Dec 2025 17:25:20 +0530 Subject: [PATCH 19/31] test(stock): add test for ignore reserve stock (cherry picked from commit 4d8ec5f54c0c063cc33990490947dd76fe029f94) (cherry picked from commit b20405dbf23cc52765bcd2c5229142838b85dfb9) --- erpnext/stock/doctype/batch/test_batch.py | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py index 1d44d19ac81..83efc12a7d8 100644 --- a/erpnext/stock/doctype/batch/test_batch.py +++ b/erpnext/stock/doctype/batch/test_batch.py @@ -324,6 +324,38 @@ class TestBatch(FrappeTestCase): self.assertEqual(get_batch_qty("batch a", "_Test Warehouse - _TC"), 90) + def test_ignore_reserved_qty(self): + from erpnext.selling.doctype.sales_order.sales_order import create_pick_list + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + batch_item_name = "Reserve Batch Item" + batch_id = "Reserve Batch 1" + # Create Batch Item + self.make_batch_item(batch_item_name) + # Create Batch and Material Receipt Entry with qty 90 + self.make_new_batch_and_entry(batch_item_name, batch_id, "_Test Warehouse - _TC") + + # Enable Stock Reservation + frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 1) + + # Create Sales Order with qty 50 + sales_order = make_sales_order( + item_code=batch_item_name, warehouse="_Test Warehouse - _TC", qty=50, rate=20 + ) + + # Create Pick List for the Sales Order + pl = create_pick_list(sales_order.name) + pl.submit() + # Create Stock Reservation Entries + pl.create_stock_reservation_entries(notify=False) + + batch = frappe.get_doc("Batch", batch_id) + # Recalculate Batch Qty + batch.recalculate_batch_qty() + batch.reload() + # Case: Ignore Reserved Qty + self.assertEqual(batch.batch_qty, 90) + def test_total_batch_qty(self): self.make_batch_item("ITEM-BATCH-3") existing_batch_qty = flt(frappe.db.get_value("Batch", "B100", "batch_qty")) From 58c793f14ed7848433ccdfabca9792280f358eea Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Fri, 19 Dec 2025 18:07:42 +0530 Subject: [PATCH 20/31] chore: fix conflicts Removed logic for handling reserved stock when calculating batch quantity. (cherry picked from commit 9ade0725e8eb5f3ecdbc9cc7d6f5f6af6fd1748c) --- .../serial_and_batch_bundle/serial_and_batch_bundle.py | 6 ------ 1 file changed, 6 deletions(-) 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 238d6600830..e20363cec3a 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 @@ -2332,12 +2332,6 @@ def get_auto_batch_nos(kwargs): sre_reserved_batches = frappe._dict() if not kwargs.ignore_reserved_stock: sre_reserved_batches = get_reserved_batches_for_sre(kwargs) -<<<<<<< HEAD -======= - - if kwargs.against_sales_order and only_consider_batches: - kwargs.batch_no = kwargs.warehouse = None ->>>>>>> b23c6e2687 (fix(stock): ignore reserved stock while calculating batch qty) picked_batches = frappe._dict() if kwargs.get("is_pick_list"): From 6e7de0ac47e9057f3a98f4dd41cc91aea5fddc91 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Fri, 19 Dec 2025 13:25:33 +0000 Subject: [PATCH 21/31] chore(release): Bumped to Version 15.92.3 ## [15.92.3](https://github.com/frappe/erpnext/compare/v15.92.2...v15.92.3) (2025-12-19) ### Bug Fixes * **stock:** ignore reserved stock while calculating batch qty ([35478bb](https://github.com/frappe/erpnext/commit/35478bbf913de49374ab043bc6515675df805e8e)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index bc72b20ab27..220ad9352f4 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.2" +__version__ = "15.92.3" def get_default_company(user=None): From 05ad50f98ba9c3e6467c9da766cda9b280a36525 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Sun, 21 Dec 2025 21:37:13 +0530 Subject: [PATCH 22/31] fix: same serial number was picked in multiple sales invoices (cherry picked from commit 61c31f0cd053c993101d3287e91993ed93faa6cd) # Conflicts: # erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py (cherry picked from commit dc5faa8b7107e6edec59188f50c854b7013d151e) --- .../serial_and_batch_bundle.py | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) 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 e20363cec3a..9cf921b8646 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 @@ -1989,8 +1989,35 @@ def get_available_serial_nos(kwargs): if kwargs.warehouse: filters["warehouse"] = kwargs.warehouse +<<<<<<< HEAD # Since SLEs are not present against Reserved Stock [POS invoices, SRE], need to ignore reserved serial nos. ignore_serial_nos = get_reserved_serial_nos(kwargs) +======= + reserved_entries = get_reserved_serial_nos_for_sre(kwargs) + + ignore_serial_nos = [] + if reserved_entries: + if kwargs.get("sabb_voucher_type") == "Delivery Note" and kwargs.get("against_sales_order"): + reserved_voucher_details = [kwargs.get("against_sales_order")] + else: + reserved_voucher_details = get_reserved_voucher_details(kwargs) + + # Check if serial nos are reserved for the current voucher then fetch only those serial nos + if reserved_serial_nos := get_reserved_serial_nos_for_voucher( + kwargs, reserved_entries, reserved_voucher_details + ): + filters["name"] = ("in", reserved_serial_nos) + return get_serial_nos_based_on_filters(filters, fields, order_by, kwargs) + + # Check if serial nos are reserved for other vouchers then ignore those serial nos + elif ignore_reserved_serial_nos := get_other_doc_reserved_serials( + kwargs, reserved_entries, reserved_voucher_details + ): + ignore_serial_nos.extend(ignore_reserved_serial_nos) + + if reserved_for_pos := get_reserved_serial_nos_for_pos(kwargs): + ignore_serial_nos.extend(reserved_for_pos) +>>>>>>> 61c31f0cd0 (fix: same serial number was picked in multiple sales invoices) # To ignore serial nos in the same record for the draft state if kwargs.get("ignore_serial_nos"): @@ -2018,13 +2045,47 @@ def get_available_serial_nos(kwargs): filters["batch_no"] = ("in", batches) - return frappe.get_all( - "Serial No", - fields=fields, - filters=filters, - limit=cint(kwargs.qty) or 10000000, - order_by=order_by, - ) + return get_serial_nos_based_on_filters(filters, fields, order_by, kwargs) + + +def get_serial_nos_based_on_filters(filters, fields, order_by, kwargs): + doctype = frappe.qb.DocType("Serial No") + + order_by_column = getattr(doctype, order_by) + query = frappe.qb.from_(doctype).orderby(order_by_column).limit(cint(kwargs.qty) or 10000000).for_update() + + for key, value in filters.items(): + column = getattr(doctype, key) + + if isinstance(value, tuple): + operator = value[0] + + if operator == "between": + query = query.where(column.between(value[1], value[2])) + + elif operator == "in": + query = query.where(column.isin(value[1])) + + elif operator == "not in": + query = query.where(column.notin(value[1])) + + elif operator == "is": + if value[1] == "set": + query = query.where(column.isnotnull()) + elif value[1] == "not set": + query = query.where(column.isnull()) + else: + query = query.where(column == value) + + for field in fields: + if " as " in field.lower(): + # Split field and alias + field_name, alias = field.split(" as ", 1) + query = query.select(getattr(doctype, field_name).as_(alias)) + else: + query = query.select(getattr(doctype, field)) + + return query.run(as_dict=True) def get_non_expired_batches(batches): From aba3d7821c41326b6eed0cd2e58dcf4bc42ff52c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 22 Dec 2025 11:37:19 +0530 Subject: [PATCH 23/31] chore: fix conflicts Removed logic for handling reserved serial numbers in sales invoices. (cherry picked from commit c77c4266525c714dff47a26650c535f50ec1bef0) --- .../serial_and_batch_bundle.py | 27 ------------------- 1 file changed, 27 deletions(-) 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 9cf921b8646..bb68468619b 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 @@ -1989,35 +1989,8 @@ def get_available_serial_nos(kwargs): if kwargs.warehouse: filters["warehouse"] = kwargs.warehouse -<<<<<<< HEAD # Since SLEs are not present against Reserved Stock [POS invoices, SRE], need to ignore reserved serial nos. ignore_serial_nos = get_reserved_serial_nos(kwargs) -======= - reserved_entries = get_reserved_serial_nos_for_sre(kwargs) - - ignore_serial_nos = [] - if reserved_entries: - if kwargs.get("sabb_voucher_type") == "Delivery Note" and kwargs.get("against_sales_order"): - reserved_voucher_details = [kwargs.get("against_sales_order")] - else: - reserved_voucher_details = get_reserved_voucher_details(kwargs) - - # Check if serial nos are reserved for the current voucher then fetch only those serial nos - if reserved_serial_nos := get_reserved_serial_nos_for_voucher( - kwargs, reserved_entries, reserved_voucher_details - ): - filters["name"] = ("in", reserved_serial_nos) - return get_serial_nos_based_on_filters(filters, fields, order_by, kwargs) - - # Check if serial nos are reserved for other vouchers then ignore those serial nos - elif ignore_reserved_serial_nos := get_other_doc_reserved_serials( - kwargs, reserved_entries, reserved_voucher_details - ): - ignore_serial_nos.extend(ignore_reserved_serial_nos) - - if reserved_for_pos := get_reserved_serial_nos_for_pos(kwargs): - ignore_serial_nos.extend(reserved_for_pos) ->>>>>>> 61c31f0cd0 (fix: same serial number was picked in multiple sales invoices) # To ignore serial nos in the same record for the draft state if kwargs.get("ignore_serial_nos"): From 0e73c12add807eef2545cb9a20c9c63c1848424d Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 22 Dec 2025 12:02:38 +0530 Subject: [PATCH 24/31] fix: added limit (cherry picked from commit 73643de61256651e12d545dfef3587ee978f57b2) --- erpnext/stock/get_item_details.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 8e71367c663..b0ade4324fa 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -204,6 +204,7 @@ def update_stock(ctx, out, doc=None): "item_code": ctx.item_code, "warehouse": ctx.warehouse, "based_on": frappe.db.get_single_value("Stock Settings", "pick_serial_and_batch_based_on"), + "qty": out.stock_qty, } ) From 658a7c536d40186e22c3917ab9bb654adbd65765 Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Mon, 22 Dec 2025 08:35:29 +0000 Subject: [PATCH 25/31] chore(release): Bumped to Version 15.92.4 ## [15.92.4](https://github.com/frappe/erpnext/compare/v15.92.3...v15.92.4) (2025-12-22) ### Bug Fixes * added limit ([0e73c12](https://github.com/frappe/erpnext/commit/0e73c12add807eef2545cb9a20c9c63c1848424d)) * same serial number was picked in multiple sales invoices ([05ad50f](https://github.com/frappe/erpnext/commit/05ad50f98ba9c3e6467c9da766cda9b280a36525)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 220ad9352f4..135fa36b8ac 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.3" +__version__ = "15.92.4" def get_default_company(user=None): From f3d0a91fb34dc1db8a3bb5fbeae7f6f38ca1ff2e Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 22 Dec 2025 16:19:11 +0530 Subject: [PATCH 26/31] Revert "fix: performance of the reposting" (cherry picked from commit 280558efa210c8674caec71f3b01b448573dba9f) (cherry picked from commit c89fe9f1ca3c5ab734bbe64d890714671d715c6a) --- erpnext/stock/stock_ledger.py | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 407040c245c..71a7883d644 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -718,13 +718,6 @@ class update_entries_after: {"item_code": self.item_code, "warehouse": self.args.warehouse} ) - key = (self.item_code, self.args.warehouse) - if key in self.distinct_item_warehouses and self.distinct_item_warehouses[key].get( - "transfer_entry_to_repost" - ): - # only repost stock entries - args["filter_voucher_type"] = "Stock Entry" - return list(self.get_sle_after_datetime(args)) def get_dependent_entries_to_fix(self, entries_to_fix, sle): @@ -758,10 +751,8 @@ class update_entries_after: if getdate(existing_sle.get("posting_date")) > getdate(dependant_sle.posting_date): self.distinct_item_warehouses[key] = val self.new_items_found = True - elif ( - dependant_sle.actual_qty > 0 - and dependant_sle.voucher_type == "Stock Entry" - and is_transfer_stock_entry(dependant_sle.voucher_no) + elif dependant_sle.voucher_type == "Stock Entry" and is_transfer_stock_entry( + dependant_sle.voucher_no ): if self.distinct_item_warehouses[key].get("transfer_entry_to_repost"): return @@ -1848,9 +1839,6 @@ def get_stock_ledger_entries( if operator in (">", "<=") and previous_sle.get("name"): conditions += " and name!=%(name)s" - if previous_sle.get("filter_voucher_type"): - conditions += " and voucher_type = %(filter_voucher_type)s" - if extra_cond: conditions += f"{extra_cond}" From 71879921700de1c8b6b85847e7f1de8448d6a5e7 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 22 Dec 2025 16:22:44 +0530 Subject: [PATCH 27/31] chore: fix test case (cherry picked from commit d191b8058739d307ea72e98fed37841fc673398b) (cherry picked from commit aefde87a0caa110e80ffd6f1ee67b9b7b5f9d59f) --- erpnext/stock/stock_ledger.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 71a7883d644..76ad47fb2f2 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -751,8 +751,10 @@ class update_entries_after: if getdate(existing_sle.get("posting_date")) > getdate(dependant_sle.posting_date): self.distinct_item_warehouses[key] = val self.new_items_found = True - elif dependant_sle.voucher_type == "Stock Entry" and is_transfer_stock_entry( - dependant_sle.voucher_no + elif ( + dependant_sle.actual_qty > 0 + and dependant_sle.voucher_type == "Stock Entry" + and is_transfer_stock_entry(dependant_sle.voucher_no) ): if self.distinct_item_warehouses[key].get("transfer_entry_to_repost"): return From 43831e97855830e97ff72e8328e1c74f9c46e8d7 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 22 Dec 2025 16:23:15 +0530 Subject: [PATCH 28/31] chore: fix linters issue (cherry picked from commit e9c37642c8f39aa7aece15b44c6f5765a7ea94ab) (cherry picked from commit c095938e69169dc1e333ec8f5b891d9a5569c72e) --- 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 76ad47fb2f2..d00d092e795 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -753,7 +753,7 @@ class update_entries_after: self.new_items_found = True elif ( dependant_sle.actual_qty > 0 - and dependant_sle.voucher_type == "Stock Entry" + and dependant_sle.voucher_type == "Stock Entry" and is_transfer_stock_entry(dependant_sle.voucher_no) ): if self.distinct_item_warehouses[key].get("transfer_entry_to_repost"): From 670beae04858424d85edfc07d75b4162d8c5a8f1 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 23 Dec 2025 12:49:12 +0530 Subject: [PATCH 29/31] chore(release): Bumped to Version 15.92.5 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 135fa36b8ac..3ae42e4b52d 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.4" +__version__ = "15.92.5" def get_default_company(user=None): From 6df222a1caafa4399e0144fc55751549407684df Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 23 Dec 2025 13:27:08 +0530 Subject: [PATCH 30/31] fix: bumped version --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 3ae42e4b52d..135fa36b8ac 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.5" +__version__ = "15.92.4" def get_default_company(user=None): From 5007abf7ae7bcfb7c1132e3331a65cdec2d3676c Mon Sep 17 00:00:00 2001 From: Frappe PR Bot Date: Tue, 23 Dec 2025 08:16:22 +0000 Subject: [PATCH 31/31] chore(release): Bumped to Version 15.92.5 ## [15.92.5](https://github.com/frappe/erpnext/compare/v15.92.4...v15.92.5) (2025-12-23) ### Bug Fixes * bumped version ([6df222a](https://github.com/frappe/erpnext/commit/6df222a1caafa4399e0144fc55751549407684df)) --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 135fa36b8ac..3ae42e4b52d 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from frappe.utils.user import is_website_user -__version__ = "15.92.4" +__version__ = "15.92.5" def get_default_company(user=None):