Compare commits

..

780 Commits

Author SHA1 Message Date
Frappe PR Bot
66ec6a4d20 chore(release): Bumped to Version 16.15.1
## [16.15.1](https://github.com/frappe/erpnext/compare/v16.15.0...v16.15.1) (2026-04-24)

### Bug Fixes

* preserve inventory dimensions when raw materials are reset (backport [#54440](https://github.com/frappe/erpnext/issues/54440)) (backport [#54493](https://github.com/frappe/erpnext/issues/54493)) ([#54513](https://github.com/frappe/erpnext/issues/54513)) ([610735d](610735d1c5))
2026-04-24 12:35:07 +00:00
mergify[bot]
610735d1c5 fix: preserve inventory dimensions when raw materials are reset (backport #54440) (backport #54493) (#54513)
* fix: preserve inventory dimensions when raw materials are reset (backport #54440) (#54493)

fix: preserve inventory dimensions when raw materials are reset (#54440)

* fix: preserve inventory dimensions when raw materials are reset

* test: add test case

(cherry picked from commit 0e20e35842)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
(cherry picked from commit 456e99b352)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-24 12:33:34 +00:00
Frappe PR Bot
c99b9e1b64 chore(release): Bumped to Version 16.15.0
# [16.15.0](https://github.com/frappe/erpnext/compare/v16.14.0...v16.15.0) (2026-04-22)

### Bug Fixes

* **accounts:** fetch project name from payment entry to journal entry (backport [#54307](https://github.com/frappe/erpnext/issues/54307)) ([#54453](https://github.com/frappe/erpnext/issues/54453)) ([62a9a76](62a9a761b7))
* add portal user ownership check to supplier quotation (backport [#54298](https://github.com/frappe/erpnext/issues/54298)) ([#54300](https://github.com/frappe/erpnext/issues/54300)) ([d7da5b0](d7da5b047d))
* add project filter to accounts payable and receivable reports (backport [#54344](https://github.com/frappe/erpnext/issues/54344)) ([#54442](https://github.com/frappe/erpnext/issues/54442)) ([57cd2a0](57cd2a06e8))
* append row level user remarks in gl map ([aa359ad](aa359aded4))
* changed qty validation from qty field to stock_qty (backport [#54352](https://github.com/frappe/erpnext/issues/54352)) ([#54357](https://github.com/frappe/erpnext/issues/54357)) ([fa76e8a](fa76e8ac7f))
* clear conditions table when calculate_based_on is set to Fixed ([7849733](78497336c7))
* clear shipping rule conditions for fixed shipping rule ([319d769](319d769c6f))
* **dashboard-trends:** set default fiscal year and company before val… (backport [#54339](https://github.com/frappe/erpnext/issues/54339)) ([#54400](https://github.com/frappe/erpnext/issues/54400)) ([b1825c0](b1825c0cbe))
* default company perms for HR manager ([47abaf7](47abaf70b2))
* default perm for HR manager & HR user ([95213fb](95213fb9b8))
* default perm for HR manager & HR user ([a7b1fec](a7b1fec21d))
* default permission for HR manager role ([534891a](534891aac4))
* default permission for HR User role ([0d6d64f](0d6d64ff05))
* Disallow negative rates in Purchase invoice (backport [#54254](https://github.com/frappe/erpnext/issues/54254)) ([#54393](https://github.com/frappe/erpnext/issues/54393)) ([cac9073](cac907383b))
* dropship logic should come above non stock logic in gross profit… (backport [#54383](https://github.com/frappe/erpnext/issues/54383)) ([#54385](https://github.com/frappe/erpnext/issues/54385)) ([78aaf6c](78aaf6c7e8))
* fetch item tax template from item group when creating item (backport [#54258](https://github.com/frappe/erpnext/issues/54258)) ([#54368](https://github.com/frappe/erpnext/issues/54368)) ([3914d5d](3914d5d1b7))
* hide operations field in bom creator if phantom (backport [#54336](https://github.com/frappe/erpnext/issues/54336)) ([#54337](https://github.com/frappe/erpnext/issues/54337)) ([b252ad4](b252ad49b7))
* make Target Warehouse mandatory on UI ([46f5de0](46f5de0b1c))
* **manufacturing:** handle empty list in query builder ([d2cc549](d2cc549696))
* move make_dimension_in_accounting_doctypes from after_insert to on_update ([f287edd](f287edd8c2))
* negative batch report showing same batch-warehouse multiple times ([493f36b](493f36b3ce))
* non-collapsible in customer quick entry ([101f68c](101f68c8e8))
* **pos_invoice_item:** fetch `grant_commission` from `item_code` (backport [#54413](https://github.com/frappe/erpnext/issues/54413)) ([#54418](https://github.com/frappe/erpnext/issues/54418)) ([dd6d4d1](dd6d4d1910))
* **purchase_register:** filter tax rows by parenttype in invoice tax map query (backport [#54272](https://github.com/frappe/erpnext/issues/54272)) ([#54444](https://github.com/frappe/erpnext/issues/54444)) ([01aff64](01aff6492c))
* recalculate operating costs if workstation type is changed (backport [#54390](https://github.com/frappe/erpnext/issues/54390)) ([#54398](https://github.com/frappe/erpnext/issues/54398)) ([cfcba1f](cfcba1fcf2))
* remove unwanted perm for HR user role ([4940aeb](4940aeb712))
* reset base_rounded_total when rounded_total resets (backport [#54241](https://github.com/frappe/erpnext/issues/54241)) ([#54304](https://github.com/frappe/erpnext/issues/54304)) ([45052ce](45052ce8a7))
* resolve conflict ([9e6300b](9e6300bf76))
* sales order is not valid when creating WO from MR from PP (backport [#54435](https://github.com/frappe/erpnext/issues/54435)) ([#54436](https://github.com/frappe/erpnext/issues/54436)) ([5397b7d](5397b7da25))
* Table row in dialog should not have delete row option ([5916e57](5916e570af))
* **taxes_and_totals:** apply conversion_rate to taxable_amount in get_itemised_tax ([d506e57](d506e574d2))
* **test:** missing repost allowed defaults ([d49c343](d49c34389b))
* use qty instead of stock qty dropship gross profit report (backport [#54389](https://github.com/frappe/erpnext/issues/54389)) ([#54391](https://github.com/frappe/erpnext/issues/54391)) ([7556550](7556550158))
* validate south africa company in vat audit report (backport [#54030](https://github.com/frappe/erpnext/issues/54030)) ([#54394](https://github.com/frappe/erpnext/issues/54394)) ([aa2cba9](aa2cba9780))
* zero valuation rate popup on SI (backport [#54376](https://github.com/frappe/erpnext/issues/54376)) ([#54377](https://github.com/frappe/erpnext/issues/54377)) ([104eac2](104eac21e8))

### Features

* add option to create production plan from sales order (backport [#53662](https://github.com/frappe/erpnext/issues/53662)) ([#54323](https://github.com/frappe/erpnext/issues/54323)) ([b487f69](b487f69b59))
* add support for 'not applicable' tax in item tax templates ([#50898](https://github.com/frappe/erpnext/issues/50898)) ([52a4ca9](52a4ca9c41))
* backflush based on in BOM ([2c73e37](2c73e37f80))
* make fg phantom-able in bom creator (backport [#54332](https://github.com/frappe/erpnext/issues/54332)) ([#54333](https://github.com/frappe/erpnext/issues/54333)) ([10dbfd3](10dbfd310f))
* use single remark field with custom remark toggle ([27c5dab](27c5dab7e4))
2026-04-22 00:21:02 +00:00
diptanilsaha
a9747213f5 Merge pull request #54437 from frappe/version-16-hotfix 2026-04-22 05:49:31 +05:30
mergify[bot]
5923618df3 refactor(test): move contact and address creation to bootstrap (backport #54406) (#54410)
Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2026-04-22 00:24:36 +05:30
MochaMind
193a44f298 chore: update POT file (#54401) 2026-04-22 00:16:52 +05:30
Khushi Rawat
d9731d7c72 Merge pull request #54427 from frappe/mergify/bp/version-16-hotfix/pr-54131
feat: use single remark field with custom remark toggle (backport #54131)
2026-04-22 00:05:24 +05:30
mergify[bot]
457adcee95 refactor: fix test cases in tax withholding details report (backport #54422) (#54445)
Co-authored-by: ljain112 <ljain112@gmail.com>
2026-04-21 23:58:57 +05:30
mergify[bot]
01aff6492c fix(purchase_register): filter tax rows by parenttype in invoice tax map query (backport #54272) (#54444)
fix(purchase_register): filter tax rows by parenttype in invoice tax map query

(cherry picked from commit 3aeb7d6b01)

Co-authored-by: ljain112 <ljain112@gmail.com>
2026-04-21 23:58:25 +05:30
mergify[bot]
57cd2a06e8 fix: add project filter to accounts payable and receivable reports (backport #54344) (#54442)
Co-authored-by: ljain112 <ljain112@gmail.com>
2026-04-21 23:56:35 +05:30
mergify[bot]
62a9a761b7 fix(accounts): fetch project name from payment entry to journal entry (backport #54307) (#54453)
Co-authored-by: sarathibalamurugan <sarathigreen4@gmail.com>
2026-04-21 23:54:56 +05:30
Khushi Rawat
9e6300bf76 fix: resolve conflict 2026-04-21 16:15:21 +05:30
mergify[bot]
5397b7da25 fix: sales order is not valid when creating WO from MR from PP (backport #54435) (#54436)
fix: sales order is not valid when creating WO from MR from PP (#54435)

(cherry picked from commit e65b9fc2ae)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-21 15:44:26 +05:30
mergify[bot]
37d080bdb4 refactor: Sales Partner Commission Summary and Sales Partner Transaction Summary report (backport #54268) (#54431)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-04-21 09:21:10 +05:30
khushi8112
aa359aded4 fix: append row level user remarks in gl map
(cherry picked from commit 84e5272f5d)
2026-04-20 19:16:59 +00:00
khushi8112
27c5dab7e4 feat: use single remark field with custom remark toggle
(cherry picked from commit 697f521e14)

# Conflicts:
#	erpnext/accounts/doctype/journal_entry/journal_entry.json
2026-04-20 19:16:58 +00:00
Ravibharathi
4e05277695 Merge pull request #54424 from frappe/mergify/bp/version-16-hotfix/pr-54415
fix: clear conditions table when calculate_based_on is set to Fixed (backport #54415)
2026-04-20 19:44:19 +05:30
ravibharathi656
319d769c6f fix: clear shipping rule conditions for fixed shipping rule
(cherry picked from commit d6bb0ae093)
2026-04-20 13:53:25 +00:00
sarathibalamurugan
78497336c7 fix: clear conditions table when calculate_based_on is set to Fixed
(cherry picked from commit d73920be12)
2026-04-20 13:53:25 +00:00
rohitwaghchaure
d5ea039e07 Merge pull request #54414 from frappe/mergify/bp/version-16-hotfix/pr-54350
feat: backflush based on in BOM (backport #54350)
2026-04-20 17:57:33 +05:30
mergify[bot]
4bb30a9157 test(BootStrapTestData): create sales_partner test data while bootstrapping (backport #54416) (#54421)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-04-20 12:03:23 +00:00
mergify[bot]
dd6d4d1910 fix(pos_invoice_item): fetch grant_commission from item_code (backport #54413) (#54418)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(pos_invoice_item): fetch `grant_commission` from `item_code` (#54413)
2026-04-20 11:47:15 +00:00
Rohit Waghchaure
2c73e37f80 feat: backflush based on in BOM
(cherry picked from commit 877d99c5a5)
2026-04-20 11:07:19 +00:00
Raheel Khan
3bee79b90d Merge pull request #54407 from frappe/mergify/bp/version-16-hotfix/pr-53756
fix(hrms): default permission for HR roles (backport #53756)
2026-04-20 12:21:31 +05:30
iamkhanraheel
47abaf70b2 fix: default company perms for HR manager
(cherry picked from commit 2018a90ad8)
2026-04-20 05:50:43 +00:00
iamkhanraheel
4940aeb712 fix: remove unwanted perm for HR user role
(cherry picked from commit d26cd69fe5)
2026-04-20 05:50:42 +00:00
iamkhanraheel
95213fb9b8 fix: default perm for HR manager & HR user
(cherry picked from commit 41103a0622)
2026-04-20 05:50:42 +00:00
iamkhanraheel
a7b1fec21d fix: default perm for HR manager & HR user
(cherry picked from commit f02b3b6166)
2026-04-20 05:50:42 +00:00
iamkhanraheel
534891aac4 fix: default permission for HR manager role
(cherry picked from commit 5ec66169a7)
2026-04-20 05:50:42 +00:00
iamkhanraheel
0d6d64ff05 fix: default permission for HR User role
(cherry picked from commit 7b0bfe76cc)
2026-04-20 05:50:41 +00:00
mergify[bot]
fa76e8ac7f fix: changed qty validation from qty field to stock_qty (backport #54352) (#54357)
fix: changed qty validation from qty field to stock_qty (#54352)

(cherry picked from commit ba01d66c24)

Co-authored-by: Jatin3128 <140256508+Jatin3128@users.noreply.github.com>
2026-04-20 10:54:04 +05:30
ruthra kumar
abed348121 Merge pull request #54366 from frappe/mergify/bp/version-16-hotfix/pr-50898
feat: add support for 'not applicable' tax in item tax templates (backport #50898)
2026-04-20 10:17:00 +05:30
mergify[bot]
b1825c0cbe fix(dashboard-trends): set default fiscal year and company before val… (backport #54339) (#54400)
* fix(dashboard-trends): set default fiscal year and company before val… (#54339)

* fix(dashboard-trends): set default fiscal year and company before validating filters Ensure  and  are populated with default values

* fix(dashboard-trends): ensure fiscal_year and company are properly set before validation to avoid empty filter issues

* Update erpnext/controllers/trends.py

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
(cherry picked from commit d61b5fd5f6)

# Conflicts:
#	erpnext/controllers/trends.py

* chore: fix conflicts

---------

Co-authored-by: Ahmed AbuKhatwa <82771130+AhmedAbokhatwa@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-19 09:52:45 +00:00
mergify[bot]
cfcba1fcf2 fix: recalculate operating costs if workstation type is changed (backport #54390) (#54398)
fix: recalculate operating costs if workstation type is changed (#54390)

* fix: recalculate operating costs if workstation type is changed

* fix: do not overwrite op costs on every save

(cherry picked from commit 28f3429a54)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-19 08:06:09 +00:00
mergify[bot]
d542a72da5 Fix : None handling in pricing rule free item quantity calculation (backport #54375) (#54396)
Fix : None handling in pricing rule free item quantity calculation (#54375)

* fix(pricing_rule): handle None qty in transaction_qty calculation

* Update erpnext/accounts/doctype/pricing_rule/utils.py

---------



(cherry picked from commit 82438d6c72)

Co-authored-by: Jaganath-Tridots <jaganath@tridotstech.com>
Co-authored-by: Jagan <jagan@DESKTOP-HPDMQ06.localdomain>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-19 08:02:03 +00:00
mergify[bot]
aa2cba9780 fix: validate south africa company in vat audit report (backport #54030) (#54394)
fix: validate south africa company in vat audit report (#54030)

* fix: validate south africa company in vat audit report

* fix: use qb to get invoice data

* fix: validate company region in south africa vat settings

(cherry picked from commit 1c65cc1088)

Co-authored-by: Ravibharathi <131471282+ravibharathi656@users.noreply.github.com>
2026-04-19 07:57:13 +00:00
mergify[bot]
cac907383b fix: Disallow negative rates in Purchase invoice (backport #54254) (#54393)
fix: Disallow negative rates in Purchase invoice (#54254)

(cherry picked from commit 23768ae0a5)

Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
2026-04-19 07:46:21 +00:00
mergify[bot]
7556550158 fix: use qty instead of stock qty dropship gross profit report (backport #54389) (#54391)
fix: use qty instead of stock qty dropship gross profit report (#54389)

(cherry picked from commit d6b379b936)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-19 12:52:15 +05:30
mergify[bot]
78aaf6c7e8 fix: dropship logic should come above non stock logic in gross profit… (backport #54383) (#54385)
fix: dropship logic should come above non stock logic in gross profit… (#54383)

fix: dropship logic should come above non stock logic in gross profit report
(cherry picked from commit 40bcaa7bc3)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-18 16:37:43 +00:00
mergify[bot]
104eac21e8 fix: zero valuation rate popup on SI (backport #54376) (#54377)
fix: zero valuation rate popup on SI (#54376)

(cherry picked from commit 3ef6c24f07)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-18 12:05:36 +00:00
mergify[bot]
3914d5d1b7 fix: fetch item tax template from item group when creating item (backport #54258) (#54368)
fix: fetch item tax template from item group when creating item (#54258)

(cherry picked from commit b93f2350ee)

Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
2026-04-18 06:49:44 +00:00
Lakshit Jain
52a4ca9c41 feat: add support for 'not applicable' tax in item tax templates (#50898)
* feat: add support for 'not applicable' tax in item tax templates

* refactor: remove unused imports

* fix: import NOT_APPLICABLE_TAX in get_item_tax_map function

* fix: add item wise tax details for not applicable taxes

* test: added test case for `not_applicable`

* fix: do not create item wise tax details for not applicable tax

* fix: ensure tax rate is set to 0 for not applicable tax rows

* refactor: changes as per review

* test: update selling settings

* test: correct settings

* fix: return both net and current tax amounts for not applicable tax

(cherry picked from commit 453fe376ab)
2026-04-18 06:05:36 +00:00
rohitwaghchaure
de66fd0c58 Merge pull request #54361 from frappe/mergify/bp/version-16-hotfix/pr-54355
fix(manufacturing): handle empty list in query builder (backport #54355)
2026-04-17 21:43:14 +05:30
rohitwaghchaure
450b4c2f5f Merge pull request #54360 from frappe/mergify/bp/version-16-hotfix/pr-54354
fix: negative batch report showing same batch-warehouse multiple times (backport #54354)
2026-04-17 21:32:28 +05:30
Pandiyan37
d2cc549696 fix(manufacturing): handle empty list in query builder
(cherry picked from commit 9e5d94c1e6)
2026-04-17 15:52:18 +00:00
Rohit Waghchaure
493f36b3ce fix: negative batch report showing same batch-warehouse multiple times
(cherry picked from commit 700572980d)
2026-04-17 15:42:03 +00:00
Nishka Gosalia
cd605d35c5 Merge pull request #54348 from frappe/mergify/bp/version-16-hotfix/pr-54074
fix: Table row in dialog should not have delete row option (backport #54074)
2026-04-17 17:07:40 +05:30
nishkagosalia
5916e570af fix: Table row in dialog should not have delete row option
(cherry picked from commit eb89903dec)
2026-04-17 10:40:26 +00:00
Nishka Gosalia
4d300f7d34 Merge pull request #54347 from frappe/mergify/bp/version-16-hotfix/pr-54345 2026-04-17 16:08:41 +05:30
nishkagosalia
36cc39ddc6 refactor(UX): Batch Form Cleanup
(cherry picked from commit de747fe625)
2026-04-17 09:44:19 +00:00
rohitwaghchaure
afd25508d6 Merge pull request #54343 from frappe/mergify/bp/version-16-hotfix/pr-54342
fix: make Target Warehouse mandatory on UI for WO (backport #54342)
2026-04-17 13:27:35 +05:30
Rohit Waghchaure
46f5de0b1c fix: make Target Warehouse mandatory on UI
(cherry picked from commit 2a8267e10a)
2026-04-17 07:54:10 +00:00
mergify[bot]
b252ad49b7 fix: hide operations field in bom creator if phantom (backport #54336) (#54337) 2026-04-16 16:11:45 +00:00
mergify[bot]
10dbfd310f feat: make fg phantom-able in bom creator (backport #54332) (#54333) 2026-04-16 19:17:51 +05:30
ruthra kumar
07bcaab33b Merge pull request #54328 from frappe/mergify/bp/version-16-hotfix/pr-54327
fix(test): missing repost allowed defaults (backport #54327)
2026-04-16 17:20:04 +05:30
ruthra kumar
9d969d5af5 Merge pull request #54321 from frappe/mergify/bp/version-16-hotfix/pr-54301
refactor(ux): merge repost settings to accounts settings (backport #54301)
2026-04-16 17:19:48 +05:30
ruthra kumar
2e7c4776d4 refactor: delete redundent repost setting
(cherry picked from commit 6a04c159ca)
2026-04-16 16:55:38 +05:30
ruthra kumar
5a2933df8f refactor: limit reposting to only supported doctypes
(cherry picked from commit 940d3cfe0a)
2026-04-16 16:55:38 +05:30
ruthra kumar
fa5e4dee17 refactor: remove redundant field from filter
(cherry picked from commit ece85c770f)
2026-04-16 16:55:38 +05:30
ruthra kumar
3ba400a02b refactor(ux): better error message
(cherry picked from commit 3093409933)
2026-04-16 16:55:38 +05:30
ruthra kumar
5c064331cb refactor(test): use new source for repost setting
(cherry picked from commit b8207d5ed1)
2026-04-16 16:55:38 +05:30
ruthra kumar
151864079b refactor: move allowed doctypes to accounts settings
- dropped 'allowed' field

(cherry picked from commit d5c58277cb)
2026-04-16 16:55:37 +05:30
ruthra kumar
f785f36ad6 refactor: merge reposting settings to accounts settings
(cherry picked from commit 89ebf48544)
2026-04-16 16:55:26 +05:30
ruthra kumar
d49c34389b fix(test): missing repost allowed defaults
(cherry picked from commit 257865deb2)
2026-04-16 10:33:04 +00:00
mergify[bot]
ead7744f81 refactor: add category field to uom (backport #54290) (#54325)
* refactor: add category field to uom (#54290)

(cherry picked from commit e04a2e6da2)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-16 10:16:28 +00:00
mergify[bot]
b487f69b59 feat: add option to create production plan from sales order (backport #53662) (#54323)
Co-authored-by: sudarsan2001 <frankel9675@gmail.com>
Co-authored-by: Venkatesh <47534423+venkat102@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-16 15:16:34 +05:30
ruthra kumar
d74e632934 Merge pull request #54318 from frappe/mergify/bp/version-16-hotfix/pr-54172
fix: move make_dimension_in_accounting_doctypes from after_insert to on_update (backport #54172)
2026-04-16 11:29:50 +05:30
ruthra kumar
29ba701432 Merge pull request #54316 from frappe/mergify/bp/version-16-hotfix/pr-52923
fix(taxes_and_totals): apply conversion_rate to taxable_amount in get_itemised_tax (backport #52923)
2026-04-16 11:12:15 +05:30
Shllokkk
f287edd8c2 fix: move make_dimension_in_accounting_doctypes from after_insert to on_update
(cherry picked from commit ee067e6015)
2026-04-16 05:37:36 +00:00
Dharanidharan2813
d506e574d2 fix(taxes_and_totals): apply conversion_rate to taxable_amount in get_itemised_tax
(cherry picked from commit 2e577ed25b)
2026-04-16 05:22:40 +00:00
mergify[bot]
45052ce8a7 fix: reset base_rounded_total when rounded_total resets (backport #54241) (#54304)
* fix: reset base_rounded_total when rounded_total resets

(cherry picked from commit f8d278b733)

# Conflicts:
#	erpnext/controllers/tests/test_taxes_and_totals.py

* chore: spelling mistake

(cherry picked from commit e2ac476587)

* chore: resolve conflicts

---------

Co-authored-by: ljain112 <ljain112@gmail.com>
2026-04-16 10:39:17 +05:30
NaviN
4f9f90738a Merge pull request #54309 from frappe/mergify/bp/version-16-hotfix/pr-54306
fix: non-collapsible in customer quick entry (backport #54306)
2026-04-15 17:32:56 +05:30
PKSowmiya05
101f68c8e8 fix: non-collapsible in customer quick entry
(cherry picked from commit 53e120269d)
2026-04-15 11:56:54 +00:00
ruthra kumar
ffebb86846 refactor(company): don't force set service expense account on save (backport #54275) (#54305)
* refactor(company): don't force set service expense account on save

(cherry picked from commit 927f40b296)

* refactor(test): set dependant value in company master

(cherry picked from commit 299e141cee)

---------

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2026-04-15 15:55:53 +05:30
ruthra kumar
6cc560a579 refactor(test): set dependant value in company master
(cherry picked from commit 299e141cee)
2026-04-15 10:04:00 +00:00
ruthra kumar
47e78bd4b9 refactor(company): don't force set service expense account on save
(cherry picked from commit 927f40b296)
2026-04-15 10:03:59 +00:00
mergify[bot]
d7da5b047d fix: add portal user ownership check to supplier quotation (backport #54298) (#54300)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: add portal user ownership check to supplier quotation (#54298)
2026-04-15 06:13:11 +00:00
Frappe PR Bot
9312781dcd chore(release): Bumped to Version 16.14.0
# [16.14.0](https://github.com/frappe/erpnext/compare/v16.13.3...v16.14.0) (2026-04-14)

### Bug Fixes

* account change in warehouse (backport [#54182](https://github.com/frappe/erpnext/issues/54182)) ([#54205](https://github.com/frappe/erpnext/issues/54205)) ([b42e239](b42e23993d))
* add closing div tab ([7e5297a](7e5297a305))
* add drop ship logic in gross profit report (backport [#54220](https://github.com/frappe/erpnext/issues/54220)) ([#54277](https://github.com/frappe/erpnext/issues/54277)) ([bd6269b](bd6269b9e7))
* add permission validation when prompting company details for incomplete letterhead data ([f2450ea](f2450eaf60))
* add quotation print format in the list ([bb77018](bb77018f7b))
* banner to enable serial / batch feature ([dea2d21](dea2d21580))
* batch/serial should use parent's posting datetime for naming (backport [#54206](https://github.com/frappe/erpnext/issues/54206)) ([#54209](https://github.com/frappe/erpnext/issues/54209)) ([3bdac5c](3bdac5c30a))
* conflicting issue ([57e458c](57e458cc1e))
* conflicting issue ([29be73c](29be73c256))
* fetch correct expense account for operations in stock entry (backport [#54278](https://github.com/frappe/erpnext/issues/54278)) ([#54281](https://github.com/frappe/erpnext/issues/54281)) ([63ec36a](63ec36a6f9))
* handle multi uom conversion factor for manufacture entry (backport [#54285](https://github.com/frappe/erpnext/issues/54285)) ([#54286](https://github.com/frappe/erpnext/issues/54286)) ([d5143ed](d5143edcce))
* hardcoded precision causing decimal issues ([e361afb](e361afb6bc))
* inventory dimension patch (backport [#54141](https://github.com/frappe/erpnext/issues/54141)) ([#54146](https://github.com/frappe/erpnext/issues/54146)) ([f2b3ade](f2b3adec0f))
* inventory dimension patch (backport [#54147](https://github.com/frappe/erpnext/issues/54147)) ([#54149](https://github.com/frappe/erpnext/issues/54149)) ([943ddff](943ddff6aa))
* inventory dimensions should not be mandatory unnecesarily (backport [#54064](https://github.com/frappe/erpnext/issues/54064)) ([#54134](https://github.com/frappe/erpnext/issues/54134)) ([7b0d34e](7b0d34e979))
* last SLE not updated in the file ([60a1da0](60a1da0a1b))
* make operation mandatory when any sub operation row is added (backport [#54245](https://github.com/frappe/erpnext/issues/54245)) ([#54248](https://github.com/frappe/erpnext/issues/54248)) ([394eb93](394eb93677))
* **manufacturing:** check remaining qty to calculate operating cost (backport [#53983](https://github.com/frappe/erpnext/issues/53983)) ([#54128](https://github.com/frappe/erpnext/issues/54128)) ([856ba24](856ba24194))
* not able to submit the PO (backport [#54257](https://github.com/frappe/erpnext/issues/54257)) ([#54261](https://github.com/frappe/erpnext/issues/54261)) ([9d90fc4](9d90fc4a84))
* preserve asset movement field properties after save ([b7f1677](b7f1677eef))
* quality inspection item code fetch perm issue (backport [#54121](https://github.com/frappe/erpnext/issues/54121)) ([#54127](https://github.com/frappe/erpnext/issues/54127)) ([9d31712](9d317129f4))
* remove unneccessary function for serial no status updation (backport [#54191](https://github.com/frappe/erpnext/issues/54191)) ([#54197](https://github.com/frappe/erpnext/issues/54197)) ([4e828fd](4e828fd897))
* remove unused print format ([f5a9657](f5a9657a91))
* replace raw SQL with qb in get_against_jv to prevent SQL injection ([8f86a28](8f86a2879c))
* **sales invoice:** toggle Get Items From button based on is_return and POS view (backport [#52594](https://github.com/frappe/erpnext/issues/52594)) ([#54139](https://github.com/frappe/erpnext/issues/54139)) ([fe2161e](fe2161ea0c))
* **selling:** enable selling_settings creation through fixtures (backport [#54177](https://github.com/frappe/erpnext/issues/54177)) ([#54215](https://github.com/frappe/erpnext/issues/54215)) ([d2745f3](d2745f3ec9))
* set default posting time in RIV ([1086a72](1086a72373))
* Set remarks blank instead of No remarks in Sales/Purchase Invoices ([a71814a](a71814a483))
* **stock:** ignore delivery note on delivery trip on_cancel trigger (backport [#54120](https://github.com/frappe/erpnext/issues/54120)) ([#54123](https://github.com/frappe/erpnext/issues/54123)) ([864a7fd](864a7fdab5))
* **stock:** remove float precision to fix precision issue (backport [#54284](https://github.com/frappe/erpnext/issues/54284)) ([#54289](https://github.com/frappe/erpnext/issues/54289)) ([6e3549d](6e3549d185))
* **stock:** update bin to zero when no previous sle exists (backport [#54236](https://github.com/frappe/erpnext/issues/54236)) ([#54264](https://github.com/frappe/erpnext/issues/54264)) ([2c292f4](2c292f4770))
* **test:** Remove usage of No remark as remark in tests ([6993255](699325506f))
* timer not showing in job card (backport [#53839](https://github.com/frappe/erpnext/issues/53839)) ([#54212](https://github.com/frappe/erpnext/issues/54212)) ([7d8f59e](7d8f59eb0a))
* update return value in workstation list view indicator (backport [#54198](https://github.com/frappe/erpnext/issues/54198)) ([#54201](https://github.com/frappe/erpnext/issues/54201)) ([22774fd](22774fd810))
* update_nsm only in warehouse creation ([#54165](https://github.com/frappe/erpnext/issues/54165)) ([abb896e](abb896ecf1))
* wrong operation time calculation (backport [#53796](https://github.com/frappe/erpnext/issues/53796)) ([#54274](https://github.com/frappe/erpnext/issues/54274)) ([d0bff47](d0bff47272))

### Features

* Allowing operation level quality inspection check in BOM (backport [#53859](https://github.com/frappe/erpnext/issues/53859)) ([#54144](https://github.com/frappe/erpnext/issues/54144)) ([233dc7c](233dc7c07b))
* default print format for Quotation ([a8769bf](a8769bfb77))
2026-04-14 18:28:38 +00:00
diptanilsaha
e65596fc0f Merge pull request #54283 from frappe/version-16-hotfix 2026-04-14 23:57:09 +05:30
rohitwaghchaure
bd50a0f318 Merge pull request #54294 from frappe/mergify/bp/version-16-hotfix/pr-54279
fix: banner to enable serial / batch feature (backport #54279)
2026-04-14 23:37:38 +05:30
Rohit Waghchaure
dea2d21580 fix: banner to enable serial / batch feature
(cherry picked from commit 08e8cc8575)
2026-04-14 17:45:19 +00:00
mergify[bot]
2353bcc3fc Revert "fix: sync paid and received amount" (backport #54238) (#54293)
Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com>
fix: sync paid and received amount" (#54238)
2026-04-14 22:27:15 +05:30
mergify[bot]
6e3549d185 fix(stock): remove float precision to fix precision issue (backport #54284) (#54289)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): remove float precision to fix precision issue (#54284)
2026-04-14 11:36:24 +00:00
mergify[bot]
d5143edcce fix: handle multi uom conversion factor for manufacture entry (backport #54285) (#54286)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: handle multi uom conversion factor for manufacture entry (#54285)
2026-04-14 16:22:14 +05:30
mergify[bot]
63ec36a6f9 fix: fetch correct expense account for operations in stock entry (backport #54278) (#54281)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: fetch correct expense account for operations in stock entry (#54278)
2026-04-14 16:08:21 +05:30
mergify[bot]
bd6269b9e7 fix: add drop ship logic in gross profit report (backport #54220) (#54277)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: add drop ship logic in gross profit report (#54220)
2026-04-14 09:59:16 +00:00
mergify[bot]
d0bff47272 fix: wrong operation time calculation (backport #53796) (#54274)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: wrong operation time calculation (#53796)
2026-04-14 09:35:00 +00:00
mergify[bot]
9d90fc4a84 fix: not able to submit the PO (backport #54257) (#54261)
Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
2026-04-13 21:44:12 +05:30
mergify[bot]
2c292f4770 fix(stock): update bin to zero when no previous sle exists (backport #54236) (#54264)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): update bin to zero when no previous sle exists (#54236)
2026-04-13 15:57:31 +00:00
mergify[bot]
394eb93677 fix: make operation mandatory when any sub operation row is added (backport #54245) (#54248)
Co-authored-by: Sudarshan <73628063+sudarsan2001@users.noreply.github.com>
fix: make operation mandatory when any sub operation row is added (#54245)
2026-04-13 21:06:01 +05:30
Khushi Rawat
fbb3ccbc28 Merge pull request #54251 from frappe/mergify/bp/version-16-hotfix/pr-54244
fix: replace raw SQL with qb in get_against_jv to prevent SQL injection (backport #54244)
2026-04-13 16:12:43 +05:30
Nishka Gosalia
708b59b519 Merge pull request #54252 from frappe/mergify/bp/version-16-hotfix/pr-54249 2026-04-13 16:10:39 +05:30
Khushi Rawat
de08a972b6 Merge pull request #53745 from frappe/mergify/bp/version-16-hotfix/pr-53588
feat: default print format for Quotation (backport #53588)
2026-04-13 16:04:20 +05:30
Khushi Rawat
512a35a0ab Merge pull request #54253 from frappe/mergify/bp/version-16-hotfix/pr-54190
fix: add permission validation when prompting company details for incomplete letterhead data (backport #54190)
2026-04-13 15:58:05 +05:30
Khushi Rawat
71a563428d Merge branch 'version-16-hotfix' into mergify/bp/version-16-hotfix/pr-53588 2026-04-13 15:41:39 +05:30
khushi8112
57e458cc1e fix: conflicting issue 2026-04-13 15:30:56 +05:30
khushi8112
f2450eaf60 fix: add permission validation when prompting company details for incomplete letterhead data
(cherry picked from commit 256a258b38)
2026-04-13 09:55:12 +00:00
nishkagosalia
847919bf4e refactor(UX): Stock ledger serial and batch number fields
(cherry picked from commit 3e2b40ad4a)
2026-04-13 09:51:46 +00:00
khushi8112
29be73c256 fix: conflicting issue 2026-04-13 15:21:39 +05:30
khushi8112
8f86a2879c fix: replace raw SQL with qb in get_against_jv to prevent SQL injection
(cherry picked from commit c133f7156d)

# Conflicts:
#	erpnext/accounts/doctype/journal_entry/journal_entry.py
2026-04-13 09:44:19 +00:00
ruthra kumar
eb80a3704a Merge pull request #54239 from frappe/mergify/bp/version-16-hotfix/pr-54237
refactor: boldface for group accounts in financial statements (backport #54237)
2026-04-13 12:02:19 +05:30
ruthra kumar
bfe58b2d68 refactor: boldface for group accounts in financial statements
(cherry picked from commit 545e9e069a)
2026-04-13 06:11:05 +00:00
MochaMind
39848ffb1e chore: update POT file (#54229) 2026-04-12 10:10:15 +00:00
mergify[bot]
d2745f3ec9 fix(selling): enable selling_settings creation through fixtures (backport #54177) (#54215)
Co-authored-by: mgicking-bmi <mgicking@bmi.com>
Fix(selling): enable selling_settings creation through fixtures (#54177)
2026-04-11 05:32:11 +00:00
mergify[bot]
3bdac5c30a fix: batch/serial should use parent's posting datetime for naming (backport #54206) (#54209) 2026-04-11 05:06:40 +00:00
Frappe PR Bot
a1c43ae913 chore(release): Bumped to Version 16.13.3
## [16.13.3](https://github.com/frappe/erpnext/compare/v16.13.2...v16.13.3) (2026-04-11)

### Bug Fixes

* timer not showing in job card (backport [#53839](https://github.com/frappe/erpnext/issues/53839)) (backport [#54212](https://github.com/frappe/erpnext/issues/54212)) ([#54213](https://github.com/frappe/erpnext/issues/54213)) ([93ede5b](93ede5b764))
2026-04-11 05:05:14 +00:00
mergify[bot]
93ede5b764 fix: timer not showing in job card (backport #53839) (backport #54212) (#54213)
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
fix: timer not showing in job card (backport #53839) (#54212)
2026-04-11 10:33:45 +05:30
mergify[bot]
7d8f59eb0a fix: timer not showing in job card (backport #53839) (#54212)
Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
2026-04-11 10:32:32 +05:30
mergify[bot]
66fdd061e7 Fix(bom): refetch the rate of item when 'source_from_supplier' is updated (backport #54187) (#54208)
Co-authored-by: Sambhav Saxena <76242518+sambhavsaxena@users.noreply.github.com>
Fix(bom): refetch the rate of item when 'source_from_supplier' is updated (#54187)
2026-04-10 23:44:42 +05:30
mergify[bot]
b42e23993d fix: account change in warehouse (backport #54182) (#54205)
Co-authored-by: nishkagosalia <nishka.gosalia@gmail.com>
2026-04-10 20:32:45 +05:30
mergify[bot]
22774fd810 fix: update return value in workstation list view indicator (backport #54198) (#54201)
Co-authored-by: Praveenkumar Dhanasekar <164200710+Praveenku-mar@users.noreply.github.com>
fix: update return value in workstation list view indicator (#54198)
2026-04-10 11:20:49 +00:00
mergify[bot]
4e828fd897 fix: remove unneccessary function for serial no status updation (backport #54191) (#54197)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: remove unneccessary function for serial no status updation (#54191)
2026-04-10 10:58:57 +00:00
Nishka Gosalia
3cf90e804d Merge pull request #54180 from frappe/revert-54171-mergify/bp/version-16-hotfix/pr-54165
fix: update_nsm only in warehouse creation (backport #54165)"
2026-04-09 18:31:39 +05:30
Khushi Rawat
1f5d0c58f2 Merge pull request #54166 from frappe/mergify/bp/version-16-hotfix/pr-54142
fix: Set remarks blank instead of No remarks in Sales/Purchase Invoices (backport #54142)
2026-04-09 18:16:04 +05:30
Nishka Gosalia
720a79588d Revert "fix: update_nsm only in warehouse creation (backport #54165)" 2026-04-09 18:13:39 +05:30
Nishka Gosalia
bc03f2399a Merge pull request #54171 from frappe/mergify/bp/version-16-hotfix/pr-54165
fix: update_nsm only in warehouse creation (backport #54165)
2026-04-09 16:29:24 +05:30
Nishka Gosalia
abb896ecf1 fix: update_nsm only in warehouse creation (#54165)
(cherry picked from commit b0e3fa3979)
2026-04-09 10:28:32 +00:00
Frappe PR Bot
c98ded52b2 chore(release): Bumped to Version 16.13.2
## [16.13.2](https://github.com/frappe/erpnext/compare/v16.13.1...v16.13.2) (2026-04-09)

### Bug Fixes

* set default posting time in RIV ([3ce6dcc](3ce6dcc7a7))
2026-04-09 09:59:33 +00:00
rohitwaghchaure
03474c0589 Merge pull request #54164 from frappe/mergify/bp/version-16/pr-54163
fix: set default posting time in RIV (backport #54161) (backport #54163)
2026-04-09 15:27:59 +05:30
khushi8112
699325506f fix(test): Remove usage of No remark as remark in tests
(cherry picked from commit 56416d18d3)
2026-04-09 09:24:51 +00:00
khushi8112
a71814a483 fix: Set remarks blank instead of No remarks in Sales/Purchase Invoices
(cherry picked from commit 2515bf3aff)
2026-04-09 09:24:50 +00:00
Rohit Waghchaure
3ce6dcc7a7 fix: set default posting time in RIV
(cherry picked from commit a7ece65536)
(cherry picked from commit 1086a72373)
2026-04-09 08:55:10 +00:00
rohitwaghchaure
93def4dd13 Merge pull request #54163 from frappe/mergify/bp/version-16-hotfix/pr-54161
fix: set default posting time in RIV (backport #54161)
2026-04-09 14:24:33 +05:30
Rohit Waghchaure
1086a72373 fix: set default posting time in RIV
(cherry picked from commit a7ece65536)
2026-04-09 08:27:15 +00:00
Aarol D'Souza
379a1da254 Merge pull request #54158 from frappe/mergify/bp/version-16-hotfix/pr-54129
refactor: update reset password method name (backport #54129)
2026-04-09 12:32:54 +05:30
mergify[bot]
6ec64216ce Merge branch 'version-16-hotfix' into mergify/bp/version-16-hotfix/pr-54129 2026-04-09 06:42:41 +00:00
mergify[bot]
fe2161ea0c fix(sales invoice): toggle Get Items From button based on is_return and POS view (backport #52594) (#54139)
Co-authored-by: NaviN <118178330+Navin-S-R@users.noreply.github.com>
Co-authored-by: Navin-S-R <navin@aerele.in>
fix(sales invoice): toggle Get Items From button based on is_return and POS view (#52594)
2026-04-09 11:58:02 +05:30
AarDG10
21cf83b915 refactor: update reset password method name
(cherry picked from commit c4d74483e1)
2026-04-09 06:23:58 +00:00
Frappe PR Bot
62448d98de chore(release): Bumped to Version 16.13.1
## [16.13.1](https://github.com/frappe/erpnext/compare/v16.13.0...v16.13.1) (2026-04-09)

### Bug Fixes

* last SLE not updated in the file ([96446ed](96446ed78d))
2026-04-09 04:50:03 +00:00
rohitwaghchaure
3eb58b8d36 Merge pull request #54152 from frappe/mergify/bp/version-16/pr-54151
fix: last SLE not updated in the file (backport #54132) (backport #54151)
2026-04-09 10:18:32 +05:30
mergify[bot]
943ddff6aa fix: inventory dimension patch (backport #54147) (#54149)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: inventory dimension patch (#54147)
2026-04-09 09:46:08 +05:30
Rohit Waghchaure
96446ed78d fix: last SLE not updated in the file
(cherry picked from commit 38ed425ee2)
(cherry picked from commit 60a1da0a1b)
2026-04-09 03:38:10 +00:00
rohitwaghchaure
5866fc6cb4 Merge pull request #54151 from frappe/mergify/bp/version-16-hotfix/pr-54132
fix: last SLE not updated in the file (backport #54132)
2026-04-09 09:07:02 +05:30
Rohit Waghchaure
60a1da0a1b fix: last SLE not updated in the file
(cherry picked from commit 38ed425ee2)
2026-04-09 02:53:27 +00:00
mergify[bot]
f2b3adec0f fix: inventory dimension patch (backport #54141) (#54146)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: inventory dimension patch (#54141)
2026-04-09 02:09:46 +00:00
mergify[bot]
233dc7c07b feat: Allowing operation level quality inspection check in BOM (backport #53859) (#54144)
Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-09 02:02:35 +00:00
mergify[bot]
526c8d0418 refactor(lost_opportunity_report): replaced raw_sql with query builder (backport #54136) (#54140)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-04-08 18:30:35 +00:00
mergify[bot]
7b0d34e979 fix: inventory dimensions should not be mandatory unnecesarily (backport #54064) (#54134)
* fix: inventory dimensions should not be mandatory unnecesarily (#54064)

(cherry picked from commit 6e44b8913e)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-04-08 14:43:01 +00:00
mergify[bot]
856ba24194 fix(manufacturing): check remaining qty to calculate operating cost (backport #53983) (#54128)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(manufacturing): check remaining qty to calculate operating cost (#53983)
2026-04-08 12:15:28 +00:00
mergify[bot]
9d317129f4 fix: quality inspection item code fetch perm issue (backport #54121) (#54127)
Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: quality inspection item code fetch perm issue (#54121)
2026-04-08 12:14:41 +00:00
mergify[bot]
864a7fdab5 fix(stock): ignore delivery note on delivery trip on_cancel trigger (backport #54120) (#54123)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): ignore delivery note on delivery trip on_cancel trigger (#54120)
2026-04-08 17:18:35 +05:30
rohitwaghchaure
0bdb7e7894 Merge pull request #54119 from frappe/mergify/bp/version-16-hotfix/pr-54102
fix: hardcoded precision causing decimal issues (backport #54102)
2026-04-08 14:04:23 +05:30
Rohit Waghchaure
e361afb6bc fix: hardcoded precision causing decimal issues
(cherry picked from commit 90fd6f2e40)
2026-04-08 06:50:17 +00:00
Khushi Rawat
7b154c3069 Merge pull request #54117 from frappe/mergify/bp/version-16-hotfix/pr-54103
fix: preserve asset movement field properties after save (backport #54103)
2026-04-08 12:15:55 +05:30
ravibharathi656
b7f1677eef fix: preserve asset movement field properties after save
(cherry picked from commit 4a004a2a82)
2026-04-08 06:28:27 +00:00
Frappe PR Bot
1134e25bb6 chore(release): Bumped to Version 16.13.0
# [16.13.0](https://github.com/frappe/erpnext/compare/v16.12.0...v16.13.0) (2026-04-07)

### Bug Fixes

* add support to fetch items based on manufacture stock entry; fix how it's done from work order ([4232640](4232640a8b))
* add tax_id handling in Tax Withholding Entry (backport [#53598](https://github.com/frappe/erpnext/issues/53598)) ([#54081](https://github.com/frappe/erpnext/issues/54081)) ([dc58754](dc58754a60))
* auto-set source_stock_entry ([eead8d6](eead8d6d8c))
* avg stock entries for disassembly from WO ([0ceb084](0ceb084104))
* conflicts ([66ee208](66ee208cb2))
* correct warehouse preference for disassemble ([919cbd5](919cbd5c02))
* create source_stock_entry to refer to original manufacturing entry ([b91af5b](b91af5b2b9))
* custom button to disassemble manufactured stock entry with work order ([84a063a](84a063a9bf))
* dif_inward_from_outward_workspace_sidebar (backport [#54083](https://github.com/frappe/erpnext/issues/54083)) ([#54088](https://github.com/frappe/erpnext/issues/54088)) ([e6722c8](e6722c84fa))
* disassembly prompt with source stock entry field ([c9d03d0](c9d03d049c))
* divide sub-assembly cost by qty to get per-unit rate in BOM Creator (backport [#54090](https://github.com/frappe/erpnext/issues/54090)) ([#54091](https://github.com/frappe/erpnext/issues/54091)) ([454271a](454271ad68))
* do not repost GL if no change in valuation ([89e3e3c](89e3e3c59e))
* do not show inv dimension unnecessarily in stock entry (backport [#53946](https://github.com/frappe/erpnext/issues/53946)) ([#53951](https://github.com/frappe/erpnext/issues/53951)) ([573a1a0](573a1a0dcb))
* dynamic labels on invoice type change ([4705f53](4705f53d2c))
* ensure accurate rounding for item-wise tax and taxable amounts ([c4c76cc](c4c76cc1b2))
* GL entries for different exchange rate in the purchase invoice ([5719992](5719992cda))
* handle disassembly for secondary / scrap items ([d50279b](d50279b718))
* hide fields related to track Semi-Finished Goods if feature has disabled ([5a7d0d2](5a7d0d2765))
* include rejected qty in tax (purchase receipt) (backport [#53624](https://github.com/frappe/erpnext/issues/53624)) ([#53972](https://github.com/frappe/erpnext/issues/53972)) ([e230f72](e230f72e0b))
* manufacture entry with group_by support ([31ac46a](31ac46ae4c))
* **manufacturing:** handle null cur_dialog in BOM work order dialog (backport [#54011](https://github.com/frappe/erpnext/issues/54011)) ([#54015](https://github.com/frappe/erpnext/issues/54015)) ([01610b2](01610b2fa7))
* Party Field only visibile when party type selected ([f42a1e8](f42a1e8a14))
* prevent selection of group type customer group in customer master ([04cced2](04cced2fb5))
* print hide unnecessary fields ([cd98312](cd98312083))
* process loss with bom path disassembly ([0a257ea](0a257ea63d))
* **promotional_scheme:** toggle enable state between Buying and Selli… (backport [#54110](https://github.com/frappe/erpnext/issues/54110)) ([#54112](https://github.com/frappe/erpnext/issues/54112)) ([4a6fe47](4a6fe477d4))
* rejected serial no field showing even if serial / batch feature not enabled ([2c81f79](2c81f79df7))
* remove null from link_filters ([21f36f5](21f36f5c21))
* remove reference in serial/batch when document is cancelled (backport [#53979](https://github.com/frappe/erpnext/issues/53979)) ([#53989](https://github.com/frappe/erpnext/issues/53989)) ([5aaca83](5aaca83fe4))
* remove title field from purchase receipt (backport [#54051](https://github.com/frappe/erpnext/issues/54051)) ([#54065](https://github.com/frappe/erpnext/issues/54065)) ([84382db](84382db5ca))
* remove unnecessary param, and use value from self ([7bef954](7bef9542d4))
* resolve user permission error on status change by updating user … (backport [#54033](https://github.com/frappe/erpnext/issues/54033)) ([#54060](https://github.com/frappe/erpnext/issues/54060)) ([62b83ca](62b83cacce))
* screen freezes if consumed qty set in SCR ([bd67ef8](bd67ef8d26))
* set bom details on disassembly; abs batch qty ([fb1d865](fb1d865e9b))
* set serial and batch from source stock entry - on disassemble ([ff104ed](ff104edf12))
* set_query for source stock entry ([5f67ef7](5f67ef70bb))
* show current stock qty in Stock Entry PDF (backport [#53761](https://github.com/frappe/erpnext/issues/53761)) ([#54032](https://github.com/frappe/erpnext/issues/54032)) ([ab08162](ab08162f34))
* skip discount amount validation when not saving ([8941699](8941699a34))
* skip validate_stock_accounts in Journal Entry when perpetual inventory is disabled (backport [#53554](https://github.com/frappe/erpnext/issues/53554)) ([#53558](https://github.com/frappe/erpnext/issues/53558)) ([7062b71](7062b7153e))
* **stock:** update stock queue in SABE for return entries ([fc5a04d](fc5a04db2e))
* support creating disassembly (without link of WO) ([1c4b2a7](1c4b2a7148))
* sync paid and received amount (backport [#53039](https://github.com/frappe/erpnext/issues/53039)) ([#54108](https://github.com/frappe/erpnext/issues/54108)) ([df3f242](df3f242331))
* task gantt popup text not visible in light theme (backport [#53882](https://github.com/frappe/erpnext/issues/53882)) ([#54094](https://github.com/frappe/erpnext/issues/54094)) ([995a29e](995a29e3e1))
* **taxes:** improve tax calculation accuracy and update test assertions ([6ad5e89](6ad5e89607))
* **taxes:** increase rounding threshold for tax breakup calculations ([3592637](3592637b5c))
* **test:** do not use is_group enabled customer group in test ([8674aaf](8674aafc86))
* **tests:** update item code and quantity in tax detail test case ([6689b17](6689b17b88))
* transactions where update stock is 0 should not create SLEs (backport [#54035](https://github.com/frappe/erpnext/issues/54035)) ([#54077](https://github.com/frappe/erpnext/issues/54077)) ([af81ed8](af81ed874b))
* update min date based on transaction_date (backport [#53803](https://github.com/frappe/erpnext/issues/53803)) ([#54025](https://github.com/frappe/erpnext/issues/54025)) ([bc86e2c](bc86e2c1f2))
* use get_value ([e4eb88d](e4eb88d80b))
* **ux:** refresh grid to correctly persist the state of fields ([273caa3](273caa38d9))
* validate qty that can be disassembled from source stock entry. ([1237f9a](1237f9a0b1))
* validate work order consistency in stock entry ([b030eea](b030eeafb8))
* **warehouse_capacity_dashboard:** removed `escape` from template (backport [#53907](https://github.com/frappe/erpnext/issues/53907)) ([#53909](https://github.com/frappe/erpnext/issues/53909)) ([a478fb7](a478fb7131))

### Features

* co product by product support ([#52979](https://github.com/frappe/erpnext/issues/52979)) ([#53975](https://github.com/frappe/erpnext/issues/53975)) ([8db397b](8db397bdae))
* croatian_address_template (backport [#53888](https://github.com/frappe/erpnext/issues/53888)) ([#54058](https://github.com/frappe/erpnext/issues/54058)) ([ff26265](ff262655bb))
* **Payment Request:** Added a toggle for using the payment schedule (backport [#53922](https://github.com/frappe/erpnext/issues/53922)) ([#53928](https://github.com/frappe/erpnext/issues/53928)) ([5ade905](5ade905ee8))

### Performance Improvements

* optimize account balance data fetching for Chart Of Accounts (backport [#53044](https://github.com/frappe/erpnext/issues/53044)) ([#53802](https://github.com/frappe/erpnext/issues/53802)) ([093ca87](093ca8745d))
2026-04-07 17:58:52 +00:00
diptanilsaha
aaea4dfcc1 Merge pull request #54100 from frappe/version-16-hotfix 2026-04-07 23:05:35 +05:30
mergify[bot]
7b91566435 refactor: financial report template enhancements (backport #52687) (#54113)
Co-authored-by: Abdeali Chharchhodawala <99460106+Abdeali099@users.noreply.github.com>
2026-04-07 17:10:42 +00:00
mergify[bot]
4a6fe477d4 fix(promotional_scheme): toggle enable state between Buying and Selli… (backport #54110) (#54112)
Co-authored-by: Ahmed AbuKhatwa <82771130+AhmedAbokhatwa@users.noreply.github.com>
Co-authored-by: AhmedAbukhatwa <Ahmedabukhatwa1@gmail.com>
fix(promotional_scheme): toggle enable state between Buying and Selli… (#54110)
2026-04-07 21:55:18 +05:30
mergify[bot]
df3f242331 fix: sync paid and received amount (backport #53039) (#54108)
Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com>
fix: sync paid and received amount (#53039)
2026-04-07 13:06:39 +00:00
mergify[bot]
7062b7153e fix: skip validate_stock_accounts in Journal Entry when perpetual inventory is disabled (backport #53554) (#53558)
Co-authored-by: Saeed Kola <mohammedsaeedk@gmail.com>
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-04-07 12:05:33 +00:00
mergify[bot]
093ca8745d perf: optimize account balance data fetching for Chart Of Accounts (backport #53044) (#53802)
Co-authored-by: Shllokkk <140623894+Shllokkk@users.noreply.github.com>
2026-04-07 16:20:17 +05:30
Smit Vora
52ac36ef02 Merge pull request #54098 from frappe/mergify/bp/version-16-hotfix/pr-53964
fix: consistently disassemble based on source  > SE / WO / BOM (backport #53964)
2026-04-07 15:20:29 +05:30
Smit Vora
9e83badbf5 chore: resolve conflicts 2026-04-07 14:57:56 +05:30
Smit Vora
7bef9542d4 fix: remove unnecessary param, and use value from self
(cherry picked from commit 98dfd64f63)
2026-04-07 08:48:19 +00:00
Smit Vora
6cebea314d test: enhance tests as per review comments
(cherry picked from commit f13d37fbf9)
2026-04-07 08:48:19 +00:00
Smit Vora
d4fde552f4 test: maintain sufficient stock for scrap item
(cherry picked from commit b892139342)
2026-04-07 08:48:19 +00:00
Smit Vora
fb1d865e9b fix: set bom details on disassembly; abs batch qty
(cherry picked from commit ab1fc22431)
2026-04-07 08:48:18 +00:00
Smit Vora
0a257ea63d fix: process loss with bom path disassembly
(cherry picked from commit 93ad48bc1b)
2026-04-07 08:48:18 +00:00
Smit Vora
b030eeafb8 fix: validate work order consistency in stock entry
(cherry picked from commit ea392b2009)
2026-04-07 08:48:18 +00:00
vorasmit
e4eb88d80b fix: use get_value
(cherry picked from commit a71e8bb116)
2026-04-07 08:48:17 +00:00
vorasmit
0ceb084104 fix: avg stock entries for disassembly from WO
(cherry picked from commit 71fd18bdf9)
2026-04-07 08:48:17 +00:00
vorasmit
31ac46ae4c fix: manufacture entry with group_by support
(cherry picked from commit 3cf1ce8360)
2026-04-07 08:48:16 +00:00
Smit Vora
901e626729 test: disassembly for scrap / secondary item
(cherry picked from commit a6d41151ff)
2026-04-07 08:48:16 +00:00
Smit Vora
d50279b718 fix: handle disassembly for secondary / scrap items
(cherry picked from commit 2be8313819)
2026-04-07 08:48:16 +00:00
Smit Vora
e1a4d9fab4 test: disassembly of items with batch and serial numbers
(cherry picked from commit 1693698fed)
2026-04-07 08:48:15 +00:00
Smit Vora
8444778f74 test: additional items in stock entry considered with disassembly
(cherry picked from commit d32977e3a9)
2026-04-07 08:48:15 +00:00
Smit Vora
4c0ebee15b test: disassemble with source stock entry reference
(cherry picked from commit 6988e2cbbc)
2026-04-07 08:48:15 +00:00
Smit Vora
195a10efb3 test: disassembly from wo
(cherry picked from commit 342a14d340)
2026-04-07 08:48:14 +00:00
Smit Vora
ff104edf12 fix: set serial and batch from source stock entry - on disassemble
(cherry picked from commit 13b019ab8e)
2026-04-07 08:48:14 +00:00
Smit Vora
919cbd5c02 fix: correct warehouse preference for disassemble
(cherry picked from commit d3d6b5c660)
2026-04-07 08:48:14 +00:00
Smit Vora
eead8d6d8c fix: auto-set source_stock_entry
(cherry picked from commit 2e4e8bcaa7)
2026-04-07 08:48:13 +00:00
Smit Vora
4232640a8b fix: add support to fetch items based on manufacture stock entry; fix how it's done from work order
(cherry picked from commit 1ed0124ad7)
2026-04-07 08:48:13 +00:00
Smit Vora
1237f9a0b1 fix: validate qty that can be disassembled from source stock entry.
(cherry picked from commit 6394dead72)

# Conflicts:
#	erpnext/manufacturing/doctype/work_order/work_order.py
2026-04-07 08:48:13 +00:00
Smit Vora
1c4b2a7148 fix: support creating disassembly (without link of WO)
(cherry picked from commit dba82720b6)
2026-04-07 08:48:13 +00:00
Smit Vora
84a063a9bf fix: custom button to disassemble manufactured stock entry with work order
(cherry picked from commit b64f86148c)
2026-04-07 08:48:12 +00:00
Smit Vora
5f67ef70bb fix: set_query for source stock entry
(cherry picked from commit b47dfacb3e)
2026-04-07 08:48:12 +00:00
Smit Vora
c9d03d049c fix: disassembly prompt with source stock entry field
(cherry picked from commit 68e97808c5)

# Conflicts:
#	erpnext/manufacturing/doctype/work_order/work_order.py
2026-04-07 08:48:12 +00:00
Smit Vora
b91af5b2b9 fix: create source_stock_entry to refer to original manufacturing entry
(cherry picked from commit d4baa9a74a)
2026-04-07 08:48:11 +00:00
Khushi Rawat
ae89407840 Merge pull request #54095 from frappe/mergify/bp/version-16-hotfix/pr-53394
fix: remove null from link_filters (backport #53394)
2026-04-07 12:57:04 +05:30
ervishnucs
21f36f5c21 fix: remove null from link_filters
(cherry picked from commit a518a735f3)
2026-04-07 07:00:44 +00:00
mergify[bot]
995a29e3e1 fix: task gantt popup text not visible in light theme (backport #53882) (#54094)
Co-authored-by: Sakthivel Murugan S <129778327+ssakthivelmurugan@users.noreply.github.com>
fix: task gantt popup text not visible in light theme (#53882)
2026-04-07 06:40:45 +00:00
mergify[bot]
454271ad68 fix: divide sub-assembly cost by qty to get per-unit rate in BOM Creator (backport #54090) (#54091) 2026-04-07 05:55:55 +00:00
mergify[bot]
ff262655bb feat: croatian_address_template (backport #53888) (#54058)
Co-authored-by: mahsem <137205921+mahsem@users.noreply.github.com>
2026-04-07 10:25:44 +05:30
mergify[bot]
62b83cacce fix: resolve user permission error on status change by updating user … (backport #54033) (#54060)
Co-authored-by: Krishna Shirsath <shirsathkrishna19@gmail.com>
2026-04-07 10:25:13 +05:30
mergify[bot]
e6722c84fa fix: dif_inward_from_outward_workspace_sidebar (backport #54083) (#54088)
Co-authored-by: mahsem <137205921+mahsem@users.noreply.github.com>
fix: dif_inward_from_outward_workspace_sidebar (#54083)
2026-04-07 04:14:45 +00:00
mergify[bot]
dc58754a60 fix: add tax_id handling in Tax Withholding Entry (backport #53598) (#54081)
Co-authored-by: Lakshit Jain <ljain112@gmail.com>
fix: add tax_id handling in Tax Withholding Entry (#53598)
2026-04-06 17:18:45 +00:00
mergify[bot]
af81ed874b fix: transactions where update stock is 0 should not create SLEs (backport #54035) (#54077)
Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
fix: transactions where update stock is 0 should not create SLEs (#54035)
2026-04-06 15:17:11 +00:00
Smit Vora
14868ab98f Merge pull request #54070 from frappe/mergify/bp/version-16-hotfix/pr-53973
fix(ux): refresh grid to correctly persist the state of fields (backport #53973)
2026-04-06 19:38:55 +05:30
rohitwaghchaure
957a5e1a65 Merge pull request #54069 from frappe/mergify/bp/version-16-hotfix/pr-54050
fix: GL entries for different exchange rate in the purchase invoice (backport #54050)
2026-04-06 17:48:45 +05:30
mergify[bot]
84382db5ca fix: remove title field from purchase receipt (backport #54051) (#54065)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: remove title field from purchase receipt (#54051)
2026-04-06 12:00:04 +00:00
Smit Vora
273caa38d9 fix(ux): refresh grid to correctly persist the state of fields
(cherry picked from commit da778edf48)
2026-04-06 11:56:42 +00:00
Rohit Waghchaure
5719992cda fix: GL entries for different exchange rate in the purchase invoice
(cherry picked from commit a953709640)
2026-04-06 11:53:06 +00:00
Khushi Rawat
2de51be5ae Merge pull request #54062 from frappe/mergify/bp/version-16-hotfix/pr-54052
fix: print hide unnecessary fields (backport #54052)
2026-04-06 16:59:08 +05:30
Khushi Rawat
66ee208cb2 fix: conflicts 2026-04-06 16:19:53 +05:30
khushi8112
cd98312083 fix: print hide unnecessary fields
(cherry picked from commit 8f83616b60)

# Conflicts:
#	erpnext/selling/doctype/sales_order_item/sales_order_item.json
2026-04-06 10:43:49 +00:00
diptanilsaha
7c34cb1134 Merge pull request #54047 from frappe/mergify/bp/version-16-hotfix/pr-54042
fix: skip discount amount validation when not saving (backport #54042)
2026-04-06 13:44:31 +05:30
Sagar Vora
9bc0e3b2ce test: add test for discount amount on partial purchase receipt
Co-authored-by: ravibharathi656 <131471282+ravibharathi656@users.noreply.github.com>
(cherry picked from commit 135cb5fd67)
2026-04-06 07:31:09 +00:00
Sagar Vora
8941699a34 fix: skip discount amount validation when not saving
(cherry picked from commit 0975583388)
2026-04-06 07:31:08 +00:00
rohitwaghchaure
fe6a7ee7ff Merge pull request #54029 from frappe/mergify/bp/version-16-hotfix/pr-54004
fix: do not repost GL if no change in valuation (backport #54004)
2026-04-06 11:47:35 +05:30
mergify[bot]
ab08162f34 fix: show current stock qty in Stock Entry PDF (backport #53761) (#54032) 2026-04-06 05:42:53 +00:00
Rohit Waghchaure
89e3e3c59e fix: do not repost GL if no change in valuation
(cherry picked from commit bb53cce228)
2026-04-06 03:38:41 +00:00
rohitwaghchaure
5c3daee1bb Merge pull request #54010 from frappe/mergify/bp/version-16-hotfix/pr-53994
fix(stock): update stock queue in SABE for return entries (backport #53994)
2026-04-06 09:07:08 +05:30
rohitwaghchaure
baa714b00f Merge pull request #54016 from frappe/mergify/bp/version-16-hotfix/pr-54005
fix: screen freezes if consumed qty set in SCR (backport #54005)
2026-04-05 22:55:44 +05:30
mergify[bot]
bc86e2c1f2 fix: update min date based on transaction_date (backport #53803) (#54025)
Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com>
fix: update min date based on transaction_date (#53803)
2026-04-05 21:16:31 +05:30
MochaMind
1c0956c6e2 chore: update POT file (#54017) 2026-04-05 16:02:11 +02:00
Rohit Waghchaure
bd67ef8d26 fix: screen freezes if consumed qty set in SCR
(cherry picked from commit dd7be2b370)
2026-04-05 07:50:38 +00:00
mergify[bot]
01610b2fa7 fix(manufacturing): handle null cur_dialog in BOM work order dialog (backport #54011) (#54015) 2026-04-05 07:19:23 +00:00
kavin-114
d3f1bfc628 test(stock): add unit test to update stock queue for return
(cherry picked from commit e537896df8)
2026-04-04 21:17:30 +00:00
kavin-114
fc5a04db2e fix(stock): update stock queue in SABE for return entries
(cherry picked from commit 0af8077bcc)
2026-04-04 21:17:30 +00:00
rohitwaghchaure
fddf9f381b Merge pull request #53980 from frappe/mergify/bp/version-16-hotfix/pr-53963
fix: hide fields related to track Semi-Finished Goods if feature has disabled (backport #53963)
2026-04-02 18:03:35 +05:30
mergify[bot]
5aaca83fe4 fix: remove reference in serial/batch when document is cancelled (backport #53979) (#53989) 2026-04-02 08:11:20 +00:00
Rohit Waghchaure
5a7d0d2765 fix: hide fields related to track Semi-Finished Goods if feature has disabled
(cherry picked from commit 399faf0ced)
2026-04-01 11:08:10 +00:00
Lakshit Jain
53fc0beae5 Merge pull request #53969 from frappe/mergify/bp/version-16-hotfix/pr-53961
fix: ensure accurate rounding for item-wise tax and taxable amounts (backport #53961)
2026-04-01 14:43:15 +05:30
Mihir Kandoi
8db397bdae feat: co product by product support (#52979) (#53975) 2026-04-01 07:41:39 +00:00
mergify[bot]
e230f72e0b fix: include rejected qty in tax (purchase receipt) (backport #53624) (#53972)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: include rejected qty in tax (purchase receipt) (#53624)
2026-03-31 15:51:58 +00:00
ljain112
9386c1328a test: improve test case
(cherry picked from commit b73b161cbe)
2026-03-31 14:21:12 +00:00
ljain112
c4c76cc1b2 fix: ensure accurate rounding for item-wise tax and taxable amounts
(cherry picked from commit 9b37f2d95c)
2026-03-31 14:21:12 +00:00
Khushi Rawat
240d27274b Merge pull request #53957 from frappe/mergify/bp/version-16-hotfix/pr-53811
fix: prevent selection of group type customer group in customer master (backport #53811)
2026-03-31 18:13:29 +05:30
Nishka Gosalia
e55d0ce1f8 Merge pull request #53966 from frappe/mergify/bp/version-16-hotfix/pr-53965
fix: Party Field only visibile when party type selected (backport #53965)
2026-03-31 18:10:00 +05:30
nishkagosalia
f42a1e8a14 fix: Party Field only visibile when party type selected
(cherry picked from commit e9e510a76e)
2026-03-31 12:38:31 +00:00
khushi8112
8674aafc86 fix(test): do not use is_group enabled customer group in test
(cherry picked from commit 75fa2b2277)
2026-03-31 11:17:17 +00:00
khushi8112
04cced2fb5 fix: prevent selection of group type customer group in customer master
(cherry picked from commit 6068dc959f)
2026-03-31 11:17:17 +00:00
Khushi Rawat
16bd04dd97 Merge pull request #53943 from frappe/mergify/bp/version-16-hotfix/pr-53939
fix: dynamic labels on invoice type change (backport #53939)
2026-03-31 16:47:02 +05:30
ruthra kumar
d129e5f5bc Merge pull request #53948 from frappe/mergify/bp/version-16-hotfix/pr-53795
refactor(test): enforce ERPNextTestSuite across repo (backport #53795)
2026-03-31 16:30:56 +05:30
mergify[bot]
573a1a0dcb fix: do not show inv dimension unnecessarily in stock entry (backport #53946) (#53951)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: do not show inv dimension unnecessarily in stock entry (#53946)
2026-03-31 16:29:29 +05:30
rohitwaghchaure
7c503b33f8 Merge pull request #53954 from frappe/mergify/bp/version-16-hotfix/pr-53953
fix: rejected serial no field showing even if serial / batch feature disabled (backport #53953)
2026-03-31 16:20:56 +05:30
Rohit Waghchaure
2c81f79df7 fix: rejected serial no field showing even if serial / batch feature not enabled
(cherry picked from commit c2f419ac3d)
2026-03-31 10:41:44 +00:00
ruthra kumar
05f47bbf6e refactor(test): remove AccountsTestMixin from Sales Order
(cherry picked from commit 2aecf0103a)
2026-03-31 15:05:19 +05:30
ruthra kumar
ee61d79631 refactor(test): remove AccountsTestMixin from reactivity
(cherry picked from commit d2ee967383)
2026-03-31 15:05:17 +05:30
ruthra kumar
85b08e4706 refactor(test): remove AccountsTestMixin from distributed discount
(cherry picked from commit 0b6546ea06)
2026-03-31 09:32:44 +00:00
ruthra kumar
013aea6b7e refactor(test): move logic from AccountsTestMixin to ERPNextTestSuite
(cherry picked from commit 2b37d7514d)
2026-03-31 09:32:44 +00:00
ruthra kumar
a8d0fb5ac9 refactor(test): erpnext testsuite should be primary superclass
(cherry picked from commit f3148e052c)
2026-03-31 09:32:44 +00:00
Lakshit Jain
924983794b Merge pull request #53933 from frappe/mergify/bp/version-16-hotfix/pr-53925
fix(taxes): increase rounding threshold for tax breakup calculations (backport #53925)
2026-03-31 12:34:33 +05:30
mergify[bot]
5ade905ee8 feat(Payment Request): Added a toggle for using the payment schedule (backport #53922) (#53928)
* feat(Payment Request): Added a toggle for using the payment schedule

(cherry picked from commit 8ec15b537e)

---------

Co-authored-by: Jatin3128 <jatinsarna8@gmail.com>
Co-authored-by: Jatin3128 <140256508+Jatin3128@users.noreply.github.com>
2026-03-31 12:26:29 +05:30
khushi8112
4705f53d2c fix: dynamic labels on invoice type change
(cherry picked from commit 820bd15e1e)
2026-03-31 06:37:19 +00:00
mergify[bot]
8be7793f89 chore: remove inter warehouse transfer settings (backport #53860) (#53941)
Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
2026-03-31 06:09:44 +00:00
ljain112
0dcacad793 chore: resolve conflicts 2026-03-31 11:05:46 +05:30
mergify[bot]
a478fb7131 fix(warehouse_capacity_dashboard): removed escape from template (backport #53907) (#53909)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(warehouse_capacity_dashboard): removed `escape` from template (#53907)
2026-03-30 23:33:22 +05:30
Frappe PR Bot
ddef35c333 chore(release): Bumped to Version 16.12.0
# [16.12.0](https://github.com/frappe/erpnext/compare/v16.11.0...v16.12.0) (2026-03-30)

### Bug Fixes

* **accounts:** set supplier name as title field in Purchase Invoice ([#53710](https://github.com/frappe/erpnext/issues/53710)) ([f2195fa](f2195fa67d))
* add missing type hints to whitelisted function arguments ([b115913](b115913fc9))
* avoid setting unnecessary fields ([3023302](3023302700))
* **bank_account:** added validation to fetch bank account details using `get_bank_account_details` (backport [#53926](https://github.com/frappe/erpnext/issues/53926)) ([#53930](https://github.com/frappe/erpnext/issues/53930)) ([8cb8f66](8cb8f66b22))
* change in functionality ([6d92792](6d92792634))
* change shipment parcel dimension fields from Int to Float (backport [#53867](https://github.com/frappe/erpnext/issues/53867)) ([#53873](https://github.com/frappe/erpnext/issues/53873)) ([2907c41](2907c411f3))
* **contract_template:** restrict `create`, `write` and `delete` access only to `System Manager` (backport [#53787](https://github.com/frappe/erpnext/issues/53787)) ([#53789](https://github.com/frappe/erpnext/issues/53789)) ([737cb37](737cb371d7))
* correct item valuation when "Deduct" is used in Purchase Invoice and Receipt. ([c6fe5be](c6fe5be95a))
* corrected logic to retry reposting if timeout occurs after dependent SLE processing ([8fbb86d](8fbb86d53e))
* do not check for sub assembly reference for rm of fg (backport [#53758](https://github.com/frappe/erpnext/issues/53758)) ([#53759](https://github.com/frappe/erpnext/issues/53759)) ([1872dcc](1872dccb0a))
* **email_campaign:** prevent unsubscribing entire campaign when email group member unsubscribes ([00bb07a](00bb07aaa3))
* employee user creation ([1ddadb7](1ddadb72b7))
* **employee:** add 'set_only_once' property to 'Create User Automatically' field ([eadf78d](eadf78d694))
* fallback to Personal Email for user creation just like client-side ([553bc87](553bc87ac7))
* flaky currency exchange test (backport [#53813](https://github.com/frappe/erpnext/issues/53813)) ([#53817](https://github.com/frappe/erpnext/issues/53817)) ([3d79dce](3d79dce8b3))
* hide Create User Automatically checkbox if user is already selected ([c12ad79](c12ad7910a))
* invalid dynamic link filter for address doctype (backport [#53849](https://github.com/frappe/erpnext/issues/53849)) ([#53852](https://github.com/frappe/erpnext/issues/53852)) ([1c1369f](1c1369fea8))
* **item_dashboard:** escaping `warehouse`, `item_code`, `stock_uom` and `item_name` on `get_data` (backport [#53904](https://github.com/frappe/erpnext/issues/53904)) ([#53914](https://github.com/frappe/erpnext/issues/53914)) ([4ac6347](4ac6347cc5))
* item-wh reposting, code cleanup ([8d2c4da](8d2c4da931))
* keep from and to time blank until added explicitly (backport [#53798](https://github.com/frappe/erpnext/issues/53798)) ([#53801](https://github.com/frappe/erpnext/issues/53801)) ([09a4f63](09a4f630e1))
* maintain state during reposting ([544c914](544c91441b))
* **manufacturing:** apply work order status filter in job card (backport [#53766](https://github.com/frappe/erpnext/issues/53766)) ([#53768](https://github.com/frappe/erpnext/issues/53768)) ([37b68a0](37b68a07aa))
* **manufacturing:** close work order status when stock reservation is… (backport [#53714](https://github.com/frappe/erpnext/issues/53714)) ([#53721](https://github.com/frappe/erpnext/issues/53721)) ([c36f9e9](c36f9e9b1b))
* **manufacturing:** update condition for base hour rate calculation (backport [#53753](https://github.com/frappe/erpnext/issues/53753)) ([#53771](https://github.com/frappe/erpnext/issues/53771)) ([a93d715](a93d715916))
* **manufacturing:** update the qty precision (backport [#53874](https://github.com/frappe/erpnext/issues/53874)) ([#53885](https://github.com/frappe/erpnext/issues/53885)) ([f6fa972](f6fa9726f9))
* move Joining section before Exit, relabel Employee Exit -> Exit ([7414a9a](7414a9a694))
* only validate auto user creation before insert ([2f13b33](2f13b33e3d))
* **opening_invoice_creation_tool:** sanitize summary content for dashboard (backport [#53917](https://github.com/frappe/erpnext/issues/53917)) ([#53924](https://github.com/frappe/erpnext/issues/53924)) ([8c35a93](8c35a939cb))
* party name not updating correctly ([a205733](a2057331e3))
* **Payment Entry:** split orders as per the schedules in the refrence table ([2693ffe](2693ffe680))
* pick correct dependant sle during reposting ([15739b5](15739b5d81))
* purchase invoice for internal transfers should not require PO (backport [#53791](https://github.com/frappe/erpnext/issues/53791)) ([#53793](https://github.com/frappe/erpnext/issues/53793)) ([72efbc2](72efbc2b42))
* purchase invoice missing item ([bfb5132](bfb51326ed))
* Removed quick access link from selling workspace ([25fa66f](25fa66f90c))
* reset employee listview empty state, add import btn instead ([341bfb0](341bfb0bd9))
* reset User ID and make it read-only if 'Create User Automatically' is set ([af94ed8](af94ed865a))
* resolve POS crash and correct is_return typo in TransactionBase ([adc2960](adc2960f5b))
* sanitize genericode import inputs and secure XML parser ([d7902d0](d7902d0477))
* set create user perm to 1 by default + persist option while saving employee ([e8ca394](e8ca394e8b))
* set default print format for when downlod pdf ([a5250f8](a5250f8827))
* skip overwriting existing asset fields with accounting dimensions ([a35a3e9](a35a3e9627))
* **stock:** add warehouse filter to pick work order raw materials (backport [#53748](https://github.com/frappe/erpnext/issues/53748)) ([#53898](https://github.com/frappe/erpnext/issues/53898)) ([ad3c1e5](ad3c1e520e))
* **stock:** handle legacy single sle recon entries ([dd0613a](dd0613a4a8))
* **stock:** ignore qty validation for pick list (backport [#53871](https://github.com/frappe/erpnext/issues/53871)) ([#53892](https://github.com/frappe/erpnext/issues/53892)) ([319ba31](319ba31b77))
* **stock:** update company validation for expense account in lcv ([9d46d81](9d46d8151a))
* support translated search in get_party_type and refactor raw sql to qb (backport [#53191](https://github.com/frappe/erpnext/issues/53191)) ([#53832](https://github.com/frappe/erpnext/issues/53832)) ([675b94b](675b94b7a2))
* **templates:** escape attachment `file_url` and `file_name` in `order.html` and `projects.html` ([38bc5d6](38bc5d69cd))
* **templates:** using correct syntax of `include` in `projects.html` ([c3cb9cc](c3cb9cc003))
* test case ([5039f89](5039f896bf))
* test file deletion ([3a8e1e3](3a8e1e3faa))
* **test:** enable perpetual inventory ([ad96646](ad966468b1))
* uncollapse User Details section in new form ([d093b71](d093b71946))
* **UX:** improve party selection UX with party name field ([f80b974](f80b974d6f))
* validate if quantity greater than 0 in item dashboard (backport [#53846](https://github.com/frappe/erpnext/issues/53846)) ([#53848](https://github.com/frappe/erpnext/issues/53848)) ([9a2851f](9a2851f221))
* **warehouse_capacity_dashboard:** escaping `warehouse`, `item_code` and `company` on `get_data` (backport [#53894](https://github.com/frappe/erpnext/issues/53894)) ([#53900](https://github.com/frappe/erpnext/issues/53900)) ([f01f7e7](f01f7e7974))

### Features

* Bom stock analysis report ([8a5e2cc](8a5e2cc0a6))
* default print format for Request for Quotation ([ab0e215](ab0e215290))
* **employee:** Add automatic user creation feature and related validations. Create User on Import. ([8f8b487](8f8b48746b))
* **employee:** Add birthdays and work anniversaries indicator in form ,list view enhancements and new empty state. ([0b3c912](0b3c9120c3))
* **employee:** Create User button and form. ([cd0a25c](cd0a25ca17))
* **report:** add service start/end date and amount with roll-ups in deferred revenue/expense report ([407c3cd](407c3cd575))
2026-03-30 18:03:06 +00:00
diptanilsaha
f3a5afc11f Merge pull request #53915 from frappe/version-16-hotfix 2026-03-30 23:31:28 +05:30
mergify[bot]
8cb8f66b22 fix(bank_account): added validation to fetch bank account details using get_bank_account_details (backport #53926) (#53930)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(bank_account): added validation to fetch bank account details using `get_bank_account_details` (#53926)
2026-03-30 20:56:31 +05:30
ljain112
5922d25210 test: update item-wise tax detail test for high conversion rates
(cherry picked from commit fc8437c499)

# Conflicts:
#	erpnext/controllers/tests/test_item_wise_tax_details.py
2026-03-30 15:17:09 +00:00
Smit Vora
6ad5e89607 fix(taxes): improve tax calculation accuracy and update test assertions
(cherry picked from commit a18196f584)
2026-03-30 15:17:09 +00:00
ljain112
6689b17b88 fix(tests): update item code and quantity in tax detail test case
(cherry picked from commit 3449ab063a)
2026-03-30 15:17:09 +00:00
ljain112
3592637b5c fix(taxes): increase rounding threshold for tax breakup calculations
(cherry picked from commit 7f87a5e5c6)
2026-03-30 15:17:08 +00:00
Lakshit Jain
63828dfc00 Merge pull request #53932 from frappe/mergify/bp/version-16-hotfix/pr-53406
fix: correct item valuation when "Deduct" is used in Purchase Invoice and Receipt. (backport #53406)
2026-03-30 20:37:24 +05:30
ljain112
c6fe5be95a fix: correct item valuation when "Deduct" is used in Purchase Invoice and Receipt.
(cherry picked from commit e68f149d3a)
2026-03-30 14:24:46 +00:00
mergify[bot]
8c35a939cb fix(opening_invoice_creation_tool): sanitize summary content for dashboard (backport #53917) (#53924)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(opening_invoice_creation_tool): sanitize summary content for dashboard (#53917)
2026-03-30 12:47:25 +00:00
mergify[bot]
4ac6347cc5 fix(item_dashboard): escaping warehouse, item_code, stock_uom and item_name on get_data (backport #53904) (#53914)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(item_dashboard): escaping `warehouse`, `item_code`, `stock_uom` and `item_name` on `get_data` (#53904)
2026-03-30 09:52:17 +00:00
rohitwaghchaure
e85919478e Merge pull request #53911 from frappe/mergify/bp/version-16-hotfix/pr-53906
fix: purchase invoice missing item (backport #53906)
2026-03-30 15:08:56 +05:30
rohitwaghchaure
6ffd716ee2 Merge pull request #53896 from frappe/mergify/bp/version-16-hotfix/pr-53799
fix(stock): update company validation for expense account in lcv (backport #53799)
2026-03-30 14:45:49 +05:30
Rohit Waghchaure
bfb51326ed fix: purchase invoice missing item
(cherry picked from commit af994c1a22)
2026-03-30 09:15:18 +00:00
rohitwaghchaure
3af5b67e43 Merge pull request #53905 from frappe/mergify/bp/version-16-hotfix/pr-53902
fix: item-wh reposting, code cleanup (backport #53902)
2026-03-30 14:22:35 +05:30
Rohit Waghchaure
8d2c4da931 fix: item-wh reposting, code cleanup
(cherry picked from commit e0ca34ae39)
2026-03-30 08:31:48 +00:00
mergify[bot]
f01f7e7974 fix(warehouse_capacity_dashboard): escaping warehouse, item_code and company on get_data (backport #53894) (#53900)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(warehouse_capacity_dashboard): escaping `warehouse`, `item_code` and `company` on `get_data` (#53894)
2026-03-30 13:48:25 +05:30
mergify[bot]
ad3c1e520e fix(stock): add warehouse filter to pick work order raw materials (backport #53748) (#53898)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): add warehouse filter to pick work order raw materials (#53748)
2026-03-30 08:12:48 +00:00
Sudharsanan11
ad966468b1 fix(test): enable perpetual inventory
(cherry picked from commit 875a2e4947)
2026-03-30 07:34:51 +00:00
Sudharsanan11
9d46d8151a fix(stock): update company validation for expense account in lcv
(cherry picked from commit 913168e8b6)
2026-03-30 07:34:51 +00:00
mergify[bot]
319ba31b77 fix(stock): ignore qty validation for pick list (backport #53871) (#53892)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): ignore qty validation for pick list (#53871)
2026-03-30 06:59:29 +00:00
rohitwaghchaure
68d93a2dae Merge pull request #53810 from frappe/mergify/bp/version-16-hotfix/pr-53216
fix(stock): handle legacy single sle recon entries (backport #53216)
2026-03-30 11:34:36 +05:30
mergify[bot]
b2cba0286e refactor: setup wizard stages and demo data creation (backport #53866) (#53868)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-03-29 17:05:36 +00:00
mergify[bot]
f6fa9726f9 fix(manufacturing): update the qty precision (backport #53874) (#53885)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(manufacturing): update the qty precision (#53874)
2026-03-29 16:43:26 +00:00
MochaMind
83cac15755 chore: update POT file (#53875) 2026-03-29 14:55:38 +02:00
rohitwaghchaure
e3f144cb28 Merge pull request #53880 from frappe/mergify/bp/version-16-hotfix/pr-53878
fix: maintain state during reposting (backport #53878)
2026-03-29 16:32:07 +05:30
Rohit Waghchaure
544c91441b fix: maintain state during reposting
(cherry picked from commit f8738a791b)
2026-03-29 10:43:06 +00:00
mergify[bot]
2907c411f3 fix: change shipment parcel dimension fields from Int to Float (backport #53867) (#53873)
Co-authored-by: Kaushal Shriwas <64089478+kaulith@users.noreply.github.com>
fix: change shipment parcel dimension fields from Int to Float (#53867)
2026-03-29 07:10:14 +00:00
rohitwaghchaure
0b324b2892 Merge pull request #53856 from frappe/mergify/bp/version-16-hotfix/pr-53853
fix: corrected logic to retry reposting if timeout occurs after dependant SLE processing  (backport #53853)
2026-03-27 22:35:42 +05:30
Rohit Waghchaure
8fbb86d53e fix: corrected logic to retry reposting if timeout occurs after dependent SLE processing
(cherry picked from commit 90b9ab0bc8)
2026-03-27 15:56:46 +00:00
mergify[bot]
1c1369fea8 fix: invalid dynamic link filter for address doctype (backport #53849) (#53852) 2026-03-27 12:45:50 +00:00
mergify[bot]
9a2851f221 fix: validate if quantity greater than 0 in item dashboard (backport #53846) (#53848)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: validate if quantity greater than 0 in item dashboard (#53846)
2026-03-27 10:34:18 +00:00
mergify[bot]
c9953580b2 ci: semgrep to prevent test regression (backport #53837) (#53840)
ci: semgrep to prevent test regression

(cherry picked from commit be4496e4ab)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2026-03-27 08:32:29 +00:00
mergify[bot]
675b94b7a2 fix: support translated search in get_party_type and refactor raw sql to qb (backport #53191) (#53832)
* fix: support translated search in get_party_type and refactor raw sql to qb

(cherry picked from commit d987688058)

# Conflicts:
#	erpnext/setup/doctype/party_type/party_type.py

* fix: resolve merge conflicts in party_type.py

---------

Co-authored-by: Shllokkk <140623894+Shllokkk@users.noreply.github.com>
2026-03-27 13:42:46 +05:30
rohitwaghchaure
bec83c1944 Merge pull request #53805 from frappe/mergify/bp/version-16-hotfix/pr-52152
Refactor reposting feature (backport #52152)
2026-03-27 12:36:22 +05:30
Nishka Gosalia
fbd72ff232 Merge pull request #53835 from frappe/mergify/bp/version-16-hotfix/pr-53704 2026-03-27 12:27:28 +05:30
Rohit Waghchaure
15739b5d81 fix: pick correct dependant sle during reposting 2026-03-27 12:10:45 +05:30
Rohit Waghchaure
f663f9b27e refactor: storing of current status of reposting
(cherry picked from commit daa2420996)
2026-03-27 12:10:45 +05:30
Rohit Waghchaure
5bbecbf7c4 refactor: reposting for better peformance
(cherry picked from commit 20787ef5da)
2026-03-27 12:10:45 +05:30
nishkagosalia
3a8e1e3faa fix: test file deletion 2026-03-27 12:03:20 +05:30
Ravibharathi
c78a5af073 Merge pull request #53820 from frappe/mergify/bp/version-16-hotfix/pr-53710
fix(accounts): set supplier name as title field in Purchase Invoice (backport #53710)
2026-03-27 11:59:39 +05:30
kavin-114
dd0613a4a8 fix(stock): handle legacy single sle recon entries
(cherry picked from commit 7e6bbcc3fb)
2026-03-27 11:49:45 +05:30
nishkagosalia
5039f896bf fix: test case
(cherry picked from commit 3a78af7f42)
2026-03-27 06:09:18 +00:00
nishkagosalia
d1a3571918 chore: Dropping bom stock report and bom stock calculated report
(cherry picked from commit 3bedc6cf7e)

# Conflicts:
#	erpnext/manufacturing/report/bom_stock_calculated/test_bom_stock_calculated.py
2026-03-27 06:09:17 +00:00
nishkagosalia
6d92792634 fix: change in functionality
(cherry picked from commit c1874cb7d5)
2026-03-27 06:09:17 +00:00
nishkagosalia
8a5e2cc0a6 feat: Bom stock analysis report
(cherry picked from commit 5d088350dc)
2026-03-27 06:09:17 +00:00
ravibharathi656
d12b54c50a chore: resolve conflict 2026-03-27 11:24:35 +05:30
rohitwaghchaure
d7237519a2 Merge pull request #53826 from rohitwaghchaure/fixed-test-case-for-process-loss
test: fixed test case
2026-03-27 11:17:13 +05:30
ruthra kumar
f1af745932 Merge pull request #53830 from frappe/mergify/bp/version-16-hotfix/pr-53429
feat(report): add service start/end date and amount with roll-ups in deferred revenue/expense report (backport #53429)
2026-03-27 10:59:54 +05:30
ruthra kumar
610052d487 Merge pull request #53828 from frappe/mergify/bp/version-16-hotfix/pr-53343
fix(email_campaign): prevent unsubscribing entire campaign when email group member unsubscribes (backport #53343)
2026-03-27 10:48:46 +05:30
Shllokkk
407c3cd575 feat(report): add service start/end date and amount with roll-ups in deferred revenue/expense report
(cherry picked from commit 8e5692d8a3)
2026-03-27 05:00:50 +00:00
Shllokkk
00bb07aaa3 fix(email_campaign): prevent unsubscribing entire campaign when email group member unsubscribes
(cherry picked from commit 56f597f5ad)
2026-03-27 04:57:50 +00:00
Rohit Waghchaure
10f58112ae test: fixed test case 2026-03-27 10:04:55 +05:30
mergify[bot]
3d79dce8b3 fix: flaky currency exchange test (backport #53813) (#53817) 2026-03-26 15:09:13 +00:00
Pandiyan P
f2195fa67d fix(accounts): set supplier name as title field in Purchase Invoice (#53710)
fix(accounts): update title field in purchase order and purchase invoice

(cherry picked from commit 5b1fa81451)

# Conflicts:
#	erpnext/buying/doctype/purchase_order/purchase_order.json
2026-03-26 13:30:44 +00:00
mergify[bot]
09a4f630e1 fix: keep from and to time blank until added explicitly (backport #53798) (#53801)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: keep from and to time blank until added explicitly (#53798)
2026-03-26 07:42:54 +00:00
mergify[bot]
72efbc2b42 fix: purchase invoice for internal transfers should not require PO (backport #53791) (#53793)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: purchase invoice for internal transfers should not require PO (#53791)
2026-03-26 04:24:43 +05:30
mergify[bot]
737cb371d7 fix(contract_template): restrict create, write and delete access only to System Manager (backport #53787) (#53789)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(contract_template): restrict `create`, `write` and `delete` access only to `System Manager` (#53787)
2026-03-25 15:26:34 +00:00
Khushi Rawat
b072dd4497 Merge pull request #53728 from frappe/mergify/bp/version-16-hotfix/pr-53646
feat: default print format for Request for Quotation (backport #53646)
2026-03-25 17:32:17 +05:30
diptanilsaha
62dc3ce6d8 Merge pull request #53781 from frappe/mergify/bp/version-16-hotfix/pr-53779
fix(template): escape attachment `file_url` and `file_name` and jinja syntax (backport #53779)
2026-03-25 15:20:20 +05:30
diptanilsaha
c3cb9cc003 fix(templates): using correct syntax of include in projects.html
(cherry picked from commit bc6561cdd0)
2026-03-25 09:28:37 +00:00
diptanilsaha
38bc5d69cd fix(templates): escape attachment file_url and file_name in order.html and projects.html
(cherry picked from commit d9760bbf4f)
2026-03-25 09:28:36 +00:00
mergify[bot]
a93d715916 fix(manufacturing): update condition for base hour rate calculation (backport #53753) (#53771)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(manufacturing): update condition for base hour rate calculation (#53753)
2026-03-25 06:29:08 +00:00
mergify[bot]
37b68a07aa fix(manufacturing): apply work order status filter in job card (backport #53766) (#53768)
Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
fix(manufacturing): apply work order status filter in job card (#53766)
2026-03-25 05:52:27 +00:00
mergify[bot]
1872dccb0a fix: do not check for sub assembly reference for rm of fg (backport #53758) (#53759)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: do not check for sub assembly reference for rm of fg (#53758)
2026-03-25 11:10:16 +05:30
ruthra kumar
47438a44d3 Merge pull request #53752 from frappe/mergify/bp/version-16-hotfix/pr-53657
refactor(test): move remaining commits inside test guard (backport #53657)
2026-03-24 18:24:58 +05:30
ruthra kumar
e91cbd94b4 refactor(test): process statement of acc remove commit
(cherry picked from commit bc2b8da597)
2026-03-24 17:52:41 +05:30
ruthra kumar
7f29245eb6 refactor(test): move location creation to bootstrap in asset movement
(cherry picked from commit fd2b76a4d2)
2026-03-24 17:52:41 +05:30
ruthra kumar
f0aa82cc6d refactor(test): make stock entry deterministic
(cherry picked from commit 8fd65d7afa)
2026-03-24 17:52:41 +05:30
ruthra kumar
37ad0665c6 refactor(test): make asset capitalization deterministic
(cherry picked from commit 2c53cf3902)
2026-03-24 17:52:41 +05:30
ruthra kumar
8ea9133caa refactor(test): make ledger merge deterministic
(cherry picked from commit d3cf8cb851)
2026-03-24 17:52:41 +05:30
ruthra kumar
0ba03ce851 refactor(test): SLA move company creation to bootstrap
(cherry picked from commit 77f41e120d)
2026-03-24 17:52:41 +05:30
ruthra kumar
ad2cf0624f refactor(test): move webform custom dt creation to boostrap
(cherry picked from commit 426b7db3c8)
2026-03-24 17:52:41 +05:30
ruthra kumar
cdc77caf6a refactor(test): move custom doctype data setup to bootstrap
(cherry picked from commit 934740205a)
2026-03-24 17:52:41 +05:30
ruthra kumar
d41e7098bd refactor(test): move tax category custom field creation to bootstrap
(cherry picked from commit 4454af8efd)
2026-03-24 17:52:41 +05:30
ruthra kumar
ebe45add4c refactor(test): move trial company creation to bootstrap
(cherry picked from commit 11fb00c21d)
2026-03-24 17:52:41 +05:30
ruthra kumar
bb42d3ddbe refactor(test): move purchase invoice dimension setup to bootstrap
(cherry picked from commit 31ce09204f)
2026-03-24 17:52:41 +05:30
ruthra kumar
ee72ed94d5 refactor(test): move company setup to bootstrap
(cherry picked from commit 9ed072ac83)
2026-03-24 17:52:41 +05:30
ruthra kumar
941375877e refactor(test): move dimension setup to test data bootstrap
and remove create_dimension() and disable_dimension()

(cherry picked from commit 342ce65401)
2026-03-24 17:52:37 +05:30
ruthra kumar
4148d7d414 Merge pull request #53750 from frappe/mergify/bp/version-16-hotfix/pr-52285
fix(Payment Entry): split orders as per the schedules in the reference table (backport #52285)
2026-03-24 17:49:48 +05:30
ruthra kumar
9669a2c56f refactor(test): move commits inside test guard clause
(cherry picked from commit ed76d6699a)
2026-03-24 12:14:03 +00:00
Jatin3128
2693ffe680 fix(Payment Entry): split orders as per the schedules in the refrence table
(cherry picked from commit a9e52833fe)
2026-03-24 11:59:33 +00:00
Nishka Gosalia
f9bbf7bee4 Merge pull request #53747 from frappe/mergify/bp/version-16-hotfix/pr-53738 2026-03-24 16:48:34 +05:30
nishkagosalia
0571830720 refactor: item master ux improvements
(cherry picked from commit be55082751)
2026-03-24 10:59:06 +00:00
khushi8112
bb77018f7b fix: add quotation print format in the list
(cherry picked from commit da41057cd6)
2026-03-24 10:06:58 +00:00
khushi8112
f5a9657a91 fix: remove unused print format
(cherry picked from commit b9083411cc)
2026-03-24 10:06:58 +00:00
khushi8112
7e5297a305 fix: add closing div tab
(cherry picked from commit c99cec1071)
2026-03-24 10:06:58 +00:00
khushi8112
a8769bfb77 feat: default print format for Quotation
(cherry picked from commit 4307cd5b1c)

# Conflicts:
#	erpnext/controllers/accounts_controller.py
#	erpnext/public/js/print.js
#	erpnext/setup/install.py
2026-03-24 10:06:57 +00:00
Khushi Rawat
6239e336ae Merge pull request #53729 from frappe/mergify/bp/version-16-hotfix/pr-53680
fix(UX): improve party selection UX with party name field (backport #53680)
2026-03-24 12:03:37 +05:30
ruthra kumar
2291a0539b Merge pull request #53740 from frappe/mergify/bp/version-16-hotfix/pr-52802
fix: Removed quick access link from selling workspace (backport #52802)
2026-03-24 11:50:42 +05:30
ruthra kumar
70984763a1 Merge pull request #53739 from frappe/mergify/bp/version-16-hotfix/pr-53302
fix: sanitize genericode import inputs and secure XML parser (backport #53302)
2026-03-24 11:47:45 +05:30
Nabin Hait
25fa66f90c fix: Removed quick access link from selling workspace
(cherry picked from commit d7c48d645a)
2026-03-24 06:01:15 +00:00
Shllokkk
d7902d0477 fix: sanitize genericode import inputs and secure XML parser
(cherry picked from commit 17eb983c40)
2026-03-24 05:57:53 +00:00
ruthra kumar
e78386f49a Merge pull request #53737 from frappe/mergify/bp/version-16-hotfix/pr-53730
fix: skip overwriting existing asset fields with accounting dimensions (backport #53730)
2026-03-24 11:25:09 +05:30
Rucha Mahabal
0a8e4675dc Merge pull request #53711 from frappe/mergify/bp/version-16-hotfix/pr-52726
feat(employee): Create User button and form. (backport #52726)
2026-03-24 11:06:15 +05:30
khushi8112
a35a3e9627 fix: skip overwriting existing asset fields with accounting dimensions
(cherry picked from commit 2859a143f2)
2026-03-24 05:35:26 +00:00
ruthra kumar
645308fc05 Merge pull request #53725 from Raghav0201/backport-52654
fix: resolve POS crash and correct is_return typo in TransactionBase
2026-03-24 10:59:00 +05:30
khushi8112
a2057331e3 fix: party name not updating correctly
(cherry picked from commit 469bb0ba4e)
2026-03-23 20:06:32 +00:00
khushi8112
f80b974d6f fix(UX): improve party selection UX with party name field
(cherry picked from commit 8fd9b88cd9)
2026-03-23 20:06:31 +00:00
khushi8112
a5250f8827 fix: set default print format for when downlod pdf
(cherry picked from commit 6b9fb77772)
2026-03-23 20:04:45 +00:00
khushi8112
ab0e215290 feat: default print format for Request for Quotation
(cherry picked from commit 2af0d9cf6c)
2026-03-23 20:04:45 +00:00
Raghav0201
adc2960f5b fix: resolve POS crash and correct is_return typo in TransactionBase 2026-03-23 22:13:29 +05:30
Frappe PR Bot
372fc96f0c chore(release): Bumped to Version 16.11.0
# [16.11.0](https://github.com/frappe/erpnext/compare/v16.10.1...v16.11.0) (2026-03-23)

### Bug Fixes

* Adding validation for operation time in BOM ([c38b252](c38b252289))
* batch validation for subcontracting receipt ([604739d](604739d1dc))
* check for `submit` permissions instead of `write` permissions when updating status (backport [#53697](https://github.com/frappe/erpnext/issues/53697)) ([#53703](https://github.com/frappe/erpnext/issues/53703)) ([cd1dfee](cd1dfeeab3))
* check posting_date in args (backport [#53303](https://github.com/frappe/erpnext/issues/53303)) ([#53612](https://github.com/frappe/erpnext/issues/53612)) ([f394ead](f394ead878))
* consider returned qty in subcontracting report (backport [#53616](https://github.com/frappe/erpnext/issues/53616)) ([#53621](https://github.com/frappe/erpnext/issues/53621)) ([7edcef1](7edcef1248))
* deadlock issue for SLE ([de41aba](de41abaaf2))
* do not overwrite expense account in stock entry (backport [#53658](https://github.com/frappe/erpnext/issues/53658)) ([#53661](https://github.com/frappe/erpnext/issues/53661)) ([077f397](077f39721a))
* do not update float precision on setup ([0af4cd9](0af4cd9098))
* ignore cost center (backport [#53063](https://github.com/frappe/erpnext/issues/53063)) ([#53614](https://github.com/frappe/erpnext/issues/53614)) ([2ccac6c](2ccac6c479))
* incorrect sle calculation when doc has project ([#53599](https://github.com/frappe/erpnext/issues/53599)) ([55bad49](55bad49cf0))
* **manufacturing:** update non-stock item dict (backport [#53689](https://github.com/frappe/erpnext/issues/53689)) ([#53699](https://github.com/frappe/erpnext/issues/53699)) ([0d9af60](0d9af60f8a))
* merge conflict ([f1c93d4](f1c93d4b98))
* **payment_schedule:** using `show_alert` instead of `msgprint` for non-selection of payment schedule (backport [#53623](https://github.com/frappe/erpnext/issues/53623)) ([#53631](https://github.com/frappe/erpnext/issues/53631)) ([a94bf6d](a94bf6db06))
* PO should not be required for internal transfers (backport [#53681](https://github.com/frappe/erpnext/issues/53681)) ([#53684](https://github.com/frappe/erpnext/issues/53684)) ([5f9533f](5f9533f089))
* python error in manufacture entry if transfer against is job card (backport [#53615](https://github.com/frappe/erpnext/issues/53615)) ([#53618](https://github.com/frappe/erpnext/issues/53618)) ([10a40a6](10a40a6d9b))
* set customer details on customer creation at login (backport [#53509](https://github.com/frappe/erpnext/issues/53509)) ([#53629](https://github.com/frappe/erpnext/issues/53629)) ([5b4e3e9](5b4e3e92df))
* shipping rule applied twice on non stock items (backport [#53655](https://github.com/frappe/erpnext/issues/53655)) ([#53687](https://github.com/frappe/erpnext/issues/53687)) ([9805745](9805745a66))
* stock queue for SABB ([f570a4c](f570a4cb5d))
* **stock:** add company filter while fetching batches (backport [#53369](https://github.com/frappe/erpnext/issues/53369)) ([#53581](https://github.com/frappe/erpnext/issues/53581)) ([91ee45a](91ee45a698))
* **stock:** fix email error message (backport [#53606](https://github.com/frappe/erpnext/issues/53606)) ([#53633](https://github.com/frappe/erpnext/issues/53633)) ([48e8944](48e8944a86))
* **stock:** handle NoneType error (backport [#53593](https://github.com/frappe/erpnext/issues/53593)) ([#53627](https://github.com/frappe/erpnext/issues/53627)) ([2d1dd03](2d1dd03483))
* test case ([aac60b4](aac60b4c13))
* **test:** Use the system-configured float precision ([dd7cc56](dd7cc56dfe))
* **trends:** added validation for `period_based_on` filter (backport [#53690](https://github.com/frappe/erpnext/issues/53690)) ([#53692](https://github.com/frappe/erpnext/issues/53692)) ([9787777](9787777cbd))
* use correct test class ([1efbc60](1efbc60df1))
* validate permission before updating status (backport [#53651](https://github.com/frappe/erpnext/issues/53651)) ([#53653](https://github.com/frappe/erpnext/issues/53653)) ([7ebed91](7ebed912cf))

### Features

* add cost center field to the stock entry accounting dimension tab ([50da693](50da6937e1))
2026-03-23 16:35:10 +00:00
mergify[bot]
c36f9e9b1b fix(manufacturing): close work order status when stock reservation is… (backport #53714) (#53721)
Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix(manufacturing): close work order status when stock reservation is… (#53714)
2026-03-23 22:03:54 +05:30
diptanilsaha
a7dde4f26c Merge pull request #53701 from frappe/version-16-hotfix 2026-03-23 22:03:34 +05:30
mergify[bot]
d16adb1579 chore(test_item_group): removed unused function _print_tree (backport #53716) (#53719)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-03-23 16:14:22 +00:00
mergify[bot]
638373e180 chore: skip semgrep check for db.commit in BootStrapTestData (backport #53715) (#53717)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-03-23 15:59:49 +00:00
rohitwaghchaure
2a514b5038 Merge pull request #53707 from frappe/mergify/bp/version-16-hotfix/pr-53705
fix: batch validation for subcontracting receipt (backport #53705)
2026-03-23 18:52:30 +05:30
Rucha Mahabal
03510d96be chore: fix conflicts 2026-03-23 17:57:30 +05:30
Rucha Mahabal
33d868f415 test(fix): set company in employee
(cherry picked from commit a14f834589)

# Conflicts:
#	erpnext/setup/doctype/employee/test_employee.py
2026-03-23 12:18:18 +00:00
Rucha Mahabal
dfd9aa56be test: Create User Automatically
(cherry picked from commit d4ecede3c3)

# Conflicts:
#	erpnext/setup/doctype/employee/test_employee.py
2026-03-23 12:18:17 +00:00
Rucha Mahabal
af94ed865a fix: reset User ID and make it read-only if 'Create User Automatically' is set
(cherry picked from commit 2be6bb694f)
2026-03-23 12:18:17 +00:00
Rucha Mahabal
553bc87ac7 fix: fallback to Personal Email for user creation just like client-side
(cherry picked from commit 31af13a5e6)
2026-03-23 12:18:17 +00:00
Rucha Mahabal
3023302700 fix: avoid setting unnecessary fields
(cherry picked from commit 97bb100010)
2026-03-23 12:18:16 +00:00
Rucha Mahabal
e8ca394e8b fix: set create user perm to 1 by default + persist option while saving employee
(cherry picked from commit 091899d0df)
2026-03-23 12:18:16 +00:00
Rucha Mahabal
c12ad7910a fix: hide Create User Automatically checkbox if user is already selected
(cherry picked from commit ec3302d1c1)
2026-03-23 12:18:15 +00:00
Rucha Mahabal
d093b71946 fix: uncollapse User Details section in new form
(cherry picked from commit 1466df91bd)
2026-03-23 12:18:15 +00:00
Rucha Mahabal
2f13b33e3d fix: only validate auto user creation before insert
(cherry picked from commit ee1aa10328)
2026-03-23 12:18:14 +00:00
Rucha Mahabal
1ddadb72b7 fix: employee user creation
- consider prefered email as default in employee creation

- remove unused user parameter from `create_user` API

- remove unnecessary validations on user ID, already checked by user doctype hooks

- set company email only if empty

(cherry picked from commit 613d36a139)
2026-03-23 12:18:14 +00:00
Rucha Mahabal
341bfb0bd9 fix: reset employee listview empty state, add import btn instead
(cherry picked from commit d99d16423a)
2026-03-23 12:18:13 +00:00
Rucha Mahabal
7414a9a694 fix: move Joining section before Exit, relabel Employee Exit -> Exit
(cherry picked from commit 000b5b72d5)
2026-03-23 12:18:13 +00:00
Krishna Shirsath
c33cd5ce15 refactor(employee): remove anniversary indicator logic from employee form
(cherry picked from commit 1f19175fef)
2026-03-23 12:18:13 +00:00
Krishna Shirsath
eadf78d694 fix(employee): add 'set_only_once' property to 'Create User Automatically' field
(cherry picked from commit 053242d5bd)
2026-03-23 12:18:13 +00:00
Krishna Shirsath
b115913fc9 fix: add missing type hints to whitelisted function arguments
(cherry picked from commit 124ec4d3c2)
2026-03-23 12:18:13 +00:00
Krishna Shirsath
0b3c9120c3 feat(employee): Add birthdays and work anniversaries indicator in form ,list view enhancements and new empty state.
(cherry picked from commit 4f43f655cf)
2026-03-23 12:18:12 +00:00
Krishna Shirsath
b0145512ed refactor(employee): reorganize joining and employee exit tabs at the end.
(cherry picked from commit 870254b710)
2026-03-23 12:18:12 +00:00
Krishna Shirsath
f2c4a8b1c4 refactor(employee): create user function -removed useless function calls
(cherry picked from commit 6513185cb7)
2026-03-23 12:18:11 +00:00
Krishna Shirsath
8f8b48746b feat(employee): Add automatic user creation feature and related validations. Create User on Import.
(cherry picked from commit 57f3048d27)
2026-03-23 12:18:11 +00:00
Krishna Shirsath
cd0a25ca17 feat(employee): Create User button and form.
(cherry picked from commit 3b521b74ea)
2026-03-23 12:18:11 +00:00
Rohit Waghchaure
604739d1dc fix: batch validation for subcontracting receipt
(cherry picked from commit b8d201658a)
2026-03-23 11:33:00 +00:00
mergify[bot]
cd1dfeeab3 fix: check for submit permissions instead of write permissions when updating status (backport #53697) (#53703)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix: check for `submit` permissions instead of `write` permissions when updating status (#53697)
2026-03-23 10:56:15 +00:00
mergify[bot]
0d9af60f8a fix(manufacturing): update non-stock item dict (backport #53689) (#53699)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(manufacturing): update non-stock item dict (#53689)
2026-03-23 10:14:52 +00:00
Nishka Gosalia
e2b9538e85 Merge pull request #53694 from frappe/mergify/bp/version-16-hotfix/pr-53649 2026-03-23 14:52:10 +05:30
mergify[bot]
9787777cbd fix(trends): added validation for period_based_on filter (backport #53690) (#53692)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(trends): added validation for `period_based_on` filter (#53690)
2026-03-23 09:15:08 +00:00
mergify[bot]
9805745a66 fix: shipping rule applied twice on non stock items (backport #53655) (#53687)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: shipping rule applied twice on non stock items (#53655)
2026-03-23 14:38:07 +05:30
nishkagosalia
2a47197859 chore: Adding new argument in status updater to skip qty validation
(cherry picked from commit dcd0509089)
2026-03-23 08:57:51 +00:00
mergify[bot]
5f9533f089 fix: PO should not be required for internal transfers (backport #53681) (#53684)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: PO should not be required for internal transfers (#53681)
2026-03-23 06:52:45 +00:00
MochaMind
eee1c36263 chore: update POT file (#53676) 2026-03-22 14:45:56 +01:00
rohitwaghchaure
543e374978 Merge pull request #53675 from frappe/mergify/bp/version-16-hotfix/pr-53673
fix: stock queue for SABB (backport #53673)
2026-03-22 13:20:18 +05:30
Rohit Waghchaure
f570a4cb5d fix: stock queue for SABB
(cherry picked from commit 3fcf308ed8)
2026-03-22 07:30:57 +00:00
rohitwaghchaure
18eb7bb4f4 Merge pull request #53670 from frappe/mergify/bp/version-16-hotfix/pr-53638
fix: deadlock issue for SLE (backport #53638)
2026-03-21 14:40:46 +05:30
Rohit Waghchaure
de41abaaf2 fix: deadlock issue for SLE
(cherry picked from commit f48b03c6ec)
2026-03-21 08:34:41 +00:00
mergify[bot]
077f39721a fix: do not overwrite expense account in stock entry (backport #53658) (#53661)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: do not overwrite expense account in stock entry (#53658)
2026-03-20 14:56:44 +05:30
Nishka Gosalia
3923dd1e3a Merge pull request #53648 from frappe/mergify/bp/version-16-hotfix/pr-53645
fix: Adding validation for operation time in BOM (backport #53645)
2026-03-19 22:27:07 +05:30
nishkagosalia
aac60b4c13 fix: test case 2026-03-19 22:05:58 +05:30
nishkagosalia
f1c93d4b98 fix: merge conflict 2026-03-19 21:02:53 +05:30
mergify[bot]
7ebed912cf fix: validate permission before updating status (backport #53651) (#53653)
* fix: validate permission before updating status (#53651)

(cherry picked from commit 8e17c722fb)

# Conflicts:
#	erpnext/buying/doctype/purchase_order/purchase_order.py
#	erpnext/selling/doctype/sales_order/sales_order.py
#	erpnext/stock/doctype/purchase_receipt/purchase_receipt.py

* chore: resolve conflicts

---------

Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-03-19 15:28:01 +00:00
nishkagosalia
c38b252289 fix: Adding validation for operation time in BOM
(cherry picked from commit 7f70e62c30)

# Conflicts:
#	erpnext/manufacturing/doctype/job_card/test_job_card.py
2026-03-19 13:00:32 +00:00
ruthra kumar
ee19765c96 Merge pull request #53608 from ruthra-kumar/ci_lightmode_runner_v16
refactor(test): repo wide test suite refactor (backport #47910)
2026-03-19 13:35:08 +05:30
mergify[bot]
48e8944a86 fix(stock): fix email error message (backport #53606) (#53633)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): fix email error message (#53606)
2026-03-19 07:42:44 +00:00
mergify[bot]
a94bf6db06 fix(payment_schedule): using show_alert instead of msgprint for non-selection of payment schedule (backport #53623) (#53631)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(payment_schedule): using `show_alert` instead of `msgprint` for non-selection of payment schedule (#53623)
2026-03-19 12:57:45 +05:30
ruthra kumar
35f6bc5d30 refactor(test): remove all remaining reference to integration test 2026-03-19 12:57:12 +05:30
ruthra kumar
08ee50a902 refactor(test): cleanup; remove redundant attribute 2026-03-19 12:57:12 +05:30
ruthra kumar
3f35db5db1 refactor(test): make pick list deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
1c96348064 refactor(test): make item wise sales register deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
37d6978190 refactor(test): make purchase order deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
e3e4dae3bb refactor(test): make sales invoice deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
af614bd195 refactor(test): make location determinisitic 2026-03-19 12:57:12 +05:30
ruthra kumar
037fdd6882 refactor(test): make bank clearance deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
7cb662a54c refactor(test): make sales invoice deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
021789baf1 refactor(test): hardcoded names over dynamic 2026-03-19 12:57:12 +05:30
ruthra kumar
9f3afea27f refactor(test): use JSON for company master 2026-03-19 12:57:12 +05:30
ruthra kumar
7d0779c73c refactor(test): remove explicit call to master data setup 2026-03-19 12:57:12 +05:30
ruthra kumar
495e585ab6 refactor(test): hardcoded names over dynamic ones
Much faster bootstrap without those get_doc calls
2026-03-19 12:57:12 +05:30
ruthra kumar
41de44f905 refactor: move test bootstrap to module 2026-03-19 12:57:12 +05:30
ruthra kumar
5934670e99 refactor(test): speed up setup 2026-03-19 12:57:12 +05:30
ruthra kumar
5f56f61f86 refactor(test): make stock entry deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
e451b68619 refactor(test): remove redundant before_tests 2026-03-19 12:57:12 +05:30
ruthra kumar
aec5ba1864 refactor(test): make process deferred accounting deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
9e11b6cfb3 refactor(test): make bom deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
71ce7ff8ce refactor(test): make customer deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
fe8064c3e6 refactor(test): tax rule; removed setUpClass, tearDownClass 2026-03-19 12:57:12 +05:30
ruthra kumar
16bd107583 refactor(test): common make function 2026-03-19 12:57:12 +05:30
ruthra kumar
3f0dbbc17c refactor(test): make bom stock calculated deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
2bfd371526 refactor(test): make pos profile deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
78b0db7988 refactor(test): make pos opening entry deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
dba530bb47 refactor(test): make pos invoice merge log deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
61b40fdccc refactor(test): make pos closing deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
46a81bc7c4 refactor(test): make stock test_utils deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
ed9470387e refactor(test): make currency exchange deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
6426f63798 refactor(test): make sales partner target variance deterministic 2026-03-19 12:57:12 +05:30
ruthra kumar
1cc4b67098 refactor(test): make sales order analysis deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
87de91e5d0 refactor(test): make uae vat audit deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
67bb6a2d6a refactor(test): make uae vat 201 deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
35339fcc0e refactor(test): make job card deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
0c2a538491 refactor(test): make opportunity summary by sales stage deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
bfffbcfee9 refactor(test): make queries deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
b680aeb62c refactor(test): make item wise details deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
da85534118 refactor(test): make accounts controller deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
d69b9d1a54 refactor(test): make subcontracting controller deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
6c9b32287c refactor(test): make test mapper deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
a58ba3e7d4 refactor(test): make item wise inventory account deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
c96f5e3d8c refactor(test): make distributed discount deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
35d35a0588 refactor(test): make requested items order and receive deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
a1aff71ca5 refactor(test): make accounts/test/test_utils.py deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
40bb5c6ed0 refactor(test): make gross profit deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
34c3490227 refactor(test): make sales payment summary deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
b98899a6ac refactor(test): make consolidated trial balance report deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
63908ad6dc refactor(test): remove redundant tearDown, tearDownClass and rollback 2026-03-19 12:57:11 +05:30
ruthra kumar
b3507a569a refactor(test): make inventory dimension deterministic
fixed flaky test 'test_inventory_dimension'

use '3' precision for test_opening_balnace
2026-03-19 12:57:11 +05:30
ruthra kumar
e24c4fcb15 refactor(test): make item group deterministic
'Item Group C' follows 'Item Group B'. So `lft` will increase while
`rgt` stays the same.
2026-03-19 12:57:11 +05:30
ruthra kumar
dc5fa0f5e1 refactor(test): make packed item deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
cbc2eb33a5 chore: typo 2026-03-19 12:57:11 +05:30
ruthra kumar
b23570c1b3 refactor(test): remove redundant create_asset_category 2026-03-19 12:57:11 +05:30
ruthra kumar
3afd39ce03 refactor(test): make sales invoice deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
9bf9068df7 refactor(test): make item group deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
a5defce696 refactor(test): make timesheet deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
f6ccef2935 refactor(test): make task deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
dde6731545 refactor(test): make project deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
0d367fa25f refactor(test): make maintenance schedule deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
c91c169f40 refactor(test): make leads deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
678841c77e refactor(test): make purchase order deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
55ba1fa9aa refactor(test): make asset repair deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
6737ccac95 refactor(test): make asset deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
9cd52c245b refactor(test): make loyalty point entry deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
a0d928871d refactor(test): make dunning deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
21acafae79 refactor(test): make budget deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
b5b28f2e89 refactor(test): make auto match party deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
09b8ee869a refactor(test): make bank clearance deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
3c45a0ca44 refactor(test): remove explicit commit and dead code 2026-03-19 12:57:11 +05:30
ruthra kumar
fad451d6c2 refactor(test): rollback on tearDown 2026-03-19 12:57:11 +05:30
ruthra kumar
b8c68be0cb refactor(test): make irs supplier test deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
a110b20350 refactor(test): make party specific item deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
83d1f53eb1 refactor(test): make subcontracting receipt deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
4b9ae6b0cd refactor(test): make purchase receipt deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
20353e70a1 refactor(test): make stock reconciliation deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
020e28235a refactor(test): make subcontracting order deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
05e78848e3 refactor(test): make purchase receipt deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
d2f1962c2d refactor(test): make material request deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
d54f3c8c24 refactor(test): make stock ledger entry deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
40909af128 refactor(test): make item deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
b3fec97a83 refactor(test): make work order deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
52dfc32dba refactor(test): make purchase receipt deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
8867a7015c refactor: fix logical bug and make stock settings test deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
ac6621b0e8 refactor(test): make stock entry deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
f939d0d3d6 refactor(test): make serial no deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
820e0f88d3 refactor(test): make serial and batch bundle deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
12470c3145 refactor(test): make pick list deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
c437bfcd28 refactor(test): make packed item deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
dee513fa87 refactor(test): make material request deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
499213cafd refactor(test): make LCV deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
61745b9371 refactor(test): make item price deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
8a7f193334 refactor(test): make delivery trip deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
fd31c34581 refactor(test): make delivery note deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
671235d13c refactor(test): make transaction deletion record deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
bd5dcc04f0 refactor(test): make item group deterministic 2026-03-19 12:57:11 +05:30
ruthra kumar
2699ad15d2 refactor(test): make employee deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
2a6b497c06 refactor(test): make department deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
dd240c1070 refactor(test): make currency exchange deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
ec3a39c961 refactor(test): make test deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
381e0a65d1 refactor(test): make project deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
6824f3274a refactor(test): make sales order deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
3d4f145b16 refactor(test): make quotation deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
6b5f39d41b refactor(test): make production plan deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
4531902024 refactor(test): make job card tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
3ea14fc9be refactor(test): make bom tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
6a16c76bbc refactor(test): make bom update tool tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
bc82e67f27 refactor(test): make plaid settings deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
985ab09309 refactor(test): make financial reports deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
ef3736e582 refactor(test): make sales invoice deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
ad8d8e6541 refactor(test): make pos invoice deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
478473a295 refactor(test): better setup for loyalty point and POS Invoice 2026-03-19 12:57:10 +05:30
ruthra kumar
36e578e848 refactor(test): pos invoice tests are almost deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
a158fd1a78 refactor(test): make timesheet and activity type deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
44a10ea50d refactor(test): make maintenance schedule deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
8e0c8e1c80 refactor(test): make prospect deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
61cd154f0f refactor(test): make opportunity deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
10de2e348b refactor(test): remove empty IntegrationTestCase 2026-03-19 12:57:10 +05:30
ruthra kumar
2832aeb592 refactor(test): make tax withholding tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
d7840b5c45 refactor(test): ensure new bankers rounding method is set 2026-03-19 12:57:10 +05:30
ruthra kumar
98d43f5933 refactor(test): set precision in class setup 2026-03-19 12:57:10 +05:30
ruthra kumar
3fcb860d6d refactor(test): make sales invoice tests deterministic
- allow_negative_stock is required for test_taxes_merging_from_delivery_note
2026-03-19 12:57:10 +05:30
ruthra kumar
1e08962eb4 refactor(test): make purchase invoice tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
607f0789cc refactor: avoid name clash 2026-03-19 12:57:10 +05:30
ruthra kumar
9dd6cf2cb7 refactor(test): handle setup of Workstation Operation Component 2026-03-19 12:57:10 +05:30
ruthra kumar
eb31298f58 refactor(tests): make asset maintenance tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
e5d9d3cf7f refactor(test): incorrect fieldname for abbrevation 2026-03-19 12:57:10 +05:30
ruthra kumar
2c526ae856 refactor(test): make asset repair tests deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
b0d44847ac refactor(test): make supplier quotation deterministic 2026-03-19 12:57:10 +05:30
ruthra kumar
a434b89173 refactor(test): install supplier scorecard presets 2026-03-19 12:57:10 +05:30
ruthra kumar
25c8735298 chore: remove default templated test case 2026-03-19 12:57:10 +05:30
ruthra kumar
32c98d2a3e refactor(test): set_user utility method 2026-03-19 12:57:10 +05:30
ruthra kumar
29cf028f9a refactor: replace all IntegrationTestCase -> ERPNextTestSuite 2026-03-19 12:57:10 +05:30
ruthra kumar
4cdf5f542e refactor: utility to return default supplier scorecards 2026-03-19 12:57:10 +05:30
ruthra kumar
523007ecde refactor(test): flaky test in lead 2026-03-19 12:57:10 +05:30
ruthra kumar
400d6b5b62 refactor(test): flaky tax rule testsuite
- Make Sales Stage preset
2026-03-19 12:57:10 +05:30
ruthra kumar
602b30ecaf refactor(test): load shipping rule records 2026-03-19 12:57:10 +05:30
ruthra kumar
5928e289d1 refactor(test): fix flaky shareholder test 2026-03-19 12:57:10 +05:30
ruthra kumar
19fd69bda7 refactor(test): fix flaky process deferred accounting tests 2026-03-19 12:57:10 +05:30
ruthra kumar
1cee2a0917 refactor(test): flaky pricing rule tests 2026-03-19 12:57:10 +05:30
ruthra kumar
02475d4efa refactor(test): flaky stock entry; load records json 2026-03-19 12:57:10 +05:30
ruthra kumar
84250d0245 refactor(test): flaky pos invoice merge log test 2026-03-19 12:57:10 +05:30
ruthra kumar
978ac5ff31 refactor(test): flaky post invoice test 2026-03-19 12:57:10 +05:30
ruthra kumar
7ab253a905 refactor(test): flaky pos invoice test; load stock entry json 2026-03-19 12:57:10 +05:30
ruthra kumar
62d1336c43 refactor(test): flaky PE test; load currency exchange record 2026-03-19 12:57:10 +05:30
ruthra kumar
f79a3e0217 refactor: load journal entry test records and make holiday list 2026-03-19 12:57:10 +05:30
ruthra kumar
9a0c59df73 refactor: utility to load JSON records 2026-03-19 12:57:10 +05:30
ruthra kumar
6f8ac1ba28 refactor(test): update system settings in super() 2026-03-19 12:57:10 +05:30
ruthra kumar
0b7b4d9244 refactor(test): flaky test setup in pos closing entry 2026-03-19 12:57:10 +05:30
ruthra kumar
442dc6d3d0 refactor(test): fix flaky test setup for opening invoice creation 2026-03-19 12:57:10 +05:30
ruthra kumar
e939927bc3 refactor(test): flaky test setup in Exchange Rate Revaluation 2026-03-19 12:57:10 +05:30
ruthra kumar
8c1057088d refactor(test): flaky test data setup for coupon code 2026-03-19 12:57:10 +05:30
ruthra kumar
f0834cb2e8 refactor(test): make price list - more test records 2026-03-19 12:57:10 +05:30
ruthra kumar
04e2ffb966 refactor(test): flaky test data in bank reconciliation tool 2026-03-19 12:57:10 +05:30
ruthra kumar
015cf6fcb9 refactor(test): call super() method first 2026-03-19 12:57:10 +05:30
ruthra kumar
f31d2e74bc refactor(test): make customer 2026-03-19 12:57:10 +05:30
ruthra kumar
6fbca354ea refactor(test): make price list and update selling settings 2026-03-19 12:57:10 +05:30
ruthra kumar
1dbaa8d91f refactor(test): make item attribute 2026-03-19 12:57:10 +05:30
ruthra kumar
f526022302 refactor(test): make test accounts 2026-03-19 12:57:10 +05:30
ruthra kumar
8cbe0d2d35 refactor(test): make item tax template 2026-03-19 12:57:10 +05:30
ruthra kumar
ceca3299e7 refactor(test): make uom 2026-03-19 12:57:10 +05:30
ruthra kumar
654ebd3776 refactor(test): make item group 2026-03-19 12:57:10 +05:30
ruthra kumar
aa0f9219c8 refactor(test): make item 2026-03-19 12:57:10 +05:30
ruthra kumar
c041a94cc0 refactor(test): make warehouse 2026-03-19 12:57:10 +05:30
ruthra kumar
1e13426715 chore: typo in setup method 2026-03-19 12:57:10 +05:30
ruthra kumar
01f2d3699e refactor(test): make persistent location 2026-03-19 12:57:10 +05:30
ruthra kumar
348bb95268 refactor(test): setup fiscal years without any gap 2026-03-19 12:57:10 +05:30
ruthra kumar
2554750a59 refactor(test): make cost center 2026-03-19 12:57:10 +05:30
ruthra kumar
b5558d411b refactor: suppress welcome mail 2026-03-19 12:57:10 +05:30
ruthra kumar
f0b4b02358 refactor(test): even more master data setup 2026-03-19 12:57:10 +05:30
ruthra kumar
fbd2a181bd refactor(test): make all presets in setupclass 2026-03-19 12:57:10 +05:30
ruthra kumar
3aef8ffa24 refactor: temporary standing decorator for change_settings 2026-03-19 12:57:10 +05:30
ruthra kumar
f1dfac417d refactor: replace IntegrationTestCase with ERPNextTestCase repo-wide
- import ERPNextTestSuite
 - use it on test class
2026-03-19 12:57:07 +05:30
mergify[bot]
5b4e3e92df fix: set customer details on customer creation at login (backport #53509) (#53629)
Co-authored-by: Sakthivel Murugan S <129778327+ssakthivelmurugan@users.noreply.github.com>
fix: set customer details on customer creation at login (#53509)
2026-03-19 07:11:25 +00:00
mergify[bot]
2d1dd03483 fix(stock): handle NoneType error (backport #53593) (#53627)
Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
fix(stock): handle NoneType error (#53593)
2026-03-19 07:03:03 +00:00
mergify[bot]
077bf2d0ce refactor: remove test file import in stock ageing report (backport #53619) (#53626)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-19 06:55:47 +00:00
mergify[bot]
7edcef1248 fix: consider returned qty in subcontracting report (backport #53616) (#53621)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: consider returned qty in subcontracting report (#53616)
2026-03-19 11:52:24 +05:30
ruthra kumar
0fdc961a4b refactor(test): bare bones presets for company 2026-03-19 11:33:34 +05:30
ruthra kumar
88c6f61632 refactor(test): make persistent company records
'test_coa_based_on_country_template' made deterministic
2026-03-19 11:33:34 +05:30
ruthra kumar
b86954119f refactor(test): IntegraionTestCase -> python's built-in TestCase 2026-03-19 11:33:34 +05:30
ruthra kumar
018257096b chore: drop dead hook 2026-03-19 11:33:34 +05:30
ruthra kumar
fbf3373a87 chore: remove global dependencies 2026-03-19 11:33:34 +05:30
ruthra kumar
c2504760dd chore: remove IGNORE_TEST_RECORD_DEPENDENCIES 2026-03-19 11:33:34 +05:30
ruthra kumar
de34cf227a chore: remove EXTRA_TEST_RECORD_DEPENDENCIES 2026-03-19 11:33:34 +05:30
ruthra kumar
f7e4d07a7e chore: delete all test_records.json 2026-03-19 11:33:34 +05:30
ruthra kumar
1a6e96818d ci: run parallel test in lightmode
- modify individual test CI. let it be dormat for now.

Acked-by: ruthra kumar <ruthra@erpnext.com>
2026-03-19 11:33:34 +05:30
ruthra kumar
3704df04ab Merge pull request #53622 from frappe/mergify/bp/version-16-hotfix/pr-51509
fix: use system configured float precision for depreciation rate  (backport #51509)
2026-03-19 11:32:31 +05:30
khushi8112
b000224a93 test: set up float precision
(cherry picked from commit c0a85faa68)
2026-03-19 05:47:07 +00:00
khushi8112
0af4cd9098 fix: do not update float precision on setup
(cherry picked from commit 825e3717ca)
2026-03-19 05:47:07 +00:00
khushi8112
b855f30600 refactor: modify test cases to handle float precision rounded to 2 decimals
(cherry picked from commit 007258d657)
2026-03-19 05:47:06 +00:00
khushi8112
1efbc60df1 fix: use correct test class
(cherry picked from commit 8d186d6b3f)
2026-03-19 05:47:06 +00:00
khushi8112
dd7cc56dfe fix(test): Use the system-configured float precision
(cherry picked from commit 1296829b9c)
2026-03-19 05:47:06 +00:00
ruthra kumar
ba102e13c5 Merge pull request #53609 from frappe/mergify/bp/version-16-hotfix/pr-53011
refactor: use cache decorator in accounting dimensions (backport #53011)
2026-03-19 10:51:43 +05:30
ruthra kumar
38ba559d6e Merge pull request #53610 from frappe/mergify/bp/version-16-hotfix/pr-53027
refactor: remove frappe.flags from accounting dimensions filter (backport #53027)
2026-03-19 10:49:39 +05:30
mergify[bot]
10a40a6d9b fix: python error in manufacture entry if transfer against is job card (backport #53615) (#53618)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: python error in manufacture entry if transfer against is job card (#53615)
2026-03-19 05:15:51 +00:00
mergify[bot]
f394ead878 fix: check posting_date in args (backport #53303) (#53612)
Co-authored-by: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com>
fix: check posting_date in args (#53303)
2026-03-19 05:01:34 +00:00
mergify[bot]
2ccac6c479 fix: ignore cost center (backport #53063) (#53614)
Co-authored-by: Sowmya <106989392+SowmyaArunachalam@users.noreply.github.com>
fix: ignore cost center (#53063)
2026-03-19 04:46:51 +00:00
ruthra kumar
dbf795e810 refactor: remove frappe.flags from accounting dimensions filter
(cherry picked from commit 290f979fd3)
2026-03-19 01:43:35 +00:00
ruthra kumar
9889ef2455 refactor: remove frappe.flags and make use of cache decorator
(cherry picked from commit 565542879e)
2026-03-19 01:43:09 +00:00
Frappe PR Bot
8b10311a9b chore(release): Bumped to Version 16.10.1
## [16.10.1](https://github.com/frappe/erpnext/compare/v16.10.0...v16.10.1) (2026-03-18)

### Bug Fixes

* incorrect sle calculation when doc has project ([#53599](https://github.com/frappe/erpnext/issues/53599)) ([9a46aa3](9a46aa3106))
2026-03-18 13:42:27 +00:00
rohitwaghchaure
9a8f61e21f Merge pull request #53603 from frappe/mergify/bp/version-16/pr-53601
fix: incorrect sle calculation when doc has project (backport #53599) (backport #53601)
2026-03-18 19:10:58 +05:30
Mihir Kandoi
9a46aa3106 fix: incorrect sle calculation when doc has project (#53599)
(cherry picked from commit 6cb6a52ded)
(cherry picked from commit 55bad49cf0)
2026-03-18 13:38:39 +00:00
rohitwaghchaure
17f8aa9e2d Merge pull request #53601 from frappe/mergify/bp/version-16-hotfix/pr-53599
fix: incorrect sle calculation when doc has project (backport #53599)
2026-03-18 19:07:40 +05:30
Mihir Kandoi
55bad49cf0 fix: incorrect sle calculation when doc has project (#53599)
(cherry picked from commit 6cb6a52ded)
2026-03-18 13:20:32 +00:00
rohitwaghchaure
29c923a1f4 Merge pull request #53586 from frappe/mergify/bp/version-16-hotfix/pr-53246
feat: add cost center field to the stock entry accounting dimension tab (backport #53246)
2026-03-18 16:32:35 +05:30
mergify[bot]
91ee45a698 fix(stock): add company filter while fetching batches (backport #53369) (#53581)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix(stock): add company filter while fetching batches (#53369)
2026-03-18 13:30:29 +05:30
sudarshan-g
50da6937e1 feat: add cost center field to the stock entry accounting dimension tab
(cherry picked from commit 47772f4e77)
2026-03-18 06:20:28 +00:00
Frappe PR Bot
955f98cfe9 chore(release): Bumped to Version 16.10.0
# [16.10.0](https://github.com/frappe/erpnext/compare/v16.9.1...v16.10.0) (2026-03-18)

### Bug Fixes

* add icon in clear demo data ([0c9ce93](0c9ce9306f))
* add item_name to quick entry fields in Item doctype (backport [#53530](https://github.com/frappe/erpnext/issues/53530)) ([#53533](https://github.com/frappe/erpnext/issues/53533)) ([a695a11](a695a11130))
* add validation in bom creator function (backport [#53364](https://github.com/frappe/erpnext/issues/53364)) ([#53368](https://github.com/frappe/erpnext/issues/53368)) ([4af54a7](4af54a7ac7))
* Append existing ignored doctypes in Journal Entry on_cancel instead of overwriting ([875114d](875114d33c))
* **banking:** include paid purchase invoices in reports and bank clearance ([#52675](https://github.com/frappe/erpnext/issues/52675)) ([c9efcb7](c9efcb7822))
* broke cost center filter in get outstanding reference docs ([60a9c08](60a9c08f0d))
* change "Date" label to "Posting Date" in Sales Invoice and Purchase Invoice (backport [#53503](https://github.com/frappe/erpnext/issues/53503)) ([#53517](https://github.com/frappe/erpnext/issues/53517)) ([e72f398](e72f398b7c))
* correct overlap detection in JobCard.has_overlap (backport [#53473](https://github.com/frappe/erpnext/issues/53473)) ([#53523](https://github.com/frappe/erpnext/issues/53523)) ([c8bb55f](c8bb55f35b))
* correctly group RMs of same phantom from different FG ([efce145](efce145dad))
* Creating new item price incase of changes in expired item price (backport [#53534](https://github.com/frappe/erpnext/issues/53534)) ([#53545](https://github.com/frappe/erpnext/issues/53545)) ([e2a34ab](e2a34ab3fe))
* **delivery note:** avoid maintaining si_detail on return delivery note (backport [#52456](https://github.com/frappe/erpnext/issues/52456)) ([#53353](https://github.com/frappe/erpnext/issues/53353)) ([82b97ab](82b97abbad))
* do not modify rate in the child item merely for comparison (backport [#53301](https://github.com/frappe/erpnext/issues/53301)) ([#53376](https://github.com/frappe/erpnext/issues/53376)) ([42cfbae](42cfbae782))
* do not set valuation rate for invoice without update stock ([7af4aca](7af4acab29))
* enable logs to track changes in doctype. (backport [#53491](https://github.com/frappe/erpnext/issues/53491)) ([#53524](https://github.com/frappe/erpnext/issues/53524)) ([afe8e3a](afe8e3a023))
* handle NoneType error while creating a item (backport [#53313](https://github.com/frappe/erpnext/issues/53313)) ([#53351](https://github.com/frappe/erpnext/issues/53351)) ([4a7fdd1](4a7fdd1f91))
* initialize all tax columns to resolve Key error in `item_wise_sales_register` and `item_wise_purchase_register` reports (backport [#53323](https://github.com/frappe/erpnext/issues/53323)) ([#53582](https://github.com/frappe/erpnext/issues/53582)) ([573a402](573a402ee5))
* **italy:** fix e-invoice ScontoMaggiorazione structure and included_in_print_rate support (backport [#53334](https://github.com/frappe/erpnext/issues/53334)) ([#53569](https://github.com/frappe/erpnext/issues/53569)) ([535543d](535543d406))
* **manufacturing:** update working hours validation (backport [#53559](https://github.com/frappe/erpnext/issues/53559)) ([#53567](https://github.com/frappe/erpnext/issues/53567)) ([49ac166](49ac166f9e))
* move show_general_ledger to Asset Repair form events ([0a5fe99](0a5fe99d4a))
* NoneType error when template description is to be copied to variant (backport [#53358](https://github.com/frappe/erpnext/issues/53358)) ([#53366](https://github.com/frappe/erpnext/issues/53366)) ([24910cf](24910cf2d2))
* **p&l_statement:** disable accumulated value filter by default (backport [#53488](https://github.com/frappe/erpnext/issues/53488)) ([#53490](https://github.com/frappe/erpnext/issues/53490)) ([1ecc04c](1ecc04c7a2))
* precision issue in production plan (backport [#53370](https://github.com/frappe/erpnext/issues/53370)) ([#53374](https://github.com/frappe/erpnext/issues/53374)) ([6660e64](6660e643bb))
* re-calculate taxes and totals after resetting bundle item rate (backport [#53342](https://github.com/frappe/erpnext/issues/53342)) ([#53350](https://github.com/frappe/erpnext/issues/53350)) ([541bfb6](541bfb664b))
* **regional:** rename duplicate Customer fields in Italy setup (backport [#50921](https://github.com/frappe/erpnext/issues/50921)) ([#53398](https://github.com/frappe/erpnext/issues/53398)) ([41bcf96](41bcf96601))
* remove payables and receivables workspace ([c48a886](c48a8868c2))
* remove redundant pos print format ([#53348](https://github.com/frappe/erpnext/issues/53348)) ([270a294](270a294e81))
* remove supplier selection dialog when creating Purchase Order from Material Request (backport [#53391](https://github.com/frappe/erpnext/issues/53391)) ([#53476](https://github.com/frappe/erpnext/issues/53476)) ([3603048](36030483e5))
* remove workspace sidebar for payables and receivables ([4e5703c](4e5703c223))
* sales order indicator should be based on available qty rather th… (backport [#53456](https://github.com/frappe/erpnext/issues/53456)) ([#53458](https://github.com/frappe/erpnext/issues/53458)) ([ab8fe14](ab8fe146ab))
* **sales_invoice:** reset payment methods on `pos_profile` change (backport [#53514](https://github.com/frappe/erpnext/issues/53514)) ([#53561](https://github.com/frappe/erpnext/issues/53561)) ([4d197b1](4d197b1b7c))
* **serial_and_batch_bundle_selector:** handle CSV attachment properly (backport [#53460](https://github.com/frappe/erpnext/issues/53460)) ([#53462](https://github.com/frappe/erpnext/issues/53462)) ([3b2ae7b](3b2ae7ba4f))
* stock adjustment entry ([cecdcff](cecdcffce8))
* **stock:** fix the property setter (backport [#53422](https://github.com/frappe/erpnext/issues/53422)) ([#53574](https://github.com/frappe/erpnext/issues/53574)) ([9ccafd3](9ccafd30be))
* **support-settings:** disable the auto-close tickets feature if `close_issue_after_days` is set to 0 (backport [#53499](https://github.com/frappe/erpnext/issues/53499)) ([#53505](https://github.com/frappe/erpnext/issues/53505)) ([b7400b9](b7400b9b35))
* update child item schedule_date and prevent past dates (backport [#53298](https://github.com/frappe/erpnext/issues/53298)) ([#53346](https://github.com/frappe/erpnext/issues/53346)) ([a4d2c34](a4d2c34dde))
* update item description in Production Plan Assembly Items table ([d43c04d](d43c04df88))
* update label on company change ([bb98acb](bb98acb0c0))
* use bom source warehouse in WO created from PP (backport [#53478](https://github.com/frappe/erpnext/issues/53478)) ([#53480](https://github.com/frappe/erpnext/issues/53480)) ([31ab757](31ab75787e))
* use correct filter to get the composite assets ([82eb200](82eb200c73))
* use qb to prevent incorrect sql due to user permissions ([236f1bb](236f1bbfdb))
* use same label ([10cb6f8](10cb6f8306))
* valuation rate for no Use Batch wise Valuation batches ([8f31b0d](8f31b0dccd))

### Features

* Adding requested qty in packed item (backport [#53486](https://github.com/frappe/erpnext/issues/53486)) ([#53521](https://github.com/frappe/erpnext/issues/53521)) ([8753ed9](8753ed9992))
* show subsidiary companies value in purchase analytics ([c8afc04](c8afc04957))
* **stock:** implement fallback logic for Delivery Trip address mapping (backport [#53260](https://github.com/frappe/erpnext/issues/53260)) ([#53444](https://github.com/frappe/erpnext/issues/53444)) ([6ca5f35](6ca5f355bf))
2026-03-18 04:58:22 +00:00
diptanilsaha
bd16af46b6 Merge pull request #53576 from frappe/version-16-hotfix 2026-03-18 10:26:47 +05:30
mergify[bot]
dd0013e844 chore: make supplier data expanded by default in PI (backport #53565) (#53579)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-18 10:08:46 +05:30
mergify[bot]
573a402ee5 fix: initialize all tax columns to resolve Key error in item_wise_sales_register and item_wise_purchase_register reports (backport #53323) (#53582)
Co-authored-by: Lakshit Jain <ljain112@gmail.com>
fix: initialize all tax columns to resolve Key error in `item_wise_sales_register` and `item_wise_purchase_register` reports (#53323)
2026-03-18 09:00:33 +05:30
Khushi Rawat
0089f7a1d5 Merge pull request #53572 from frappe/mergify/bp/version-16-hotfix/pr-53446
fix: fetch accounting dimensions from child row in asset creation (backport #53446)
2026-03-18 00:14:49 +05:30
mergify[bot]
4d197b1b7c fix(sales_invoice): reset payment methods on pos_profile change (backport #53514) (#53561)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(sales_invoice): reset payment methods on `pos_profile` change (#53514)
2026-03-17 17:21:11 +00:00
mergify[bot]
535543d406 fix(italy): fix e-invoice ScontoMaggiorazione structure and included_in_print_rate support (backport #53334) (#53569)
Co-authored-by: Arturo <tamburro92@users.noreply.github.com>
fix(italy): fix e-invoice ScontoMaggiorazione structure and included_in_print_rate support (#53334)
2026-03-17 22:09:25 +05:30
mergify[bot]
49ac166f9e fix(manufacturing): update working hours validation (backport #53559) (#53567)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(manufacturing): update working hours validation (#53559)
2026-03-17 22:08:44 +05:30
mergify[bot]
9ccafd30be fix(stock): fix the property setter (backport #53422) (#53574)
Co-authored-by: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com>
fix(stock): fix the property setter (#53422)
2026-03-17 22:07:43 +05:30
mergify[bot]
5515346e24 chore: add documentation link in valuation method field (backport #53564) (#53571)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-17 22:01:00 +05:30
[Kesavan-001]
2df491bf22 Fix:Cost center mapping issue
(cherry picked from commit e0fb31f81e)
2026-03-17 16:08:34 +00:00
[Kesavan-001]
3e75d4ea60 Fix:Cost center mapping issue
(cherry picked from commit a084feba96)
2026-03-17 16:08:34 +00:00
[Kesavan-001]
748467f27f Fix:Cost center mapping issue
(cherry picked from commit 10fe8580d5)
2026-03-17 16:08:34 +00:00
diptanilsaha
a8bf6ada89 Merge branch 'version-16' into version-16-hotfix 2026-03-17 20:20:04 +05:30
ruthra kumar
75c9512e38 Merge pull request #53552 from frappe/mergify/bp/version-16-hotfix/pr-53535
fix: remove payables and receivables workspace (backport #53535)
2026-03-17 18:40:36 +05:30
ravibharathi656
4e5703c223 fix: remove workspace sidebar for payables and receivables 2026-03-17 18:23:40 +05:30
ruthra kumar
46d492df65 Merge pull request #53553 from frappe/mergify/bp/version-16-hotfix/pr-53322
fix: add icon in clear demo data (backport #53322)
2026-03-17 17:45:08 +05:30
ruthra kumar
f7a8e64818 Merge pull request #53550 from frappe/mergify/bp/version-16-hotfix/pr-53548
fix: incorrect user perms in queries (backport #53548)
2026-03-17 17:13:52 +05:30
ravibharathi656
c48a8868c2 fix: remove payables and receivables workspace
(cherry picked from commit 26a9646407)

# Conflicts:
#	erpnext/patches.txt
2026-03-17 17:08:45 +05:30
sokumon
10cb6f8306 fix: use same label
(cherry picked from commit ed3444de5a)
2026-03-17 11:36:20 +00:00
sokumon
0c9ce9306f fix: add icon in clear demo data
(cherry picked from commit 413b119ec6)
2026-03-17 11:36:19 +00:00
ruthra kumar
1786c04298 Merge pull request #53529 from frappe/mergify/bp/version-16-hotfix/pr-52675
fix(banking): include paid purchase invoices in reports and bank clearance (backport #52675)
2026-03-17 17:00:59 +05:30
ruthra kumar
236f1bbfdb fix: use qb to prevent incorrect sql due to user permissions
(cherry picked from commit 04b967bd6d)
2026-03-17 16:44:02 +05:30
ruthra kumar
d352322688 chore: remove incorrect import
(cherry picked from commit fc2edfbded)

# Conflicts:
#	erpnext/controllers/queries.py
2026-03-17 11:02:54 +00:00
mergify[bot]
e2a34ab3fe fix: Creating new item price incase of changes in expired item price (backport #53534) (#53545)
Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
Co-authored-by: Nishka Gosalia <nishkagosalia@Nishkas-MacBook-Air.local>
fix: Creating new item price incase of changes in expired item price (#53534)
2026-03-17 10:24:35 +00:00
rohitwaghchaure
ccecc2bd70 Merge pull request #53538 from frappe/mergify/bp/version-16-hotfix/pr-53500
fix: valuation rate for no Use Batch wise Valuation batches (backport #53500)
2026-03-17 15:04:29 +05:30
Rohit Waghchaure
8f31b0dccd fix: valuation rate for no Use Batch wise Valuation batches
(cherry picked from commit 4befa15198)
2026-03-17 08:43:27 +00:00
Nikhil Kothari
427d5cf502 chore: remove conflicts 2026-03-17 11:26:28 +05:30
Nikhil Kothari
a8e7d82746 Merge branch 'version-16-hotfix' into mergify/bp/version-16-hotfix/pr-52675 2026-03-17 11:25:06 +05:30
rohitwaghchaure
b2d14bd947 Merge pull request #53519 from frappe/mergify/bp/version-16-hotfix/pr-53513
fix: do not set valuation rate for invoice without update stock (backport #53513)
2026-03-17 11:23:39 +05:30
mergify[bot]
a695a11130 fix: add item_name to quick entry fields in Item doctype (backport #53530) (#53533)
Co-authored-by: Abdus Samad <120767334+Samad-11@users.noreply.github.com>
fix: add item_name to quick entry fields in Item doctype (#53530)
2026-03-17 05:43:50 +00:00
mergify[bot]
afe8e3a023 fix: enable logs to track changes in doctype. (backport #53491) (#53524)
* fix: enable logs to track changes in doctype. (#53491)

Co-authored-by: jeraldin2003 <jeraldin2003>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
(cherry picked from commit e2667ab098)

# Conflicts:
#	erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json

* chore: resolve conflicts

---------

Co-authored-by: Jeraldin P J <113301032+jeraldin2003@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-17 05:32:00 +00:00
mergify[bot]
c8bb55f35b fix: correct overlap detection in JobCard.has_overlap (backport #53473) (#53523)
Co-authored-by: Sanjesh-Raju <sanjesh@tridotstech.com>
Co-authored-by: Sanjesh <rsanjesh64@gmail.com>
Co-authored-by: Tridots Tech <info@tridotstech.com>
fix: correct overlap detection in JobCard.has_overlap (#53473)
2026-03-17 10:42:37 +05:30
Nikhil Kothari
c9efcb7822 fix(banking): include paid purchase invoices in reports and bank clearance (#52675)
* fix(banking): include paid purchase invoices in reports and bank clearance

* fix: condition for amounts not reflected in system

* fix: set Sales Invoice to be the payment document in bank rec

* fix: add additional filter for `is_paid`

* fix: added is_paid

* fix: added invoice number in bank clearance tool

* chore: make requested changes

* fix: exclude opening JEs

* fix: bring back banking icon in desktop

(cherry picked from commit ef32622166)

# Conflicts:
#	erpnext/accounts/doctype/bank_clearance/bank_clearance.py
2026-03-17 04:48:44 +00:00
mergify[bot]
8753ed9992 feat: Adding requested qty in packed item (backport #53486) (#53521)
* feat: Adding requested qty in packed item (#53486)

* feat: Adding requested qty in packed item

* fix: correct import path

---------

Co-authored-by: Nishka Gosalia <nishkagosalia@Nishkas-MacBook-Air.local>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
(cherry picked from commit 953f089c06)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Nishka Gosalia <58264710+nishkagosalia@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-16 18:51:35 +00:00
mergify[bot]
e72f398b7c fix: change "Date" label to "Posting Date" in Sales Invoice and Purchase Invoice (backport #53503) (#53517)
Co-authored-by: Abdus Samad <120767334+Samad-11@users.noreply.github.com>
fix: change "Date" label to "Posting Date" in Sales Invoice and Purchase Invoice (#53503)
2026-03-16 18:26:52 +00:00
Rohit Waghchaure
7af4acab29 fix: do not set valuation rate for invoice without update stock
(cherry picked from commit bec9e48435)
2026-03-16 18:03:55 +00:00
rohitwaghchaure
60163f3df6 Merge pull request #53498 from frappe/mergify/bp/version-16-hotfix/pr-53495
fix: stock adjustment entry (backport #53495)
2026-03-16 18:06:57 +05:30
mergify[bot]
b7400b9b35 fix(support-settings): disable the auto-close tickets feature if close_issue_after_days is set to 0 (backport #53499) (#53505)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(support-settings): disable the auto-close tickets feature if `close_issue_after_days` is set to 0 (#53499)
2026-03-16 12:10:19 +00:00
Rohit Waghchaure
cecdcffce8 fix: stock adjustment entry
(cherry picked from commit af3067ee23)
2026-03-16 09:48:16 +00:00
mergify[bot]
1ecc04c7a2 fix(p&l_statement): disable accumulated value filter by default (backport #53488) (#53490)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(p&l_statement): disable accumulated value filter by default (#53488)
2026-03-16 12:53:48 +05:30
mergify[bot]
31ab75787e fix: use bom source warehouse in WO created from PP (backport #53478) (#53480)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-16 11:05:11 +05:30
ruthra kumar
e1d9598075 Merge pull request #53419 from frappe/mergify/bp/version-16-hotfix/pr-53415
fix: broke cost center filter in get outstanding reference docs (backport #53415)
2026-03-16 10:08:57 +05:30
mergify[bot]
36030483e5 fix: remove supplier selection dialog when creating Purchase Order from Material Request (backport #53391) (#53476)
Co-authored-by: jeraldin2003 <jeraldin2003>
Co-authored-by: Nikhil Kothari <nik.kothari22@live.com>
Co-authored-by: Jeraldin P J <113301032+jeraldin2003@users.noreply.github.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: remove supplier selection dialog when creating Purchase Order from Material Request (#53391)
2026-03-16 04:33:36 +00:00
mergify[bot]
9e40f87339 chore: add docs to project URLs (backport #53467) (#53469)
Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2026-03-15 15:06:59 +01:00
MochaMind
a5e92785b7 chore: update POT file (#53465) 2026-03-15 14:32:05 +01:00
Frappe PR Bot
99a81db4d9 chore(release): Bumped to Version 16.9.1
## [16.9.1](https://github.com/frappe/erpnext/compare/v16.9.0...v16.9.1) (2026-03-15)

### Bug Fixes

* add validation in bom creator function (backport [#53364](https://github.com/frappe/erpnext/issues/53364)) ([#53463](https://github.com/frappe/erpnext/issues/53463)) ([253e7a9](253e7a9398))
2026-03-15 08:22:01 +00:00
mergify[bot]
253e7a9398 fix: add validation in bom creator function (backport #53364) (#53463)
* fix: add validation in bom creator function (#53364)

(cherry picked from commit 9c0c39381f)

# Conflicts:
#	erpnext/manufacturing/doctype/bom_creator/bom_creator.py

* chore: resolve conflict

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
Co-authored-by: diptanilsaha <diptanil@frappe.io>
2026-03-15 13:50:34 +05:30
mergify[bot]
3b2ae7ba4f fix(serial_and_batch_bundle_selector): handle CSV attachment properly (backport #53460) (#53462)
Co-authored-by: diptanilsaha <diptanil@frappe.io>
fix(serial_and_batch_bundle_selector): handle CSV attachment properly (#53460)
2026-03-15 07:44:59 +00:00
mergify[bot]
ab8fe146ab fix: sales order indicator should be based on available qty rather th… (backport #53456) (#53458) 2026-03-15 09:45:54 +05:30
mergify[bot]
6ca5f355bf feat(stock): implement fallback logic for Delivery Trip address mapping (backport #53260) (#53444) 2026-03-14 05:58:04 +00:00
ruthra kumar
c73a05356b Merge pull request #53426 from frappe/mergify/bp/version-16-hotfix/pr-53423
refactor: disable total row in trends report (backport #53423)
2026-03-13 18:20:47 +05:30
ruthra kumar
5fac73c920 refactor: disable total row in trends report
(cherry picked from commit 4dbc72b301)
2026-03-13 12:33:15 +00:00
ruthra kumar
60a9c08f0d fix: broke cost center filter in get outstanding reference docs
(cherry picked from commit 7dfe36fdce)
2026-03-13 09:55:42 +00:00
Khushi Rawat
966eaae3a0 Merge pull request #53417 from frappe/mergify/bp/version-16-hotfix/pr-53416
feat: show subsidiary companies value in purchase analytics (backport #53416)
2026-03-13 14:48:55 +05:30
khushi8112
c8afc04957 feat: show subsidiary companies value in purchase analytics
(cherry picked from commit 9f755ad65a)
2026-03-13 09:12:35 +00:00
mergify[bot]
41c59ac165 Revert "fix(regional): rename duplicate Customer fields in Italy setup" (backport #53409) (#53411)
* Revert "fix(regional): rename duplicate Customer fields in Italy setup" (#53409)

(cherry picked from commit bd87a7e612)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-13 07:48:28 +00:00
Khushi Rawat
9ac52f0b03 Merge pull request #53401 from frappe/mergify/bp/version-16-hotfix/pr-53390
refactor: show company currency in purchase amount label (backport #53390)
2026-03-13 11:40:25 +05:30
Smit Vora
8dcd89b455 Merge pull request #53404 from frappe/mergify/bp/version-16-hotfix/pr-53396
fix: correctly group RMs of same phantom from different FG (backport #53396)
2026-03-13 10:04:35 +05:30
Smit Vora
89b7e11381 chore: phantom qty unused in sub_assembly_items
(cherry picked from commit b1e1c65774)
2026-03-13 04:15:07 +00:00
Smit Vora
f508f4149f test: ensure phantom BOM explosion across all items
(cherry picked from commit 1975ae4486)
2026-03-13 04:15:07 +00:00
Smit Vora
efce145dad fix: correctly group RMs of same phantom from different FG
(cherry picked from commit e57de4311c)
2026-03-13 04:15:06 +00:00
khushi8112
bb98acb0c0 fix: update label on company change
(cherry picked from commit 6219a9e6f0)
2026-03-12 19:19:15 +00:00
khushi8112
abc463bfb8 refactor: show company currency in purchase amount label
(cherry picked from commit b4c82c0f1a)
2026-03-12 19:19:14 +00:00
mergify[bot]
41bcf96601 fix(regional): rename duplicate Customer fields in Italy setup (backport #50921) (#53398)
* fix(regional): rename duplicate Customer fields in Italy setup (#50921)

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c6efc403cd)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Solede <lorenzo.caldara@gmail.com>
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-12 15:22:22 +00:00
Khushi Rawat
0685c0b9ff Merge pull request #53380 from frappe/mergify/bp/version-16-hotfix/pr-53379
fix: use correct filter to get the composite assets (backport #53379)
2026-03-12 15:16:57 +05:30
khushi8112
82eb200c73 fix: use correct filter to get the composite assets
(cherry picked from commit f5a3227349)
2026-03-12 09:40:56 +00:00
mergify[bot]
4af54a7ac7 fix: add validation in bom creator function (backport #53364) (#53368)
* fix: add validation in bom creator function (#53364)

(cherry picked from commit 9c0c39381f)

# Conflicts:
#	erpnext/manufacturing/doctype/bom_creator/bom_creator.py

* chore: resolve conflicts

---------

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-12 09:35:19 +00:00
mergify[bot]
42cfbae782 fix: do not modify rate in the child item merely for comparison (backport #53301) (#53376)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: do not modify rate in the child item merely for comparison (#53301)
2026-03-12 09:27:04 +00:00
mergify[bot]
6660e643bb fix: precision issue in production plan (backport #53370) (#53374)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: precision issue in production plan (#53370)
2026-03-12 09:14:50 +00:00
Khushi Rawat
9a92fc117a Merge pull request #53372 from frappe/mergify/bp/version-16-hotfix/pr-53371
fix: move show_general_ledger to Asset Repair form events (backport #53371)
2026-03-12 14:11:48 +05:30
khushi8112
0a5fe99d4a fix: move show_general_ledger to Asset Repair form events
(cherry picked from commit ac124bdc7e)
2026-03-12 08:35:55 +00:00
Ejaaz Khan
d1d1efdcd1 Merge pull request #53360 from frappe/mergify/bp/version-16-hotfix/pr-53348
fix: remove redundant pos print format (backport #53348)
2026-03-12 12:53:10 +05:30
mergify[bot]
24910cf2d2 fix: NoneType error when template description is to be copied to variant (backport #53358) (#53366)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
fix: NoneType error when template description is to be copied to variant (#53358)
2026-03-12 06:50:55 +00:00
mergify[bot]
ac9ec7e34a refactor: supplier quotation comparision report button should start f… (backport #53361) (#53363)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
2026-03-12 06:19:40 +00:00
Ejaaz Khan
270a294e81 fix: remove redundant pos print format (#53348)
(cherry picked from commit e4d79c6246)
2026-03-12 06:02:51 +00:00
mergify[bot]
4a7fdd1f91 fix: handle NoneType error while creating a item (backport #53313) (#53351)
Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
fix: handle NoneType error while creating a item (#53313)
2026-03-12 05:51:46 +00:00
mergify[bot]
09279f08e3 Feat/shipment default contact (backport #53029) (#53355)
Co-authored-by: David <52141166+sdavidbastos@users.noreply.github.com>
2026-03-12 05:47:32 +00:00
mergify[bot]
82b97abbad fix(delivery note): avoid maintaining si_detail on return delivery note (backport #52456) (#53353)
Co-authored-by: NaviN <118178330+Navin-S-R@users.noreply.github.com>
fix(delivery note): avoid maintaining si_detail on return delivery note (#52456)
2026-03-12 05:26:02 +00:00
mergify[bot]
541bfb664b fix: re-calculate taxes and totals after resetting bundle item rate (backport #53342) (#53350)
Co-authored-by: V Shankar <shankarv292002@gmail.com>
fix: re-calculate taxes and totals after resetting bundle item rate (#53342)
2026-03-12 05:22:27 +00:00
mergify[bot]
a4d2c34dde fix: update child item schedule_date and prevent past dates (backport #53298) (#53346)
Co-authored-by: Pandiyan P <pandiyanpalani37@gmail.com>
fix: update child item schedule_date and prevent past dates (#53298)
2026-03-12 10:30:15 +05:30
Nihantra C. Patel
a857f0b5c2 Merge pull request #53336 from frappe/mergify/bp/version-16-hotfix/pr-53327
fix: Append existing ignored doctypes in Journal Entry on_cancel instead of overwriting (backport #53327)
2026-03-11 16:29:01 +05:30
Nihantra Patel
875114d33c fix: Append existing ignored doctypes in Journal Entry on_cancel instead of overwriting
(cherry picked from commit 39e10c4ab0)
2026-03-11 10:41:48 +00:00
ruthra kumar
4f8b948b91 Merge pull request #53330 from frappe/mergify/bp/version-16-hotfix/pr-53326
refactor: make cost center editable in payment entry deduction (backport #53326)
2026-03-11 15:10:32 +05:30
ruthra kumar
bdc3b0666d refactor: make cost center editable in payment entry deduction
(cherry picked from commit 078b22d985)
2026-03-11 09:23:30 +00:00
Mihir Kandoi
b7b7ec1fba Merge pull request #53325 from frappe/mergify/bp/version-16-hotfix/pr-53312
fix: update item description in Production Plan Assembly Items table (backport #53312)
2026-03-11 14:52:02 +05:30
Parameshwari Palanisamy
b9b551f248 Update production_plan.py
(cherry picked from commit 39e68a9ce7)
2026-03-11 08:49:28 +00:00
creative-paramu
d43c04df88 fix: update item description in Production Plan Assembly Items table
(cherry picked from commit 19533551f4)
2026-03-11 08:49:28 +00:00
Frappe PR Bot
c791d2853a chore(release): Bumped to Version 16.9.0
# [16.9.0](https://github.com/frappe/erpnext/compare/v16.8.3...v16.9.0) (2026-03-10)

### Bug Fixes

* add clear demo data in sidebar ([8e8a7b2](8e8a7b2686))
* add clear demo data in sidebar (backport [#53177](https://github.com/frappe/erpnext/issues/53177)) ([#53197](https://github.com/frappe/erpnext/issues/53197)) ([12ccc38](12ccc3881b))
* allow payment_request to be created in draft ([29d565b](29d565b9de))
* allow user to make QI after submission not working ([6fdb5d4](6fdb5d486a))
* balance qty for inv dimension ([fb17a00](fb17a00fb6))
* better validation message for Purchase Invoice with Update Stock ([839f5f6](839f5f6a29))
* bom UX issues ([733191e](733191eae2))
* consider payment term only when enabled ([1470a79](1470a79a1b))
* disallow all actions on job card if work order is closed ([57aab56](57aab56baa))
* do not update fg_completed_qty when changing qty of fg line item ([8463cf8](8463cf88df))
* fetch payment terms from quotation ([b2f6953](b2f695310c))
* **gross-profit:** apply precision-based rounding to grouped totals ([c6e01aa](c6e01aa1eb))
* handle payment terms template when disabled ([80c2053](80c20531aa))
* **help:** escape query (backport [#53192](https://github.com/frappe/erpnext/issues/53192)) ([#53195](https://github.com/frappe/erpnext/issues/53195)) ([83f2fad](83f2fadbcf))
* HRMS test cases failing due to validation in item ([10538d5](10538d58ad))
* implement coderabbit suggested changes ([b619f6d](b619f6d906))
* **manufacturing:** show returned qty in progress bar ([f853ef9](f853ef9fec))
* migration patch ([7b44e41](7b44e412d9))
* patch failing ([1a62d32](1a62d324fd))
* patch to migrate checkbox data into select ([4d0e28a](4d0e28a608))
* **project template:** clear subject when task is empty ([c8560fa](c8560fa0d3))
* removed non existent patch ([77ec678](77ec67869c))
* **selling:** update delivery date in line items ([6b42a7e](6b42a7e454))
* set default list view columns and filters for sales, purchase and accounts module ([f9a3869](f9a38696b6))
* set default to 1 ([3b7410f](3b7410f2d3))
* skip asset sale processing for internal transfer invoices ([12cfd8e](12cfd8e052))
* stock balance report qty ([699a683](699a683b8e))
* **task:** allow is_template field in quick entry ([2ccf8d0](2ccf8d050f))
* test case ([27c3c1d](27c3c1dee0))
* test cases fixes related to new select box change ([3f11d0b](3f11d0b8ad))
* **UI:** improve asset action buttons group ([78074c0](78074c0cdd))
* **UI:** reposition fields for better UX ([6c23d5b](6c23d5b682))
* update user status depends on employee status ([c7da8e2](c7da8e2471))
* updating costing based on employee change in timesheet ([d251c94](d251c94ea3))
* validation for cancellation ([8f02184](8f02184c80))
* WO produced qty should be calculated using finished item child table transfer qty ([78fa2c5](78fa2c5477))

### Features

* allowing rate modification in update item in quotation ([69b2170](69b217065c))
* **manufacturing:** show disassembled qty in progress bar ([38e5d29](38e5d295c7))
* option to enable serial / batch features ([93a5974](93a597410e))
* organization desktop icon ([e89aaca](e89aaca870))
* **selling-settings:** add checkbox to recalculate payment date ([f7dd730](f7dd730bc3))
2026-03-10 14:59:58 +00:00
ruthra kumar
95ef5b513e Merge pull request #53292 from frappe/version-16-hotfix
chore: release v16
2026-03-10 20:19:47 +05:30
ruthra kumar
46d8028fcc Merge pull request #53300 from frappe/mergify/bp/version-16-hotfix/pr-53256
fix: set default list view columns and filters for sales, purchase and accounts module (backport #53256)
2026-03-10 18:15:32 +05:30
ruthra kumar
c7da21812a chore: resolve conflicts 2026-03-10 17:58:37 +05:30
Nabin Hait
f9a38696b6 fix: set default list view columns and filters for sales, purchase and accounts module
(cherry picked from commit 9cf529215f)

# Conflicts:
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
#	erpnext/buying/doctype/supplier/supplier.json
#	erpnext/stock/doctype/delivery_note/delivery_note.json
2026-03-10 12:22:40 +00:00
ruthra kumar
8f4a6d08d4 Merge pull request #53299 from frappe/mergify/bp/version-16-hotfix/pr-52636
refactor: enhance chart of accounts for India with account categories (backport #52636)
2026-03-10 17:52:39 +05:30
Abdeali Chharchhodawala
edf2f53082 Merge pull request #52636 from Abdeali099/Abdeali/india-coa
refactor: enhance chart of accounts for India with account categories
(cherry picked from commit 0d42faac2e)
2026-03-10 11:51:57 +00:00
ruthra kumar
cc2be4be39 Merge pull request #53297 from frappe/mergify/bp/version-16-hotfix/pr-53071
fix(gross-profit): apply precision-based rounding to grouped totals (backport #53071)
2026-03-10 16:57:25 +05:30
Navin-S-R
c6e01aa1eb fix(gross-profit): apply precision-based rounding to grouped totals
(cherry picked from commit 52dd7665e7)
2026-03-10 11:08:25 +00:00
rohitwaghchaure
0fde990c9e Merge pull request #53289 from frappe/mergify/bp/version-16-hotfix/pr-53283
fix: removed non existent patch (backport #53283)
2026-03-10 14:52:25 +05:30
Mihir Kandoi
4f646a2f2d Merge pull request #53287 from frappe/mergify/bp/version-16-hotfix/pr-53282
fix: allow user to make QI after submission not working (backport #53282)
2026-03-10 14:36:50 +05:30
rohitwaghchaure
0116d4c789 Merge pull request #53285 from frappe/mergify/bp/version-16-hotfix/pr-53281
fix: better validation message for Purchase Invoice with Update Stock (backport #53281)
2026-03-10 14:28:45 +05:30
Rohit Waghchaure
77ec67869c fix: removed non existent patch
(cherry picked from commit c4b3080eae)
2026-03-10 08:56:34 +00:00
Mihir Kandoi
6fdb5d486a fix: allow user to make QI after submission not working
(cherry picked from commit 9f62ec5192)
2026-03-10 08:46:12 +00:00
Rohit Waghchaure
839f5f6a29 fix: better validation message for Purchase Invoice with Update Stock
(cherry picked from commit cfb06cf247)
2026-03-10 08:34:14 +00:00
Mihir Kandoi
005ff0d6a8 Merge pull request #53280 from frappe/mergify/bp/version-16-hotfix/pr-53203
fix: update user status depends on employee status (backport #53203)
2026-03-10 13:25:59 +05:30
Poovitha Palanivelu
c7da8e2471 fix: update user status depends on employee status
(cherry picked from commit 194d060f13)
2026-03-10 07:40:18 +00:00
Mihir Kandoi
1a46a8fec0 Merge pull request #53277 from frappe/mergify/bp/version-16-hotfix/pr-53235
fix: update item row delivery dates when header delivery date changes in sales order (backport #53235)
2026-03-10 13:09:41 +05:30
Pandiyan37
6b42a7e454 fix(selling): update delivery date in line items
(cherry picked from commit 77367b5517)
2026-03-10 07:24:01 +00:00
rohitwaghchaure
da617fdc11 Merge pull request #53273 from frappe/mergify/bp/version-16-hotfix/pr-53272
fix: patch failing (backport #53272)
2026-03-10 12:12:25 +05:30
Rohit Waghchaure
1a62d324fd fix: patch failing
(cherry picked from commit 6024c4a077)
2026-03-10 06:32:40 +00:00
rohitwaghchaure
db841dde4c Merge pull request #53259 from frappe/mergify/bp/version-16-hotfix/pr-53254
fix: bom UX issues (backport #53254)
2026-03-10 03:34:39 +05:30
ruthra kumar
e3d7a94307 Merge pull request #53261 from frappe/mergify/bp/version-16-hotfix/pr-53160
fix: allow payment_request to be created in draft (backport #53160)
2026-03-09 20:32:51 +05:30
ervishnucs
29d565b9de fix: allow payment_request to be created in draft
(cherry picked from commit 24825a16e0)
2026-03-09 14:54:36 +00:00
Rohit Waghchaure
733191eae2 fix: bom UX issues
(cherry picked from commit 32447b8204)
2026-03-09 12:48:17 +00:00
Khushi Rawat
572c3cdc74 Merge pull request #53248 from frappe/mergify/bp/version-16-hotfix/pr-53242
refactor: replace raw SQL with query builder in asset depreciation and balances report (backport #53242)
2026-03-09 16:01:13 +05:30
Mihir Kandoi
b55bf7d660 Merge pull request #53250 from frappe/mergify/bp/version-16-hotfix/pr-53249
fix :buttons not visible on purchase and sales order (backport #53249)
2026-03-09 15:24:01 +05:30
Nishka Gosalia
76a32686a5 fix :buttons not visible on purchase and sales order
(cherry picked from commit 829dbbe12b)
2026-03-09 09:36:06 +00:00
khushi8112
73354356e1 refactor: more functions in same file
(cherry picked from commit f496995415)
2026-03-09 09:28:32 +00:00
khushi8112
c6000c0522 refactor: replace raw SQL with query builder in asset depreciation and balannces report
(cherry picked from commit 314c882f3b)
2026-03-09 09:28:32 +00:00
rohitwaghchaure
b0fc21b8ed Merge pull request #53244 from frappe/mergify/bp/version-16-hotfix/pr-53239
fix: validation for cancellation (backport #53239)
2026-03-09 13:40:52 +05:30
Rohit Waghchaure
8f02184c80 fix: validation for cancellation
(cherry picked from commit 8de272a8a1)
2026-03-09 07:49:38 +00:00
Mihir Kandoi
ddb441359e Merge pull request #53241 from frappe/mergify/bp/version-16-hotfix/pr-53234
fix(manufacturing): show returned qty in progress bar (backport #53234)
2026-03-09 12:42:16 +05:30
Sudharsanan11
38e5d295c7 feat(manufacturing): show disassembled qty in progress bar
(cherry picked from commit ae9ff767fa)
2026-03-09 07:04:47 +00:00
Sudharsanan11
f853ef9fec fix(manufacturing): show returned qty in progress bar
(cherry picked from commit 8027f5aafd)
2026-03-09 07:04:47 +00:00
MochaMind
1131313d20 chore: update POT file (#53232) 2026-03-08 19:43:22 +01:00
ruthra kumar
1a52fa2a03 Merge pull request #53229 from frappe/mergify/bp/version-16-hotfix/pr-53227
refactor: party type and party filter for comparison report (backport #53227)
2026-03-08 05:50:03 +05:30
ruthra kumar
42b4fe2f68 refactor: party type and party filter for comparison report
(cherry picked from commit b6f9c0844e)
2026-03-07 12:50:03 +00:00
rohitwaghchaure
aaa29a3ce8 Merge pull request #53219 from frappe/mergify/bp/version-16-hotfix/pr-53218
fix: HRMS test cases failing due to validation in item (backport #53218)
2026-03-06 18:51:07 +05:30
Rohit Waghchaure
10538d58ad fix: HRMS test cases failing due to validation in item
(cherry picked from commit 6702506f58)
2026-03-06 12:24:59 +00:00
Khushi Rawat
716645ea1d Merge pull request #52999 from khushi8112/pr-52968
refactor: assets module form cleanup (backport #52393)
2026-03-06 15:09:26 +05:30
Khushi Rawat
3aeee125a4 Merge branch 'version-16-hotfix' into pr-52968 2026-03-06 14:46:32 +05:30
ruthra kumar
12ccc3881b fix: add clear demo data in sidebar (backport #53177) (#53197)
fix: add clear demo data in sidebar

(cherry picked from commit 6603005822)

Co-authored-by: sokumon <sohamkulkarns9@gmail.com>
2026-03-06 14:12:42 +05:30
rohitwaghchaure
b510f78510 Merge pull request #53208 from frappe/mergify/bp/version-16-hotfix/pr-53200
fix: stock balance report qty (backport #53200)
2026-03-06 13:14:55 +05:30
rohitwaghchaure
a02aa9eb05 Merge pull request #53204 from frappe/mergify/bp/version-16-hotfix/pr-52549
feat: option to enable serial / batch feature (backport #52549)
2026-03-06 13:07:31 +05:30
Rohit Waghchaure
699a683b8e fix: stock balance report qty
(cherry picked from commit a15e5fdc4e)
2026-03-06 07:15:46 +00:00
rohitwaghchaure
0685a9241e chore: fix conflicts
Remove merge conflict markers and update patch list.
2026-03-06 12:44:55 +05:30
Rohit Waghchaure
93a597410e feat: option to enable serial / batch features
(cherry picked from commit 82c3da5b1e)

# Conflicts:
#	erpnext/patches.txt
2026-03-06 06:48:17 +00:00
sokumon
8e8a7b2686 fix: add clear demo data in sidebar
(cherry picked from commit 6603005822)
2026-03-05 18:14:18 +00:00
mergify[bot]
83f2fadbcf fix(help): escape query (backport #53192) (#53195)
fix(help): escape query (#53192)


(cherry picked from commit 702adda000)

Signed-off-by: Akhil Narang <me@akhilnarang.dev>
Co-authored-by: Akhil Narang <me@akhilnarang.dev>
2026-03-05 18:40:54 +05:30
rohitwaghchaure
fff9750f48 Merge pull request #53181 from frappe/mergify/bp/version-16-hotfix/pr-52745
fix: balance qty for inv dimension (backport #52745)
2026-03-05 14:26:49 +05:30
rohitwaghchaure
fdf0d6611d Merge pull request #53182 from frappe/mergify/bp/version-16-hotfix/pr-52956
feat: organization desktop icon (backport #52956)
2026-03-05 14:26:35 +05:30
Rohit Waghchaure
e89aaca870 feat: organization desktop icon
(cherry picked from commit 4e9a2a327f)
2026-03-05 08:36:29 +00:00
Rohit Waghchaure
fb17a00fb6 fix: balance qty for inv dimension
(cherry picked from commit a3eafe5b18)
2026-03-05 08:20:20 +00:00
rohitwaghchaure
96f7eb1194 Merge pull request #53178 from frappe/mergify/bp/version-16-hotfix/pr-53170
chore: New org icon (backport #53170)
2026-03-05 13:49:12 +05:30
jacob-salvi
1938a56164 chore: new organisation icon
(cherry picked from commit 6f93210b9b)
2026-03-05 08:10:14 +00:00
jacob-salvi
f97e0f8c9c chore: new accounting icons
(cherry picked from commit 728c678cf9)
2026-03-05 08:10:14 +00:00
Nishka Gosalia
f410bfcea6 Merge pull request #53175 from frappe/mergify/bp/version-16-hotfix/pr-52924 2026-03-05 12:17:40 +05:30
Jatin3128
6793c1455c Merge pull request #53174 from frappe/mergify/bp/version-16-hotfix/pr-52138
feat(selling-settings): add checkbox to fetch payment terms (backport #52138)
2026-03-05 12:12:08 +05:30
Nishka Gosalia
4386af1df7 refactor: project module form cleanup
(cherry picked from commit 3c9f520e68)
2026-03-05 06:28:05 +00:00
SowmyaArunachalam
92003df7f9 test: test payment terms with backdated entries
(cherry picked from commit 8aae46a25e)
2026-03-05 06:20:47 +00:00
SowmyaArunachalam
b2f695310c fix: fetch payment terms from quotation
(cherry picked from commit 99ed1c34f3)
2026-03-05 06:20:47 +00:00
SowmyaArunachalam
3b7410f2d3 fix: set default to 1
(cherry picked from commit 8b9e02fd44)
2026-03-05 06:20:47 +00:00
SowmyaArunachalam
80c20531aa fix: handle payment terms template when disabled
(cherry picked from commit f23dc07914)
2026-03-05 06:20:46 +00:00
SowmyaArunachalam
8f26168a55 test: enable automatically_fetch_payment_terms_from_quotation
(cherry picked from commit 5611e9168e)
2026-03-05 06:20:46 +00:00
SowmyaArunachalam
1470a79a1b fix: consider payment term only when enabled
(cherry picked from commit b1149fe950)
2026-03-05 06:20:46 +00:00
SowmyaArunachalam
f7dd730bc3 feat(selling-settings): add checkbox to recalculate payment date
(cherry picked from commit 70b401e610)
2026-03-05 06:20:46 +00:00
Nishka Gosalia
f428663f0d Merge pull request #53171 from frappe/mergify/bp/version-16-hotfix/pr-52415
fix(project template): clear subject when task is empty (backport #52415)
2026-03-05 11:49:59 +05:30
ravibharathi656
2ccf8d050f fix(task): allow is_template field in quick entry
(cherry picked from commit 7801dd5353)
2026-03-05 06:01:44 +00:00
ravibharathi656
c8560fa0d3 fix(project template): clear subject when task is empty
(cherry picked from commit c1431105f4)
2026-03-05 06:01:43 +00:00
Mihir Kandoi
c3d8918ee4 Merge pull request #53167 from frappe/mergify/bp/version-16-hotfix/pr-53166
fix: WO produced qty should be calculated using finished item child t… (backport #53166)
2026-03-04 20:50:06 +05:30
Mihir Kandoi
78fa2c5477 fix: WO produced qty should be calculated using finished item child table transfer qty
(cherry picked from commit 5fead1d17a)
2026-03-04 15:04:39 +00:00
Mihir Kandoi
0aa63e0ae9 Merge pull request #53165 from frappe/mergify/bp/version-16-hotfix/pr-53157
fix: disallow all actions on job card if work order is closed (backport #53157)
2026-03-04 17:11:10 +05:30
Khushi Rawat
b984f5f1b0 Merge pull request #53163 from frappe/mergify/bp/version-16-hotfix/pr-53154
fix: skip asset sale processing for internal transfer invoices (backport #53154)
2026-03-04 17:01:07 +05:30
Mihir Kandoi
57aab56baa fix: disallow all actions on job card if work order is closed
(cherry picked from commit ee19c32c3a)
2026-03-04 11:21:53 +00:00
khushi8112
12cfd8e052 fix: skip asset sale processing for internal transfer invoices
(cherry picked from commit 9cb3dad079)
2026-03-04 11:07:25 +00:00
Nishka Gosalia
0361ee0444 Merge pull request #53159 from frappe/mergify/bp/version-16-hotfix/pr-53156
fix: updating costing based on employee change in timesheet (backport #53156)
2026-03-04 16:35:18 +05:30
Nishka Gosalia
d251c94ea3 fix: updating costing based on employee change in timesheet
(cherry picked from commit e37d4a6f7c)
2026-03-04 10:43:09 +00:00
mergify[bot]
76a6ff9026 Merge pull request #53096 from frappe/mergify/bp/version-16-hotfix/pr-52838
fix: correct fields being updated on material request and purchase or… (backport #52838)
2026-03-04 07:23:39 +00:00
Nishka Gosalia
bf774527fb Merge pull request #53151 from frappe/mergify/bp/version-16-hotfix/pr-53147 2026-03-04 12:34:31 +05:30
Nishka Gosalia
69b217065c feat: allowing rate modification in update item in quotation
(cherry picked from commit 2ec02e477f)
2026-03-04 06:50:13 +00:00
Mihir Kandoi
e5a9bc8193 Merge pull request #53149 from frappe/mergify/bp/version-16-hotfix/pr-53148
fix: do not update fg_completed_qty when changing qty of fg line item (backport #53148)
2026-03-04 12:11:17 +05:30
Mihir Kandoi
8463cf88df fix: do not update fg_completed_qty when changing qty of fg line item
(cherry picked from commit 2d83069b82)
2026-03-04 06:40:12 +00:00
Khushi Rawat
aac26aa19c Merge pull request #53030 from frappe/mergify/bp/version-16-hotfix/pr-53004
refactor: use query builder for Tax Rule validation query (backport #53004)
2026-03-04 11:32:54 +05:30
khushi8112
e2800e343e refactor: use query builder for Tax Rule validation query
(cherry picked from commit 235e3adbcb)
2026-02-27 18:24:47 +00:00
khushi8112
7b44e412d9 fix: migration patch 2026-02-26 16:35:24 +05:30
khushi8112
7f6b8a3e40 chore: linters check
(cherry picked from commit 4f59d580c4)
2026-02-26 15:34:32 +05:30
khushi8112
b619f6d906 fix: implement coderabbit suggested changes
(cherry picked from commit d1b81b96a5)
2026-02-26 15:34:32 +05:30
khushi8112
194b158e18 refactor: asset repair UI changes
(cherry picked from commit 9f7bfc0e36)
2026-02-26 15:34:32 +05:30
khushi8112
f9b6336dd5 refactor: asset capitalization form cleanup
(cherry picked from commit eb7932ed73)
2026-02-26 15:34:32 +05:30
khushi8112
3f11d0b8ad fix: test cases fixes related to new select box change
(cherry picked from commit e8e8d233ab)
2026-02-26 15:34:32 +05:30
khushi8112
27c3c1dee0 fix: test case
(cherry picked from commit f2f509234b)
2026-02-26 15:34:31 +05:30
khushi8112
78074c0cdd fix(UI): improve asset action buttons group
(cherry picked from commit e90a3b5a56)
2026-02-26 15:34:31 +05:30
khushi8112
4d0e28a608 fix: patch to migrate checkbox data into select
(cherry picked from commit c36fa5bdb6)
2026-02-26 15:34:25 +05:30
khushi8112
87a7bc6f49 refactor: use selectbox instead of checkboxes for asset type
(cherry picked from commit f7b9221324)
2026-02-26 15:33:34 +05:30
khushi8112
6c23d5b682 fix(UI): reposition fields for better UX
(cherry picked from commit 4e7794bfc3)
2026-02-26 15:33:34 +05:30
783 changed files with 21820 additions and 13283 deletions

View File

@@ -43,3 +43,6 @@ jobs:
- name: Run Semgrep rules
run: semgrep ci --config ./frappe-semgrep-rules/rules --config r/python.lang.correctness
- name: Semgrep for Test Correctness
run: semgrep ci --include=**/test_*.py --config ./semgrep/test-correctness.yml

View File

@@ -4,8 +4,8 @@ on:
workflow_dispatch:
concurrency:
group: server-individual-tests-develop-${{ github.event_name }}-${{ github.event.number || github.event_name == 'workflow_dispatch' && github.run_id || '' }}
cancel-in-progress: false
group: server-individual-tests-lightmode-develop
cancel-in-progress: true
permissions:
contents: read
@@ -21,7 +21,7 @@ jobs:
- id: set-matrix
run: |
# Use grep and find to get the list of test files
matrix=$(find . -path '*/doctype/*/test_*.py' | xargs grep -l 'def test_' | awk '{
matrix=$(find . -path '*/test_*.py' | xargs grep -l 'def test_' | sort | awk '{
# Remove ./ prefix, file extension, and replace / with .
gsub(/^\.\//, "", $0)
gsub(/\.py$/, "", $0)
@@ -58,6 +58,7 @@ jobs:
strategy:
fail-fast: false
matrix: ${{fromJson(needs.discover.outputs.matrix)}}
max-parallel: 14
name: Test
@@ -130,4 +131,13 @@ jobs:
FRAPPE_BRANCH: ${{ github.event.inputs.branch }}
- name: Run Tests
run: 'cd ~/frappe-bench/ && bench --site test_site run-tests --app erpnext --module ${{ matrix.test }}'
run: |
site_name=$(echo "${{matrix.test}}" | sed -e 's/.*\.\(test_.*$\)/\1/')
echo "$site_name"
mkdir ~/frappe-bench/sites/$site_name
cp -r "${GITHUB_WORKSPACE}/.github/helper/site_config_mariadb.json" ~/frappe-bench/sites/$site_name/site_config.json
cd ~/frappe-bench/
bench --site $site_name reinstall --yes
bench --site $site_name set-config allow_tests true
bench --site $site_name run-tests --module ${{ matrix.test }} --lightmode

View File

@@ -129,7 +129,7 @@ jobs:
FRAPPE_BRANCH: ${{ github.event.client_payload.sha || github.event.inputs.branch }}
- name: Run Tests
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }} --with-coverage'
run: 'cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --lightmode --app erpnext --total-builds ${{ strategy.job-total }} --build-number ${{ matrix.container }} --with-coverage'
env:
TYPE: server

View File

@@ -6,7 +6,7 @@ import frappe
from frappe.model.document import Document
from frappe.utils.user import is_website_user
__version__ = "16.8.3"
__version__ = "16.15.1"
def get_default_company(user=None):

View File

@@ -524,7 +524,8 @@ def make_gl_entries(
if gl_entries:
try:
make_gl_entries(gl_entries, cancel=(doc.docstatus == 2), merge_entries=True)
frappe.db.commit()
if not frappe.in_test:
frappe.db.commit()
except Exception as e:
if frappe.in_test:
doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")
@@ -606,7 +607,8 @@ def book_revenue_via_journal_entry(
if submit:
journal_entry.submit()
frappe.db.commit()
if not frappe.in_test:
frappe.db.commit()
except Exception:
frappe.db.rollback()
doc.log_error(f"Error while processing deferred accounting for Invoice {doc.name}")

View File

@@ -203,7 +203,7 @@
"idx": 1,
"is_tree": 1,
"links": [],
"modified": "2025-08-02 06:26:44.657146",
"modified": "2026-04-14 18:14:42.202065",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
@@ -256,6 +256,14 @@
"role": "Accounts Manager",
"share": 1,
"write": 1
},
{
"role": "HR User",
"select": 1
},
{
"role": "HR Manager",
"select": 1
}
],
"row_format": "Dynamic",

View File

@@ -52,60 +52,55 @@ frappe.treeview_settings["Account"] = {
],
root_label: "Accounts",
get_tree_nodes: "erpnext.accounts.utils.get_children",
on_get_node: function (nodes, deep = false) {
if (frappe.boot.user.can_read.indexOf("GL Entry") == -1) return;
on_node_render: function (node, deep) {
const render_balances = () => {
for (let account of cur_tree.account_balance_data) {
const node = cur_tree.nodes && cur_tree.nodes[account.value];
if (!node || node.is_root) continue;
let accounts = [];
if (deep) {
// in case of `get_all_nodes`
accounts = nodes.reduce((acc, node) => [...acc, ...node.data], []);
} else {
accounts = nodes;
}
// show Dr if positive since balance is calculated as debit - credit else show Cr
const balance = account.balance_in_account_currency || account.balance;
const dr_or_cr = balance > 0 ? __("Dr") : __("Cr");
const format = (value, currency) => format_currency(Math.abs(value), currency);
frappe.db.get_single_value("Accounts Settings", "show_balance_in_coa").then((value) => {
if (value) {
const get_balances = frappe.call({
method: "erpnext.accounts.utils.get_account_balances",
args: {
accounts: accounts,
company: cur_tree.args.company,
include_default_fb_balances: true,
},
});
get_balances.then((r) => {
if (!r.message || r.message.length == 0) return;
for (let account of r.message) {
const node = cur_tree.nodes && cur_tree.nodes[account.value];
if (!node || node.is_root) continue;
// show Dr if positive since balance is calculated as debit - credit else show Cr
const balance = account.balance_in_account_currency || account.balance;
const dr_or_cr = balance > 0 ? __("Dr") : __("Cr");
const format = (value, currency) => format_currency(Math.abs(value), currency);
if (account.balance !== undefined) {
node.parent && node.parent.find(".balance-area").remove();
$(
'<span class="balance-area pull-right">' +
(account.balance_in_account_currency
? format(
account.balance_in_account_currency,
account.account_currency
) + " / "
: "") +
format(account.balance, account.company_currency) +
" " +
dr_or_cr +
"</span>"
).insertBefore(node.$ul);
}
}
});
if (account.balance !== undefined) {
node.parent && node.parent.find(".balance-area").remove();
$(
'<span class="balance-area pull-right">' +
(account.account_currency != account.company_currency
? format(account.balance_in_account_currency, account.account_currency) +
" / "
: "") +
format(account.balance, account.company_currency) +
" " +
dr_or_cr +
"</span>"
).insertBefore(node.$ul);
}
}
});
};
if (frappe.boot.user.can_read.indexOf("GL Entry") == -1) return;
if (!cur_tree.account_balance_data) {
frappe.db.get_single_value("Accounts Settings", "show_balance_in_coa").then((value) => {
if (value) {
frappe.call({
method: "erpnext.accounts.utils.get_account_balances_coa",
args: {
company: cur_tree.args.company,
include_default_fb_balances: true,
},
callback: function (r) {
if (!r.message || r.message.length === 0) return;
cur_tree.account_balance_data = r.message || [];
render_balances();
},
});
}
});
} else {
render_balances();
}
},
add_tree_node: "erpnext.accounts.utils.add_ac",
menu_items: [

View File

@@ -6,64 +6,83 @@
"Current Assets": {
"Accounts Receivable": {
"Debtors": {
"account_type": "Receivable"
"account_type": "Receivable",
"account_category": "Trade Receivables"
}
},
"Bank Accounts": {
"account_type": "Bank",
"is_group": 1
"is_group": 1,
"account_category": "Cash and Cash Equivalents"
},
"Cash In Hand": {
"Cash": {
"account_type": "Cash"
"account_type": "Cash",
"account_category": "Cash and Cash Equivalents"
},
"account_type": "Cash"
"account_type": "Cash",
"account_category": "Cash and Cash Equivalents"
},
"Loans and Advances (Assets)": {
"is_group": 1
"is_group": 1,
"account_category": "Other Receivables"
},
"Securities and Deposits": {
"Earnest Money": {}
"Earnest Money": {
"account_category": "Other Current Assets"
}
},
"Stock Assets": {
"Stock In Hand": {
"account_type": "Stock"
"account_type": "Stock",
"account_category": "Stock Assets"
},
"account_type": "Stock"
"account_type": "Stock",
"account_category": "Stock Assets"
},
"Tax Assets": {
"is_group": 1
"is_group": 1,
"account_category": "Other Current Assets"
}
},
"Fixed Assets": {
"Capital Equipment": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Electronic Equipment": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Furniture and Fixtures": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Office Equipment": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Plants and Machineries": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Buildings": {
"account_type": "Fixed Asset"
"account_type": "Fixed Asset",
"account_category": "Tangible Assets"
},
"Accumulated Depreciations": {
"account_type": "Accumulated Depreciation"
"account_type": "Accumulated Depreciation",
"account_category": "Tangible Assets"
}
},
"Investments": {
"is_group": 1
"is_group": 1,
"account_category": "Long-term Investments"
},
"Temporary Accounts": {
"Temporary Opening": {
"account_type": "Temporary"
"account_type": "Temporary",
"account_category": "Other Non-current Assets"
}
},
"root_type": "Asset"
@@ -72,55 +91,103 @@
"Direct Expenses": {
"Stock Expenses": {
"Cost of Goods Sold": {
"account_type": "Cost of Goods Sold"
"account_type": "Cost of Goods Sold",
"account_category": "Cost of Goods Sold"
},
"Expenses Included In Valuation": {
"account_type": "Expenses Included In Valuation"
"account_type": "Expenses Included In Valuation",
"account_category": "Other Direct Costs"
},
"Stock Adjustment": {
"account_type": "Stock Adjustment"
"account_type": "Stock Adjustment",
"account_category": "Other Direct Costs"
}
}
},
"Indirect Expenses": {
"Administrative Expenses": {},
"Commission on Sales": {},
"Administrative Expenses": {
"account_category": "Operating Expenses"
},
"Commission on Sales": {
"account_category": "Operating Expenses"
},
"Depreciation": {
"account_type": "Depreciation"
"account_type": "Depreciation",
"account_category": "Operating Expenses"
},
"Entertainment Expenses": {
"account_category": "Operating Expenses"
},
"Entertainment Expenses": {},
"Freight and Forwarding Charges": {
"account_type": "Chargeable"
"account_type": "Chargeable",
"account_category": "Operating Expenses"
},
"Legal Expenses": {
"account_category": "Operating Expenses"
},
"Marketing Expenses": {
"account_type": "Chargeable",
"account_category": "Operating Expenses"
},
"Miscellaneous Expenses": {
"account_type": "Chargeable",
"account_category": "Operating Expenses"
},
"Office Maintenance Expenses": {
"account_category": "Operating Expenses"
},
"Office Rent": {
"account_category": "Operating Expenses"
},
"Postal Expenses": {
"account_category": "Operating Expenses"
},
"Print and Stationery": {
"account_category": "Operating Expenses"
},
"Legal Expenses": {},
"Marketing Expenses": {},
"Miscellaneous Expenses": {},
"Office Maintenance Expenses": {},
"Office Rent": {},
"Postal Expenses": {},
"Print and Stationery": {},
"Rounded Off": {
"account_type": "Round Off"
"account_type": "Round Off",
"account_category": "Operating Expenses"
},
"Salary": {},
"Sales Expenses": {},
"Telephone Expenses": {},
"Travel Expenses": {},
"Utility Expenses": {},
"Write Off": {},
"Exchange Gain/Loss": {},
"Gain/Loss on Asset Disposal": {},
"Impairment": {}
"Salary": {
"account_category": "Operating Expenses"
},
"Sales Expenses": {
"account_category": "Operating Expenses"
},
"Telephone Expenses": {
"account_category": "Operating Expenses"
},
"Travel Expenses": {
"account_category": "Operating Expenses"
},
"Utility Expenses": {
"account_category": "Operating Expenses"
},
"Write Off": {
"account_category": "Operating Expenses"
},
"Exchange Gain/Loss": {
"account_category": "Operating Expenses"
},
"Gain/Loss on Asset Disposal": {
"account_category": "Other Operating Income"
},
"Impairment": {
"account_category": "Operating Expenses"
}
},
"root_type": "Expense"
},
"Income": {
"Direct Income": {
"Sales": {
"account_type": "Income Account"
"account_type": "Income Account",
"account_category": "Revenue from Operations"
},
"Service": {
"account_type": "Income Account"
"account_type": "Income Account",
"account_category": "Revenue from Operations"
},
"account_type": "Income Account"
},
@@ -132,31 +199,51 @@
},
"Source of Funds (Liabilities)": {
"Capital Account": {
"Reserves and Surplus": {},
"Shareholders Funds": {},
"Revaluation Surplus": {}
"Reserves and Surplus": {
"account_category": "Reserves and Surplus"
},
"Shareholders Funds": {
"account_category": "Share Capital"
},
"Revaluation Surplus": {
"account_category": "Reserves and Surplus"
}
},
"Current Liabilities": {
"Accounts Payable": {
"Creditors": {
"account_type": "Payable"
"account_type": "Payable",
"account_category": "Trade Payables"
},
"Payroll Payable": {}
"Payroll Payable": {
"account_category": "Other Payables"
}
},
"Stock Liabilities": {
"Stock Received But Not Billed": {
"account_type": "Stock Received But Not Billed"
"account_type": "Stock Received But Not Billed",
"account_category": "Trade Payables"
}
},
"Duties and Taxes": {
"TDS": {
"account_type": "Tax"
}
"account_type": "Tax",
"account_category": "Current Tax Liabilities"
},
"account_type": "Tax",
"is_group": 1,
"account_category": "Current Tax Liabilities"
},
"Loans (Liabilities)": {
"Secured Loans": {},
"Unsecured Loans": {},
"Bank Overdraft Account": {}
"Secured Loans": {
"account_category": "Long-term Borrowings"
},
"Unsecured Loans": {
"account_category": "Long-term Borrowings"
},
"Bank Overdraft Account": {
"account_category": "Short-term Borrowings"
}
}
},
"root_type": "Liability"

View File

@@ -3,7 +3,6 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import nowdate
from erpnext.accounts.doctype.account.account import (
@@ -12,11 +11,10 @@ from erpnext.accounts.doctype.account.account import (
update_account_number,
)
from erpnext.stock import get_company_default_inventory_account, get_warehouse_account
EXTRA_TEST_RECORD_DEPENDENCIES = ["Company"]
from erpnext.tests.utils import ERPNextTestSuite
class TestAccount(IntegrationTestCase):
class TestAccount(ERPNextTestSuite):
def test_rename_account(self):
if not frappe.db.exists("Account", "1210 - Debtors - _TC"):
acc = frappe.new_doc("Account")
@@ -323,72 +321,6 @@ class TestAccount(IntegrationTestCase):
self.assertEqual(balance, 0)
def _make_test_records(verbose=None):
from frappe.tests.utils import make_test_objects
accounts = [
# [account_name, parent_account, is_group]
["_Test Bank", "Bank Accounts", 0, "Bank", None],
["_Test Bank USD", "Bank Accounts", 0, "Bank", "USD"],
["_Test Bank EUR", "Bank Accounts", 0, "Bank", "EUR"],
["_Test Cash", "Cash In Hand", 0, "Cash", None],
["_Test Account Stock Expenses", "Direct Expenses", 1, None, None],
["_Test Account Shipping Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
["_Test Account Customs Duty", "_Test Account Stock Expenses", 0, "Tax", None],
["_Test Account Insurance Charges", "_Test Account Stock Expenses", 0, "Chargeable", None],
["_Test Account Stock Adjustment", "_Test Account Stock Expenses", 0, "Stock Adjustment", None],
["_Test Employee Advance", "Current Liabilities", 0, None, None],
["_Test Account Tax Assets", "Current Assets", 1, None, None],
["_Test Account VAT", "_Test Account Tax Assets", 0, "Tax", None],
["_Test Account Service Tax", "_Test Account Tax Assets", 0, "Tax", None],
["_Test Account Reserves and Surplus", "Current Liabilities", 0, None, None],
["_Test Account Cost for Goods Sold", "Expenses", 0, None, None],
["_Test Account Excise Duty", "_Test Account Tax Assets", 0, "Tax", None],
["_Test Account Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
["_Test Account S&H Education Cess", "_Test Account Tax Assets", 0, "Tax", None],
["_Test Account CST", "Direct Expenses", 0, "Tax", None],
["_Test Account Discount", "Direct Expenses", 0, None, None],
["_Test Write Off", "Indirect Expenses", 0, None, None],
["_Test Exchange Gain/Loss", "Indirect Expenses", 0, None, None],
["_Test Account Sales", "Direct Income", 0, None, None],
# related to Account Inventory Integration
["_Test Account Stock In Hand", "Current Assets", 0, None, None],
# fixed asset depreciation
["_Test Fixed Asset", "Current Assets", 0, "Fixed Asset", None],
["_Test Accumulated Depreciations", "Current Assets", 0, "Accumulated Depreciation", None],
["_Test Depreciations", "Expenses", 0, "Depreciation", None],
["_Test Gain/Loss on Asset Disposal", "Expenses", 0, None, None],
# Receivable / Payable Account
["_Test Receivable", "Current Assets", 0, "Receivable", None],
["_Test Payable", "Current Liabilities", 0, "Payable", None],
["_Test Receivable USD", "Current Assets", 0, "Receivable", "USD"],
["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"],
]
for company, abbr in [
["_Test Company", "_TC"],
["_Test Company 1", "_TC1"],
["_Test Company with perpetual inventory", "TCP1"],
]:
test_objects = make_test_objects(
"Account",
[
{
"doctype": "Account",
"account_name": account_name,
"parent_account": parent_account + " - " + abbr,
"company": company,
"is_group": is_group,
"account_type": account_type,
"account_currency": currency,
}
for account_name, parent_account, is_group, account_type, currency in accounts
],
)
return test_objects
def get_inventory_account(company, warehouse=None):
account = None
if warehouse:

View File

@@ -1,6 +0,0 @@
[
{
"doctype": "Account",
"name": "_Test Account 1"
}
]

View File

@@ -26,8 +26,13 @@
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-10-15 03:19:47.171349",
"links": [
{
"link_doctype": "Account",
"link_fieldname": "account_category"
}
],
"modified": "2026-02-23 01:19:49.589393",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account Category",

View File

@@ -2,19 +2,3 @@
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase
# On IntegrationTestCase, the doctype test records and all
# link-field test record dependencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
class IntegrationTestAccountCategory(IntegrationTestCase):
"""
Integration tests for AccountCategory.
Use this class for testing interactions between multiple components.
"""
pass

View File

@@ -2,8 +2,9 @@
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestAccountClosingBalance(IntegrationTestCase):
class TestAccountClosingBalance(ERPNextTestSuite):
pass

View File

@@ -82,7 +82,7 @@ class AccountingDimension(Document):
else:
frappe.throw(_("Company {0} is added more than once").format(frappe.bold(default.company)))
def after_insert(self):
def on_update(self):
if frappe.in_test:
make_dimension_in_accounting_doctypes(doc=self)
else:
@@ -103,10 +103,6 @@ class AccountingDimension(Document):
if not self.fieldname:
self.fieldname = scrub(self.label)
def on_update(self):
frappe.flags.accounting_dimensions = None
frappe.flags.accounting_dimensions_details = None
def make_dimension_in_accounting_doctypes(doc, doclist=None):
if not doclist:
@@ -241,34 +237,26 @@ def get_doctypes_with_dimensions():
return frappe.get_hooks("accounting_dimension_doctypes")
def get_accounting_dimensions(as_list=True, filters=None):
if not filters:
filters = {"disabled": 0}
if frappe.flags.accounting_dimensions is None:
frappe.flags.accounting_dimensions = frappe.get_all(
"Accounting Dimension",
fields=["label", "fieldname", "disabled", "document_type"],
filters=filters,
)
def get_accounting_dimensions(as_list=True):
accounting_dimensions = frappe.get_all(
"Accounting Dimension",
fields=["label", "fieldname", "disabled", "document_type"],
filters={"disabled": 0},
)
if as_list:
return [d.fieldname for d in frappe.flags.accounting_dimensions]
return [d.fieldname for d in accounting_dimensions]
else:
return frappe.flags.accounting_dimensions
return accounting_dimensions
def get_checks_for_pl_and_bs_accounts():
if frappe.flags.accounting_dimensions_details is None:
# nosemgrep
frappe.flags.accounting_dimensions_details = frappe.db.sql(
"""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
return frappe.db.sql(
"""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c
WHERE p.name = c.parent AND p.disabled = 0""",
as_dict=1,
)
return frappe.flags.accounting_dimensions_details
as_dict=1,
)
def get_dimension_with_children(doctype, dimensions):

View File

@@ -3,18 +3,13 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
EXTRA_TEST_RECORD_DEPENDENCIES = ["Cost Center", "Location", "Warehouse", "Department"]
from erpnext.tests.utils import ERPNextTestSuite
class TestAccountingDimension(IntegrationTestCase):
def setUp(self):
create_dimension()
class TestAccountingDimension(ERPNextTestSuite):
def test_dimension_against_sales_invoice(self):
si = create_sales_invoice(do_not_save=1)
@@ -79,68 +74,3 @@ class TestAccountingDimension(IntegrationTestCase):
si.save()
self.assertRaises(frappe.ValidationError, si.submit)
def tearDown(self):
disable_dimension()
frappe.flags.accounting_dimensions_details = None
frappe.flags.dimension_filter_map = None
def create_dimension():
frappe.set_user("Administrator")
if not frappe.db.exists("Accounting Dimension", {"document_type": "Department"}):
dimension = frappe.get_doc(
{
"doctype": "Accounting Dimension",
"document_type": "Department",
}
)
dimension.append(
"dimension_defaults",
{
"company": "_Test Company",
"reference_document": "Department",
"default_dimension": "_Test Department - _TC",
},
)
dimension.insert()
dimension.save()
else:
dimension = frappe.get_doc("Accounting Dimension", "Department")
dimension.disabled = 0
dimension.save()
if not frappe.db.exists("Accounting Dimension", {"document_type": "Location"}):
dimension1 = frappe.get_doc(
{
"doctype": "Accounting Dimension",
"document_type": "Location",
}
)
dimension1.append(
"dimension_defaults",
{
"company": "_Test Company",
"reference_document": "Location",
"default_dimension": "Block 1",
},
)
dimension1.insert()
dimension1.save()
else:
dimension1 = frappe.get_doc("Accounting Dimension", "Location")
dimension1.disabled = 0
dimension1.save()
def disable_dimension():
dimension1 = frappe.get_doc("Accounting Dimension", "Department")
dimension1.disabled = 1
dimension1.save()
dimension2 = frappe.get_doc("Accounting Dimension", "Location")
dimension2.disabled = 1
dimension2.save()

View File

@@ -69,37 +69,34 @@ class AccountingDimensionFilter(Document):
def get_dimension_filter_map():
if not frappe.flags.get("dimension_filter_map"):
filters = frappe.db.sql(
"""
SELECT
a.applicable_on_account, d.dimension_value, p.accounting_dimension,
p.allow_or_restrict, p.fieldname, a.is_mandatory
FROM
`tabApplicable On Account` a,
`tabAccounting Dimension Filter` p
LEFT JOIN `tabAllowed Dimension` d ON d.parent = p.name
WHERE
p.name = a.parent
AND p.disabled = 0
""",
as_dict=1,
filters = frappe.db.sql(
"""
SELECT
a.applicable_on_account, d.dimension_value, p.accounting_dimension,
p.allow_or_restrict, p.fieldname, a.is_mandatory
FROM
`tabApplicable On Account` a,
`tabAccounting Dimension Filter` p
LEFT JOIN `tabAllowed Dimension` d ON d.parent = p.name
WHERE
p.name = a.parent
AND p.disabled = 0
""",
as_dict=1,
)
dimension_filter_map = {}
for f in filters:
build_map(
dimension_filter_map,
f.fieldname,
f.applicable_on_account,
f.dimension_value,
f.allow_or_restrict,
f.is_mandatory,
)
dimension_filter_map = {}
for f in filters:
build_map(
dimension_filter_map,
f.fieldname,
f.applicable_on_account,
f.dimension_value,
f.allow_or_restrict,
f.is_mandatory,
)
frappe.flags.dimension_filter_map = dimension_filter_map
return frappe.flags.dimension_filter_map
return dimension_filter_map
def build_map(map_object, dimension, account, filter_value, allow_or_restrict, is_mandatory):

View File

@@ -5,19 +5,13 @@ import unittest
import frappe
from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
create_dimension,
disable_dimension,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError
EXTRA_TEST_RECORD_DEPENDENCIES = ["Location", "Cost Center", "Department"]
from erpnext.tests.utils import ERPNextTestSuite
class TestAccountingDimensionFilter(unittest.TestCase):
class TestAccountingDimensionFilter(ERPNextTestSuite):
def setUp(self):
create_dimension()
create_accounting_dimension_filter()
self.invoice_list = []
@@ -44,17 +38,6 @@ class TestAccountingDimensionFilter(unittest.TestCase):
self.assertRaises(MandatoryAccountDimensionError, si.submit)
self.invoice_list.append(si)
def tearDown(self):
disable_dimension_filter()
disable_dimension()
frappe.flags.accounting_dimensions_details = None
frappe.flags.dimension_filter_map = None
for si in self.invoice_list:
si.load_from_db()
if si.docstatus == 1:
si.cancel()
def create_accounting_dimension_filter():
if not frappe.db.get_value("Accounting Dimension Filter", {"accounting_dimension": "Cost Center"}):

View File

@@ -20,7 +20,6 @@
{
"fieldname": "period_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Period Name",
"reqd": 1,
"unique": 1
@@ -79,7 +78,7 @@
}
],
"links": [],
"modified": "2025-12-01 16:53:44.631299",
"modified": "2026-03-09 17:15:33.577217",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting Period",

View File

@@ -97,7 +97,7 @@ def validate_accounting_period_on_doc_save(doc, method=None):
if doc.doctype == "Bank Clearance":
return
elif doc.doctype == "Asset":
if doc.is_existing_asset:
if doc.asset_type == "Existing Asset":
return
else:
date = doc.available_for_use_date

View File

@@ -3,7 +3,6 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import add_months, nowdate
from erpnext.accounts.doctype.accounting_period.accounting_period import (
@@ -11,11 +10,10 @@ from erpnext.accounts.doctype.accounting_period.accounting_period import (
OverlapError,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"]
from erpnext.tests.utils import ERPNextTestSuite
class TestAccountingPeriod(IntegrationTestCase):
class TestAccountingPeriod(ERPNextTestSuite):
def test_overlap(self):
ap1 = create_accounting_period(
start_date="2018-04-01", end_date="2018-06-30", company="Wind Power LLC"
@@ -90,10 +88,6 @@ class TestAccountingPeriod(IntegrationTestCase):
doc.submit() # Should not raise
self.assertEqual(doc.docstatus, 1)
def tearDown(self):
for d in frappe.get_all("Accounting Period"):
frappe.delete_doc("Accounting Period", d.name)
def create_accounting_period(**args):
args = frappe._dict(args)

View File

@@ -2,7 +2,15 @@
// For license information, please see license.txt
frappe.ui.form.on("Accounts Settings", {
refresh: function (frm) {},
refresh: function (frm) {
frm.set_query("document_type", "repost_allowed_types", function (doc, cdt, cdn) {
return {
filters: {
name: ["in", frappe.boot.sysdefaults.repost_allowed_doctypes],
},
};
});
},
enable_immutable_ledger: function (frm) {
if (!frm.doc.enable_immutable_ledger) {
return;

View File

@@ -62,9 +62,12 @@
"reconciliation_queue_size",
"column_break_resa",
"exchange_gain_loss_posting_date",
"repost_section",
"repost_allowed_types",
"payment_options_section",
"enable_loyalty_point_program",
"column_break_ctam",
"fetch_payment_schedule_in_payment_request",
"invoicing_settings_tab",
"accounts_transactions_settings_section",
"over_billing_allowance",
@@ -205,7 +208,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 ",
@@ -688,6 +691,30 @@
"fieldname": "enable_accounting_dimensions",
"fieldtype": "Check",
"label": "Enable Accounting Dimensions"
},
{
"default": "1",
"description": "Enable Subscription tracking in invoice",
"fieldname": "enable_subscription",
"fieldtype": "Check",
"label": "Enable Subscription"
},
{
"default": "1",
"fieldname": "fetch_payment_schedule_in_payment_request",
"fieldtype": "Check",
"label": "Fetch Payment Schedule In Payment Request"
},
{
"fieldname": "repost_section",
"fieldtype": "Section Break",
"label": "Repost"
},
{
"fieldname": "repost_allowed_types",
"fieldtype": "Table",
"label": "Allowed Doctypes",
"options": "Repost Allowed Types"
}
],
"grid_page_length": 50,
@@ -697,7 +724,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2026-02-04 17:15:38.609327",
"modified": "2026-04-13 15:30:28.729627",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",

View File

@@ -10,6 +10,9 @@ from frappe.custom.doctype.property_setter.property_setter import make_property_
from frappe.model.document import Document
from frappe.utils import cint
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
from erpnext.accounts.utils import sync_auto_reconcile_config
SELLING_DOCTYPES = [
@@ -44,6 +47,8 @@ class AccountsSettings(Document):
if TYPE_CHECKING:
from frappe.types import DF
from erpnext.accounts.doctype.repost_allowed_types.repost_allowed_types import RepostAllowedTypes
add_taxes_from_item_tax_template: DF.Check
add_taxes_from_taxes_and_charges_template: DF.Check
allow_multi_currency_invoices_against_single_party_account: DF.Check
@@ -73,6 +78,7 @@ class AccountsSettings(Document):
enable_loyalty_point_program: DF.Check
enable_party_matching: DF.Check
exchange_gain_loss_posting_date: DF.Literal["Invoice", "Payment", "Reconciliation Date"]
fetch_payment_schedule_in_payment_request: DF.Check
fetch_valuation_rate_for_internal_transaction: DF.Check
general_ledger_remarks_length: DF.Int
ignore_account_closing_balance: DF.Check
@@ -85,6 +91,7 @@ class AccountsSettings(Document):
receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"]
receivable_payable_remarks_length: DF.Int
reconciliation_queue_size: DF.Int
repost_allowed_types: DF.Table[RepostAllowedTypes]
role_allowed_to_over_bill: DF.Link | None
role_to_notify_on_depreciation_failure: DF.Link | None
role_to_override_stop_action: DF.Link | None
@@ -139,6 +146,7 @@ class AccountsSettings(Document):
frappe.clear_cache()
self.validate_and_sync_auto_reconcile_config()
self.update_property_for_accounting_dimension()
def validate_stale_days(self):
if not self.allow_stale and cint(self.stale_days) <= 0:
@@ -185,6 +193,17 @@ class AccountsSettings(Document):
title=_("Auto Tax Settings Error"),
)
def update_property_for_accounting_dimension(self):
doctypes = [entry.document_type for entry in self.repost_allowed_types]
if not doctypes:
return
from erpnext.accounts.doctype.repost_accounting_ledger.repost_accounting_ledger import get_child_docs
doctypes += get_child_docs(doctypes)
set_allow_on_submit_for_dimension_fields(doctypes)
@frappe.whitelist()
def drop_ar_sql_procedures(self):
from erpnext.accounts.report.accounts_receivable.accounts_receivable import InitSQLProceduresForAR
@@ -224,3 +243,12 @@ def create_property_setter_for_hiding_field(doctype, field_name, hide):
"Check",
validate_fields_for_doctype=False,
)
def set_allow_on_submit_for_dimension_fields(doctypes):
for dt in doctypes:
meta = frappe.get_meta(dt)
for dimension in get_accounting_dimensions():
df = meta.get_field(dimension)
if df and not df.allow_on_submit:
frappe.db.set_value("Custom Field", dt + "-" + dimension, "allow_on_submit", 1)

View File

@@ -1,17 +1,11 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestAccountsSettings(IntegrationTestCase):
def tearDown(self):
# Just in case `save` method succeeds, we need to take things back to default so that other tests
# don't break
cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
cur_settings.allow_stale = 1
cur_settings.save()
class TestAccountsSettings(ERPNextTestSuite):
def test_stale_days(self):
cur_settings = frappe.get_doc("Accounts Settings", "Accounts Settings")
cur_settings.allow_stale = 0

View File

@@ -2,7 +2,6 @@
# See license.txt
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import nowdate, today
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
@@ -10,14 +9,13 @@ from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
# On IntegrationTestCase, the doctype test records and all
# On ERPNextTestSuite, the doctype test records and all
# link-field test record depdendencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
from erpnext.tests.utils import ERPNextTestSuite
class TestAdvancePaymentLedgerEntry(AccountsTestMixin, IntegrationTestCase):
class TestAdvancePaymentLedgerEntry(ERPNextTestSuite, AccountsTestMixin):
"""
Integration tests for AdvancePaymentLedgerEntry.
Use this class for testing interactions between multiple components.
@@ -30,9 +28,6 @@ class TestAdvancePaymentLedgerEntry(AccountsTestMixin, IntegrationTestCase):
self.create_item()
self.clear_old_entries()
def tearDown(self):
frappe.db.rollback()
def create_sales_order(self, qty=1, rate=100, currency="INR", do_not_submit=False):
"""
Helper method

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBank(IntegrationTestCase):
class TestBank(ERPNextTestSuite):
pass

View File

@@ -116,6 +116,7 @@ def get_default_company_bank_account(company, party_type, party):
@frappe.whitelist()
def get_bank_account_details(bank_account):
frappe.has_permission("Bank Account", doc=bank_account, ptype="read", throw=True)
return frappe.get_cached_value(
"Bank Account", bank_account, ["account", "bank", "bank_account_no"], as_dict=1
)

View File

@@ -2,10 +2,8 @@
# See license.txt
import unittest
import frappe
from frappe import ValidationError
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBankAccount(IntegrationTestCase):
class TestBankAccount(ERPNextTestSuite):
pass

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBankAccountSubtype(IntegrationTestCase):
class TestBankAccountSubtype(ERPNextTestSuite):
pass

View File

@@ -3,8 +3,8 @@
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBankAccountType(IntegrationTestCase):
class TestBankAccountType(ERPNextTestSuite):
pass

View File

@@ -5,8 +5,10 @@
import frappe
from frappe import _, msgprint
from frappe.model.document import Document
from frappe.query_builder import Case
from frappe.query_builder.custom import ConstantColumn
from frappe.utils import cint, flt, fmt_money, get_link_to_form, getdate
from frappe.query_builder.functions import Coalesce, Sum
from frappe.utils import cint, flt, fmt_money, getdate
from pypika import Order
import erpnext
@@ -182,65 +184,162 @@ def get_payment_entries_for_bank_clearance(
):
entries = []
condition = ""
pe_condition = ""
journal_entry = frappe.qb.DocType("Journal Entry")
journal_entry_account = frappe.qb.DocType("Journal Entry Account")
journal_entry_query = (
frappe.qb.from_(journal_entry_account)
.inner_join(journal_entry)
.on(journal_entry_account.parent == journal_entry.name)
.select(
ConstantColumn("Journal Entry").as_("payment_document"),
journal_entry.name.as_("payment_entry"),
journal_entry.cheque_no.as_("cheque_number"),
journal_entry.cheque_date,
Sum(journal_entry_account.debit_in_account_currency).as_("debit"),
Sum(journal_entry_account.credit_in_account_currency).as_("credit"),
journal_entry.posting_date,
journal_entry_account.against_account,
journal_entry.clearance_date,
journal_entry_account.account_currency,
)
.where(
(journal_entry_account.account == account)
& (journal_entry.docstatus == 1)
& (journal_entry.posting_date >= from_date)
& (journal_entry.posting_date <= to_date)
& (journal_entry.is_opening == "No")
)
)
if not include_reconciled_entries:
condition = "and (clearance_date IS NULL or clearance_date='0000-00-00')"
pe_condition = "and (pe.clearance_date IS NULL or pe.clearance_date='0000-00-00')"
journal_entry_query = journal_entry_query.where(
(journal_entry.clearance_date.isnull()) | (journal_entry.clearance_date == "0000-00-00")
)
journal_entries = frappe.db.sql(
f"""
select
"Journal Entry" as payment_document, t1.name as payment_entry,
t1.cheque_no as cheque_number, t1.cheque_date,
sum(t2.debit_in_account_currency) as debit, sum(t2.credit_in_account_currency) as credit,
t1.posting_date, t2.against_account, t1.clearance_date, t2.account_currency
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
where
t2.parent = t1.name and t2.account = %(account)s and t1.docstatus=1
and t1.posting_date >= %(from)s and t1.posting_date <= %(to)s
and ifnull(t1.is_opening, 'No') = 'No' {condition}
group by t2.account, t1.name
order by t1.posting_date ASC, t1.name DESC
""",
{"account": account, "from": from_date, "to": to_date},
as_dict=1,
journal_entries = (
journal_entry_query.groupby(journal_entry_account.account, journal_entry.name)
.orderby(journal_entry.posting_date)
.orderby(journal_entry.name, order=Order.desc)
).run(as_dict=True)
pe = frappe.qb.DocType("Payment Entry")
company = frappe.qb.DocType("Company")
payment_entry_query = (
frappe.qb.from_(pe)
.join(company)
.on(pe.company == company.name)
.select(
ConstantColumn("Payment Entry").as_("payment_document"),
pe.name.as_("payment_entry"),
pe.reference_no.as_("cheque_number"),
pe.reference_date.as_("cheque_date"),
(
Case()
.when(
pe.paid_from == account,
(
pe.paid_amount
+ (
Case()
.when(
(pe.payment_type == "Pay")
& (company.default_currency == pe.paid_from_account_currency),
pe.base_total_taxes_and_charges,
)
.else_(pe.total_taxes_and_charges)
)
),
)
.else_(0)
).as_("credit"),
(
Case()
.when(pe.paid_from == account, 0)
.else_(
pe.received_amount
+ (
Case()
.when(
company.default_currency == pe.paid_to_account_currency,
pe.base_total_taxes_and_charges,
)
.else_(pe.total_taxes_and_charges)
)
)
).as_("debit"),
pe.posting_date,
Coalesce(pe.party, Case().when(pe.paid_from == account, pe.paid_to).else_(pe.paid_from)).as_(
"against_account"
),
pe.clearance_date,
(
Case()
.when(pe.paid_to == account, pe.paid_to_account_currency)
.else_(pe.paid_from_account_currency)
).as_("account_currency"),
)
.where(
((pe.paid_from == account) | (pe.paid_to == account))
& (pe.docstatus == 1)
& (pe.posting_date >= from_date)
& (pe.posting_date <= to_date)
)
)
payment_entries = frappe.db.sql(
f"""
select
"Payment Entry" as payment_document, pe.name as payment_entry,
pe.reference_no as cheque_number, pe.reference_date as cheque_date,
if(pe.paid_from=%(account)s, pe.paid_amount + if(pe.payment_type = 'Pay' and c.default_currency = pe.paid_from_account_currency, pe.base_total_taxes_and_charges, pe.total_taxes_and_charges) , 0) as credit,
if(pe.paid_from=%(account)s, 0, pe.received_amount + pe.total_taxes_and_charges) as debit,
pe.posting_date, ifnull(pe.party,if(pe.paid_from=%(account)s,pe.paid_to,pe.paid_from)) as against_account, pe.clearance_date,
if(pe.paid_to=%(account)s, pe.paid_to_account_currency, pe.paid_from_account_currency) as account_currency
from `tabPayment Entry` as pe
join `tabCompany` c on c.name = pe.company
where
(pe.paid_from=%(account)s or pe.paid_to=%(account)s) and pe.docstatus=1
and pe.posting_date >= %(from)s and pe.posting_date <= %(to)s
{pe_condition}
order by
pe.posting_date ASC, pe.name DESC
""",
{
"account": account,
"from": from_date,
"to": to_date,
},
as_dict=1,
if not include_reconciled_entries:
payment_entry_query = payment_entry_query.where(
(pe.clearance_date.isnull()) | (pe.clearance_date == "0000-00-00")
)
payment_entries = (payment_entry_query.orderby(pe.posting_date).orderby(pe.name, order=Order.desc)).run(
as_dict=True
)
pos_sales_invoices, pos_purchase_invoices = [], []
acc = frappe.qb.DocType("Account")
pi = frappe.qb.DocType("Purchase Invoice")
paid_purchase_invoices_query = (
frappe.qb.from_(pi)
.inner_join(acc)
.on(pi.cash_bank_account == acc.name)
.select(
ConstantColumn("Purchase Invoice").as_("payment_document"),
pi.name.as_("payment_entry"),
pi.paid_amount.as_("credit"),
pi.posting_date,
pi.supplier.as_("against_account"),
pi.bill_no.as_("cheque_number"),
pi.clearance_date,
acc.account_currency,
ConstantColumn(0).as_("debit"),
)
.where(
(pi.docstatus == 1)
& (pi.is_paid == 1)
& (pi.cash_bank_account == account)
& (pi.posting_date >= from_date)
& (pi.posting_date <= to_date)
)
)
if not include_reconciled_entries:
paid_purchase_invoices_query = paid_purchase_invoices_query.where(
(pi.clearance_date.isnull()) | (pi.clearance_date == "0000-00-00")
)
paid_purchase_invoices = (
paid_purchase_invoices_query.orderby(pi.posting_date).orderby(pi.name, order=Order.desc)
).run(as_dict=True)
pos_sales_invoices = []
if include_pos_transactions:
si_payment = frappe.qb.DocType("Sales Invoice Payment")
si = frappe.qb.DocType("Sales Invoice")
acc = frappe.qb.DocType("Account")
pos_sales_invoices = (
pos_sales_invoices_query = (
frappe.qb.from_(si_payment)
.inner_join(si)
.on(si_payment.parent == si.name)
@@ -263,38 +362,22 @@ def get_payment_entries_for_bank_clearance(
& (si.posting_date >= from_date)
& (si.posting_date <= to_date)
)
.orderby(si.posting_date)
.orderby(si.name, order=Order.desc)
).run(as_dict=True)
)
pi = frappe.qb.DocType("Purchase Invoice")
if not include_reconciled_entries:
pos_sales_invoices_query = pos_sales_invoices_query.where(
(si_payment.clearance_date.isnull()) | (si_payment.clearance_date == "0000-00-00")
)
pos_purchase_invoices = (
frappe.qb.from_(pi)
.inner_join(acc)
.on(pi.cash_bank_account == acc.name)
.select(
ConstantColumn("Purchase Invoice").as_("payment_document"),
pi.name.as_("payment_entry"),
pi.paid_amount.as_("credit"),
pi.posting_date,
pi.supplier.as_("against_account"),
pi.clearance_date,
acc.account_currency,
ConstantColumn(0).as_("debit"),
)
.where(
(pi.docstatus == 1)
& (pi.cash_bank_account == account)
& (pi.posting_date >= from_date)
& (pi.posting_date <= to_date)
)
.orderby(pi.posting_date)
.orderby(pi.name, order=Order.desc)
pos_sales_invoices = (
pos_sales_invoices_query.orderby(si.posting_date).orderby(si.name, order=Order.desc)
).run(as_dict=True)
entries = (
list(payment_entries) + list(journal_entries) + list(pos_sales_invoices) + list(pos_purchase_invoices)
list(payment_entries)
+ list(journal_entries)
+ list(pos_sales_invoices)
+ list(paid_purchase_invoices)
)
return entries

View File

@@ -3,7 +3,6 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import add_months, getdate
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
@@ -15,13 +14,12 @@ from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.stock.doctype.item.test_item import create_item
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
from erpnext.tests.utils import if_lending_app_installed, if_lending_app_not_installed
from erpnext.tests.utils import ERPNextTestSuite, if_lending_app_installed, if_lending_app_not_installed
class TestBankClearance(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
class TestBankClearance(ERPNextTestSuite):
def setUp(self):
frappe.clear_cache()
create_warehouse(
warehouse_name="_Test Warehouse",
properties={"parent_warehouse": "All Warehouses - _TC"},

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBankGuarantee(IntegrationTestCase):
class TestBankGuarantee(ERPNextTestSuite):
pass

View File

@@ -4,7 +4,6 @@
import frappe
from frappe import qb
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, today
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
@@ -13,9 +12,10 @@ from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool
)
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.tests.utils import ERPNextTestSuite
class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase):
class TestBankReconciliationTool(ERPNextTestSuite, AccountsTestMixin):
def setUp(self):
self.create_company()
self.create_customer()
@@ -24,9 +24,6 @@ class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase):
qb.from_(bank_dt).delete().where(bank_dt.name == "HDFC").run()
self.create_bank_account()
def tearDown(self):
frappe.db.rollback()
def create_bank_account(self):
bank = frappe.get_doc(
{
@@ -43,6 +40,7 @@ class TestBankReconciliationTool(AccountsTestMixin, IntegrationTestCase):
"bank": bank.name,
"is_company_account": True,
"account": self.bank, # account from Chart of Accounts
"company": self.company,
}
)
.insert()

View File

@@ -1,15 +1,14 @@
# Copyright (c) 2020, Frappe Technologies and Contributors
# See license.txt
import unittest
from erpnext.accounts.doctype.bank_statement_import.bank_statement_import import (
is_mt940_format,
preprocess_mt940_content,
)
from erpnext.tests.utils import ERPNextTestSuite
class TestBankStatementImport(unittest.TestCase):
class TestBankStatementImport(ERPNextTestSuite):
"""Unit tests for Bank Statement Import functions"""
def test_preprocess_mt940_content_with_long_statement_number(self):

View File

@@ -2,27 +2,20 @@
# License: GNU General Public License v3. See license.txt
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import nowdate
from erpnext.accounts.doctype.bank_transaction.test_bank_transaction import create_bank_account
from erpnext.tests.utils import ERPNextTestSuite
IBAN_1 = "DE02000000003716541159"
IBAN_2 = "DE02500105170137075030"
class TestAutoMatchParty(IntegrationTestCase):
@classmethod
def setUpClass(cls):
class TestAutoMatchParty(ERPNextTestSuite):
def setUp(self):
create_bank_account()
frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 1)
frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 1)
return super().setUpClass()
@classmethod
def tearDownClass(cls):
frappe.db.set_single_value("Accounts Settings", "enable_party_matching", 0)
frappe.db.set_single_value("Accounts Settings", "enable_fuzzy_matching", 0)
def test_match_by_account_number(self):
create_supplier_for_match(account_no=IBAN_1[11:])

View File

@@ -6,7 +6,6 @@ import json
import frappe
from frappe import utils
from frappe.model.docstatus import DocStatus
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
get_linked_payments,
@@ -19,12 +18,10 @@ from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_paymen
from erpnext.accounts.doctype.pos_profile.test_pos_profile import make_pos_profile
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.tests.utils import if_lending_app_installed
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Cost Center"]
from erpnext.tests.utils import ERPNextTestSuite, if_lending_app_installed
class TestBankTransaction(IntegrationTestCase):
class TestBankTransaction(ERPNextTestSuite):
def setUp(self):
make_pos_profile()
@@ -385,7 +382,7 @@ def add_vouchers(gl_account="_Test Bank - _TC"):
frappe.get_doc(
{
"doctype": "Customer",
"customer_group": "All Customer Groups",
"customer_group": "Individual",
"customer_type": "Company",
"customer_name": "Poore Simon's",
}
@@ -416,7 +413,7 @@ def add_vouchers(gl_account="_Test Bank - _TC"):
frappe.get_doc(
{
"doctype": "Customer",
"customer_group": "All Customer Groups",
"customer_group": "Individual",
"customer_type": "Company",
"customer_name": "Fayva",
}

View File

@@ -2,10 +2,11 @@
# See license.txt
import frappe
from frappe.tests import UnitTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestBankTransactionFees(UnitTestCase):
class TestBankTransactionFees(ERPNextTestSuite):
def test_included_fee_throws(self):
"""A fee that's part of a withdrawal cannot be bigger than the
withdrawal itself."""

View File

@@ -2,8 +2,10 @@
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase
class TestBisectAccountingStatements(IntegrationTestCase):
from erpnext.tests.utils import ERPNextTestSuite
class TestBisectAccountingStatements(ERPNextTestSuite):
pass

View File

@@ -2,8 +2,10 @@
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase
class TestBisectNodes(IntegrationTestCase):
from erpnext.tests.utils import ERPNextTestSuite
class TestBisectNodes(ERPNextTestSuite):
pass

View File

@@ -19,12 +19,6 @@ from erpnext.tests.utils import ERPNextTestSuite
class TestBudget(ERPNextTestSuite):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.make_monthly_distribution()
cls.make_projects()
def setUp(self):
frappe.db.set_single_value("Accounts Settings", "use_legacy_budget_controller", False)
self.company = "_Test Company"

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestCashierClosing(IntegrationTestCase):
class TestCashierClosing(ERPNextTestSuite):
pass

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestChartofAccountsImporter(IntegrationTestCase):
class TestChartofAccountsImporter(ERPNextTestSuite):
pass

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestChequePrintTemplate(IntegrationTestCase):
class TestChequePrintTemplate(ERPNextTestSuite):
pass

View File

@@ -126,7 +126,7 @@
"idx": 1,
"is_tree": 1,
"links": [],
"modified": "2025-01-22 10:46:42.904001",
"modified": "2026-04-14 18:15:27.367298",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cost Center",
@@ -173,11 +173,20 @@
"role": "Employee",
"select": 1,
"share": 1
},
{
"role": "HR User",
"select": 1
},
{
"role": "HR Manager",
"select": 1
}
],
"row_format": "Dynamic",
"search_fields": "parent_cost_center, is_group",
"show_name_in_global_search": 1,
"sort_field": "creation",
"sort_order": "ASC",
"states": []
}
}

View File

@@ -3,10 +3,11 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestCostCenter(IntegrationTestCase):
class TestCostCenter(ERPNextTestSuite):
def test_cost_center_creation_against_child_node(self):
cost_center = frappe.get_doc(
{

View File

@@ -1,23 +0,0 @@
[
{
"company": "_Test Company",
"cost_center_name": "_Test Cost Center",
"doctype": "Cost Center",
"is_group": 0,
"parent_cost_center": "_Test Company - _TC"
},
{
"company": "_Test Company",
"cost_center_name": "_Test Cost Center 2",
"doctype": "Cost Center",
"is_group": 0,
"parent_cost_center": "_Test Company - _TC"
},
{
"company": "_Test Company",
"cost_center_name": "_Test Write Off Cost Center",
"doctype": "Cost Center",
"is_group": 0,
"parent_cost_center": "_Test Company - _TC"
}
]

View File

@@ -4,7 +4,6 @@ import unittest
import frappe
from frappe.query_builder.functions import Sum
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, today
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
@@ -16,9 +15,10 @@ from erpnext.accounts.doctype.cost_center_allocation.cost_center_allocation impo
WrongPercentageAllocation,
)
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.tests.utils import ERPNextTestSuite
class TestCostCenterAllocation(IntegrationTestCase):
class TestCostCenterAllocation(ERPNextTestSuite):
def setUp(self):
cost_centers = [
"Main Cost Center 1",
@@ -191,7 +191,7 @@ class TestCostCenterAllocation(IntegrationTestCase):
coa2.cancel()
jv.cancel()
@IntegrationTestCase.change_settings("System Settings", {"rounding_method": "Commercial Rounding"})
@ERPNextTestSuite.change_settings("System Settings", {"rounding_method": "Commercial Rounding"})
def test_debit_credit_on_cost_center_allocation_for_commercial_rounding(self):
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice

View File

@@ -3,11 +3,9 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item"]
from erpnext.tests.utils import ERPNextTestSuite
def test_create_test_data():
@@ -88,6 +86,7 @@ def test_create_test_data():
"partner_name": "_Test Coupon Partner",
"commission_rate": 2,
"referral_code": "COPART",
"territory": "All Territories",
}
)
sales_partner.insert()
@@ -110,13 +109,10 @@ def test_create_test_data():
coupon_code.insert()
class TestCouponCode(IntegrationTestCase):
class TestCouponCode(ERPNextTestSuite):
def setUp(self):
test_create_test_data()
def tearDown(self):
frappe.set_user("Administrator")
def test_sales_order_with_coupon_code(self):
frappe.db.set_value("Coupon Code", "SAVE30", "used", 0)

View File

@@ -101,11 +101,11 @@
"label": "Use HTTP Protocol"
}
],
"hide_toolbar": 1,
"hide_toolbar": 0,
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2026-01-02 18:19:02.873815",
"modified": "2026-03-16 13:28:21.075743",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Currency Exchange Settings",

View File

@@ -3,8 +3,8 @@
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestCurrencyExchangeSettings(IntegrationTestCase):
class TestCurrencyExchangeSettings(ERPNextTestSuite):
pass

View File

@@ -4,37 +4,20 @@ import json
import frappe
from frappe.model import mapper
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, nowdate, today
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import (
unlink_payment_on_cancel_of_invoice,
)
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
create_dunning as create_dunning_from_sales_invoice,
)
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import (
create_sales_invoice_against_cost_center,
)
EXTRA_TEST_RECORD_DEPENDENCIES = ["Company", "Cost Center"]
from erpnext.tests.utils import ERPNextTestSuite
class TestDunning(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1)
create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0)
unlink_payment_on_cancel_of_invoice()
@classmethod
def tearDownClass(cls):
unlink_payment_on_cancel_of_invoice(0)
super().tearDownClass()
class TestDunning(ERPNextTestSuite):
def test_dunning_without_fees(self):
dunning = create_dunning(overdue_days=20)

View File

@@ -3,8 +3,8 @@
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestDunningType(IntegrationTestCase):
class TestDunningType(ERPNextTestSuite):
pass

View File

@@ -1,36 +0,0 @@
[
{
"doctype": "Dunning Type",
"dunning_type": "_Test First Notice",
"company": "_Test Company",
"is_default": 1,
"dunning_fee": 0.0,
"rate_of_interest": 0.0,
"dunning_letter_text": [
{
"language": "en",
"body_text": "We have still not received payment for our invoice",
"closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees."
}
],
"income_account": "Sales - _TC",
"cost_center": "_Test Cost Center - _TC"
},
{
"doctype": "Dunning Type",
"dunning_type": "_Test Second Notice",
"company": "_Test Company",
"is_default": 0,
"dunning_fee": 10.0,
"rate_of_interest": 10.0,
"dunning_letter_text": [
{
"language": "en",
"body_text": "We have still not received payment for our invoice",
"closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees."
}
],
"income_account": "Sales - _TC",
"cost_center": "_Test Cost Center - _TC"
}
]

View File

@@ -5,15 +5,15 @@
import frappe
from frappe.query_builder import functions
from frappe.query_builder.utils import DocType
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, flt, today
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.tests.utils import ERPNextTestSuite
class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
class TestExchangeRateRevaluation(ERPNextTestSuite, AccountsTestMixin):
def setUp(self):
self.create_company()
self.create_usd_receivable_account()
@@ -22,14 +22,13 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
self.clear_old_entries()
self.set_system_and_company_settings()
def tearDown(self):
frappe.db.rollback()
def set_system_and_company_settings(self):
# set number and currency precision
system_settings = frappe.get_doc("System Settings")
system_settings.float_precision = 2
system_settings.currency_precision = 2
system_settings.language = "en"
system_settings.time_zone = "Asia/Kolkata"
system_settings.save()
# Using Exchange Gain/Loss account for unrealized as well.
@@ -37,7 +36,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
company_doc.unrealized_exchange_gain_loss_account = company_doc.exchange_gain_loss_account
company_doc.save()
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0},
)
@@ -91,7 +90,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
)[0]
self.assertEqual(acc_balance.balance, 8500.0)
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0},
)
@@ -164,7 +163,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
self.assertEqual(acc_balance.balance, 0.0)
self.assertEqual(acc_balance.balance_in_account_currency, 0.0)
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0},
)
@@ -259,7 +258,7 @@ class TestExchangeRateRevaluation(AccountsTestMixin, IntegrationTestCase):
self.assertEqual(flt(acc_balance.balance, precision), 0.0)
self.assertEqual(flt(acc_balance.balance_in_account_currency, precision), 0.0)
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{"allow_multi_currency_invoices_against_single_party_account": 1, "allow_stale": 0},
)

View File

@@ -3,12 +3,12 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.tests.utils import ERPNextTestSuite
class TestFinanceBook(IntegrationTestCase):
class TestFinanceBook(ERPNextTestSuite):
def test_finance_book(self):
finance_book = create_finance_book()

View File

@@ -3,6 +3,8 @@
frappe.ui.form.on("Financial Report Template", {
refresh(frm) {
if (frm.is_new() || frm.doc.rows.length === 0) return;
// add custom button to view missed accounts
frm.add_custom_button(__("View Account Coverage"), function () {
let selected_rows = frm.get_field("rows").grid.get_selected_children();
@@ -20,7 +22,7 @@ frappe.ui.form.on("Financial Report Template", {
});
},
validate(frm) {
after_save(frm) {
if (!frm.doc.rows || frm.doc.rows.length === 0) {
frappe.msgprint(__("At least one row is required for a financial report template"));
}
@@ -34,14 +36,6 @@ frappe.ui.form.on("Financial Report Row", {
update_formula_label(frm, row.data_source);
update_formula_description(frm, row.data_source);
if (row.data_source !== "Account Data") {
frappe.model.set_value(cdt, cdn, "balance_type", "");
}
if (["Blank Line", "Column Break", "Section Break"].includes(row.data_source)) {
frappe.model.set_value(cdt, cdn, "calculation_formula", "");
}
set_up_filters_editor(frm, cdt, cdn);
},
@@ -322,6 +316,8 @@ function update_formula_description(frm, data_source) {
const list_style = `style="margin-bottom: var(--margin-sm); color: var(--text-muted); font-size: 0.9em;"`;
const note_style = `style="margin-bottom: 0; color: var(--text-muted); font-size: 0.9em;"`;
const tip_style = `style="margin-bottom: 0; color: var(--text-color); font-size: 0.85em;"`;
const code_style = `style="background: var(--bg-light-gray); padding: var(--padding-xs); border-radius: var(--border-radius); font-size: 0.85em; width: max-content; margin-bottom: var(--margin-sm);"`;
const pre_style = `style="margin: 0; border-radius: var(--border-radius)"`;
let description_html = "";
@@ -382,8 +378,13 @@ function update_formula_description(frm, data_source) {
<li><code>my_app.financial_reports.get_kpi_data</code></li>
</ul>
<h6 ${subtitle_style}>Method Signature:</h6>
<div ${code_style}>
<pre ${pre_style}>def get_custom_data(filters, periods, row): <br>&nbsp; # filters: dict — report filters (company, period, etc.) <br>&nbsp; # periods: list[dict] — period definitions <br>&nbsp; # row: dict — the current report row <br><br>&nbsp; return [1000.0, 1200.0, 1150.0] # one value per period</pre>
</div>
<h6 ${subtitle_style}>Return Format:</h6>
<p ${text_style}>Numbers for each period: <code>[1000.0, 1200.0, 1150.0]</code></p>
<p ${text_style}>A list of numbers, one for each period: <code>[1000.0, 1200.0, 1150.0]</code></p>
</div>`;
} else if (data_source === "Blank Line") {
description_html = `

View File

@@ -1,6 +1,5 @@
{
"actions": [],
"allow_rename": 1,
"autoname": "field:template_name",
"creation": "2025-08-02 04:44:15.184541",
"doctype": "DocType",
@@ -31,7 +30,8 @@
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Report Type",
"options": "\nProfit and Loss Statement\nBalance Sheet\nCash Flow\nCustom Financial Statement"
"options": "\nProfit and Loss Statement\nBalance Sheet\nCash Flow\nCustom Financial Statement",
"reqd": 1
},
{
"depends_on": "eval:frappe.boot.developer_mode",
@@ -66,7 +66,7 @@
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-11-14 00:11:03.508139",
"modified": "2026-02-23 01:04:05.797161",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Financial Report Template",

View File

@@ -32,6 +32,19 @@ class FinancialReportTemplate(Document):
template_name: DF.Data
# end: auto-generated types
def before_validate(self):
self.clear_hidden_fields()
def clear_hidden_fields(self):
style_data_sources = {"Blank Line", "Column Break", "Section Break"}
for row in self.rows:
if row.data_source != "Account Data":
row.balance_type = None
if row.data_source in style_data_sources:
row.calculation_formula = None
def validate(self):
validator = TemplateValidator(self)
result = validator.validate()

View File

@@ -70,8 +70,8 @@ class ValidationResult:
self.warnings.append(issue)
def notify_user(self) -> None:
warnings = "<br><br>".join(str(w) for w in self.warnings)
errors = "<br><br>".join(str(e) for e in self.issues)
warnings = "<br><br>".join(str(w) for w in self.warnings if w)
errors = "<br><br>".join(str(e) for e in self.issues if e)
if warnings:
frappe.msgprint(warnings, title=_("Warnings"), indicator="orange")
@@ -99,9 +99,8 @@ class TemplateValidator:
result.merge(validator.validate(self.template))
# Run row-level validations
account_fields = {field.fieldname for field in frappe.get_meta("Account").fields}
for row in self.template.rows:
result.merge(self.formula_validator.validate(row, account_fields))
result.merge(self.formula_validator.validate(row))
return result
@@ -383,7 +382,8 @@ class AccountFilterValidator(Validator):
"""Validates account filter expressions used in Account Data rows"""
def __init__(self, account_fields: set | None = None):
self.account_fields = account_fields or set(frappe.get_meta("Account")._valid_columns)
self.account_meta = frappe.get_meta("Account")
self.account_fields = account_fields or set(self.account_meta._valid_columns)
def validate(self, row) -> ValidationResult:
result = ValidationResult()
@@ -403,7 +403,11 @@ class AccountFilterValidator(Validator):
try:
filter_config = json.loads(row.calculation_formula)
error = self._validate_filter_structure(filter_config, self.account_fields)
error = self._validate_filter_structure(
filter_config,
self.account_fields,
row.advanced_filtering,
)
if error:
result.add_error(
@@ -425,7 +429,12 @@ class AccountFilterValidator(Validator):
return result
def _validate_filter_structure(self, filter_config, account_fields: set) -> str | None:
def _validate_filter_structure(
self,
filter_config,
account_fields: set,
advanced_filtering: bool = False,
) -> str | None:
# simple condition: [field, operator, value]
if isinstance(filter_config, list):
if len(filter_config) != 3:
@@ -436,8 +445,10 @@ class AccountFilterValidator(Validator):
if not isinstance(field, str) or not isinstance(operator, str):
return "Field and operator must be strings"
display = (field if advanced_filtering else self.account_meta.get_label(field)) or field
if field not in account_fields:
return f"Field '{field}' is not a valid account field"
return f"Field '{display}' is not a valid Account field"
if operator.casefold() not in OPERATOR_MAP:
return f"Invalid operator '{operator}'"
@@ -460,7 +471,7 @@ class AccountFilterValidator(Validator):
# recursive
for condition in conditions:
error = self._validate_filter_structure(condition, account_fields)
error = self._validate_filter_structure(condition, account_fields, advanced_filtering)
if error:
return error
else:
@@ -476,7 +487,7 @@ class FormulaValidator(Validator):
self.calculation_validator = CalculationFormulaValidator(reference_codes)
self.account_filter_validator = AccountFilterValidator()
def validate(self, row, account_fields: set) -> ValidationResult:
def validate(self, row) -> ValidationResult:
result = ValidationResult()
if not row.calculation_formula:
@@ -486,9 +497,6 @@ class FormulaValidator(Validator):
return self.calculation_validator.validate(row)
elif row.data_source == "Account Data":
# Update account fields if provided
if account_fields:
self.account_filter_validator.account_fields = account_fields
return self.account_filter_validator.validate(row)
elif row.data_source == "Custom API":

View File

@@ -19,12 +19,6 @@ from erpnext.accounts.doctype.financial_report_template.test_financial_report_te
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.accounts.utils import get_currency_precision, get_fiscal_year
# On IntegrationTestCase, the doctype test records and all
# link-field test record dependencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
class TestDependencyResolver(FinancialReportTemplateTestCase):
"""Test cases for DependencyResolver class"""
@@ -1301,6 +1295,7 @@ class TestFilterExpressionParser(FinancialReportTemplateTestCase):
self.data_source = "Account Data"
self.idx = 1
self.reverse_sign = 0
self.advanced_filtering = True
return MockReportRow(formula, reference_code)

View File

@@ -2,29 +2,16 @@
# For license information, please see license.txt
import frappe
from frappe.tests import IntegrationTestCase
from frappe.tests.utils import make_test_records
# On IntegrationTestCase, the doctype test records and all
# link-field test record dependencies are recursively loaded
# Use these module variables to add/remove to/from that list
EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
from erpnext.tests.utils import ERPNextTestSuite
class TestFinancialReportTemplate(IntegrationTestCase):
pass
class FinancialReportTemplateTestCase(IntegrationTestCase):
class FinancialReportTemplateTestCase(ERPNextTestSuite):
"""Utility class with common setup and helper methods for all test classes"""
@classmethod
def setUpClass(cls):
def setUp(self):
"""Set up test data"""
make_test_records("Company")
make_test_records("Fiscal Year")
cls.create_test_template()
self.create_test_template()
@classmethod
def create_test_template(cls):

View File

@@ -3,13 +3,12 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import now_datetime
IGNORE_TEST_RECORD_DEPENDENCIES = ["Company"]
from erpnext.tests.utils import ERPNextTestSuite
class TestFiscalYear(IntegrationTestCase):
class TestFiscalYear(ERPNextTestSuite):
def test_extra_year(self):
if frappe.db.exists("Fiscal Year", "_Test Fiscal Year 2000"):
frappe.delete_doc("Fiscal Year", "_Test Fiscal Year 2000")

View File

@@ -489,4 +489,5 @@ def rename_temporarily_named_docs(doctype):
for hook in frappe.get_hooks(hook_type):
frappe.call(hook, newname=newname, oldname=oldname)
frappe.db.commit()
if not frappe.in_test:
frappe.db.commit()

View File

@@ -4,13 +4,13 @@ import unittest
import frappe
from frappe.model.naming import parse_naming_series
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.gl_entry.gl_entry import rename_gle_sle_docs
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.tests.utils import ERPNextTestSuite
class TestGLEntry(IntegrationTestCase):
class TestGLEntry(ERPNextTestSuite):
def test_round_off_entry(self):
frappe.db.set_value("Company", "_Test Company", "round_off_account", "_Test Write Off - _TC")
frappe.db.set_value("Company", "_Test Company", "round_off_cost_center", "_Test Cost Center - _TC")

View File

@@ -3,16 +3,16 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, flt, nowdate
from erpnext.accounts.doctype.account.test_account import create_account
from erpnext.accounts.doctype.journal_entry.journal_entry import get_payment_entry_against_invoice
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries
from erpnext.tests.utils import ERPNextTestSuite
class TestInvoiceDiscounting(IntegrationTestCase):
class TestInvoiceDiscounting(ERPNextTestSuite):
def setUp(self):
self.ar_credit = create_account(
account_name="_Test Accounts Receivable Credit",

View File

@@ -47,3 +47,12 @@ frappe.ui.form.on("Item Tax Template", {
});
},
});
frappe.ui.form.on("Item Tax Template Detail", {
not_applicable: function (frm, cdt, cdn) {
let row = locals[cdt][cdn];
if (row.not_applicable) {
frappe.model.set_value(cdt, cdn, "tax_rate", 0);
}
},
});

View File

@@ -27,8 +27,15 @@ class ItemTaxTemplate(Document):
# end: auto-generated types
def validate(self):
self.set_zero_rate_for_not_applicable_tax()
self.validate_tax_accounts()
def set_zero_rate_for_not_applicable_tax(self):
"""Ensure tax_rate is 0 for any row marked as not applicable."""
for row in self.get("taxes"):
if row.not_applicable:
row.tax_rate = 0
def autoname(self):
if self.company and self.title:
abbr = frappe.get_cached_value("Company", self.company, "abbr")

View File

@@ -2,8 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestItemTaxTemplate(IntegrationTestCase):
class TestItemTaxTemplate(ERPNextTestSuite):
pass

View File

@@ -1,79 +0,0 @@
[
{
"doctype": "Item Tax Template",
"title": "_Test Account Excise Duty @ 10",
"company": "_Test Company",
"taxes": [
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 10,
"tax_type": "_Test Account Excise Duty - _TC"
}
]
},
{
"doctype": "Item Tax Template",
"title": "_Test Account Excise Duty @ 12",
"company": "_Test Company",
"taxes": [
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 12,
"tax_type": "_Test Account Excise Duty - _TC"
}
]
},
{
"doctype": "Item Tax Template",
"title": "_Test Account Excise Duty @ 15",
"company": "_Test Company",
"taxes": [
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 15,
"tax_type": "_Test Account Excise Duty - _TC"
}
]
},
{
"doctype": "Item Tax Template",
"title": "_Test Account Excise Duty @ 20",
"company": "_Test Company",
"taxes": [
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 20,
"tax_type": "_Test Account Excise Duty - _TC"
}
]
},
{
"doctype": "Item Tax Template",
"title": "_Test Item Tax Template 1",
"company": "_Test Company",
"taxes": [
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 5,
"tax_type": "_Test Account Excise Duty - _TC"
},
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 10,
"tax_type": "_Test Account Education Cess - _TC"
},
{
"doctype": "Item Tax Template Detail",
"parentfield": "taxes",
"tax_rate": 15,
"tax_type": "_Test Account S&H Education Cess - _TC"
}
]
}
]

View File

@@ -6,7 +6,8 @@
"engine": "InnoDB",
"field_order": [
"tax_type",
"tax_rate"
"tax_rate",
"not_applicable"
],
"fields": [
{
@@ -21,20 +22,30 @@
"fieldname": "tax_rate",
"fieldtype": "Float",
"in_list_view": 1,
"label": "Tax Rate"
"label": "Tax Rate",
"read_only_depends_on": "eval:doc.not_applicable"
},
{
"default": "0",
"description": "Check if this tax is not applicable to items (distinct from 0% rate)",
"fieldname": "not_applicable",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Not Applicable"
}
],
"istable": 1,
"links": [],
"modified": "2024-03-27 13:09:55.735360",
"modified": "2025-12-26 17:19:18.791891",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Item Tax Template Detail",
"owner": "Administrator",
"permissions": [],
"quick_entry": 1,
"row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
}

View File

@@ -14,6 +14,7 @@ class ItemTaxTemplateDetail(Document):
if TYPE_CHECKING:
from frappe.types import DF
not_applicable: DF.Check
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data

View File

@@ -648,7 +648,7 @@ $.extend(erpnext.journal_entry, {
reqd: 1,
default: frm.doc.posting_date,
},
{ fieldtype: "Small Text", fieldname: "user_remark", label: __("User Remark") },
{ fieldtype: "Small Text", fieldname: "remark", label: __("Remark") },
{
fieldtype: "Select",
fieldname: "naming_series",
@@ -665,8 +665,14 @@ $.extend(erpnext.journal_entry, {
var values = dialog.get_values();
frm.set_value("posting_date", values.posting_date);
frm.set_value("user_remark", values.user_remark);
frm.set_value("naming_series", values.naming_series);
if (values.remark) {
frm.set_value("custom_remark", 1);
frm.set_value("remark", values.remark);
} else {
frm.set_value("custom_remark", 0);
frm.set_value("remark", "");
}
// clear table is used because there might've been an error while adding child
// and cleanup didn't happen

View File

@@ -78,6 +78,7 @@
"from_template",
"title",
"column_break3",
"custom_remark",
"remark",
"mode_of_payment",
"party_not_required"
@@ -140,6 +141,7 @@
{
"fieldname": "company",
"fieldtype": "Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Company",
"oldfieldname": "company",
@@ -181,7 +183,6 @@
"fieldname": "cheque_no",
"fieldtype": "Data",
"in_global_search": 1,
"in_list_view": 1,
"label": "Reference Number",
"mandatory_depends_on": "eval:doc.voucher_type == \"Bank Entry\"",
"no_copy": 1,
@@ -202,6 +203,7 @@
{
"fieldname": "user_remark",
"fieldtype": "Small Text",
"hidden": 1,
"label": "User Remark",
"no_copy": 1,
"oldfieldname": "user_remark",
@@ -315,7 +317,7 @@
"no_copy": 1,
"oldfieldname": "remark",
"oldfieldtype": "Small Text",
"read_only": 1
"read_only_depends_on": "eval: !doc.custom_remark"
},
{
"depends_on": "eval:doc.voucher_type== \"Inter Company Journal Entry\"",
@@ -651,6 +653,17 @@
"fieldname": "tax_withholding_tab",
"fieldtype": "Tab Break",
"label": "Tax Withholding"
},
{
"fieldname": "auto_repeat_section",
"fieldtype": "Section Break",
"label": "Auto Repeat"
},
{
"default": "0",
"fieldname": "custom_remark",
"fieldtype": "Check",
"label": "Custom Remark"
}
],
"icon": "fa fa-file-text",
@@ -665,7 +678,7 @@
"table_fieldname": "payment_entries"
}
],
"modified": "2026-02-16 16:06:10.468482",
"modified": "2026-04-08 14:19:30.870894",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry",

View File

@@ -61,6 +61,7 @@ class JournalEntry(AccountsController):
cheque_no: DF.Data | None
clearance_date: DF.Date | None
company: DF.Link
custom_remark: DF.Check
difference: DF.Currency
due_date: DF.Date | None
finance_book: DF.Link | None
@@ -293,6 +294,8 @@ class JournalEntry(AccountsController):
# References for this Journal are removed on the `on_cancel` event in accounts_controller
super().on_cancel()
from_doc_events = getattr(self, "ignore_linked_doctypes", ())
self.ignore_linked_doctypes = (
"GL Entry",
"Stock Ledger Entry",
@@ -306,6 +309,10 @@ class JournalEntry(AccountsController):
"Advance Payment Ledger Entry",
"Tax Withholding Entry",
)
if from_doc_events and from_doc_events != self.ignore_linked_doctypes:
self.ignore_linked_doctypes = self.ignore_linked_doctypes + from_doc_events
self.make_gl_entries(1)
JournalTaxWithholding(self).on_cancel()
self.unlink_advance_entry_reference()
@@ -347,8 +354,11 @@ class JournalEntry(AccountsController):
frappe.throw(_("Account {0} should be of type Expense").format(d.account))
def validate_stock_accounts(self):
if self.voucher_type == "Periodic Accounting Entry":
# Skip validation for periodic accounting entry
if (
not erpnext.is_perpetual_inventory_enabled(self.company)
or self.voucher_type == "Periodic Accounting Entry"
):
# Skip validation for periodic accounting entry and Perpetual Inventory Disabled Company.
return
stock_accounts = get_stock_accounts(self.company, accounts=self.accounts)
@@ -1017,8 +1027,8 @@ class JournalEntry(AccountsController):
if self.flags.skip_remarks_creation:
return
if self.user_remark:
r.append(_("Note: {0}").format(self.user_remark))
if self.get("custom_remark"):
return
if self.cheque_no:
if self.cheque_date:
@@ -1532,31 +1542,31 @@ def get_against_jv(doctype, txt, searchfield, start, page_len, filters):
if not frappe.db.has_column("Journal Entry", searchfield):
return []
return frappe.db.sql(
f"""
SELECT jv.name, jv.posting_date, jv.user_remark
FROM `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail
WHERE jv_detail.parent = jv.name
AND jv_detail.account = %(account)s
AND IFNULL(jv_detail.party, '') = %(party)s
AND (
jv_detail.reference_type IS NULL
OR jv_detail.reference_type = ''
)
AND jv.docstatus = 1
AND jv.`{searchfield}` LIKE %(txt)s
ORDER BY jv.name DESC
LIMIT %(limit)s offset %(offset)s
""",
dict(
account=filters.get("account"),
party=cstr(filters.get("party")),
txt=f"%{txt}%",
offset=start,
limit=page_len,
),
JournalEntry = frappe.qb.DocType("Journal Entry")
JournalEntryAccount = frappe.qb.DocType("Journal Entry Account")
query = (
frappe.qb.from_(JournalEntry)
.join(JournalEntryAccount)
.on(JournalEntryAccount.parent == JournalEntry.name)
.select(JournalEntry.name, JournalEntry.posting_date, JournalEntry.remark)
.where(JournalEntryAccount.account == filters.get("account"))
.where(JournalEntryAccount.reference_type.isnull() | (JournalEntryAccount.reference_type == ""))
.where(JournalEntry.docstatus == 1)
.where(JournalEntry[searchfield].like(f"%{txt}%"))
.orderby(JournalEntry.name, order=frappe.qb.desc)
.limit(page_len)
.offset(start)
)
party = filters.get("party")
if party:
query = query.where(JournalEntryAccount.party == party)
else:
query = query.where(JournalEntryAccount.party.isnull() | (JournalEntryAccount.party == ""))
return query.run()
@frappe.whitelist()
def get_outstanding(args):

View File

@@ -1,5 +1,5 @@
frappe.listview_settings["Journal Entry"] = {
add_fields: ["voucher_type", "posting_date", "total_debit", "company", "user_remark"],
add_fields: ["voucher_type", "posting_date", "total_debit", "company", "remark"],
get_indicator: function (doc) {
if (doc.docstatus === 1) {
return [__(doc.voucher_type), "blue", `voucher_type,=,${doc.voucher_type}`];

View File

@@ -2,19 +2,20 @@
# License: GNU General Public License v3. See license.txt
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import flt, nowdate
from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.accounts.doctype.journal_entry.journal_entry import StockAccountInvalidTransaction
from erpnext.exceptions import InvalidAccountCurrency
from erpnext.selling.doctype.customer.test_customer import make_customer, set_credit_limit
from erpnext.tests.utils import ERPNextTestSuite
class TestJournalEntry(IntegrationTestCase):
@IntegrationTestCase.change_settings(
"Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1}
)
class TestJournalEntry(ERPNextTestSuite):
def setUp(self):
self.load_test_records("Journal Entry")
@ERPNextTestSuite.change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1})
def test_journal_entry_with_against_jv(self):
jv_invoice = frappe.copy_doc(self.globalTestRecords["Journal Entry"][2])
base_jv = frappe.copy_doc(self.globalTestRecords["Journal Entry"][0])
@@ -149,7 +150,6 @@ class TestJournalEntry(IntegrationTestCase):
if account_bal == stock_bal:
self.assertRaises(StockAccountInvalidTransaction, jv.save)
frappe.db.rollback()
else:
jv.submit()
jv.cancel()
@@ -413,9 +413,9 @@ class TestJournalEntry(IntegrationTestCase):
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
# Configure Repost Accounting Ledger for JVs
settings = frappe.get_doc("Repost Accounting Ledger Settings")
if not [x for x in settings.allowed_types if x.document_type == "Journal Entry"]:
settings.append("allowed_types", {"document_type": "Journal Entry", "allowed": True})
settings = frappe.get_doc("Accounts Settings")
if "Journal Entry" not in [x.document_type for x in settings.repost_allowed_types]:
settings.append("repost_allowed_types", {"document_type": "Journal Entry"})
settings.save()
# Create JV with defaut cost center - _Test Cost Center
@@ -523,7 +523,7 @@ class TestJournalEntry(IntegrationTestCase):
jv = frappe.new_doc("Journal Entry")
jv.posting_date = nowdate()
jv.company = "_Test Company"
jv.user_remark = "test"
jv.remark = "test"
jv.extend(
"accounts",
[
@@ -592,6 +592,14 @@ class TestJournalEntry(IntegrationTestCase):
self.assertEqual(jv.pay_to_recd_from, "_Test Receiver 2")
def test_custom_remark(self):
# When custom_remark is enabled, remark should not be auto-overwritten on save
jv = make_journal_entry("_Test Cash - _TC", "_Test Bank - _TC", 100, save=False)
jv.custom_remark = 1
jv.remark = "My custom remark text"
jv.insert()
self.assertEqual(jv.remark, "My custom remark text")
def test_credit_limit_for_customer(self):
customer = make_customer("_Test New Customer")
set_credit_limit("_Test New Customer", "_Test Company", 50)
@@ -620,7 +628,7 @@ def make_journal_entry(
jv = frappe.new_doc("Journal Entry")
jv.posting_date = posting_date or nowdate()
jv.company = company or "_Test Company"
jv.user_remark = "test"
jv.remark = "test"
jv.multi_currency = 1
jv.set(
"accounts",

View File

@@ -3,8 +3,8 @@
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestJournalEntryTemplate(IntegrationTestCase):
class TestJournalEntryTemplate(ERPNextTestSuite):
pass

View File

@@ -3,23 +3,20 @@
import frappe
from frappe import qb
from frappe.tests import IntegrationTestCase
from frappe.utils import nowdate
from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
from erpnext.accounts.utils import run_ledger_health_checks
from erpnext.tests.utils import ERPNextTestSuite
class TestLedgerHealth(AccountsTestMixin, IntegrationTestCase):
class TestLedgerHealth(ERPNextTestSuite, AccountsTestMixin):
def setUp(self):
self.create_company()
self.create_customer()
self.configure_monitoring_tool()
self.clear_old_entries()
def tearDown(self):
frappe.db.rollback()
def configure_monitoring_tool(self):
monitor_settings = frappe.get_doc("Ledger Health Monitor")
monitor_settings.enable_health_monitor = True

View File

@@ -2,8 +2,10 @@
# See license.txt
# import frappe
from frappe.tests import IntegrationTestCase
class TestLedgerHealthMonitor(IntegrationTestCase):
from erpnext.tests.utils import ERPNextTestSuite
class TestLedgerHealthMonitor(ERPNextTestSuite):
pass

View File

@@ -71,14 +71,16 @@ def start_merge(docname):
ledger_merge.account,
)
row.db_set("merged", 1)
frappe.db.commit()
if not frappe.in_test:
frappe.db.commit()
successful_merges += 1
frappe.publish_realtime(
"ledger_merge_progress",
{"ledger_merge": ledger_merge.name, "current": successful_merges, "total": total},
)
except Exception:
frappe.db.rollback()
if not frappe.in_test:
frappe.db.rollback()
ledger_merge.log_error("Ledger merge failed")
finally:
if successful_merges == total:

View File

@@ -3,12 +3,12 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.ledger_merge.ledger_merge import start_merge
from erpnext.tests.utils import ERPNextTestSuite
class TestLedgerMerge(IntegrationTestCase):
class TestLedgerMerge(ERPNextTestSuite):
def test_merge_success(self):
if not frappe.db.exists("Account", "Indirect Expenses - _TC"):
acc = frappe.new_doc("Account")
@@ -101,16 +101,3 @@ class TestLedgerMerge(IntegrationTestCase):
self.assertFalse(frappe.db.exists("Account", "Indirect Test Income - _TC"))
self.assertTrue(frappe.db.exists("Account", "Administrative Test Income - _TC"))
def tearDown(self):
for entry in frappe.db.get_all("Ledger Merge"):
frappe.delete_doc("Ledger Merge", entry.name)
test_accounts = [
"Indirect Test Expenses - _TC",
"Administrative Test Expenses - _TC",
"Indirect Test Income - _TC",
"Administrative Test Income - _TC",
]
for account in test_accounts:
frappe.delete_doc_if_exists("Account", account)

View File

@@ -3,31 +3,20 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import today
from erpnext.accounts.doctype.loyalty_program.test_loyalty_program import create_records
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.tests.utils import ERPNextTestSuite
class TestLoyaltyPointEntry(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
class TestLoyaltyPointEntry(ERPNextTestSuite):
def setUp(self):
# Create test records
create_records()
cls.loyalty_program_name = "Test Single Loyalty"
cls.customer_name = "Test Loyalty Customer"
customer = frappe.get_doc("Customer", cls.customer_name)
customer.db_set("loyalty_program", cls.loyalty_program_name)
@classmethod
def tearDownClass(cls):
# Delete all Loyalty Point Entries
frappe.db.sql("DELETE FROM `tabLoyalty Point Entry` WHERE customer = %s", cls.customer_name)
frappe.db.sql("DELETE FROM `tabSales Invoice` WHERE customer = %s", cls.customer_name)
frappe.db.commit()
# cls.customer.delete()
self.loyalty_program_name = "Test Single Loyalty"
self.customer_name = "Test Loyalty Customer"
customer = frappe.get_doc("Customer", self.customer_name)
customer.loyalty_program = self.loyalty_program_name
customer.save()
def create_test_invoice(self, redeem=None):
if redeem:
@@ -69,9 +58,10 @@ class TestLoyaltyPointEntry(IntegrationTestCase):
self.assertEqual(entry.discretionary_reason, "Customer Appreciation")
def test_redeem_loyalty_points(self):
self.create_test_invoice(redeem=10)
self.create_test_invoice()
self.create_test_invoice(redeem=7)
doc = frappe.get_last_doc("Loyalty Point Entry")
self.assertEqual(doc.loyalty_points, -10)
self.assertEqual(doc.loyalty_points, -7)
# Check balance
balance = frappe.db.sql(
@@ -83,4 +73,4 @@ class TestLoyaltyPointEntry(IntegrationTestCase):
(self.customer_name,),
)[0][0]
self.assertEqual(balance, 75) # 85 added, 10 redeemed
self.assertEqual(balance, 3) # 10 added, 7 redeemed

View File

@@ -3,7 +3,6 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from frappe.utils import cint, flt, getdate, today
from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
@@ -11,15 +10,10 @@ from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
get_loyalty_program_details_with_points,
)
from erpnext.accounts.party import get_dashboard_info
from erpnext.tests.utils import ERPNextTestSuite
class TestLoyaltyProgram(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# create relevant item, customer, loyalty program, etc
create_records()
class TestLoyaltyProgram(ERPNextTestSuite):
def test_loyalty_points_earned_single_tier(self):
frappe.db.set_value("Customer", "Test Loyalty Customer", "loyalty_program", "Test Single Loyalty")
# create a new sales invoice
@@ -323,96 +317,3 @@ def create_sales_invoice_record(qty=1):
],
}
)
def create_records():
# create a new loyalty Account
if not frappe.db.exists("Account", "Loyalty - _TC"):
frappe.get_doc(
{
"doctype": "Account",
"account_name": "Loyalty",
"parent_account": "Direct Expenses - _TC",
"company": "_Test Company",
"is_group": 0,
"account_type": "Expense Account",
}
).insert()
# create a new loyalty program Single tier
if not frappe.db.exists("Loyalty Program", "Test Single Loyalty"):
frappe.get_doc(
{
"doctype": "Loyalty Program",
"loyalty_program_name": "Test Single Loyalty",
"auto_opt_in": 1,
"from_date": today(),
"loyalty_program_type": "Single Tier Program",
"conversion_factor": 1,
"expiry_duration": 10,
"company": "_Test Company",
"cost_center": "Main - _TC",
"expense_account": "Loyalty - _TC",
"collection_rules": [{"tier_name": "Bronce", "collection_factor": 1000, "min_spent": 0}],
}
).insert()
# create a new customer
if not frappe.db.exists("Customer", "Test Loyalty Customer"):
frappe.get_doc(
{
"customer_group": "_Test Customer Group",
"customer_name": "Test Loyalty Customer",
"customer_type": "Individual",
"doctype": "Customer",
"territory": "_Test Territory",
}
).insert()
# create a new loyalty program Multiple tier
if not frappe.db.exists("Loyalty Program", "Test Multiple Loyalty"):
frappe.get_doc(
{
"doctype": "Loyalty Program",
"loyalty_program_name": "Test Multiple Loyalty",
"auto_opt_in": 1,
"from_date": today(),
"loyalty_program_type": "Multiple Tier Program",
"conversion_factor": 1,
"expiry_duration": 10,
"company": "_Test Company",
"cost_center": "Main - _TC",
"expense_account": "Loyalty - _TC",
"collection_rules": [
{"tier_name": "Bronze", "collection_factor": 1000, "min_spent": 0},
{"tier_name": "Silver", "collection_factor": 1000, "min_spent": 10000},
{"tier_name": "Gold", "collection_factor": 1000, "min_spent": 19000},
],
}
).insert()
# create an item
if not frappe.db.exists("Item", "Loyal Item"):
frappe.get_doc(
{
"doctype": "Item",
"item_code": "Loyal Item",
"item_name": "Loyal Item",
"item_group": "All Item Groups",
"company": "_Test Company",
"is_stock_item": 1,
"opening_stock": 100,
"valuation_rate": 10000,
}
).insert()
# create item price
if not frappe.db.exists("Item Price", {"price_list": "Standard Selling", "item_code": "Loyal Item"}):
frappe.get_doc(
{
"doctype": "Item Price",
"price_list": "Standard Selling",
"item_code": "Loyal Item",
"price_list_rate": 10000,
}
).insert()

View File

@@ -48,7 +48,7 @@
"idx": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2024-08-16 19:22:42.942264",
"modified": "2026-04-14 18:16:47.795986",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Mode of Payment",
@@ -68,12 +68,21 @@
"read": 1,
"report": 1,
"role": "Accounts User"
},
{
"role": "HR User",
"select": 1
},
{
"role": "HR Manager",
"select": 1
}
],
"quick_entry": 1,
"row_format": "Dynamic",
"show_name_in_global_search": 1,
"sort_field": "creation",
"sort_order": "ASC",
"states": [],
"translated_doctype": 1
}
}

View File

@@ -3,10 +3,11 @@
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestModeofPayment(IntegrationTestCase):
class TestModeofPayment(ERPNextTestSuite):
pass

View File

@@ -2,9 +2,8 @@
# See license.txt
import unittest
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestMonthlyDistribution(IntegrationTestCase):
class TestMonthlyDistribution(ERPNextTestSuite):
pass

View File

@@ -50,6 +50,7 @@ frappe.ui.form.on("Opening Invoice Creation Tool", {
refresh: function (frm) {
frm.disable_save();
frm.trigger("create_missing_party");
!frm.doc.import_in_progress && frm.trigger("make_dashboard");
frm.page.set_primary_action(__("Create Invoices"), () => {
let btn_primary = frm.page.btn_primary.get(0);
@@ -69,9 +70,7 @@ frappe.ui.form.on("Opening Invoice Creation Tool", {
});
});
if (frm.doc.create_missing_party) {
frm.set_df_property("party", "fieldtype", "Data", frm.doc.name, "invoices");
}
frm.trigger("update_party_labels");
},
setup_company_filters: function (frm) {
@@ -123,9 +122,12 @@ frappe.ui.form.on("Opening Invoice Creation Tool", {
invoice_type: function (frm) {
$.each(frm.doc.invoices, (idx, row) => {
row.party_type = frm.doc.invoice_type == "Sales" ? "Customer" : "Supplier";
row.party = "";
frappe.model.set_value(row.doctype, row.name, "party", "");
frappe.model.set_value(row.doctype, row.name, "party_name", "");
});
frm.clear_table("invoices");
frm.refresh_fields();
frm.trigger("update_party_labels");
},
make_dashboard: function (frm) {
@@ -162,9 +164,61 @@ frappe.ui.form.on("Opening Invoice Creation Tool", {
row.party_type = frm.doc.invoice_type == "Sales" ? "Customer" : "Supplier";
});
},
create_missing_party: function (frm) {
if (frm.doc.create_missing_party) {
frm.fields_dict["invoices"].grid.update_docfield_property("party", "reqd", 0);
frm.fields_dict["invoices"].grid.update_docfield_property("party_name", "read_only", 0);
} else {
frm.fields_dict["invoices"].grid.update_docfield_property("party", "reqd", 1);
frm.fields_dict["invoices"].grid.update_docfield_property("party_name", "read_only", 1);
}
frm.refresh_field("invoices");
},
update_party_labels: function (frm) {
let is_sales = frm.doc.invoice_type == "Sales";
frm.fields_dict["invoices"].grid.update_docfield_property(
"party",
"label",
is_sales ? "Customer ID" : "Supplier ID"
);
frm.fields_dict["invoices"].grid.update_docfield_property(
"party_name",
"label",
is_sales ? "Customer Name" : "Supplier Name"
);
frm.set_df_property(
"create_missing_party",
"description",
is_sales
? __("If party does not exist, create it using the Customer Name field.")
: __("If party does not exist, create it using the Supplier Name field.")
);
frm.refresh_field("invoices");
frm.refresh_field("create_missing_party");
},
});
frappe.ui.form.on("Opening Invoice Creation Tool Item", {
party: function (frm, cdt, cdn) {
let row = locals[cdt][cdn];
if (!row.party) {
frappe.model.set_value(cdt, cdn, "party_name", "");
return;
}
let party_type = frm.doc.invoice_type == "Sales" ? "Customer" : "Supplier";
let name_field = party_type === "Customer" ? "customer_name" : "supplier_name";
frappe.db.get_value(party_type, row.party, name_field, (r) => {
frappe.model.set_value(cdt, cdn, "party_name", r?.[name_field] || "");
});
},
invoices_add: (frm) => {
frm.trigger("update_invoice_table");
},

View File

@@ -7,6 +7,7 @@
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"section_break_ynel",
"company",
"create_missing_party",
"column_break_3",
@@ -25,11 +26,11 @@
"in_list_view": 1,
"label": "Company",
"options": "Company",
"remember_last_selected_value": 1,
"reqd": 1
},
{
"default": "0",
"description": "Create missing customer or supplier.",
"fieldname": "create_missing_party",
"fieldtype": "Check",
"label": "Create Missing Party"
@@ -65,10 +66,10 @@
"options": "Cost Center"
},
{
"fieldname": "project",
"fieldtype": "Link",
"label": "Project",
"options": "Project"
"fieldname": "project",
"fieldtype": "Link",
"label": "Project",
"options": "Project"
},
{
"collapsible": 1,
@@ -79,12 +80,17 @@
{
"fieldname": "dimension_col_break",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_ynel",
"fieldtype": "Section Break",
"hide_border": 1
}
],
"hide_toolbar": 1,
"issingle": 1,
"links": [],
"modified": "2024-03-27 13:10:06.564397",
"modified": "2026-03-31 01:47:20.360352",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Opening Invoice Creation Tool",
@@ -101,8 +107,9 @@
}
],
"quick_entry": 1,
"row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
}

View File

@@ -5,7 +5,7 @@
import frappe
from frappe import _, scrub
from frappe.model.document import Document
from frappe.utils import flt, nowdate
from frappe.utils import escape_html, flt, nowdate
from frappe.utils.background_jobs import enqueue, is_job_enqueued
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
@@ -32,6 +32,7 @@ class OpeningInvoiceCreationTool(Document):
create_missing_party: DF.Check
invoice_type: DF.Literal["Sales", "Purchase"]
invoices: DF.Table[OpeningInvoiceCreationToolItem]
project: DF.Link | None
# end: auto-generated types
def onload(self):
@@ -85,6 +86,11 @@ class OpeningInvoiceCreationTool(Document):
)
prepare_invoice_summary(doctype, invoices)
invoices_summary_companies = list(invoices_summary.keys())
for company in invoices_summary_companies:
invoices_summary[escape_html(company)] = invoices_summary.pop(company)
return invoices_summary, max_count
def validate_company(self):
@@ -102,10 +108,20 @@ class OpeningInvoiceCreationTool(Document):
row.due_date = row.due_date or nowdate()
def validate_mandatory_invoice_fields(self, row):
if not frappe.db.exists(row.party_type, row.party):
if self.create_missing_party:
self.add_party(row.party_type, row.party)
else:
if self.create_missing_party:
if not row.party and not row.party_name:
frappe.throw(_("Row #{}: Either Party ID or Party Name is required").format(row.idx))
if not row.party and row.party_name:
row.party = self.add_party(row.party_type, row.party_name)
if row.party and not frappe.db.exists(row.party_type, row.party):
row.party = self.add_party(row.party_type, row.party)
else:
if not row.party:
frappe.throw(_("Row #{}: Party ID is required").format(row.idx))
if not frappe.db.exists(row.party_type, row.party):
frappe.throw(
_("Row #{}: {} {} does not exist.").format(
row.idx, frappe.bold(row.party_type), frappe.bold(row.party)
@@ -113,7 +129,7 @@ class OpeningInvoiceCreationTool(Document):
)
mandatory_error_msg = _("Row #{0}: {1} is required to create the Opening {2} Invoices")
for d in ("Party", "Outstanding Amount", "Temporary Opening Account"):
for d in ("Outstanding Amount", "Temporary Opening Account"):
if not row.get(scrub(d)):
frappe.throw(mandatory_error_msg.format(row.idx, d, self.invoice_type))
@@ -159,6 +175,7 @@ class OpeningInvoiceCreationTool(Document):
party_doc.flags.ignore_mandatory = True
party_doc.save(ignore_permissions=True)
return party_doc.name
def get_invoice_dict(self, row=None):
def get_item_dict():
@@ -262,7 +279,8 @@ def start_import(invoices):
doc.flags.ignore_mandatory = True
doc.insert(set_name=invoice_number)
doc.submit()
frappe.db.commit()
if not frappe.in_test:
frappe.db.commit()
names.append(doc.name)
except Exception:
errors += 1

View File

@@ -1,5 +1,5 @@
{% $.each(data, (company, summary) => { %}
<h6 style="margin: 15px 0px -10px 0px;"><a class="company-link"> {{ company }}</a></h6>
<div style="margin: 15px 0px -10px 0px;"> {{ company }}</div>
<table class="table table-bordered small">
<thead>
@@ -23,7 +23,7 @@
<td class="text-right">
{{ format_currency(summary[doctype].outstanding_amount, summary.currency, 2) }}
</td>
</div>
</tr>
{% endif %}
{% }); %}
</tbody>

View File

@@ -2,27 +2,14 @@
# See license.txt
import frappe
from frappe.tests import IntegrationTestCase
from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import (
create_dimension,
disable_dimension,
)
from erpnext.accounts.doctype.opening_invoice_creation_tool.opening_invoice_creation_tool import (
get_temporary_opening_account,
)
EXTRA_TEST_RECORD_DEPENDENCIES = ["Customer", "Supplier", "Accounting Dimension"]
from erpnext.tests.utils import ERPNextTestSuite
class TestOpeningInvoiceCreationTool(IntegrationTestCase):
@classmethod
def setUpClass(cls):
if not frappe.db.exists("Company", "_Test Opening Invoice Company"):
make_company()
create_dimension()
return super().setUpClass()
class TestOpeningInvoiceCreationTool(ERPNextTestSuite):
def make_invoices(
self,
invoice_type="Sales",
@@ -149,9 +136,6 @@ class TestOpeningInvoiceCreationTool(IntegrationTestCase):
}
self.check_expected_values(invoices, expected_value, invoice_type="Sales")
def tearDown(self):
disable_dimension()
def get_opening_invoice_creation_dict(**args):
party = "Customer" if args.get("invoice_type", "Sales") == "Sales" else "Supplier"
@@ -190,26 +174,13 @@ def get_opening_invoice_creation_dict(**args):
return invoice_dict
def make_company():
if frappe.db.exists("Company", "_Test Opening Invoice Company"):
return frappe.get_doc("Company", "_Test Opening Invoice Company")
company = frappe.new_doc("Company")
company.company_name = "_Test Opening Invoice Company"
company.abbr = "_TOIC"
company.default_currency = "INR"
company.country = "Pakistan"
company.insert()
return company
def make_customer(customer=None):
customer_name = customer or "Opening Customer"
customer = frappe.get_doc(
{
"doctype": "Customer",
"customer_name": customer_name,
"customer_group": "All Customer Groups",
"customer_group": "Individual",
"customer_type": "Company",
"territory": "All Territories",
}

View File

@@ -8,6 +8,7 @@
"invoice_number",
"party_type",
"party",
"party_name",
"temporary_opening_account",
"column_break_3",
"posting_date",
@@ -35,9 +36,9 @@
"fieldname": "party",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Party",
"options": "party_type",
"reqd": 1
"label": "Party ID",
"mandatory_depends_on": "eval: !parent.create_missing_party",
"options": "party_type"
},
{
"fieldname": "temporary_opening_account",
@@ -118,11 +119,17 @@
"fieldname": "supplier_invoice_date",
"fieldtype": "Date",
"label": "Supplier Invoice Date"
},
{
"fieldname": "party_name",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Party Name"
}
],
"istable": 1,
"links": [],
"modified": "2025-12-01 16:18:07.997594",
"modified": "2026-03-20 02:11:42.023575",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Opening Invoice Creation Tool Item",

View File

@@ -22,7 +22,8 @@ class OpeningInvoiceCreationToolItem(Document):
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data
party: DF.DynamicLink
party: DF.DynamicLink | None
party_name: DF.Data | None
party_type: DF.Link | None
posting_date: DF.Date | None
qty: DF.Data | None

View File

@@ -3,8 +3,8 @@
# import frappe
import unittest
from frappe.tests import IntegrationTestCase
from erpnext.tests.utils import ERPNextTestSuite
class TestPartyLink(IntegrationTestCase):
class TestPartyLink(ERPNextTestSuite):
pass

View File

@@ -138,6 +138,7 @@
"fieldname": "posting_date",
"fieldtype": "Date",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Posting Date",
"reqd": 1
},
@@ -160,7 +161,6 @@
{
"fieldname": "mode_of_payment",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Mode of Payment",
"options": "Mode of Payment"
},
@@ -228,6 +228,7 @@
"fieldname": "paid_from",
"fieldtype": "Link",
"in_global_search": 1,
"in_list_view": 1,
"label": "Account Paid From",
"options": "Account",
"print_hide": 1,
@@ -252,6 +253,7 @@
"fieldname": "paid_to",
"fieldtype": "Link",
"in_global_search": 1,
"in_list_view": 1,
"label": "Account Paid To",
"options": "Account",
"print_hide": 1,
@@ -414,6 +416,7 @@
"depends_on": "eval:(doc.paid_from && doc.paid_to)",
"fieldname": "reference_no",
"fieldtype": "Data",
"in_standard_filter": 1,
"label": "Cheque/Reference No",
"mandatory_depends_on": "eval:(doc.paid_from_account_type == 'Bank' || doc.paid_to_account_type == 'Bank')"
},
@@ -792,7 +795,7 @@
"table_fieldname": "payment_entries"
}
],
"modified": "2026-02-03 16:08:49.800381",
"modified": "2026-03-09 17:15:30.453920",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",

View File

@@ -2376,9 +2376,7 @@ def get_outstanding_reference_documents(args, validate=False):
vouchers=args.get("vouchers") or None,
)
outstanding_invoices = split_invoices_based_on_payment_terms(
outstanding_invoices, args.get("company")
)
outstanding_invoices = split_refdocs_based_on_payment_terms(outstanding_invoices, args.get("company"))
for d in outstanding_invoices:
d["exchange_rate"] = 1
@@ -2416,6 +2414,8 @@ def get_outstanding_reference_documents(args, validate=False):
filters=args,
)
orders_to_be_billed = split_refdocs_based_on_payment_terms(orders_to_be_billed, args.get("company"))
data = negative_outstanding_invoices + outstanding_invoices + orders_to_be_billed
if not data:
@@ -2438,13 +2438,13 @@ def get_outstanding_reference_documents(args, validate=False):
return data
def split_invoices_based_on_payment_terms(outstanding_invoices, company) -> list:
def split_refdocs_based_on_payment_terms(refdocs, company) -> list:
"""Split a list of invoices based on their payment terms."""
exc_rates = get_currency_data(outstanding_invoices, company)
exc_rates = get_currency_data(refdocs, company)
outstanding_invoices_after_split = []
for entry in outstanding_invoices:
if entry.voucher_type in ["Sales Invoice", "Purchase Invoice"]:
outstanding_refdoc_after_split = []
for entry in refdocs:
if entry.voucher_type in ["Sales Invoice", "Purchase Invoice", "Sales Order", "Purchase Order"]:
if payment_term_template := frappe.db.get_value(
entry.voucher_type, entry.voucher_no, "payment_terms_template"
):
@@ -2459,25 +2459,25 @@ def split_invoices_based_on_payment_terms(outstanding_invoices, company) -> list
),
alert=True,
)
outstanding_invoices_after_split += split_rows
outstanding_refdoc_after_split += split_rows
continue
# If not an invoice or no payment terms template, add as it is
outstanding_invoices_after_split.append(entry)
outstanding_refdoc_after_split.append(entry)
return outstanding_invoices_after_split
return outstanding_refdoc_after_split
def get_currency_data(outstanding_invoices: list, company: str | None = None) -> dict:
def get_currency_data(outstanding_refdocs: list, company: str | None = None) -> dict:
"""Get currency and conversion data for a list of invoices."""
exc_rates = frappe._dict()
company_currency = frappe.db.get_value("Company", company, "default_currency") if company else None
for doctype in ["Sales Invoice", "Purchase Invoice"]:
invoices = [x.voucher_no for x in outstanding_invoices if x.voucher_type == doctype]
for doctype in ["Sales Invoice", "Purchase Invoice", "Sales Order", "Purchase Order"]:
refdoc = [x.voucher_no for x in outstanding_refdocs if x.voucher_type == doctype]
for x in frappe.db.get_all(
doctype,
filters={"name": ["in", invoices]},
filters={"name": ["in", refdoc]},
fields=["name", "currency", "conversion_rate", "party_account_currency"],
):
exc_rates[x.name] = frappe._dict(
@@ -2556,14 +2556,9 @@ def get_orders_to_be_billed(
if not voucher_type:
return []
# Add cost center condition
doc = frappe.get_doc({"doctype": voucher_type})
condition = ""
if doc and hasattr(doc, "cost_center") and doc.cost_center:
condition = " and cost_center='%s'" % cost_center
# dynamic dimension filters
active_dimensions = get_dimensions()[0]
condition = ""
active_dimensions = get_dimensions(True)[0]
for dim in active_dimensions:
if filters.get(dim.fieldname):
condition += f" and {dim.fieldname}='{filters.get(dim.fieldname)}'"

View File

@@ -4,7 +4,6 @@
import frappe
from frappe import qb
from frappe.tests import IntegrationTestCase
from frappe.utils import add_days, flt, nowdate
from erpnext.accounts.doctype.account.test_account import create_account
@@ -24,14 +23,10 @@ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import (
)
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
from erpnext.setup.doctype.employee.test_employee import make_employee
EXTRA_TEST_RECORD_DEPENDENCIES = ["Item", "Currency Exchange"]
from erpnext.tests.utils import ERPNextTestSuite
class TestPaymentEntry(IntegrationTestCase):
def tearDown(self):
frappe.db.rollback()
class TestPaymentEntry(ERPNextTestSuite):
def get_journals_for(self, voucher_type: str, voucher_no: str) -> list:
journals = []
if voucher_type and voucher_no:
@@ -427,7 +422,7 @@ class TestPaymentEntry(IntegrationTestCase):
self.assertEqual(si.payment_schedule[0].outstanding, 0)
self.assertEqual(si.payment_schedule[0].discounted_amount, 50)
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{
"allow_multi_currency_invoices_against_single_party_account": 1,
@@ -645,6 +640,7 @@ class TestPaymentEntry(IntegrationTestCase):
def test_payment_entry_retrieves_last_exchange_rate(self):
from erpnext.setup.doctype.currency_exchange.test_currency_exchange import save_new_records
self.load_test_records("Currency Exchange")
save_new_records(self.globalTestRecords["Currency Exchange"])
pe = frappe.new_doc("Payment Entry")
@@ -982,6 +978,7 @@ class TestPaymentEntry(IntegrationTestCase):
def test_gl_of_multi_currency_payment_transaction(self):
from erpnext.setup.doctype.currency_exchange.test_currency_exchange import save_new_records
self.load_test_records("Currency Exchange")
save_new_records(self.globalTestRecords["Currency Exchange"])
paid_from = create_account(
parent_account="Current Liabilities - _TC",
@@ -1158,7 +1155,7 @@ class TestPaymentEntry(IntegrationTestCase):
}
self.assertDictEqual(ref_details, expected_response)
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{
"unlink_payment_on_cancellation_of_invoice": 1,
@@ -1253,7 +1250,7 @@ class TestPaymentEntry(IntegrationTestCase):
si3.cancel()
si3.delete()
@IntegrationTestCase.change_settings(
@ERPNextTestSuite.change_settings(
"Accounts Settings",
{
"unlink_payment_on_cancellation_of_invoice": 1,
@@ -1949,7 +1946,7 @@ class TestPaymentEntry(IntegrationTestCase):
# 'Is Opening' should always be 'No' for normal advance payments
self.assertEqual(gl_with_opening_set, [])
@IntegrationTestCase.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1})
@ERPNextTestSuite.change_settings("Accounts Settings", {"delete_linked_ledger_entries": 1})
def test_delete_linked_exchange_gain_loss_journal(self):
from erpnext.accounts.doctype.account.test_account import create_account
from erpnext.accounts.doctype.opening_invoice_creation_tool.test_opening_invoice_creation_tool import (
@@ -2022,6 +2019,123 @@ class TestPaymentEntry(IntegrationTestCase):
self.assertRaises(frappe.DoesNotExistError, frappe.get_doc, pe.doctype, pe.name)
self.assertRaises(frappe.DoesNotExistError, frappe.get_doc, "Journal Entry", jv[0])
def test_outstanding_orders_split_by_payment_terms(self):
create_payment_terms_template()
so = make_sales_order(do_not_save=1, qty=1, rate=200)
so.payment_terms_template = "Test Receivable Template"
so.save().submit()
args = {
"posting_date": nowdate(),
"company": so.company,
"party_type": "Customer",
"payment_type": "Receive",
"party": so.customer,
"party_account": "Debtors - _TC",
"get_orders_to_be_billed": True,
}
references = get_outstanding_reference_documents(args)
self.assertEqual(len(references), 2)
self.assertEqual(references[0].voucher_no, so.name)
self.assertEqual(references[1].voucher_no, so.name)
self.assertEqual(references[0].payment_term, "Basic Amount Receivable")
self.assertEqual(references[1].payment_term, "Tax Receivable")
def test_outstanding_orders_no_split_when_allocate_disabled(self):
create_payment_terms_template()
template = frappe.get_doc("Payment Terms Template", "Test Receivable Template")
template.allocate_payment_based_on_payment_terms = 0
template.save()
so = make_sales_order(do_not_save=1, qty=1, rate=200)
so.payment_terms_template = "Test Receivable Template"
so.save().submit()
args = {
"posting_date": nowdate(),
"company": so.company,
"party_type": "Customer",
"payment_type": "Receive",
"party": so.customer,
"party_account": "Debtors - _TC",
"get_orders_to_be_billed": True,
}
references = get_outstanding_reference_documents(args)
self.assertEqual(len(references), 1)
self.assertIsNone(references[0].payment_term)
template.allocate_payment_based_on_payment_terms = 1
template.save()
def test_outstanding_multicurrency_sales_order_split(self):
create_payment_terms_template()
so = make_sales_order(
customer="_Test Customer USD",
currency="USD",
qty=1,
rate=100,
do_not_submit=True,
)
so.payment_terms_template = "Test Receivable Template"
so.conversion_rate = 50
so.save().submit()
args = {
"posting_date": nowdate(),
"company": so.company,
"party_type": "Customer",
"payment_type": "Receive",
"party": so.customer,
"party_account": "Debtors - _TC",
"get_orders_to_be_billed": True,
}
references = get_outstanding_reference_documents(args)
# Should split without throwing currency errors
self.assertEqual(len(references), 2)
for ref in references:
self.assertEqual(ref.voucher_no, so.name)
self.assertIsNotNone(ref.payment_term)
def test_project_name_in_exchange_gain_loss_entry(self):
si = create_sales_invoice(
customer="_Test Customer USD",
debit_to="_Test Receivable USD - _TC",
currency="USD",
conversion_rate=50,
do_not_submit=True,
)
from erpnext.projects.doctype.project.test_project import make_project
si.project = make_project({"project_name": "_Test Project for Exchange Gain Loss Entry"}).name
si.submit()
pe = get_payment_entry("Sales Invoice", si.name)
pe.source_exchange_rate = 100
pe.insert()
pe.submit()
rows = frappe.get_all(
"Journal Entry Account",
or_filters=[{"reference_name": pe.name}, {"reference_name": si.name}],
fields=["project"],
)
self.assertEqual(len(rows), 2)
self.assertEqual(rows[0].project, si.project)
self.assertEqual(rows[1].project, si.project)
def create_payment_entry(**args):
payment_entry = frappe.new_doc("Payment Entry")

View File

@@ -22,6 +22,7 @@
"reqd": 1
},
{
"allow_on_submit": 1,
"fieldname": "cost_center",
"fieldtype": "Link",
"in_list_view": 1,
@@ -59,7 +60,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2025-08-13 06:52:46.130142",
"modified": "2026-03-11 14:26:11.312950",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry Deduction",

View File

@@ -2,10 +2,8 @@
# See license.txt
import unittest
from frappe.tests import IntegrationTestCase
IGNORE_TEST_RECORD_DEPENDENCIES = ["Payment Gateway"]
from erpnext.tests.utils import ERPNextTestSuite
class TestPaymentGatewayAccount(IntegrationTestCase):
class TestPaymentGatewayAccount(ERPNextTestSuite):
pass

Some files were not shown because too many files have changed in this diff Show More