Compare commits

...

1099 Commits

Author SHA1 Message Date
Frappe PR Bot
756ac6c587 chore(release): Bumped to Version 14.24.3
## [14.24.3](https://github.com/frappe/erpnext/compare/v14.24.2...v14.24.3) (2023-05-18)

### Bug Fixes

* tds incorrectly calculated for invoice that are below threshold ([14565ed](14565ed8b1))
* **test:** cumulative threshold checks ([cdd378c](cdd378c518))
2023-05-18 14:07:04 +00:00
ruthra kumar
b5b1b2da32 Merge pull request #35359 from frappe/mergify/bp/version-14/pr-35335
fix: tds incorrectly calculated for invoice that are below threshold (backport #35335)
2023-05-18 19:35:11 +05:30
ruthra kumar
cdd378c518 fix(test): cumulative threshold checks
(cherry picked from commit 132846bbd1)
2023-05-18 13:30:03 +00:00
ruthra kumar
14565ed8b1 fix: tds incorrectly calculated for invoice that are below threshold
Two purchase invoices for the same supplier, using different tax
withholding categories have this issue.

| Category | single | cumulative |
|----------+--------+------------|
| cat1     |    100 |        500 |
| cat2     |   1000 |       5000 |

1. PINV1 of net total: 105/- uses cat1. TDS is calculated as it
breached single threshold
2. PINV2 of net total: 200/- uses cat2. TDS incorrectly calculated as
PINV1 already has TDS calculated and 'consider_party_ledger_amount' is enabled.

(cherry picked from commit 84b7c1bba0)
2023-05-18 13:30:02 +00:00
Frappe PR Bot
7076c23a4f chore(release): Bumped to Version 14.24.2
## [14.24.2](https://github.com/frappe/erpnext/compare/v14.24.1...v14.24.2) (2023-05-16)

### Bug Fixes

* add missing options for `Content Align` ([3697e8f](3697e8f1f9))
* allow over-payment against SO ([#35079](https://github.com/frappe/erpnext/issues/35079)) ([fe9e0c2](fe9e0c2121))
* bad strings format for command get-untraslated  ([#34361](https://github.com/frappe/erpnext/issues/34361)) ([5a54296](5a54296686))
* bad strings format for update-translations ([#34592](https://github.com/frappe/erpnext/issues/34592)) ([e3c1d73](e3c1d736ce))
* bom item filter issue ([098603d](098603dd35))
* cancelled vouchers in tax withheld vouchers list ([#35309](https://github.com/frappe/erpnext/issues/35309)) ([c41e1d7](c41e1d7d71))
* enqueue submit/cancel action for stock entry to avoid time out error ([457846e](457846e34c))
* force to do reposting for cancelled document ([6f96e5d](6f96e5dcd4))
* function `batch_no` should only be declared once ([#35115](https://github.com/frappe/erpnext/issues/35115)) ([26928b3](26928b395b))
* incorrect packing items ([ab56470](ab56470171))
* inventory dimension for inter company transfer return use case ([6d121b8](6d121b8107))
* inventory dimension for material transfer not working ([1d8050d](1d8050d24d))
* item list view not working ([d9efa66](d9efa662d4))
* port option for additional_conditions in item wise sales register ([#35187](https://github.com/frappe/erpnext/issues/35187)) ([42037f9](42037f9f73))
* recalculate costs in SCR while reposting ([9a8ee62](9a8ee62d5a))
* sales person allocated amount calculation error nonetype and float ([#35293](https://github.com/frappe/erpnext/issues/35293)) ([3a7c69f](3a7c69fc71))
* test case ([3f8928b](3f8928be5c))
* test case ([9b2b467](9b2b46737e))
* typo ([2772a91](2772a911ed))
* unable to create partial invoice with auto fetch terms enabled ([#35285](https://github.com/frappe/erpnext/issues/35285)) ([fa9fa97](fa9fa97e05))
* update workstation hour rate when workstation change in job card ([bc88415](bc88415e73))
* **UX:** misc "home" onboarding improvements (backport [#35319](https://github.com/frappe/erpnext/issues/35319)) ([#35321](https://github.com/frappe/erpnext/issues/35321)) ([f8c58b6](f8c58b6893))
* validate for active sla ([#32132](https://github.com/frappe/erpnext/issues/32132)) ([38e27a6](38e27a68d5))

### Performance Improvements

* cache and simplify queries for holiday list (backport [#35315](https://github.com/frappe/erpnext/issues/35315)) ([#35318](https://github.com/frappe/erpnext/issues/35318)) ([0e78403](0e7840301f))
2023-05-16 17:00:00 +00:00
Deepesh Garg
bdfd682664 Merge pull request #35324 from frappe/version-14-hotfix
chore: release v14
2023-05-16 22:28:33 +05:30
mergify[bot]
fa9fa97e05 fix: unable to create partial invoice with auto fetch terms enabled (#35285)
fix: unable to create partial invoice with auto fetch terms enabled (#35285)

fix: fetch so/po terms if auto fetch is enabled
(cherry picked from commit 0da6c1688b)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-05-16 18:59:12 +05:30
mergify[bot]
c41e1d7d71 fix: cancelled vouchers in tax withheld vouchers list (#35309)
fix: cancelled vouchers in tax withheld vouchers list (#35309)

(cherry picked from commit 776a83066d)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-05-16 18:58:04 +05:30
rohitwaghchaure
8f8c0a597b Merge pull request #35329 from frappe/mergify/bp/version-14-hotfix/pr-35328
fix: force to do reposting for cancelled document (backport #35328)
2023-05-16 18:53:33 +05:30
Rohit Waghchaure
6f96e5dcd4 fix: force to do reposting for cancelled document
(cherry picked from commit 6e661e7c0e)
2023-05-16 12:03:43 +00:00
mergify[bot]
f8c58b6893 fix(UX): misc "home" onboarding improvements (backport #35319) (#35321)
fix(UX): misc "home" onboarding improvements (#35319)

* fix(UX): cleanup "Home" onboarding

- Remove company, letterhead, data import etc from home onboarding step

* fix(UX): Show quick entry for item

* chore: fix copy here and there

(cherry picked from commit 5574d9a72d)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-05-16 16:00:25 +05:30
mergify[bot]
0e7840301f perf: cache and simplify queries for holiday list (backport #35315) (#35318)
Co-authored-by: Rucha Mahabal <ruchamahabal2@gmail.com>
2023-05-16 13:44:35 +05:30
rohitwaghchaure
19f08afcef Merge pull request #35314 from frappe/mergify/bp/version-14-hotfix/pr-35312
fix: item list view not working (backport #35312)
2023-05-16 11:10:18 +05:30
mergify[bot]
42037f9f73 fix: port option for additional_conditions in item wise sales register (#35187)
fix: port option for additional_conditions in item wise sales register (#35187)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 2a609616d9)

Co-authored-by: Smit Vora <smitvora203@gmail.com>
2023-05-16 07:29:48 +05:30
Rohit Waghchaure
d9efa662d4 fix: item list view not working
(cherry picked from commit 0489e30244)
2023-05-15 19:40:23 +00:00
rohitwaghchaure
ee147e62d5 Merge pull request #35311 from CodeVenturers/version-14-hotfix
fix: update workstation hour rate when workstation change in job card
2023-05-16 00:44:26 +05:30
vishnu
bc88415e73 fix: update workstation hour rate when workstation change in job card 2023-05-15 14:50:40 +00:00
Sagar Sharma
5463f0b137 Merge pull request #35308 from frappe/mergify/bp/version-14-hotfix/pr-35138
fix: recalculate costs in SCR while reposting (backport #35138)
2023-05-15 17:14:57 +05:30
Sagar Sharma
a8fc17e0ae refactor: use calculate_items_qty_and_amount() to update scr items rate
(cherry picked from commit 9c72c2a6cb)
2023-05-15 10:56:51 +00:00
Sagar Sharma
0575b105d0 refactor(minor): rename function to be more descriptive
(cherry picked from commit d6433f803b)
2023-05-15 10:56:51 +00:00
Sagar Sharma
4c8dbeddec test: add test case
(cherry picked from commit e0b22edb2e)
2023-05-15 10:56:51 +00:00
s-aga-r
9a8ee62d5a fix: recalculate costs in SCR while reposting
(cherry picked from commit a6cb6c6f47)
2023-05-15 10:56:50 +00:00
mergify[bot]
3a7c69fc71 fix: sales person allocated amount calculation error nonetype and float (#35293)
fix: sales person allocated amount calculation error nonetype and float (#35293)

fix: sales person allocated amount calculation error nontype and float
(cherry picked from commit 0c8276ec82)

Co-authored-by: Indrajith.vs <91895505+Gubbu77@users.noreply.github.com>
2023-05-15 13:16:47 +05:30
rohitwaghchaure
dd116a3071 Merge pull request #35291 from frappe/mergify/bp/version-14-hotfix/pr-35289
fix: inventory dimension for returned inter company transfer (backport #35289)
2023-05-14 16:29:34 +05:30
rohitwaghchaure
3f8928be5c fix: test case 2023-05-14 15:49:58 +05:30
mergify[bot]
26928b395b fix: function batch_no should only be declared once (#35115)
fix: function `batch_no` should only be declared once (#35115)

fix: remove twice event call of `batch_no` to update batch qty
(cherry picked from commit 19cd687784)

Co-authored-by: Daizy Modi <modidaizy5217@gmail.com>
2023-05-14 11:54:15 +05:30
mergify[bot]
fe9e0c2121 fix: allow over-payment against SO (#35079)
fix: allow over-payment against SO (#35079)

(cherry picked from commit 870b02b03c)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-05-14 11:44:50 +05:30
Deepesh Garg
77cf2e5475 Merge pull request #35262 from akiratfli/fix-bad-string
fix: bad strings format for translations
2023-05-14 08:06:24 +05:30
rohitwaghchaure
2772a911ed fix: typo 2023-05-13 15:14:41 +05:30
Rohit Waghchaure
6d121b8107 fix: inventory dimension for inter company transfer return use case
(cherry picked from commit 38aaba5720)
2023-05-13 08:57:03 +00:00
Sagar Sharma
c30dda3328 Merge pull request #35283 from frappe/mergify/bp/version-14-hotfix/pr-35275
fix: add missing options for `Content Align` (backport #35275)
2023-05-13 09:42:20 +05:30
Sagar Sharma
b2e6fdc0cb Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-35275 2023-05-13 09:41:30 +05:30
rohitwaghchaure
75af689f77 Merge pull request #35282 from frappe/mergify/bp/version-14-hotfix/pr-35224
fix: inventory dimension for material transfer not working (backport #35224)
2023-05-13 09:36:42 +05:30
Sagar Sharma
3697e8f1f9 fix: add missing options for Content Align
(cherry picked from commit d16caa2d2c)
2023-05-13 04:05:15 +00:00
Rohit Waghchaure
1d8050d24d fix: inventory dimension for material transfer not working
(cherry picked from commit 6798b900ef)
2023-05-12 20:46:04 +00:00
Frappe PR Bot
897a467846 chore(release): Bumped to Version 14.24.1
## [14.24.1](https://github.com/frappe/erpnext/compare/v14.24.0...v14.24.1) (2023-05-12)

### Bug Fixes

* bom item filter issue ([54e822d](54e822d83a))
* enqueue submit/cancel action for stock entry to avoid time out error ([762a46a](762a46a5e3))
* incorrect packing items ([b02ed0d](b02ed0d9a8))
* test case ([1783594](1783594178))
2023-05-12 10:05:31 +00:00
rohitwaghchaure
f06a8fd01c Merge pull request #35270 from frappe/mergify/bp/version-14/pr-35266
fix: enqueue submit/cancel action for stock entry to avoid time out error (backport #35261) (backport #35266)
2023-05-12 15:30:55 +05:30
rohitwaghchaure
b139ec6ec0 Merge pull request #35271 from frappe/mergify/bp/version-14/pr-35269
fix: BOM item filter issue (backport #35268) (backport #35269)
2023-05-12 15:30:43 +05:30
rohitwaghchaure
e97eaccdfb Merge pull request #35276 from frappe/mergify/bp/version-14/pr-35274
fix: incorrect packing items (backport #35273) (backport #35274)
2023-05-12 15:30:28 +05:30
Rohit Waghchaure
b02ed0d9a8 fix: incorrect packing items
(cherry picked from commit a686b8c337)
(cherry picked from commit ab56470171)
2023-05-12 09:37:12 +00:00
rohitwaghchaure
4206f01c05 Merge pull request #35274 from frappe/mergify/bp/version-14-hotfix/pr-35273
fix: incorrect packing items (backport #35273)
2023-05-12 15:06:25 +05:30
Rohit Waghchaure
ab56470171 fix: incorrect packing items
(cherry picked from commit a686b8c337)
2023-05-12 09:13:52 +00:00
Rohit Waghchaure
54e822d83a fix: bom item filter issue
(cherry picked from commit 2879cb7c28)
(cherry picked from commit 098603dd35)
2023-05-12 07:42:57 +00:00
rohitwaghchaure
8af1e49e96 Merge pull request #35269 from frappe/mergify/bp/version-14-hotfix/pr-35268
fix: BOM item filter issue (backport #35268)
2023-05-12 13:12:11 +05:30
Rohit Waghchaure
1783594178 fix: test case
(cherry picked from commit 2d6f112727)
(cherry picked from commit 9b2b46737e)
2023-05-12 07:41:34 +00:00
Rohit Waghchaure
762a46a5e3 fix: enqueue submit/cancel action for stock entry to avoid time out error
(cherry picked from commit 7a3801578c)
(cherry picked from commit 457846e34c)
2023-05-12 07:41:34 +00:00
rohitwaghchaure
19f0676592 Merge pull request #35266 from frappe/mergify/bp/version-14-hotfix/pr-35261
fix: enqueue submit/cancel action for stock entry to avoid time out error (backport #35261)
2023-05-12 13:10:48 +05:30
Rohit Waghchaure
098603dd35 fix: bom item filter issue
(cherry picked from commit 2879cb7c28)
2023-05-12 07:40:38 +00:00
Rohit Waghchaure
9b2b46737e fix: test case
(cherry picked from commit 2d6f112727)
2023-05-12 07:03:22 +00:00
Rohit Waghchaure
457846e34c fix: enqueue submit/cancel action for stock entry to avoid time out error
(cherry picked from commit 7a3801578c)
2023-05-12 07:03:21 +00:00
Danny
5a54296686 fix: bad strings format for command get-untraslated (#34361)
(cherry picked from commit ca10e2bb9f)
2023-05-12 03:19:01 +00:00
justin.li
e3c1d736ce fix: bad strings format for update-translations (#34592)
(cherry picked from commit 07c9b99072)
2023-05-12 02:21:19 +00:00
Saqib Ansari
c8e3ce48e1 Merge pull request #35257 from frappe/mergify/bp/version-14-hotfix/pr-32132
fix: validate for active sla (backport #32132)
2023-05-11 17:50:00 +05:30
Shadrak Gurupnor
38e27a68d5 fix: validate for active sla (#32132)
(cherry picked from commit f2b7c9ee66)
2023-05-11 12:18:49 +00:00
Frappe PR Bot
e509664d4f chore(release): Bumped to Version 14.24.0
# [14.24.0](https://github.com/frappe/erpnext/compare/v14.23.4...v14.24.0) (2023-05-10)

### Bug Fixes

* added search index to improve performance ([362003e](362003ec5f))
* broken save on empty row existance ([c0f9ff4](c0f9ff4995))
* bypass flag in Customer Group wasn't effective ([c73b76f](c73b76fdb6))
* Changed type of column 'serial_no' in Stock Reconciliation to fix Data too long error ([709f94c](709f94c8d3))
* child acc will inherit acc currency if explicitly specified ([72255fa](72255fae80))
* enabling lead even after "Opportunity" created against it ([#34627](https://github.com/frappe/erpnext/issues/34627)) ([5e98679](5e98679f91))
* error regarding accepted and supplier warehouse ([42f5888](42f5888426))
* fetch default sales team on Quotation -> Sales Order creation ([f42225b](f42225bc82))
* handle empty FBs properly in TB and GL [v14] ([#35189](https://github.com/frappe/erpnext/issues/35189)) ([ed5f39c](ed5f39c2c2))
* incorrect fg item quantity in subcontracted PO ([5c38645](5c38645560))
* internal transfer condition ([f5f4902](f5f4902494))
* non manufacturing items/fixed asset items in BOM ([8133be4](8133be4868))
* not allow to transfer excess materials against the job card ([b0c042d](b0c042de1b))
* over production percentage not considered in validation ([bf6e1b6](bf6e1b67a5))
* pick the in progress reposting entries first ([545f956](545f956160))

### Features

* configuration to notify reposting errors to specific role ([33cd14f](33cd14f859))
* reserve qty against production plan raw materials in BIN ([d1a9117](d1a91177e5))
2023-05-10 05:40:21 +00:00
Deepesh Garg
2fb3659694 Merge pull request #35222 from frappe/version-14-hotfix
chore: release v14
2023-05-10 11:08:42 +05:30
ruthra kumar
1145149f0e Merge pull request #35228 from frappe/mergify/bp/version-14-hotfix/pr-35216
fix: broken save on empty row existance (backport #35216)
2023-05-10 10:11:32 +05:30
rohitwaghchaure
dd20bf931b Merge pull request #35234 from frappe/mergify/bp/version-14-hotfix/pr-35230
fix: Changed type of column 'serial_no' in Stock Reconciliation to fix Data too Long error (backport #35230)
2023-05-09 21:06:14 +05:30
Rohit Waghchaure
709f94c8d3 fix: Changed type of column 'serial_no' in Stock Reconciliation to fix Data too long error
(cherry picked from commit 1a673fd424)
2023-05-09 14:26:13 +00:00
rohitwaghchaure
2933c4f1c5 Merge pull request #35231 from frappe/mergify/bp/version-14-hotfix/pr-35227
fix: non manufacturing items/fixed asset items in BOM (backport #35227)
2023-05-09 19:53:53 +05:30
Rohit Waghchaure
8133be4868 fix: non manufacturing items/fixed asset items in BOM
(cherry picked from commit aba8431d70)
2023-05-09 13:18:47 +00:00
Dany Robert
c0f9ff4995 fix: broken save on empty row existance
(cherry picked from commit d9b231aa16)
2023-05-09 13:02:54 +00:00
rohitwaghchaure
7b6a1e5184 Merge pull request #35221 from frappe/mergify/bp/version-14-hotfix/pr-35220
fix: added search index to improve performance (backport #35220)
2023-05-09 16:04:36 +05:30
Rohit Waghchaure
362003ec5f fix: added search index to improve performance
(cherry picked from commit 80ea22b56c)
2023-05-09 09:05:43 +00:00
ruthra kumar
30e137e9f2 Merge pull request #35214 from frappe/mergify/bp/version-14-hotfix/pr-35212
chore: convert throw to msgprint in payment reconciliation job hook (backport #35212)
2023-05-08 19:07:41 +05:30
ruthra kumar
08a4781de7 chore: convert throw to msgprint
(cherry picked from commit 73134d57bf)
2023-05-08 12:28:01 +00:00
ruthra kumar
14706d4326 Merge pull request #35209 from frappe/mergify/bp/version-14-hotfix/pr-35153
fix: fetch default sales team on Quotation -> Sales Order creation (backport #35153)
2023-05-08 14:51:45 +05:30
ruthra kumar
fd09d1c4c3 Merge pull request #35208 from frappe/mergify/bp/version-14-hotfix/pr-35142
fix: ineffective bypass flag for Credit Limit in Customer Group (backport #35142)
2023-05-08 14:51:29 +05:30
rohitwaghchaure
afbbf26f15 Merge pull request #35202 from frappe/mergify/bp/version-14-hotfix/pr-35196
fix: pick the in progress reposting entries first (backport #35196)
2023-05-08 14:40:10 +05:30
rohitwaghchaure
f83fcf5261 Merge pull request #35203 from frappe/mergify/bp/version-14-hotfix/pr-35200
fix: error regarding accepted and supplier warehouse (backport #35200)
2023-05-08 14:39:52 +05:30
ruthra kumar
5879475a00 Merge pull request #35207 from frappe/mergify/bp/version-14-hotfix/pr-35186
fix: child acc will inherit acc currency if explicitly specified (backport #35186)
2023-05-08 14:35:26 +05:30
ruthra kumar
f42225bc82 fix: fetch default sales team on Quotation -> Sales Order creation
(cherry picked from commit 4d31436917)
2023-05-08 08:50:09 +00:00
ruthra kumar
c73b76fdb6 fix: bypass flag in Customer Group wasn't effective
(cherry picked from commit f9a4972cb6)
2023-05-08 08:41:51 +00:00
ruthra kumar
e451916803 test: currency inheritance on child accounts
(cherry picked from commit f6ea8fd8d7)
2023-05-08 08:40:28 +00:00
ruthra kumar
72255fae80 fix: child acc will inherit acc currency if explicitly specified
(cherry picked from commit abe691c03d)
2023-05-08 08:40:28 +00:00
Rohit Waghchaure
42f5888426 fix: error regarding accepted and supplier warehouse
(cherry picked from commit 15f5f98858)
2023-05-08 03:54:40 +00:00
Rohit Waghchaure
545f956160 fix: pick the in progress reposting entries first
(cherry picked from commit c8a4791d9b)
2023-05-08 03:54:22 +00:00
rohitwaghchaure
1226f3294f Merge pull request #35198 from frappe/mergify/bp/version-14-hotfix/pr-35197
fix: incorrect fg item quantity in subcontracted PO (backport #35197)
2023-05-07 17:05:13 +05:30
Rohit Waghchaure
5c38645560 fix: incorrect fg item quantity in subcontracted PO
(cherry picked from commit af16fbb0a3)
2023-05-06 20:09:31 +00:00
Frappe PR Bot
9a755ca23d chore(release): Bumped to Version 14.23.4
## [14.23.4](https://github.com/frappe/erpnext/compare/v14.23.3...v14.23.4) (2023-05-06)

### Bug Fixes

* handle empty FBs properly in TB and GL [v14] (backport [#35189](https://github.com/frappe/erpnext/issues/35189)) ([#35191](https://github.com/frappe/erpnext/issues/35191)) ([a5a08c9](a5a08c9889))
2023-05-06 11:12:52 +00:00
mergify[bot]
a5a08c9889 fix: handle empty FBs properly in TB and GL [v14] (backport #35189) (#35191)
fix: handle empty FBs properly in TB and GL [v14] (#35189)

fix: handle empty FBs properly in TB and GL
(cherry picked from commit ed5f39c2c2)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-05-06 16:41:10 +05:30
Anand Baburajan
ed5f39c2c2 fix: handle empty FBs properly in TB and GL [v14] (#35189)
fix: handle empty FBs properly in TB and GL
2023-05-06 16:38:59 +05:30
Frappe PR Bot
a1842103b6 chore(release): Bumped to Version 14.23.3
## [14.23.3](https://github.com/frappe/erpnext/compare/v14.23.2...v14.23.3) (2023-05-04)

### Bug Fixes

* internal transfer condition ([736c34e](736c34e61a))
* not allow to transfer excess materials against the job card ([580641f](580641f55c))
2023-05-04 18:02:30 +00:00
rohitwaghchaure
4d54430010 Merge pull request #35174 from frappe/mergify/bp/version-14/pr-35163
fix: internal transfer condition (backport #35158) (backport #35163)
2023-05-04 23:30:29 +05:30
rohitwaghchaure
e855866820 Merge pull request #35175 from frappe/mergify/bp/version-14/pr-35169
fix: not allow to transfer excess materials against the job card (backport #35167) (backport #35169)
2023-05-04 23:30:07 +05:30
Rohit Waghchaure
580641f55c fix: not allow to transfer excess materials against the job card
(cherry picked from commit 8167b24219)
(cherry picked from commit b0c042de1b)
2023-05-04 17:11:54 +00:00
rohitwaghchaure
816ce879f9 Merge pull request #35169 from frappe/mergify/bp/version-14-hotfix/pr-35167
fix: not allow to transfer excess materials against the job card (backport #35167)
2023-05-04 22:41:07 +05:30
Rohit Waghchaure
736c34e61a fix: internal transfer condition
(cherry picked from commit b5a2ccf21d)
(cherry picked from commit f5f4902494)
2023-05-04 17:10:41 +00:00
rohitwaghchaure
f4858fbf8a Merge pull request #35163 from frappe/mergify/bp/version-14-hotfix/pr-35158
fix: internal transfer condition (backport #35158)
2023-05-04 22:39:55 +05:30
Rohit Waghchaure
b0c042de1b fix: not allow to transfer excess materials against the job card
(cherry picked from commit 8167b24219)
2023-05-04 13:41:34 +00:00
rohitwaghchaure
c463df4fd1 Merge pull request #35166 from frappe/mergify/bp/version-14-hotfix/pr-35161
feat: configuration to notify reposting errors to specific role (backport #35161)
2023-05-04 18:46:05 +05:30
Rohit Waghchaure
33cd14f859 feat: configuration to notify reposting errors to specific role
(cherry picked from commit c7b62011db)
2023-05-04 12:06:35 +00:00
Rohit Waghchaure
f5f4902494 fix: internal transfer condition
(cherry picked from commit b5a2ccf21d)
2023-05-04 11:32:45 +00:00
Frappe PR Bot
144594b3e1 chore(release): Bumped to Version 14.23.2
## [14.23.2](https://github.com/frappe/erpnext/compare/v14.23.1...v14.23.2) (2023-05-04)

### Bug Fixes

* over production percentage not considered in validation ([4e83d0b](4e83d0baa6))
2023-05-04 04:54:00 +00:00
rohitwaghchaure
64b416b4dd Merge pull request #35152 from frappe/mergify/bp/version-14/pr-35149
fix: over production percentage not considered in validation (backport #35148) (backport #35149)
2023-05-04 10:22:33 +05:30
Rohit Waghchaure
4e83d0baa6 fix: over production percentage not considered in validation
(cherry picked from commit a84d0af81e)
(cherry picked from commit bf6e1b67a5)
2023-05-04 04:29:28 +00:00
rohitwaghchaure
a01e2ca9ac Merge pull request #35149 from frappe/mergify/bp/version-14-hotfix/pr-35148
fix: over production percentage not considered in validation (backport #35148)
2023-05-04 09:58:43 +05:30
Rohit Waghchaure
bf6e1b67a5 fix: over production percentage not considered in validation
(cherry picked from commit a84d0af81e)
2023-05-03 18:44:32 +00:00
rohitwaghchaure
148342a132 Merge pull request #35147 from frappe/mergify/bp/version-14-hotfix/pr-35144
feat: reserve qty against production plan raw materials in BIN (backport #35144)
2023-05-04 00:00:04 +05:30
Rohit Waghchaure
d1a91177e5 feat: reserve qty against production plan raw materials in BIN
(cherry picked from commit 06e91e758f)
2023-05-03 16:54:53 +00:00
Nabin Hait
8d6034de16 Merge pull request #34647 from frappe/mergify/bp/version-14-hotfix/pr-34627
fix: enabling lead even after "Opportunity" created against it (backport #34627)
2023-05-03 13:27:07 +05:30
Nabin Hait
d306bb080a Update patches.txt 2023-05-03 12:42:36 +05:30
Nabin Hait
eb3e6ff145 Update patches.txt 2023-05-03 12:21:23 +05:30
Nabin Hait
82c3d862ce Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34627 2023-05-03 11:21:48 +05:30
Frappe PR Bot
5eb5bf7102 chore(release): Bumped to Version 14.23.1
## [14.23.1](https://github.com/frappe/erpnext/compare/v14.23.0...v14.23.1) (2023-05-03)

### Bug Fixes

* conflicts ([3ba2b9e](3ba2b9ed2e))
* don't allow to make reposting for the closed period ([cca2fce](cca2fcec54))
* don't create material request from sales order against the delivered items ([a5489ee](a5489ee2ac))
* handle expected_value_after_useful_life properly in asset value adjustment ([#35117](https://github.com/frappe/erpnext/issues/35117)) ([80230fe](80230fec3e))
* handle finance book properly in trial balance and general ledger [v14] ([#35136](https://github.com/frappe/erpnext/issues/35136)) ([344c339](344c339484))
* Hyperlink in Quality Inspection Summary ([e4ce6fa](e4ce6fa195))
* incorrect paid_amount and exchange rate in PE ([f50b4d8](f50b4d80f1))
* linter issue ([78c34d7](78c34d71e2))
* linter issue ([453249d](453249d868))
* Naming series error in Journal Entry template ([#35084](https://github.com/frappe/erpnext/issues/35084)) ([7021e3a](7021e3adb1))
* not able to create delivery note from sales order ([28dfc13](28dfc13dc6))
* Report link, option, and added a link for Sales Person in GP ([fc611cf](fc611cf86b))
* test case ([35ec125](35ec125b34))
* test case ([6597c74](6597c74d6c))
* test case ([d844a2b](d844a2b990))
* timeout error while submitting delivery note ([e33fb3b](e33fb3b242))
* Updates in process statement of Accounts ([#35064](https://github.com/frappe/erpnext/issues/35064)) ([bef9dd7](bef9dd79e7))
2023-05-03 04:22:30 +00:00
Deepesh Garg
51d9d0a454 Merge pull request #35131 from frappe/version-14-hotfix
chore: release v14
2023-05-03 09:50:51 +05:30
Anand Baburajan
344c339484 fix: handle finance book properly in trial balance and general ledger [v14] (#35136)
fix: handle FBs properly in general ledger and trial balance
2023-05-03 07:11:01 +05:30
mergify[bot]
bef9dd79e7 fix: Updates in process statement of Accounts (#35064)
* fix: Updates in process statement of Accounts (#35064)

(cherry picked from commit ea0b03ae9e)

# Conflicts:
#	erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-05-02 23:06:52 +05:30
rohitwaghchaure
815696964a Merge pull request #35121 from frappe/mergify/bp/version-14-hotfix/pr-35118
fix: don't allow to make reposting for the closed period (backport #35118)
2023-05-02 18:02:23 +05:30
ruthra kumar
f0ae02e921 Merge pull request #35132 from frappe/mergify/bp/version-14-hotfix/pr-35107
fix: incorrect paid_amount and exchange rate in Payment Entry (backport #35107)
2023-05-02 15:43:08 +05:30
ruthra kumar
f50b4d80f1 fix: incorrect paid_amount and exchange rate in PE
If Company master has no default cash or bank account set but Party has
default company bank account set. In this case, paid_amount and
conversion rate are not calculated correctly

(cherry picked from commit 123355392b)
2023-05-02 09:39:03 +00:00
ruthra kumar
7ad795bec5 Merge pull request #35129 from frappe/mergify/bp/version-14-hotfix/pr-35091
refactor: button to toggle parent doc cost center preference for rounding adjustment amount (backport #35091)
2023-05-02 15:07:54 +05:30
ruthra kumar
662d9cb5aa Merge pull request #35128 from frappe/mergify/bp/version-14-hotfix/pr-35061
refactor: don't book exchange gain/loss for sales/purchase orders (backport #35061)
2023-05-02 15:07:09 +05:30
ruthra kumar
8ac718d98c refactor: checkbox to toggle parent doc cost center preference
(cherry picked from commit 4ccce93394)
2023-05-02 08:38:13 +00:00
ruthra kumar
3810b02023 refactor: checkbox in Sales Invoice
(cherry picked from commit 0f3b06cc8a)
2023-05-02 08:38:13 +00:00
ruthra kumar
25b37737a2 refactor: checkbox to toggle parent doc cost center preference
(cherry picked from commit ebe6787510)
2023-05-02 08:38:13 +00:00
ruthra kumar
0e39e5e868 refactor: checkbox in purchase invoice
(cherry picked from commit b44331c981)
2023-05-02 08:38:13 +00:00
ruthra kumar
fedde7fe3b test: Sales/Purchase Orders will not book Exchange gain/loss
(cherry picked from commit ce4e18c8d2)
2023-05-02 08:34:53 +00:00
ruthra kumar
551c96e1e5 refactor: don't book exch gain/loss for sales/purchase orders
(cherry picked from commit effb34bbfa)
2023-05-02 08:34:53 +00:00
rohitwaghchaure
78c34d71e2 fix: linter issue 2023-05-02 14:01:26 +05:30
rohitwaghchaure
453249d868 fix: linter issue 2023-05-02 11:08:06 +05:30
rohitwaghchaure
35ec125b34 fix: test case 2023-05-02 11:00:12 +05:30
rohitwaghchaure
2f3ed23a9d Merge pull request #35125 from frappe/mergify/bp/version-14-hotfix/pr-35123
fix: timeout error while submitting delivery note (backport #35123)
2023-05-02 00:00:46 +05:30
rohitwaghchaure
6597c74d6c fix: test case 2023-05-01 23:32:54 +05:30
Rohit Waghchaure
e33fb3b242 fix: timeout error while submitting delivery note
(cherry picked from commit 2d5ccc07b1)
2023-05-01 18:01:02 +00:00
rohitwaghchaure
d844a2b990 fix: test case 2023-05-01 20:49:17 +05:30
rohitwaghchaure
3ba2b9ed2e fix: conflicts 2023-05-01 20:47:12 +05:30
Rohit Waghchaure
cca2fcec54 fix: don't allow to make reposting for the closed period
(cherry picked from commit f751727149)

# Conflicts:
#	erpnext/accounts/doctype/period_closing_voucher/test_period_closing_voucher.py
2023-05-01 15:12:01 +00:00
Anand Baburajan
80230fec3e fix: handle expected_value_after_useful_life properly in asset value adjustment (#35117) 2023-05-01 19:53:39 +05:30
mergify[bot]
7021e3adb1 fix: Naming series error in Journal Entry template (#35084)
fix: Naming series error in Journal Entry template (#35084)

(cherry picked from commit f3b3dabb9a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-05-01 13:02:11 +05:30
rohitwaghchaure
69c0d81c55 Merge pull request #35093 from frappe/mergify/bp/version-14-hotfix/pr-35092
fix: not able to create delivery note from sales order (backport #35092)
2023-04-30 14:54:43 +05:30
Rohit Waghchaure
28dfc13dc6 fix: not able to create delivery note from sales order
(cherry picked from commit bdf2f7416a)
2023-04-28 10:33:23 +00:00
rohitwaghchaure
5f381cd520 Merge pull request #35070 from frappe/mergify/bp/version-14-hotfix/pr-35066
fix: don't create material request from sales order against delivered items (backport #35066)
2023-04-28 16:02:15 +05:30
Sagar Sharma
8571e6c5d2 Merge pull request #35088 from frappe/mergify/bp/version-14-hotfix/pr-35081
fix: Hyperlink in Quality Inspection Summary (backport #35081)
2023-04-28 12:53:45 +05:30
Nihantra Patel
e4ce6fa195 fix: Hyperlink in Quality Inspection Summary
(cherry picked from commit 72dd7884a8)
2023-04-28 07:19:15 +00:00
ruthra kumar
ef3d352a17 Merge pull request #35080 from frappe/mergify/bp/version-14-hotfix/pr-35077
fix: Report link, option, and added a link for Sales Person in GP (backport #35077)
2023-04-27 17:42:30 +05:30
Nihantra Patel
fc611cf86b fix: Report link, option, and added a link for Sales Person in GP
(cherry picked from commit 6dfca79af3)
2023-04-27 11:12:01 +00:00
Rohit Waghchaure
a5489ee2ac fix: don't create material request from sales order against the delivered items
(cherry picked from commit 1e2deee579)
2023-04-27 03:36:23 +00:00
Frappe PR Bot
85f3a5d318 chore(release): Bumped to Version 14.23.0
# [14.23.0](https://github.com/frappe/erpnext/compare/v14.22.3...v14.23.0) (2023-04-25)

### Bug Fixes

* `PermissionError` in Work Order ([a3568c1](a3568c1b27))
* Add company field to lower deduction certificate ([#34914](https://github.com/frappe/erpnext/issues/34914)) ([d732083](d732083166))
* add item-code filter for SCR supplied-items batch-no ([7c4f83e](7c4f83ed60))
* add limit for get_next_stock_reco ([#34937](https://github.com/frappe/erpnext/issues/34937)) ([7131ff2](7131ff28fd))
* added validation for extra job card ([a5fde5d](a5fde5d933))
* batch qty conversion factor issue fixed in pos transaction ([#34917](https://github.com/frappe/erpnext/issues/34917)) ([56ef0ba](56ef0baa9d))
* broken 'set exchange gain/loss' btn in payment entry ([#34940](https://github.com/frappe/erpnext/issues/34940)) ([00968ba](00968badf5))
* Bulk Payment Entry from PO/SO ([#34942](https://github.com/frappe/erpnext/issues/34942)) ([878d747](878d7477bc))
* click handler should not attempt indexed access of empty array ([#35013](https://github.com/frappe/erpnext/issues/35013)) ([06f204a](06f204a8d6))
* Common party JV cost center ([#35008](https://github.com/frappe/erpnext/issues/35008)) ([693007a](693007adfe))
* duplicate reposting entries of same voucher ([aeac43c](aeac43ccf9))
* FEC report for France accountancy  ([#34781](https://github.com/frappe/erpnext/issues/34781)) ([6aabab2](6aabab26d8))
* filtering via batch no ([#34951](https://github.com/frappe/erpnext/issues/34951)) ([3b23fc1](3b23fc1eba)), closes [#34950](https://github.com/frappe/erpnext/issues/34950)
* Incorrect difference value in Stock and Account Value Comparison report ([e7ca833](e7ca833929))
* incorrect OR condition causing timeout error ([c020789](c020789bfc))
* internal Purchase Receipt GL Entries ([f7e436f](f7e436fe71))
* item not showing in the BOM ([28cd79a](28cd79a040))
* pass reference_doctype in link queries (backport [#35038](https://github.com/frappe/erpnext/issues/35038)) ([#35039](https://github.com/frappe/erpnext/issues/35039)) ([5cc3978](5cc3978c16))
* Payment entry with TDS in bank reco statement ([#34961](https://github.com/frappe/erpnext/issues/34961)) ([f43ea0d](f43ea0d6ff))
* per_billed condition for Payment Entry ([#34969](https://github.com/frappe/erpnext/issues/34969)) ([f9f42c7](f9f42c7e98))
* process_loss_percentage in BOM ([4418862](4418862965))
* removed depends on for the Employee Detail section ([9d17d3f](9d17d3ff06))
* respect title_field from doctype to bulk transactions ([#34928](https://github.com/frappe/erpnext/issues/34928)) ([29aa4a0](29aa4a0222))
* set `frappe.flags.company` to call regional code accurately ([789dfd6](789dfd6774))
* simplify `erpnext.get_region` ([87595bd](87595bdb7e))
* SLA permissions (backport [#34981](https://github.com/frappe/erpnext/issues/34981)) ([#34986](https://github.com/frappe/erpnext/issues/34986)) ([83a1b83](83a1b836f9))
* stock entry type issue ([33a1608](33a16086ef))
* **test:** `test_backdated_stock_reco_cancellation_future_negative_stock` ([2ad157b](2ad157bd77))
* **test:** `test_internal_pr_gl_entries` ([7740ceb](7740ceb27e))
* Unable to allocate advance against invoice ([#35007](https://github.com/frappe/erpnext/issues/35007)) ([5045ad6](5045ad6be6))
* use `functools.wraps` to preserve doc signature ([2ec18eb](2ec18eb4cf))
* use CombineDatetime instead of Timestamp in QB queries ([55da91c](55da91cb34))
* use filter_by_finance_book instead of only_depreciable_assets in fixed asset register (backport [#35031](https://github.com/frappe/erpnext/issues/35031)) ([#35035](https://github.com/frappe/erpnext/issues/35035)) ([5630e81](5630e8189b))
* Use set instead of db_set as it is called from validate ([#34967](https://github.com/frappe/erpnext/issues/34967)) ([6650212](665021270f))
* v14, Bank Reconcile Tools not cover case JV debit bank ([#35000](https://github.com/frappe/erpnext/issues/35000)) ([82d8379](82d8379188))
* validation for internal transfer entry ([a582354](a5823547d3))
* value of depreciable assets not updating after manual depr entry [v14] ([#35010](https://github.com/frappe/erpnext/issues/35010)) ([3c75e55](3c75e55cb9))
* wrong qty of remaining work orders to be created when using "Create" > "Work Order" ([#34726](https://github.com/frappe/erpnext/issues/34726)) ([47df41f](47df41fdbd))

### Features

* Reconcile Payments in background ([#34596](https://github.com/frappe/erpnext/issues/34596)) ([5923a80](5923a80a0f))

### Performance Improvements

* Journal Entries (backport [#34918](https://github.com/frappe/erpnext/issues/34918)) ([#35054](https://github.com/frappe/erpnext/issues/35054)) ([39b5147](39b5147768))

### Reverts

* Revert "fix: Rate from LDC in TDS reports (#33699)" ([f44a79f](f44a79fa73)), closes [#33699](https://github.com/frappe/erpnext/issues/33699)
2023-04-25 17:00:40 +00:00
Deepesh Garg
b1473c9932 Merge pull request #35034 from frappe/version-14-hotfix
chore: release v14
2023-04-25 22:28:48 +05:30
mergify[bot]
82d8379188 fix: v14, Bank Reconcile Tools not cover case JV debit bank (#35000)
fix: v14, Bank Reconcile Tools not cover case JV debit bank (#35000)

(cherry picked from commit c36dc3dc57)

Co-authored-by: Kitti U. @ Ecosoft <kittiu@gmail.com>
2023-04-25 21:58:27 +05:30
mergify[bot]
39b5147768 perf: Journal Entries (backport #34918) (#35054)
* refactor: rewrite `get_stock_value_on()` queries in `QB`

(cherry picked from commit e43bc38e05)

* refactor: sum up SLE value in query

(cherry picked from commit 9a37ac6c25)

* refactor: `get_stock_value_on()` to get stock value of multiple warehouses at once

(cherry picked from commit e782a054c8)

---------

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-04-25 21:53:07 +05:30
mergify[bot]
d732083166 fix: Add company field to lower deduction certificate (#34914)
* fix: Add company field to lower deduction certificate (#34914)

(cherry picked from commit b545e3def0)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-25 21:33:43 +05:30
mergify[bot]
693007adfe fix: Common party JV cost center (#35008)
fix: Common party JV cost center (#35008)

(cherry picked from commit f88431a79a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-25 21:16:59 +05:30
mergify[bot]
f43ea0d6ff fix: Payment entry with TDS in bank reco statement (#34961)
fix: Payment entry with TDS in bank reco statement (#34961)

(cherry picked from commit ecea9b44a3)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-25 21:13:20 +05:30
mergify[bot]
f9f42c7e98 fix: per_billed condition for Payment Entry (#34969)
fix: per_billed condition for Payment Entry (#34969)

(cherry picked from commit d6bc8bba8b)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-04-25 21:12:58 +05:30
mergify[bot]
06f204a8d6 fix: click handler should not attempt indexed access of empty array (#35013)
fix: click handler should not attempt indexed access of empty array (#35013)

fix: click handler should not attempt indexed access
of empty array

(cherry picked from commit 3d90b970d1)

Co-authored-by: tundebabzy <tundebabzy@gmail.com>
2023-04-25 21:11:08 +05:30
mergify[bot]
47df41fdbd fix: wrong qty of remaining work orders to be created when using "Create" > "Work Order" (#34726)
fix: wrong qty of remaining work orders to be created when using "Create" > "Work Order" (#34726)

* fix: convert asynchronous field update to synchronous

* fix: wrong qty of remaining work orders to be created when using "Create" > "Work Order"

(cherry picked from commit 189b020d22)

Co-authored-by: danjeremynavarro <46537526+danjeremynavarro@users.noreply.github.com>
2023-04-25 20:08:01 +05:30
mergify[bot]
878d7477bc fix: Bulk Payment Entry from PO/SO (#34942)
fix: Bulk Payment Entry from PO/SO (#34942)

Co-authored-by: Nihantra Patel <n.patel.serpentcs@gmail.com>
(cherry picked from commit f1acc5fabb)

Co-authored-by: Solufy Solution <34390782+Solufyin@users.noreply.github.com>
2023-04-25 20:05:34 +05:30
mergify[bot]
29aa4a0222 fix: respect title_field from doctype to bulk transactions (#34928)
fix: respect title_field from doctype to bulk transactions (#34928)

(cherry picked from commit 22290c2694)

Co-authored-by: HarryPaulo <paulo_fabris@hotmail.com>
2023-04-25 20:05:13 +05:30
mergify[bot]
5045ad6be6 fix: Unable to allocate advance against invoice (#35007)
fix: Unable to allocate advance against invoice (#35007)

(cherry picked from commit f7b50f2ade)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-25 20:04:47 +05:30
mergify[bot]
665021270f fix: Use set instead of db_set as it is called from validate (#34967)
fix: Use set instead of db_set as it is called from validate (#34967)

(cherry picked from commit 72b5c1f70a)

Co-authored-by: Nabin Hait <nabinhait@gmail.com>
2023-04-25 20:04:28 +05:30
mergify[bot]
5923a80a0f feat: Reconcile Payments in background (#34596)
feat: Reconcile Payments in background (#34596)

* feat: auto reconcile in background

* chore: Option to enable auto reconciliation in settings

* refactor: validate if feature is enabled in settings

* refactor: check for running job while using reconciliation tool

* chore: using doc to get filter values

* chore: use frappe.db.get_value in validations

* chore: cleanup commented out code

* chore: replace get_list with get_all

* chore: use block scope variable

* chore: type information for functions

* refactor: flag to ignore job validation check

* refactor: update parent doc status if all reconciled

* chore: create test_records file

* test: create a bunch of vouchers for testing auto reconcile

* chore: renamed auto_reconcile to process_payment_reconciliation

* chore: another child doctype to hold payments

* chore: remove duplicate field

* chore: add fetched payments to log

* chore: Popup comment message update

* chore: replace get_all with get_value

* chore: replace label in settings page

* chore: remove unit test and records

* refactor: status in reconciliation log

* refactor: set status in log as well

* chore: fix field name

* chore: change triggered job name

* chore: use status field in list view of log

* chore: status while there are no allocations

* refactor: split trigger function into two

* chore: adding cancelled status

* refactor: function trigger queued docs

* chore: cron job scheduled

* chore: fixing accouts settings json file

* chore: typos and variable scope

* chore: use 'pluck' in db call

* chore: remove redundant whitelist decorator

* chore: use single DB call to fetch values

* chore: replace get_all with get_value

* refactor: use raw db calls to fetch reconciliation log records

Using get_doc on `Process Payment Reconciliation Log` is costly when
handling large volumes of invoices.

Use raw frappe.db.get_all to selectively pull status and reconciled count

* chore: update status on successful batch operation

* chore: make payment table readonly

* chore: ability to pause the background job

* chore: remove isolate_each_allocation

* chore: more description in progress bar

* refactor: partially working state

* refactor: update reconcile flag and setting hard limits for fetching

* chore: make allocation editable -- NEED TO REVERT

* chore: pause button

* refactor: skip setter function in Payment Entry for better performan

* refactor: split reconcile function and skip a setter function

1. Split reconcile function into 2
2. While reconciling against payment entry, skip a
set_missing_ref_details setter method

* chore: increase payment limit

* refactor: replace frappe.db.get_all with frappe.db.get_value

* chore: remove unwanted doctypes

* refactor: make allocation table readonly

* perf: update ref_details only for newly linked invoices

* chore: rename skip flag

* refactor(UI): receivable_payable field should auto populate

* refactor: no control statements in finally block

* chore: cleanup section and rename checkbox

* chore: update new fieldname in code

* chore: update error msg

* refactor: start and pause integrated into status

pause checkbox has been removed

* refactor: added cancelled status to the log doctype

1. Moved the status section to the bottom in parent doc
2. Using alerts to indicate Job trigger status

(cherry picked from commit ed14d1ce44)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-04-25 19:20:06 +05:30
mergify[bot]
5cc3978c16 fix: pass reference_doctype in link queries (backport #35038) (#35039)
fix: pass reference_doctype in link queries (#35038)

(cherry picked from commit 6de71eb158)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-04-25 18:42:32 +05:30
mergify[bot]
5630e8189b fix: use filter_by_finance_book instead of only_depreciable_assets in fixed asset register (backport #35031) (#35035)
fix: use filter_by_finance_book instead of only_depreciable_assets in fixed asset register (#35031)

fix: use filter_by_finance_book instead of only_depreciable_assets
(cherry picked from commit e08d636bf7)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-04-25 15:53:10 +05:30
rohitwaghchaure
d121282439 Merge pull request #35016 from frappe/mergify/bp/version-14-hotfix/pr-35012
fix: item not showing in the BOM (backport #35012)
2023-04-25 14:49:35 +05:30
Anand Baburajan
3c75e55cb9 fix: value of depreciable assets not updating after manual depr entry [v14] (#35010)
* fix: update value of asset with calc_depr on after manual depr entry

* fix: value of asset with calc_depr on after manual depr entry not reflecting in asset_depr_and_bal report

* chore: add validation for depr journal entry

* test: manual_depr_for_depreciable_asset and manual_depr_w_incorrect_jv_voucher_type

* chore: unlink depreciable asset from manual depr entry
2023-04-25 12:44:58 +05:30
rohitwaghchaure
aa22cccf99 Merge pull request #35028 from frappe/mergify/bp/version-14-hotfix/pr-35026
Revert "fix: Incorrect difference value in Stock and Account Value Comparison…" (backport #35026)
2023-04-25 12:10:03 +05:30
rohitwaghchaure
7d9c9884dc Revert "fix: Incorrect difference value in Stock and Account Value Comparison…"
(cherry picked from commit 7a63fbef4f)
2023-04-25 06:39:36 +00:00
ruthra kumar
e03eaa31fe Merge pull request #35023 from frappe/mergify/bp/version-14-hotfix/pr-34974
Revert "fix: Rate from LDC in TDS reports" (backport #34974)
2023-04-25 12:04:50 +05:30
ruthra kumar
f44a79fa73 Revert "fix: Rate from LDC in TDS reports (#33699)"
This reverts commit db9beb3cdd.

(cherry picked from commit cb7a99cbaa)
2023-04-25 05:47:51 +00:00
Frappe PR Bot
943acbfea8 chore(release): Bumped to Version 14.22.3
## [14.22.3](https://github.com/frappe/erpnext/compare/v14.22.2...v14.22.3) (2023-04-24)

### Bug Fixes

* incorrect OR condition causing timeout error ([d5910fb](d5910fba44))
2023-04-24 12:41:30 +00:00
rohitwaghchaure
e955eeeabc Merge pull request #35018 from frappe/mergify/bp/version-14/pr-35017
fix: incorrect OR condition causing timeout error (For more than 50 line items) (backport #35015) (backport #35017)
2023-04-24 18:09:45 +05:30
Rohit Waghchaure
d5910fba44 fix: incorrect OR condition causing timeout error
(cherry picked from commit 379b215aea)
(cherry picked from commit c020789bfc)
2023-04-24 12:39:21 +00:00
rohitwaghchaure
c8622fb46f Merge pull request #35017 from frappe/mergify/bp/version-14-hotfix/pr-35015
fix: incorrect OR condition causing timeout error (For more than 50 line items) (backport #35015)
2023-04-24 18:08:34 +05:30
Rohit Waghchaure
c020789bfc fix: incorrect OR condition causing timeout error
(cherry picked from commit 379b215aea)
2023-04-24 12:37:50 +00:00
Rohit Waghchaure
28cd79a040 fix: item not showing in the BOM
(cherry picked from commit 02c3b41dc2)
2023-04-24 12:37:26 +00:00
mergify[bot]
70014028e9 chore: ERPNext setup wizard cleanup (#33675)
chore: ERPNext setup wizard cleanup (#33675)

* chore: ERPNext setup wizard cleanup

* chore: Remove default website

* chore: Remove flaky tests

* chore: remove unwanted tests

(cherry picked from commit 3598bcc9a8)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-24 15:28:41 +05:30
rohitwaghchaure
79cbe1cce8 Merge pull request #34995 from frappe/mergify/bp/version-14-hotfix/pr-34994
fix: duplicate reposting entries of same voucher (backport #34994)
2023-04-22 14:55:50 +05:30
Rohit Waghchaure
aeac43ccf9 fix: duplicate reposting entries of same voucher
(cherry picked from commit f2253dd645)
2023-04-22 08:38:53 +00:00
rohitwaghchaure
a5e6b371ac Merge pull request #34987 from frappe/mergify/bp/version-14-hotfix/pr-34982
fix: added validation for extra job cards (backport #34982)
2023-04-22 08:40:42 +05:30
mergify[bot]
83a1b836f9 fix: SLA permissions (backport #34981) (#34986)
fix: SLA permissions (#34981)

(cherry picked from commit ac871797b2)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-04-21 21:13:38 +05:30
rohitwaghchaure
6e03c09017 Merge pull request #34983 from frappe/mergify/bp/version-14-hotfix/pr-34980
fix: validation for internal transfer entry (backport #34980)
2023-04-21 18:53:41 +05:30
Rohit Waghchaure
a5fde5d933 fix: added validation for extra job card
(cherry picked from commit 6a0b7c9e8c)
2023-04-21 13:21:27 +00:00
Rohit Waghchaure
a5823547d3 fix: validation for internal transfer entry
(cherry picked from commit 19911b48fd)
2023-04-21 12:16:43 +00:00
mergify[bot]
00968badf5 fix: broken 'set exchange gain/loss' btn in payment entry (#34940)
fix: broken set exchagne gain/loss btn broken in payment entry

(cherry picked from commit df0682fa8c)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-04-21 14:26:10 +05:30
mergify[bot]
6aabab26d8 fix: FEC report for France accountancy (#34781)
fix: FEC report for France accountancy  (#34781)

* fix: FEC report for France Accountancy legal requirement

* fix: FEC report for France Accountancy legal requirement

* fix: change to query standard

* fix: change to query standard

* fix: columns to standard dict

* fix: columns to standard dict

* fix: columns to data

* refactor: french report FEC

* refactor: french report FEC (2)

---------

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
(cherry picked from commit af8da53cf4)

Co-authored-by: HENRY Florian <florian.henry@open-concept.pro>
2023-04-21 14:23:18 +05:30
mergify[bot]
de86e8fb95 chore: Move source and campaign to more info section (#34946)
chore: Move source and campaign to more info section (#34946)

(cherry picked from commit a02705ded7)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-21 14:22:42 +05:30
ruthra kumar
e5048812fd Merge pull request #34943 from frappe/mergify/bp/version-14-hotfix/pr-34922
refactor: refactor set_missing_values and set_missing_ref_details in Payment Entry (backport #34922)
2023-04-21 09:41:28 +05:30
rohitwaghchaure
237bd6e831 Merge pull request #34964 from frappe/mergify/bp/version-14-hotfix/pr-34960
fix: stock entry type issue (backport #34960)
2023-04-20 23:41:46 +05:30
rohitwaghchaure
c2953bc3e0 Merge pull request #34965 from frappe/mergify/bp/version-14-hotfix/pr-34958
fix: removed depends on for the Employee Detail section (backport #34958)
2023-04-20 23:41:06 +05:30
Rohit Waghchaure
9d17d3ff06 fix: removed depends on for the Employee Detail section
(cherry picked from commit a90a5b4aa4)
2023-04-20 12:34:34 +00:00
Rohit Waghchaure
33a16086ef fix: stock entry type issue
(cherry picked from commit c3b5dcb767)
2023-04-20 12:34:11 +00:00
Sagar Vora
6e0d22c23b Merge pull request #34962 from frappe/mergify/bp/version-14-hotfix/pr-34738
fix: misc regional improvements (backport #34738)
2023-04-20 05:20:19 -07:00
Sagar Vora
2ec18eb4cf fix: use functools.wraps to preserve doc signature
(cherry picked from commit 776b56ccd1)
2023-04-20 12:18:21 +00:00
Sagar Vora
87595bdb7e fix: simplify erpnext.get_region
(cherry picked from commit 2fa641f86d)
2023-04-20 12:18:21 +00:00
Sagar Vora
789dfd6774 fix: set frappe.flags.company to call regional code accurately
(cherry picked from commit 17ef3c964f)
2023-04-20 12:18:20 +00:00
mergify[bot]
56ef0baa9d fix: batch qty conversion factor issue fixed in pos transaction (#34917)
fix: batch qty conversion factor issue fixed in pos transaction (#34917)

(cherry picked from commit 59f3fedbf7)

Co-authored-by: Vishal Dhayagude <vishdha@users.noreply.github.com>
Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
2023-04-20 17:23:23 +05:30
Sagar Sharma
11e4fcb058 Merge pull request #34956 from frappe/mergify/bp/version-14-hotfix/pr-34953
fix: `PermissionError` in Work Order (backport #34953)
2023-04-20 16:01:47 +05:30
s-aga-r
a3568c1b27 fix: PermissionError in Work Order
(cherry picked from commit 8108b2de0a)
2023-04-20 10:28:04 +00:00
rohitwaghchaure
2a48a7b427 Merge pull request #34955 from frappe/mergify/bp/version-14-hotfix/pr-34954
fix: process_loss_percentage in BOM (backport #34954)
2023-04-20 15:02:05 +05:30
Nihantra Patel
4418862965 fix: process_loss_percentage in BOM
(cherry picked from commit b572bef71d)
2023-04-20 09:31:46 +00:00
rohitwaghchaure
e5aae90078 Merge pull request #34944 from frappe/mergify/bp/version-14-hotfix/pr-34912
fix: internal Purchase Receipt GL Entries (backport #34912)
2023-04-20 14:36:56 +05:30
Sagar Sharma
e2818afb62 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34912 2023-04-20 14:05:48 +05:30
s-aga-r
7740ceb27e fix(test): test_internal_pr_gl_entries 2023-04-20 14:05:08 +05:30
ruthra kumar
3d3da75726 refactor: update ref details for selected references
set_missing_ref_details can update only for selected references

(cherry picked from commit b7d6e30f63)
2023-04-20 13:29:51 +05:30
ruthra kumar
8c5d644671 refactor: move set_missing_ref_detials out of set_missing_values
(cherry picked from commit 11cb2db3fe)
2023-04-20 13:29:47 +05:30
Frappe PR Bot
ca9b02fb53 chore(release): Bumped to Version 14.22.2
## [14.22.2](https://github.com/frappe/erpnext/compare/v14.22.1...v14.22.2) (2023-04-20)

### Bug Fixes

* filtering via batch no ([#34951](https://github.com/frappe/erpnext/issues/34951)) ([1b827e6](1b827e6b67)), closes [#34950](https://github.com/frappe/erpnext/issues/34950)
2023-04-20 07:24:45 +00:00
Deepesh Garg
74abe94711 Merge pull request #34952 from frappe/mergify/bp/version-14/pr-34951
fix: filtering via batch no (backport #34951)
2023-04-20 12:53:14 +05:30
mergify[bot]
1b827e6b67 fix: filtering via batch no (#34951)
fix: filtering via batch no(#34950)

* fix: filtering via batch no

(cherry picked from commit ea6eeace80)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 3b23fc1eba)
2023-04-20 07:21:04 +00:00
mergify[bot]
3b23fc1eba fix: filtering via batch no (#34951)
fix: filtering via batch no(#34950)

* fix: filtering via batch no

(cherry picked from commit ea6eeace80)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-20 12:50:40 +05:30
Sagar Sharma
1743413e00 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34912 2023-04-20 12:19:43 +05:30
Sagar Sharma
c11b98fa9f Merge pull request #34926 from frappe/mergify/bp/version-14-hotfix/pr-34895
fix: use `CombineDatetime` instead of `Timestamp` in QB queries (backport #34895)
2023-04-20 12:17:32 +05:30
Sagar Sharma
a2c25ed49e Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34895 2023-04-20 12:17:12 +05:30
s-aga-r
2ad157bd77 fix(test): test_backdated_stock_reco_cancellation_future_negative_stock
(cherry picked from commit 11c8503180)
2023-04-20 06:06:05 +00:00
s-aga-r
7cc0129302 test: add test case for internal PR GL Entries
(cherry picked from commit c86c543fbf)
2023-04-20 06:06:05 +00:00
s-aga-r
f7e436fe71 fix: internal Purchase Receipt GL Entries
(cherry picked from commit 6fca9adcd4)
2023-04-20 06:06:05 +00:00
ruthra kumar
1ab83c5c02 Merge pull request #34916 from frappe/mergify/bp/version-14-hotfix/pr-34838
refactor: toggle merging similar ledger entries in JE (backport #34838)
2023-04-20 11:15:36 +05:30
Frappe PR Bot
6faf459f97 chore(release): Bumped to Version 14.22.1
## [14.22.1](https://github.com/frappe/erpnext/compare/v14.22.0...v14.22.1) (2023-04-20)

### Bug Fixes

* add limit for get_next_stock_reco ([#34937](https://github.com/frappe/erpnext/issues/34937)) ([78ad0ea](78ad0eaa74))
2023-04-20 05:12:57 +00:00
Deepesh Garg
40058c2617 Merge pull request #34939 from frappe/mergify/bp/version-14/pr-34938
fix: add limit for get_next_stock_reco (#34937)
2023-04-20 10:41:31 +05:30
mergify[bot]
78ad0eaa74 fix: add limit for get_next_stock_reco (#34937)
fix: limit stock reco issue

(cherry picked from commit fcfa8842a7)

Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
(cherry picked from commit 7131ff28fd)
2023-04-20 05:08:45 +00:00
mergify[bot]
7131ff28fd fix: add limit for get_next_stock_reco (#34937)
fix: limit stock reco issue

(cherry picked from commit fcfa8842a7)

Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
2023-04-20 10:37:58 +05:30
Sagar Sharma
33d89b4a8b Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34895 2023-04-20 10:05:58 +05:30
rohitwaghchaure
fef381e8eb Merge pull request #34930 from frappe/mergify/bp/version-14-hotfix/pr-34929
fix: Incorrect difference value in Stock and Account Value Comparison… (backport #34929)
2023-04-19 23:58:34 +05:30
Sagar Sharma
9e148b4277 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34895 2023-04-19 21:21:52 +05:30
Rohit Waghchaure
e7ca833929 fix: Incorrect difference value in Stock and Account Value Comparison report
(cherry picked from commit a77182645f)
2023-04-19 15:38:16 +00:00
Sagar Sharma
322102e56b Merge pull request #34927 from frappe/mergify/bp/version-14-hotfix/pr-34901
fix: add item-code filter for SCR supplied-items batch-no (backport #34901)
2023-04-19 19:26:39 +05:30
s-aga-r
7c4f83ed60 fix: add item-code filter for SCR supplied-items batch-no
(cherry picked from commit e91abbfbe3)
2023-04-19 13:54:00 +00:00
s-aga-r
55da91cb34 fix: use CombineDatetime instead of Timestamp in QB queries
(cherry picked from commit 91a398a191)
2023-04-19 13:50:30 +00:00
ruthra kumar
9f090d2861 chore(patch): by default ledger entries of JE's will not be merged
(cherry picked from commit 3f537d30bd)
2023-04-19 09:59:36 +05:30
ruthra kumar
93bc1c5382 refactor: checkbox to toggle merging of JE account heads
(cherry picked from commit a3e3fe149d)
2023-04-19 04:19:31 +00:00
Frappe PR Bot
b12bd5f558 chore(release): Bumped to Version 14.22.0
# [14.22.0](https://github.com/frappe/erpnext/compare/v14.21.0...v14.22.0) (2023-04-19)

### Bug Fixes

* Add offers info to website item ([#34873](https://github.com/frappe/erpnext/issues/34873)) ([f1a1fc6](f1a1fc6c5b))
* Advance payment against payment terms ([#34872](https://github.com/frappe/erpnext/issues/34872)) ([7461239](7461239218))
* change discuss forum url ([#34891](https://github.com/frappe/erpnext/issues/34891)) ([8f26d62](8f26d62b35))
* don't show disabled warehouses in the Warehouse Wise Stock Balance report ([461780d](461780da22))
* Don't use stale item details ([#34847](https://github.com/frappe/erpnext/issues/34847)) ([c11aeba](c11aebaaae))
* for Tree Type item and item group show net amount ([#31776](https://github.com/frappe/erpnext/issues/31776)) ([7c8194a](7c8194a1a8))
* linters issues ([c53dc06](c53dc06f80))
* Remove unnecessary checkbox from Accounts doctype ([#34821](https://github.com/frappe/erpnext/issues/34821)) ([0cf6144](0cf6144b3f))
* selling workspace is not migrating properly ([79fd38c](79fd38cf3f))
* stock reco test case ([2f356dc](2f356dcc6c))
* too many writes error while making backdated stock reconciliation ([a981b79](a981b79865))
* unable to change `company` for manual `Serial No` entry ([2e7043c](2e7043ca90))
* **ux:** don't throw error when company defaults aren't set ([#34825](https://github.com/frappe/erpnext/issues/34825)) ([15f5e8d](15f5e8d4ff))
* whitelist doc method ([09b92fd](09b92fd78c))

### Features

* add german sales tax template ([#34823](https://github.com/frappe/erpnext/issues/34823)) ([3738ea5](3738ea5794))
2023-04-19 01:36:11 +00:00
Deepesh Garg
be8a22d33b Merge pull request #34905 from frappe/version-14-hotfix
chore: release v14
2023-04-19 07:04:25 +05:30
Sagar Sharma
757c168a8d Merge pull request #34903 from frappe/mergify/bp/version-14-hotfix/pr-34860
fix: add items field label (backport #34860)
2023-04-18 14:22:47 +05:30
s-aga-r
b0b00dc869 chore: add items field label
(cherry picked from commit c9418aab45)
2023-04-18 07:35:01 +00:00
Ankush Menat
09b92fd78c fix: whitelist doc method
This should've been whitelisted, looks like it was missed out

closes https://github.com/frappe/erpnext/issues/34898

(cherry picked from commit e4f152a416)
2023-04-18 08:25:26 +05:30
mergify[bot]
f1a1fc6c5b fix: Add offers info to website item (#34873)
fix: Add offers info to website item (#34873)

* fix: Add offers info to website item

* Revert "fix: Add offers info to website item"

This reverts commit 88b598edb6.

* fix: Add offer properties to website item

(cherry picked from commit 534ea5ad21)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-18 07:43:17 +05:30
mergify[bot]
8f26d62b35 fix: change discuss forum url (#34891)
fix: change discuss forum url (#34891)

[skip ci]

(cherry picked from commit dd93ea067e)

Co-authored-by: MohsinAli <mmatiyailol@gmail.com>
2023-04-18 07:42:45 +05:30
rohitwaghchaure
8e9d72bd2e Merge pull request #34887 from frappe/mergify/bp/version-14-hotfix/pr-34886
fix: stock reconciliation test case (backport #34886)
2023-04-17 16:02:15 +05:30
mergify[bot]
7461239218 fix: Advance payment against payment terms (#34872)
* fix: Advance payment against payment terms (#34872)

(cherry picked from commit 5c75894065)

# Conflicts:
#	erpnext/accounts/doctype/payment_entry/payment_entry.py

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-17 15:54:54 +05:30
Rohit Waghchaure
2f356dcc6c fix: stock reco test case
(cherry picked from commit 6bccd8644e)
2023-04-17 09:52:59 +00:00
rohitwaghchaure
4640febc83 Merge pull request #34884 from frappe/mergify/bp/version-14-hotfix/pr-34851
fix: too many writes error while making backdated stock reconciliation (backport #34851)
2023-04-17 13:48:25 +05:30
Rohit Waghchaure
c53dc06f80 fix: linters issues
(cherry picked from commit d9dd64b4d2)
2023-04-17 07:13:00 +00:00
Rohit Waghchaure
a981b79865 fix: too many writes error while making backdated stock reconciliation
(cherry picked from commit 7bfc8f1236)
2023-04-17 07:13:00 +00:00
rohitwaghchaure
050339c88e Merge pull request #34883 from frappe/mergify/bp/version-14-hotfix/pr-34882
fix: don't show disabled warehouses in the Warehouse Wise Stock Balance report (backport #34882)
2023-04-17 12:41:25 +05:30
Rohit Waghchaure
461780da22 fix: don't show disabled warehouses in the Warehouse Wise Stock Balance report
(cherry picked from commit 9ceb1f6bda)
2023-04-17 06:31:44 +00:00
Shariq Ansari
e8db543028 Merge pull request #34877 from frappe/mergify/bp/version-14-hotfix/pr-34876
fix: selling workspace is not migrating properly (backport #34876)
2023-04-16 14:30:23 +05:30
Shariq Ansari
79fd38cf3f fix: selling workspace is not migrating properly
(cherry picked from commit 5a4dd354c1)
2023-04-16 08:57:11 +00:00
Sagar Sharma
dfb1e105bd Merge pull request #34868 from frappe/mergify/bp/version-14-hotfix/pr-34858
fix: unable to change `company` for manual `Serial No` entry (backport #34858)
2023-04-15 12:45:29 +05:30
s-aga-r
2e7043ca90 fix: unable to change company for manual Serial No entry
(cherry picked from commit fb3271c624)
2023-04-15 06:41:00 +00:00
mergify[bot]
7c8194a1a8 fix: for Tree Type item and item group show net amount (#31776)
fix: for Tree Type item and item group show net amout

(cherry picked from commit 91762097a5)

Co-authored-by: hrzzz <paulo_fabris@hotmail.com>
2023-04-14 16:42:37 +05:30
mergify[bot]
15f5e8d4ff fix(ux): don't throw error when company defaults aren't set (#34825)
fix(ux): don't throw error when company defaults aren't set (#34825)

* fix(ux): don't throw error when company defaults aren't set; instead prompt account input.

* fix: translate label and title

(cherry picked from commit 51c4338661)

Co-authored-by: Devin Slauenwhite <devin.slauenwhite@gmail.com>
2023-04-14 16:42:12 +05:30
mergify[bot]
3738ea5794 feat: add german sales tax template (#34823)
feat: add german sales tax template (#34823)

Nullsteuersatz nach § 12 Abs. 3 UStG

(cherry picked from commit 59f6b773cd)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-04-14 14:52:02 +05:30
mergify[bot]
c11aebaaae fix: Don't use stale item details (#34847)
fix: Don't use stale item details (#34847)

(cherry picked from commit a7051cb9b5)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-14 11:26:33 +05:30
mergify[bot]
0cf6144b3f fix: Remove unnecessary checkbox from Accounts doctype (#34821)
fix: Remove unnecessary checkbox from Accounts doctype (#34821)

(cherry picked from commit 66130493eb)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-14 11:26:14 +05:30
mergify[bot]
41a7d3fd60 chore: update CODEOWNERS (#34817)
* chore: update CODEOWNERS

[skip ci]

(cherry picked from commit aa8b241d5a)

# Conflicts:
#	CODEOWNERS

* fix: conflicts

---------

Co-authored-by: Saqib Ansari <nextchamp.saqib@gmail.com>
2023-04-12 07:39:07 +05:30
Frappe PR Bot
2b0b24f7c3 chore(release): Bumped to Version 14.21.0
# [14.21.0](https://github.com/frappe/erpnext/compare/v14.20.3...v14.21.0) (2023-04-11)

### Bug Fixes

* `payment entry is already created` on posawesome. (backport [#34712](https://github.com/frappe/erpnext/issues/34712)) ([#34752](https://github.com/frappe/erpnext/issues/34752)) ([8ba1e0f](8ba1e0f31e))
* add german translation of "Partly Paid" ([#34776](https://github.com/frappe/erpnext/issues/34776)) ([3023dbb](3023dbbe95))
* Allocate tax loss to tax account head on early payment discount ([#34287](https://github.com/frappe/erpnext/issues/34287)) ([be2990e](be2990ec88))
* asset monthly WDV and DD schedule [v14] ([#34644](https://github.com/frappe/erpnext/issues/34644)) ([88c8c36](88c8c36805))
* Bank clearance for case loan (disburstment/repayment) ([#34586](https://github.com/frappe/erpnext/issues/34586)) ([f1687cf](f1687cfb14))
* BOM Update Cost, when no actual qty ([8757435](8757435898))
* bom update log not working for large batch size ([551190a](551190af30))
* Column value mismatch in COA blank template ([#34658](https://github.com/frappe/erpnext/issues/34658)) ([5e03a4e](5e03a4e9e2))
* consider qty field precision ([2c54e76](2c54e763e4))
* customer selection not mandatory in purchase invoice to fetch item details ([#34810](https://github.com/frappe/erpnext/issues/34810)) ([994272b](994272b966))
* don't include cancelled JVs in assdeprledger report ([3896d41](3896d41e95))
* enclose ternary operator in parentheses ([b835760](b835760b0b))
* incorrect arg name in asset value adjustment ([8d9305e](8d9305ee5f))
* incorrect balance qty in the stock ledger report ([3494c9c](3494c9ccb6))
* incorrect stock balance quantity for batch item ([d817c50](d817c50581))
* Item tax validity comparison fixes ([#34784](https://github.com/frappe/erpnext/issues/34784)) ([cc21241](cc21241887))
* lost opportunity report issue ([#34626](https://github.com/frappe/erpnext/issues/34626)) ([3e67994](3e67994cc7))
* Multiple issues in purchase invoice submission ([#34600](https://github.com/frappe/erpnext/issues/34600)) ([5677f25](5677f25215))
* plaid log_error syntax issue (backport [#34642](https://github.com/frappe/erpnext/issues/34642)) ([#34667](https://github.com/frappe/erpnext/issues/34667)) ([61858a6](61858a60c2))
* posting time issue ([bb5eeb6](bb5eeb6bd6))
* provide filter by depreciable assets in fixed asset register ([#34803](https://github.com/frappe/erpnext/issues/34803)) ([fee4cd5](fee4cd5f40))
* reposting record not created for backdated stock reco ([9b90323](9b90323d53))
* serial no with zero quantity issue in stock reco ([f47be46](f47be46717))
* Shop by category fixes (backport [#34688](https://github.com/frappe/erpnext/issues/34688)) ([#34750](https://github.com/frappe/erpnext/issues/34750)) ([3ad5d67](3ad5d676ab))
* Subcontracting Receipt incorrect `status` ([99226d3](99226d3811))
* Supplier RFQ email link ([#34338](https://github.com/frappe/erpnext/issues/34338)) ([a00459a](a00459aec3))
* Total debit and credit while importing via Data Import ([#34659](https://github.com/frappe/erpnext/issues/34659)) ([5e28d02](5e28d0234e))
* **ui:** recalculate difference amount on allocation change ([#34694](https://github.com/frappe/erpnext/issues/34694)) ([6b866e2](6b866e24f6))
* Unable to create payment request against purchase invoice ([#34762](https://github.com/frappe/erpnext/issues/34762)) ([a1f7e35](a1f7e35914))
* use stock qty to calculate POS reserved stock ([c0f7f7d](c0f7f7da42))
* UX for stock entry, bom and work order ([d4a6035](d4a6035c83))

### Features

* add `Received Qty` field in `Delivery Note Item` ([1c5e36c](1c5e36c7b6))
* Auto allocate advance payments only against orders ([#34727](https://github.com/frappe/erpnext/issues/34727)) ([05d24e3](05d24e3665))

### Reverts

* remove frappe.send_message (v14) ([#34816](https://github.com/frappe/erpnext/issues/34816)) ([8a331e0](8a331e0f26))
2023-04-11 11:40:59 +00:00
Deepesh Garg
f72fc73913 Merge pull request #34813 from frappe/version-14-hotfix
chore: release v14
2023-04-11 17:09:31 +05:30
Ritwik Puri
8a331e0f26 revert: remove frappe.send_message (v14) (#34816)
revert: remove frappe.send_message
2023-04-11 16:10:32 +05:30
Deepesh Garg
da913d49a7 Merge branch 'version-14' into version-14-hotfix 2023-04-11 15:56:58 +05:30
rohitwaghchaure
21aea52c32 Merge pull request #34814 from frappe/mergify/bp/version-14-hotfix/pr-34808
fix: reposting record not created for backdated stock reconciliation  (backport #34808)
2023-04-11 15:36:32 +05:30
Rohit Waghchaure
9b90323d53 fix: reposting record not created for backdated stock reco
(cherry picked from commit 6851b5ba97)
2023-04-11 09:33:26 +00:00
Deepesh Garg
994272b966 fix: customer selection not mandatory in purchase invoice to fetch item details (#34810) 2023-04-11 14:17:27 +05:30
mergify[bot]
fee4cd5f40 fix: provide filter by depreciable assets in fixed asset register (#34803)
fix: provide filter by depreciable assets in fixed asset register (#34803)

(cherry picked from commit c957a5cd2e)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
2023-04-11 13:50:04 +05:30
mergify[bot]
3023dbbe95 fix: add german translation of "Partly Paid" (#34776)
fix: add german translation of "Partly Paid" (#34776)

(cherry picked from commit 934e1b4e6a)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-04-09 20:13:36 +05:30
mergify[bot]
cc21241887 fix: Item tax validity comparison fixes (#34784)
fix: Item tax validity comparison fixes (#34784)

fix: Item tax validity comparsion fixes
(cherry picked from commit 6f6928fa7b)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-09 18:55:11 +05:30
Sagar Sharma
66fdd1c13f Merge pull request #34786 from frappe/mergify/bp/version-14-hotfix/pr-34632
refactor: rewrite `batch.py` queries in `QB` (backport #34632)
2023-04-08 22:10:22 +05:30
s-aga-r
5723a200c5 chore: conflicts 2023-04-08 19:10:39 +05:30
s-aga-r
35c9493336 refactor: rewrite batch.py queries in QB
(cherry picked from commit 517b5f8567)

# Conflicts:
#	erpnext/stock/doctype/batch/batch.py
2023-04-08 07:41:49 +00:00
Anand Baburajan
b235b95bed Merge pull request #34779 from frappe/mergify/bp/version-14-hotfix/pr-34735
'Make Asset Movement' button translation fix in asset_list.js (backport #34735)
2023-04-07 15:34:20 +05:30
Hossein Yousefian
50abbded34 'Make Asset Movement' button translation fix
(cherry picked from commit b70615ef18)
2023-04-07 10:01:19 +00:00
Sagar Sharma
31b479d71f Merge pull request #34772 from frappe/mergify/bp/version-14-hotfix/pr-34760
fix: validate `Received Qty` for Internal Purchase Receipt (backport #34760)
2023-04-06 17:20:46 +05:30
s-aga-r
769736ffea test: add test cases for internal PR received qty
(cherry picked from commit a575bd50ef)
2023-04-06 10:56:11 +00:00
s-aga-r
b79ddbbf60 chore: add Delivery Note Item in Purchase Receipt Status Updater
(cherry picked from commit 0d1df26b88)
2023-04-06 10:56:11 +00:00
s-aga-r
1c5e36c7b6 feat: add Received Qty field in Delivery Note Item
(cherry picked from commit bc39dfab5d)
2023-04-06 10:56:11 +00:00
Sagar Sharma
eaf577f078 Merge pull request #34770 from frappe/mergify/bp/version-14-hotfix/pr-34769
fix: Subcontracting Receipt incorrect `status` (backport #34769)
2023-04-06 14:53:34 +05:30
rohitwaghchaure
e02ad91c39 Merge pull request #34771 from frappe/mergify/bp/version-14-hotfix/pr-34768
fix: UX for stock entry, bom and work order (backport #34768)
2023-04-06 14:44:45 +05:30
Rohit Waghchaure
d4a6035c83 fix: UX for stock entry, bom and work order
(cherry picked from commit 82a136f991)
2023-04-06 08:47:08 +00:00
s-aga-r
99226d3811 fix: Subcontracting Receipt incorrect status
(cherry picked from commit a55b818119)
2023-04-06 08:27:32 +00:00
Frappe PR Bot
2a8c9f8e69 chore(release): Bumped to Version 14.20.3
## [14.20.3](https://github.com/frappe/erpnext/compare/v14.20.2...v14.20.3) (2023-04-06)

### Bug Fixes

* Unable to create payment request against purchase invoice ([#34762](https://github.com/frappe/erpnext/issues/34762)) ([f4473b3](f4473b36a5))
2023-04-06 07:54:09 +00:00
mergify[bot]
f4473b36a5 fix: Unable to create payment request against purchase invoice (#34762)
fix: Unable to create payment request against purchase invoice (#34762)

fix: Unable to create payment request against purchase invoice (#34762)

(cherry picked from commit 91a26608ee)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit a1f7e35914)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
2023-04-06 13:22:09 +05:30
mergify[bot]
a1f7e35914 fix: Unable to create payment request against purchase invoice (#34762)
fix: Unable to create payment request against purchase invoice (#34762)

(cherry picked from commit 91a26608ee)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-06 12:49:15 +05:30
Frappe PR Bot
b6ae9a4a72 chore(release): Bumped to Version 14.20.2
## [14.20.2](https://github.com/frappe/erpnext/compare/v14.20.1...v14.20.2) (2023-04-05)

### Bug Fixes

* incorrect stock balance quantity for batch item ([c7cee86](c7cee86685))
2023-04-05 18:57:55 +00:00
rohitwaghchaure
313e1a5e04 Merge pull request #34759 from frappe/mergify/bp/version-14/pr-34758
fix: incorrect stock balance quantity for batch item (backport #34743) (backport #34758)
2023-04-06 00:26:07 +05:30
Rohit Waghchaure
c7cee86685 fix: incorrect stock balance quantity for batch item
(cherry picked from commit ef4bd77196)
(cherry picked from commit d817c50581)
2023-04-05 18:18:47 +00:00
rohitwaghchaure
915c4819b6 Merge pull request #34758 from frappe/mergify/bp/version-14-hotfix/pr-34743
fix: incorrect stock balance quantity for batch item (backport #34743)
2023-04-05 23:47:17 +05:30
Rohit Waghchaure
d817c50581 fix: incorrect stock balance quantity for batch item
(cherry picked from commit ef4bd77196)
2023-04-05 17:52:45 +00:00
Frappe PR Bot
33ee958cfb chore: release v14 (#34733) 2023-04-05 17:41:20 +05:30
mergify[bot]
8ba1e0f31e fix: payment entry is already created on posawesome. (backport #34712) (#34752) 2023-04-05 13:55:13 +05:30
mergify[bot]
3ad5d676ab fix: Shop by category fixes (backport #34688) (#34750)
fix: Shop by category fixes (#34688)

* fix: Shop by category fixes

* chore: Update tests

(cherry picked from commit 56f5078357)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-05 13:09:34 +05:30
mergify[bot]
05d24e3665 feat: Auto allocate advance payments only against orders (#34727)
* feat: Auto allocate advance payments only against orders (#34727)

feat: Auto allocate advance payments only againt orders
(cherry picked from commit fd3fb64aa3)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json

* chore: Resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-05 13:00:40 +05:30
mergify[bot]
3c0cc024aa fix!: require sender and message for contact us page (#34707)
fix!: require sender and message for contact us page (#34707)

* fix: require sender and message for contact us page

* refactor: dont override frappe.send_message from client side

used override_whitelisted_method hook for the same

(cherry picked from commit f193393f57)

Co-authored-by: Ritwik Puri <ritwikpuri5678@gmail.com>
2023-04-05 12:33:55 +05:30
Anand Baburajan
88c8c36805 fix: asset monthly WDV and DD schedule [v14] (#34644)
* fix: monthly wdv and dd schedule

* chore: handle case without pro rata

* chore: fix DD rate and prev depr amount in case of disposal

* chore: minor fix for schedules with just 2 rows

* chore: minor bug

* refactor: get_depreciation_amount

* refactor: another one for get_depreciation_amount
2023-04-05 11:45:45 +05:30
Anand Baburajan
7c4a9b56ff Merge pull request #34737 from AnandBaburajan/asdeprledger_cancelled_deprs
fix: don't include cancelled JVs in assdeprledger report
2023-04-05 11:33:53 +05:30
Anand Baburajan
16e554dd7b Merge branch 'version-14-hotfix' into asdeprledger_cancelled_deprs 2023-04-04 17:51:21 +05:30
anandbaburajan
3896d41e95 fix: don't include cancelled JVs in assdeprledger report 2023-04-04 17:49:16 +05:30
Sagar Sharma
12625d87b0 Merge pull request #34717 from frappe/mergify/bp/version-14-hotfix/pr-34713
fix: consider qty field precision (backport #34713)
2023-04-04 08:45:12 +05:30
Frappe PR Bot
dfadfdc32c chore(release): Bumped to Version 14.20.1
## [14.20.1](https://github.com/frappe/erpnext/compare/v14.20.0...v14.20.1) (2023-04-03)

### Bug Fixes

* bom update log not working for large batch size ([da35436](da354362be))
2023-04-03 17:50:43 +00:00
rohitwaghchaure
e4def081f5 Merge pull request #34724 from frappe/mergify/bp/version-14/pr-34719
fix: bom update log not working for large batch size (backport #34715) (backport #34719)
2023-04-03 23:19:00 +05:30
Sagar Sharma
cbb8dd6aa6 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34713 2023-04-03 22:23:20 +05:30
Rohit Waghchaure
da354362be fix: bom update log not working for large batch size
(cherry picked from commit d56070301c)
(cherry picked from commit 551190af30)
2023-04-03 16:06:57 +00:00
rohitwaghchaure
9372d46c08 Merge pull request #34711 from vishdha/reserved_pos_qty
fix: use stock qty to calculate POS reserved stock
2023-04-03 21:14:36 +05:30
rohitwaghchaure
dff61ab759 Merge pull request #34719 from frappe/mergify/bp/version-14-hotfix/pr-34715
fix: bom update log not working for large batch size (backport #34715)
2023-04-03 16:55:27 +05:30
Rohit Waghchaure
551190af30 fix: bom update log not working for large batch size
(cherry picked from commit d56070301c)
2023-04-03 10:20:09 +00:00
s-aga-r
2c54e763e4 fix: consider qty field precision
(cherry picked from commit 6ec7590c21)
2023-04-03 10:07:42 +00:00
mergify[bot]
6b866e24f6 fix(ui): recalculate difference amount on allocation change (#34694)
fix: recalculate difference amount on allocation change

(cherry picked from commit 32a4ca6b6c)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-04-03 14:55:32 +05:30
mergify[bot]
be2990ec88 fix: Allocate tax loss to tax account head on early payment discount (#34287)
* fix: Taxes aren't discounted on early payment discount

- Deductions in payment entry must be split into income loss and tax loss
- Compute total discount in percentage, makes discounting different amounts proportionately easier

(cherry picked from commit 768c3a4927)

* fix: Recalculate difference amount after setting deductions

(cherry picked from commit 75ec0a0a85)

* fix: Set deductions in base currency

- Use field precision to get more accurate values

(cherry picked from commit dc2998f544)

* fix: Back update discounted amount in Invoice based on discount type

- Discount value was always trated as a percentage on back updation

(cherry picked from commit 2ae5834290)

* test: PE from SI with early payment discount amount & PE assertions in discount % test

(cherry picked from commit c217bb2018)

* fix: Set deduction amount in company currency on Doctype

- Even via JS, deductions amount is always in company currency
- Since there is nothing dynamic about this field, set it in the doctype spec itself
- fixed: Inconsistency between label currency and field currency formatted value

(cherry picked from commit 7f2e7badff)

* fix: Don't add to deductions if amount is 0

- misc: better docstring

(cherry picked from commit f02fc8acf0)

* fix: Paid amount must be discounted considering accounting currency

- Accounting is in the same currency if party currency and company currency is the same
- If accounting is in the same currency, paid and recvd amount is in the base currency
- Then, discount amount must also be in the base currency as it is deducted from paid amount
- Received amount must be in base currency if not multi currency
- cleanup: Deductions setting broken into smaller functions

(cherry picked from commit 761f68d7bf)

* fix: Multi-currency SI with base currency PE

- Return total discount loss in base currency
- Allocate payment based on terms: Set allocated amount in references table in base currency if accounting is in that currency
- Allocate payment based on terms: While back updating set paid amount (payment schedule) in transaction currency always
- minor: discount msgprint in correct currency

(cherry picked from commit b09c2381ca)

* test: Multi currency SI with multi-currency accounting and single currency accounting + Early payment discount

(cherry picked from commit 9abf0ef615)

* fix: Handle rounding more gracefully

- Round off pending discount loss to avoid miniscule losses rounded to 0.0 that are added in deductions
- Use base amounts to calculate base losses instead of using conversion factor which increases rounding error
- Round of total base loss instead of individual income and tax losses to reduce rounding error
- Use default round off account for pending rounding loss in deductions

(cherry picked from commit caa1a3dccf)

* fix: Provision to apply early payment discount if payment is recorded late

- Party could have paid on time but payment is recorded late
- Prompt for reference date so that discount is applied while mapping
- Prompt only if discount in payment schedule of valid doctypes
- test: Reference date and impact on PE
- `make_payment_entry` (JS) must be able to access `this`

(cherry picked from commit d6d0163514)

* feat: Make Tax loss booking optional

- Checkbox in Accounts Settings
- Apply checkbox in PE deductions setting logic
- Adjust tests

(cherry picked from commit 216a46bd66)

# Conflicts:
#	erpnext/accounts/doctype/accounts_settings/accounts_settings.json

* fix: Merge conflicts

---------

Co-authored-by: marination <maricadsouza221197@gmail.com>
2023-04-03 13:00:22 +05:30
Vishal
c0f7f7da42 fix: use stock qty to calculate POS reserved stock 2023-04-03 12:46:57 +05:30
Sagar Sharma
b34c78c4e7 Merge pull request #34697 from frappe/mergify/bp/version-14-hotfix/pr-34656
fix: BOM Update Cost, when no actual qty (backport #34656)
2023-04-02 19:16:41 +05:30
Sagar Sharma
4ada090cb2 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34656 2023-04-02 14:59:38 +05:30
mergify[bot]
5677f25215 fix: Multiple issues in purchase invoice submission (#34600)
fix: Multiple issues in purchase invoice submission (#34600)

* fix: Multiple issues in purchase invoice submission

* fix: Base grand total calculation

* chore: Calculate base grand total separately only in multi currency docs

* fix: Add gl entry for round off

(cherry picked from commit 4c61ee30bb)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-02 12:56:58 +05:30
mergify[bot]
f1687cfb14 fix: Bank clearance for case loan (disburstment/repayment) (#34586)
fix: Bank clearance for case loan (disburstment/repayment) (#34586)

(cherry picked from commit 74b29eb5e2)

Co-authored-by: Kitti U. @ Ecosoft <kittiu@ecosoft.co.th>
2023-04-01 22:07:50 +05:30
mergify[bot]
a00459aec3 fix: Supplier RFQ email link (#34338)
fix: Supplier RFQ email link (#34338)

(cherry picked from commit fc86a8568f)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-04-01 22:07:28 +05:30
s-aga-r
8757435898 fix: BOM Update Cost, when no actual qty
(cherry picked from commit a4112c75c5)
2023-04-01 10:54:51 +00:00
ruthra kumar
dcf62dc548 Merge pull request #34686 from frappe/mergify/bp/version-14-hotfix/pr-34679
fix: enclose ternary operator in parenthesis (backport #34679)
2023-03-31 14:05:30 +05:30
ruthra kumar
b835760b0b fix: enclose ternary operator in parentheses
(cherry picked from commit 986daa6578)
2023-03-31 08:02:13 +00:00
Sagar Sharma
bd0c20f789 Merge pull request #34681 from frappe/mergify/bp/version-14-hotfix/pr-34677
chore: make `Production Plan Item Reference` table hidden in Production Plan (backport #34677)
2023-03-31 12:37:19 +05:30
s-aga-r
5ef98fcea1 chore: make Production Plan Item Reference table hidden in Production Plan
(cherry picked from commit 706be2a415)
2023-03-31 07:05:20 +00:00
Deepesh Garg
985b232251 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34627 2023-03-31 11:59:48 +05:30
mergify[bot]
5e28d0234e fix: Total debit and credit while importing via Data Import (#34659)
fix: Total debit and credit while importing via Data Import (#34659)

(cherry picked from commit 7c42b72ee7)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-31 11:58:45 +05:30
mergify[bot]
5e03a4e9e2 fix: Column value mismatch in COA blank template (#34658)
fix: Column value mismatch in COA blank template (#34658)

(cherry picked from commit 576575c227)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-31 11:58:16 +05:30
rohitwaghchaure
e98e64f925 Merge pull request #34669 from frappe/mergify/bp/version-14-hotfix/pr-34664
fix: incorrect balance qty in the stock ledger report (backport #34664)
2023-03-30 18:18:07 +05:30
rohitwaghchaure
9ce281d008 Merge pull request #34671 from frappe/mergify/bp/version-14-hotfix/pr-34636
fix: posting time issue (backport #34636)
2023-03-30 18:17:31 +05:30
Anand Baburajan
27a3f2ce55 Merge pull request #34665 from frappe/mergify/bp/version-14-hotfix/pr-34661
chore: improve asset depr posting failure msg (backport #34661)
2023-03-30 17:50:24 +05:30
mergify[bot]
61858a60c2 fix: plaid log_error syntax issue (backport #34642) (#34667)
fix: plaid log_error syntax issue (#34642)

(cherry picked from commit ddb17a8880)

Co-authored-by: Richard Case <110036763+casesolved-co-uk@users.noreply.github.com>
2023-03-30 17:28:37 +05:30
Rohit Waghchaure
bb5eeb6bd6 fix: posting time issue
(cherry picked from commit 345e6facbe)
2023-03-30 11:56:35 +00:00
Rohit Waghchaure
3494c9ccb6 fix: incorrect balance qty in the stock ledger report
(cherry picked from commit cbdaab940d)
2023-03-30 11:56:27 +00:00
Anand Baburajan
a0df23415b chore: improve asset depr posting failure msg (#34661)
* chore: improve asset depr posting error msg

* chore: add period

* chore: improve msg

(cherry picked from commit d999dea3e4)
2023-03-30 11:09:32 +00:00
mergify[bot]
8510c398a4 chore: auto fill asset name and available for use date (backport #34660) (#34662)
* chore: auto fill asset name and available for use date

(cherry picked from commit af3e807607)

# Conflicts:
#	erpnext/assets/doctype/asset/asset.json

* Update asset.json

---------

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-03-30 16:37:35 +05:30
rohitwaghchaure
bae476cc99 Merge pull request #34652 from frappe/mergify/bp/version-14-hotfix/pr-34648
fix: serial no with zero quantity issue in stock reco (backport #34648)
2023-03-30 13:39:58 +05:30
Anand Baburajan
4dfc660cc0 Merge pull request #34650 from frappe/mergify/bp/version-14-hotfix/pr-34649
fix: incorrect arg name in asset value adjustment (backport #34649)
2023-03-30 13:10:26 +05:30
Rohit Waghchaure
f47be46717 fix: serial no with zero quantity issue in stock reco
(cherry picked from commit 17131e5a02)
2023-03-30 07:35:38 +00:00
anandbaburajan
8d9305ee5f fix: incorrect arg name in asset value adjustment
(cherry picked from commit 2b0470d1f5)
2023-03-30 07:34:09 +00:00
Deepesh Garg
bc94358e98 chore: resolve conflicts 2023-03-30 12:15:56 +05:30
Komal-Saraf0609
5e98679f91 fix: enabling lead even after "Opportunity" created against it (#34627)
* fix: enabling lead even after "Opportunity" created against it

* chore: Linting Issues

---------

Co-authored-by: Komal Saraf <komal@frappe.io>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit ad11934d39)

# Conflicts:
#	erpnext/patches.txt
#	erpnext/patches/v14_0/enable_all_leads.py
2023-03-30 02:34:48 +00:00
Anand Baburajan
6819f0106d Merge pull request #34640 from frappe/mergify/bp/version-14-hotfix/pr-34607
Asset maintenance task add dropdown "3 Yearly" (backport #34607)
2023-03-29 18:13:54 +05:30
Bevan Tony Medrano
e3de229b82 Asset maintenance task add dropdown "3 Yearly" (#34607)
* feat(asset_maintenance.json):Add 3 yearly in periodicity dropdown

* add server side implications for 3 yearly

(cherry picked from commit 625b8e8005)
2023-03-29 12:15:40 +00:00
mergify[bot]
3e67994cc7 fix: lost opportunity report issue (#34626)
fix: lost opportunity report issue (#34626)

* fix: lost opportunity report issue

* chore: Linting Issues

---------

Co-authored-by: Komal Saraf <komal@frappe.io>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit d0660ad222)

Co-authored-by: Komal-Saraf0609 <81952590+Komal-Saraf0609@users.noreply.github.com>
2023-03-29 17:04:00 +05:30
Frappe PR Bot
a60c8f0e18 chore(release): Bumped to Version 14.20.0
# [14.20.0](https://github.com/frappe/erpnext/compare/v14.19.0...v14.20.0) (2023-03-28)

### Bug Fixes

* default pos conversion factor set to 1 ([#34437](https://github.com/frappe/erpnext/issues/34437)) ([18d813a](18d813a656))
* don't get zero value entries for exchange rate calculation ([#34475](https://github.com/frappe/erpnext/issues/34475)) ([ff24b3e](ff24b3e40c))
* incorrect `Opening Value` in `Stock Balance` report ([76b782a](76b782a03f))
* Note username overlapping with note content(CRM) ([096e5ef](096e5ef197))
* Party Name in SOA print when viewed from Customer/Supplier master ([#34597](https://github.com/frappe/erpnext/issues/34597)) ([835edbe](835edbe80e))
* Percentage billing in Sales Order ([#34606](https://github.com/frappe/erpnext/issues/34606)) ([477cb12](477cb12240))
* recalculate WDV rate after asset repair [v14] ([#34571](https://github.com/frappe/erpnext/issues/34571)) ([d2ca6f8](d2ca6f8d1f))
* remove unused translation ([#34519](https://github.com/frappe/erpnext/issues/34519)) ([881e92e](881e92e7b3))
* removing redundant validation ([fd6db41](fd6db41b6e))
* Sales person variance report without item group ([#34552](https://github.com/frappe/erpnext/issues/34552)) ([90ddc4a](90ddc4a1e2))
* Tax Category not able to set hence it calculating zero tax for item whoes tax template set ([#34525](https://github.com/frappe/erpnext/issues/34525)) ([a8567b0](a8567b09e6))
* Time button not working in the job card ([8fed33b](8fed33b03b))
* translations and UX in alternative item mapping ([#34433](https://github.com/frappe/erpnext/issues/34433)) ([702d07e](702d07ea7d))
* unset address and contact on trash (backport [#34495](https://github.com/frappe/erpnext/issues/34495)) ([#34560](https://github.com/frappe/erpnext/issues/34560)) ([db01bf5](db01bf5dec))
* zero rm-cost for batch rm item in SCR (backport [#34616](https://github.com/frappe/erpnext/issues/34616)) ([#34623](https://github.com/frappe/erpnext/issues/34623)) ([cff35d7](cff35d7286))

### Features

* deprecate get_customer_list ([#34563](https://github.com/frappe/erpnext/issues/34563)) ([67576ad](67576ad5bd))
2023-03-28 18:23:52 +00:00
Deepesh Garg
efdbb91a21 Merge pull request #34611 from frappe/version-14-hotfix
chore: release v14
2023-03-28 23:49:38 +05:30
mergify[bot]
cff35d7286 fix: zero rm-cost for batch rm item in SCR (backport #34616) (#34623)
fix: zero rm-cost for batch rm item in SCR (#34616)

fix: `0` rm-cost for batch rm item in SCR
(cherry picked from commit 867d898304)

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
2023-03-28 21:09:01 +05:30
rohitwaghchaure
c671f3ddc9 Merge pull request #34621 from frappe/mergify/bp/version-14-hotfix/pr-34461
fix: incorrect `Opening Value` in `Stock Balance` report (backport #34461)
2023-03-28 18:41:42 +05:30
s-aga-r
76b782a03f fix: incorrect Opening Value in Stock Balance report
(cherry picked from commit b04a101c11)
2023-03-28 12:11:54 +00:00
ruthra kumar
6f502bdc54 Merge pull request #34619 from frappe/mergify/bp/version-14-hotfix/pr-34608
chore: removing redundant validation (backport #34608)
2023-03-28 17:21:11 +05:30
mergify[bot]
a8567b09e6 fix: Tax Category not able to set hence it calculating zero tax for item whoes tax template set (#34525)
fix: Tax Category not able to set hence it calculating zero tax for item whoes tax template set (#34525)

* fix: Tax Category not able to set hence it calculating zero tax for item whoes tax template set

* fix: minor change added

(cherry picked from commit 7aafc90d58)

Co-authored-by: Vishal Dhayagude <vishdha@users.noreply.github.com>
2023-03-28 17:20:26 +05:30
ruthra kumar
fd6db41b6e fix: removing redundant validation
(cherry picked from commit d52f7e2820)
2023-03-28 16:59:42 +05:30
mergify[bot]
ff24b3e40c fix: don't get zero value entries for exchange rate calculation (#34475)
fix: don't get zero value entries for exchange rate calculation (#34475)

* fix: multiply None by float

* chore: remove debug

(cherry picked from commit 393bc25e2d)

Co-authored-by: Devin Slauenwhite <devin.slauenwhite@gmail.com>
2023-03-28 16:58:22 +05:30
mergify[bot]
477cb12240 fix: Percentage billing in Sales Order (#34606)
fix: Percentage billing in Sales Order (#34606)

(cherry picked from commit 12ad2aa2e5)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-28 16:52:53 +05:30
mergify[bot]
835edbe80e fix: Party Name in SOA print when viewed from Customer/Supplier master (#34597)
fix: Party Name in SOA print when viewed from Customer/Supplier master (#34597)

fix: Party Name in SOA print when viewd from Customer/Supplier master
(cherry picked from commit 50c1172f29)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-28 16:48:53 +05:30
mergify[bot]
18d813a656 fix: default pos conversion factor set to 1 (#34437)
* fix: default pos conversion factor set to 1 (#34437)

(cherry picked from commit 08fc686513)

# Conflicts:
#	erpnext/selling/page/point_of_sale/point_of_sale.py

* chore: Resolve conflicts

---------

Co-authored-by: Shram Kadia <65490105+Shram007@users.noreply.github.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-24 15:14:52 +05:30
mergify[bot]
67576ad5bd feat: deprecate get_customer_list (#34563)
feat: deprecate get_customer_list (#34563)

(cherry picked from commit 8c7fa5712b)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-24 15:14:25 +05:30
ruthra kumar
37f2ba882e Merge pull request #34583 from frappe/mergify/bp/version-14-hotfix/pr-34577
refactor: additional filters and columns in Payment Ledger report (backport #34577)
2023-03-24 14:22:55 +05:30
ruthra kumar
57ecac4aa7 refactor: additional filters and columns in Payment Ledger report (#34577)
1. 'Party type' and 'Party' filters have been added
2. checkbox to include Amount in Acccount Currency
3. Grouping vouchers on Party
4. Replaced Company with Posting Date

(cherry picked from commit f7780cdb58)
2023-03-24 08:11:34 +00:00
rohitwaghchaure
070dea1bc5 Merge pull request #34574 from frappe/mergify/bp/version-14-hotfix/pr-34573
fix: Timer buttons not working in the job card (backport #34573)
2023-03-24 08:40:56 +05:30
Rohit Waghchaure
8fed33b03b fix: Time button not working in the job card
(cherry picked from commit 34c190b7d6)
2023-03-23 17:06:58 +00:00
mergify[bot]
90ddc4a1e2 fix: Sales person variance report without item group (#34552)
fix: Sales person variance report without item group (#34552)

fix: Sales person variance report witout item group
(cherry picked from commit 87108be11a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-23 21:49:13 +05:30
Anand Baburajan
d2ca6f8d1f fix: recalculate WDV rate after asset repair [v14] (#34571)
fix: recalculate wdv rate after asset repair
2023-03-23 21:08:59 +05:30
mergify[bot]
db01bf5dec fix: unset address and contact on trash (backport #34495) (#34560)
fix: unset address and contact on trash (#34495)

* fix(Customer): unset address and contact on trash

* fix(Supplier): unset address and contact on trash

---------

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
(cherry picked from commit f7bf1b8a0c)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-23 12:58:32 +05:30
mergify[bot]
881e92e7b3 fix: remove unused translation (#34519)
* fix: remove unused translation (#34519)

(cherry picked from commit 0df3a1a3af)

# Conflicts:
#	erpnext/translations/tr.csv

* chore: resolve conflicts

---------

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-23 00:06:14 +05:30
Shariq Ansari
d2e9527563 Merge pull request #34549 from frappe/mergify/bp/version-14-hotfix/pr-34547
fix: Note username overlapping with note content(CRM) (backport #34547)
2023-03-22 12:05:56 +05:30
Shariq Ansari
096e5ef197 fix: Note username overlapping with note content(CRM)
(cherry picked from commit 76cea7dd6a)
2023-03-22 06:32:46 +00:00
mergify[bot]
702d07ea7d fix: translations and UX in alternative item mapping (#34433)
fix: translations and UX in alternative item mapping (#34433)

* fix: disable deletion in alternative item mapping

* feat: german translations

* fix: make string translatable

---------

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 79911734e9)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-21 22:48:38 +05:30
Frappe PR Bot
e271935673 chore(release): Bumped to Version 14.19.0
# [14.19.0](https://github.com/frappe/erpnext/compare/v14.18.3...v14.19.0) (2023-03-21)

### Bug Fixes

* **client:** Amount calculation for 0 qty debit notes ([#34455](https://github.com/frappe/erpnext/issues/34455)) ([d24f4d2](d24f4d2873))
* difference amount calculation for company currency accounts ([9ab7bff](9ab7bff0e0))
* don't map item row having `0` qty ([7611a49](7611a49db7))
* E-commerce issue with Item Variants ([53c3fff](53c3fff235))
* german translations ([#34312](https://github.com/frappe/erpnext/issues/34312)) ([dd0c833](dd0c8334cd))
* hide `+` button based on `Blanket Order Type` ([daa1bb8](daa1bb86e3))
* incorrect depr schedules after asset repair [v14] ([#34527](https://github.com/frappe/erpnext/issues/34527)) ([560df63](560df6330a)), closes [#30838](https://github.com/frappe/erpnext/issues/30838)
* Multiple accounting dimension filtering in AR/AP reports ([#34464](https://github.com/frappe/erpnext/issues/34464)) ([f146479](f146479362))
* Overallocation of 'qty' from Cr Notes to Parent Invoice ([848e56b](848e56bd4c))
* patch depends on Currency Exchange Settings ([#34494](https://github.com/frappe/erpnext/issues/34494)) ([4acde44](4acde4468f))
* POS not picking up pos profile company address instead fetch any random company address ([#34521](https://github.com/frappe/erpnext/issues/34521)) ([01f4cc7](01f4cc76fc))
* Update account number from parent company ([#34474](https://github.com/frappe/erpnext/issues/34474)) ([55d002c](55d002c636))
* use max function to get default company address (backport [#34116](https://github.com/frappe/erpnext/issues/34116)) ([#34452](https://github.com/frappe/erpnext/issues/34452)) ([ba2fd71](ba2fd71b65))

### Features

* add field `Over Order Allowance (%)` in `Buying Settings` ([da915f1](da915f1510))
* add field `Over Order Allowance (%)` in `Selling Settings` ([46b5ba9](46b5ba9c2a))
* bank reconciliation and plaid changes ([#33986](https://github.com/frappe/erpnext/issues/33986)) ([9b608ea](9b608eaa0f))
* consider `over_order_allowance` while validating order qty ([932639b](932639b4df))
* consider `over_order_allowance` while validating sales order qty ([09b577a](09b577a91f))
* Support for Alternative Items in Quotation ([#33874](https://github.com/frappe/erpnext/issues/33874)) ([9f7da21](9f7da21c93))

### Performance Improvements

* index against_sales_invoice field on DN items (backport [#34509](https://github.com/frappe/erpnext/issues/34509)) ([#34510](https://github.com/frappe/erpnext/issues/34510)) ([baa789b](baa789be34))
2023-03-21 12:52:05 +00:00
Deepesh Garg
78f4082893 Merge pull request #34532 from frappe/version-14-hotfix
chore: release v14
2023-03-21 18:20:39 +05:30
mergify[bot]
dd0c8334cd fix: german translations (#34312)
fix: german translations (#34312)

fix: some german translations
(cherry picked from commit 59c2e7ec3e)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-21 16:08:32 +05:30
mergify[bot]
01f4cc76fc fix: POS not picking up pos profile company address instead fetch any random company address (#34521)
fix: POS not picking up pos profile company address instead fetch any random company address (#34521)

(cherry picked from commit 6966fa4d88)

Co-authored-by: Vishal Dhayagude <vishdha@users.noreply.github.com>
2023-03-21 16:06:54 +05:30
mergify[bot]
d24f4d2873 fix(client): Amount calculation for 0 qty debit notes (#34455)
fix(client): Amount calculation for 0 qty debit notes (#34455)

fix(client): Amount calculaton for 0 qty debit notes

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
(cherry picked from commit ee6c107d58)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-21 16:05:41 +05:30
mergify[bot]
17744a99a1 refactor(bank reconciliation tool): currency symbol fix and concurrent usage (#34501)
* fix: incorrect currency symbol in Bank Reconciliation tool

(cherry picked from commit 2d14d92b32)

* refactor: allow for concurrent use of reconciliation tool

1. set default filter dates a period of one month from current date

(cherry picked from commit 1eea585d29)

---------

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-03-21 16:01:09 +05:30
rohitwaghchaure
8c40dd93c3 Merge pull request #34530 from frappe/mergify/bp/version-14-hotfix/pr-34528
fix: E-commerce issue with Item Variants (backport #34528)
2023-03-21 14:52:39 +05:30
Rohit Waghchaure
53c3fff235 fix: E-commerce issue with Item Variants
(cherry picked from commit aaa4d1eb55)
2023-03-21 09:17:33 +00:00
Anand Baburajan
560df6330a fix: incorrect depr schedules after asset repair [v14] (#34527)
* fix: backport missing changes from #30838

* fix: incorrect schedule after repair
2023-03-21 14:31:23 +05:30
ruthra kumar
91a609d2ab Merge pull request #34513 from ruthra-kumar/manual_backport_of_34456_to_v14
fix: Gross Profit reports Invoices with -ve qty for Invoices with Cr Notes (manual backport to version 14)
2023-03-20 17:05:28 +05:30
ruthra kumar
aead554d31 test: Gross Profit report output for Cr notes
2 New test cases added.
1. Standalone Cr notes will be reported as normal Invoices
2. Cr notes against an Invoice will not overallocate qty if there are
multiple instances of same item
2023-03-20 16:06:53 +05:30
ruthra kumar
e0e89b4209 refactor: Ignore linked Cr Notes in Report output 2023-03-20 16:06:53 +05:30
ruthra kumar
848e56bd4c fix: Overallocation of 'qty' from Cr Notes to Parent Invoice
Cr Notes 'qty' are overallocated to parent invoice, when there are
mulitple instances of same item in Invoice.
2023-03-20 16:06:53 +05:30
mergify[bot]
baa789be34 perf: index against_sales_invoice field on DN items (backport #34509) (#34510)
perf: index against_sales_invoice field on DN items (#34509)

This is used on Sales invoice dashboard and takes a lot of time to load
as db size increases.

Results:

Before: ~10-20 seconds to load dashboard
After: few milliseconds because of index

[skip ci]

(cherry picked from commit 109a9f1390)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-03-20 14:48:46 +05:30
mergify[bot]
4acde4468f fix: patch depends on Currency Exchange Settings (#34494)
fix: patch depends on Currency Exchange Settings (#34494)

(cherry picked from commit d791dc11a3)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-20 14:27:34 +05:30
mergify[bot]
de5fabc67a chore: Update user manual link (#34478)
* chore: Update user manual link (#34478)

(cherry picked from commit be723bb9d4)

# Conflicts:
#	erpnext/patches.txt

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-19 18:06:45 +05:30
mergify[bot]
f146479362 fix: Multiple accounting dimension filtering in AR/AP reports (#34464)
fix: Multiple accounting dimension filtering in AR/AP reports (#34464)

Co-authored-by: Anand Baburajan <anandbaburajan@gmail.com>
(cherry picked from commit 7b630217bd)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-19 18:06:00 +05:30
mergify[bot]
55d002c636 fix: Update account number from parent company (#34474)
fix: Update account number from parent company (#34474)

(cherry picked from commit d8ece86463)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-19 18:05:33 +05:30
Sagar Sharma
b20296b2fe Merge pull request #34487 from frappe/mergify/bp/version-14-hotfix/pr-34440
chore: `Allow Zero Valuation Rate` msg in SE (backport #34440)
2023-03-17 16:56:37 +05:30
s-aga-r
5604074935 chore: Allow Zero Valuation Rate msg in SE
(cherry picked from commit 22ad9a1903)
2023-03-17 10:33:42 +00:00
ruthra kumar
bd1b955eb6 Merge pull request #34481 from frappe/mergify/bp/version-14-hotfix/pr-34466
fix: unwanted difference amt while reconciling vouchers from base currency account (backport #34466)
2023-03-17 15:26:10 +05:30
ruthra kumar
c71b4ed6ec refactor: difference amt validation for same currency accounts
(cherry picked from commit ec075122b6)
2023-03-17 09:22:32 +00:00
ruthra kumar
e81ad864cf test: difference amount should not be calculated for base currency
(cherry picked from commit 861387f164)
2023-03-17 09:22:32 +00:00
ruthra kumar
9ab7bff0e0 fix: difference amount calculation for company currency accounts
(cherry picked from commit 48fae0c1ce)
2023-03-17 09:22:32 +00:00
Sagar Sharma
524ed324fb Merge pull request #34480 from frappe/mergify/bp/version-14-hotfix/pr-34279
fix: `Blanket Order` (backport #34279)
2023-03-17 11:03:33 +05:30
s-aga-r
c46e5a81d4 test: add test cases for Over Order Allowance against Blanket Order
(cherry picked from commit 66f650061d)
2023-03-17 04:45:27 +00:00
s-aga-r
09b577a91f feat: consider over_order_allowance while validating sales order qty
(cherry picked from commit 53701c37b1)
2023-03-17 04:45:27 +00:00
s-aga-r
46b5ba9c2a feat: add field Over Order Allowance (%) in Selling Settings
(cherry picked from commit d7da8928ac)
2023-03-17 04:45:26 +00:00
s-aga-r
932639b4df feat: consider over_order_allowance while validating order qty
(cherry picked from commit 8bcbc45add)
2023-03-17 04:45:26 +00:00
s-aga-r
7611a49db7 fix: don't map item row having 0 qty
(cherry picked from commit fc1088d9c4)
2023-03-17 04:45:26 +00:00
s-aga-r
35297f6ac1 refactor: rewrite blanket_order.py queries in QB
(cherry picked from commit f3993783a3)
2023-03-17 04:45:26 +00:00
s-aga-r
da915f1510 feat: add field Over Order Allowance (%) in Buying Settings
(cherry picked from commit f5937f46cb)
2023-03-17 04:45:26 +00:00
s-aga-r
daa1bb86e3 fix: hide + button based on Blanket Order Type
(cherry picked from commit abf9a28d6a)
2023-03-17 04:45:25 +00:00
Raffael Meyer
9b608eaa0f feat: bank reconciliation and plaid changes (#33986)
feat: bank reconciliation and plaid changes (#33986)

fix: plaid link refresh: update account ids
fix: plaid transactions for credit cards & add accounts on link refresh if they don't exist
fix: bank reconciliation amount matching
fix: bank reconciliation dialog usability
feat: rewrite bank transaction reconciliation to allow multiple transactions to reconcile against vouchers before clearance
fix: matching transaction amounts and race condition bug
fix: ensure there is a reference number in plaid transactions and other tweaks
feat: add references to Payroll Entry Bank Journal Entry
feat: only clear Voucher once all Bank GLEs are allocated to Bank Transactions
fix: strange type error
feat: add payment method field to bank and plaid transactions and prepopulate relevant bank reconciliation new voucher fields
feat: bank reconciliation - allow bank transactions to reconcile against themselves for when there are banking amendments
fix: bank transaction self-reconcile bug and tidy
fix: bank reconciliation datatable index update

Co-authored-by: Richard Case <110036763+casesolved-co-uk@users.noreply.github.com>
2023-03-17 09:01:29 +05:30
Ritwik Puri
befd1a0f91 ci: use version specific payments repo (#34468)
ci: use version-14 branch of payments repo for v14 erpnext
2023-03-16 16:04:21 +05:30
mergify[bot]
9f7da21c93 feat: Support for Alternative Items in Quotation (#33874)
* feat: Filter out alternative item rows in taxes and totals for Quotation

- Added a Quotation Item field `is_alternative_item`
- Use filtered rows for taxes and totals computation

(cherry picked from commit 91982d1e4f)

# Conflicts:
#	erpnext/selling/doctype/quotation_item/quotation_item.json

* feat: Consider filtered items table in JS for totals computation

- Set `_items` as filtered rows if quotation else the entire table. Set at entry point of JS API
- Use `_items` instead of `items` to compute taxes and charges. Exclude alternative item rows

(cherry picked from commit f19eadab9a)

* feat: Dialog to select alternative item before creating Sales order

- Users can leave the row blank in the dialog if original item is to be used
- Else users can select an alternative item against an original item
- In the document, users must check `Is Alternative Item` if needed and also specify which item it is an altenrative to since there are no documented mappings

(cherry picked from commit cef7dfd0b4)

# Conflicts:
#	erpnext/selling/doctype/quotation/quotation.js
#	erpnext/selling/doctype/quotation_item/quotation_item.json

* feat: Filter rows to be mapped on server side mapping function

- Pass dialog selections to `make_sales_order`
- Map either original item or its alternative depending on mapping
- Only qty check for simple rows (without alternatives and not an alternative itself)

(cherry picked from commit 94cacb60de)

* chore: Validate 'alternative_to' field values, must be a valid non-alterntaive item from table

(cherry picked from commit fa9b327501)

* fix: Iterate over list instead of map's output and formatting

(cherry picked from commit ece6358e60)

* fix: Consider only ordered alternative/original item for Quotation status

- The original and its alternatives make a set of items where one is chosen
- While setting order status of Quotation, check if the chosen item from the set is fully ordered or not
- Filter out unselected items from the set
- Create a map containing the set of items and if they were ordered or not for ease of grouping
- The simple items will work as it used to

(cherry picked from commit b3fe7c6dad)

* chore: Code simplification

- Map is not required, avoid filter multiple times, use single loop instead
- Better variable name
- Reduce LOC

(cherry picked from commit 03321f5f13)

* refactor: Order based alternative items mapping

- Alternatives must be followed by a non-alternative item row
- On submit, store non-alternative rows in hidden checkbox to avoid recomputation
- Check for valid/mappable rows by row name
- UI: Select from table rows.Add single row for original/alternative item in dialog
- UI: Indicator for alternative items in dialog grid
- UI: Indicator legend and description of table
- DB: Added check field 'Has Alternative Item' not to be confused with 'Has Alternative' in Mfg

(cherry picked from commit db2076db69)

# Conflicts:
#	erpnext/selling/doctype/quotation_item/quotation_item.json

* test: Alternative items in Quotation

- Taxes and totals, mapping, back updation

(cherry picked from commit 74fab53e28)

* fix: Use block variable

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 3c96791d52)

* fix: Handle `Get Items From` in Sales Order

- Map all non alternatives from Quotation to SO if no selected items
- Show disclaimer mentioning that Qtns with alternatives must be mapped to SO from the Qtn form

(cherry picked from commit 19456127cf)

* fix: Map only non alternative items from Quotation in Sales Invoice

- Since there's no item selection, only Quotation selection :/

(cherry picked from commit 6b789e2f04)

* fix: Merge conflicts

---------

Co-authored-by: marination <maricadsouza221197@gmail.com>
2023-03-16 11:50:19 +05:30
mergify[bot]
68f9863ae5 test: add timeout to all BOM related tests (backport #34446) (#34453)
test: add timeout to all BOM related tests (#34446)

* Revert "chore: remove failing test (#34444)"

This reverts commit b89ecd482d.

* test: add timeout to bom tests

(cherry picked from commit f95ad039e4)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-03-15 14:19:09 +05:30
mergify[bot]
ba2fd71b65 fix: use max function to get default company address (backport #34116) (#34452)
* fix: use max function to get default company address

(cherry picked from commit b93c18bd4a)

* test: add test for primary address sorting

(cherry picked from commit e0042972c8)

---------

Co-authored-by: Prateek <40106895+prateekkaramchandani@users.noreply.github.com>
Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-03-15 10:38:49 +05:30
Frappe PR Bot
3e61e76317 chore(release): Bumped to Version 14.18.3
## [14.18.3](https://github.com/frappe/erpnext/compare/v14.18.2...v14.18.3) (2023-03-14)

### Bug Fixes

* `BOM Stock Report` ([1c00077](1c0007768b))
* `required_qty` get reset to `1` for Alternative Item in WO ([51bcdb3](51bcdb32f2))
* Don't use get_list & get_all interchangeably ([27c524e](27c524e337))
* Error in consolidated financial statement ([#34330](https://github.com/frappe/erpnext/issues/34330)) ([73866f4](73866f4da7))
* exchange rate revaluation errors ([#33947](https://github.com/frappe/erpnext/issues/33947)) ([1a629b6](1a629b6418))
* filters not getting applied on `Web Form` ([6ef7ddf](6ef7ddfbce))
* Linked invoice cancellation issue via timesheet ([#34337](https://github.com/frappe/erpnext/issues/34337)) ([da8cc2b](da8cc2bba9))
* operation time for multi-level BOM in WO ([76e04c8](76e04c8625))
* Set contact filter link in Opportunity ([#34325](https://github.com/frappe/erpnext/issues/34325)) ([c64836d](c64836d3d6))
* set tax category from address before executing `get_regional_address_details` ([#34372](https://github.com/frappe/erpnext/issues/34372)) ([bf0cbe0](bf0cbe09b9))
* **test:** flaky test case in Payment terms report ([69a5411](69a5411f0e))
* Total row in trail balance report ([#34395](https://github.com/frappe/erpnext/issues/34395)) ([c353ba7](c353ba741c))
* Use customer name instead of name(id) in PSOA (backport [#34412](https://github.com/frappe/erpnext/issues/34412)) ([#34425](https://github.com/frappe/erpnext/issues/34425)) ([209adf3](209adf32a5))

### Performance Improvements

* `update_completed_qty()` in `material_request.py` ([b37712c](b37712c038))
* Stock Entry (Material Transfer) ([1b51463](1b514632d2))

### Reverts

* Revert "Update tr.csv (backport #34285)" (#34427) ([b6d059c](b6d059ccb8)), closes [#34285](https://github.com/frappe/erpnext/issues/34285) [#34427](https://github.com/frappe/erpnext/issues/34427) [#34285](https://github.com/frappe/erpnext/issues/34285)
* Revert "fix: Default sales team not getting set" (#34376) ([ed338b1](ed338b1395)), closes [#34376](https://github.com/frappe/erpnext/issues/34376) [#34376](https://github.com/frappe/erpnext/issues/34376) [#34284](https://github.com/frappe/erpnext/issues/34284)
2023-03-14 17:37:03 +00:00
Deepesh Garg
c44579ff52 Merge pull request #34442 from frappe/version-14-hotfix
chore: release v14
2023-03-14 23:05:05 +05:30
Sagar Sharma
3f7e82f8b1 Merge pull request #34448 from frappe/mergify/bp/version-14-hotfix/pr-34415
fix: operation time for multi-level BOM in WO (backport #34415)
2023-03-14 19:55:38 +05:30
Sagar Sharma
6787a1fe91 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34415 2023-03-14 18:55:51 +05:30
Sagar Sharma
12fa080c00 Merge pull request #34450 from frappe/mergify/bp/version-14-hotfix/pr-34381
chore: fix french translation (backport #34381)
2023-03-14 18:55:07 +05:30
HENRY Florian
6303d2d8e1 chore: fix french translation (#34381)
chore: update french translation
(cherry picked from commit d267111e13)
2023-03-14 13:20:05 +00:00
s-aga-r
76e04c8625 fix: operation time for multi-level BOM in WO
(cherry picked from commit 442ee3adba)
2023-03-14 13:18:30 +00:00
mergify[bot]
c353ba741c fix: Total row in trail balance report (#34395)
fix: Total row in trail balance report (#34395)

* fix: Total row in trail balance report

* fix: Calculate total after preparing opening and closing

(cherry picked from commit c6999fc687)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-14 15:08:33 +05:30
mergify[bot]
bf0cbe09b9 fix: set tax category from address before executing get_regional_address_details (#34372)
fix: set tax category from address before executing `get_regional_address_details` (#34372)

(cherry picked from commit 5c06620f97)

Co-authored-by: Sagar Vora <sagar@resilient.tech>
2023-03-13 21:15:43 +05:30
mergify[bot]
630386fd8c chore: Move source and campaign to additional info section (#34414)
* chore: Move source and campaign to additional info section (#34414)

(cherry picked from commit c8cc3fc65f)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json

* chore: resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-13 21:11:49 +05:30
mergify[bot]
209adf32a5 fix: Use customer name instead of name(id) in PSOA (backport #34412) (#34425)
fix: Use customer name instead of name(id) in PSOA (#34412)

(cherry picked from commit fa776d2987)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-13 21:11:22 +05:30
Deepesh Garg
b6d059ccb8 Revert "Update tr.csv (backport #34285)" (#34427)
Revert "Update tr.csv (#34285)"

This reverts commit 5266a7e8a7.
2023-03-13 19:43:26 +05:30
mergify[bot]
da8cc2bba9 fix: Linked invoice cancellation issue via timesheet (#34337)
fix: Linked invoice cancellation issue via timesheet (#34337)

(cherry picked from commit 4416ddc4af)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-13 18:58:54 +05:30
mergify[bot]
af629f92f0 test: fix hypothesis tests (backport #34416) (#34418)
test: fix hypothesis tests (#34416)

(cherry picked from commit b8a61be080)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-03-13 15:28:30 +05:30
mergify[bot]
5266a7e8a7 Update tr.csv (#34285)
chore: Improve Turkish language translation

chore: Improve Turkish language translation
(cherry picked from commit fa6d37542b)

Co-authored-by: Mehmet Demirel <unibravo@gmail.com>
2023-03-13 14:03:38 +05:30
mergify[bot]
73866f4da7 fix: Error in consolidated financial statement (#34330)
fix: Error in consolidated financial statement (#34330)

(cherry picked from commit aae53bb910)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-13 14:03:02 +05:30
ruthra kumar
b0c5f5594d Merge pull request #34413 from frappe/mergify/bp/version-14-hotfix/pr-34408
chore: delete remarks migration patch (backport #34408)
2023-03-13 10:24:42 +05:30
ruthra kumar
502a45e54f chore: delete remarks migration patch
Versions higher than V14.18.2, 'remarks' will be moved in 'migrate_gl_to_payment_ledger'

(cherry picked from commit da37573b73)
2023-03-13 03:45:17 +00:00
ruthra kumar
f854316eb2 Merge pull request #34405 from frappe/mergify/bp/version-14-hotfix/pr-34387
refactor(patch): remove inner join to improve SQL performance (backport #34387)
2023-03-12 13:16:01 +05:30
ruthra kumar
0b184667fc chore: remove remarks migrations patch from patches.txt
'Remarks' field is moved in migrate_gl_to_payment_ledger patch itself
from versions highers than v14.18.2. Removing it from patches.txt

(cherry picked from commit 9d0a1149d8)
2023-03-12 11:08:34 +05:30
ruthra kumar
3923044d88 Merge pull request #34400 from frappe/mergify/bp/version-14-hotfix/pr-34370
fix(test): flaky test case in Payment terms report (backport #34370)
2023-03-11 21:29:56 +05:30
ruthra kumar
0ef1d1b2ae refactor: add remarks to column as well
(cherry picked from commit 1744f1d4e4)
2023-03-11 15:31:17 +00:00
ruthra kumar
e6de87a1b7 refactor(patch): remove inner join to improve SQL performance
(cherry picked from commit f9cfabf78e)
2023-03-11 15:31:16 +00:00
mergify[bot]
c64836d3d6 fix: Set contact filter link in Opportunity (#34325)
fix: Set contact filter link in Opportunity (#34325)

Co-authored-by: Nihantra C. Patel <n.patel.serpentcs@gmail.com>
(cherry picked from commit 71de72bdd0)

Co-authored-by: Solufyin <34390782+Solufyin@users.noreply.github.com>
2023-03-11 19:05:26 +05:30
ruthra kumar
69a5411f0e fix(test): flaky test case in Payment terms report
(cherry picked from commit 7fcd74ed03)
2023-03-11 08:49:03 +00:00
Sagar Sharma
29c58b6f75 Merge pull request #34384 from frappe/mergify/bp/version-14-hotfix/pr-34383
fix: filters not getting applied on `Web Form` (backport #34383)
2023-03-10 13:48:38 +05:30
s-aga-r
6ef7ddfbce fix: filters not getting applied on Web Form
(cherry picked from commit 9c1e566394)
2023-03-09 18:55:03 +00:00
gavin
27c524e337 fix: Don't use get_list & get_all interchangeably
fix: Fetch all fields via get_returned_qty_map_for_row
2023-03-09 16:05:37 +05:30
Frappe PR Bot
fcbcbc0aa7 chore(release): Bumped to Version 14.18.2
## [14.18.2](https://github.com/frappe/erpnext/compare/v14.18.1...v14.18.2) (2023-03-09)

### Reverts

* Revert "fix: Default sales team not getting set" (#34376) ([f71d85d](f71d85d7c3)), closes [#34376](https://github.com/frappe/erpnext/issues/34376) [#34376](https://github.com/frappe/erpnext/issues/34376) [#34284](https://github.com/frappe/erpnext/issues/34284)
2023-03-09 10:26:37 +00:00
Deepesh Garg
7ca3130010 Merge pull request #34379 from frappe/mergify/bp/version-14/pr-34377
Revert "fix: Default sales team not getting set" (backport #34376) (backport #34377)
2023-03-09 15:43:17 +05:30
mergify[bot]
f71d85d7c3 Revert "fix: Default sales team not getting set" (#34376)
Revert "fix: Default sales team not getting set" (#34376)

Revert "fix: Default sales team not getting set (#34284)"

This reverts commit 7d0199d743.

(cherry picked from commit 9a8f8e8b7d)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit ed338b1395)
2023-03-09 10:11:18 +00:00
mergify[bot]
ed338b1395 Revert "fix: Default sales team not getting set" (#34376)
Revert "fix: Default sales team not getting set" (#34376)

Revert "fix: Default sales team not getting set (#34284)"

This reverts commit 7d0199d743.

(cherry picked from commit 9a8f8e8b7d)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-09 15:39:56 +05:30
Sagar Sharma
9f0dff9e7a Merge pull request #34368 from frappe/mergify/bp/version-14-hotfix/pr-34360
chore: `Alternative Item Code` error msg (backport #34360)
2023-03-09 11:10:13 +05:30
Sagar Sharma
31f9d23b17 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34360 2023-03-09 11:09:48 +05:30
Sagar Sharma
ce8e3e92dd Merge pull request #34366 from frappe/mergify/bp/version-14-hotfix/pr-34362
fix: `required_qty` get reset to `1` for Alternative Item in WO (backport #34362)
2023-03-09 11:09:25 +05:30
s-aga-r
c734a78f3c chore: Alternative Item Code error msg
(cherry picked from commit baef5ae1ef)
2023-03-09 04:38:21 +00:00
s-aga-r
51bcdb32f2 fix: required_qty get reset to 1 for Alternative Item in WO
(cherry picked from commit 046834a97a)
2023-03-09 04:35:58 +00:00
Sagar Sharma
68b9581176 Merge pull request #34356 from frappe/mergify/bp/version-14-hotfix/pr-34352
fix: `BOM Stock Report` (backport #34352)
2023-03-08 17:45:52 +05:30
s-aga-r
df98e25312 test: add test cases for BOM Stock Report
(cherry picked from commit b53dcb04ed)
2023-03-08 10:56:44 +00:00
s-aga-r
1c0007768b fix: BOM Stock Report
(cherry picked from commit a65b80911b)
2023-03-08 10:56:44 +00:00
Deepesh Garg
d42af42cec Merge pull request #34331 from frappe/mergify/bp/version-14-hotfix/pr-33947
fix: exchange rate revaluation errors (backport #33947)
2023-03-08 13:07:04 +05:30
Frappe PR Bot
cfe28663bc chore(release): Bumped to Version 14.18.1
## [14.18.1](https://github.com/frappe/erpnext/compare/v14.18.0...v14.18.1) (2023-03-07)

### Performance Improvements

* `update_completed_qty()` in `material_request.py` ([7a5f7d4](7a5f7d4920))
* Stock Entry (Material Transfer) ([59a415e](59a415eaa9))
2023-03-07 17:23:00 +00:00
Sagar Sharma
943599f3ac Merge pull request #34342 from frappe/mergify/bp/version-14/pr-34335
perf: Stock Entry (Material Transfer) (backport #34313) (backport #34335)
2023-03-07 22:51:22 +05:30
s-aga-r
7a5f7d4920 perf: update_completed_qty() in material_request.py
(cherry picked from commit 8ad9e99cea)
(cherry picked from commit b37712c038)
2023-03-07 16:14:55 +00:00
s-aga-r
59a415eaa9 perf: Stock Entry (Material Transfer)
(cherry picked from commit de18f98c5c)
(cherry picked from commit 1b514632d2)
2023-03-07 16:14:55 +00:00
Sagar Sharma
a18c4c839e Merge pull request #34335 from frappe/mergify/bp/version-14-hotfix/pr-34313
perf: Stock Entry (Material Transfer) (backport #34313)
2023-03-07 21:43:05 +05:30
Frappe PR Bot
0696128acc chore(release): Bumped to Version 14.18.0
# [14.18.0](https://github.com/frappe/erpnext/compare/v14.17.4...v14.18.0) (2023-03-07)

### Bug Fixes

* `Inventory Dimension` for `Stock Reconciliation` ([b08cdc0](b08cdc00f2))
* `rejected_serial_no` not getting copied from PR to PR(Return) ([3db8258](3db82587eb))
* `Serial No is mandatory` even if the `qty` is `0` ([aa6b891](aa6b891ef0))
* BOM Update log not completed ([235ecca](235ecca9fa))
* consumed qty validation for subcontracting receipt ([7eccf43](7eccf431fd))
* Default sales team not getting set ([#34284](https://github.com/frappe/erpnext/issues/34284)) ([64c758d](64c758d0c0))
* Do not calculate commission post submit ([#34267](https://github.com/frappe/erpnext/issues/34267)) ([480797e](480797e856))
* labels name ([5e9f1df](5e9f1dfbb3))
* **minor:** Dirty the form after clicking on Get advances button in Invoices ([#34323](https://github.com/frappe/erpnext/issues/34323)) ([0e9f9c3](0e9f9c31a0))
* Payment Request against sales order with disabled rounded total ([#34281](https://github.com/frappe/erpnext/issues/34281)) ([ca59c69](ca59c699cd))
* Performance improvement when adding a new item ([#34195](https://github.com/frappe/erpnext/issues/34195)) ([71a281f](71a281fb11))
* Resolve conflicts ([f6469d8](f6469d8398))
* Stock Reconciliation `actual_qty` ([d97c1bf](d97c1bf0f4))
* update inventory dimensions before returning sle ([ab73742](ab737424c2))
* Wrap unexpectedly long text in remark ([b13bf1e](b13bf1ebc5))

### Features

* adjust purchase receipt valuation rate as per purchase invoice rate ([db033c6](db033c6862))

### Reverts

* Revert "refactor: use renamed timezone utils (#34301)" ([a2e001a](a2e001a2da)), closes [#34301](https://github.com/frappe/erpnext/issues/34301) [#34301](https://github.com/frappe/erpnext/issues/34301)
2023-03-07 14:26:16 +00:00
Deepesh Garg
1cf79f05c5 Merge pull request #34327 from frappe/version-14-hotfix
chore: release v14
2023-03-07 19:54:30 +05:30
s-aga-r
b37712c038 perf: update_completed_qty() in material_request.py
(cherry picked from commit 8ad9e99cea)
2023-03-07 12:33:48 +00:00
s-aga-r
1b514632d2 perf: Stock Entry (Material Transfer)
(cherry picked from commit de18f98c5c)
2023-03-07 12:33:47 +00:00
Deepesh Garg
a2e001a2da Revert "refactor: use renamed timezone utils (#34301)"
Revert "refactor: use renamed timezone utils (#34301)"

This reverts commit 164933aae8.
2023-03-07 17:56:57 +05:30
Devin Slauenwhite
1a629b6418 fix: exchange rate revaluation errors (#33947)
* fix: set new balance for non-positive balances

* fix: don't add debit: 0, credit: 0 entries to journal entry.

* fix: add journal entry difference to unbooked gain/loss of exchange.

* chore: linter

* chore: remove invlaid TODO. [skip-ci]

(cherry picked from commit 6de826b8c4)
2023-03-07 11:46:58 +00:00
mergify[bot]
164933aae8 refactor: use renamed timezone utils (#34301)
refactor: use renamed timezone utils

https://github.com/frappe/frappe/pull/20253
(cherry picked from commit 502a37a864)

Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-07 16:52:56 +05:30
mergify[bot]
0e9f9c31a0 fix(minor): Dirty the form after clicking on Get advances button in Invoices (#34323)
fix(minor): Dirty the form after clicking on Get advances button in Invoices (#34323)

fix(minor): Dirty form after clicking on Get advances button

(cherry picked from commit 2feb27e399)

Co-authored-by: Marica <maricadsouza221197@gmail.com>
2023-03-07 15:47:54 +05:30
mergify[bot]
71a281fb11 fix: Performance improvement when adding a new item (#34195)
fix: Performance improvement when adding a new item

(cherry picked from commit 49af5ba434)

Co-authored-by: HarryPaulo <paulo_fabris@hotmail.com>
Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-07 15:46:18 +05:30
mergify[bot]
64c758d0c0 fix: Default sales team not getting set (#34284)
fix: Default sales team not getting set (#34284)

(cherry picked from commit 7d0199d743)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-07 15:45:43 +05:30
mergify[bot]
480797e856 fix: Do not calculate commission post submit (#34267)
fix: Do not calculate commission post submit (#34267)

* fix: Do not calculate commision post submit

* chore: Update condition to match server side logic

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>

---------

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
(cherry picked from commit 10632d75b0)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-07 15:44:15 +05:30
mergify[bot]
ca59c699cd fix: Payment Request against sales order with disabled rounded total (#34281)
fix: Payment Request against sales order with disabled rounded total (#34281)

* fix: Payment Request against sales order with disabled rounded total

* chore: Do not consider advance amount

(cherry picked from commit ea8e23384d)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-03-07 13:34:25 +05:30
mergify[bot]
9b84e1e39c chore: add german translations (#34167)
chore: add german translations (#34167)

* chore: add german translations

* Apply suggestions from code review

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>

---------

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
(cherry picked from commit bbb6a62a7d)

Co-authored-by: Patrick Eissler <77415730+PatrickDenis-stack@users.noreply.github.com>
Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-03-07 11:45:51 +05:30
rohitwaghchaure
cfb93b6c58 Merge pull request #34316 from frappe/mergify/bp/version-14-hotfix/pr-34305
fix: BOM Update log not completed (backport #34305)
2023-03-07 08:39:09 +05:30
Rohit Waghchaure
235ecca9fa fix: BOM Update log not completed
(cherry picked from commit 2f157fa5d3)
2023-03-06 17:54:50 +00:00
Sagar Sharma
c49be03d0f Merge pull request #34300 from frappe/mergify/bp/version-14-hotfix/pr-34299
fix: Stock Reconciliation `actual_qty` (backport #34299)
2023-03-04 18:00:33 +05:30
s-aga-r
d97c1bf0f4 fix: Stock Reconciliation actual_qty
(cherry picked from commit 70de444b7b)
2023-03-04 12:05:49 +00:00
Sagar Sharma
2f74427132 Merge pull request #34294 from frappe/mergify/bp/version-14-hotfix/pr-34293
fix: `Inventory Dimension` for `Stock Reconciliation` (backport #34293)
2023-03-04 16:49:59 +05:30
s-aga-r
ab737424c2 fix: update inventory dimensions before returning sle 2023-03-04 16:07:59 +05:30
s-aga-r
b08cdc00f2 fix: Inventory Dimension for Stock Reconciliation
(cherry picked from commit 0e1b7760a8)
2023-03-03 20:43:56 +00:00
Deepesh Garg
829bbdd5c5 Merge pull request #34280 from frappe/mergify/bp/version-14-hotfix/pr-34258
chore: Make finance book read only (backport #34258)
2023-03-03 11:09:13 +05:30
Deepesh Garg
1cdf7e0988 chore: Make finance book read only
(cherry picked from commit 28dd1a25cb)
2023-03-02 11:18:42 +00:00
Sagar Sharma
fa1b25d0f2 Merge pull request #34278 from frappe/mergify/bp/version-14-hotfix/pr-34117
refactor: rewrite `get_item_details.py` queries in `QB` (backport #34117)
2023-03-02 15:25:12 +05:30
s-aga-r
731dc4cdd9 chore: Linters
(cherry picked from commit 58c027d4cc)
2023-03-02 09:25:38 +00:00
s-aga-r
dea5290d81 refactor: remove method get_serial_no_batchwise from get_item_details.py
(cherry picked from commit 35489fbbf9)
2023-03-02 09:25:38 +00:00
s-aga-r
1e086db7c7 refactor: rewrite get_item_details.py queries in QB
(cherry picked from commit 6b144baa69)
2023-03-02 09:25:38 +00:00
Frappe PR Bot
a59c580480 chore(release): Bumped to Version 14.17.4
## [14.17.4](https://github.com/frappe/erpnext/compare/v14.17.3...v14.17.4) (2023-03-02)

### Bug Fixes

* `rejected_serial_no` not getting copied from PR to PR(Return) ([9930adc](9930adcd28))
* `Serial No is mandatory` even if the `qty` is `0` ([7629caa](7629caa647))
2023-03-02 08:08:44 +00:00
Sagar Sharma
ba1cfa992d Merge pull request #34277 from frappe/mergify/bp/version-14/pr-34275
fix: `rejected_serial_no` not getting copied from PR to PR(Return) (backport #34273) (backport #34275)
2023-03-02 13:34:32 +05:30
s-aga-r
7629caa647 fix: Serial No is mandatory even if the qty is 0
(cherry picked from commit cb0b6de4b9)
(cherry picked from commit aa6b891ef0)
2023-03-02 07:35:46 +00:00
s-aga-r
9930adcd28 fix: rejected_serial_no not getting copied from PR to PR(Return)
(cherry picked from commit a9f0a11ce6)
(cherry picked from commit 3db82587eb)
2023-03-02 07:35:45 +00:00
Sagar Sharma
ab8ea2371b Merge pull request #34275 from frappe/mergify/bp/version-14-hotfix/pr-34273
fix: `rejected_serial_no` not getting copied from PR to PR(Return) (backport #34273)
2023-03-02 13:04:51 +05:30
s-aga-r
aa6b891ef0 fix: Serial No is mandatory even if the qty is 0
(cherry picked from commit cb0b6de4b9)
2023-03-02 07:08:15 +00:00
s-aga-r
3db82587eb fix: rejected_serial_no not getting copied from PR to PR(Return)
(cherry picked from commit a9f0a11ce6)
2023-03-02 07:08:14 +00:00
Suraj Shetty
da150e1a3c Merge pull request #34265 from frappe/mergify/bp/version-14-hotfix/pr-34262
fix(General Ledger): Wrap unexpectedly long word  (backport #34262)
2023-03-01 16:27:57 +05:30
Suraj Shetty
f6469d8398 fix: Resolve conflicts 2023-03-01 16:25:25 +05:30
Suraj Shetty
b13bf1ebc5 fix: Wrap unexpectedly long text in remark
(cherry picked from commit ba66a6714c)

# Conflicts:
#	erpnext/accounts/report/general_ledger/general_ledger.html
2023-03-01 10:53:38 +00:00
Frappe PR Bot
60a1e10b11 chore(release): Bumped to Version 14.17.3
## [14.17.3](https://github.com/frappe/erpnext/compare/v14.17.2...v14.17.3) (2023-03-01)

### Bug Fixes

* consumed qty validation for subcontracting receipt ([6ba9750](6ba97504ed))
2023-03-01 10:22:45 +00:00
rohitwaghchaure
1b578483f4 Merge pull request #34261 from frappe/mergify/bp/version-14/pr-34260
fix: consumed qty validation for subcontracting receipt (backport #34254) (backport #34260)
2023-03-01 15:41:54 +05:30
Rohit Waghchaure
6ba97504ed fix: consumed qty validation for subcontracting receipt
(cherry picked from commit b38fe24090)
(cherry picked from commit 7eccf431fd)
2023-03-01 10:10:02 +00:00
rohitwaghchaure
5e51ba2342 Merge pull request #34260 from frappe/mergify/bp/version-14-hotfix/pr-34254
fix: consumed qty validation for subcontracting receipt (backport #34254)
2023-03-01 15:39:29 +05:30
Rohit Waghchaure
7eccf431fd fix: consumed qty validation for subcontracting receipt
(cherry picked from commit b38fe24090)
2023-03-01 09:46:22 +00:00
rohitwaghchaure
0d6a2aed3e Merge pull request #34242 from frappe/mergify/bp/version-14-hotfix/pr-34235
feat: adjust purchase receipt valuation rate as per purchase invoice rate (backport #34235)
2023-02-28 22:11:21 +05:30
Frappe PR Bot
cc4448b5d5 chore(release): Bumped to Version 14.17.2
## [14.17.2](https://github.com/frappe/erpnext/compare/v14.17.1...v14.17.2) (2023-02-28)

### Bug Fixes

* conversion factor not set ([089c7d0](089c7d0a37))
* currency in coa import ([#34174](https://github.com/frappe/erpnext/issues/34174)) ([4d92d46](4d92d469e4))
* default date in Subcontracting reports ([5fce8e2](5fce8e2700))
* german translations ([#31732](https://github.com/frappe/erpnext/issues/31732)) ([88a781f](88a781fa43))
* incorrect acc depr amount if multiple FBs with straight line or manual method ([dda6bae](dda6baea3e))
* incorrect color in the BOM Stock Report ([001ed9e](001ed9e9ff))
* manual depr schedule ([971c072](971c0720e5))
* multiple pos conversion issue resolved ([db964e8](db964e8256))
* not able to repost gl entries ([ae0318e](ae0318ef74))
* permission error while calling get_work_order_items ([3ea90ee](3ea90ee5cb))
* pos return throwing amount greater than grand total ([9cd7b27](9cd7b27ce0))
* Remove missing DocField in fetch_from ([dc6ae46](dc6ae46d59))
* set `from_warehouse` and `to_warehouse` while mapping SE ([80e23d0](80e23d035e))
* **test:** use standalone method to fetch work orders from SO ([1719884](17198844c0))
* ui freeze on item selection in sales invoice ([1750ed4](1750ed4fb6))
* user shouldn't able to make item price for item template ([fb8e45d](fb8e45d3d9))
* zero division error while making LCV ([1859be6](1859be6fef))

### Performance Improvements

* fetch SLE's on demand and memoize ([db1f17e](db1f17e5bc))

### Reverts

* Revert "fix: Concurrency issues in Sales and Purchase returns" (#34202) ([9341d3e](9341d3e60e)), closes [#34202](https://github.com/frappe/erpnext/issues/34202) [#34019](https://github.com/frappe/erpnext/issues/34019)
2023-02-28 13:29:26 +00:00
ruthra kumar
60ab0d3981 Merge pull request #34238 from frappe/version-14-hotfix
chore: release v14
2023-02-28 18:57:57 +05:30
ruthra kumar
01b5ed91ba Merge pull request #34245 from frappe/mergify/bp/version-14-hotfix/pr-34241
fix: pos return throwing amount greater than grand total (backport #34241)
2023-02-28 18:32:48 +05:30
ruthra kumar
9cd7b27ce0 fix: pos return throwing amount greater than grand total
(cherry picked from commit 35c70f39fa)
2023-02-28 12:53:32 +00:00
rohitwaghchaure
521f19a044 Merge pull request #34244 from frappe/mergify/bp/version-14-hotfix/pr-34243
fix: default date in Subcontracting reports (backport #34243)
2023-02-28 18:06:34 +05:30
Rohit Waghchaure
5fce8e2700 fix: default date in Subcontracting reports
(cherry picked from commit dfddc4efc3)
2023-02-28 12:32:13 +00:00
Rohit Waghchaure
5e9f1dfbb3 fix: labels name
(cherry picked from commit a8445da02a)
2023-02-28 12:05:58 +00:00
Rohit Waghchaure
3ea1c73c07 test: added test cases
(cherry picked from commit 8e86553717)
2023-02-28 12:05:57 +00:00
Rohit Waghchaure
db033c6862 feat: adjust purchase receipt valuation rate as per purchase invoice rate
(cherry picked from commit eab775ef32)
2023-02-28 12:05:56 +00:00
Sagar Sharma
667ec983ec Merge pull request #34236 from frappe/mergify/bp/version-14-hotfix/pr-34060
fix: multiple Point of Sale conversion issue resolved (backport #34060)
2023-02-28 16:49:35 +05:30
Vishal
bbcd101613 chore: minor changes in pos_controller
(cherry picked from commit f18ae5856f)
2023-02-28 09:26:38 +00:00
Vishal
f812dbc524 chore: minor change
(cherry picked from commit a51bec0269)
2023-02-28 09:26:37 +00:00
Vishal
786eb97ab4 chore: minor changes added to code
(cherry picked from commit 3ebe7d861d)
2023-02-28 09:26:37 +00:00
Vishal
db964e8256 fix: multiple pos conversion issue resolved
(cherry picked from commit 1de531e56e)
2023-02-28 09:26:36 +00:00
ruthra kumar
3117758575 Merge pull request #34219 from frappe/mergify/bp/version-14-hotfix/pr-34207
fix: permission error while calling get_work_order_items (backport #34207)
2023-02-28 10:16:36 +05:30
Sagar Sharma
7797645583 Merge pull request #34226 from frappe/mergify/bp/version-14-hotfix/pr-34225
fix: set `from_warehouse` and `to_warehouse` while mapping SE (backport #34225)
2023-02-27 13:21:03 +05:30
s-aga-r
80e23d035e fix: set from_warehouse and to_warehouse while mapping SE
(cherry picked from commit c09a61f360)
2023-02-27 07:23:21 +00:00
mergify[bot]
4d92d469e4 fix: currency in coa import (#34174)
* fix: currency in coa import

(cherry picked from commit 19c0b7a523)

* chore: change column label

(cherry picked from commit e3c000d0be)

---------

Co-authored-by: vishnu <vishnuviswambaran2002@gmail.com>
2023-02-27 12:19:12 +05:30
Sagar Sharma
14c248cfbc Merge pull request #34223 from frappe/mergify/bp/version-14-hotfix/pr-34212
fix: Remove missing DocField in fetch_from (backport #34212)
2023-02-27 12:15:43 +05:30
Brian Pond
dc6ae46d59 fix: Remove missing DocField in fetch_from
(cherry picked from commit 83f3e317e1)
2023-02-27 06:24:24 +00:00
mergify[bot]
88a781fa43 fix: german translations (#31732)
fix: german translations (#31732)

(cherry picked from commit 6b510546ae)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-02-27 11:50:45 +05:30
Sagar Sharma
dd0876da17 Merge pull request #34208 from frappe/mergify/bp/version-14-hotfix/pr-34206
fix: not able to repost gl entries (backport #34206)
2023-02-27 10:27:00 +05:30
Sagar Sharma
e93bc94f0b Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34206 2023-02-27 10:26:45 +05:30
ruthra kumar
17198844c0 fix(test): use standalone method to fetch work orders from SO
(cherry picked from commit a11d3327df)
2023-02-27 04:33:17 +00:00
ruthra kumar
3ea90ee5cb fix: permission error while calling get_work_order_items
(cherry picked from commit b6bad728cd)
2023-02-27 04:33:17 +00:00
Anand Baburajan
a9b8187dd0 Merge pull request #34205 from AnandBaburajan/manual_asset_schedule
fix: asset manual depr schedule
2023-02-26 20:07:50 +05:30
anandbaburajan
d56ca011fe chore: refactor long if conditions 2023-02-26 15:03:16 +05:30
anandbaburajan
75386e3653 chore: should prepare schedule if not draft 2023-02-25 21:17:18 +05:30
anandbaburajan
dda6baea3e fix: incorrect acc depr amount if multiple FBs with straight line or manual method 2023-02-25 14:43:24 +05:30
Rohit Waghchaure
ae0318ef74 fix: not able to repost gl entries
(cherry picked from commit 7d10dd9ea8)
2023-02-24 15:41:25 +00:00
anandbaburajan
b0d670a51d chore: handle change in opening_accumulated_depreciation properly 2023-02-24 20:35:29 +05:30
Anand Baburajan
e0ad1a305e Merge branch 'version-14-hotfix' into manual_asset_schedule 2023-02-24 18:14:03 +05:30
rohitwaghchaure
dddbfba6da Merge pull request #34200 from frappe/mergify/bp/version-14-hotfix/pr-34199
fix: conversion factor not set (backport #34199)
2023-02-24 17:53:03 +05:30
Anand Baburajan
149043e8d4 Merge branch 'version-14-hotfix' into manual_asset_schedule 2023-02-24 16:48:43 +05:30
anandbaburajan
971c0720e5 fix: manual depr schedule 2023-02-24 16:38:39 +05:30
Frappe PR Bot
cb266cd1c6 chore(release): Bumped to Version 14.17.1
## [14.17.1](https://github.com/frappe/erpnext/compare/v14.17.0...v14.17.1) (2023-02-24)

### Reverts

* Revert "fix: Concurrency issues in Sales and Purchase returns" (#34202) ([3c2e21e](3c2e21e2ae)), closes [#34202](https://github.com/frappe/erpnext/issues/34202) [#34019](https://github.com/frappe/erpnext/issues/34019)
2023-02-24 10:07:56 +00:00
Deepesh Garg
d6d1238974 Merge pull request #34204 from frappe/mergify/bp/version-14/pr-34203
Revert "fix: Concurrency issues in Sales and Purchase returns" (backport #34202) (backport #34203)
2023-02-24 15:36:02 +05:30
Deepesh Garg
3c2e21e2ae Revert "fix: Concurrency issues in Sales and Purchase returns" (#34202)
Revert "fix: Concurrency issues in Sales and Purchase returns (#34019)"

This reverts commit a67284e96d.

(cherry picked from commit e26c6dc76b)
(cherry picked from commit 9341d3e60e)
2023-02-24 10:03:47 +00:00
Deepesh Garg
c6a46bc184 Merge pull request #34203 from frappe/mergify/bp/version-14-hotfix/pr-34202
Revert "fix: Concurrency issues in Sales and Purchase returns" (backport #34202)
2023-02-24 15:32:00 +05:30
Deepesh Garg
9341d3e60e Revert "fix: Concurrency issues in Sales and Purchase returns" (#34202)
Revert "fix: Concurrency issues in Sales and Purchase returns (#34019)"

This reverts commit a67284e96d.

(cherry picked from commit e26c6dc76b)
2023-02-24 09:58:40 +00:00
Rohit Waghchaure
089c7d0a37 fix: conversion factor not set
(cherry picked from commit 8e46aebc50)
2023-02-24 09:27:37 +00:00
rohitwaghchaure
230e345732 Merge pull request #34190 from frappe/mergify/bp/version-14-hotfix/pr-34189
fix: user shouldn't able to make item price for item template (backport #34189)
2023-02-24 09:23:22 +05:30
Rohit Waghchaure
fb8e45d3d9 fix: user shouldn't able to make item price for item template
(cherry picked from commit 6417ae0ee8)
2023-02-23 15:18:43 +00:00
rohitwaghchaure
b2582c56b7 Merge pull request #34177 from frappe/mergify/bp/version-14-hotfix/pr-34173
fix: incorrect color in the BOM Stock Report (backport #34173)
2023-02-23 20:47:24 +05:30
ruthra kumar
908d2f687e Merge pull request #34184 from frappe/mergify/bp/version-14-hotfix/pr-34022
perf: Gross Profit report will fetch SLE's on demand and memoize (backport #34022)
2023-02-23 12:54:25 +05:30
ruthra kumar
204f9a414f refactor: use docstatus from Delivery Note Item
(cherry picked from commit 88d888d9d0)
2023-02-23 06:26:15 +00:00
ruthra kumar
db1f17e5bc perf: fetch SLE's on demand and memoize
(cherry picked from commit 3e5691072a)
2023-02-23 06:26:15 +00:00
rohitwaghchaure
292f7c57c5 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34173 2023-02-23 11:36:34 +05:30
rohitwaghchaure
b0103b85a0 Merge pull request #34181 from frappe/mergify/bp/version-14-hotfix/pr-34172
fix: zero division error while making LCV (backport #34172)
2023-02-23 11:25:03 +05:30
Rohit Waghchaure
1859be6fef fix: zero division error while making LCV
(cherry picked from commit 80e94a08cf)
2023-02-23 05:24:58 +00:00
ruthra kumar
b37695f2f3 Merge pull request #34180 from frappe/mergify/bp/version-14-hotfix/pr-34176
fix: ui freeze upon item selection in sales invoice (backport #34176)
2023-02-23 10:52:32 +05:30
ruthra kumar
1750ed4fb6 fix: ui freeze on item selection in sales invoice
(cherry picked from commit 6412583e98)
2023-02-23 05:06:51 +00:00
Rohit Waghchaure
001ed9e9ff fix: incorrect color in the BOM Stock Report
(cherry picked from commit a8f03ebf7f)
2023-02-23 04:25:45 +00:00
Frappe PR Bot
0d986a2ac4 chore(release): Bumped to Version 14.17.0
# [14.17.0](https://github.com/frappe/erpnext/compare/v14.16.1...v14.17.0) (2023-02-21)

### Bug Fixes

* asset repair status after deletion and asset status after manual depr entry ([03f07a2](03f07a20e7))
* asset_depreciation_and_balances report doesn't reflect manual depr entries ([1535c3d](1535c3d856))
* change parameter name for letter head ([4f37ba9](4f37ba9cfe))
* check for duplicate in pos closing and pos merge log entry ([05d6490](05d649087b))
* consider rounded total amount while making payment request ([#34110](https://github.com/frappe/erpnext/issues/34110)) ([7879564](78795643cc))
* create `Delivery Trip` from `Delivery Note` list ([ba5ea88](ba5ea886cf))
* differency entry journal debit/credit missing ([#34104](https://github.com/frappe/erpnext/issues/34104)) ([7556739](75567391a7))
* Filters in item-wise sales history report ([#34145](https://github.com/frappe/erpnext/issues/34145)) ([44c837f](44c837f862))
* fiscal year error for existing assets in fixed asset register ([7074c2b](7074c2b161))
* forced delete linked desktop_icons (backport [#34107](https://github.com/frappe/erpnext/issues/34107)) ([#34130](https://github.com/frappe/erpnext/issues/34130)) ([53ab4d9](53ab4d92e8))
* ignore repost payment ledger on basic documents cancellation ([#34054](https://github.com/frappe/erpnext/issues/34054)) ([9890cce](9890cce680))
* incorrect consumed qty in subcontracting receipt ([d5f6a5d](d5f6a5d193))
* inventory dimension filter not overriding with existing filter for stock ledger report ([6959283](6959283893))
* linters issue ([f65e471](f65e471a75))
* opening_accumulated_depreciation and precision in charts ([47cc8ab](47cc8ab6c6))
* purchase invoice performance issue ([8d98599](8d98599a6c))
* rename duplicate field name with same type into a DocType to avoid import Error ([#34053](https://github.com/frappe/erpnext/issues/34053)) ([d783168](d7831685af))
* show Purchase Order Portal `Pay` button based on configuration ([84da0c6](84da0c6f1e))
* update `reserved_qty` when `Sales Order` marked as `Hold` ([15898cc](15898cc2ec))
* Use normal rounding for Tax Withholding Category ([#34114](https://github.com/frappe/erpnext/issues/34114)) ([65aec3e](65aec3e4ff))
* **ux:** `ReferenceError: me is not defined` Delivery Note ([7bd04c2](7bd04c27c8))

### Features

* allow to make in transit transfer entry from material request ([a7b682e](a7b682e26b))
* Editable Sales Invoice ([#32625](https://github.com/frappe/erpnext/issues/32625)) ([00eb632](00eb6329a7))
* provision to convert transaction based reposting to item warehouse based reposting ([72c0b22](72c0b2208f))
* translate fixtures during runtime, not installation ([#33996](https://github.com/frappe/erpnext/issues/33996)) ([d117de7](d117de7813))
2023-02-21 17:17:32 +00:00
Deepesh Garg
9aa25c4373 Merge pull request #34161 from frappe/version-14-hotfix
chore: release v14
2023-02-21 22:45:54 +05:30
ruthra kumar
9c43e3a721 Merge pull request #34164 from frappe/mergify/bp/version-14-hotfix/pr-34102
fix: check for duplicate pos invoices in closing entry (backport #34102)
2023-02-21 20:03:08 +05:30
ruthra kumar
05d649087b fix: check for duplicate in pos closing and pos merge log entry
(cherry picked from commit 47add0b751)
2023-02-21 13:16:33 +00:00
mergify[bot]
74a3588e04 patch: reorder migration patches (#34071)
chore: reorder migration patches.

'migrate_gl_to_payment_ledger',
'migrate_remarks_from_gl_to_payment_ledger' should always run last.

(cherry picked from commit 68202639f5)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-21 15:34:24 +05:30
mergify[bot]
0bd765b8ca refactor: clear records in batches in 'Transaction Deletion Record' (#34109)
refactor: clear records in batches in 'Transaction Deletion Record' (#34109)

refactor: clear records in batches
(cherry picked from commit 4a7b1de2d8)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-21 15:06:45 +05:30
mergify[bot]
44c837f862 fix: Filters in item-wise sales history report (#34145)
fix: Filters in item-wise sales history report (#34145)

(cherry picked from commit c88444a6c4)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-21 15:06:00 +05:30
mergify[bot]
65aec3e4ff fix: Use normal rounding for Tax Withholding Category (#34114)
fix: Use normal rounding for Tax Withholding Category (#34114)

(cherry picked from commit 35cdd996a9)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-21 14:22:57 +05:30
mergify[bot]
00eb6329a7 feat: Editable Sales Invoice (#32625)
* feat: Editable Sales Invoice

(cherry picked from commit 30da6ab2c1)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json

* chore: Update allow on submit for Sales Invoice fields

(cherry picked from commit e626107d3d)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json

* chore: Break into smaller functions

(cherry picked from commit 42e4c37f15)

* chore: Update allow on submit fields

(cherry picked from commit 1105e52031)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json

* test: Add unit tests

(cherry picked from commit ed98015a56)

* chore: Update tests

(cherry picked from commit 1a980123a2)

* chore: Reset repost_required_flag on cancel

(cherry picked from commit 0966867c08)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.py

* chore: Enable no-copy for repost required field

(cherry picked from commit 5fe55176ec)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json

* chore: Validate for deferred revenue invoices

(cherry picked from commit e29f756146)

* chore: Resolve conflicts

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-21 14:21:36 +05:30
Anand Baburajan
ce817e97eb Merge pull request #34155 from frappe/mergify/bp/version-14-hotfix/pr-34153
fix: fiscal year error for existing assets in fixed asset register (backport #34153)
2023-02-21 14:18:21 +05:30
anandbaburajan
7074c2b161 fix: fiscal year error for existing assets in fixed asset register
(cherry picked from commit 76861eb332)
2023-02-21 08:25:46 +00:00
Sagar Sharma
0de0501a48 Merge pull request #34146 from frappe/mergify/bp/version-14-hotfix/pr-34138
fix(ux): `ReferenceError: me is not defined` Delivery Note (backport #34138)
2023-02-21 10:31:17 +05:30
s-aga-r
bc86b6977f chore: Linters
(cherry picked from commit 44ee9f0f19)
2023-02-21 04:57:41 +00:00
s-aga-r
7bd04c27c8 fix(ux): ReferenceError: me is not defined Delivery Note
(cherry picked from commit 1b010add26)
2023-02-21 04:57:40 +00:00
rohitwaghchaure
92dee9e1cf Merge pull request #34141 from frappe/mergify/bp/version-14-hotfix/pr-34139
fix: inventory dimension filter not overriding with existing filter for stock ledger report (backport #34139)
2023-02-20 13:38:54 +05:30
rohitwaghchaure
3c0500efb7 Merge pull request #34140 from frappe/mergify/bp/version-14-hotfix/pr-33722
fix: purchase invoice performance issue (backport #33722)
2023-02-20 13:17:44 +05:30
Rohit Waghchaure
6959283893 fix: inventory dimension filter not overriding with existing filter for stock ledger report
(cherry picked from commit 0e388ba872)
2023-02-20 07:35:16 +00:00
Rohit Waghchaure
8d98599a6c fix: purchase invoice performance issue
(cherry picked from commit 92d857d49c)
2023-02-20 07:18:11 +00:00
mergify[bot]
75567391a7 fix: differency entry journal debit/credit missing (#34104)
fix: differency entry journal debit/credit missing (#34104)

* fix: difference entry journal is wrong

* fix: difference entry journal is wrong

(cherry picked from commit 183e42af1a)

Co-authored-by: Alirio Castro <aliriocastro@gmail.com>
2023-02-19 20:50:56 +05:30
mergify[bot]
9890cce680 fix: ignore repost payment ledger on basic documents cancellation (#34054)
fix: ignore repost payment ledger on basic documents cancellation (#34054)

fix: ignore repost payment ledger on cancel/delete of Inv/Pay/JE's

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit c722f2819c)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-19 20:50:37 +05:30
mergify[bot]
78795643cc fix: consider rounded total amount while making payment request (#34110)
fix: consider rounded total amount while making payment request (#34110)

(cherry picked from commit 9c6466f15b)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-19 13:38:02 +05:30
mergify[bot]
53ab4d92e8 fix: forced delete linked desktop_icons (backport #34107) (#34130)
fix: forced delete linked desktop_icons (#34107)

* fix: forced delete linked desktop_icons

* fix: black

(cherry picked from commit 5e48e61c66)

Co-authored-by: Shadrak Gurupnor <30501401+shadrak98@users.noreply.github.com>
2023-02-19 12:08:12 +05:30
rohitwaghchaure
ced7860d1b Merge pull request #34124 from frappe/mergify/bp/version-14-hotfix/pr-34115
feat: provision to convert transaction based reposting to item wareho… (backport #34115)
2023-02-18 23:17:55 +05:30
Rohit Waghchaure
72c0b2208f feat: provision to convert transaction based reposting to item warehouse based reposting
(cherry picked from commit f1383b5ef9)
2023-02-18 16:02:12 +00:00
Sagar Sharma
529d5f3d05 Merge pull request #34118 from frappe/mergify/bp/version-14-hotfix/pr-34077
fix: show Purchase Order Portal `Pay` button based on configuration (backport #34077)
2023-02-18 13:16:43 +05:30
s-aga-r
84da0c6f1e fix: show Purchase Order Portal Pay button based on configuration
(cherry picked from commit 20bdc63b03)
2023-02-18 06:51:14 +00:00
s-aga-r
05f7fb8fa1 chore: add field show_pay_button in Buying Settings
(cherry picked from commit d7ef5ad955)
2023-02-18 06:51:13 +00:00
Anand Baburajan
dbf39a7ff3 Merge pull request #34112 from AnandBaburajan/asset_fixes_17_feb_v14
fix: repair status after deletion, asset status after manual depr entry and other misc bugs [v14]
2023-02-17 16:13:17 +05:30
anandbaburajan
03f07a20e7 fix: asset repair status after deletion and asset status after manual depr entry 2023-02-17 15:32:55 +05:30
Sagar Sharma
48f6cc09c1 Merge pull request #34098 from frappe/mergify/bp/version-14-hotfix/pr-34091
fix: incorrect consumed qty in subcontracting receipt (backport #34091)
2023-02-16 17:29:06 +05:30
Rohit Waghchaure
d5f6a5d193 fix: incorrect consumed qty in subcontracting receipt
(cherry picked from commit 156e45970a)
2023-02-16 09:41:06 +00:00
Sagar Sharma
bafb976bbd Merge pull request #34093 from frappe/mergify/bp/version-14-hotfix/pr-34053
fix: rename duplicate field name with same type into a DocType to avoid import Error (backport #34053)
2023-02-16 14:29:12 +05:30
Sagar Sharma
1367e09f0f Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34053 2023-02-16 14:28:49 +05:30
Sagar Sharma
7fefad9f5c Merge pull request #34095 from frappe/mergify/bp/version-14-hotfix/pr-34090
chore: update `CODEOWNERS` (backport #34090)
2023-02-16 14:27:36 +05:30
Sagar Sharma
f7ea98cf44 chore: update CODEOWNERS
(cherry picked from commit e8b8c51d82)
2023-02-16 08:57:04 +00:00
s-aga-r
2fdf6ab164 chore: conflicts 2023-02-16 14:01:17 +05:30
HENRY Florian
d7831685af fix: rename duplicate field name with same type into a DocType to avoid import Error (#34053)
* fix: Delivery Note field label set

* fix: Item field label de-duplicate name

* fix: Payment Entry field label de-duplicate name

* fix: Pruicing Rule field label de-duplicate name

* fix: Project field label de-duplicate name

* fix: Timesheet field label de-duplicate name

* Update erpnext/accounts/doctype/pricing_rule/pricing_rule.json

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>

* Update erpnext/stock/doctype/item/item.json

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>

---------

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
(cherry picked from commit 4d79ffe3c6)

# Conflicts:
#	erpnext/stock/doctype/item/item.json
2023-02-16 08:17:47 +00:00
Sagar Sharma
b01da15ce2 Merge pull request #34087 from frappe/mergify/bp/version-14-hotfix/pr-34086
fix: create `Delivery Trip` from `Delivery Note` list (backport #34086)
2023-02-15 22:44:58 +05:30
s-aga-r
ba5ea886cf fix: create Delivery Trip from Delivery Note list
(cherry picked from commit 6c6195bae6)
2023-02-15 17:11:41 +00:00
Sagar Sharma
702a3e5ce1 Merge pull request #34085 from frappe/mergify/bp/version-14-hotfix/pr-34080
chore: copy `item_code` to `Batch` while creating new batch from SCR (backport #34080)
2023-02-15 21:48:20 +05:30
s-aga-r
72e17e3267 chore: copy item_code to Batch while creating new batch from SCR
(cherry picked from commit ffa9c6e4d9)
2023-02-15 16:10:57 +00:00
Frappe PR Bot
e82c101b13 chore(release): Bumped to Version 14.16.1
## [14.16.1](https://github.com/frappe/erpnext/compare/v14.16.0...v14.16.1) (2023-02-15)

### Bug Fixes

* asset_depreciation_and_balances report doesn't reflect manual depr entries ([7692db2](7692db27bd))
* opening_accumulated_depreciation and precision in charts ([4a209fc](4a209fcb7c))
2023-02-15 10:33:52 +00:00
Anand Baburajan
a934cf0d92 Merge pull request #34074 from frappe/mergify/bp/version-14/pr-34058
fix: manual depr entries in asset_depreciations_and_balances report and some misc bugs [v14] (backport #34058)
2023-02-15 16:02:16 +05:30
anandbaburajan
7692db27bd fix: asset_depreciation_and_balances report doesn't reflect manual depr entries
(cherry picked from commit 1535c3d856)
2023-02-15 08:36:28 +00:00
anandbaburajan
be2ddd1536 chore: break look if je processed
(cherry picked from commit a220dc0c9c)
2023-02-15 08:36:28 +00:00
anandbaburajan
4a209fcb7c fix: opening_accumulated_depreciation and precision in charts
(cherry picked from commit 47cc8ab6c6)
2023-02-15 08:36:28 +00:00
Anand Baburajan
09f5e290a3 Merge pull request #34058 from AnandBaburajan/more_asset_bug_fixes_v14
fix: manual depr entries in asset_depreciations_and_balances report and some misc bugs [v14]
2023-02-15 12:33:30 +05:30
Anand Baburajan
8d61404a5b Merge branch 'version-14-hotfix' into more_asset_bug_fixes_v14 2023-02-15 11:55:52 +05:30
rohitwaghchaure
bc8cf10e39 Merge pull request #34070 from frappe/mergify/bp/version-14-hotfix/pr-34065
fix: change parameter name for letter head (backport #34065)
2023-02-15 10:08:30 +05:30
rohitwaghchaure
eb300f52d9 Merge pull request #34069 from frappe/mergify/bp/version-14-hotfix/pr-34061
feat: allow to make in transit transfer entry from material request (backport #34061)
2023-02-15 09:57:30 +05:30
barredterra
bb174f931d test: download RFQ PDF
(cherry picked from commit d5b7f2e49e)
2023-02-15 04:01:57 +00:00
barredterra
1e2611fb1e refactor: download RFQ PDF
(cherry picked from commit 8e40c04494)
2023-02-15 04:01:56 +00:00
barredterra
4f37ba9cfe fix: change parameter name for letter head
To match changes from https://github.com/frappe/frappe/pull/19627

(cherry picked from commit f7fd30fecf)
2023-02-15 04:01:56 +00:00
rohitwaghchaure
f65e471a75 fix: linters issue 2023-02-15 09:28:56 +05:30
Rohit Waghchaure
a7b682e26b feat: allow to make in transit transfer entry from material request
(cherry picked from commit 5b6128848f)
2023-02-15 03:39:12 +00:00
Anand Baburajan
a3f96652d4 Merge pull request #34062 from frappe/mergify/bp/version-14-hotfix/pr-34059
chore: add anand to asset's codeowner (backport #34059)
2023-02-14 20:16:52 +05:30
anandbaburajan
dbd4466817 chore: add anand to asset's codeowner
(cherry picked from commit d003370f61)
2023-02-14 14:21:38 +00:00
Anand Baburajan
25951debb5 Merge branch 'version-14-hotfix' into more_asset_bug_fixes_v14 2023-02-14 18:14:14 +05:30
anandbaburajan
1535c3d856 fix: asset_depreciation_and_balances report doesn't reflect manual depr entries 2023-02-14 17:54:51 +05:30
Sagar Sharma
2bc12d478b Merge pull request #34055 from frappe/mergify/bp/version-14-hotfix/pr-34018
fix: update `reserved_qty` when `Sales Order` marked as `Hold` (backport #34018)
2023-02-14 17:41:01 +05:30
Sagar Sharma
7dff06a0f6 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-34018 2023-02-14 17:40:48 +05:30
Deepesh Garg
1f6474d5ab Merge pull request #34047 from frappe/mergify/bp/version-14-hotfix/pr-33996
feat: translate fixtures during runtime, not installation (backport #33996)
2023-02-14 16:57:29 +05:30
s-aga-r
15898cc2ec fix: update reserved_qty when Sales Order marked as Hold
(cherry picked from commit d76759e066)
2023-02-14 11:22:52 +00:00
Frappe PR Bot
26c9782960 chore(release): Bumped to Version 14.16.0
# [14.16.0](https://github.com/frappe/erpnext/compare/v14.15.1...v14.16.0) (2023-02-14)

### Bug Fixes

* `amount` in `Material Request` ([f1dd923](f1dd923a50))
* `get_picked_items_details` ([7afbd92](7afbd9201d))
* `pymysql.err.ProgrammingError` ([aa3dd33](aa3dd33f56))
* Add missing 1 required positional argument: 'bill_date' ([ced9274](ced9274d1b))
* add payment hook to point of sale JS ([#33988](https://github.com/frappe/erpnext/issues/33988)) ([49fd712](49fd712966))
* allow PI cancel if linked asset is cancelled ([c98b2b5](c98b2b5918))
* Amount for debit and credit notes with 0 qty line items ([#33902](https://github.com/frappe/erpnext/issues/33902)) ([87a8c17](87a8c17314))
* Amount validation in Payment Request against Purchase Order ([#34042](https://github.com/frappe/erpnext/issues/34042)) ([c7c6123](c7c61239a3))
* BOM import failed as importer use same label field for Raw MaterialsItem table and Scrap Item table ([47d17f4](47d17f4136))
* Concurrency issues in Sales and Purchase returns ([#34019](https://github.com/frappe/erpnext/issues/34019)) ([087333a](087333abcb))
* consider `stock_qty` if `picked_qty` is zero ([df72e4a](df72e4a221))
* consider existing pick list ([466a791](466a791f68))
* currency formatting in item-wise sales history ([#33903](https://github.com/frappe/erpnext/issues/33903)) ([8e2d7bb](8e2d7bb44a))
* default due_date was wrong calculated on template "_Test Payment Term Template 1" (last day of next month) ([c8c9c50](c8c9c50993))
* **ecommerce:** throw invalid doctype error in shop by category ([#33901](https://github.com/frappe/erpnext/issues/33901)) ([1d0e71b](1d0e71bfe5))
* failed test, convert date time to string ([7228a49](7228a492ef))
* german chart of accounts "SKR03" ([#33909](https://github.com/frappe/erpnext/issues/33909)) ([02c4c55](02c4c55adc))
* Ignore mandatory fields while creating tax templates for new companies ([#34005](https://github.com/frappe/erpnext/issues/34005)) ([b0ed3c8](b0ed3c8aed))
* Ignore Payment Ledger Entry on dunning cancel (backport [#34025](https://github.com/frappe/erpnext/issues/34025)) ([#34028](https://github.com/frappe/erpnext/issues/34028)) ([699e93e](699e93e17f))
* incorrect actual qty in Bin ([01ff6a1](01ff6a1f19))
* IntegrityError while cancelling journals against cr note ([c71d035](c71d03555f))
* list view for Terms and Conditions ([#33925](https://github.com/frappe/erpnext/issues/33925)) ([bb8e232](bb8e232aea))
* negative stock error ([e0cd6c2](e0cd6c20a3))
* set per_billed based on hours when amounts are zero ([#33984](https://github.com/frappe/erpnext/issues/33984)) ([5270fbe](5270fbe01a))
* should never get cutomer price on purchase document ([#34002](https://github.com/frappe/erpnext/issues/34002)) ([6fe7600](6fe7600844)), closes [#33998](https://github.com/frappe/erpnext/issues/33998)
* stock entry from item dashboard (stock levels) ([04a474d](04a474d0a1))
* **test:** `test_pick_list_for_items_with_multiple_UOM()` ([7124c0c](7124c0ca30))
* unwanted difference amount calculation on cr note and invoice with same currency ([#34020](https://github.com/frappe/erpnext/issues/34020)) ([cbafc51](cbafc51e75))

### Features

* Add filters in Loan Interest Report ([#33907](https://github.com/frappe/erpnext/issues/33907)) ([52bfb66](52bfb66729))
* add incoterm named place to RFQ ([68a1615](68a1615eae))
* mandatory and mandatory depends on in inventory dimension ([3aca84c](3aca84c43f))
* Setting to allow Sales Order creation against expired quotation ([#33952](https://github.com/frappe/erpnext/issues/33952)) ([4d0e27e](4d0e27ed2b))

### Performance Improvements

* reduce memory usage by paging through records ([3ce8dc7](3ce8dc70cb))
* reduce memory usage while migrating remarks ([c191a3f](c191a3f7c6))
2023-02-14 10:38:44 +00:00
Deepesh Garg
7dee5207df Merge pull request #34051 from frappe/version-14-hotfix
chore: release v14
2023-02-14 16:06:52 +05:30
rohitwaghchaure
e214a336be Merge pull request #34049 from frappe/mergify/bp/version-14-hotfix/pr-34046
fix: BOM import failed as use same label field for Raw Materials Item table and Scrap Item table (backport #34046)
2023-02-14 11:55:29 +05:30
Florian HENRY
47d17f4136 fix: BOM import failed as importer use same label field for Raw MaterialsItem table and Scrap Item table
(cherry picked from commit 86be259341)
2023-02-14 05:00:25 +00:00
Raffael Meyer
d117de7813 feat: translate fixtures during runtime, not installation (#33996)
feat: install untranslated fixtures from files

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 770369e5c1)
2023-02-14 04:00:23 +00:00
mergify[bot]
6fe7600844 fix: should never get cutomer price on purchase document (#34002)
fix: should never get cutomer price on purchase document (#34002)

* fix: never get cutomer price on purchase document

chores: syntax

chore: typo in stock_entry get_uom_details (#33998)

fix: typo in stock_entry get_uom_details

chores: syntax

* feat: add test for get_item_detail price list oriented

* feat: add test for get_item_detail price price oriented

* feat: add test for get_item_detail price price oriented

* chore: clean test code

(cherry picked from commit 231fe4156f)

Co-authored-by: HENRY Florian <florian.henry@open-concept.pro>
2023-02-14 08:59:25 +05:30
mergify[bot]
c7c61239a3 fix: Amount validation in Payment Request against Purchase Order (#34042)
fix: Amount validation in Payment Request against Purchase Order (#34042)

(cherry picked from commit ce748cec3a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-14 08:59:03 +05:30
anandbaburajan
a220dc0c9c chore: break look if je processed 2023-02-13 17:28:46 +05:30
anandbaburajan
47cc8ab6c6 fix: opening_accumulated_depreciation and precision in charts 2023-02-13 17:22:54 +05:30
mergify[bot]
087333abcb fix: Concurrency issues in Sales and Purchase returns (#34019)
fix: Concurrency issues in Sales and Purchase returns (#34019)

(cherry picked from commit a67284e96d)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-13 16:30:03 +05:30
ruthra kumar
80c83f14e9 Merge pull request #34034 from frappe/mergify/bp/version-14-hotfix/pr-34021
fix: rare instances of IntegrityError while cancelling journals against cr note (backport #34021)
2023-02-13 14:59:12 +05:30
ruthra kumar
c71d03555f fix: IntegrityError while cancelling journals against cr note
(cherry picked from commit b9a7ff7c3d)
2023-02-13 08:45:18 +00:00
mergify[bot]
1540aea21d refactor: filter only immediate upcoming payment term for each SO (#33923)
refactor: filter only immediate upcoming payment term for each SO (#33923)

* fix: ignore closed or 'on hold' orders

* refactor: filter immediate upcoming term

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 192a3395a5)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-13 13:29:41 +05:30
mergify[bot]
cbafc51e75 fix: unwanted difference amount calculation on cr note and invoice with same currency (#34020)
fix: unwanted difference amount calculation on cr note and invoice with same currency (#34020)

* fix: incorrect difference amount while reconiling cr/dr notes

* fix(test): catch incorrect difference amount calculation

Fixed issues where difference amount was calculated for Cr Notes and Invoices of
the same currency.

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit e5a2b15fba)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-02-13 13:29:18 +05:30
mergify[bot]
4d0e27ed2b feat: Setting to allow Sales Order creation against expired quotation (#33952)
feat: Setting to allow Sales Order creation against expired quotation (#33952)

* feat: Setting to allow Sales Order creation against expired quotation

* chore: linting issues

(cherry picked from commit 148703bfc2)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-13 11:08:55 +05:30
mergify[bot]
699e93e17f fix: Ignore Payment Ledger Entry on dunning cancel (backport #34025) (#34028)
fix: Ignore Payment Ledger Entry on dunning cancel (#34025)

* fix: Ignore Payment Ledger Entry on dunning cancel

* chore: fix translation issue

(cherry picked from commit 48bb2c942b)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-13 10:19:19 +05:30
mergify[bot]
1d0e71bfe5 fix(ecommerce): throw invalid doctype error in shop by category (#33901)
fix(ecommerce): throw invalid doctype error in shop by category (#33901)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit 0df28c7174)

Co-authored-by: Sabu Siyad <hello@ssiyad.com>
2023-02-12 13:35:54 +05:30
mergify[bot]
49fd712966 fix: add payment hook to point of sale JS (#33988)
fix: add payment hook to point of sale JS (#33988)

(cherry picked from commit a0eb5e5535)

Co-authored-by: Richard Case <110036763+casesolved-co-uk@users.noreply.github.com>
2023-02-12 09:02:40 +05:30
ruthra kumar
679b16e1bc Merge pull request #33934 from frappe/mergify/bp/version-14-hotfix/pr-33777
fix(patch): reduce memory usage while migrating remarks (backport #33777)
2023-02-11 17:50:15 +05:30
ruthra kumar
24cac4ff22 Merge pull request #33935 from frappe/mergify/bp/version-14-hotfix/pr-33776
patch: reduce memory usage by paging through records (backport #33776)
2023-02-11 17:49:55 +05:30
mergify[bot]
dd31bd5254 refactor: install fixtures (#33964)
refactor: install fixtures (#33964)

* refactor: install fixtures

* style: disable semgrep for install_defaults signature

(cherry picked from commit 201573ab9a)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-02-11 16:22:26 +05:30
mergify[bot]
5270fbe01a fix: set per_billed based on hours when amounts are zero (#33984)
fix: set per_billed based on hours when amounts are zero (#33984)

* fix: set per_billed based on hours when amounts are zero

* test: calculate_percentage_billed

(cherry picked from commit e4953df4a3)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-02-11 14:54:22 +05:30
mergify[bot]
b0ed3c8aed fix: Ignore mandatory fields while creating tax templates for new companies (#34005)
fix: Ignore mandatory fields while creating tax templates for new companies (#34005)

(cherry picked from commit 0efdc6c13a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-11 12:27:06 +05:30
mergify[bot]
02c4c55adc fix: german chart of accounts "SKR03" (#33909)
fix: german chart of accounts "SKR03" (#33909)

* fix: german chart of accounts "SKR03"

- Added some missing account types and tax rates
- Added some missing accounts

* style: convert indentation to tabs

* fix: space before percentage sign

* feat: add some expense accounts

* refactor: replace unicode characters with utf-8

for better readability

* revert: add back groups for Bank and Cash accounts

Removed in 7d0d9c6900

(cherry picked from commit 3c7b460fd8)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-11 11:59:23 +05:30
mergify[bot]
8e2d7bb44a fix: currency formatting in item-wise sales history (#33903)
fix: currency formatting in item-wise sales history (#33903)

* fix(item-sales-history): currency formatting

* chore: linting issues

* fix: convert raw sql to qb

(cherry picked from commit 2cc7239dd5)

Co-authored-by: Dany Robert <danyrt@wahni.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-11 11:54:12 +05:30
mergify[bot]
87a8c17314 fix: Amount for debit and credit notes with 0 qty line items (#33902)
fix: Amount for debit and credit notes with 0 qty line items (#33902)

(cherry picked from commit 47c91324b1)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-11 11:53:47 +05:30
mergify[bot]
bb8e232aea fix: list view for Terms and Conditions (#33925)
fix: list view for Terms and Conditions (#33925)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
(cherry picked from commit ab7293bcd3)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-02-11 11:53:27 +05:30
Deepesh Garg
dc8fc813ff Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33777 2023-02-11 11:20:53 +05:30
mergify[bot]
52bfb66729 feat: Add filters in Loan Interest Report (#33907)
* feat: Add filters in Loan Interest Report (#33907)

(cherry picked from commit e478a5d0ce)

* chore: remove flaky tests

---------

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-02-11 11:20:10 +05:30
mergify[bot]
6e8a985bc6 chore: typo in stock_entry get_uom_details (backport #33998) (#34003)
chore: typo in stock_entry get_uom_details (#33998)

fix: typo in stock_entry get_uom_details
(cherry picked from commit 185c543b73)

Co-authored-by: Akshay <60477442+akshayitzme@users.noreply.github.com>
2023-02-10 20:55:03 +05:30
Anand Baburajan
eab3c41a7b Merge pull request #33962 from frappe/mergify/bp/version-14-hotfix/pr-33946
fix: allow cancelling purchase invoice if linked asset is already cancelled (backport #33946)
2023-02-05 17:11:53 +05:30
anandbaburajan
68df9ad83c chore: use continue, not break
(cherry picked from commit 3380dc5dea)
2023-02-05 10:37:40 +00:00
anandbaburajan
c98b2b5918 fix: allow PI cancel if linked asset is cancelled
(cherry picked from commit b961321de5)
2023-02-05 10:37:40 +00:00
rohitwaghchaure
18a1707df9 Merge pull request #33955 from frappe/mergify/bp/version-14-hotfix/pr-33936
fix: negative stock error (backport #33936)
2023-02-05 12:13:30 +05:30
Sagar Sharma
6f8ff6f41d Merge pull request #33958 from frappe/mergify/bp/version-14-hotfix/pr-33942
fix: stock entry from item dashboard (stock levels) (backport #33942)
2023-02-05 10:05:13 +05:30
s-aga-r
04a474d0a1 fix: stock entry from item dashboard (stock levels)
(cherry picked from commit dc0ddf8d7e)
2023-02-05 04:17:17 +00:00
Rohit Waghchaure
388cc31e9e test: test case
(cherry picked from commit 9ae7578b07)
2023-02-04 18:05:47 +00:00
Rohit Waghchaure
e0cd6c20a3 fix: negative stock error
(cherry picked from commit 6d513e2519)
2023-02-04 18:05:47 +00:00
rohitwaghchaure
6df730ce96 Merge pull request #33954 from frappe/mergify/bp/version-14-hotfix/pr-33941
fix: default due_date was wrong calculated on template "_Test Payment Term Template 1" (last day of next month) (backport #33941)
2023-02-04 23:34:32 +05:30
developsessions
d2836c16a7 style: apply results of lint run
(cherry picked from commit c8cd351b39)
2023-02-04 17:05:39 +00:00
developsessions
7228a492ef fix: failed test, convert date time to string
(cherry picked from commit 9d0096ad9e)
2023-02-04 17:05:39 +00:00
developsessions
ced9274d1b fix: Add missing 1 required positional argument: 'bill_date'
(cherry picked from commit be1f941996)
2023-02-04 17:05:38 +00:00
developsessions
76c4dc8177 style: lint wrong from position
(cherry picked from commit c80aaad437)
2023-02-04 17:05:38 +00:00
developsessions
c8c9c50993 fix: default due_date was wrong calculated on template "_Test Payment Term Template 1" (last day of next month)
(cherry picked from commit ce8a1086a7)
2023-02-04 17:05:38 +00:00
Sagar Sharma
bccfb8184e Merge pull request #33950 from frappe/mergify/bp/version-14-hotfix/pr-33940
chore: report `Warehouse wise Item Balance Age and Value` (backport #33940)
2023-02-04 18:59:28 +05:30
s-aga-r
00e93dc076 chore: add Item Name column in Warehouse wise Item Balance Age and Value report
(cherry picked from commit 56356ffbb9)
2023-02-04 07:58:41 +00:00
s-aga-r
9f3bb84990 chore: column width in Warehouse wise Item Balance Age and Value report
(cherry picked from commit d7a665cb84)
2023-02-04 07:58:41 +00:00
ruthra kumar
3ce8dc70cb perf: reduce memory usage by paging through records
While migrating GL entries to Payment Ledger, page through records using
primary key to reduce memory usage.

(cherry picked from commit fee0ca8cd9)
2023-02-02 11:19:17 +00:00
ruthra kumar
c191a3f7c6 perf: reduce memory usage while migrating remarks
Page through records using primary key

(cherry picked from commit 9bb64107c5)
2023-02-02 11:18:12 +00:00
Sagar Sharma
6e7eee7fa3 Merge pull request #33913 from frappe/mergify/bp/version-14-hotfix/pr-33910
feat: add incoterm named place to RFQ (backport #33910)
2023-02-02 10:33:15 +05:30
Sagar Sharma
bf23984b4f Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33910 2023-02-02 10:30:22 +05:30
Frappe PR Bot
171df32407 chore(release): Bumped to Version 14.15.1
## [14.15.1](https://github.com/frappe/erpnext/compare/v14.15.0...v14.15.1) (2023-02-01)

### Bug Fixes

* incorrect actual qty in Bin ([4c238f1](4c238f1871))
2023-02-01 17:46:44 +00:00
rohitwaghchaure
e927f30654 Merge pull request #33929 from frappe/mergify/bp/version-14/pr-33921
fix: incorrect actual qty in Bin (backport #33918) (backport #33921)
2023-02-01 23:15:02 +05:30
Rohit Waghchaure
4c238f1871 fix: incorrect actual qty in Bin
(cherry picked from commit f8c852c54c)
(cherry picked from commit 01ff6a1f19)
2023-02-01 16:53:09 +00:00
rohitwaghchaure
f5a0da21a7 Merge pull request #33921 from frappe/mergify/bp/version-14-hotfix/pr-33918
fix: incorrect actual qty in Bin (backport #33918)
2023-02-01 22:21:39 +05:30
Rohit Waghchaure
01ff6a1f19 fix: incorrect actual qty in Bin
(cherry picked from commit f8c852c54c)
2023-02-01 12:53:57 +00:00
barredterra
68a1615eae feat: add incoterm named place to RFQ
(cherry picked from commit 7156184933)
2023-02-01 05:11:00 +00:00
Sagar Sharma
2605e8a049 Merge pull request #33899 from frappe/mergify/bp/version-14-hotfix/pr-33715
fix: consider existing pick-list (backport #33715)
2023-01-31 16:39:44 +05:30
Sagar Sharma
9c2aba6619 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33715 2023-01-31 16:15:19 +05:30
s-aga-r
075c547184 chore: conflicts 2023-01-31 16:14:45 +05:30
Sagar Sharma
cd00962b3a Merge pull request #33897 from frappe/mergify/bp/version-14-hotfix/pr-33869
fix: `amount` in `Material Request` (backport #33869)
2023-01-31 16:02:14 +05:30
Sagar Sharma
956b45ec2a Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33869 2023-01-31 16:01:57 +05:30
rohitwaghchaure
b5baf3aa74 Merge pull request #33900 from frappe/mergify/bp/version-14-hotfix/pr-33896
feat: mandatory and mandatory depends on in inventory dimension (backport #33896)
2023-01-31 15:28:53 +05:30
Rohit Waghchaure
f47b05f58c test: added test case
(cherry picked from commit 22d0e1373b)
2023-01-31 09:49:06 +00:00
Rohit Waghchaure
3aca84c43f feat: mandatory and mandatory depends on in inventory dimension
(cherry picked from commit 423f2b5627)
2023-01-31 09:49:05 +00:00
s-aga-r
df72e4a221 fix: consider stock_qty if picked_qty is zero
(cherry picked from commit 6ffdeb1af8)
2023-01-31 09:41:20 +00:00
s-aga-r
4f56c72bed refactor: test_consider_existing_pick_list()
(cherry picked from commit 0b76a26c8a)
2023-01-31 09:41:20 +00:00
s-aga-r
cdb6abf569 test: add test cases
(cherry picked from commit bb7fe795fe)
2023-01-31 09:41:19 +00:00
s-aga-r
7124c0ca30 fix(test): test_pick_list_for_items_with_multiple_UOM()
(cherry picked from commit 207eeefc85)
2023-01-31 09:41:19 +00:00
s-aga-r
aa3dd33f56 fix: pymysql.err.ProgrammingError
(cherry picked from commit 5138ef0160)
2023-01-31 09:41:19 +00:00
s-aga-r
7afbd9201d fix: get_picked_items_details
(cherry picked from commit 7b3d496ce0)
2023-01-31 09:41:18 +00:00
s-aga-r
e8d617ada2 chore: add status field in Pick List
(cherry picked from commit be41052dc8)

# Conflicts:
#	erpnext/patches.txt
2023-01-31 09:41:18 +00:00
s-aga-r
466a791f68 fix: consider existing pick list
(cherry picked from commit b642718f08)
2023-01-31 09:41:17 +00:00
s-aga-r
140be10060 chore: add method get_picked_items_details()
(cherry picked from commit 9ae3a54ce9)
2023-01-31 09:41:17 +00:00
s-aga-r
6166a6e64f refactor: rewrite get_available_item_locations_for_serial_and_batched_item query in QB
(cherry picked from commit 57c3216683)
2023-01-31 09:41:16 +00:00
s-aga-r
d9d986a512 refactor: rewrite get_available_item_locations_for_serialized_item query in QB
(cherry picked from commit 5b76e8b193)
2023-01-31 09:41:16 +00:00
s-aga-r
167a5596cb refactor: rewrite get_available_item_locations_for_other_item query in QB
(cherry picked from commit 58dd40a2d7)
2023-01-31 09:41:15 +00:00
s-aga-r
a5d09270cb refactor: rewrite get_picked_items_qty query in QB
(cherry picked from commit 29bf787313)
2023-01-31 09:41:15 +00:00
s-aga-r
f1dd923a50 fix: amount in Material Request
(cherry picked from commit 6b781d78e0)
2023-01-31 09:15:25 +00:00
Frappe PR Bot
c8226ff642 chore(release): Bumped to Version 14.15.0
# [14.15.0](https://github.com/frappe/erpnext/compare/v14.14.0...v14.15.0) (2023-01-31)

### Bug Fixes

* Amount validation in Payment Request against Purchase Order ([#33855](https://github.com/frappe/erpnext/issues/33855)) ([5605f1e](5605f1e3ef))
* Currency symbol for tax withholding net total field ([#33850](https://github.com/frappe/erpnext/issues/33850)) ([f54e862](f54e8625f6))
* disfuctional cost center filter on Journal Entries ([#33815](https://github.com/frappe/erpnext/issues/33815)) ([58c3e16](58c3e16fec))
* disposal_was_made_on_original_schedule_date ([4586806](4586806ed1))
* double salutation on quotation print ([#33834](https://github.com/frappe/erpnext/issues/33834)) ([0fcf364](0fcf364aaa))
* Fetch commission rate from sales partner ([#33851](https://github.com/frappe/erpnext/issues/33851)) ([868c8d6](868c8d65ae))
* **gp:** fetch buying amount from dn related to so ([f5bde9c](f5bde9cf6d))
* GST Category validation broken for pos unregistered customer who dont have address. ([#33800](https://github.com/frappe/erpnext/issues/33800)) ([f124dd3](f124dd3112))
* Ignore linked JE on JE cancellation ([#33852](https://github.com/frappe/erpnext/issues/33852)) ([a0e1ee0](a0e1ee0450))
* item rate not fetching ([b98d351](b98d3514ab))
* Lead to customer creation ([#33859](https://github.com/frappe/erpnext/issues/33859)) ([44692e9](44692e9b57))
* manual depr entry not updating asset value [v14] ([#33788](https://github.com/frappe/erpnext/issues/33788)) ([f487eae](f487eae28e))
* **patch:** validation error on cost center allocation migration ([#33835](https://github.com/frappe/erpnext/issues/33835)) ([5d4967c](5d4967ceee))
* use correct filter name in `item_query` (backport [#33814](https://github.com/frappe/erpnext/issues/33814)) ([#33816](https://github.com/frappe/erpnext/issues/33816)) ([f7eabca](f7eabcafde))

### Features

* **gp:** test for inv and dn related via so ([7a793ea](7a793ea588))

### Performance Improvements

* show update items dialog ([ac2ebfb](ac2ebfbf59))
2023-01-31 06:20:11 +00:00
Deepesh Garg
cdfda06d63 Merge pull request #33873 from frappe/version-14-hotfix
chore: release v14
2023-01-31 11:48:25 +05:30
Anand Baburajan
f487eae28e fix: manual depr entry not updating asset value [v14] (#33788)
* fix: get value_after_depreciation functions and manual depr entry not updating asset value

* fix: reflect manual depr entry in chart and fixed asset register

* fix: add linked JEs in asset connections

* chore: add test

* chore: add patch and fix some things

* chore: get depreciation_expense_account properly

* chore: fix patch

* chore: fix patch

* chore: fix patch again

* chore: rename var in patch

* fix: filter assets with finance books properly

* chore: refactor get_value_after_depreciation

* chore: use dict format for filters in assets_linked_to_fb

* chore: refactor update_asset_value

* chore: sort manual depr entries
2023-01-31 10:59:38 +05:30
mergify[bot]
868c8d65ae fix: Fetch commission rate from sales partner (#33851)
fix: Fetch commission rate from sales partner (#33851)
2023-01-31 10:15:56 +05:30
ruthra kumar
670df3061a Merge pull request #33877 from frappe/mergify/bp/version-14-hotfix/pr-33736
fix(gp): fetch buying amount from dn related to so (backport #33736)
2023-01-31 09:31:20 +05:30
mergify[bot]
f54e8625f6 fix: Currency symbol for tax withholding net total field (#33850)
* fix: Currency symbol for tax withholding net total field (#33850)
2023-01-31 09:21:59 +05:30
mergify[bot]
5605f1e3ef fix: Amount validation in Payment Request against Purchase Order (#33855)
fix: Amount validation in Payment Request against Purchase Order (#33855)

fix: Amount validation in Payment Request againt Purchase Order
(cherry picked from commit a34a1f8fd2)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-31 09:20:33 +05:30
mergify[bot]
44692e9b57 fix: Lead to customer creation (#33859)
fix: Lead to customer creation (#33859)

(cherry picked from commit faecf3ee40)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-31 09:20:10 +05:30
mergify[bot]
1b79837e1b chore: Resize numeric and date columns (#33858)
chore: Resize numeric and date columns (#33858)
2023-01-31 09:19:46 +05:30
mergify[bot]
3f87a0eceb ci: bump isort to 5.12.0 (backport #33875) (#33879)
ci: bump isort to 5.12.0 (#33875)

[skip ci]

(cherry picked from commit 2bad86d8d8)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-31 08:49:43 +05:30
Anand Baburajan
5d3b2280d4 Merge pull request #33882 from AnandBaburajan/fix_disposal_was_made_on_original_schedule_date_v14
fix: disposal_was_made_on_original_schedule_date [v14]
2023-01-30 22:03:12 +05:30
Anand Baburajan
948a951c8a Merge branch 'version-14-hotfix' into fix_disposal_was_made_on_original_schedule_date_v14 2023-01-30 21:28:12 +05:30
anandbaburajan
4586806ed1 fix: disposal_was_made_on_original_schedule_date 2023-01-30 21:25:04 +05:30
Dany Robert
5caa9e2240 chore: linting issues
(cherry picked from commit d69c839369)
2023-01-30 13:36:14 +00:00
Dany Robert
7a793ea588 feat(gp): test for inv and dn related via so
(cherry picked from commit 1f6ab86a65)
2023-01-30 13:36:14 +00:00
Dany Robert
a659208ed1 chore: linting issue
(cherry picked from commit ef90e24931)
2023-01-30 13:36:13 +00:00
Dany Robert
f5bde9cf6d fix(gp): fetch buying amount from dn related to so
(cherry picked from commit e8e20da78e)
2023-01-30 13:36:13 +00:00
mergify[bot]
a0e1ee0450 fix: Ignore linked JE on JE cancellation (#33852)
fix: Ignore linked JE on JE cancellation (#33852)

(cherry picked from commit 428b099f63)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-29 21:26:06 +05:30
mergify[bot]
0fcf364aaa fix: double salutation on quotation print (#33834)
fix: double salutation on quotation print (#33834)

'lead_name' always has salutation.

(cherry picked from commit f270880735)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-01-29 17:08:30 +05:30
rohitwaghchaure
72da41ebea Merge pull request #33846 from frappe/mergify/bp/version-14-hotfix/pr-33845
fix: item rate not fetching (backport #33845)
2023-01-28 22:41:29 +05:30
Rohit Waghchaure
b98d3514ab fix: item rate not fetching
(cherry picked from commit 0d7f98b496)
2023-01-28 09:40:59 +00:00
mergify[bot]
5d4967ceee fix(patch): validation error on cost center allocation migration (#33835)
fix(patch): validation error on cost center allocation migration

If Distributed cost centers have GL postings on patch run date,
patch failes with valiation error.

(cherry picked from commit de10f2dc00)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-01-28 10:28:06 +05:30
ruthra kumar
5c28ca2b0b Merge pull request #33828 from frappe/mergify/bp/version-14-hotfix/pr-33815
fix: disfuctional cost center filter on Journal Entries (backport #33815)
2023-01-27 10:32:47 +05:30
Sagar Vora
0e0c133cd0 Merge pull request #33832 from frappe/mergify/bp/version-14-hotfix/pr-33831
perf: show update items dialog (backport #33831)
2023-01-27 04:19:49 +00:00
Devin Slauenwhite
ac2ebfbf59 perf: show update items dialog
(cherry picked from commit a835c1a418)
2023-01-27 04:18:32 +00:00
ruthra kumar
58c3e16fec fix: disfuctional cost center filter on Journal Entries (#33815)
* fix: missing cost_center filter for journal entries

* test: cost center filter on invoices, journals and payments

(cherry picked from commit b31b850db8)
2023-01-26 14:57:05 +00:00
mergify[bot]
f124dd3112 fix: GST Category validation broken for pos unregistered customer who dont have address. (#33800)
fix: GST Category validation broken for pos unregistered customer who dont have address. (#33800)

* fix: GST Category validation is given for pos customer

(cherry picked from commit c5ca8d74c4)

Co-authored-by: Vishal Dhayagude <vishdha@users.noreply.github.com>
2023-01-26 20:26:50 +05:30
Anand Baburajan
a930dab25d Merge pull request #33824 from frappe/mergify/bp/version-14-hotfix/pr-33823
chore: remove broken translation (backport #33823)
2023-01-26 13:51:55 +05:30
anandbaburajan
fc0ba2b9c8 chore: remove broken translation
(cherry picked from commit 21f425660d)
2023-01-26 08:17:12 +00:00
mergify[bot]
f7eabcafde fix: use correct filter name in item_query (backport #33814) (#33816)
fix: use correct filter name in `item_query` (#33814)

(cherry picked from commit da323cbb40)

Co-authored-by: Daizy Modi <modidaizy5217@gmail.com>
2023-01-25 17:37:57 +05:30
Ankush Menat
440e16dc10 chore: remove broken translation
[skip ci]
2023-01-25 17:36:37 +05:30
mergify[bot]
5eb84f65ef ci: documentation helper (backport #33757) (#33798)
ci: documentation helper (#33757)

refactor: documentation helper
(cherry picked from commit d155042edd)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-01-25 12:38:17 +05:30
Frappe PR Bot
9fe9d7de6b chore(release): Bumped to Version 14.14.0
# [14.14.0](https://github.com/frappe/erpnext/compare/v14.13.0...v14.14.0) (2023-01-25)

### Bug Fixes

* Better budget exceeding validation messages ([#33713](https://github.com/frappe/erpnext/issues/33713)) ([4be8375](4be8375e36))
* bom.json updated ([9469488](9469488254))
* calculate correct amount for qty == 0 ([#33739](https://github.com/frappe/erpnext/issues/33739)) ([1c1c903](1c1c903fee))
* don't add template item in sales/purchase transaction ([8c12f7f](8c12f7f2f2))
* **ecommerce:** breadcrumb: fallback to `/all-products` ([#33718](https://github.com/frappe/erpnext/issues/33718)) ([1a33324](1a33324b4a))
* fb issue in asset chart, asset split and reverse_depreciation_entry_made_after_disposal ([dffdc67](dffdc67455))
* hide with_operation on selection on fg_based and vice versa ([8ee6db3](8ee6db3b7b))
* incorrect `rate` and `amount` in MR Item ([#33547](https://github.com/frappe/erpnext/issues/33547)) ([ff731ea](ff731ea70a))
* incorrect actual qty for the packed item ([bcd1fca](bcd1fca37b))
* incorrect row order and accumulated_depreciation when schedule with multiple FBs is scrapped ([96f9b34](96f9b34b19))
* linting ([dedc9ec](dedc9ecc7c))
* local variable 'stock_rbnb' referenced before assignment ([21cf929](21cf929c7a))
* minor change in bom.js added ([19aa237](19aa23765a))
* minor changes added ([7fd8cef](7fd8cef4d3))
* **minor:** Label updates in Statement of Accounts ([#33639](https://github.com/frappe/erpnext/issues/33639)) ([8af9a2f](8af9a2fad1))
* missing constant definition ([219aa81](219aa81eb6))
* not able to change default BOM in the Subcontracting Order ([ed1aed2](ed1aed22c0))
* Patch to update reference_due_date in Journal Entry ([#33616](https://github.com/frappe/erpnext/issues/33616)) ([0740120](0740120914))
* **pricing rule:** free item duplication ([#33746](https://github.com/frappe/erpnext/issues/33746)) ([5a49884](5a49884636))
* rewrite logic for duplicate check in Item Attribute ([6544cb8](6544cb8822))
* Short closed order, receipt, and delivery note status on cancellation ([#33743](https://github.com/frappe/erpnext/issues/33743)) ([89f1eef](89f1eefe2b))
* TDS deduction in payment entry ([#33747](https://github.com/frappe/erpnext/issues/33747)) ([f9a43e5](f9a43e5470))
* test case added for FG_BASED OPERTING COST ([30af8c3](30af8c3acb))
* the frappe throw message is corrected in the group task validation ([cf43930](cf439301f6))
* use hash based naming for tax withheld vouchers child table (backport [#33643](https://github.com/frappe/erpnext/issues/33643)) ([#33748](https://github.com/frappe/erpnext/issues/33748)) ([cf6d454](cf6d454606))
* web supplier quotation ([ceef2d6](ceef2d6553))

### Features

* Add operating cost based on bom quanity without creating job card ([0035ee2](0035ee2a74))
* get items from Transit Stock Entry ([31fd6f3](31fd6f300f))
2023-01-25 04:00:05 +00:00
Deepesh Garg
891b96e85c Merge pull request #33802 from frappe/version-14-hotfix
chore: release v14
2023-01-25 09:28:32 +05:30
rohitwaghchaure
475445dd8f Merge pull request #33803 from frappe/mergify/bp/version-14-hotfix/pr-33790
fix: web supplier quotation (backport #33790)
2023-01-24 22:06:33 +05:30
Sagar Sharma
e534e27b9e Merge pull request #33804 from frappe/mergify/bp/version-14-hotfix/pr-33797
chore: add `Cancelled` status in SCO `get_indicator` (backport #33797)
2023-01-24 17:36:33 +05:30
s-aga-r
5f6979d444 chore: add Cancelled status in SCO get_indicator
(cherry picked from commit 840f9d8987)
2023-01-24 12:05:08 +00:00
Rohit Waghchaure
ceef2d6553 fix: web supplier quotation
(cherry picked from commit 7800db7c0d)
2023-01-24 10:30:07 +00:00
Anand Baburajan
c928816fc2 Merge pull request #33792 from frappe/mergify/bp/version-14-hotfix/pr-33789
chore: update translations for naming series error (backport #33789)
2023-01-23 19:00:41 +05:30
anandbaburajan
52ba266302 chore: fix translations
(cherry picked from commit 4e6066f929)
2023-01-23 13:19:18 +00:00
anandbaburajan
c04f11b4f8 chore: update translations for naming series error
(cherry picked from commit bbde1f611f)
2023-01-23 13:19:08 +00:00
mergify[bot]
f9a43e5470 fix: TDS deduction in payment entry (#33747)
fix: TDS deduction in payment entry (#33747)
2023-01-23 17:51:51 +05:30
rohitwaghchaure
c706a4fc6f Merge pull request #33786 from frappe/mergify/bp/version-14-hotfix/pr-33785
feat: get items from Transit Stock Entry (backport #33785)
2023-01-23 14:16:28 +05:30
Rohit Waghchaure
31fd6f300f feat: get items from Transit Stock Entry
(cherry picked from commit 62141b0b63)
2023-01-23 07:34:50 +00:00
Sagar Sharma
9e007e1b3a Merge pull request #33782 from frappe/mergify/bp/version-14-hotfix/pr-33547
fix: incorrect `rate` and `amount` in MR Item (backport #33547)
2023-01-22 18:55:54 +05:30
Sagar Sharma
ff731ea70a fix: incorrect rate and amount in MR Item (#33547)
* fix: incorrect `rate` and `amount` in MR Item

(cherry picked from commit 7a8e89e2fe)
2023-01-22 12:34:52 +00:00
mergify[bot]
4be8375e36 fix: Better budget exceeding validation messages (#33713)
fix: Better budget exceeding validation messages (#33713)
2023-01-22 17:57:47 +05:30
Anand Baburajan
2dfa366b81 Merge pull request #33772 from AnandBaburajan/asset_bug_fixes_14
fix: some asset bugs related to finance books [v14]
2023-01-22 16:25:28 +05:30
Anand Baburajan
bdc816d166 Merge branch 'version-14-hotfix' into asset_bug_fixes_14 2023-01-22 13:57:36 +05:30
Sagar Sharma
a0297286b2 Merge pull request #33779 from frappe/mergify/bp/version-14-hotfix/pr-33778
fix: missing constant definition (backport #33778)
2023-01-21 22:31:57 +05:30
barredterra
219aa81eb6 fix: missing constant definition
(cherry picked from commit 547d37b1db)
2023-01-21 16:59:14 +00:00
Anand Baburajan
03b208db7b Merge branch 'version-14-hotfix' into asset_bug_fixes_14 2023-01-21 20:04:17 +05:30
anandbaburajan
9e2329dcfa chore: rename date_of_sale to date_of_disposal 2023-01-21 19:54:14 +05:30
anandbaburajan
96f9b34b19 fix: incorrect row order and accumulated_depreciation when schedule with multiple FBs is scrapped 2023-01-21 18:40:57 +05:30
mergify[bot]
8af9a2fad1 fix(minor): Label updates in Statement of Accounts (#33639)
fix(minor): Label updates in Statement of Accounts
2023-01-21 15:45:01 +05:30
rohitwaghchaure
125c411000 Merge pull request #33768 from frappe/mergify/bp/version-14-hotfix/pr-33760
fix: not able to change default BOM in the Subcontracting Order (backport #33760)
2023-01-21 12:33:51 +05:30
Rohit Waghchaure
ed1aed22c0 fix: not able to change default BOM in the Subcontracting Order
(cherry picked from commit 11b2994fe8)
2023-01-21 06:35:40 +00:00
mergify[bot]
bfc33fb2f5 Removed an unnecessary check in code which always evaluates to true (backport #33710) (#33763)
fix: removed an unnecessary check which always evaluates to true

(cherry picked from commit 49aed7ff69)

Co-authored-by: OpenRefactory, Inc <56681071+openrefactory@users.noreply.github.com>
2023-01-21 12:02:50 +05:30
rohitwaghchaure
779691da55 Merge pull request #33761 from frappe/mergify/bp/version-14-hotfix/pr-33759
fix: incorrect actual qty for the packed item (backport #33759)
2023-01-21 09:47:13 +05:30
mergify[bot]
5a49884636 fix(pricing rule): free item duplication (#33746)
fix(pricing rule): free item duplication (#33746)
2023-01-20 23:41:55 +05:30
mergify[bot]
89f1eefe2b fix: Short closed order, receipt, and delivery note status on cancellation (#33743)
fix: Short closed order, receipt, and delivery note status on cancellation (#33743)
2023-01-20 23:40:15 +05:30
Rohit Waghchaure
bcd1fca37b fix: incorrect actual qty for the packed item
(cherry picked from commit 02566a02a8)
2023-01-20 18:09:49 +00:00
rohitwaghchaure
4590e18145 Merge pull request #33758 from frappe/mergify/bp/version-14-hotfix/pr-33595
feat: Add operating cost based on bom quanity without creating job card (backport #33595)
2023-01-20 23:39:18 +05:30
Vishal
8ee6db3b7b fix: hide with_operation on selection on fg_based and vice versa
(cherry picked from commit 694fc3e20c)
2023-01-20 17:07:36 +00:00
Vishal
19aa23765a fix: minor change in bom.js added
(cherry picked from commit a5cbdea8e4)
2023-01-20 17:07:35 +00:00
Vishal
9469488254 fix: bom.json updated
(cherry picked from commit c51f9e0a97)
2023-01-20 17:07:35 +00:00
Vishal
30af8c3acb fix: test case added for FG_BASED OPERTING COST
(cherry picked from commit f0c0a64984)
2023-01-20 17:07:35 +00:00
Vishal
7fd8cef4d3 fix: minor changes added
(cherry picked from commit ddc0127e05)
2023-01-20 17:07:35 +00:00
Vishal
0035ee2a74 feat: Add operating cost based on bom quanity without creating job card
(cherry picked from commit b559245f2a)
2023-01-20 17:07:34 +00:00
mergify[bot]
1c1c903fee fix: calculate correct amount for qty == 0 (#33739)
fix: calculate correct amount for qty == 0 (#33739)

(cherry picked from commit 327b6fdb32)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-01-20 19:43:31 +05:30
mergify[bot]
cf6d454606 fix: use hash based naming for tax withheld vouchers child table (backport #33643) (#33748)
fix: use hash based naming for tax withheld vouchers child table (#33643)

(cherry picked from commit 17045f88a1)

Co-authored-by: Ritwik Puri <ritwikpuri5678@gmail.com>
2023-01-20 19:26:29 +05:30
mergify[bot]
1a33324b4a fix(ecommerce): breadcrumb: fallback to /all-products (#33718)
fix(ecommerce): breadcrumb: fallback to `/all-products` (#33718)
2023-01-20 19:25:28 +05:30
mergify[bot]
0740120914 fix: Patch to update reference_due_date in Journal Entry (#33616)
* fix: Patch to update reference_due_date in Journal Entry (#33616)
2023-01-20 18:54:17 +05:30
anandbaburajan
dffdc67455 fix: fb issue in asset chart, asset split and reverse_depreciation_entry_made_after_disposal 2023-01-20 15:38:26 +05:30
rohitwaghchaure
0f9d81e5fa Merge pull request #33731 from frappe/mergify/bp/version-14-hotfix/pr-33723
fix: don't add template item in sales/purchase transaction (backport #33723)
2023-01-19 16:54:49 +05:30
Sagar Sharma
1d73f1f275 Merge pull request #33733 from frappe/mergify/bp/version-14-hotfix/pr-33619
fix: rewrite logic for duplicate check in Item Attribute (backport #33619)
2023-01-19 15:29:08 +05:30
unknown
dedc9ecc7c fix: linting
(cherry picked from commit 2ca4d3fb71)
2023-01-19 07:58:40 +00:00
unknown
6544cb8822 fix: rewrite logic for duplicate check in Item Attribute
Previously, Item Attribute values were not checked for case-insensitive duplicates, and Item tttribute abbreviations were forced to be uppercase. This commit fixes both problems.

(cherry picked from commit 974e12c837)
2023-01-19 07:58:39 +00:00
Rohit Waghchaure
8c12f7f2f2 fix: don't add template item in sales/purchase transaction
(cherry picked from commit 2c83fff1a1)
2023-01-19 07:13:03 +00:00
Deepesh Garg
0001ae113d Merge pull request #33698 from shamilnk/version-14-fix-task
fix: the frappe throw message is corrected in the group task validation
2023-01-18 21:28:28 +05:30
mergify[bot]
9bc2675493 refactor: make payments app a soft dependency (backport #33245) (#33677)
refactor: make payments app a soft dependency (#33245)

refactor: make payment app a soft dependency
(cherry picked from commit 0b86b1baca)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-01-18 21:11:37 +05:30
rohitwaghchaure
0d46ec2640 Merge pull request #33714 from frappe/mergify/bp/version-14-hotfix/pr-33712
fix: local variable 'stock_rbnb' referenced before assignment (backport #33712)
2023-01-18 19:18:43 +05:30
Sagar Sharma
9152def27e Merge pull request #33716 from frappe/mergify/bp/version-14-hotfix/pr-33679
refactor: rewrite `pick_list.py` queries in `QB` (backport #33679)
2023-01-18 18:55:47 +05:30
s-aga-r
26eb0e2fcd refactor: rewrite pick_list.py queries in QB
(cherry picked from commit 0ed6552655)
2023-01-18 12:57:01 +00:00
Rohit Waghchaure
21cf929c7a fix: local variable 'stock_rbnb' referenced before assignment
(cherry picked from commit 1de4742ffb)
2023-01-18 11:07:42 +00:00
ShamilNK
3119c3d777 Merge branch 'version-14-hotfix' into version-14-fix-task 2023-01-18 09:13:10 +05:30
Frappe PR Bot
e910c949f7 chore(release): Bumped to Version 14.13.0
# [14.13.0](https://github.com/frappe/erpnext/compare/v14.12.1...v14.13.0) (2023-01-17)

### Bug Fixes

* allow to create sales order from expired quotation ([#33582](https://github.com/frappe/erpnext/issues/33582)) ([fe51343](fe513433b2))
* asset repair link ([bc55f44](bc55f44de6))
* asset value in fixed asset register ([#33608](https://github.com/frappe/erpnext/issues/33608)) ([4d2497f](4d2497faf1))
* attribute error while submitting Repost PLE ([0431a57](0431a57ff0))
* better comparision of difference value between stock and account ([5869fcb](5869fcbd86))
* minor filter issue while reconciliation tool from bench console ([bddf330](bddf330754))
* Missing constructor args in Bank Reco Tool ([#33705](https://github.com/frappe/erpnext/issues/33705)) ([f88c8c4](f88c8c48c9))
* only group similar items in print format if group_same_items is checked in pick list (backport [#33627](https://github.com/frappe/erpnext/issues/33627)) ([#33630](https://github.com/frappe/erpnext/issues/33630)) ([28f2d35](28f2d357ab))
* patch item_reposting_for_incorrect_sl_and_gl ([1928195](1928195167))
* Rate from LDC in TDS reports (backport [#33699](https://github.com/frappe/erpnext/issues/33699)) ([#33700](https://github.com/frappe/erpnext/issues/33700)) ([9fa4c1a](9fa4c1a3bd))
* Return against internal purchase invoice (backport [#33635](https://github.com/frappe/erpnext/issues/33635)) ([#33658](https://github.com/frappe/erpnext/issues/33658)) ([35fbd67](35fbd67a93))
* Sales ORder Connections on Material Request ([8a04031](8a0403119f))
* Updating SO throws ordered_qty not allowed to change after submission ([f915c18](f915c18137))
* zero rm-cost in SCR ([2dfbc6e](2dfbc6e4eb))

### Features

* Date filters on bank reconciliation tool ([#33271](https://github.com/frappe/erpnext/issues/33271)) ([91b08f1](91b08f179a))
* provision to select date type based on filter ([4d65d6f](4d65d6f9bd))

### Performance Improvements

* improve reconciliation speed on JE's with 1000's of rows ([8a498ed](8a498ed029))

### Reverts

* Reverting changes done on 33495 ([#33662](https://github.com/frappe/erpnext/issues/33662)) ([23b9f66](23b9f661b6))
2023-01-17 16:02:54 +00:00
Deepesh Garg
7a5ec088df Merge pull request #33701 from frappe/version-14-hotfix
chore: release v14
2023-01-17 21:31:17 +05:30
mergify[bot]
f88c8c48c9 fix: Missing constructor args in Bank Reco Tool (#33705)
fix: Missing constructor args in Bank Reco Tool (#33705)

(cherry picked from commit 6b31c27ed6)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-17 21:05:49 +05:30
ShamilNK
f3184dcd10 Merge branch 'version-14-hotfix' into version-14-fix-task 2023-01-17 17:44:53 +05:30
mergify[bot]
9fa4c1a3bd fix: Rate from LDC in TDS reports (backport #33699) (#33700)
fix: Rate from LDC in TDS reports (#33699)

(cherry picked from commit db9beb3cdd)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-17 15:59:13 +05:30
Anand Baburajan
7665f85f0a Merge pull request #33688 from AnandBaburajan/asset_repair_link
fix: asset repair link [v14]
2023-01-17 15:12:18 +05:30
Anand Baburajan
8ac82ccae2 Merge branch 'version-14-hotfix' into asset_repair_link 2023-01-17 12:57:35 +05:30
shamilnk
cf439301f6 fix: the frappe throw message is corrected in the group task validation 2023-01-17 12:54:49 +05:30
rohitwaghchaure
59018f1012 Merge pull request #33697 from frappe/mergify/bp/version-14-hotfix/pr-33695
fix: patch item_reposting_for_incorrect_sl_and_gl (backport #33695)
2023-01-17 12:43:43 +05:30
Rohit Waghchaure
1928195167 fix: patch item_reposting_for_incorrect_sl_and_gl
(cherry picked from commit dbde3a3421)
2023-01-17 06:49:25 +00:00
Anand Baburajan
709706e645 Merge branch 'version-14-hotfix' into asset_repair_link 2023-01-17 11:21:34 +05:30
Ankush Menat
79f171c31a chore: ignore b028 2023-01-17 10:58:38 +05:30
Sagar Sharma
59964b5297 Merge pull request #33692 from frappe/mergify/bp/version-14-hotfix/pr-33690
fix: Sales Order Connections Tabs do not show linked Material Request or "+" button  (intoduce by #33304) (backport #33690)
2023-01-17 10:07:29 +05:30
Florian HENRY
8a0403119f fix: Sales ORder Connections on Material Request
(cherry picked from commit e19161a8ee)
2023-01-17 04:36:45 +00:00
mergify[bot]
a1bfa569e6 chore: Typo in payment reconciliation (backport #33686) (#33691)
chore: Typo in payment reconciliation (#33686)

(cherry picked from commit 0639d9e32a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-17 09:16:26 +05:30
rohitwaghchaure
25c2e5fa71 Merge pull request #33685 from frappe/mergify/bp/version-14-hotfix/pr-33680
refactor: picked qty in sales order item (backport #33680)
2023-01-17 00:27:23 +05:30
rohitwaghchaure
bdf7fdda3e Merge pull request #33687 from frappe/mergify/bp/version-14-hotfix/pr-33684
feat: [minor] date type based on filter in Work Order Summary report (backport #33684)
2023-01-17 00:09:59 +05:30
Anand Baburajan
222b2dc487 Merge branch 'version-14-hotfix' into asset_repair_link 2023-01-17 00:02:07 +05:30
Rohit Waghchaure
4d65d6f9bd feat: provision to select date type based on filter
(cherry picked from commit 20c8873208)
2023-01-16 18:28:18 +00:00
anandbaburajan
bc55f44de6 fix: asset repair link 2023-01-16 23:36:46 +05:30
Rohit Waghchaure
6b3dc90560 refactor: picked qty in sales order item
(cherry picked from commit 1bcff80074)
2023-01-16 18:02:45 +00:00
ruthra kumar
6f967df9bb Merge pull request #33674 from frappe/mergify/bp/version-14-hotfix/pr-33661
perf: improve reconciliation performance for JE with 100s of accounts (backport #33661)
2023-01-16 18:03:08 +05:30
Sagar Sharma
1ebafb97a5 Merge pull request #33665 from frappe/mergify/bp/version-14-hotfix/pr-33664
chore: `Sales Order` link in `Pick List` (backport #33664)
2023-01-16 15:37:05 +05:30
Sagar Sharma
68877db0fa Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33664 2023-01-16 15:36:54 +05:30
ruthra kumar
3ce819464d Merge pull request #33673 from frappe/mergify/bp/version-14-hotfix/pr-33646
Revert "fix: Updating SO throws ordered_qty not allowed to change after submission" (backport #33646)
2023-01-16 15:29:21 +05:30
ruthra kumar
5ba0aff551 Merge pull request #33671 from frappe/mergify/bp/version-14-hotfix/pr-33663
fix: attribute error while submitting Repost PLE (backport #33663)
2023-01-16 14:28:11 +05:30
ruthra kumar
b2ee981f52 Merge pull request #33670 from frappe/mergify/bp/version-14-hotfix/pr-33662
revert: Reverting changes done on 33495 (backport #33662)
2023-01-16 14:27:38 +05:30
ruthra kumar
0431a57ff0 fix: attribute error while submitting Repost PLE
(cherry picked from commit 2c50f43cdd)
2023-01-16 11:16:39 +05:30
Sagar Sharma
136a50948e Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33664 2023-01-16 10:30:24 +05:30
mergify[bot]
35fbd67a93 fix: Return against internal purchase invoice (backport #33635) (#33658)
fix: Return against internal purchase invoice (#33635)

(cherry picked from commit 906ad10d16)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-16 10:03:12 +05:30
mergify[bot]
fe513433b2 fix: allow to create sales order from expired quotation (#33582)
fix: allow to create sales order from expired quotation (#33582)

(cherry picked from commit dceef0397a)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-01-16 10:01:43 +05:30
ruthra kumar
bddf330754 fix: minor filter issue while reconciliation tool from bench console
(cherry picked from commit 828eaf0930)
2023-01-16 04:12:07 +00:00
ruthra kumar
8a498ed029 perf: improve reconciliation speed on JE's with 1000's of rows
1. No need to keep old PLE's on reconciliation.
2. Added Validation to catch debit-credit mismatch on JE's
3. Only update outstanding amount for newly reconciled invoices

(cherry picked from commit 11cf694d9a)
2023-01-16 04:12:07 +00:00
ruthra kumar
faea73a4ee Revert "fix: Updating SO throws ordered_qty not allowed to change after submission" (#33646)
(cherry picked from commit 333907b7a5)
2023-01-16 04:09:45 +00:00
ruthra kumar
23b9f661b6 revert: Reverting changes done on 33495 (#33662)
'ordered_qty' will not be fetched from `tabBin`

(cherry picked from commit be382054e5)
2023-01-16 04:03:51 +00:00
mergify[bot]
623c35dfe1 refactor: use DocStatus (#33594)
refactor: use DocStatus (#33594)

(cherry picked from commit 67cf7e1728)

Co-authored-by: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
2023-01-16 08:45:31 +05:30
s-aga-r
df41b006fc chore: Sales Order link in Pick List
(cherry picked from commit b3759890d7)
2023-01-15 17:35:31 +00:00
mergify[bot]
4d2497faf1 fix: asset value in fixed asset register (#33608)
fix: asset value in fixed asset register

(cherry picked from commit aa1f2a7297)

Co-authored-by: anandbaburajan <anandbaburajan@gmail.com>
2023-01-15 17:33:39 +05:30
mergify[bot]
91b08f179a feat: Date filters on bank reconciliation tool (#33271)
* Update bank_reconciliation_tool.py

Applying date filter on transactions and all the bank entries and also gives the filter the bank entries as per reference date. Sorted all transactions and entries as per date in ascending order.
Also added posting date columns in all bank entries and default checkbox tick of journal entry, hide the sales invoice and purchase invoice checkbox.

(cherry picked from commit e5a1189bec)

* Filters on Bank Reconciliation

Applying date filter on transactions and all the bank entries and also gives the filter the bank entries as per reference date. Sorted all transactions and entries as per date in ascending order. Also added posting date columns in all bank entries and default checkbox tick of journal entry, hide the sales invoice and purchase invoice checkbox.

(cherry picked from commit 447272aa4d)

* Update bank_reconciliation_tool.json

Adding fields in bank reconciliation tool

(cherry picked from commit 8e7c8a6482)

* Feat:Filter on Payment Entries and Journal Entries

Applying filters on Payement entries and Journal Entries as per reference  date and posting date

(cherry picked from commit 408c89df03)

* feat:filters on bank reconciliation

Added date filters on bank transactions, payment entries and journal entries and sorted list as per date in ascending order.

(cherry picked from commit 05b6fce03d)

* feat: added arguments of posting date and reference date

(cherry picked from commit 645869e6ff)

* fix: linters

(cherry picked from commit 6b5276398e)

* fix: json issue

(cherry picked from commit 81e5f71172)

* fix: filtered as per reference date

On bank reconciliation, transactions will be filtered as per date selected in 'from_date' and 'to_date' fields , In dialog, all the bank entries will  be fetched as per the posting date selected and if filtered by reference date checkbox is tick then then there will be two fields 'from_reference_date' and 'to_reference_date' then all bank entries in dialog box came as per reference date, selected. And by default journal entry checkbox is tick.
Also sorted the bank transactions and bank entries as per ascending order date wise.

(cherry picked from commit 3aaa2f5326)

* fix: pre-commit

(cherry picked from commit e2614b8a21)

* fix: passing from_date and to_date filters in test cases

passing from_date and to_date filters in  test_linked_payments and test_debit_credit_output  for unit testing

(cherry picked from commit f1810803e1)

* fix: pre-commit

(cherry picked from commit 35c29e0226)

* fix: pre-commit

(cherry picked from commit c764f14f53)

* feat: consolidated auto bank reconciliation

Added a button of Auto Reconcile, to reconcile the bank entries as per the matching reference number with the bank transaction and count of transactions reconciled message will be pop up on clicking the auto reconcile button.

(cherry picked from commit d65243eb65)

* fix: data format

(cherry picked from commit 12822f7c36)

* fix: remove comments

(cherry picked from commit 917b2190aa)

* chore: fix fieldnames and order

(cherry picked from commit 232726288a)

Co-authored-by: sonali <sonali@8848digital.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-15 17:30:32 +05:30
Sagar Sharma
40d3b26fd8 Merge pull request #33654 from frappe/mergify/bp/version-14-hotfix/pr-33651
fix: zero rm-cost in SCR (backport #33651)
2023-01-15 12:53:04 +05:30
s-aga-r
2dfbc6e4eb fix: zero rm-cost in SCR
(cherry picked from commit f70d757b82)
2023-01-14 17:41:46 +00:00
ruthra kumar
5631cbba6a Merge pull request #33628 from frappe/mergify/bp/version-14-hotfix/pr-33622
fix: Updating SO throws ordered_qty not allowed to change after submission (backport #33622)
2023-01-13 10:14:19 +05:30
ruthra kumar
f915c18137 fix: Updating SO throws ordered_qty not allowed to change after submission
(cherry picked from commit 391f42db04)
2023-01-13 08:21:36 +05:30
mergify[bot]
1f0a569c7f chore: reuse doc object in test_pick_list_grouping_before_print (backport #33636) (#33637)
chore: reuse doc object in test_pick_list_grouping_before_print (#33636)

(cherry picked from commit e22d56484d)

Co-authored-by: Ritwik Puri <ritwikpuri5678@gmail.com>
2023-01-13 01:34:31 +05:30
mergify[bot]
28f2d357ab fix: only group similar items in print format if group_same_items is checked in pick list (backport #33627) (#33630)
fix: only group similar items in print format if group_same_items is checked in pick list (#33627)

* fix: only group similar items if group same items is checked in pick list

* test: non grouping of locations if group_same_items is false

Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
(cherry picked from commit cfb0bb1eaa)

Co-authored-by: Ritwik Puri <ritwikpuri5678@gmail.com>
Co-authored-by: Sagar Sharma <sagarsharma.s312@gmail.com>
2023-01-12 20:33:18 +05:30
mergify[bot]
120dca44ad chore: subcontracting validations (backport #33621) (#33626)
* fix: `ZeroDivisionError: float division by zero` in SCR

(cherry picked from commit 434aa594d5)

* chore: add row-index in error msgs

(cherry picked from commit 6878f40d1d)

* chore: update error msgs for Subcontracted PO

(cherry picked from commit a0e2a93f3f)

* fix: validate accepted and rejected qty in SCR Item

(cherry picked from commit f028bd6e69)

* chore: linter

(cherry picked from commit b26e96cdf4)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
2023-01-12 20:31:24 +05:30
Sagar Sharma
c9edf10693 Merge pull request #33614 from frappe/mergify/bp/version-14-hotfix/pr-33611
fix: better comparision of `difference_value` of Stock and Account (backport #33611)
2023-01-11 15:44:22 +05:30
Smit Vora
5869fcbd86 fix: better comparision of difference value between stock and account
(cherry picked from commit be05aea101)
2023-01-11 09:23:43 +00:00
Frappe PR Bot
1b3df094af chore(release): Bumped to Version 14.12.1
## [14.12.1](https://github.com/frappe/erpnext/compare/v14.12.0...v14.12.1) (2023-01-10)

### Bug Fixes

* **accounts:** currency fields no longer read as strings by validation function in Payment Entry ([#33535](https://github.com/frappe/erpnext/issues/33535)) ([44a95da](44a95da8ab))
* better handling of duplicate bundle items ([b96a97f](b96a97f6b4))
* customer/supplier quick entry dialog ([#33496](https://github.com/frappe/erpnext/issues/33496)) ([914e2fd](914e2fdded))
* don't check other warehouse ledgers to calculate valuation rate ([ab0a2b4](ab0a2b4272))
* Exchange gain and loss booking on multi-currency invoice reconciliation ([#32900](https://github.com/frappe/erpnext/issues/32900)) ([fe82ebc](fe82ebcc38))
* Exchange gain and loss booking on multi-currency invoice reconciliation ([#32900](https://github.com/frappe/erpnext/issues/32900)) ([259639a](259639a456))
* Incorrect exchange rate in payment entries ([#33481](https://github.com/frappe/erpnext/issues/33481)) ([e995e95](e995e952b5))
* incorrect status in the work order ([2658fc9](2658fc9f9b))
* incorrect warehouse and selling amount on bundled products ([#33549](https://github.com/frappe/erpnext/issues/33549)) ([c6c3ac3](c6c3ac3e55))
* RFQ emails not sent with pdf attachment ([#33604](https://github.com/frappe/erpnext/issues/33604)) ([34df9ab](34df9ab7d5))
* **stock entry:** wrong valuation rate in repack ([#33579](https://github.com/frappe/erpnext/issues/33579)) ([a92b4e7](a92b4e7255))
* Timeout error while saving the purchase invoice ([#33577](https://github.com/frappe/erpnext/issues/33577)) ([d2e3701](d2e3701b1a))

### Performance Improvements

* Drop `name` part from posting sort index ([#33551](https://github.com/frappe/erpnext/issues/33551)) ([f501575](f5015750e4))
2023-01-10 17:48:26 +00:00
Deepesh Garg
e6b9931552 Merge pull request #33601 from frappe/version-14-hotfix
chore: release v14
2023-01-10 23:16:52 +05:30
mergify[bot]
34df9ab7d5 fix: RFQ emails not sent with pdf attachment (#33604)
fix: RFQ emails not sent with pdf attachment (#33604)

(cherry picked from commit e0f5ecdad6)

Co-authored-by: Smit Vora <smitvora203@gmail.com>
2023-01-10 22:19:24 +05:30
mergify[bot]
e995e952b5 fix: Incorrect exchange rate in payment entries (#33481)
fix: Incorrect exchange rate in payment entries (#33481)

* fix: Incorrect exchange rate in payment entries

* test: Update failing tests

(cherry picked from commit 0ed938a490)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-10 22:18:59 +05:30
rohitwaghchaure
39e5aabc57 Merge pull request #33598 from frappe/mergify/bp/version-14-hotfix/pr-33597
fix: don't check other warehouse ledgers to calculate valuation rate (backport #33597)
2023-01-10 15:34:17 +05:30
Rohit Waghchaure
ab0a2b4272 fix: don't check other warehouse ledgers to calculate valuation rate
(cherry picked from commit ef2bf3c223)
2023-01-10 08:26:59 +00:00
Sagar Sharma
68027b164c Merge pull request #33596 from frappe/mergify/bp/version-14-hotfix/pr-33551
perf: Drop `name` part from posting sort index (backport #33551)
2023-01-10 12:56:57 +05:30
Sagar Sharma
57a6cfe690 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33551 2023-01-10 12:14:47 +05:30
Deepesh Garg
955b487296 chore: resolve conflicts 2023-01-10 10:44:38 +05:30
mergify[bot]
44a95da8ab fix(accounts): currency fields no longer read as strings by validation function in Payment Entry (#33535)
fix(accounts): currency fields no longer read as strings by validation function in Payment Entry (#33535)

explicitly cast paid_amount and received_amount to float in the Payment Entry set_unallocated_amount validation function

(cherry picked from commit 4d5067d6d4)

Co-authored-by: Gughan Ravikumar <gughanrk@gmail.com>
2023-01-10 09:55:12 +05:30
Ankush Menat
f5015750e4 perf: Drop name part from posting sort index (#33551)
(cherry picked from commit 8a56df695d)

# Conflicts:
#	erpnext/patches.txt
2023-01-10 04:25:07 +00:00
mergify[bot]
914e2fdded fix: customer/supplier quick entry dialog (#33496)
fix: customer/supplier quick entry dialog (#33496)

* fix: readonly primary contact fields.

* refactor: supplier and customer quick entry form into common class.

(cherry picked from commit 6bc8bb26b6)

Co-authored-by: Devin Slauenwhite <devin.slauenwhite@gmail.com>
2023-01-10 09:02:50 +05:30
mergify[bot]
d2e3701b1a fix: Timeout error while saving the purchase invoice (#33577)
* fix: timeout error in the Purchase Invoice

(cherry picked from commit 7249657d15)

* feat: provision to disable get last purchase rate
fix: set_incoming_rate condition

(cherry picked from commit d1d4671320)

* fix: linters issue

(cherry picked from commit 05df8579cd)

* test: test case to check disable last purchase rate

(cherry picked from commit ec171fc7c1)

Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
2023-01-10 09:02:15 +05:30
mergify[bot]
a92b4e7255 fix(stock entry): wrong valuation rate in repack (#33579)
fix(stock entry): wrong valuation rate in repack

(cherry picked from commit 99f5e869e0)

Co-authored-by: safvanhuzain <danyrt@wahni.com>
2023-01-10 09:01:51 +05:30
mergify[bot]
c6c3ac3e55 fix: incorrect warehouse and selling amount on bundled products (#33549)
fix: incorrect warehouse and selling amount on bundled products (#33549)

(cherry picked from commit bbe5e5d9d6)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-01-09 23:11:34 +05:30
Sagar Sharma
fb59c5b911 Merge pull request #33586 from frappe/mergify/bp/version-14-hotfix/pr-33562
fix: better handling of duplicate bundle items (backport #33562)
2023-01-09 22:45:46 +05:30
ruthra kumar
b96a97f6b4 fix: better handling of duplicate bundle items
(cherry picked from commit c717e87c9e)
2023-01-09 16:54:34 +00:00
mergify[bot]
1d26d7c077 chore: patch property setters for JE with new entry type (backport #33569) (#33583)
chore: patch property setters for JE with new entry type

(cherry picked from commit 789e448f0e)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-01-09 22:22:33 +05:30
mergify[bot]
1d045e0458 ci: bump node in release workflow (backport #33574) (#33575)
* ci: bump node in release workflow (#33574)

[skip ci]

(cherry picked from commit 1ad1fc4c7d)

# Conflicts:
#	.github/workflows/release.yml

* chore: conflicts

[skip ci]

Co-authored-by: Ankush Menat <ankush@frappe.io>
2023-01-09 13:27:40 +05:30
Deepesh Garg
7574fc8bcc Merge pull request #33567 from frappe/mergify/bp/version-14/pr-32900
fix: Exchange gain and loss booking on multi-currency invoice reconciliation (backport #32900)
2023-01-07 14:01:20 +05:30
mergify[bot]
fe82ebcc38 fix: Exchange gain and loss booking on multi-currency invoice reconciliation (#32900)
fix: Exchange gain and loss booking on multi-currency invoice reconciliation (#32900)

* fix: Exchange gain and loss booking on multi-curreny invoice reconciliation

* test: Update test cases

* chore: Ignore SQL linting rule

* chore: Joural Entry for exchange gainand loss booking

* chore: Journal entry for exchange gain loss booking

* test: Update test case

* chore: Default exchange gain and loss account

(cherry picked from commit 9a3d947e89)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-07 14:00:13 +05:30
Deepesh Garg
259639a456 fix: Exchange gain and loss booking on multi-currency invoice reconciliation (#32900)
* fix: Exchange gain and loss booking on multi-curreny invoice reconciliation

* test: Update test cases

* chore: Ignore SQL linting rule

* chore: Joural Entry for exchange gainand loss booking

* chore: Journal entry for exchange gain loss booking

* test: Update test case

* chore: Default exchange gain and loss account

(cherry picked from commit 9a3d947e89)
2023-01-07 08:11:15 +00:00
rohitwaghchaure
a9322ff13a Merge pull request #33561 from frappe/mergify/bp/version-14-hotfix/pr-33548
fix: incorrect status in the work order (backport #33548)
2023-01-06 18:45:42 +05:30
Rohit Waghchaure
2658fc9f9b fix: incorrect status in the work order
(cherry picked from commit b0baba84a0)
2023-01-06 10:32:19 +00:00
ruthra kumar
c6a136d2ad Merge pull request #33560 from frappe/mergify/bp/version-14-hotfix/pr-33537
refactor: Sales Partner column in AR and AR Summary Report (backport #33537)
2023-01-06 12:38:48 +05:30
ruthra kumar
031841d58e refactor: Sales Partner column in AR and AR Summary Report
(cherry picked from commit ee94127974)
2023-01-06 06:39:34 +00:00
Sagar Sharma
1366094b37 Merge pull request #33545 from frappe/mergify/bp/version-14-hotfix/pr-33543
chore: enable `No Copy` attribute for `route` in Item Group (backport #33543)
2023-01-05 13:32:59 +05:30
s-aga-r
3dab539719 chore: enable No Copy attribute for route in Item Group
(cherry picked from commit 348dc32514)
2023-01-05 07:32:43 +00:00
rohitwaghchaure
3731d76ff9 Merge pull request #33541 from frappe/mergify/bp/version-14-hotfix/pr-33524
refactor: revamp process loss feature & added tab breaks (backport #33524)
2023-01-04 19:59:56 +05:30
Rohit Waghchaure
28d5990326 test: test cases for process loss
(cherry picked from commit 524c0994e0)
2023-01-04 13:08:25 +00:00
Rohit Waghchaure
14d8e621bb refactor: revamp process loss feature & added tab breaks
(cherry picked from commit ae039777f9)
2023-01-04 13:08:25 +00:00
Frappe PR Bot
aab856ceb1 chore(release): Bumped to Version 14.12.0
# [14.12.0](https://github.com/frappe/erpnext/compare/v14.11.1...v14.12.0) (2023-01-04)

### Bug Fixes

* [concurrency issue] incorrect picked qty in sales order ([e7254fd](e7254fd161))
* `fg_item_qty` in non-subcontracted PO ([6e15331](6e15331fd4))
* `shipping_address` for non-drop shipping item ([a7a3654](a7a3654541))
* `shipping_address` in PO ([448fbe5](448fbe5582))
* add missing 'ordered_qty' to get_bin_details ([55e8e45](55e8e45d52))
* consider child nodes while getting bin details ([e296408](e2964088b7))
* Conversion factor error for invoices without item code (petty expenses) ([#32714](https://github.com/frappe/erpnext/issues/32714)) ([ba5a149](ba5a149a6b))
* Customer Primary Contact (backport [#33424](https://github.com/frappe/erpnext/issues/33424)) ([#33440](https://github.com/frappe/erpnext/issues/33440)) ([73c9820](73c9820e82))
* Default dimensions on fetching items from BOM (backport [#33439](https://github.com/frappe/erpnext/issues/33439)) ([#33459](https://github.com/frappe/erpnext/issues/33459)) ([a332b22](a332b229cf))
* Deferred revenue date comparison ([#33515](https://github.com/frappe/erpnext/issues/33515)) ([027510b](027510b629))
* ERR journals reported in AR/AP ([823b352](823b352c57))
* Get payment entry button not visible in Bank Clearance doc (backport [#33518](https://github.com/frappe/erpnext/issues/33518)) ([#33525](https://github.com/frappe/erpnext/issues/33525)) ([fcf052d](fcf052d3c4))
* Missing opening entry in general ledger (backport [#33519](https://github.com/frappe/erpnext/issues/33519)) ([#33526](https://github.com/frappe/erpnext/issues/33526)) ([8e375db](8e375db0b2))
* Multi-currency issues in Bank Reconciliation Tool ([#33488](https://github.com/frappe/erpnext/issues/33488)) ([d030852](d03085259d))
* Multiple rows for same warehouse and batches in pick list (backport [#33456](https://github.com/frappe/erpnext/issues/33456)) ([#33458](https://github.com/frappe/erpnext/issues/33458)) ([a166a76](a166a76768))
* payment terms and sales partner filter issue in AR/AP report ([0f6790b](0f6790be11))
* **pricing rule:** consider child tables in condition (backport [#33469](https://github.com/frappe/erpnext/issues/33469)) ([#33470](https://github.com/frappe/erpnext/issues/33470)) ([3bceb47](3bceb47542))
* Random behaviour while picking items using picklist (backport [#33449](https://github.com/frappe/erpnext/issues/33449)) ([#33450](https://github.com/frappe/erpnext/issues/33450)) ([1edde9c](1edde9c9e0))
* set `supplier` details while mapping SE(Send to Subcontractor) ([06e13b6](06e13b64a4))
* timeout error while submitting stock entry ([f30f77c](f30f77cde6))
* typerror on multi warehouse in Packed Items ([9b24940](9b24940059))
* use base_net_amount in case of missing stock qty ([#33457](https://github.com/frappe/erpnext/issues/33457)) ([88ca780](88ca7806af))

### Features

* Accounting Dimension updation in Payment Request and Entry ([#33411](https://github.com/frappe/erpnext/issues/33411)) ([e7704b2](e7704b2321))
2023-01-04 02:54:39 +00:00
Deepesh Garg
6a76153e54 Merge pull request #33511 from frappe/version-14-hotfix
chore: release v14
2023-01-04 08:23:11 +05:30
mergify[bot]
8e375db0b2 fix: Missing opening entry in general ledger (backport #33519) (#33526)
fix: Missing opening entry in general ledger (#33519)

(cherry picked from commit c78399c618)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-03 22:13:29 +05:30
mergify[bot]
fcf052d3c4 fix: Get payment entry button not visible in Bank Clearance doc (backport #33518) (#33525)
fix: Get payment entry button not visible in Bank Clearance doc (#33518)

(cherry picked from commit 1a83a67d41)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-03 22:09:50 +05:30
Sagar Sharma
011fc3a27c Merge pull request #33523 from frappe/mergify/bp/version-14-hotfix/pr-33514
fix: set `supplier` details while mapping SE(Send to Subcontractor) (backport #33514)
2023-01-03 19:27:23 +05:30
s-aga-r
06e13b64a4 fix: set supplier details while mapping SE(Send to Subcontractor)
(cherry picked from commit 751bdc98ed)
2023-01-03 13:27:55 +00:00
mergify[bot]
027510b629 fix: Deferred revenue date comparison (#33515)
fix: Deferred revenue date comparison (#33515)

(cherry picked from commit a3ab8f973a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-03 18:39:19 +05:30
rohitwaghchaure
84289495c4 Merge pull request #33505 from frappe/mergify/bp/version-14-hotfix/pr-33504
fix: [concurrency issue] incorrect picked qty in sales order (backport #33504)
2023-01-02 21:13:50 +05:30
Rohit Waghchaure
e7254fd161 fix: [concurrency issue] incorrect picked qty in sales order
(cherry picked from commit aba83849a6)
2023-01-02 14:42:47 +00:00
mergify[bot]
648e979eb2 refactor: Exchange rate revaluation to handle accounts with zero account balance (#33165)
refactor: Exchange rate revaluation to handle accounts with zero account balance (#33165)

* refactor: new type for JE - Exchange Gain or Loss

* refactor: skip few validations for Exchanage Gain Or Loss type Jour

* refactor: ERR create 2 journals for handling zero and non-zero compa

1. Additional check box accounts table to identify accounts with zero balance
2. Accounts with zero balance only in either of the 2 currencies will be handled on separate Journal

* refactor: skips few validation for allowing 0 debit/credit

* fix: General Ledger presentaion currency

* test: fix test case in general ledger

* test: fix failing test case in AR report

(cherry picked from commit 914b23038c)

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
2023-01-02 16:37:53 +05:30
Sagar Sharma
45d8feba6d Merge pull request #33500 from frappe/mergify/bp/version-14-hotfix/pr-33444
fix: consider child nodes while getting bin details (backport #33444)
2023-01-02 12:31:12 +05:30
s-aga-r
ff38ca8ec7 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33444 2023-01-02 12:01:00 +05:30
Sagar Sharma
f4861554d3 Merge pull request #33498 from frappe/mergify/bp/version-14-hotfix/pr-33495
fix(stock): missing ordered_qty in get_bin_details (backport #33495)
2023-01-02 11:55:28 +05:30
s-aga-r
ec538b27fe chore: use frappe.qb instead of frappe.db.get_value
(cherry picked from commit c3911a592a)
2023-01-02 06:25:00 +00:00
s-aga-r
e2964088b7 fix: consider child nodes while getting bin details
(cherry picked from commit c716dcc01e)
2023-01-02 06:24:59 +00:00
Devin Slauenwhite
6ec8088eb3 test: get_item_details contains bin details
(cherry picked from commit 239a5f8bf4)
2023-01-02 05:45:10 +00:00
Devin Slauenwhite
55e8e45d52 fix: add missing 'ordered_qty' to get_bin_details
(cherry picked from commit 8d62cdfd5f)
2023-01-02 05:45:10 +00:00
mergify[bot]
d03085259d fix: Multi-currency issues in Bank Reconciliation Tool (#33488)
fix: Multi-currency issues in Bank Recociliation Tool

(cherry picked from commit ad53ecf2b4)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2023-01-02 08:52:23 +05:30
mergify[bot]
ba5a149a6b fix: Conversion factor error for invoices without item code (petty expenses) (#32714)
fix: Conversion factor error for invoices without item code (petty expenses) (#32714)

* fix: Set default uom conversion factor to 1 for invoices

* chore: set default conversion_factor as 1

* chore: remove print statements

(cherry picked from commit 617518389a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-30 16:00:45 +05:30
rohitwaghchaure
83a2c9b429 Merge pull request #33489 from frappe/mergify/bp/version-14-hotfix/pr-33487
Revert "fix: daily scheduler to identify and fix stock transfer entries having incorrect valuation" (backport #33487)
2022-12-30 15:31:29 +05:30
rohitwaghchaure
a7901c2b9c Revert "fix: daily scheduler to identify and fix stock transfer entries having incorrect valuation"
(cherry picked from commit 728dc1acf4)
2022-12-30 08:51:29 +00:00
ruthra kumar
60a30840ee Merge pull request #33474 from frappe/mergify/bp/version-14-hotfix/pr-33457
fix: use base_net_amount in case of missing stock qty (backport #33457)
2022-12-30 13:39:27 +05:30
ruthra kumar
88ca7806af fix: use base_net_amount in case of missing stock qty (#33457)
(cherry picked from commit e3a0ce5d63)
2022-12-29 04:05:31 +00:00
mergify[bot]
3bceb47542 fix(pricing rule): consider child tables in condition (backport #33469) (#33470)
fix(pricing rule): consider child tables in condition (#33469)

(cherry picked from commit cabaed9ed2)

Co-authored-by: Dany Robert <rtdany10@gmail.com>
2022-12-29 09:33:59 +05:30
Sagar Sharma
1b7be86a0a Merge pull request #33466 from frappe/mergify/bp/version-14-hotfix/pr-33465
fix: `fg_item_qty` in non-subcontracted PO (backport #33465)
2022-12-28 16:59:09 +05:30
s-aga-r
6e15331fd4 fix: fg_item_qty in non-subcontracted PO
(cherry picked from commit 6f5824cb21)
2022-12-28 09:58:19 +00:00
ruthra kumar
123493b87d Merge pull request #33461 from frappe/mergify/bp/version-14-hotfix/pr-33380
fix: ERR journals should be reported in AR/AP (backport #33380)
2022-12-28 10:42:50 +05:30
ruthra kumar
1f40d9be93 test: err for party should be in AR/AP report
(cherry picked from commit 2ed86760d7)
2022-12-27 16:04:28 +00:00
ruthra kumar
823b352c57 fix: ERR journals reported in AR/AP
Exchange Rate Revaluation on Receivable/Payable will included in AR/AP report

(cherry picked from commit b09eade3e4)
2022-12-27 16:04:27 +00:00
mergify[bot]
73c9820e82 fix: Customer Primary Contact (backport #33424) (#33440)
fix: Customer Primary Contact (#33424)

Co-authored-by: Nihantra C. Patel <n.patel.serpentcs@gmail.com>
(cherry picked from commit 7d9f3f23dd)

Co-authored-by: Solufyin <34390782+Solufyin@users.noreply.github.com>
2022-12-27 18:28:36 +05:30
Frappe PR Bot
24d161d670 chore: release v14 (#33452)
* fix: typerror on multi warehouse in Packed Items

DN(with bundled item with varying warehouses)-> Sales Invoice.

(cherry picked from commit e684eb32d0)

* test: type error on bundled products with different warehouses

(cherry picked from commit 5918bb03f7)

* fix: payment terms and sales partner filter issue in AR/AP report

(cherry picked from commit 13c4420f42)

* fix: timeout error while submitting stock entry

Co-authored-by: Ankush Menat <ankush@frappe.io>
(cherry picked from commit a05c47e499)

* fix: `shipping_address` in PO

(cherry picked from commit 7e1b6b3c2a)

* refactor: Customer and Supplier Ledger summary will have hidden fields for better handling of user permission (#33433)

* feat: Accounting Dimension updation in Payment Request and Entry (#33411)

* fix: `shipping_address` for non-drop shipping item

(cherry picked from commit 67a7ccf3ce)

* fix: Random behaviour while picking items using picklist (backport #33449) (#33450)

fix: Random behaviour while picking items using picklist (#33449)

(cherry picked from commit 8263bf9a9a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>

* fix: Multiple rows for same warehouse and batches in pick list (backport #33456) (#33458)

fix: Multiple rows for same warehouse and batches in pick list (#33456)

(cherry picked from commit d2686ce75b)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>

* fix: Default dimensions on fetching items from BOM (backport #33439) (#33459)

fix: Default dimensions on fetching items from BOM (#33439)

(cherry picked from commit 0b75aa5390)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>

Co-authored-by: ruthra kumar <ruthra@erpnext.com>
Co-authored-by: Rohit Waghchaure <rohitw1991@gmail.com>
Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-27 18:26:24 +05:30
mergify[bot]
a332b229cf fix: Default dimensions on fetching items from BOM (backport #33439) (#33459)
fix: Default dimensions on fetching items from BOM (#33439)

(cherry picked from commit 0b75aa5390)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-27 17:56:05 +05:30
mergify[bot]
a166a76768 fix: Multiple rows for same warehouse and batches in pick list (backport #33456) (#33458)
fix: Multiple rows for same warehouse and batches in pick list (#33456)

(cherry picked from commit d2686ce75b)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-27 17:49:22 +05:30
Frappe PR Bot
0dbac5b689 chore(release): Bumped to Version 14.11.1
## [14.11.1](https://github.com/frappe/erpnext/compare/v14.11.0...v14.11.1) (2022-12-27)

### Bug Fixes

* Random behaviour while picking items using picklist (backport [#33449](https://github.com/frappe/erpnext/issues/33449)) ([#33451](https://github.com/frappe/erpnext/issues/33451)) ([abfb3bf](abfb3bf1c6))
2022-12-27 09:35:01 +00:00
mergify[bot]
abfb3bf1c6 fix: Random behaviour while picking items using picklist (backport #33449) (#33451)
fix: Random behaviour while picking items using picklist (#33449)

(cherry picked from commit 8263bf9a9a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-27 15:01:44 +05:30
mergify[bot]
1edde9c9e0 fix: Random behaviour while picking items using picklist (backport #33449) (#33450)
fix: Random behaviour while picking items using picklist (#33449)

(cherry picked from commit 8263bf9a9a)

Co-authored-by: Deepesh Garg <deepeshgarg6@gmail.com>
2022-12-27 15:01:31 +05:30
Sagar Sharma
6bf6b8c15e Merge pull request #33445 from frappe/mergify/bp/version-14-hotfix/pr-33437
fix: `shipping_address` in PO for non-drop ship item (backport #33437)
2022-12-27 10:16:59 +05:30
s-aga-r
a7a3654541 fix: shipping_address for non-drop shipping item
(cherry picked from commit 67a7ccf3ce)
2022-12-26 15:51:29 +00:00
mergify[bot]
e7704b2321 feat: Accounting Dimension updation in Payment Request and Entry (#33411) 2022-12-26 11:34:47 +05:30
mergify[bot]
7a98ece7f1 refactor: Customer and Supplier Ledger summary will have hidden fields for better handling of user permission (#33433) 2022-12-26 10:12:12 +05:30
Sagar Sharma
86e16fd567 Merge pull request #33435 from frappe/mergify/bp/version-14-hotfix/pr-33434
fix(ux): `shipping_address` in PO (backport #33434)
2022-12-25 20:45:51 +05:30
s-aga-r
448fbe5582 fix: shipping_address in PO
(cherry picked from commit 7e1b6b3c2a)
2022-12-25 14:10:50 +00:00
rohitwaghchaure
cc400abc47 Merge pull request #33423 from frappe/mergify/bp/version-14-hotfix/pr-33422
fix: timeout error while submitting stock entry (backport #33422)
2022-12-23 17:19:09 +05:30
Rohit Waghchaure
f30f77cde6 fix: timeout error while submitting stock entry
Co-authored-by: Ankush Menat <ankush@frappe.io>
(cherry picked from commit a05c47e499)
2022-12-23 08:28:35 +00:00
ruthra kumar
81d82c1427 Merge pull request #33419 from frappe/mergify/bp/version-14-hotfix/pr-33418
fix: payment terms and sales partner filter issue in Accounts Receivable report (backport #33418)
2022-12-22 12:33:52 +05:30
ruthra kumar
0f6790be11 fix: payment terms and sales partner filter issue in AR/AP report
(cherry picked from commit 13c4420f42)
2022-12-22 06:36:58 +00:00
ruthra kumar
f6a0435963 Merge pull request #33414 from frappe/mergify/bp/version-14-hotfix/pr-33410
fix: TypeError on GP Report due to multiple warehouse on bundled items (backport #33410)
2022-12-21 19:00:55 +05:30
ruthra kumar
007a111847 test: type error on bundled products with different warehouses
(cherry picked from commit 5918bb03f7)
2022-12-21 12:58:47 +00:00
ruthra kumar
9b24940059 fix: typerror on multi warehouse in Packed Items
DN(with bundled item with varying warehouses)-> Sales Invoice.

(cherry picked from commit e684eb32d0)
2022-12-21 12:58:46 +00:00
Frappe PR Bot
29bb873347 chore(release): Bumped to Version 14.11.0
# [14.11.0](https://github.com/frappe/erpnext/compare/v14.10.1...v14.11.0) (2022-12-20)

### Bug Fixes

* Consolidated financial report ([16ce411](16ce411b8f))
* Cost center filter not working in cash flow report ([ce5065b](ce5065b132))
* Cost Center for tax withholding invoices ([728643a](728643aa4a))
* cost_center filter fix for 'Get Outstanding Invoice' in PE ([ff61997](ff61997d25))
* cost_center filter gives incorrect output ([9b2b281](9b2b2812ca))
* daily scheduler to identify and fix stock transfer entries having incorrect valuation ([deb3efd](deb3efdd9a))
* disabled items showing in the report 'Itemwise Recommended Reorder Level ([493509e](493509e42d))
* get_serial_nos_for_fg() missing 1 required positional argument: 'args' ([bddb5b8](bddb5b8d25))
* incorrect type hints (backport [#33381](https://github.com/frappe/erpnext/issues/33381)) ([#33384](https://github.com/frappe/erpnext/issues/33384)) ([fa77259](fa77259f8d))
* Payment Request flow fixes from Order to Payment Entry ([a01db8f](a01db8fc38))
* remove unnecessary permissions from Appointment and Appointment Booking Settings ([#33358](https://github.com/frappe/erpnext/issues/33358)) ([#33395](https://github.com/frappe/erpnext/issues/33395)) ([6ef7eaf](6ef7eaf82e))
* translation for warning on Overbilling/-receipt/-delivery ([ba51d50](ba51d50fef))
* Unable to import COA through importer ([f8c09ee](f8c09ee720))
* unsupported operand type(s) for +: 'int' and 'NoneType' ([7bdfb3d](7bdfb3d181))
* unsupported operand type(s) for +=: 'int' and 'NoneType' ([88dc81b](88dc81b7d4))
* use highest precision for exchange rate. ([4a8a84d](4a8a84d6f0))

### Features

* Ignore company related doctype for other apps via hooks ([cd5a2af](cd5a2af272))
* improve visibility of default values ([7ff50b9](7ff50b9446))
* incoterm named place ([bfe57ac](bfe57acdbf))
* more control when printing RFQ ([07cda0a](07cda0aeb5))
2022-12-20 14:01:35 +00:00
Deepesh Garg
c9156635a7 Merge pull request #33404 from frappe/version-14-hotfix
chore: release v14
2022-12-20 19:30:05 +05:30
mergify[bot]
6ef7eaf82e fix: remove unnecessary permissions from Appointment and Appointment Booking Settings (#33358) (#33395) 2022-12-20 18:23:47 +05:30
Deepesh Garg
647b532e04 Merge pull request #33400 from frappe/mergify/bp/version-14-hotfix/pr-33393
fix: Cost center filter not working in cash flow report (backport #33393)
2022-12-20 18:22:30 +05:30
rohitwaghchaure
32f4dfb31e Merge pull request #33391 from frappe/mergify/bp/version-14-hotfix/pr-33382
fix: unsupported operand type(s) for +=: 'int' and 'NoneType' (backport #33382)
2022-12-20 17:00:41 +05:30
Deepesh Garg
16ce411b8f fix: Consolidated financial report 2022-12-20 16:48:08 +05:30
Deepesh Garg
a7c7558b68 Merge pull request #33399 from frappe/mergify/bp/version-14-hotfix/pr-33350
fix: Payment Request flow fixes from Order to Payment Entry (backport #33350)
2022-12-20 16:17:43 +05:30
Deepesh Garg
a86b8eada9 chore: remove print statement
(cherry picked from commit 068df9f815)
2022-12-20 08:16:53 +00:00
Deepesh Garg
ce5065b132 fix: Cost center filter not working in cash flow report
(cherry picked from commit d0dbfec052)
2022-12-20 08:16:52 +00:00
Deepesh Garg
d8d5fa6d10 chore: More fixes
(cherry picked from commit 31c95deb88)
2022-12-20 08:16:03 +00:00
Deepesh Garg
fa2df8db8c chore: Update test case
(cherry picked from commit e25b98b620)
2022-12-20 08:16:03 +00:00
Deepesh Garg
a01db8fc38 fix: Payment Request flow fixes from Order to Payment Entry
(cherry picked from commit dc178984ae)
2022-12-20 08:16:03 +00:00
rohitwaghchaure
1f0f6e136b Merge pull request #33389 from frappe/mergify/bp/version-14-hotfix/pr-33387
fix: daily scheduler to identify and fix stock transfer entries having incorrect valuation (backport #33387)
2022-12-20 11:47:08 +05:30
Rohit Waghchaure
88dc81b7d4 fix: unsupported operand type(s) for +=: 'int' and 'NoneType'
(cherry picked from commit 2b4eae5f84)
2022-12-20 04:18:50 +00:00
Rohit Waghchaure
64b25fba48 test: added test case to validate audit for incorrect entries
(cherry picked from commit f31612376a)
2022-12-20 04:17:51 +00:00
Rohit Waghchaure
deb3efdd9a fix: daily scheduler to identify and fix stock transfer entries having incorrect valuation
(cherry picked from commit b1721b79ce)
2022-12-20 04:17:51 +00:00
mergify[bot]
fa77259f8d fix: incorrect type hints (backport #33381) (#33384)
fix: incorrect type hints (#33381)


(cherry picked from commit 88ce11f03d)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2022-12-19 18:01:42 +05:30
Deepesh Garg
71496a56ae Merge pull request #33376 from frappe/mergify/bp/version-14-hotfix/pr-33341
fix: Cost Center for tax withholding invoices (backport #33341)
2022-12-17 21:13:07 +05:30
Deepesh Garg
aac567c31c Merge pull request #33377 from frappe/mergify/bp/version-14-hotfix/pr-33339
feat: more control when printing RFQ (backport #33339)
2022-12-17 20:06:23 +05:30
barredterra
7ff50b9446 feat: improve visibility of default values
(cherry picked from commit 8717148d9b)
2022-12-17 13:55:47 +00:00
barredterra
07cda0aeb5 feat: more control when printing RFQ
(cherry picked from commit ce9626fead)
2022-12-17 13:55:47 +00:00
Deepesh Garg
4ea930a9e5 chore: resolve errors in test
(cherry picked from commit 26277cfcf3)
2022-12-17 13:55:15 +00:00
Deepesh Garg
728643aa4a fix: Cost Center for tax withholding invoices
(cherry picked from commit 973ef33eb5)
2022-12-17 13:55:15 +00:00
Deepesh Garg
cfa6ba1594 Merge pull request #33375 from frappe/mergify/bp/version-14-hotfix/pr-33371
fix: Unable to import COA through importer (backport #33371)
2022-12-17 19:22:35 +05:30
Deepesh Garg
f8c09ee720 fix: Unable to import COA through importer
(cherry picked from commit 3b66920342)
2022-12-17 11:13:07 +00:00
Deepesh Garg
6c63965b1f Merge pull request #33369 from frappe/mergify/bp/version-14-hotfix/pr-33275
fix: use highest precision for exchange rate. (backport #33275)
2022-12-16 16:11:51 +05:30
Devin Slauenwhite
4a8a84d6f0 fix: use highest precision for exchange rate.
(cherry picked from commit 2010b1b6e8)
2022-12-16 10:14:23 +00:00
Deepesh Garg
6f16cfa4ca Merge pull request #33366 from frappe/mergify/bp/version-14-hotfix/pr-33362
feat: Ignore company related doctype for other apps via hooks (backport #33362)
2022-12-16 12:30:50 +05:30
rohitwaghchaure
c4e80ab9f8 Merge pull request #33359 from frappe/mergify/bp/version-14-hotfix/pr-33355
fix: disabled items showing in the report Itemwise Recommended Reorder Level (backport #33355)
2022-12-16 11:39:51 +05:30
Deepesh Garg
cd5a2af272 feat: Ignore company related doctype for other apps via hooks
(cherry picked from commit 1a40c04b72)
2022-12-16 05:38:27 +00:00
Rohit Waghchaure
493509e42d fix: disabled items showing in the report 'Itemwise Recommended Reorder Level
'

(cherry picked from commit ae31ff1c48)
2022-12-15 12:38:53 +00:00
rohitwaghchaure
beaf9558ef Merge pull request #33356 from frappe/mergify/bp/version-14-hotfix/pr-33354
fix: unsupported operand type(s) for +: 'int' and 'NoneType' (backport #33354)
2022-12-15 18:08:45 +05:30
Rohit Waghchaure
7bdfb3d181 fix: unsupported operand type(s) for +: 'int' and 'NoneType'
(cherry picked from commit 0f28074e5a)
2022-12-15 11:44:34 +00:00
ruthra kumar
69409233c0 Merge pull request #33351 from frappe/mergify/bp/version-14-hotfix/pr-33335
fix: paid invoices shows up as outstanding when 'cost_center' filter is applied (backport #33335)
2022-12-15 17:00:46 +05:30
ruthra kumar
7d1ec5af39 test: cost center should not affect outstanding calculation
(cherry picked from commit a998a8a2da)
2022-12-15 09:33:07 +00:00
ruthra kumar
ff61997d25 fix: cost_center filter fix for 'Get Outstanding Invoice' in PE
(cherry picked from commit 8eb93004f7)
2022-12-15 09:33:07 +00:00
ruthra kumar
9b2b2812ca fix: cost_center filter gives incorrect output
filtering on cost center gives invoices that are reconciled as having outstanding

(cherry picked from commit 6d9d730759)
2022-12-15 09:33:07 +00:00
Deepesh Garg
74d9b1c700 Merge pull request #33348 from frappe/mergify/bp/version-14-hotfix/pr-33305
feat: incoterm named place (backport #33305)
2022-12-15 13:38:09 +05:30
Deepesh Garg
83ba5c5fb1 chore: resolve conflicts 2022-12-15 12:28:11 +05:30
barredterra
bfe57acdbf feat: incoterm named place
(cherry picked from commit e057e1dfe7)

# Conflicts:
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
2022-12-15 06:30:37 +00:00
Deepesh Garg
f47d01fcb1 Merge pull request #33346 from frappe/mergify/bp/version-14-hotfix/pr-33309
refactor: translatable strings and guard clause (backport #33309)
2022-12-15 12:00:17 +05:30
barredterra
43f990f5e8 refactor: translatable strings and guard clause
(cherry picked from commit f20370c5ef)
2022-12-15 03:52:17 +00:00
rohitwaghchaure
c69e054d2e Merge pull request #33342 from frappe/mergify/bp/version-14-hotfix/pr-33323
fix: translatability of warning on overbilling/-receipt/-delivery (backport #33323)
2022-12-15 00:54:38 +05:30
barredterra
ba51d50fef fix: translation for warning on Overbilling/-receipt/-delivery
(cherry picked from commit 36997d9788)
2022-12-14 17:55:04 +00:00
rohitwaghchaure
56db733797 Merge pull request #33333 from frappe/mergify/bp/version-14-hotfix/pr-33332
fix: get_serial_nos_for_fg() missing 1 required positional argument: … (backport #33332)
2022-12-14 23:07:22 +05:30
Rohit Waghchaure
bddb5b8d25 fix: get_serial_nos_for_fg() missing 1 required positional argument: 'args'
(cherry picked from commit 410a58b3de)
2022-12-14 10:38:16 +00:00
Frappe PR Bot
ac1af3bce9 chore(release): Bumped to Version 14.10.1
## [14.10.1](https://github.com/frappe/erpnext/compare/v14.10.0...v14.10.1) (2022-12-13)

### Bug Fixes

* `Enough Parts to Build` in `BOM Stock Report` ([3b9e9d2](3b9e9d2c6e))
* `Material Request` reference in internal `Sales Order` ([416d178](416d178209))
* add translation variable order ([ef933a8](ef933a8231))
* Buying and selling check in pricing rule ([f5205a5](f5205a5b5d))
* **ecommerce:** remove query parameters from referer ([40621b9](40621b99c8))
* handle_post_depr_entries_fail, show error alert and send email ([b661f57](b661f5758a))
* incorrect balance on parent company due to key mismatch ([436e93c](436e93c129))
* index error on customer master ([02cc618](02cc618a1f))
* Maintain Same Rate Throughout Sales Cycle doesn't work ([5398cf8](5398cf8f22)), closes [#32923](https://github.com/frappe/erpnext/issues/32923)
* order status in `Production Planning Report` ([a657db6](a657db66b4))
* Permission issue in Tax Detail report ([7a5b80d](7a5b80dfbc))
* **pos:** variable typo: `s_pos` -> `is_pos` ([afbd48f](afbd48f26e))
* Reapply pricing rule on qty change ([c726c16](c726c16702))
* Remove free items ([5e5937d](5e5937d6d0))
* total value in Warehouse Wise Stock Balance ([c5a54d7](c5a54d7912))

### Performance Improvements

* add indexes on payment entry reference (backport [#33288](https://github.com/frappe/erpnext/issues/33288)) ([#33289](https://github.com/frappe/erpnext/issues/33289)) ([ce63086](ce63086813))
2022-12-13 12:30:55 +00:00
Ankush Menat
983cc345f2 Merge pull request #33318 from frappe/version-14-hotfix
chore: release v14
2022-12-13 17:59:30 +05:30
Sagar Sharma
6c3e802657 Merge pull request #33320 from frappe/mergify/bp/version-14-hotfix/pr-33314
fix: `Enough Parts to Build` in `BOM Stock Report` (backport #33314)
2022-12-13 15:58:24 +05:30
Sagar Sharma
4059b768f6 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33314 2022-12-13 15:24:41 +05:30
Nabin Hait
bd6d249b8a Merge pull request #33322 from frappe/mergify/bp/version-14-hotfix/pr-33300
fix(pos): variable typo: `s_pos` -> `is_pos` (backport #33300)
2022-12-13 15:22:53 +05:30
Sabu Siyad
afbd48f26e fix(pos): variable typo: s_pos -> is_pos
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit 7d64bf78cf)
2022-12-13 09:52:15 +00:00
s-aga-r
3b9e9d2c6e fix: Enough Parts to Build in BOM Stock Report
(cherry picked from commit 723c64ba73)
2022-12-13 09:50:01 +00:00
Nabin Hait
00ce3382b8 Merge pull request #33316 from frappe/mergify/bp/version-14-hotfix/pr-33313
fix: Permission issue in Tax Detail report (backport #33313)
2022-12-13 15:15:35 +05:30
Nabin Hait
00379c277b Merge pull request #33259 from AnandBaburajan/handle_post_depr_entries_fail
fix: handle asset depreciation entries posting failure, show error alert and send email
2022-12-13 15:05:36 +05:30
Nabin Hait
7a5b80dfbc fix: Permission issue in Tax Detail report
(cherry picked from commit aa787e4030)
2022-12-13 08:58:29 +00:00
Anand Baburajan
db36ddc7c0 Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail 2022-12-13 14:09:11 +05:30
ruthra kumar
dbd0d560a8 Merge pull request #33311 from frappe/mergify/bp/version-14-hotfix/pr-33303
fix: incorrect balance on parent company on consolidate Balance sheet due to key mismatch (backport #33303)
2022-12-13 13:45:41 +05:30
rohitwaghchaure
d707528113 Merge pull request #33301 from frappe/mergify/bp/version-14-hotfix/pr-33281
fix: maintain same rate throughout sales cycle doesn't work with quotation (backport #33281)
2022-12-13 10:59:11 +05:30
ruthra kumar
436e93c129 fix: incorrect balance on parent company due to key mismatch
(cherry picked from commit 7b3316dc31)
2022-12-13 03:37:05 +00:00
Sagar Sharma
8b7c9ced0a Merge pull request #33306 from frappe/mergify/bp/version-14-hotfix/pr-33304
fix: `Material Request` reference in internal `Sales Order` (backport #33304)
2022-12-12 23:53:10 +05:30
s-aga-r
416d178209 fix: Material Request reference in internal Sales Order
(cherry picked from commit 78b438f6cf)
2022-12-12 18:18:53 +00:00
Tunde Akinyanmi
5d410f114a test: refactor test case
(cherry picked from commit 71aa8c5e1c)
2022-12-12 14:10:04 +00:00
Tunde Akinyanmi
1b94200ab7 test: ensure test case sets Selling Settings
(cherry picked from commit d193a14b8f)
2022-12-12 14:10:04 +00:00
Tunde Akinyanmi
5398cf8f22 fix: Maintain Same Rate Throughout Sales Cycle doesn't work
Issue #29976 was partly fixed by #32923 but the problem still persists.
The reason is because an incorrect fieldname was passed to the
`validate_rate_with_reference_doc` method.
This commit fixes it

(cherry picked from commit 97ddfcfc7c)
2022-12-12 14:10:03 +00:00
Anand Baburajan
7a7325fd90 Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail 2022-12-12 16:36:19 +05:30
mergify[bot]
ce63086813 perf: add indexes on payment entry reference (backport #33288) (#33289)
perf: add indexes on payment entry reference (#33288)

Adds index on:
1. reference doctype
2. reference name

*Why not composite index?*

There are three type of queries on this doctype

- filtering ref_doctype - doctype index helps here
- filtering ref_name - name index helps here
- filtering both - name index helps here too. Since it has sufficiently
  high cardinality. Composite index wont help in case where ref_doctype
  isn't specfied.

[skip ci]

(cherry picked from commit 593626f502)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2022-12-12 13:02:23 +05:30
Anand Baburajan
92ed9fdd03 Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail 2022-12-08 21:26:27 +05:30
rohitwaghchaure
52e07da535 Merge pull request #33262 from frappe/mergify/bp/version-14-hotfix/pr-33258
fix: total value in Warehouse Wise Stock Balance (backport #33258)
2022-12-08 21:14:29 +05:30
Anand Baburajan
9b5620c838 Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail 2022-12-08 21:04:32 +05:30
anandbaburajan
4fbf65dd57 chore: use frappe.db.set_value instead of asset.save 2022-12-08 21:04:08 +05:30
Deepesh Garg
c2aaab9e15 Merge pull request #33272 from frappe/mergify/bp/version-14-hotfix/pr-33200
fix: Buying and selling check in pricing rule (backport #33200)
2022-12-08 20:54:48 +05:30
Deepesh Garg
ad03355333 chore: Update tests
(cherry picked from commit 6192af5cf0)
2022-12-08 13:12:32 +00:00
Deepesh Garg
5e5937d6d0 fix: Remove free items
(cherry picked from commit 0581000990)
2022-12-08 13:12:31 +00:00
Deepesh Garg
033b2a4825 chore: Add POS Invoices
(cherry picked from commit 5f821b93a5)
2022-12-08 13:12:31 +00:00
Deepesh Garg
c726c16702 fix: Reapply pricing rule on qty change
(cherry picked from commit b741ae143c)
2022-12-08 13:12:30 +00:00
Deepesh Garg
f5205a5b5d fix: Buying and selling check in pricing rule
(cherry picked from commit f54838ab56)
2022-12-08 13:12:30 +00:00
Deepesh Garg
b0cccaff01 Merge pull request #33266 from frappe/mergify/bp/version-14-hotfix/pr-33227
fix: add translation variable index (backport #33227)
2022-12-08 18:06:37 +05:30
Deepesh Garg
05056327e7 Merge pull request #33270 from frappe/mergify/bp/version-14-hotfix/pr-33269
fix(ecommerce): remove query parameters from referrer (backport #33269)
2022-12-08 18:06:22 +05:30
Sabu Siyad
40621b99c8 fix(ecommerce): remove query parameters from referer
inclusion of query parameters results in logic failure

example:
- logic check if referrer is `all-products`
- `http://shop.example/all-products` -> `all-products`, valid outcome
- `http://shop.example/all-products?start=1` -> `all-products?start=1`,
  invalid outcome

Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit b6bd408f19)
2022-12-08 11:42:24 +00:00
barredterra
ef933a8231 fix: add translation variable order
(cherry picked from commit 748c74ba52)
2022-12-08 09:47:56 +00:00
Deepesh Garg
8467b2eb25 Merge pull request #33264 from frappe/mergify/bp/version-14-hotfix/pr-33254
fix: index error on customer master (backport #33254)
2022-12-08 15:15:42 +05:30
ruthra kumar
02cc618a1f fix: index error on customer master
(cherry picked from commit cf1e3dc8ea)
2022-12-08 07:23:13 +00:00
Rohit Waghchaure
c5a54d7912 fix: total value in Warehouse Wise Stock Balance
(cherry picked from commit f598da7c81)
2022-12-08 04:43:59 +00:00
anandbaburajan
bb66b64b94 chore: styling 2022-12-08 01:35:10 +05:30
Anand Baburajan
c35e352b3b Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail 2022-12-08 01:29:43 +05:30
anandbaburajan
b661f5758a fix: handle_post_depr_entries_fail, show error alert and send email 2022-12-08 01:00:57 +05:30
Sagar Sharma
162ecdca75 Merge pull request #33256 from frappe/mergify/bp/version-14-hotfix/pr-33255
fix: order status in `Production Planning Report` (backport #33255)
2022-12-08 00:04:01 +05:30
s-aga-r
a657db66b4 fix: order status in Production Planning Report
(cherry picked from commit 632c08f7e0)
2022-12-07 18:06:54 +00:00
Frappe PR Bot
1e351a9e0b chore(release): Bumped to Version 14.10.0
# [14.10.0](https://github.com/frappe/erpnext/compare/v14.9.0...v14.10.0) (2022-12-06)

### Bug Fixes

* add company filter in RFQ Items ([7c1595e](7c1595e2c2))
* Allow item rate udpates for non-stock invoices ([0307656](030765618b))
* Bundle item rates ([82cdf49](82cdf49d32))
* data import mandatory account_head, charge_type ([653cb9f](653cb9fc3b))
* default clear repost logs ([e039a14](e039a14f6f))
* Due date for month end payment term ([9b40b7f](9b40b7f240))
* Error on making stock entry from material request ([701ccc3](701ccc36c8))
* key error on p/l and balance sheet reports on foreign currency ([23a0a53](23a0a5337e))
* key error while filtering on date range and different currency ([08bca7d](08bca7d252))
* **lint:** trailing whitespace ([fae941c](fae941c4e3))
* non empty FG batch picked while completing work order ([e5e6b5d](e5e6b5d81c))
* **pos:** partial return amount update ([91920f4](91920f4d84))
* reload currency exchange settings ([5b5a85e](5b5a85ee3b))
* replace sql code with fields list in get_cached_value ([e18d0ec](e18d0eca3c))
* Tax withholding net total for PI in reports ([f87c3c6](f87c3c6157))
* test case ([39680ed](39680ed28b))
* type error on Sales Pipeline Analytics ([3af2b9b](3af2b9b423))
* use is_last_day_of_the_month in test_scrap_asset ([fc175e2](fc175e2b1f))
* **UX:** Alert on change of item rate in Stock Entry ([b2da76f](b2da76f02c))

### Features

* warehouse wise stock balance ([7027fda](7027fdae39))
2022-12-06 14:37:42 +00:00
Deepesh Garg
8f97b07463 Merge pull request #33233 from frappe/version-14-hotfix
chore: release v14
2022-12-06 20:06:17 +05:30
Deepesh Garg
e5cd4195d9 Merge pull request #33238 from frappe/mergify/bp/version-14-hotfix/pr-33192
fix: Bundle item rates (backport #33192)
2022-12-06 18:57:08 +05:30
Deepesh Garg
8a17680e75 Merge pull request #33239 from frappe/mergify/bp/version-14-hotfix/pr-33146
fix: reload Currency Exchange Settings in patch (backport #33146)
2022-12-06 18:56:52 +05:30
rohitwaghchaure
bc5523318c Merge pull request #33240 from frappe/mergify/bp/version-14-hotfix/pr-33236
feat: warehouse wise stock balance (backport #33236)
2022-12-06 18:03:36 +05:30
Rohit Waghchaure
7027fdae39 feat: warehouse wise stock balance
(cherry picked from commit 861aa9e08a)
2022-12-06 12:29:23 +00:00
barredterra
5b5a85ee3b fix: reload currency exchange settings
(cherry picked from commit 06e094b5fc)
2022-12-06 12:09:03 +00:00
Deepesh Garg
98bb446e98 chore: Update tests
(cherry picked from commit b1242bc56c)
2022-12-06 12:08:06 +00:00
Deepesh Garg
076027a68c chore: Consider bundle qty as well
(cherry picked from commit e5566b31d5)
2022-12-06 12:08:06 +00:00
Deepesh Garg
82cdf49d32 fix: Bundle item rates
(cherry picked from commit 826f45ad60)
2022-12-06 12:08:05 +00:00
Deepesh Garg
cc0f9d4ed5 Merge pull request #33235 from frappe/mergify/bp/version-14-hotfix/pr-33191
fix: key error while filtering on date range and reporting on foreign currency (backport #33191)
2022-12-06 17:36:18 +05:30
ruthra kumar
23a0a5337e fix: key error on p/l and balance sheet reports on foreign currency
(cherry picked from commit a6794c3606)
2022-12-06 16:55:03 +05:30
ruthra kumar
e18d0eca3c fix: replace sql code with fields list in get_cached_value
(cherry picked from commit 19db7e2989)
2022-12-06 16:55:00 +05:30
ruthra kumar
08bca7d252 fix: key error while filtering on date range and different currency
(cherry picked from commit 9b8d6fe411)
2022-12-06 10:14:01 +00:00
Deepesh Garg
ee74c555d5 Merge pull request #33230 from frappe/mergify/bp/version-14-hotfix/pr-33219
fix: Allow item rate updates for non-stock invoices (backport #33219)
2022-12-06 12:30:41 +05:30
Deepesh Garg
030765618b fix: Allow item rate udpates for non-stock invoices
(cherry picked from commit ef9d126254)
2022-12-06 03:43:16 +00:00
rohitwaghchaure
cea7a32abc Merge pull request #33225 from frappe/mergify/bp/version-14-hotfix/pr-33224
fix: non empty FG batch picked while completing work order (backport #33224)
2022-12-05 23:59:07 +05:30
Rohit Waghchaure
e5e6b5d81c fix: non empty FG batch picked while completing work order
(cherry picked from commit 713330cbf6)
2022-12-05 15:00:15 +00:00
ruthra kumar
60f5611fb9 Merge pull request #33223 from frappe/mergify/bp/version-14-hotfix/pr-33222
fix: data import mandatory account_head, charge_type (backport #33222)
2022-12-05 17:56:27 +05:30
ruthra kumar
653cb9fc3b fix: data import mandatory account_head, charge_type
(cherry picked from commit 3814db02eb)
2022-12-05 11:27:34 +00:00
Sagar Sharma
5bdec0b512 Merge pull request #33205 from frappe/mergify/bp/version-14-hotfix/pr-33199
refactor: remove `balance` from `Warehouse Tree` (backport #33199)
2022-12-02 18:27:07 +05:30
s-aga-r
bcbeaea05c refactor: remove balance from Warehouse Tree
(cherry picked from commit 3ce8386ca3)
2022-12-02 08:55:05 +00:00
Deepesh Garg
251440dfec Merge pull request #33203 from frappe/mergify/bp/version-14-hotfix/pr-33193
fix: clear repost logs using Log Settings (backport #33193)
2022-12-02 14:23:29 +05:30
Rohit Waghchaure
39680ed28b fix: test case
(cherry picked from commit 2cce6f2a34)
2022-12-02 08:26:50 +00:00
Rohit Waghchaure
e039a14f6f fix: default clear repost logs
(cherry picked from commit 5949a7ecff)
2022-12-02 08:26:49 +00:00
Deepesh Garg
a05bf0a7ca Merge pull request #33201 from frappe/mergify/bp/version-14-hotfix/pr-33195
fix: type error on Sales Pipeline Analytics (backport #33195)
2022-12-02 13:13:44 +05:30
ruthra kumar
3af2b9b423 fix: type error on Sales Pipeline Analytics
(cherry picked from commit 4856e750f9)
2022-12-02 04:41:21 +00:00
Deepesh Garg
d7306d2ec4 Merge pull request #33197 from frappe/mergify/bp/version-14-hotfix/pr-33183
fix: Due date for month end payment term (backport #33183)
2022-12-02 10:09:55 +05:30
Sagar Sharma
ffa4deac26 Merge pull request #33196 from frappe/mergify/bp/version-14-hotfix/pr-33182
fix: Error on making stock entry from material request (backport #33182)
2022-12-01 21:37:39 +05:30
Sagar Sharma
a80f8ed2f8 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33182 2022-12-01 19:56:55 +05:30
Sagar Sharma
1214b93e07 Merge pull request #33198 from frappe/mergify/bp/version-14-hotfix/pr-33170
fix(UX): Alert on change of item rate in Stock Entry (backport #33170)
2022-12-01 19:56:16 +05:30
Deepesh Garg
b2da76f02c fix(UX): Alert on change of item rate in Stock Entry
(cherry picked from commit 4bd9289d7d)
2022-12-01 12:47:39 +00:00
Deepesh Garg
9b40b7f240 fix: Due date for month end payment term
(cherry picked from commit bfb81ef56f)
2022-12-01 12:46:55 +00:00
Deepesh Garg
701ccc36c8 fix: Error on making stock entry from material request
(cherry picked from commit 64e5a79a91)
2022-12-01 12:46:12 +00:00
Deepesh Garg
dfd43141e3 Merge pull request #33188 from frappe/mergify/bp/version-14-hotfix/pr-33091
fix(pos): partial return amount update (backport #33091)
2022-12-01 16:17:29 +05:30
Deepesh Garg
6debf39ee8 Merge pull request #33189 from AnandBaburajan/asset_last_day_test_bug_14_htfx
fix: use is_last_day_of_the_month in test_scrap_asset (backport #33185)
2022-12-01 16:17:01 +05:30
anandbaburajan
fc175e2b1f fix: use is_last_day_of_the_month in test_scrap_asset 2022-12-01 13:01:23 +05:30
Sabu Siyad
fae941c4e3 fix(lint): trailing whitespace
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit c5edbe2e2f)
2022-12-01 06:12:26 +00:00
Sabu Siyad
91920f4d84 fix(pos): partial return amount update
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit a378619c9a)
2022-12-01 06:12:25 +00:00
Sagar Sharma
6957e2a85c Merge pull request #33175 from frappe/mergify/bp/version-14-hotfix/pr-33174
fix: add company filter in RFQ Items (backport #33174)
2022-11-30 12:25:57 +05:30
s-aga-r
7c1595e2c2 fix: add company filter in RFQ Items
(cherry picked from commit ca0485a503)
2022-11-30 05:07:06 +00:00
Deepesh Garg
6878536a57 Merge pull request #33168 from frappe/mergify/bp/version-14-hotfix/pr-33162
fix: Tax withholding net total for PI in reports (backport #33162)
2022-11-29 19:23:16 +05:30
Deepesh Garg
f87c3c6157 fix: Tax withholding net total for PI in reports
(cherry picked from commit 3eb1ed19a1)
2022-11-29 13:21:16 +00:00
Frappe PR Bot
7d63bcbeb6 chore(release): Bumped to Version 14.9.0
# [14.9.0](https://github.com/frappe/erpnext/compare/v14.8.0...v14.9.0) (2022-11-29)

### Bug Fixes

* `production_item` filter in `Job Card Summary Report` ([c9f4f60](c9f4f60425))
* `Work Order` filter typo in `Job Card Summary Report` ([b157193](b1571932d0))
* Auto repeat date validations ([2aada1a](2aada1a0d9))
* check for session user rather than owner ([c9c7222](c9c7222ded))
* company name with `,` in `Job Card Summary Report` ([9c6d020](9c6d020e49))
* company name with `,` in `Work Order Summary Report` ([bc649b3](bc649b371f))
* create rounding gl entry for PCV during gle post processing ([fd4bcd9](fd4bcd9f7f))
* Debit and Credit not equal while submitting PI containing asset item ([c11a31b](c11a31b390))
* disbursable amount on currrent security price ([5edaf83](5edaf83733))
* Dispatch address display ([ef687e2](ef687e22b8))
* incorrect balance qty ([f92b501](f92b5011da))
* job card for quantity UX ([59e2ab7](59e2ab702f))
* MR Item `description` and `item_name` gets reset on `qty` change ([85d108b](85d108b810))
* only show serial no batch selector only once ([8d0f715](8d0f715087))
* opportunity list doesn't show assigned user (backport [#33110](https://github.com/frappe/erpnext/issues/33110)) ([#33131](https://github.com/frappe/erpnext/issues/33131)) ([0ba2a4d](0ba2a4d084))
* **pos:** filter on customer groups ([c1ae5b0](c1ae5b0af5))
* **pos:** warehouse should be in company ([c03ec80](c03ec80d1a))
* precision in asset test_scrap_asset ([0fe5e9a](0fe5e9a9d1))
* production plan UX ([4607590](46075901ba))
* remove duplicate schema ([cdd13cd](cdd13cd95f))
* remove obsolete comment ([978924a](978924a7e4))
* reposting error `AttributeError: 'datetime.timedelta' object has no attribute 'replace'` ([4b0c9b6](4b0c9b6115))
* reset `voucher_type` and `voucher_no` if `based_on` is set to `Item and Warehouse` ([e530f0b](e530f0b2fb))
* UX for inventory dimension ([f1dd4d0](f1dd4d0449))
* **ux:** Action buttons in Bank Reconciliation ([93b8cc3](93b8cc3042))
* validation msg in stock entry ([65ac84e](65ac84e020))
* Valuation Rate column UX in stock ledger report ([5c065e8](5c065e8a64))

### Features

* add connections to Incoterm doctype ([89b9a06](89b9a06204))
* add doctype Incoterm ([b711931](b7119318a6))
* add german translations for incoterm titles ([f7988de](f7988dea1b))
* add incoterm to purchasing transactions ([88346b1](88346b17e9))
* add incoterm to sales transactions ([fcfe0cb](fcfe0cb9e9))
* create Incoterm records after install ([93e029d](93e029df91))
* create incoterms and migrate shipments ([014896a](014896a595))
* german tax templates ([5652af0](5652af04ba))
* item wise tds calculation for purchase order ([5f8f574](5f8f574e20))
* item wise tds calculation for purchase order. ([2bd8bd2](2bd8bd224b))
* item wise tds in purchase order ([ba36435](ba3643514e))
* make Material Request for sub-assembly items ([5fc4dfa](5fc4dfaad6))
* **pos:** invoice: fitler warehouse by company ([c379baf](c379baf7a2))
* validate repost item valuation against accounts freeze date ([04f50ea](04f50ea76a))
2022-11-29 13:19:34 +00:00
Deepesh Garg
9fc8acf707 Merge pull request #33163 from frappe/version-14-hotfix
chore: release v14
2022-11-29 18:48:14 +05:30
Sagar Sharma
f2f06aaa56 Merge pull request #33159 from frappe/mergify/bp/version-14-hotfix/pr-33136
fix: reset `voucher_type` and `voucher_no` if `based_on` is set to `Transaction` (backport #33136)
2022-11-29 13:24:53 +05:30
s-aga-r
5728300f03 chore: make posting_date and posting_time read-only if based_on is set to Transaction
(cherry picked from commit 4e10352b48)
2022-11-29 06:44:35 +00:00
s-aga-r
e530f0b2fb fix: reset voucher_type and voucher_no if based_on is set to Item and Warehouse
(cherry picked from commit eeec008547)
2022-11-29 06:44:35 +00:00
rohitwaghchaure
8ebf34629d Merge pull request #33158 from frappe/mergify/bp/version-14-hotfix/pr-33013
fix: validate repost item valuation against accounts freeze date (backport #33013)
2022-11-29 12:06:29 +05:30
Sagar Sharma
72351e38f2 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33013 2022-11-29 11:16:53 +05:30
Deepesh Garg
6fa81089d6 Merge pull request #33152 from frappe/mergify/bp/version-14-hotfix/pr-33143
fix: Auto repeat date validations (backport #33143)
2022-11-29 11:07:46 +05:30
Deepesh Garg
fb6791abe3 Merge pull request #33153 from frappe/mergify/bp/version-14-hotfix/pr-33115
fix: remove product schema block from additional info section on item template (backport #33115)
2022-11-29 11:07:23 +05:30
Deepesh Garg
bf833c4f09 Merge pull request #33151 from frappe/mergify/bp/version-14-hotfix/pr-33138
fix(ux): Action buttons in Bank Reconciliation (backport #33138)
2022-11-29 11:06:48 +05:30
Deepesh Garg
5848147a92 Merge pull request #33155 from frappe/mergify/bp/version-14-hotfix/pr-33098
fix(pos): warehouse selection (backport #33098)
2022-11-29 11:06:21 +05:30
Deepesh Garg
150319d0cb Merge pull request #33156 from frappe/mergify/bp/version-14-hotfix/pr-33116
fix: only show serial no batch selector only once (backport #33116)
2022-11-29 11:06:08 +05:30
Deepesh Garg
b9ff172e13 Merge pull request #33154 from frappe/mergify/bp/version-14-hotfix/pr-33112
fix(pos): filter on customer groups (backport #33112)
2022-11-29 11:05:54 +05:30
Dany Robert
5854f1791c chore: pre-commit
(cherry picked from commit 88a0aa4077)
2022-11-29 05:11:39 +00:00
Dany Robert
c9c7222ded fix: check for session user rather than owner
(cherry picked from commit b482e3876d)
2022-11-29 05:11:39 +00:00
Dany Robert
68d9161a66 chore: pre-commit
(cherry picked from commit be15419bd5)
2022-11-29 05:11:38 +00:00
Dany Robert
04f50ea76a feat: validate repost item valuation against accounts freeze date
(cherry picked from commit 61f05132db)
2022-11-29 05:11:38 +00:00
rohitwaghchaure
4928058ed8 Merge pull request #33149 from frappe/mergify/bp/version-14-hotfix/pr-33144
fix: incorrect balance qty (backport #33144)
2022-11-29 10:41:36 +05:30
Shariq Ansari
8d0f715087 fix: only show serial no batch selector only once
(cherry picked from commit 0f87d329d6)
2022-11-29 04:51:19 +00:00
Sabu Siyad
c379baf7a2 feat(pos): invoice: fitler warehouse by company
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit 4ad0e2ed7e)
2022-11-29 04:46:19 +00:00
Sabu Siyad
c03ec80d1a fix(pos): warehouse should be in company
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit 95a620a30d)
2022-11-29 04:46:19 +00:00
Sabu Siyad
c1ae5b0af5 fix(pos): filter on customer groups
Signed-off-by: Sabu Siyad <hello@ssiyad.com>
(cherry picked from commit cc63415887)
2022-11-29 04:26:25 +00:00
ruthra kumar
cdd13cd95f fix: remove duplicate schema
(cherry picked from commit 2c18a95115)
2022-11-29 04:06:25 +00:00
Deepesh Garg
5abcb478d0 chore: Update condition
(cherry picked from commit 6a47fb6c9e)
2022-11-29 03:59:09 +00:00
Deepesh Garg
2aada1a0d9 fix: Auto repeat date validations
(cherry picked from commit fa15221455)
2022-11-29 03:59:09 +00:00
Deepesh Garg
e093c32d06 Merge pull request #33128 from frappe/mergify/bp/version-14-hotfix/pr-33022
feat: Incoterms in buying and selling (backport #33022)
2022-11-29 09:28:59 +05:30
Deepesh Garg
93b8cc3042 fix(ux): Action buttons in Bank Reconciliation
(cherry picked from commit 6ebe8ad60d)
2022-11-29 03:54:02 +00:00
Rohit Waghchaure
93ec57dd44 test: test case for serialized batched item
(cherry picked from commit b606a9684b)
2022-11-29 03:18:53 +00:00
Rohit Waghchaure
f92b5011da fix: incorrect balance qty
(cherry picked from commit b2105a8be7)
2022-11-29 03:18:53 +00:00
Raffael Meyer
7477bb96c8 chore: resolve merge conflict 2022-11-28 18:51:40 +01:00
Deepesh Garg
6c3fbf03f9 Merge branch 'version-14-hotfix' into mergify/bp/version-14-hotfix/pr-33022 2022-11-28 23:06:23 +05:30
Deepesh Garg
0d8112af76 Merge pull request #33133 from frappe/mergify/bp/version-14-hotfix/pr-33129
chore: Supplier invoice no field description (backport #33129)
2022-11-28 22:48:45 +05:30
Deepesh Garg
088c168f96 Merge pull request #33142 from frappe/mergify/bp/version-14-hotfix/pr-33107
feat: german tax templates (backport #33107)
2022-11-28 22:48:20 +05:30
Sagar Sharma
ae26e550d0 Merge pull request #33140 from frappe/mergify/bp/version-14-hotfix/pr-33139
fix: reposting error `AttributeError: 'datetime.timedelta' object has no attribute 'replace'` (backport #33139)
2022-11-28 22:06:21 +05:30
barredterra
5652af04ba feat: german tax templates
(cherry picked from commit 7fd2639e68)
2022-11-28 16:25:02 +00:00
s-aga-r
4b0c9b6115 fix: reposting error AttributeError: 'datetime.timedelta' object has no attribute 'replace'
(cherry picked from commit eeda264eb6)
2022-11-28 16:01:39 +00:00
s-aga-r
65ac84e020 fix: validation msg in stock entry
(cherry picked from commit ba77da0874)
2022-11-28 16:01:39 +00:00
rohitwaghchaure
648a017eda Merge pull request #33137 from frappe/mergify/bp/version-14-hotfix/pr-33135
feat: make Material Request for sub-assembly items (backport #33135)
2022-11-28 18:32:54 +05:30
Rohit Waghchaure
5fc4dfaad6 feat: make Material Request for sub-assembly items
(cherry picked from commit e02f35c8ff)
2022-11-28 11:24:31 +00:00
Deepesh Garg
6e3ad109d2 chore: Supplier invoice no field description
(cherry picked from commit 4f2ece34df)
2022-11-28 07:36:10 +00:00
mergify[bot]
0ba2a4d084 fix: opportunity list doesn't show assigned user (backport #33110) (#33131)
fix: opportunity list doesn't show assigned user (#33110)

Because `db_update` is performed `_assign` property is not updated and
hence lead -> opportunity conversion makes it disappear from list view.

Steps to reproduce:

1. Create lead
2. Assign anyone
3. Create opportunity from lead.
4. Form view shows assigned user, list view wont.

(cherry picked from commit 63b9795d41)

Co-authored-by: Ankush Menat <ankush@frappe.io>
2022-11-28 11:19:32 +05:30
barredterra
21deb02d81 chore: resolve merge conflicts 2022-11-27 16:30:19 +01:00
Raffael Meyer
978924a7e4 fix: remove obsolete comment
(cherry picked from commit 491857b3c8)
2022-11-27 15:24:20 +00:00
barredterra
89b9a06204 feat: add connections to Incoterm doctype
(cherry picked from commit a5966b6f84)
2022-11-27 15:24:19 +00:00
barredterra
f7988dea1b feat: add german translations for incoterm titles
(cherry picked from commit ffd287d5a6)
2022-11-27 15:24:19 +00:00
barredterra
88346b17e9 feat: add incoterm to purchasing transactions
(cherry picked from commit 77105306f2)

# Conflicts:
#	erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
2022-11-27 15:24:18 +00:00
barredterra
fcfe0cb9e9 feat: add incoterm to sales transactions
(cherry picked from commit 029f22c549)

# Conflicts:
#	erpnext/accounts/doctype/sales_invoice/sales_invoice.json
2022-11-27 15:24:17 +00:00
barredterra
93e029df91 feat: create Incoterm records after install
(cherry picked from commit ce83f02f24)
2022-11-27 15:24:16 +00:00
barredterra
014896a595 feat: create incoterms and migrate shipments
(cherry picked from commit d2563ee973)

# Conflicts:
#	erpnext/patches.txt
2022-11-27 15:24:16 +00:00
barredterra
b7119318a6 feat: add doctype Incoterm
(cherry picked from commit 1a1bfc8db9)
2022-11-27 15:24:15 +00:00
Deepesh Garg
956b0520d7 Merge pull request #33113 from frappe/mergify/bp/version-14-hotfix/pr-33111
fix: Loan disbursable amount on current security price (backport #33111)
2022-11-27 20:50:09 +05:30
rohitwaghchaure
f365e6b4a2 Merge pull request #33127 from frappe/mergify/bp/version-14-hotfix/pr-33118
fix: production plan UX (backport #33118)
2022-11-27 18:47:39 +05:30
Sagar Sharma
9533a64f6a Merge pull request #33123 from frappe/mergify/bp/version-14-hotfix/pr-33120
fix: `Work Order Summary` and `Job Card Summary` Report (backport #33120)
2022-11-27 10:27:37 +05:30
Rohit Waghchaure
46075901ba fix: production plan UX
(cherry picked from commit 8cb7112e72)
2022-11-27 03:17:28 +00:00
s-aga-r
c9f4f60425 fix: production_item filter in Job Card Summary Report
(cherry picked from commit ef7fd670fc)
2022-11-26 16:24:52 +00:00
s-aga-r
9c6d020e49 fix: company name with , in Job Card Summary Report
(cherry picked from commit 481149814e)
2022-11-26 16:24:52 +00:00
s-aga-r
b1571932d0 fix: Work Order filter typo in Job Card Summary Report
(cherry picked from commit 2e4f3e9317)
2022-11-26 16:24:51 +00:00
s-aga-r
bc649b371f fix: company name with , in Work Order Summary Report
(cherry picked from commit 87b39f045c)
2022-11-26 16:24:50 +00:00
Sagar Sharma
6e5fd55ed4 Merge pull request #33108 from frappe/mergify/bp/version-14-hotfix/pr-33090
fix: MR Item `item_name` and `description` gets reset on `qty` change (backport #33090)
2022-11-26 10:07:50 +05:30
Abhinav Raut
5edaf83733 fix: disbursable amount on currrent security price
(cherry picked from commit fe87c27acd)
2022-11-25 09:48:42 +00:00
s-aga-r
85d108b810 fix: MR Item description and item_name gets reset on qty change
(cherry picked from commit df0fee2312)
2022-11-25 05:49:50 +00:00
Deepesh Garg
ae6ad1e47d Merge pull request #33096 from frappe/mergify/bp/version-14-hotfix/pr-33092
fix: Debit and Credit not equal while submitting PI containing asset item (backport #33092)
2022-11-24 21:22:44 +05:30
Deepesh Garg
98d5cb30d1 Merge pull request #33106 from frappe/mergify/bp/version-14-hotfix/pr-33103
fix: job card "Qty to Manufacture" UX (backport #33103)
2022-11-24 21:22:28 +05:30
Deepesh Garg
8cd2539755 Merge pull request #33104 from frappe/mergify/bp/version-14-hotfix/pr-33100
fix: Dispatch address display (backport #33100)
2022-11-24 21:22:02 +05:30
Rohit Waghchaure
59e2ab702f fix: job card for quantity UX
(cherry picked from commit 87d37e90a2)
2022-11-24 13:54:59 +00:00
Deepesh Garg
ef687e22b8 fix: Dispatch address display
(cherry picked from commit 104fdcb9f9)
2022-11-24 12:31:13 +00:00
Deepesh Garg
517e40e1b8 Merge pull request #33099 from frappe/mergify/bp/version-14-hotfix/pr-33097
fix: precision in asset test_scrap_asset (backport #33097)
2022-11-24 16:58:04 +05:30
anandbaburajan
0fe5e9a9d1 fix: precision in asset test_scrap_asset
(cherry picked from commit 0e726609f1)
2022-11-24 10:44:31 +00:00
Deepesh Garg
c11a31b390 fix: Debit and Credit not equal while submitting PI containing asset item
(cherry picked from commit dc8d635120)
2022-11-24 09:14:06 +00:00
Deepesh Garg
82e41a2721 Merge pull request #33089 from frappe/mergify/bp/version-14-hotfix/pr-33088
fix: Valuation Rate column UX in stock ledger report (backport #33088)
2022-11-23 18:22:15 +05:30
Rohit Waghchaure
5c065e8a64 fix: Valuation Rate column UX in stock ledger report
(cherry picked from commit be19e4f621)
2022-11-23 12:00:49 +00:00
rohitwaghchaure
188b18dc5b Merge pull request #33083 from frappe/mergify/bp/version-14-hotfix/pr-33077
fix: UX for inventory dimension (backport #33077)
2022-11-23 12:33:44 +05:30
Deepesh Garg
5d7c4c182a Merge pull request #33085 from frappe/mergify/bp/version-14-hotfix/pr-33062
fix: create rounding gl entry for PCV during gle post processing (backport #33062)
2022-11-23 11:50:26 +05:30
Deepesh Garg
798717b12b Merge pull request #33082 from frappe/mergify/bp/version-14-hotfix/pr-33063
feat: item wise tds in purchase order (backport #33063)
2022-11-23 11:47:54 +05:30
Deepesh Garg
7a9f384b18 chore: resolve conflicts 2022-11-23 10:58:47 +05:30
Nabin Hait
fd4bcd9f7f fix: create rounding gl entry for PCV during gle post processing
(cherry picked from commit 022d8d5d79)
2022-11-23 05:07:29 +00:00
Rohit Waghchaure
f1dd4d0449 fix: UX for inventory dimension
(cherry picked from commit 0a69523940)
2022-11-23 04:24:36 +00:00
niralisatapara
5f8f574e20 feat: item wise tds calculation for purchase order
(cherry picked from commit 0fdde2e5c0)

# Conflicts:
#	erpnext/patches.txt
2022-11-23 04:22:46 +00:00
niralisatapara
2bd8bd224b feat: item wise tds calculation for purchase order.
(cherry picked from commit 46e8cdf31a)
2022-11-23 04:22:45 +00:00
niralisatapara
ba3643514e feat: item wise tds in purchase order
(cherry picked from commit b9d0b4e2d3)
2022-11-23 04:22:45 +00:00
538 changed files with 19738 additions and 6746 deletions

View File

@@ -66,7 +66,8 @@ ignore =
F841,
E713,
E712,
B023
B023,
B028
max-line-length = 200

View File

@@ -3,52 +3,71 @@ import requests
from urllib.parse import urlparse
docs_repos = [
"frappe_docs",
"erpnext_documentation",
WEBSITE_REPOS = [
"erpnext_com",
"frappe_io",
]
DOCUMENTATION_DOMAINS = [
"docs.erpnext.com",
"frappeframework.com",
]
def uri_validator(x):
result = urlparse(x)
return all([result.scheme, result.netloc, result.path])
def docs_link_exists(body):
for line in body.splitlines():
for word in line.split():
if word.startswith('http') and uri_validator(word):
parsed_url = urlparse(word)
if parsed_url.netloc == "github.com":
parts = parsed_url.path.split('/')
if len(parts) == 5 and parts[1] == "frappe" and parts[2] in docs_repos:
return True
elif parsed_url.netloc == "docs.erpnext.com":
return True
def is_valid_url(url: str) -> bool:
parts = urlparse(url)
return all((parts.scheme, parts.netloc, parts.path))
def is_documentation_link(word: str) -> bool:
if not word.startswith("http") or not is_valid_url(word):
return False
parsed_url = urlparse(word)
if parsed_url.netloc in DOCUMENTATION_DOMAINS:
return True
if parsed_url.netloc == "github.com":
parts = parsed_url.path.split("/")
if len(parts) == 5 and parts[1] == "frappe" and parts[2] in WEBSITE_REPOS:
return True
return False
def contains_documentation_link(body: str) -> bool:
return any(
is_documentation_link(word)
for line in body.splitlines()
for word in line.split()
)
def check_pull_request(number: str) -> "tuple[int, str]":
response = requests.get(f"https://api.github.com/repos/frappe/erpnext/pulls/{number}")
if not response.ok:
return 1, "Pull Request Not Found! ⚠️"
payload = response.json()
title = (payload.get("title") or "").lower().strip()
head_sha = (payload.get("head") or {}).get("sha")
body = (payload.get("body") or "").lower()
if (
not title.startswith("feat")
or not head_sha
or "no-docs" in body
or "backport" in body
):
return 0, "Skipping documentation checks... 🏃"
if contains_documentation_link(body):
return 0, "Documentation Link Found. You're Awesome! 🎉"
return 1, "Documentation Link Not Found! ⚠️"
if __name__ == "__main__":
pr = sys.argv[1]
response = requests.get("https://api.github.com/repos/frappe/erpnext/pulls/{}".format(pr))
if response.ok:
payload = response.json()
title = (payload.get("title") or "").lower().strip()
head_sha = (payload.get("head") or {}).get("sha")
body = (payload.get("body") or "").lower()
if (title.startswith("feat")
and head_sha
and "no-docs" not in body
and "backport" not in body
):
if docs_link_exists(body):
print("Documentation Link Found. You're Awesome! 🎉")
else:
print("Documentation Link Not Found! ⚠️")
sys.exit(1)
else:
print("Skipping documentation checks... 🏃")
exit_code, message = check_pull_request(sys.argv[1])
print(message)
sys.exit(exit_code)

View File

@@ -8,8 +8,9 @@ sudo apt update && sudo apt install redis-server libcups2-dev
pip install frappe-bench
githubbranch=${GITHUB_BASE_REF:-${GITHUB_REF##*/}}
frappeuser=${FRAPPE_USER:-"frappe"}
frappebranch=${FRAPPE_BRANCH:-${GITHUB_BASE_REF:-${GITHUB_REF##*/}}}
frappebranch=${FRAPPE_BRANCH:-$githubbranch}
git clone "https://github.com/${frappeuser}/frappe" --branch "${frappebranch}" --depth 1
bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench
@@ -56,7 +57,7 @@ sed -i 's/schedule:/# schedule:/g' Procfile
sed -i 's/socketio:/# socketio:/g' Procfile
sed -i 's/redis_socketio:/# redis_socketio:/g' Procfile
bench get-app payments
bench get-app payments --branch ${githubbranch%"-hotfix"}
bench get-app erpnext "${GITHUB_WORKSPACE}"
if [ "$TYPE" == "server" ]; then bench setup requirements --dev; fi

View File

@@ -11,6 +11,6 @@
"root_login": "root",
"root_password": "travis",
"host_name": "http://test_site:8000",
"install_apps": ["erpnext"],
"install_apps": ["payments", "erpnext"],
"throttle_user_limit": 100
}

View File

@@ -17,7 +17,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 16
node-version: 18
- name: Setup dependencies
run: |

View File

@@ -32,8 +32,8 @@ repos:
- id: black
additional_dependencies: ['click==8.0.4']
- repo: https://github.com/timothycrosley/isort
rev: 5.9.1
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort
exclude: ".*setup.py$"

View File

@@ -3,26 +3,23 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
erpnext/accounts/ @nextchamp-saqib @deepeshgarg007 @ruthra-kumar
erpnext/assets/ @nextchamp-saqib @deepeshgarg007 @ruthra-kumar
erpnext/loan_management/ @nextchamp-saqib @deepeshgarg007
erpnext/regional @nextchamp-saqib @deepeshgarg007 @ruthra-kumar
erpnext/selling @nextchamp-saqib @deepeshgarg007 @ruthra-kumar
erpnext/support/ @nextchamp-saqib @deepeshgarg007
pos* @nextchamp-saqib
erpnext/accounts/ @deepeshgarg007 @ruthra-kumar
erpnext/assets/ @anandbaburajan @deepeshgarg007
erpnext/loan_management/ @deepeshgarg007
erpnext/regional @deepeshgarg007 @ruthra-kumar
erpnext/selling @deepeshgarg007 @ruthra-kumar
erpnext/support/ @deepeshgarg007
pos*
erpnext/buying/ @rohitwaghchaure @s-aga-r
erpnext/maintenance/ @rohitwaghchaure @s-aga-r
erpnext/manufacturing/ @rohitwaghchaure @s-aga-r
erpnext/quality_management/ @rohitwaghchaure @s-aga-r
erpnext/stock/ @rohitwaghchaure @s-aga-r
erpnext/subcontracting @rohitwaghchaure @s-aga-r
erpnext/crm/ @NagariaHussain
erpnext/education/ @rutwikhdev
erpnext/projects/ @ruchamahabal
erpnext/controllers/ @deepeshgarg007 @rohitwaghchaure
erpnext/patches/ @deepeshgarg007
erpnext/controllers/ @deepeshgarg007 @nextchamp-saqib @rohitwaghchaure
erpnext/patches/ @deepeshgarg007 @nextchamp-saqib
.github/ @ankush
.github/ @deepeshgarg007
pyproject.toml @ankush

View File

@@ -1,8 +1,9 @@
import functools
import inspect
import frappe
__version__ = "14.8.0"
__version__ = "14.24.3"
def get_default_company(user=None):
@@ -120,12 +121,14 @@ def get_region(company=None):
You can also set global company flag in `frappe.flags.company`
"""
if company or frappe.flags.company:
return frappe.get_cached_value("Company", company or frappe.flags.company, "country")
elif frappe.flags.country:
return frappe.flags.country
else:
return frappe.get_system_settings("country")
if not company:
company = frappe.local.flags.company
if company:
return frappe.get_cached_value("Company", company, "country")
return frappe.flags.country or frappe.get_system_settings("country")
def allow_regional(fn):
@@ -136,6 +139,7 @@ def allow_regional(fn):
def myfunction():
pass"""
@functools.wraps(fn)
def caller(*args, **kwargs):
overrides = frappe.get_hooks("regional_overrides", {}).get(get_region())
function_path = f"{inspect.getmodule(fn).__name__}.{fn.__name__}"

View File

@@ -378,7 +378,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
return
# check if books nor frozen till endate:
if accounts_frozen_upto and (end_date) <= getdate(accounts_frozen_upto):
if accounts_frozen_upto and getdate(end_date) <= getdate(accounts_frozen_upto):
end_date = get_last_day(add_days(accounts_frozen_upto, 1))
if via_journal_entry:

View File

@@ -18,7 +18,6 @@
"root_type",
"report_type",
"account_currency",
"inter_company_account",
"column_break1",
"parent_account",
"account_type",
@@ -34,15 +33,11 @@
{
"fieldname": "properties",
"fieldtype": "Section Break",
"oldfieldtype": "Section Break",
"show_days": 1,
"show_seconds": 1
"oldfieldtype": "Section Break"
},
{
"fieldname": "column_break0",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1,
"width": "50%"
},
{
@@ -53,9 +48,7 @@
"no_copy": 1,
"oldfieldname": "account_name",
"oldfieldtype": "Data",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "account_number",
@@ -63,17 +56,13 @@
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Account Number",
"read_only": 1,
"show_days": 1,
"show_seconds": 1
"read_only": 1
},
{
"default": "0",
"fieldname": "is_group",
"fieldtype": "Check",
"label": "Is Group",
"show_days": 1,
"show_seconds": 1
"label": "Is Group"
},
{
"fieldname": "company",
@@ -85,9 +74,7 @@
"options": "Company",
"read_only": 1,
"remember_last_selected_value": 1,
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "root_type",
@@ -95,9 +82,7 @@
"in_standard_filter": 1,
"label": "Root Type",
"options": "\nAsset\nLiability\nIncome\nExpense\nEquity",
"read_only": 1,
"show_days": 1,
"show_seconds": 1
"read_only": 1
},
{
"fieldname": "report_type",
@@ -105,32 +90,18 @@
"in_standard_filter": 1,
"label": "Report Type",
"options": "\nBalance Sheet\nProfit and Loss",
"read_only": 1,
"show_days": 1,
"show_seconds": 1
"read_only": 1
},
{
"depends_on": "eval:doc.is_group==0",
"fieldname": "account_currency",
"fieldtype": "Link",
"label": "Currency",
"options": "Currency",
"show_days": 1,
"show_seconds": 1
},
{
"default": "0",
"fieldname": "inter_company_account",
"fieldtype": "Check",
"label": "Inter Company Account",
"show_days": 1,
"show_seconds": 1
"options": "Currency"
},
{
"fieldname": "column_break1",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1,
"width": "50%"
},
{
@@ -142,9 +113,7 @@
"oldfieldtype": "Link",
"options": "Account",
"reqd": 1,
"search_index": 1,
"show_days": 1,
"show_seconds": 1
"search_index": 1
},
{
"description": "Setting Account Type helps in selecting this Account in transactions.",
@@ -154,9 +123,7 @@
"label": "Account Type",
"oldfieldname": "account_type",
"oldfieldtype": "Select",
"options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nService Received But Not Billed\nTax\nTemporary",
"show_days": 1,
"show_seconds": 1
"options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nService Received But Not Billed\nTax\nTemporary"
},
{
"description": "Rate at which this tax is applied",
@@ -164,9 +131,7 @@
"fieldtype": "Float",
"label": "Rate",
"oldfieldname": "tax_rate",
"oldfieldtype": "Currency",
"show_days": 1,
"show_seconds": 1
"oldfieldtype": "Currency"
},
{
"description": "If the account is frozen, entries are allowed to restricted users.",
@@ -175,17 +140,13 @@
"label": "Frozen",
"oldfieldname": "freeze_account",
"oldfieldtype": "Select",
"options": "No\nYes",
"show_days": 1,
"show_seconds": 1
"options": "No\nYes"
},
{
"fieldname": "balance_must_be",
"fieldtype": "Select",
"label": "Balance must be",
"options": "\nDebit\nCredit",
"show_days": 1,
"show_seconds": 1
"options": "\nDebit\nCredit"
},
{
"fieldname": "lft",
@@ -194,9 +155,7 @@
"label": "Lft",
"print_hide": 1,
"read_only": 1,
"search_index": 1,
"show_days": 1,
"show_seconds": 1
"search_index": 1
},
{
"fieldname": "rgt",
@@ -205,9 +164,7 @@
"label": "Rgt",
"print_hide": 1,
"read_only": 1,
"search_index": 1,
"show_days": 1,
"show_seconds": 1
"search_index": 1
},
{
"fieldname": "old_parent",
@@ -215,33 +172,27 @@
"hidden": 1,
"label": "Old Parent",
"print_hide": 1,
"read_only": 1,
"show_days": 1,
"show_seconds": 1
"read_only": 1
},
{
"default": "0",
"depends_on": "eval:(doc.report_type == 'Profit and Loss' && !doc.is_group)",
"fieldname": "include_in_gross",
"fieldtype": "Check",
"label": "Include in gross",
"show_days": 1,
"show_seconds": 1
"label": "Include in gross"
},
{
"default": "0",
"fieldname": "disabled",
"fieldtype": "Check",
"label": "Disable",
"show_days": 1,
"show_seconds": 1
"label": "Disable"
}
],
"icon": "fa fa-money",
"idx": 1,
"is_tree": 1,
"links": [],
"modified": "2020-06-11 15:15:54.338622",
"modified": "2023-04-11 16:08:46.983677",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
@@ -301,5 +252,6 @@
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "ASC",
"states": [],
"track_changes": 1
}

View File

@@ -201,8 +201,11 @@ class Account(NestedSet):
)
def validate_account_currency(self):
self.currency_explicitly_specified = True
if not self.account_currency:
self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
self.currency_explicitly_specified = False
gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency")
@@ -248,8 +251,10 @@ class Account(NestedSet):
{
"company": company,
# parent account's currency should be passed down to child account's curreny
# if it is None, it picks it up from default company currency, which might be unintended
"account_currency": erpnext.get_company_currency(company),
# if currency explicitly specified by user, child will inherit. else, default currency will be used.
"account_currency": self.account_currency
if self.currency_explicitly_specified
else erpnext.get_company_currency(company),
"parent_account": parent_acc_name_map[company],
}
)
@@ -393,7 +398,13 @@ def update_account_number(name, account_name, account_number=None, from_descenda
if ancestors and not allow_independent_account_creation:
for ancestor in ancestors:
if frappe.db.get_value("Account", {"account_name": old_acc_name, "company": ancestor}, "name"):
old_name = frappe.db.get_value(
"Account",
{"account_number": old_acc_number, "account_name": old_acc_name, "company": ancestor},
"name",
)
if old_name:
# same account in parent company exists
allow_child_account_creation = _("Allow Account Creation Against Child Company")

View File

@@ -29,6 +29,7 @@ def create_charts(
"root_type",
"is_group",
"tax_rate",
"account_currency",
]:
account_number = cstr(child.get("account_number")).strip()
@@ -95,7 +96,17 @@ def identify_is_group(child):
is_group = child.get("is_group")
elif len(
set(child.keys())
- set(["account_name", "account_type", "root_type", "is_group", "tax_rate", "account_number"])
- set(
[
"account_name",
"account_type",
"root_type",
"is_group",
"tax_rate",
"account_number",
"account_currency",
]
)
):
is_group = 1
else:
@@ -185,6 +196,7 @@ def get_account_tree_from_existing_company(existing_company):
"root_type",
"tax_rate",
"account_number",
"account_currency",
],
order_by="lft, rgt",
)
@@ -267,6 +279,7 @@ def build_tree_from_json(chart_template, chart_data=None, from_coa_importer=Fals
"root_type",
"is_group",
"tax_rate",
"account_currency",
]:
continue

View File

@@ -1,38 +1,38 @@
{
"country_code": "de",
"name": "SKR03 mit Kontonummern",
"tree": {
"Aktiva": {
"is_group": 1,
"country_code": "de",
"name": "SKR03 mit Kontonummern",
"tree": {
"Aktiva": {
"is_group": 1,
"root_type": "Asset",
"A - Anlagevermögen": {
"is_group": 1,
"EDV-Software": {
"account_number": "0027",
"account_type": "Fixed Asset"
},
"Gesch\u00e4ftsausstattung": {
"account_number": "0410",
"account_type": "Fixed Asset"
},
"B\u00fcroeinrichtung": {
"account_number": "0420",
"account_type": "Fixed Asset"
},
"Darlehen": {
"account_number": "0565"
},
"Maschinen": {
"account_number": "0210",
"account_type": "Fixed Asset"
},
"Betriebsausstattung": {
"account_number": "0400",
"account_type": "Fixed Asset"
},
"Ladeneinrichtung": {
"account_number": "0430",
"account_type": "Fixed Asset"
"A - Anlagevermögen": {
"is_group": 1,
"EDV-Software": {
"account_number": "0027",
"account_type": "Fixed Asset"
},
"Geschäftsausstattung": {
"account_number": "0410",
"account_type": "Fixed Asset"
},
"Büroeinrichtung": {
"account_number": "0420",
"account_type": "Fixed Asset"
},
"Darlehen": {
"account_number": "0565"
},
"Maschinen": {
"account_number": "0210",
"account_type": "Fixed Asset"
},
"Betriebsausstattung": {
"account_number": "0400",
"account_type": "Fixed Asset"
},
"Ladeneinrichtung": {
"account_number": "0430",
"account_type": "Fixed Asset"
},
"Accumulated Depreciation": {
"account_type": "Accumulated Depreciation"
@@ -60,36 +60,46 @@
"Durchlaufende Posten": {
"account_number": "1590"
},
"Gewinnermittlung \u00a74/3 nicht Ergebniswirksam": {
"Verrechnungskonto Gewinnermittlung § 4 Abs. 3 EStG, nicht ergebniswirksam": {
"account_number": "1371"
},
"Abziehbare Vorsteuer": {
"account_type": "Tax",
"is_group": 1,
"Abziehbare Vorsteuer 7%": {
"account_number": "1571"
"Abziehbare Vorsteuer 7 %": {
"account_number": "1571",
"account_type": "Tax",
"tax_rate": 7.0
},
"Abziehbare Vorsteuer 19%": {
"account_number": "1576"
"Abziehbare Vorsteuer 19 %": {
"account_number": "1576",
"account_type": "Tax",
"tax_rate": 19.0
},
"Abziehbare Vorsteuer nach \u00a713b UStG 19%": {
"account_number": "1577"
},
"Leistungen \u00a713b UStG 19% Vorsteuer, 19% Umsatzsteuer": {
"account_number": "3120"
"Abziehbare Vorsteuer nach § 13b UStG 19 %": {
"account_number": "1577",
"account_type": "Tax",
"tax_rate": 19.0
}
}
},
"III. Wertpapiere": {
"is_group": 1
"is_group": 1,
"Anteile an verbundenen Unternehmen (Umlaufvermögen)": {
"account_number": "1340"
},
"Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft": {
"account_number": "1344"
},
"Sonstige Wertpapiere": {
"account_number": "1348"
}
},
"IV. Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks.": {
"is_group": 1,
"Kasse": {
"account_type": "Cash",
"is_group": 1,
"account_type": "Cash",
"Kasse": {
"is_group": 1,
"account_number": "1000",
"account_type": "Cash"
}
@@ -111,21 +121,21 @@
"C - Rechnungsabgrenzungsposten": {
"is_group": 1,
"Aktive Rechnungsabgrenzung": {
"account_number": "0980"
"account_number": "0980"
}
},
"D - Aktive latente Steuern": {
"is_group": 1,
"Aktive latente Steuern": {
"account_number": "0983"
"account_number": "0983"
}
},
"E - Aktiver Unterschiedsbetrag aus der Vermögensverrechnung": {
"is_group": 1
}
},
"Passiva": {
"is_group": 1,
},
"Passiva": {
"is_group": 1,
"root_type": "Liability",
"A. Eigenkapital": {
"is_group": 1,
@@ -200,26 +210,32 @@
},
"Umsatzsteuer": {
"is_group": 1,
"account_type": "Tax",
"Umsatzsteuer 7%": {
"account_number": "1771"
"Umsatzsteuer 7 %": {
"account_number": "1771",
"account_type": "Tax",
"tax_rate": 7.0
},
"Umsatzsteuer 19%": {
"account_number": "1776"
"Umsatzsteuer 19 %": {
"account_number": "1776",
"account_type": "Tax",
"tax_rate": 19.0
},
"Umsatzsteuer-Vorauszahlung": {
"account_number": "1780"
"account_number": "1780",
"account_type": "Tax"
},
"Umsatzsteuer-Vorauszahlung 1/11": {
"account_number": "1781"
},
"Umsatzsteuer \u00a7 13b UStG 19%": {
"account_number": "1787"
"Umsatzsteuer nach § 13b UStG 19 %": {
"account_number": "1787",
"account_type": "Tax",
"tax_rate": 19.0
},
"Umsatzsteuer Vorjahr": {
"account_number": "1790"
},
"Umsatzsteuer fr\u00fchere Jahre": {
"Umsatzsteuer frühere Jahre": {
"account_number": "1791"
}
}
@@ -234,44 +250,56 @@
"E. Passive latente Steuern": {
"is_group": 1
}
},
"Erl\u00f6se u. Ertr\u00e4ge 2/8": {
"is_group": 1,
"root_type": "Income",
"Erl\u00f6skonten 8": {
},
"Erlöse u. Erträge 2/8": {
"is_group": 1,
"root_type": "Income",
"Erlöskonten 8": {
"is_group": 1,
"Erl\u00f6se": {
"account_number": "8200",
"account_type": "Income Account"
},
"Erl\u00f6se USt. 19%": {
"account_number": "8400",
"account_type": "Income Account"
},
"Erl\u00f6se USt. 7%": {
"account_number": "8300",
"account_type": "Income Account"
}
},
"Ertragskonten 2": {
"is_group": 1,
"sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
"account_number": "2650",
"account_type": "Income Account"
},
"Au\u00dferordentliche Ertr\u00e4ge": {
"account_number": "2500",
"account_type": "Income Account"
},
"Sonstige Ertr\u00e4ge": {
"account_number": "2700",
"account_type": "Income Account"
}
}
},
"Aufwendungen 2/4": {
"is_group": 1,
"Erlöse": {
"account_number": "8200",
"account_type": "Income Account"
},
"Erlöse USt. 19 %": {
"account_number": "8400",
"account_type": "Income Account"
},
"Erlöse USt. 7 %": {
"account_number": "8300",
"account_type": "Income Account"
}
},
"Ertragskonten 2": {
"is_group": 1,
"sonstige Zinsen und ähnliche Erträge": {
"account_number": "2650",
"account_type": "Income Account"
},
"Außerordentliche Erträge": {
"account_number": "2500",
"account_type": "Income Account"
},
"Sonstige Erträge": {
"account_number": "2700",
"account_type": "Income Account"
}
}
},
"Aufwendungen 2/4": {
"is_group": 1,
"root_type": "Expense",
"Fremdleistungen": {
"account_number": "3100",
"account_type": "Expense Account"
},
"Fremdleistungen ohne Vorsteuer": {
"account_number": "3109",
"account_type": "Expense Account"
},
"Bauleistungen eines im Inland ansässigen Unternehmers 19 % Vorsteuer und 19 % Umsatzsteuer": {
"account_number": "3120",
"account_type": "Expense Account"
},
"Wareneingang": {
"account_number": "3200"
},
@@ -298,234 +326,234 @@
"Gegenkonto 4996-4998": {
"account_number": "4999"
},
"Abschreibungen": {
"is_group": 1,
"Abschreibungen": {
"is_group": 1,
"Abschreibungen auf Sachanlagen (ohne AfA auf Kfz und Gebäude)": {
"account_number": "4830",
"account_type": "Accumulated Depreciation"
"account_number": "4830",
"account_type": "Accumulated Depreciation"
},
"Abschreibungen auf Gebäude": {
"account_number": "4831",
"account_type": "Depreciation"
"account_number": "4831",
"account_type": "Depreciation"
},
"Abschreibungen auf Kfz": {
"account_number": "4832",
"account_type": "Depreciation"
"account_number": "4832",
"account_type": "Depreciation"
},
"Sofortabschreibung GWG": {
"account_number": "4855",
"account_type": "Expense Account"
"account_number": "4855",
"account_type": "Expense Account"
}
},
"Kfz-Kosten": {
"is_group": 1,
"Kfz-Steuer": {
"account_number": "4510",
"account_type": "Expense Account"
},
"Kfz-Versicherungen": {
"account_number": "4520",
"account_type": "Expense Account"
},
"laufende Kfz-Betriebskosten": {
"account_number": "4530",
"account_type": "Expense Account"
},
"Kfz-Reparaturen": {
"account_number": "4540",
"account_type": "Expense Account"
},
"Fremdfahrzeuge": {
"account_number": "4570",
"account_type": "Expense Account"
},
"sonstige Kfz-Kosten": {
"account_number": "4580",
"account_type": "Expense Account"
}
},
"Personalkosten": {
"is_group": 1,
"Geh\u00e4lter": {
"account_number": "4120",
"account_type": "Expense Account"
},
"gesetzliche soziale Aufwendungen": {
"account_number": "4130",
"account_type": "Expense Account"
},
"Aufwendungen f\u00fcr Altersvorsorge": {
"account_number": "4165",
"account_type": "Expense Account"
},
"Verm\u00f6genswirksame Leistungen": {
"account_number": "4170",
"account_type": "Expense Account"
},
"Aushilfsl\u00f6hne": {
"account_number": "4190",
"account_type": "Expense Account"
}
},
"Raumkosten": {
"is_group": 1,
"Miete und Nebenkosten": {
"account_number": "4210",
"account_type": "Expense Account"
},
"Gas, Wasser, Strom (Verwaltung, Vertrieb)": {
"account_number": "4240",
"account_type": "Expense Account"
},
"Reinigung": {
"account_number": "4250",
"account_type": "Expense Account"
}
},
"Reparatur/Instandhaltung": {
"is_group": 1,
"Reparatur u. Instandh. von Anlagen/Maschinen u. Betriebs- u. Gesch\u00e4ftsausst.": {
"account_number": "4805",
"account_type": "Expense Account"
}
},
"Versicherungsbeitr\u00e4ge": {
"is_group": 1,
"Versicherungen": {
"account_number": "4360",
"account_type": "Expense Account"
},
"Beitr\u00e4ge": {
"account_number": "4380",
"account_type": "Expense Account"
},
"sonstige Ausgaben": {
"account_number": "4390",
"account_type": "Expense Account"
},
"steuerlich abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {
"account_number": "4396",
"account_type": "Expense Account"
}
},
"Werbe-/Reisekosten": {
"is_group": 1,
"Werbekosten": {
"account_number": "4610",
"account_type": "Expense Account"
},
"Aufmerksamkeiten": {
"account_number": "4653",
"account_type": "Expense Account"
},
"nicht abzugsf\u00e4hige Betriebsausg. aus Werbe-, Repr\u00e4s.- u. Reisekosten": {
"account_number": "4665",
"account_type": "Expense Account"
},
"Reisekosten Unternehmer": {
"account_number": "4670",
"account_type": "Expense Account"
}
},
"verschiedene Kosten": {
"is_group": 1,
"Porto": {
"account_number": "4910",
"account_type": "Expense Account"
},
"Telekom": {
"account_number": "4920",
"account_type": "Expense Account"
},
"Mobilfunk D2": {
"account_number": "4921",
"account_type": "Expense Account"
},
"Internet": {
"account_number": "4922",
"account_type": "Expense Account"
},
"B\u00fcrobedarf": {
"account_number": "4930",
"account_type": "Expense Account"
},
"Zeitschriften, B\u00fccher": {
"account_number": "4940",
"account_type": "Expense Account"
},
"Fortbildungskosten": {
"account_number": "4945",
"account_type": "Expense Account"
},
"Buchf\u00fchrungskosten": {
"account_number": "4955",
"account_type": "Expense Account"
},
"Abschlu\u00df- u. Pr\u00fcfungskosten": {
"account_number": "4957",
"account_type": "Expense Account"
},
"Nebenkosten des Geldverkehrs": {
"account_number": "4970",
"account_type": "Expense Account"
},
"Werkzeuge und Kleinger\u00e4te": {
"account_number": "4985",
"account_type": "Expense Account"
}
},
"Zinsaufwendungen": {
"is_group": 1,
"Zinsaufwendungen f\u00fcr kurzfristige Verbindlichkeiten": {
"account_number": "2110",
"account_type": "Expense Account"
},
"Zinsaufwendungen f\u00fcr KFZ Finanzierung": {
"account_number": "2121",
"account_type": "Expense Account"
}
}
},
"Anfangsbestand 9": {
"is_group": 1,
"root_type": "Equity",
"Saldenvortragskonten": {
"is_group": 1,
"Saldenvortrag Sachkonten": {
"account_number": "9000"
},
"Saldenvortr\u00e4ge Debitoren": {
"account_number": "9008"
},
"Saldenvortr\u00e4ge Kreditoren": {
"account_number": "9009"
}
}
},
"Privatkonten 1": {
"is_group": 1,
"root_type": "Equity",
"Privatentnahmen/-einlagen": {
"is_group": 1,
"Privatentnahme allgemein": {
"account_number": "1800"
},
"Privatsteuern": {
"account_number": "1810"
},
"Sonderausgaben beschr\u00e4nkt abzugsf\u00e4hig": {
"account_number": "1820"
},
"Sonderausgaben unbeschr\u00e4nkt abzugsf\u00e4hig": {
"account_number": "1830"
},
"Au\u00dfergew\u00f6hnliche Belastungen": {
"account_number": "1850"
},
"Privateinlagen": {
"account_number": "1890"
}
}
}
}
},
"Kfz-Kosten": {
"is_group": 1,
"Kfz-Steuer": {
"account_number": "4510",
"account_type": "Expense Account"
},
"Kfz-Versicherungen": {
"account_number": "4520",
"account_type": "Expense Account"
},
"laufende Kfz-Betriebskosten": {
"account_number": "4530",
"account_type": "Expense Account"
},
"Kfz-Reparaturen": {
"account_number": "4540",
"account_type": "Expense Account"
},
"Fremdfahrzeuge": {
"account_number": "4570",
"account_type": "Expense Account"
},
"sonstige Kfz-Kosten": {
"account_number": "4580",
"account_type": "Expense Account"
}
},
"Personalkosten": {
"is_group": 1,
"Gehälter": {
"account_number": "4120",
"account_type": "Expense Account"
},
"gesetzliche soziale Aufwendungen": {
"account_number": "4130",
"account_type": "Expense Account"
},
"Aufwendungen für Altersvorsorge": {
"account_number": "4165",
"account_type": "Expense Account"
},
"Vermögenswirksame Leistungen": {
"account_number": "4170",
"account_type": "Expense Account"
},
"Aushilfslöhne": {
"account_number": "4190",
"account_type": "Expense Account"
}
},
"Raumkosten": {
"is_group": 1,
"Miete und Nebenkosten": {
"account_number": "4210",
"account_type": "Expense Account"
},
"Gas, Wasser, Strom (Verwaltung, Vertrieb)": {
"account_number": "4240",
"account_type": "Expense Account"
},
"Reinigung": {
"account_number": "4250",
"account_type": "Expense Account"
}
},
"Reparatur/Instandhaltung": {
"is_group": 1,
"Reparaturen und Instandhaltungen von anderen Anlagen und Betriebs- und Geschäftsausstattung": {
"account_number": "4805",
"account_type": "Expense Account"
}
},
"Versicherungsbeiträge": {
"is_group": 1,
"Versicherungen": {
"account_number": "4360",
"account_type": "Expense Account"
},
"Beiträge": {
"account_number": "4380",
"account_type": "Expense Account"
},
"sonstige Ausgaben": {
"account_number": "4390",
"account_type": "Expense Account"
},
"steuerlich abzugsfähige Verspätungszuschläge und Zwangsgelder": {
"account_number": "4396",
"account_type": "Expense Account"
}
},
"Werbe-/Reisekosten": {
"is_group": 1,
"Werbekosten": {
"account_number": "4610",
"account_type": "Expense Account"
},
"Aufmerksamkeiten": {
"account_number": "4653",
"account_type": "Expense Account"
},
"nicht abzugsfähige Betriebsausg. aus Werbe-, Repräs.- u. Reisekosten": {
"account_number": "4665",
"account_type": "Expense Account"
},
"Reisekosten Unternehmer": {
"account_number": "4670",
"account_type": "Expense Account"
}
},
"verschiedene Kosten": {
"is_group": 1,
"Porto": {
"account_number": "4910",
"account_type": "Expense Account"
},
"Telekom": {
"account_number": "4920",
"account_type": "Expense Account"
},
"Mobilfunk D2": {
"account_number": "4921",
"account_type": "Expense Account"
},
"Internet": {
"account_number": "4922",
"account_type": "Expense Account"
},
"Bürobedarf": {
"account_number": "4930",
"account_type": "Expense Account"
},
"Zeitschriften, Bücher": {
"account_number": "4940",
"account_type": "Expense Account"
},
"Fortbildungskosten": {
"account_number": "4945",
"account_type": "Expense Account"
},
"Buchführungskosten": {
"account_number": "4955",
"account_type": "Expense Account"
},
"Abschluß- u. Prüfungskosten": {
"account_number": "4957",
"account_type": "Expense Account"
},
"Nebenkosten des Geldverkehrs": {
"account_number": "4970",
"account_type": "Expense Account"
},
"Werkzeuge und Kleingeräte": {
"account_number": "4985",
"account_type": "Expense Account"
}
},
"Zinsaufwendungen": {
"is_group": 1,
"Zinsaufwendungen für kurzfristige Verbindlichkeiten": {
"account_number": "2110",
"account_type": "Expense Account"
},
"Zinsaufwendungen für KFZ Finanzierung": {
"account_number": "2121",
"account_type": "Expense Account"
}
}
},
"Anfangsbestand 9": {
"is_group": 1,
"root_type": "Equity",
"Saldenvortragskonten": {
"is_group": 1,
"Saldenvortrag Sachkonten": {
"account_number": "9000"
},
"Saldenvorträge Debitoren": {
"account_number": "9008"
},
"Saldenvorträge Kreditoren": {
"account_number": "9009"
}
}
},
"Privatkonten 1": {
"is_group": 1,
"root_type": "Equity",
"Privatentnahmen/-einlagen": {
"is_group": 1,
"Privatentnahme allgemein": {
"account_number": "1800"
},
"Privatsteuern": {
"account_number": "1810"
},
"Sonderausgaben beschränkt abzugsfähig": {
"account_number": "1820"
},
"Sonderausgaben unbeschränkt abzugsfähig": {
"account_number": "1830"
},
"Außergewöhnliche Belastungen": {
"account_number": "1850"
},
"Privateinlagen": {
"account_number": "1890"
}
}
}
}
}

View File

@@ -5,10 +5,13 @@
import unittest
import frappe
from frappe.test_runner import make_test_records
from erpnext.accounts.doctype.account.account import merge_account, update_account_number
from erpnext.stock import get_company_default_inventory_account, get_warehouse_account
test_dependencies = ["Company"]
class TestAccount(unittest.TestCase):
def test_rename_account(self):
@@ -188,6 +191,58 @@ class TestAccount(unittest.TestCase):
frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC4")
frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC5")
def test_account_currency_sync(self):
"""
In a parent->child company setup, child should inherit parent account currency if explicitly specified.
"""
make_test_records("Company")
frappe.local.flags.pop("ignore_root_company_validation", None)
def create_bank_account():
acc = frappe.new_doc("Account")
acc.account_name = "_Test Bank JPY"
acc.parent_account = "Temporary Accounts - _TC6"
acc.company = "_Test Company 6"
return acc
acc = create_bank_account()
# Explicitly set currency
acc.account_currency = "JPY"
acc.insert()
self.assertTrue(
frappe.db.exists(
{
"doctype": "Account",
"account_name": "_Test Bank JPY",
"account_currency": "JPY",
"company": "_Test Company 7",
}
)
)
frappe.delete_doc("Account", "_Test Bank JPY - _TC6")
frappe.delete_doc("Account", "_Test Bank JPY - _TC7")
acc = create_bank_account()
# default currency is used
acc.insert()
self.assertTrue(
frappe.db.exists(
{
"doctype": "Account",
"account_name": "_Test Bank JPY",
"account_currency": "USD",
"company": "_Test Company 7",
}
)
)
frappe.delete_doc("Account", "_Test Bank JPY - _TC6")
frappe.delete_doc("Account", "_Test Bank JPY - _TC7")
def test_child_company_account_rename_sync(self):
frappe.local.flags.pop("ignore_root_company_validation", None)
@@ -297,7 +352,7 @@ def _make_test_records(verbose=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, None, 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],

View File

@@ -19,6 +19,8 @@
"column_break_17",
"enable_common_party_accounting",
"allow_multi_currency_invoices_against_single_party_account",
"journals_section",
"merge_similar_account_heads",
"report_setting_section",
"use_custom_cash_flow",
"deferred_accounting_settings_section",
@@ -31,12 +33,15 @@
"determine_address_tax_category_from",
"column_break_19",
"add_taxes_from_item_tax_template",
"book_tax_discount_loss",
"print_settings",
"show_inclusive_tax_in_print",
"column_break_12",
"show_payment_schedule_in_print",
"currency_exchange_section",
"allow_stale",
"section_break_jpd0",
"auto_reconcile_payments",
"stale_days",
"invoicing_settings_tab",
"accounts_transactions_settings_section",
@@ -91,7 +96,7 @@
},
{
"default": "0",
"description": "Enabling ensure each Sales Invoice has a unique value in Supplier Invoice No. field",
"description": "Enabling ensure each Purchase Invoice has a unique value in Supplier Invoice No. field",
"fieldname": "check_supplier_invoice_uniqueness",
"fieldtype": "Check",
"label": "Check Supplier Invoice Number Uniqueness"
@@ -167,11 +172,6 @@
"fieldtype": "Int",
"label": "Stale Days"
},
{
"fieldname": "report_settings_sb",
"fieldtype": "Section Break",
"label": "Report Settings"
},
{
"default": "0",
"description": "Only select this if you have set up the Cash Flow Mapper documents",
@@ -181,6 +181,7 @@
},
{
"default": "0",
"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"
@@ -347,6 +348,36 @@
"fieldname": "allow_multi_currency_invoices_against_single_party_account",
"fieldtype": "Check",
"label": "Allow multi-currency invoices against single party account "
},
{
"default": "0",
"description": "Split Early Payment Discount Loss into Income and Tax Loss",
"fieldname": "book_tax_discount_loss",
"fieldtype": "Check",
"label": "Book Tax Loss on Early Payment Discount"
},
{
"fieldname": "journals_section",
"fieldtype": "Section Break",
"label": "Journals"
},
{
"default": "0",
"description": "Rows with Same Account heads will be merged on Ledger",
"fieldname": "merge_similar_account_heads",
"fieldtype": "Check",
"label": "Merge Similar Account Heads"
},
{
"fieldname": "section_break_jpd0",
"fieldtype": "Section Break",
"label": "Payment Reconciliations"
},
{
"default": "0",
"fieldname": "auto_reconcile_payments",
"fieldtype": "Check",
"label": "Auto Reconcile Payments"
}
],
"icon": "icon-cog",
@@ -354,7 +385,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2022-07-11 13:37:50.605141",
"modified": "2023-04-21 13:11:37.130743",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",

View File

@@ -118,6 +118,10 @@ erpnext.integrations.refreshPlaidLink = class refreshPlaidLink {
}
plaid_success(token, response) {
frappe.show_alert({ message: __('Plaid Link Updated'), indicator: 'green' });
frappe.xcall('erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.update_bank_account_ids', {
response: response,
}).then(() => {
frappe.show_alert({ message: __('Plaid Link Updated'), indicator: 'green' });
});
}
};

View File

@@ -37,6 +37,11 @@ frappe.ui.form.on("Bank Clearance", {
refresh: function(frm) {
frm.disable_save();
frm.add_custom_button(__('Get Payment Entries'), () =>
frm.trigger("get_payment_entries")
);
frm.change_custom_button_type('Get Payment Entries', null, 'primary');
},
update_clearance_date: function(frm) {
@@ -46,22 +51,30 @@ frappe.ui.form.on("Bank Clearance", {
callback: function(r, rt) {
frm.refresh_field("payment_entries");
frm.refresh_fields();
if (!frm.doc.payment_entries.length) {
frm.change_custom_button_type('Get Payment Entries', null, 'primary');
frm.change_custom_button_type('Update Clearance Date', null, 'default');
}
}
});
},
get_payment_entries: function(frm) {
return frappe.call({
method: "get_payment_entries",
doc: frm.doc,
callback: function(r, rt) {
frm.refresh_field("payment_entries");
frm.refresh_fields();
$(frm.fields_dict.payment_entries.wrapper).find("[data-fieldname=amount]").each(function(i,v){
if (i !=0){
$(v).addClass("text-right")
}
})
if (frm.doc.payment_entries.length) {
frm.add_custom_button(__('Update Clearance Date'), () =>
frm.trigger("update_clearance_date")
);
frm.change_custom_button_type('Get Payment Entries', null, 'default');
frm.change_custom_button_type('Update Clearance Date', null, 'primary');
}
}
});
}

View File

@@ -1,4 +1,5 @@
{
"actions": [],
"allow_copy": 1,
"creation": "2013-01-10 16:34:05",
"doctype": "DocType",
@@ -13,11 +14,8 @@
"bank_account",
"include_reconciled_entries",
"include_pos_transactions",
"get_payment_entries",
"section_break_10",
"payment_entries",
"update_clearance_date",
"total_amount"
"payment_entries"
],
"fields": [
{
@@ -76,11 +74,6 @@
"fieldtype": "Check",
"label": "Include POS Transactions"
},
{
"fieldname": "get_payment_entries",
"fieldtype": "Button",
"label": "Get Payment Entries"
},
{
"fieldname": "section_break_10",
"fieldtype": "Section Break"
@@ -91,25 +84,14 @@
"fieldtype": "Table",
"label": "Payment Entries",
"options": "Bank Clearance Detail"
},
{
"fieldname": "update_clearance_date",
"fieldtype": "Button",
"label": "Update Clearance Date"
},
{
"fieldname": "total_amount",
"fieldtype": "Currency",
"label": "Total Amount",
"options": "account_currency",
"read_only": 1
}
],
"hide_toolbar": 1,
"icon": "fa fa-check",
"idx": 1,
"issingle": 1,
"modified": "2020-04-06 16:12:06.628008",
"links": [],
"modified": "2022-11-28 17:24:13.008692",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Clearance",
@@ -126,5 +108,6 @@
"quick_entry": 1,
"read_only": 1,
"sort_field": "modified",
"sort_order": "ASC"
"sort_order": "ASC",
"states": []
}

View File

@@ -56,7 +56,7 @@ class BankClearance(Document):
select
"Payment Entry" as payment_document, name as payment_entry,
reference_no as cheque_number, reference_date as cheque_date,
if(paid_from=%(account)s, paid_amount, 0) as credit,
if(paid_from=%(account)s, paid_amount + total_taxes_and_charges, 0) as credit,
if(paid_from=%(account)s, 0, received_amount) as debit,
posting_date, ifnull(party,if(paid_from=%(account)s,paid_to,paid_from)) as against_account, clearance_date,
if(paid_to=%(account)s, paid_to_account_currency, paid_from_account_currency) as account_currency
@@ -81,7 +81,7 @@ class BankClearance(Document):
loan_disbursement = frappe.qb.DocType("Loan Disbursement")
loan_disbursements = (
query = (
frappe.qb.from_(loan_disbursement)
.select(
ConstantColumn("Loan Disbursement").as_("payment_document"),
@@ -90,17 +90,22 @@ class BankClearance(Document):
ConstantColumn(0).as_("debit"),
loan_disbursement.reference_number.as_("cheque_number"),
loan_disbursement.reference_date.as_("cheque_date"),
loan_disbursement.clearance_date.as_("clearance_date"),
loan_disbursement.disbursement_date.as_("posting_date"),
loan_disbursement.applicant.as_("against_account"),
)
.where(loan_disbursement.docstatus == 1)
.where(loan_disbursement.disbursement_date >= self.from_date)
.where(loan_disbursement.disbursement_date <= self.to_date)
.where(loan_disbursement.clearance_date.isnull())
.where(loan_disbursement.disbursement_account.isin([self.bank_account, self.account]))
.orderby(loan_disbursement.disbursement_date)
.orderby(loan_disbursement.name, order=frappe.qb.desc)
).run(as_dict=1)
)
if not self.include_reconciled_entries:
query = query.where(loan_disbursement.clearance_date.isnull())
loan_disbursements = query.run(as_dict=1)
loan_repayment = frappe.qb.DocType("Loan Repayment")
@@ -113,16 +118,19 @@ class BankClearance(Document):
ConstantColumn(0).as_("credit"),
loan_repayment.reference_number.as_("cheque_number"),
loan_repayment.reference_date.as_("cheque_date"),
loan_repayment.clearance_date.as_("clearance_date"),
loan_repayment.applicant.as_("against_account"),
loan_repayment.posting_date,
)
.where(loan_repayment.docstatus == 1)
.where(loan_repayment.clearance_date.isnull())
.where(loan_repayment.posting_date >= self.from_date)
.where(loan_repayment.posting_date <= self.to_date)
.where(loan_repayment.payment_account.isin([self.bank_account, self.account]))
)
if not self.include_reconciled_entries:
query = query.where(loan_repayment.clearance_date.isnull())
if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
query = query.where((loan_repayment.repay_from_salary == 0))
@@ -179,7 +187,6 @@ class BankClearance(Document):
)
self.set("payment_entries", [])
self.total_amount = 0.0
default_currency = erpnext.get_default_currency()
for d in entries:
@@ -198,7 +205,6 @@ class BankClearance(Document):
d.pop("debit")
d.pop("account_currency")
row.update(d)
self.total_amount += flt(amount)
@frappe.whitelist()
def update_clearance_date(self):

View File

@@ -18,16 +18,30 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
},
onload: function (frm) {
// Set default filter dates
today = frappe.datetime.get_today()
frm.doc.bank_statement_from_date = frappe.datetime.add_months(today, -1);
frm.doc.bank_statement_to_date = today;
frm.trigger('bank_account');
},
filter_by_reference_date: function (frm) {
if (frm.doc.filter_by_reference_date) {
frm.set_value("bank_statement_from_date", "");
frm.set_value("bank_statement_to_date", "");
} else {
frm.set_value("from_reference_date", "");
frm.set_value("to_reference_date", "");
}
},
refresh: function (frm) {
frm.disable_save();
frappe.require("bank-reconciliation-tool.bundle.js", () =>
frm.trigger("make_reconciliation_tool")
);
frm.upload_statement_button = frm.page.set_secondary_action(
__("Upload Bank Statement"),
() =>
frm.add_custom_button(__("Upload Bank Statement"), () =>
frappe.call({
method:
"erpnext.accounts.doctype.bank_statement_import.bank_statement_import.upload_bank_statement",
@@ -49,10 +63,26 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
},
})
);
},
after_save: function (frm) {
frm.trigger("make_reconciliation_tool");
frm.add_custom_button(__('Auto Reconcile'), function() {
frappe.call({
method: "erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool.auto_reconcile_vouchers",
args: {
bank_account: frm.doc.bank_account,
from_date: frm.doc.bank_statement_from_date,
to_date: frm.doc.bank_statement_to_date,
filter_by_reference_date: frm.doc.filter_by_reference_date,
from_reference_date: frm.doc.from_reference_date,
to_reference_date: frm.doc.to_reference_date,
},
})
});
frm.add_custom_button(__('Get Unreconciled Entries'), function() {
frm.trigger("make_reconciliation_tool");
});
frm.change_custom_button_type('Get Unreconciled Entries', null, 'primary');
},
bank_account: function (frm) {
@@ -66,7 +96,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
r.account,
"account_currency",
(r) => {
frm.currency = r.account_currency;
frm.doc.account_currency = r.account_currency;
frm.trigger("render_chart");
}
);
@@ -132,19 +162,19 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
}
},
render_chart: frappe.utils.debounce((frm) => {
render_chart(frm) {
frm.cards_manager = new erpnext.accounts.bank_reconciliation.NumberCardManager(
{
$reconciliation_tool_cards: frm.get_field(
"reconciliation_tool_cards"
).$wrapper,
bank_statement_closing_balance:
frm.doc.bank_statement_closing_balance,
frm.doc.bank_statement_closing_balance,
cleared_balance: frm.cleared_balance,
currency: frm.currency,
currency: frm.doc.account_currency,
}
);
}, 500),
},
render(frm) {
if (frm.doc.bank_account) {
@@ -160,6 +190,9 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
).$wrapper,
bank_statement_from_date: frm.doc.bank_statement_from_date,
bank_statement_to_date: frm.doc.bank_statement_to_date,
filter_by_reference_date: frm.doc.filter_by_reference_date,
from_reference_date: frm.doc.from_reference_date,
to_reference_date: frm.doc.to_reference_date,
bank_statement_closing_balance:
frm.doc.bank_statement_closing_balance,
cards_manager: frm.cards_manager,

View File

@@ -10,7 +10,11 @@
"column_break_1",
"bank_statement_from_date",
"bank_statement_to_date",
"from_reference_date",
"to_reference_date",
"filter_by_reference_date",
"column_break_2",
"account_currency",
"account_opening_balance",
"bank_statement_closing_balance",
"section_break_1",
@@ -36,13 +40,13 @@
"fieldtype": "Column Break"
},
{
"depends_on": "eval: doc.bank_account",
"depends_on": "eval: doc.bank_account && !doc.filter_by_reference_date",
"fieldname": "bank_statement_from_date",
"fieldtype": "Date",
"label": "From Date"
},
{
"depends_on": "eval: doc.bank_statement_from_date",
"depends_on": "eval: doc.bank_account && !doc.filter_by_reference_date",
"fieldname": "bank_statement_to_date",
"fieldtype": "Date",
"label": "To Date"
@@ -56,7 +60,7 @@
"fieldname": "account_opening_balance",
"fieldtype": "Currency",
"label": "Account Opening Balance",
"options": "Currency",
"options": "account_currency",
"read_only": 1
},
{
@@ -64,7 +68,7 @@
"fieldname": "bank_statement_closing_balance",
"fieldtype": "Currency",
"label": "Closing Balance",
"options": "Currency"
"options": "account_currency"
},
{
"fieldname": "section_break_1",
@@ -81,14 +85,40 @@
},
{
"fieldname": "no_bank_transactions",
"fieldtype": "HTML"
"fieldtype": "HTML",
"options": "<div class=\"text-muted text-center\">No Matching Bank Transactions Found</div>"
},
{
"depends_on": "eval:doc.filter_by_reference_date",
"fieldname": "from_reference_date",
"fieldtype": "Date",
"label": "From Reference Date"
},
{
"depends_on": "eval:doc.filter_by_reference_date",
"fieldname": "to_reference_date",
"fieldtype": "Date",
"label": "To Reference Date"
},
{
"default": "0",
"fieldname": "filter_by_reference_date",
"fieldtype": "Check",
"label": "Filter by Reference Date"
},
{
"fieldname": "account_currency",
"fieldtype": "Link",
"hidden": 1,
"label": "Account Currency",
"options": "Currency"
}
],
"hide_toolbar": 1,
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2021-04-21 11:13:49.831769",
"modified": "2023-03-07 11:02:24.535714",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Reconciliation Tool",
@@ -107,5 +137,6 @@
],
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC"
}
"sort_order": "DESC",
"states": []
}

View File

@@ -8,9 +8,9 @@ import frappe
from frappe import _
from frappe.model.document import Document
from frappe.query_builder.custom import ConstantColumn
from frappe.utils import flt
from frappe.utils import cint, flt
from erpnext.accounts.doctype.bank_transaction.bank_transaction import get_paid_amount
from erpnext.accounts.doctype.bank_transaction.bank_transaction import get_total_allocated_amount
from erpnext.accounts.report.bank_reconciliation_statement.bank_reconciliation_statement import (
get_amounts_not_reflected_in_system,
get_entries,
@@ -28,7 +28,7 @@ def get_bank_transactions(bank_account, from_date=None, to_date=None):
filters = []
filters.append(["bank_account", "=", bank_account])
filters.append(["docstatus", "=", 1])
filters.append(["unallocated_amount", ">", 0])
filters.append(["unallocated_amount", ">", 0.0])
if to_date:
filters.append(["date", "<=", to_date])
if from_date:
@@ -50,6 +50,7 @@ def get_bank_transactions(bank_account, from_date=None, to_date=None):
"party",
],
filters=filters,
order_by="date",
)
return transactions
@@ -65,7 +66,7 @@ def get_account_balance(bank_account, till_date):
balance_as_per_system = get_balance_on(filters["account"], filters["report_date"])
total_debit, total_credit = 0, 0
total_debit, total_credit = 0.0, 0.0
for d in data:
total_debit += flt(d.debit)
total_credit += flt(d.credit)
@@ -144,10 +145,8 @@ def create_journal_entry_bts(
accounts.append(
{
"account": second_account,
"credit_in_account_currency": bank_transaction.deposit if bank_transaction.deposit > 0 else 0,
"debit_in_account_currency": bank_transaction.withdrawal
if bank_transaction.withdrawal > 0
else 0,
"credit_in_account_currency": bank_transaction.deposit,
"debit_in_account_currency": bank_transaction.withdrawal,
"party_type": party_type,
"party": party,
}
@@ -157,10 +156,8 @@ def create_journal_entry_bts(
{
"account": company_account,
"bank_account": bank_transaction.bank_account,
"credit_in_account_currency": bank_transaction.withdrawal
if bank_transaction.withdrawal > 0
else 0,
"debit_in_account_currency": bank_transaction.deposit if bank_transaction.deposit > 0 else 0,
"credit_in_account_currency": bank_transaction.withdrawal,
"debit_in_account_currency": bank_transaction.deposit,
}
)
@@ -184,16 +181,22 @@ def create_journal_entry_bts(
journal_entry.insert()
journal_entry.submit()
if bank_transaction.deposit > 0:
if bank_transaction.deposit > 0.0:
paid_amount = bank_transaction.deposit
else:
paid_amount = bank_transaction.withdrawal
vouchers = json.dumps(
[{"payment_doctype": "Journal Entry", "payment_name": journal_entry.name, "amount": paid_amount}]
[
{
"payment_doctype": "Journal Entry",
"payment_name": journal_entry.name,
"amount": paid_amount,
}
]
)
return reconcile_vouchers(bank_transaction.name, vouchers)
return reconcile_vouchers(bank_transaction_name, vouchers)
@frappe.whitelist()
@@ -217,7 +220,7 @@ def create_payment_entry_bts(
as_dict=True,
)[0]
paid_amount = bank_transaction.unallocated_amount
payment_type = "Receive" if bank_transaction.deposit > 0 else "Pay"
payment_type = "Receive" if bank_transaction.deposit > 0.0 else "Pay"
company_account = frappe.get_value("Bank Account", bank_transaction.bank_account, "account")
company = frappe.get_value("Account", company_account, "company")
@@ -256,9 +259,89 @@ def create_payment_entry_bts(
payment_entry.submit()
vouchers = json.dumps(
[{"payment_doctype": "Payment Entry", "payment_name": payment_entry.name, "amount": paid_amount}]
[
{
"payment_doctype": "Payment Entry",
"payment_name": payment_entry.name,
"amount": paid_amount,
}
]
)
return reconcile_vouchers(bank_transaction.name, vouchers)
return reconcile_vouchers(bank_transaction_name, vouchers)
@frappe.whitelist()
def auto_reconcile_vouchers(
bank_account,
from_date=None,
to_date=None,
filter_by_reference_date=None,
from_reference_date=None,
to_reference_date=None,
):
frappe.flags.auto_reconcile_vouchers = True
document_types = ["payment_entry", "journal_entry"]
bank_transactions = get_bank_transactions(bank_account)
matched_transaction = []
for transaction in bank_transactions:
linked_payments = get_linked_payments(
transaction.name,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
)
vouchers = []
for r in linked_payments:
vouchers.append(
{
"payment_doctype": r[1],
"payment_name": r[2],
"amount": r[4],
}
)
transaction = frappe.get_doc("Bank Transaction", transaction.name)
account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
matched_trans = 0
for voucher in vouchers:
gl_entry = frappe.db.get_value(
"GL Entry",
dict(
account=account, voucher_type=voucher["payment_doctype"], voucher_no=voucher["payment_name"]
),
["credit", "debit"],
as_dict=1,
)
gl_amount, transaction_amount = (
(gl_entry.credit, transaction.deposit)
if gl_entry.credit > 0
else (gl_entry.debit, transaction.withdrawal)
)
allocated_amount = gl_amount if gl_amount >= transaction_amount else transaction_amount
transaction.append(
"payment_entries",
{
"payment_document": voucher["payment_doctype"],
"payment_entry": voucher["payment_name"],
"allocated_amount": allocated_amount,
},
)
matched_transaction.append(str(transaction.name))
transaction.save()
transaction.update_allocations()
matched_transaction_len = len(set(matched_transaction))
if matched_transaction_len == 0:
frappe.msgprint(_("No matching references found for auto reconciliation"))
elif matched_transaction_len == 1:
frappe.msgprint(_("{0} transaction is reconcilied").format(matched_transaction_len))
else:
frappe.msgprint(_("{0} transactions are reconcilied").format(matched_transaction_len))
frappe.flags.auto_reconcile_vouchers = False
return frappe.get_doc("Bank Transaction", transaction.name)
@frappe.whitelist()
@@ -266,80 +349,88 @@ def reconcile_vouchers(bank_transaction_name, vouchers):
# updated clear date of all the vouchers based on the bank transaction
vouchers = json.loads(vouchers)
transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
company_account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
if transaction.unallocated_amount == 0:
frappe.throw(_("This bank transaction is already fully reconciled"))
total_amount = 0
for voucher in vouchers:
voucher["payment_entry"] = frappe.get_doc(voucher["payment_doctype"], voucher["payment_name"])
total_amount += get_paid_amount(
frappe._dict(
{
"payment_document": voucher["payment_doctype"],
"payment_entry": voucher["payment_name"],
}
),
transaction.currency,
company_account,
)
if total_amount > transaction.unallocated_amount:
frappe.throw(
_(
"The sum total of amounts of all selected vouchers should be less than the unallocated amount of the bank transaction"
)
)
account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
for voucher in vouchers:
gl_entry = frappe.db.get_value(
"GL Entry",
dict(
account=account, voucher_type=voucher["payment_doctype"], voucher_no=voucher["payment_name"]
),
["credit", "debit"],
as_dict=1,
)
gl_amount, transaction_amount = (
(gl_entry.credit, transaction.deposit)
if gl_entry.credit > 0
else (gl_entry.debit, transaction.withdrawal)
)
allocated_amount = gl_amount if gl_amount >= transaction_amount else transaction_amount
transaction.append(
"payment_entries",
{
"payment_document": voucher["payment_entry"].doctype,
"payment_entry": voucher["payment_entry"].name,
"allocated_amount": allocated_amount,
},
)
transaction.save()
transaction.update_allocations()
transaction.add_payment_entries(vouchers)
return frappe.get_doc("Bank Transaction", bank_transaction_name)
@frappe.whitelist()
def get_linked_payments(bank_transaction_name, document_types=None):
def get_linked_payments(
bank_transaction_name,
document_types=None,
from_date=None,
to_date=None,
filter_by_reference_date=None,
from_reference_date=None,
to_reference_date=None,
):
# get all matching payments for a bank transaction
transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
bank_account = frappe.db.get_values(
"Bank Account", transaction.bank_account, ["account", "company"], as_dict=True
)[0]
(account, company) = (bank_account.account, bank_account.company)
matching = check_matching(account, company, transaction, document_types)
return matching
(gl_account, company) = (bank_account.account, bank_account.company)
matching = check_matching(
gl_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
)
return subtract_allocations(gl_account, matching)
def check_matching(bank_account, company, transaction, document_types):
def subtract_allocations(gl_account, vouchers):
"Look up & subtract any existing Bank Transaction allocations"
copied = []
for voucher in vouchers:
rows = get_total_allocated_amount(voucher[1], voucher[2])
amount = None
for row in rows:
if row["gl_account"] == gl_account:
amount = row["total"]
break
if amount:
l = list(voucher)
l[3] -= amount
copied.append(tuple(l))
else:
copied.append(voucher)
return copied
def check_matching(
bank_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
):
exact_match = True if "exact_match" in document_types else False
# combine all types of vouchers
subquery = get_queries(bank_account, company, transaction, document_types)
subquery = get_queries(
bank_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
exact_match,
)
filters = {
"amount": transaction.unallocated_amount,
"payment_type": "Receive" if transaction.deposit > 0 else "Pay",
"payment_type": "Receive" if transaction.deposit > 0.0 else "Pay",
"reference_no": transaction.reference_number,
"party_type": transaction.party_type,
"party": transaction.party,
@@ -348,7 +439,9 @@ def check_matching(bank_account, company, transaction, document_types):
matching_vouchers = []
matching_vouchers.extend(get_loan_vouchers(bank_account, transaction, document_types, filters))
matching_vouchers.extend(
get_loan_vouchers(bank_account, transaction, document_types, filters, exact_match)
)
for query in subquery:
matching_vouchers.extend(
@@ -357,14 +450,23 @@ def check_matching(bank_account, company, transaction, document_types):
filters,
)
)
return sorted(matching_vouchers, key=lambda x: x[0], reverse=True) if matching_vouchers else []
def get_queries(bank_account, company, transaction, document_types):
def get_queries(
bank_account,
company,
transaction,
document_types,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
exact_match,
):
# get queries to get matching vouchers
amount_condition = "=" if "exact_match" in document_types else "<="
account_from_to = "paid_to" if transaction.deposit > 0 else "paid_from"
account_from_to = "paid_to" if transaction.deposit > 0.0 else "paid_from"
queries = []
# get matching queries from all the apps
@@ -375,8 +477,13 @@ def get_queries(bank_account, company, transaction, document_types):
company,
transaction,
document_types,
amount_condition,
exact_match,
account_from_to,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
)
or []
)
@@ -385,43 +492,106 @@ def get_queries(bank_account, company, transaction, document_types):
def get_matching_queries(
bank_account, company, transaction, document_types, amount_condition, account_from_to
bank_account,
company,
transaction,
document_types,
exact_match,
account_from_to,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
):
queries = []
if "payment_entry" in document_types:
pe_amount_matching = get_pe_matching_query(amount_condition, account_from_to, transaction)
queries.extend([pe_amount_matching])
query = get_pe_matching_query(
exact_match,
account_from_to,
transaction,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
)
queries.append(query)
if "journal_entry" in document_types:
je_amount_matching = get_je_matching_query(amount_condition, transaction)
queries.extend([je_amount_matching])
query = get_je_matching_query(
exact_match,
transaction,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
)
queries.append(query)
if transaction.deposit > 0 and "sales_invoice" in document_types:
si_amount_matching = get_si_matching_query(amount_condition)
queries.extend([si_amount_matching])
if transaction.deposit > 0.0 and "sales_invoice" in document_types:
query = get_si_matching_query(exact_match)
queries.append(query)
if transaction.withdrawal > 0:
if transaction.withdrawal > 0.0:
if "purchase_invoice" in document_types:
pi_amount_matching = get_pi_matching_query(amount_condition)
queries.extend([pi_amount_matching])
query = get_pi_matching_query(exact_match)
queries.append(query)
if "bank_transaction" in document_types:
query = get_bt_matching_query(exact_match, transaction)
queries.append(query)
return queries
def get_loan_vouchers(bank_account, transaction, document_types, filters):
def get_loan_vouchers(bank_account, transaction, document_types, filters, exact_match):
vouchers = []
amount_condition = True if "exact_match" in document_types else False
if transaction.withdrawal > 0 and "loan_disbursement" in document_types:
vouchers.extend(get_ld_matching_query(bank_account, amount_condition, filters))
if transaction.withdrawal > 0.0 and "loan_disbursement" in document_types:
vouchers.extend(get_ld_matching_query(bank_account, exact_match, filters))
if transaction.deposit > 0 and "loan_repayment" in document_types:
vouchers.extend(get_lr_matching_query(bank_account, amount_condition, filters))
if transaction.deposit > 0.0 and "loan_repayment" in document_types:
vouchers.extend(get_lr_matching_query(bank_account, exact_match, filters))
return vouchers
def get_ld_matching_query(bank_account, amount_condition, filters):
def get_bt_matching_query(exact_match, transaction):
# get matching bank transaction query
# find bank transactions in the same bank account with opposite sign
# same bank account must have same company and currency
field = "deposit" if transaction.withdrawal > 0.0 else "withdrawal"
return f"""
SELECT
(CASE WHEN reference_number = %(reference_no)s THEN 1 ELSE 0 END
+ CASE WHEN {field} = %(amount)s THEN 1 ELSE 0 END
+ CASE WHEN ( party_type = %(party_type)s AND party = %(party)s ) THEN 1 ELSE 0 END
+ CASE WHEN unallocated_amount = %(amount)s THEN 1 ELSE 0 END
+ 1) AS rank,
'Bank Transaction' AS doctype,
name,
unallocated_amount AS paid_amount,
reference_number AS reference_no,
date AS reference_date,
party,
party_type,
date AS posting_date,
currency
FROM
`tabBank Transaction`
WHERE
status != 'Reconciled'
AND name != '{transaction.name}'
AND bank_account = '{transaction.bank_account}'
AND {field} {'= %(amount)s' if exact_match else '> 0.0'}
"""
def get_ld_matching_query(bank_account, exact_match, filters):
loan_disbursement = frappe.qb.DocType("Loan Disbursement")
matching_reference = loan_disbursement.reference_number == filters.get("reference_number")
matching_party = loan_disbursement.applicant_type == filters.get(
@@ -449,17 +619,17 @@ def get_ld_matching_query(bank_account, amount_condition, filters):
.where(loan_disbursement.disbursement_account == bank_account)
)
if amount_condition:
if exact_match:
query.where(loan_disbursement.disbursed_amount == filters.get("amount"))
else:
query.where(loan_disbursement.disbursed_amount <= filters.get("amount"))
query.where(loan_disbursement.disbursed_amount > 0.0)
vouchers = query.run(as_list=True)
return vouchers
def get_lr_matching_query(bank_account, amount_condition, filters):
def get_lr_matching_query(bank_account, exact_match, filters):
loan_repayment = frappe.qb.DocType("Loan Repayment")
matching_reference = loan_repayment.reference_number == filters.get("reference_number")
matching_party = loan_repayment.applicant_type == filters.get(
@@ -490,88 +660,129 @@ def get_lr_matching_query(bank_account, amount_condition, filters):
if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
query = query.where((loan_repayment.repay_from_salary == 0))
if amount_condition:
if exact_match:
query.where(loan_repayment.amount_paid == filters.get("amount"))
else:
query.where(loan_repayment.amount_paid <= filters.get("amount"))
query.where(loan_repayment.amount_paid > 0.0)
vouchers = query.run()
return vouchers
def get_pe_matching_query(amount_condition, account_from_to, transaction):
def get_pe_matching_query(
exact_match,
account_from_to,
transaction,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
):
# get matching payment entries query
if transaction.deposit > 0:
if transaction.deposit > 0.0:
currency_field = "paid_to_account_currency as currency"
else:
currency_field = "paid_from_account_currency as currency"
filter_by_date = f"AND posting_date between '{from_date}' and '{to_date}'"
order_by = " posting_date"
filter_by_reference_no = ""
if cint(filter_by_reference_date):
filter_by_date = f"AND reference_date between '{from_reference_date}' and '{to_reference_date}'"
order_by = " reference_date"
if frappe.flags.auto_reconcile_vouchers == True:
filter_by_reference_no = f"AND reference_no = '{transaction.reference_number}'"
return f"""
SELECT
(CASE WHEN reference_no=%(reference_no)s THEN 1 ELSE 0 END
+ CASE WHEN (party_type = %(party_type)s AND party = %(party)s ) THEN 1 ELSE 0 END
+ 1 ) AS rank,
'Payment Entry' as doctype,
name,
paid_amount,
reference_no,
reference_date,
party,
party_type,
posting_date,
{currency_field}
FROM
`tabPayment Entry`
WHERE
paid_amount {amount_condition} %(amount)s
AND docstatus = 1
AND payment_type IN (%(payment_type)s, 'Internal Transfer')
AND ifnull(clearance_date, '') = ""
AND {account_from_to} = %(bank_account)s
SELECT
(CASE WHEN reference_no=%(reference_no)s THEN 1 ELSE 0 END
+ CASE WHEN (party_type = %(party_type)s AND party = %(party)s ) THEN 1 ELSE 0 END
+ CASE WHEN paid_amount = %(amount)s THEN 1 ELSE 0 END
+ 1 ) AS rank,
'Payment Entry' as doctype,
name,
paid_amount,
reference_no,
reference_date,
party,
party_type,
posting_date,
{currency_field}
FROM
`tabPayment Entry`
WHERE
docstatus = 1
AND payment_type IN (%(payment_type)s, 'Internal Transfer')
AND ifnull(clearance_date, '') = ""
AND {account_from_to} = %(bank_account)s
AND paid_amount {'= %(amount)s' if exact_match else '> 0.0'}
{filter_by_date}
{filter_by_reference_no}
order by{order_by}
"""
def get_je_matching_query(amount_condition, transaction):
def get_je_matching_query(
exact_match,
transaction,
from_date,
to_date,
filter_by_reference_date,
from_reference_date,
to_reference_date,
):
# get matching journal entry query
# We have mapping at the bank level
# So one bank could have both types of bank accounts like asset and liability
# So cr_or_dr should be judged only on basis of withdrawal and deposit and not account type
cr_or_dr = "credit" if transaction.withdrawal > 0 else "debit"
cr_or_dr = "credit" if transaction.withdrawal > 0.0 else "debit"
filter_by_date = f"AND je.posting_date between '{from_date}' and '{to_date}'"
order_by = " je.posting_date"
filter_by_reference_no = ""
if cint(filter_by_reference_date):
filter_by_date = f"AND je.cheque_date between '{from_reference_date}' and '{to_reference_date}'"
order_by = " je.cheque_date"
if frappe.flags.auto_reconcile_vouchers == True:
filter_by_reference_no = f"AND je.cheque_no = '{transaction.reference_number}'"
return f"""
SELECT
(CASE WHEN je.cheque_no=%(reference_no)s THEN 1 ELSE 0 END
+ CASE WHEN jea.{cr_or_dr}_in_account_currency = %(amount)s THEN 1 ELSE 0 END
+ 1) AS rank ,
'Journal Entry' as doctype,
'Journal Entry' AS doctype,
je.name,
jea.{cr_or_dr}_in_account_currency as paid_amount,
je.cheque_no as reference_no,
je.cheque_date as reference_date,
je.pay_to_recd_from as party,
jea.{cr_or_dr}_in_account_currency AS paid_amount,
je.cheque_no AS reference_no,
je.cheque_date AS reference_date,
je.pay_to_recd_from AS party,
jea.party_type,
je.posting_date,
jea.account_currency as currency
jea.account_currency AS currency
FROM
`tabJournal Entry Account` as jea
`tabJournal Entry Account` AS jea
JOIN
`tabJournal Entry` as je
`tabJournal Entry` AS je
ON
jea.parent = je.name
WHERE
(je.clearance_date is null or je.clearance_date='0000-00-00')
je.docstatus = 1
AND je.voucher_type NOT IN ('Opening Entry')
AND (je.clearance_date IS NULL OR je.clearance_date='0000-00-00')
AND jea.account = %(bank_account)s
AND jea.{cr_or_dr}_in_account_currency {amount_condition} %(amount)s
AND jea.{cr_or_dr}_in_account_currency {'= %(amount)s' if exact_match else '> 0.0'}
AND je.docstatus = 1
{filter_by_date}
{filter_by_reference_no}
order by {order_by}
"""
def get_si_matching_query(amount_condition):
# get matchin sales invoice query
def get_si_matching_query(exact_match):
# get matching sales invoice query
return f"""
SELECT
( CASE WHEN si.customer = %(party)s THEN 1 ELSE 0 END
( CASE WHEN si.customer = %(party)s THEN 1 ELSE 0 END
+ CASE WHEN sip.amount = %(amount)s THEN 1 ELSE 0 END
+ 1 ) AS rank,
'Sales Invoice' as doctype,
si.name,
@@ -589,18 +800,20 @@ def get_si_matching_query(amount_condition):
`tabSales Invoice` as si
ON
sip.parent = si.name
WHERE (sip.clearance_date is null or sip.clearance_date='0000-00-00')
WHERE
si.docstatus = 1
AND (sip.clearance_date is null or sip.clearance_date='0000-00-00')
AND sip.account = %(bank_account)s
AND sip.amount {amount_condition} %(amount)s
AND si.docstatus = 1
AND sip.amount {'= %(amount)s' if exact_match else '> 0.0'}
"""
def get_pi_matching_query(amount_condition):
# get matching purchase invoice query
def get_pi_matching_query(exact_match):
# get matching purchase invoice query when they are also used as payment entries (is_paid)
return f"""
SELECT
( CASE WHEN supplier = %(party)s THEN 1 ELSE 0 END
+ CASE WHEN paid_amount = %(amount)s THEN 1 ELSE 0 END
+ 1 ) AS rank,
'Purchase Invoice' as doctype,
name,
@@ -614,9 +827,9 @@ def get_pi_matching_query(amount_condition):
FROM
`tabPurchase Invoice`
WHERE
paid_amount {amount_condition} %(amount)s
AND docstatus = 1
docstatus = 1
AND is_paid = 1
AND ifnull(clearance_date, '') = ""
AND cash_bank_account = %(bank_account)s
AND cash_bank_account = %(bank_account)s
AND paid_amount {'= %(amount)s' if exact_match else '> 0.0'}
"""

View File

@@ -12,8 +12,13 @@ frappe.ui.form.on("Bank Transaction", {
};
});
},
bank_account: function(frm) {
refresh(frm) {
frm.add_custom_button(__('Unreconcile Transaction'), () => {
frm.call('remove_payment_entries')
.then( () => frm.refresh() );
});
},
bank_account: function (frm) {
set_bank_statement_filter(frm);
},
@@ -34,6 +39,7 @@ frappe.ui.form.on("Bank Transaction", {
"Journal Entry",
"Sales Invoice",
"Purchase Invoice",
"Bank Transaction",
];
}
});
@@ -49,7 +55,7 @@ const update_clearance_date = (frm, cdt, cdn) => {
frappe
.xcall(
"erpnext.accounts.doctype.bank_transaction.bank_transaction.unclear_reference_payment",
{ doctype: cdt, docname: cdn }
{ doctype: cdt, docname: cdn, bt_name: frm.doc.name }
)
.then((e) => {
if (e == "success") {

View File

@@ -20,9 +20,11 @@
"currency",
"section_break_10",
"description",
"section_break_14",
"reference_number",
"column_break_10",
"transaction_id",
"transaction_type",
"section_break_14",
"payment_entries",
"section_break_18",
"allocated_amount",
@@ -190,11 +192,21 @@
"label": "Withdrawal",
"oldfieldname": "credit",
"options": "currency"
},
{
"fieldname": "column_break_10",
"fieldtype": "Column Break"
},
{
"fieldname": "transaction_type",
"fieldtype": "Data",
"label": "Transaction Type",
"length": 50
}
],
"is_submittable": 1,
"links": [],
"modified": "2022-03-21 19:05:04.208222",
"modified": "2022-05-29 18:36:50.475964",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction",
@@ -248,4 +260,4 @@
"states": [],
"title_field": "bank_account",
"track_changes": 1
}
}

View File

@@ -1,9 +1,6 @@
# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from functools import reduce
import frappe
from frappe.utils import flt
@@ -18,72 +15,135 @@ class BankTransaction(StatusUpdater):
self.clear_linked_payment_entries()
self.set_status()
_saving_flag = False
# nosemgrep: frappe-semgrep-rules.rules.frappe-modifying-but-not-comitting
def on_update_after_submit(self):
self.update_allocations()
self.clear_linked_payment_entries()
self.set_status(update=True)
"Run on save(). Avoid recursion caused by multiple saves"
if not self._saving_flag:
self._saving_flag = True
self.clear_linked_payment_entries()
self.update_allocations()
self._saving_flag = False
def on_cancel(self):
self.clear_linked_payment_entries(for_cancel=True)
self.set_status(update=True)
def update_allocations(self):
"The doctype does not allow modifications after submission, so write to the db direct"
if self.payment_entries:
allocated_amount = reduce(
lambda x, y: flt(x) + flt(y), [x.allocated_amount for x in self.payment_entries]
)
allocated_amount = sum(p.allocated_amount for p in self.payment_entries)
else:
allocated_amount = 0
allocated_amount = 0.0
if allocated_amount:
frappe.db.set_value(self.doctype, self.name, "allocated_amount", flt(allocated_amount))
frappe.db.set_value(
self.doctype,
self.name,
"unallocated_amount",
abs(flt(self.withdrawal) - flt(self.deposit)) - flt(allocated_amount),
)
amount = abs(flt(self.withdrawal) - flt(self.deposit))
self.db_set("allocated_amount", flt(allocated_amount))
self.db_set("unallocated_amount", amount - flt(allocated_amount))
self.reload()
self.set_status(update=True)
else:
frappe.db.set_value(self.doctype, self.name, "allocated_amount", 0)
frappe.db.set_value(
self.doctype, self.name, "unallocated_amount", abs(flt(self.withdrawal) - flt(self.deposit))
)
def add_payment_entries(self, vouchers):
"Add the vouchers with zero allocation. Save() will perform the allocations and clearance"
if 0.0 >= self.unallocated_amount:
frappe.throw(frappe._("Bank Transaction {0} is already fully reconciled").format(self.name))
amount = self.deposit or self.withdrawal
if amount == self.allocated_amount:
frappe.db.set_value(self.doctype, self.name, "status", "Reconciled")
added = False
for voucher in vouchers:
# Can't add same voucher twice
found = False
for pe in self.payment_entries:
if (
pe.payment_document == voucher["payment_doctype"]
and pe.payment_entry == voucher["payment_name"]
):
found = True
if not found:
pe = {
"payment_document": voucher["payment_doctype"],
"payment_entry": voucher["payment_name"],
"allocated_amount": 0.0, # Temporary
}
child = self.append("payment_entries", pe)
added = True
# runs on_update_after_submit
if added:
self.save()
def allocate_payment_entries(self):
"""Refactored from bank reconciliation tool.
Non-zero allocations must be amended/cleared manually
Get the bank transaction amount (b) and remove as we allocate
For each payment_entry if allocated_amount == 0:
- get the amount already allocated against all transactions (t), need latest date
- get the voucher amount (from gl) (v)
- allocate (a = v - t)
- a = 0: should already be cleared, so clear & remove payment_entry
- 0 < a <= u: allocate a & clear
- 0 < a, a > u: allocate u
- 0 > a: Error: already over-allocated
- clear means: set the latest transaction date as clearance date
"""
gl_bank_account = frappe.db.get_value("Bank Account", self.bank_account, "account")
remaining_amount = self.unallocated_amount
for payment_entry in self.payment_entries:
if payment_entry.allocated_amount == 0.0:
unallocated_amount, should_clear, latest_transaction = get_clearance_details(
self, payment_entry
)
if 0.0 == unallocated_amount:
if should_clear:
latest_transaction.clear_linked_payment_entry(payment_entry)
self.db_delete_payment_entry(payment_entry)
elif remaining_amount <= 0.0:
self.db_delete_payment_entry(payment_entry)
elif 0.0 < unallocated_amount and unallocated_amount <= remaining_amount:
payment_entry.db_set("allocated_amount", unallocated_amount)
remaining_amount -= unallocated_amount
if should_clear:
latest_transaction.clear_linked_payment_entry(payment_entry)
elif 0.0 < unallocated_amount and unallocated_amount > remaining_amount:
payment_entry.db_set("allocated_amount", remaining_amount)
remaining_amount = 0.0
elif 0.0 > unallocated_amount:
self.db_delete_payment_entry(payment_entry)
frappe.throw(frappe._("Voucher {0} is over-allocated by {1}").format(unallocated_amount))
self.reload()
def clear_linked_payment_entries(self, for_cancel=False):
def db_delete_payment_entry(self, payment_entry):
frappe.db.delete("Bank Transaction Payments", {"name": payment_entry.name})
@frappe.whitelist()
def remove_payment_entries(self):
for payment_entry in self.payment_entries:
if payment_entry.payment_document == "Sales Invoice":
self.clear_sales_invoice(payment_entry, for_cancel=for_cancel)
elif payment_entry.payment_document in get_doctypes_for_bank_reconciliation():
self.clear_simple_entry(payment_entry, for_cancel=for_cancel)
self.remove_payment_entry(payment_entry)
# runs on_update_after_submit
self.save()
def clear_simple_entry(self, payment_entry, for_cancel=False):
if payment_entry.payment_document == "Payment Entry":
if (
frappe.db.get_value("Payment Entry", payment_entry.payment_entry, "payment_type")
== "Internal Transfer"
):
if len(get_reconciled_bank_transactions(payment_entry)) < 2:
return
def remove_payment_entry(self, payment_entry):
"Clear payment entry and clearance"
self.clear_linked_payment_entry(payment_entry, for_cancel=True)
self.remove(payment_entry)
clearance_date = self.date if not for_cancel else None
frappe.db.set_value(
payment_entry.payment_document, payment_entry.payment_entry, "clearance_date", clearance_date
)
def clear_linked_payment_entries(self, for_cancel=False):
if for_cancel:
for payment_entry in self.payment_entries:
self.clear_linked_payment_entry(payment_entry, for_cancel)
else:
self.allocate_payment_entries()
def clear_sales_invoice(self, payment_entry, for_cancel=False):
clearance_date = self.date if not for_cancel else None
frappe.db.set_value(
"Sales Invoice Payment",
dict(parenttype=payment_entry.payment_document, parent=payment_entry.payment_entry),
"clearance_date",
clearance_date,
def clear_linked_payment_entry(self, payment_entry, for_cancel=False):
clearance_date = None if for_cancel else self.date
set_voucher_clearance(
payment_entry.payment_document, payment_entry.payment_entry, clearance_date, self
)
@@ -93,38 +153,114 @@ def get_doctypes_for_bank_reconciliation():
return frappe.get_hooks("bank_reconciliation_doctypes")
def get_reconciled_bank_transactions(payment_entry):
reconciled_bank_transactions = frappe.get_all(
"Bank Transaction Payments",
filters={"payment_entry": payment_entry.payment_entry},
fields=["parent"],
def get_clearance_details(transaction, payment_entry):
"""
There should only be one bank gle for a voucher.
Could be none for a Bank Transaction.
But if a JE, could affect two banks.
Should only clear the voucher if all bank gles are allocated.
"""
gl_bank_account = frappe.db.get_value("Bank Account", transaction.bank_account, "account")
gles = get_related_bank_gl_entries(payment_entry.payment_document, payment_entry.payment_entry)
bt_allocations = get_total_allocated_amount(
payment_entry.payment_document, payment_entry.payment_entry
)
return reconciled_bank_transactions
unallocated_amount = min(
transaction.unallocated_amount,
get_paid_amount(payment_entry, transaction.currency, gl_bank_account),
)
unmatched_gles = len(gles)
latest_transaction = transaction
for gle in gles:
if gle["gl_account"] == gl_bank_account:
if gle["amount"] <= 0.0:
frappe.throw(
frappe._("Voucher {0} value is broken: {1}").format(
payment_entry.payment_entry, gle["amount"]
)
)
unmatched_gles -= 1
unallocated_amount = gle["amount"]
for a in bt_allocations:
if a["gl_account"] == gle["gl_account"]:
unallocated_amount = gle["amount"] - a["total"]
if frappe.utils.getdate(transaction.date) < a["latest_date"]:
latest_transaction = frappe.get_doc("Bank Transaction", a["latest_name"])
else:
# Must be a Journal Entry affecting more than one bank
for a in bt_allocations:
if a["gl_account"] == gle["gl_account"] and a["total"] == gle["amount"]:
unmatched_gles -= 1
return unallocated_amount, unmatched_gles == 0, latest_transaction
def get_total_allocated_amount(payment_entry):
return frappe.db.sql(
def get_related_bank_gl_entries(doctype, docname):
# nosemgrep: frappe-semgrep-rules.rules.frappe-using-db-sql
result = frappe.db.sql(
"""
SELECT
SUM(btp.allocated_amount) as allocated_amount,
bt.name
ABS(gle.credit_in_account_currency - gle.debit_in_account_currency) AS amount,
gle.account AS gl_account
FROM
`tabBank Transaction Payments` as btp
`tabGL Entry` gle
LEFT JOIN
`tabBank Transaction` bt ON bt.name=btp.parent
`tabAccount` ac ON ac.name=gle.account
WHERE
btp.payment_document = %s
AND
btp.payment_entry = %s
AND
bt.docstatus = 1""",
(payment_entry.payment_document, payment_entry.payment_entry),
ac.account_type = 'Bank'
AND gle.voucher_type = %(doctype)s
AND gle.voucher_no = %(docname)s
AND is_cancelled = 0
""",
dict(doctype=doctype, docname=docname),
as_dict=True,
)
return result
def get_paid_amount(payment_entry, currency, bank_account):
def get_total_allocated_amount(doctype, docname):
"""
Gets the sum of allocations for a voucher on each bank GL account
along with the latest bank transaction name & date
NOTE: query may also include just saved vouchers/payments but with zero allocated_amount
"""
# nosemgrep: frappe-semgrep-rules.rules.frappe-using-db-sql
result = frappe.db.sql(
"""
SELECT total, latest_name, latest_date, gl_account FROM (
SELECT
ROW_NUMBER() OVER w AS rownum,
SUM(btp.allocated_amount) OVER(PARTITION BY ba.account) AS total,
FIRST_VALUE(bt.name) OVER w AS latest_name,
FIRST_VALUE(bt.date) OVER w AS latest_date,
ba.account AS gl_account
FROM
`tabBank Transaction Payments` btp
LEFT JOIN `tabBank Transaction` bt ON bt.name=btp.parent
LEFT JOIN `tabBank Account` ba ON ba.name=bt.bank_account
WHERE
btp.payment_document = %(doctype)s
AND btp.payment_entry = %(docname)s
AND bt.docstatus = 1
WINDOW w AS (PARTITION BY ba.account ORDER BY bt.date desc)
) temp
WHERE
rownum = 1
""",
dict(doctype=doctype, docname=docname),
as_dict=True,
)
for row in result:
# Why is this *sometimes* a byte string?
if isinstance(row["latest_name"], bytes):
row["latest_name"] = row["latest_name"].decode()
row["latest_date"] = frappe.utils.getdate(row["latest_date"])
return result
def get_paid_amount(payment_entry, currency, gl_bank_account):
if payment_entry.payment_document in ["Payment Entry", "Sales Invoice", "Purchase Invoice"]:
paid_amount_field = "paid_amount"
@@ -137,7 +273,7 @@ def get_paid_amount(payment_entry, currency, bank_account):
)
elif doc.payment_type == "Pay":
paid_amount_field = (
"paid_amount" if doc.paid_to_account_currency == currency else "base_paid_amount"
"paid_amount" if doc.paid_from_account_currency == currency else "base_paid_amount"
)
return frappe.db.get_value(
@@ -145,10 +281,13 @@ def get_paid_amount(payment_entry, currency, bank_account):
)
elif payment_entry.payment_document == "Journal Entry":
return frappe.db.get_value(
"Journal Entry Account",
{"parent": payment_entry.payment_entry, "account": bank_account},
"sum(credit_in_account_currency)",
return abs(
frappe.db.get_value(
"Journal Entry Account",
{"parent": payment_entry.payment_entry, "account": gl_bank_account},
"sum(debit_in_account_currency-credit_in_account_currency)",
)
or 0
)
elif payment_entry.payment_document == "Expense Claim":
@@ -166,6 +305,12 @@ def get_paid_amount(payment_entry, currency, bank_account):
payment_entry.payment_document, payment_entry.payment_entry, "amount_paid"
)
elif payment_entry.payment_document == "Bank Transaction":
dep, wth = frappe.db.get_value(
"Bank Transaction", payment_entry.payment_entry, ("deposit", "withdrawal")
)
return abs(flt(wth) - flt(dep))
else:
frappe.throw(
"Please reconcile {0}: {1} manually".format(
@@ -174,18 +319,55 @@ def get_paid_amount(payment_entry, currency, bank_account):
)
@frappe.whitelist()
def unclear_reference_payment(doctype, docname):
if frappe.db.exists(doctype, docname):
doc = frappe.get_doc(doctype, docname)
if doctype == "Sales Invoice":
frappe.db.set_value(
"Sales Invoice Payment",
dict(parenttype=doc.payment_document, parent=doc.payment_entry),
"clearance_date",
None,
)
else:
frappe.db.set_value(doc.payment_document, doc.payment_entry, "clearance_date", None)
def set_voucher_clearance(doctype, docname, clearance_date, self):
if doctype in [
"Payment Entry",
"Journal Entry",
"Purchase Invoice",
"Expense Claim",
"Loan Repayment",
"Loan Disbursement",
]:
if (
doctype == "Payment Entry"
and frappe.db.get_value("Payment Entry", docname, "payment_type") == "Internal Transfer"
and len(get_reconciled_bank_transactions(doctype, docname)) < 2
):
return
frappe.db.set_value(doctype, docname, "clearance_date", clearance_date)
return doc.payment_entry
elif doctype == "Sales Invoice":
frappe.db.set_value(
"Sales Invoice Payment",
dict(parenttype=doctype, parent=docname),
"clearance_date",
clearance_date,
)
elif doctype == "Bank Transaction":
# For when a second bank transaction has fixed another, e.g. refund
bt = frappe.get_doc(doctype, docname)
if clearance_date:
vouchers = [{"payment_doctype": "Bank Transaction", "payment_name": self.name}]
bt.add_payment_entries(vouchers)
else:
for pe in bt.payment_entries:
if pe.payment_document == self.doctype and pe.payment_entry == self.name:
bt.remove(pe)
bt.save()
break
def get_reconciled_bank_transactions(doctype, docname):
return frappe.get_all(
"Bank Transaction Payments",
filters={"payment_document": doctype, "payment_entry": docname},
pluck="parent",
)
@frappe.whitelist()
def unclear_reference_payment(doctype, docname, bt_name):
bt = frappe.get_doc("Bank Transaction", bt_name)
set_voucher_clearance(doctype, docname, None, bt)
return docname

View File

@@ -5,6 +5,7 @@ import json
import unittest
import frappe
from frappe import utils
from frappe.tests.utils import FrappeTestCase
from erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool import (
@@ -40,7 +41,12 @@ class TestBankTransaction(FrappeTestCase):
"Bank Transaction",
dict(description="Re 95282925234 FE/000002917 AT171513000281183046 Conrad Electronic"),
)
linked_payments = get_linked_payments(bank_transaction.name, ["payment_entry", "exact_match"])
linked_payments = get_linked_payments(
bank_transaction.name,
["payment_entry", "exact_match"],
from_date=bank_transaction.date,
to_date=utils.today(),
)
self.assertTrue(linked_payments[0][6] == "Conrad Electronic")
# This test validates a simple reconciliation leading to the clearance of the bank transaction and the payment
@@ -81,7 +87,12 @@ class TestBankTransaction(FrappeTestCase):
"Bank Transaction",
dict(description="Auszahlung Karte MC/000002916 AUTOMAT 698769 K002 27.10. 14:07"),
)
linked_payments = get_linked_payments(bank_transaction.name, ["payment_entry", "exact_match"])
linked_payments = get_linked_payments(
bank_transaction.name,
["payment_entry", "exact_match"],
from_date=bank_transaction.date,
to_date=utils.today(),
)
self.assertTrue(linked_payments[0][3])
# Check error if already reconciled

View File

@@ -184,6 +184,11 @@ def validate_budget_records(args, budget_records, expense_amount):
amount = expense_amount or get_amount(args, budget)
yearly_action, monthly_action = get_actions(args, budget)
if yearly_action in ("Stop", "Warn"):
compare_expense_with_budget(
args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount
)
if monthly_action in ["Stop", "Warn"]:
budget_amount = get_accumulated_monthly_budget(
budget.monthly_distribution, args.posting_date, args.fiscal_year, budget.budget_amount
@@ -195,28 +200,28 @@ def validate_budget_records(args, budget_records, expense_amount):
args, budget_amount, _("Accumulated Monthly"), monthly_action, budget.budget_against, amount
)
if (
yearly_action in ("Stop", "Warn")
and monthly_action != "Stop"
and yearly_action != monthly_action
):
compare_expense_with_budget(
args, flt(budget.budget_amount), _("Annual"), yearly_action, budget.budget_against, amount
)
def compare_expense_with_budget(args, budget_amount, action_for, action, budget_against, amount=0):
actual_expense = amount or get_actual_expense(args)
if actual_expense > budget_amount:
diff = actual_expense - budget_amount
actual_expense = get_actual_expense(args)
total_expense = actual_expense + amount
if total_expense > budget_amount:
if actual_expense > budget_amount:
error_tense = _("is already")
diff = actual_expense - budget_amount
else:
error_tense = _("will be")
diff = total_expense - budget_amount
currency = frappe.get_cached_value("Company", args.company, "default_currency")
msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It will exceed by {5}").format(
msg = _("{0} Budget for Account {1} against {2} {3} is {4}. It {5} exceed by {6}").format(
_(action_for),
frappe.bold(args.account),
args.budget_against_field,
frappe.unscrub(args.budget_against_field),
frappe.bold(budget_against),
frappe.bold(fmt_money(budget_amount, currency=currency)),
error_tense,
frappe.bold(fmt_money(diff, currency=currency)),
)
@@ -227,9 +232,9 @@ def compare_expense_with_budget(args, budget_amount, action_for, action, budget_
action = "Warn"
if action == "Stop":
frappe.throw(msg, BudgetError)
frappe.throw(msg, BudgetError, title=_("Budget Exceeded"))
else:
frappe.msgprint(msg, indicator="orange")
frappe.msgprint(msg, indicator="orange", title=_("Budget Exceeded"))
def get_actions(args, budget):
@@ -351,7 +356,9 @@ def get_actual_expense(args):
"""
select sum(gle.debit) - sum(gle.credit)
from `tabGL Entry` gle
where gle.account=%(account)s
where
is_cancelled = 0
and gle.account=%(account)s
{condition1}
and gle.fiscal_year=%(fiscal_year)s
and gle.company=%(company)s

View File

@@ -36,7 +36,7 @@ def validate_columns(data):
no_of_columns = max([len(d) for d in data])
if no_of_columns > 7:
if no_of_columns > 8:
frappe.throw(
_("More columns found than expected. Please compare the uploaded file with standard template"),
title=(_("Wrong Template")),
@@ -233,6 +233,7 @@ def build_forest(data):
is_group,
account_type,
root_type,
account_currency,
) = i
if not account_name:
@@ -253,6 +254,8 @@ def build_forest(data):
charts_map[account_name]["account_type"] = account_type
if root_type:
charts_map[account_name]["root_type"] = root_type
if account_currency:
charts_map[account_name]["account_currency"] = account_currency
path = return_parent(data, account_name)[::-1]
paths.append(path) # List of path is created
line_no += 1
@@ -315,20 +318,21 @@ def get_template(template_type):
"Is Group",
"Account Type",
"Root Type",
"Account Currency",
]
writer = UnicodeWriter()
writer.writerow(fields)
if template_type == "Blank Template":
for root_type in get_root_types():
writer.writerow(["", "", "", 1, "", root_type])
writer.writerow(["", "", "", "", 1, "", root_type])
for account in get_mandatory_group_accounts():
writer.writerow(["", "", "", 1, account, "Asset"])
writer.writerow(["", "", "", "", 1, account, "Asset"])
for account_type in get_mandatory_account_types():
writer.writerow(
["", "", "", 0, account_type.get("account_type"), account_type.get("root_type")]
["", "", "", "", 0, account_type.get("account_type"), account_type.get("root_type")]
)
else:
writer = get_sample_template(writer)
@@ -485,6 +489,10 @@ def set_default_accounts(company):
"default_payable_account": frappe.db.get_value(
"Account", {"company": company.name, "account_type": "Payable", "is_group": 0}
),
"default_provisional_account": frappe.db.get_value(
"Account",
{"company": company.name, "account_type": "Service Received But Not Billed", "is_group": 0},
),
}
)

View File

@@ -28,9 +28,14 @@ class InvalidDateError(frappe.ValidationError):
class CostCenterAllocation(Document):
def __init__(self, *args, **kwargs):
super(CostCenterAllocation, self).__init__(*args, **kwargs)
self._skip_from_date_validation = False
def validate(self):
self.validate_total_allocation_percentage()
self.validate_from_date_based_on_existing_gle()
if not self._skip_from_date_validation:
self.validate_from_date_based_on_existing_gle()
self.validate_backdated_allocation()
self.validate_main_cost_center()
self.validate_child_cost_centers()

View File

@@ -40,7 +40,7 @@ class Dunning(AccountsController):
def on_cancel(self):
if self.dunning_amount:
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry")
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Payment Ledger Entry")
make_reverse_gl_entries(voucher_type=self.doctype, voucher_no=self.name)
def make_gl_entries(self):

View File

@@ -26,7 +26,7 @@ frappe.ui.form.on('Exchange Rate Revaluation', {
doc: frm.doc,
callback: function(r) {
if (r.message) {
frm.add_custom_button(__('Journal Entry'), function() {
frm.add_custom_button(__('Journal Entries'), function() {
return frm.events.make_jv(frm);
}, __('Create'));
}
@@ -35,10 +35,11 @@ frappe.ui.form.on('Exchange Rate Revaluation', {
}
},
get_entries: function(frm) {
get_entries: function(frm, account) {
frappe.call({
method: "get_accounts_data",
doc: cur_frm.doc,
account: account,
callback: function(r){
frappe.model.clear_table(frm.doc, "accounts");
if(r.message) {
@@ -57,7 +58,6 @@ frappe.ui.form.on('Exchange Rate Revaluation', {
let total_gain_loss = 0;
frm.doc.accounts.forEach((d) => {
d.gain_loss = flt(d.new_balance_in_base_currency, precision("new_balance_in_base_currency", d)) - flt(d.balance_in_base_currency, precision("balance_in_base_currency", d));
total_gain_loss += flt(d.gain_loss, precision("gain_loss", d));
});
@@ -66,13 +66,19 @@ frappe.ui.form.on('Exchange Rate Revaluation', {
},
make_jv : function(frm) {
let revaluation_journal = null;
let zero_balance_journal = null;
frappe.call({
method: "make_jv_entry",
method: "make_jv_entries",
doc: frm.doc,
freeze: true,
freeze_message: "Making Journal Entries...",
callback: function(r){
if (r.message) {
var doc = frappe.model.sync(r.message)[0];
frappe.set_route("Form", doc.doctype, doc.name);
let response = r.message;
if(response['revaluation_jv'] || response['zero_balance_jv']) {
frappe.msgprint(__("Journals have been created"));
}
}
}
});

View File

@@ -14,6 +14,9 @@
"get_entries",
"accounts",
"section_break_6",
"gain_loss_unbooked",
"gain_loss_booked",
"column_break_10",
"total_gain_loss",
"amended_from"
],
@@ -59,13 +62,6 @@
"fieldname": "section_break_6",
"fieldtype": "Section Break"
},
{
"fieldname": "total_gain_loss",
"fieldtype": "Currency",
"label": "Total Gain/Loss",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "amended_from",
"fieldtype": "Link",
@@ -74,11 +70,37 @@
"options": "Exchange Rate Revaluation",
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "gain_loss_unbooked",
"fieldtype": "Currency",
"label": "Gain/Loss from Revaluation",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"description": "Gain/Loss accumulated in foreign currency account. Accounts with '0' balance in either Base or Account currency",
"fieldname": "gain_loss_booked",
"fieldtype": "Currency",
"label": "Gain/Loss already booked",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "total_gain_loss",
"fieldtype": "Currency",
"label": "Total Gain/Loss",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"fieldname": "column_break_10",
"fieldtype": "Column Break"
}
],
"is_submittable": 1,
"links": [],
"modified": "2022-11-17 10:28:03.911554",
"modified": "2022-12-29 19:38:24.416529",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation",

View File

@@ -3,10 +3,12 @@
import frappe
from frappe import _
from frappe import _, qb
from frappe.model.document import Document
from frappe.model.meta import get_field_precision
from frappe.utils import flt
from frappe.query_builder import Criterion, Order
from frappe.query_builder.functions import NullIf, Sum
from frappe.utils import flt, get_link_to_form
import erpnext
from erpnext.accounts.doctype.journal_entry.journal_entry import get_balance_on
@@ -19,11 +21,25 @@ class ExchangeRateRevaluation(Document):
def set_total_gain_loss(self):
total_gain_loss = 0
gain_loss_booked = 0
gain_loss_unbooked = 0
for d in self.accounts:
d.gain_loss = flt(
d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")
) - flt(d.balance_in_base_currency, d.precision("balance_in_base_currency"))
if not d.zero_balance:
d.gain_loss = flt(
d.new_balance_in_base_currency, d.precision("new_balance_in_base_currency")
) - flt(d.balance_in_base_currency, d.precision("balance_in_base_currency"))
if d.zero_balance:
gain_loss_booked += flt(d.gain_loss, d.precision("gain_loss"))
else:
gain_loss_unbooked += flt(d.gain_loss, d.precision("gain_loss"))
total_gain_loss += flt(d.gain_loss, d.precision("gain_loss"))
self.gain_loss_booked = gain_loss_booked
self.gain_loss_unbooked = gain_loss_unbooked
self.total_gain_loss = flt(total_gain_loss, self.precision("total_gain_loss"))
def validate_mandatory(self):
@@ -35,98 +51,205 @@ class ExchangeRateRevaluation(Document):
@frappe.whitelist()
def check_journal_entry_condition(self):
total_debit = frappe.db.get_value(
"Journal Entry Account",
{"reference_type": "Exchange Rate Revaluation", "reference_name": self.name, "docstatus": 1},
"sum(debit) as sum",
exchange_gain_loss_account = self.get_for_unrealized_gain_loss_account()
jea = qb.DocType("Journal Entry Account")
journals = (
qb.from_(jea)
.select(jea.parent)
.distinct()
.where(
(jea.reference_type == "Exchange Rate Revaluation")
& (jea.reference_name == self.name)
& (jea.docstatus == 1)
)
.run()
)
total_amt = 0
for d in self.accounts:
total_amt = total_amt + d.new_balance_in_base_currency
if journals:
gle = qb.DocType("GL Entry")
total_amt = (
qb.from_(gle)
.select((Sum(gle.credit) - Sum(gle.debit)).as_("total_amount"))
.where(
(gle.voucher_type == "Journal Entry")
& (gle.voucher_no.isin(journals))
& (gle.account == exchange_gain_loss_account)
& (gle.is_cancelled == 0)
)
.run()
)
if total_amt != total_debit:
return True
if total_amt and total_amt[0][0] != self.total_gain_loss:
return True
else:
return False
return False
return True
@frappe.whitelist()
def get_accounts_data(self, account=None):
accounts = []
def get_accounts_data(self):
self.validate_mandatory()
company_currency = erpnext.get_company_currency(self.company)
account_details = self.get_account_balance_from_gle(
company=self.company, posting_date=self.posting_date, account=None, party_type=None, party=None
)
accounts_with_new_balance = self.calculate_new_account_balance(
self.company, self.posting_date, account_details
)
if not accounts_with_new_balance:
self.throw_invalid_response_message(account_details)
return accounts_with_new_balance
@staticmethod
def get_account_balance_from_gle(company, posting_date, account, party_type, party):
account_details = []
if company and posting_date:
company_currency = erpnext.get_company_currency(company)
acc = qb.DocType("Account")
if account:
accounts = [account]
else:
res = (
qb.from_(acc)
.select(acc.name)
.where(
(acc.is_group == 0)
& (acc.report_type == "Balance Sheet")
& (acc.root_type.isin(["Asset", "Liability", "Equity"]))
& (acc.account_type != "Stock")
& (acc.company == company)
& (acc.account_currency != company_currency)
)
.orderby(acc.name)
.run(as_list=True)
)
accounts = [x[0] for x in res]
if accounts:
having_clause = (qb.Field("balance") != qb.Field("balance_in_account_currency")) & (
(qb.Field("balance_in_account_currency") != 0) | (qb.Field("balance") != 0)
)
gle = qb.DocType("GL Entry")
# conditions
conditions = []
conditions.append(gle.account.isin(accounts))
conditions.append(gle.posting_date.lte(posting_date))
conditions.append(gle.is_cancelled == 0)
if party_type:
conditions.append(gle.party_type == party_type)
if party:
conditions.append(gle.party == party)
account_details = (
qb.from_(gle)
.select(
gle.account,
gle.party_type,
gle.party,
gle.account_currency,
(Sum(gle.debit_in_account_currency) - Sum(gle.credit_in_account_currency)).as_(
"balance_in_account_currency"
),
(Sum(gle.debit) - Sum(gle.credit)).as_("balance"),
(Sum(gle.debit) - Sum(gle.credit) == 0)
^ (Sum(gle.debit_in_account_currency) - Sum(gle.credit_in_account_currency) == 0).as_(
"zero_balance"
),
)
.where(Criterion.all(conditions))
.groupby(gle.account, NullIf(gle.party_type, ""), NullIf(gle.party, ""))
.having(having_clause)
.orderby(gle.account)
.run(as_dict=True)
)
return account_details
@staticmethod
def calculate_new_account_balance(company, posting_date, account_details):
accounts = []
company_currency = erpnext.get_company_currency(company)
precision = get_field_precision(
frappe.get_meta("Exchange Rate Revaluation Account").get_field("new_balance_in_base_currency"),
company_currency,
)
account_details = self.get_accounts_from_gle()
for d in account_details:
current_exchange_rate = (
d.balance / d.balance_in_account_currency if d.balance_in_account_currency else 0
)
new_exchange_rate = get_exchange_rate(d.account_currency, company_currency, self.posting_date)
new_balance_in_base_currency = flt(d.balance_in_account_currency * new_exchange_rate)
gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision)
if gain_loss:
accounts.append(
{
"account": d.account,
"party_type": d.party_type,
"party": d.party,
"account_currency": d.account_currency,
"balance_in_base_currency": d.balance,
"balance_in_account_currency": d.balance_in_account_currency,
"current_exchange_rate": current_exchange_rate,
"new_exchange_rate": new_exchange_rate,
"new_balance_in_base_currency": new_balance_in_base_currency,
}
if account_details:
# Handle Accounts with balance in both Account/Base Currency
for d in [x for x in account_details if not x.zero_balance]:
current_exchange_rate = (
d.balance / d.balance_in_account_currency if d.balance_in_account_currency else 0
)
new_exchange_rate = get_exchange_rate(d.account_currency, company_currency, posting_date)
new_balance_in_base_currency = flt(d.balance_in_account_currency * new_exchange_rate)
gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision)
if gain_loss:
accounts.append(
{
"account": d.account,
"party_type": d.party_type,
"party": d.party,
"account_currency": d.account_currency,
"balance_in_base_currency": d.balance,
"balance_in_account_currency": d.balance_in_account_currency,
"zero_balance": d.zero_balance,
"current_exchange_rate": current_exchange_rate,
"new_exchange_rate": new_exchange_rate,
"new_balance_in_base_currency": new_balance_in_base_currency,
"new_balance_in_account_currency": d.balance_in_account_currency,
"gain_loss": gain_loss,
}
)
if not accounts:
self.throw_invalid_response_message(account_details)
# Handle Accounts with '0' balance in Account/Base Currency
for d in [x for x in account_details if x.zero_balance]:
if d.balance != 0:
current_exchange_rate = new_exchange_rate = 0
new_balance_in_account_currency = 0 # this will be '0'
new_balance_in_base_currency = 0 # this will be '0'
gain_loss = flt(new_balance_in_base_currency, precision) - flt(d.balance, precision)
else:
new_exchange_rate = 0
new_balance_in_base_currency = 0
new_balance_in_account_currency = 0
current_exchange_rate = calculate_exchange_rate_using_last_gle(
company, d.account, d.party_type, d.party
)
gain_loss = new_balance_in_account_currency - (
current_exchange_rate * d.balance_in_account_currency
)
if gain_loss:
accounts.append(
{
"account": d.account,
"party_type": d.party_type,
"party": d.party,
"account_currency": d.account_currency,
"balance_in_base_currency": d.balance,
"balance_in_account_currency": d.balance_in_account_currency,
"zero_balance": d.zero_balance,
"current_exchange_rate": current_exchange_rate,
"new_exchange_rate": new_exchange_rate,
"new_balance_in_base_currency": new_balance_in_base_currency,
"new_balance_in_account_currency": new_balance_in_account_currency,
"gain_loss": gain_loss,
}
)
return accounts
def get_accounts_from_gle(self):
company_currency = erpnext.get_company_currency(self.company)
accounts = frappe.db.sql_list(
"""
select name
from tabAccount
where is_group = 0
and report_type = 'Balance Sheet'
and root_type in ('Asset', 'Liability', 'Equity')
and account_type != 'Stock'
and company=%s
and account_currency != %s
order by name""",
(self.company, company_currency),
)
account_details = []
if accounts:
account_details = frappe.db.sql(
"""
select
account, party_type, party, account_currency,
sum(debit_in_account_currency) - sum(credit_in_account_currency) as balance_in_account_currency,
sum(debit) - sum(credit) as balance
from `tabGL Entry`
where account in (%s)
and posting_date <= %s
and is_cancelled = 0
group by account, NULLIF(party_type,''), NULLIF(party,'')
having sum(debit) != sum(credit)
order by account
"""
% (", ".join(["%s"] * len(accounts)), "%s"),
tuple(accounts + [self.posting_date]),
as_dict=1,
)
return account_details
def throw_invalid_response_message(self, account_details):
if account_details:
message = _("No outstanding invoices require exchange rate revaluation")
@@ -134,11 +257,7 @@ class ExchangeRateRevaluation(Document):
message = _("No outstanding invoices found")
frappe.msgprint(message)
@frappe.whitelist()
def make_jv_entry(self):
if self.total_gain_loss == 0:
return
def get_for_unrealized_gain_loss_account(self):
unrealized_exchange_gain_loss_account = frappe.get_cached_value(
"Company", self.company, "unrealized_exchange_gain_loss_account"
)
@@ -146,6 +265,130 @@ class ExchangeRateRevaluation(Document):
frappe.throw(
_("Please set Unrealized Exchange Gain/Loss Account in Company {0}").format(self.company)
)
return unrealized_exchange_gain_loss_account
@frappe.whitelist()
def make_jv_entries(self):
zero_balance_jv = self.make_jv_for_zero_balance()
if zero_balance_jv:
frappe.msgprint(
f"Zero Balance Journal: {get_link_to_form('Journal Entry', zero_balance_jv.name)}"
)
revaluation_jv = self.make_jv_for_revaluation()
if revaluation_jv:
frappe.msgprint(
f"Revaluation Journal: {get_link_to_form('Journal Entry', revaluation_jv.name)}"
)
return {
"revaluation_jv": revaluation_jv.name if revaluation_jv else None,
"zero_balance_jv": zero_balance_jv.name if zero_balance_jv else None,
}
def make_jv_for_zero_balance(self):
if self.gain_loss_booked == 0:
return
accounts = [x for x in self.accounts if x.zero_balance]
if not accounts:
return
unrealized_exchange_gain_loss_account = self.get_for_unrealized_gain_loss_account()
journal_entry = frappe.new_doc("Journal Entry")
journal_entry.voucher_type = "Exchange Gain Or Loss"
journal_entry.company = self.company
journal_entry.posting_date = self.posting_date
journal_entry.multi_currency = 1
journal_entry_accounts = []
for d in accounts:
journal_account = frappe._dict(
{
"account": d.get("account"),
"party_type": d.get("party_type"),
"party": d.get("party"),
"account_currency": d.get("account_currency"),
"balance": flt(
d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")
),
"exchange_rate": 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
# Account Currency has balance
if d.get("balance_in_account_currency") and not d.get("new_balance_in_account_currency"):
dr_or_cr = (
"credit_in_account_currency"
if d.get("balance_in_account_currency") > 0
else "debit_in_account_currency"
)
reverse_dr_or_cr = (
"debit_in_account_currency"
if dr_or_cr == "credit_in_account_currency"
else "credit_in_account_currency"
)
journal_account.update(
{
dr_or_cr: flt(
abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
),
reverse_dr_or_cr: 0,
"debit": 0,
"credit": 0,
}
)
elif d.get("balance_in_base_currency") and not d.get("new_balance_in_base_currency"):
# Base currency has balance
dr_or_cr = "credit" if d.get("balance_in_base_currency") > 0 else "debit"
reverse_dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
journal_account.update(
{
dr_or_cr: flt(
abs(d.get("balance_in_base_currency")), d.precision("balance_in_base_currency")
),
reverse_dr_or_cr: 0,
"debit_in_account_currency": 0,
"credit_in_account_currency": 0,
}
)
journal_entry_accounts.append(journal_account)
journal_entry_accounts.append(
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit": abs(self.gain_loss_booked) if self.gain_loss_booked < 0 else 0,
"credit": abs(self.gain_loss_booked) if self.gain_loss_booked > 0 else 0,
"debit_in_account_currency": abs(self.gain_loss_booked) if self.gain_loss_booked < 0 else 0,
"credit_in_account_currency": self.gain_loss_booked if self.gain_loss_booked > 0 else 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
journal_entry.set("accounts", journal_entry_accounts)
journal_entry.set_total_debit_credit()
journal_entry.save()
return journal_entry
def make_jv_for_revaluation(self):
if self.gain_loss_unbooked == 0:
return
accounts = [x for x in self.accounts if not x.zero_balance]
if not accounts:
return
unrealized_exchange_gain_loss_account = self.get_for_unrealized_gain_loss_account()
journal_entry = frappe.new_doc("Journal Entry")
journal_entry.voucher_type = "Exchange Rate Revaluation"
@@ -154,7 +397,10 @@ class ExchangeRateRevaluation(Document):
journal_entry.multi_currency = 1
journal_entry_accounts = []
for d in self.accounts:
for d in accounts:
if not flt(d.get("balance_in_account_currency"), d.precision("balance_in_account_currency")):
continue
dr_or_cr = (
"debit_in_account_currency"
if d.get("balance_in_account_currency") > 0
@@ -179,6 +425,7 @@ class ExchangeRateRevaluation(Document):
dr_or_cr: flt(
abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
),
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": flt(d.get("new_exchange_rate"), d.precision("new_exchange_rate")),
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
@@ -196,63 +443,122 @@ class ExchangeRateRevaluation(Document):
reverse_dr_or_cr: flt(
abs(d.get("balance_in_account_currency")), d.precision("balance_in_account_currency")
),
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": flt(d.get("current_exchange_rate"), d.precision("current_exchange_rate")),
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
journal_entry_accounts.append(
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit_in_account_currency": abs(self.total_gain_loss) if self.total_gain_loss < 0 else 0,
"credit_in_account_currency": self.total_gain_loss if self.total_gain_loss > 0 else 0,
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
}
)
journal_entry.set("accounts", journal_entry_accounts)
journal_entry.set_amounts_in_company_currency()
journal_entry.set_total_debit_credit()
return journal_entry.as_dict()
self.gain_loss_unbooked += journal_entry.difference - self.gain_loss_unbooked
journal_entry.append(
"accounts",
{
"account": unrealized_exchange_gain_loss_account,
"balance": get_balance_on(unrealized_exchange_gain_loss_account),
"debit_in_account_currency": abs(self.gain_loss_unbooked)
if self.gain_loss_unbooked < 0
else 0,
"credit_in_account_currency": self.gain_loss_unbooked if self.gain_loss_unbooked > 0 else 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"exchange_rate": 1,
"reference_type": "Exchange Rate Revaluation",
"reference_name": self.name,
},
)
journal_entry.set_amounts_in_company_currency()
journal_entry.set_total_debit_credit()
journal_entry.save()
return journal_entry
def calculate_exchange_rate_using_last_gle(company, account, party_type, party):
"""
Use last GL entry to calculate exchange rate
"""
last_exchange_rate = None
if company and account:
gl = qb.DocType("GL Entry")
# build conditions
conditions = []
conditions.append(gl.company == company)
conditions.append(gl.account == account)
conditions.append(gl.is_cancelled == 0)
conditions.append((gl.debit > 0) | (gl.credit > 0))
conditions.append((gl.debit_in_account_currency > 0) | (gl.credit_in_account_currency > 0))
if party_type:
conditions.append(gl.party_type == party_type)
if party:
conditions.append(gl.party == party)
voucher_type, voucher_no = (
qb.from_(gl)
.select(gl.voucher_type, gl.voucher_no)
.where(Criterion.all(conditions))
.orderby(gl.posting_date, order=Order.desc)
.limit(1)
.run()[0]
)
last_exchange_rate = (
qb.from_(gl)
.select((gl.debit - gl.credit) / (gl.debit_in_account_currency - gl.credit_in_account_currency))
.where(
(gl.voucher_type == voucher_type) & (gl.voucher_no == voucher_no) & (gl.account == account)
)
.orderby(gl.posting_date, order=Order.desc)
.limit(1)
.run()[0][0]
)
return last_exchange_rate
@frappe.whitelist()
def get_account_details(account, company, posting_date, party_type=None, party=None):
account_currency, account_type = frappe.db.get_value(
def get_account_details(company, posting_date, account, party_type=None, party=None):
if not (company and posting_date):
frappe.throw(_("Company and Posting Date is mandatory"))
account_currency, account_type = frappe.get_cached_value(
"Account", account, ["account_currency", "account_type"]
)
if account_type in ["Receivable", "Payable"] and not (party_type and party):
frappe.throw(_("Party Type and Party is mandatory for {0} account").format(account_type))
account_details = {}
company_currency = erpnext.get_company_currency(company)
balance = get_balance_on(
account, date=posting_date, party_type=party_type, party=party, in_account_currency=False
)
account_details = {
"account_currency": account_currency,
}
account_balance = ExchangeRateRevaluation.get_account_balance_from_gle(
company=company, posting_date=posting_date, account=account, party_type=party_type, party=party
)
if balance:
balance_in_account_currency = get_balance_on(
account, date=posting_date, party_type=party_type, party=party
if account_balance and (
account_balance[0].balance or account_balance[0].balance_in_account_currency
):
account_with_new_balance = ExchangeRateRevaluation.calculate_new_account_balance(
company, posting_date, account_balance
)
current_exchange_rate = (
balance / balance_in_account_currency if balance_in_account_currency else 0
)
new_exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date)
new_balance_in_base_currency = balance_in_account_currency * new_exchange_rate
account_details = account_details.update(
row = account_with_new_balance[0]
account_details.update(
{
"balance_in_base_currency": balance,
"balance_in_account_currency": balance_in_account_currency,
"current_exchange_rate": current_exchange_rate,
"new_exchange_rate": new_exchange_rate,
"new_balance_in_base_currency": new_balance_in_base_currency,
"balance_in_base_currency": row["balance_in_base_currency"],
"balance_in_account_currency": row["balance_in_account_currency"],
"current_exchange_rate": row["current_exchange_rate"],
"new_exchange_rate": row["new_exchange_rate"],
"new_balance_in_base_currency": row["new_balance_in_base_currency"],
"new_balance_in_account_currency": row["new_balance_in_account_currency"],
"zero_balance": row["zero_balance"],
"gain_loss": row["gain_loss"],
}
)

View File

@@ -10,14 +10,21 @@
"party",
"column_break_2",
"account_currency",
"account_balances",
"balance_in_account_currency",
"column_break_46yz",
"new_balance_in_account_currency",
"balances",
"current_exchange_rate",
"balance_in_base_currency",
"column_break_9",
"column_break_xown",
"new_exchange_rate",
"column_break_9",
"balance_in_base_currency",
"column_break_ukce",
"new_balance_in_base_currency",
"gain_loss"
"section_break_ngrs",
"gain_loss",
"zero_balance"
],
"fields": [
{
@@ -78,7 +85,7 @@
},
{
"fieldname": "column_break_9",
"fieldtype": "Column Break"
"fieldtype": "Section Break"
},
{
"fieldname": "new_exchange_rate",
@@ -102,11 +109,45 @@
"label": "Gain/Loss",
"options": "Company:company:default_currency",
"read_only": 1
},
{
"default": "0",
"description": "This Account has '0' balance in either Base Currency or Account Currency",
"fieldname": "zero_balance",
"fieldtype": "Check",
"label": "Zero Balance"
},
{
"fieldname": "new_balance_in_account_currency",
"fieldtype": "Currency",
"label": "New Balance In Account Currency",
"options": "account_currency",
"read_only": 1
},
{
"fieldname": "account_balances",
"fieldtype": "Section Break"
},
{
"fieldname": "column_break_46yz",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_xown",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_ukce",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_ngrs",
"fieldtype": "Section Break"
}
],
"istable": 1,
"links": [],
"modified": "2022-11-17 10:26:18.302728",
"modified": "2022-12-29 19:38:52.915295",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Exchange Rate Revaluation Account",

View File

@@ -169,5 +169,6 @@ def auto_create_fiscal_year():
def get_from_and_to_date(fiscal_year):
fields = ["year_start_date as from_date", "year_end_date as to_date"]
return frappe.db.get_value("Fiscal Year", fiscal_year, fields, as_dict=1)
fields = ["year_start_date", "year_end_date"]
cached_results = frappe.get_cached_value("Fiscal Year", fiscal_year, fields, as_dict=1)
return dict(from_date=cached_results.year_start_date, to_date=cached_results.year_end_date)

View File

@@ -95,7 +95,15 @@ class GLEntry(Document):
)
# Zero value transaction is not allowed
if not (flt(self.debit, self.precision("debit")) or flt(self.credit, self.precision("credit"))):
if not (
flt(self.debit, self.precision("debit"))
or flt(self.credit, self.precision("credit"))
or (
self.voucher_type == "Journal Entry"
and frappe.get_cached_value("Journal Entry", self.voucher_no, "voucher_type")
== "Exchange Gain Or Loss"
)
):
frappe.throw(
_("{0} {1}: Either debit or credit amount is required for {2}").format(
self.voucher_type, self.voucher_no, self.account

View File

@@ -8,7 +8,7 @@ frappe.provide("erpnext.journal_entry");
frappe.ui.form.on("Journal Entry", {
setup: function(frm) {
frm.add_fetch("bank_account", "account", "account");
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice'];
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', 'Journal Entry', "Repost Payment Ledger", 'Asset', 'Asset Movement'];
},
refresh: function(frm) {

View File

@@ -88,7 +88,7 @@
"label": "Entry Type",
"oldfieldname": "voucher_type",
"oldfieldtype": "Select",
"options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry\nExchange Rate Revaluation\nDeferred Revenue\nDeferred Expense",
"options": "Journal Entry\nInter Company Journal Entry\nBank Entry\nCash Entry\nCredit Card Entry\nDebit Note\nCredit Note\nContra Entry\nExcise Entry\nWrite Off Entry\nOpening Entry\nDepreciation Entry\nExchange Rate Revaluation\nExchange Gain Or Loss\nDeferred Revenue\nDeferred Expense",
"reqd": 1,
"search_index": 1
},
@@ -539,7 +539,7 @@
"idx": 176,
"is_submittable": 1,
"links": [],
"modified": "2022-06-23 22:01:32.348337",
"modified": "2023-03-01 14:58:59.286591",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry",

View File

@@ -51,7 +51,7 @@ class JournalEntry(AccountsController):
self.validate_multi_currency()
self.set_amounts_in_company_currency()
self.validate_debit_credit_amount()
self.set_total_debit_credit()
# Do not validate while importing via data import
if not frappe.flags.in_import:
self.validate_total_debit_and_credit()
@@ -69,6 +69,7 @@ class JournalEntry(AccountsController):
self.validate_empty_accounts_table()
self.set_account_and_party_balance()
self.validate_inter_company_accounts()
self.validate_depr_entry_voucher_type()
if self.docstatus == 0:
self.apply_tax_withholding()
@@ -81,6 +82,7 @@ class JournalEntry(AccountsController):
self.check_credit_limit()
self.make_gl_entries()
self.update_advance_paid()
self.update_asset_value()
self.update_inter_company_jv()
self.update_invoice_discounting()
@@ -88,7 +90,13 @@ class JournalEntry(AccountsController):
from erpnext.accounts.utils import unlink_ref_doc_from_payment_entries
unlink_ref_doc_from_payment_entries(self)
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Payment Ledger Entry")
self.ignore_linked_doctypes = (
"GL Entry",
"Stock Ledger Entry",
"Payment Ledger Entry",
"Repost Payment Ledger",
"Repost Payment Ledger Items",
)
self.make_gl_entries(1)
self.update_advance_paid()
self.unlink_advance_entry_reference()
@@ -123,6 +131,13 @@ class JournalEntry(AccountsController):
if self.total_credit != doc.total_debit or self.total_debit != doc.total_credit:
frappe.throw(_("Total Credit/ Debit Amount should be same as linked Journal Entry"))
def validate_depr_entry_voucher_type(self):
if (
any(d.account_type == "Depreciation" for d in self.get("accounts"))
and self.voucher_type != "Depreciation Entry"
):
frappe.throw(_("Journal Entry type should be set as Depreciation Entry for asset depreciation"))
def validate_stock_accounts(self):
stock_accounts = get_stock_accounts(self.company, self.doctype, self.name)
for account in stock_accounts:
@@ -225,6 +240,34 @@ class JournalEntry(AccountsController):
for d in to_remove:
self.remove(d)
def update_asset_value(self):
if self.flags.planned_depr_entry or self.voucher_type != "Depreciation Entry":
return
for d in self.get("accounts"):
if (
d.reference_type == "Asset"
and d.reference_name
and d.account_type == "Depreciation"
and d.debit
):
asset = frappe.get_doc("Asset", d.reference_name)
if asset.calculate_depreciation:
fb_idx = 1
if self.finance_book:
for fb_row in asset.get("finance_books"):
if fb_row.finance_book == self.finance_book:
fb_idx = fb_row.idx
break
fb_row = asset.get("finance_books")[fb_idx - 1]
fb_row.value_after_depreciation -= d.debit
fb_row.db_update()
else:
asset.db_set("value_after_depreciation", asset.value_after_depreciation - d.debit)
asset.set_status()
def update_inter_company_jv(self):
if (
self.voucher_type == "Inter Company Journal Entry"
@@ -283,19 +326,38 @@ class JournalEntry(AccountsController):
d.db_update()
def unlink_asset_reference(self):
if self.voucher_type != "Depreciation Entry":
return
for d in self.get("accounts"):
if d.reference_type == "Asset" and d.reference_name:
if (
d.reference_type == "Asset"
and d.reference_name
and d.account_type == "Depreciation"
and d.debit
):
asset = frappe.get_doc("Asset", d.reference_name)
for s in asset.get("schedules"):
if s.journal_entry == self.name:
s.db_set("journal_entry", None)
idx = cint(s.finance_book_id) or 1
finance_books = asset.get("finance_books")[idx - 1]
finance_books.value_after_depreciation += s.depreciation_amount
finance_books.db_update()
asset.set_status()
if asset.calculate_depreciation:
fb_idx = None
for s in asset.get("schedules"):
if s.journal_entry == self.name:
s.db_set("journal_entry", None)
fb_idx = cint(s.finance_book_id) or 1
break
if not fb_idx:
fb_idx = 1
if self.finance_book:
for fb_row in asset.get("finance_books"):
if fb_row.finance_book == self.finance_book:
fb_idx = fb_row.idx
break
fb_row = asset.get("finance_books")[fb_idx - 1]
fb_row.value_after_depreciation += d.debit
fb_row.db_update()
else:
asset.db_set("value_after_depreciation", asset.value_after_depreciation + d.debit)
asset.set_status()
def unlink_inter_company_jv(self):
if (
@@ -592,28 +654,29 @@ class JournalEntry(AccountsController):
d.against_account = frappe.db.get_value(d.reference_type, d.reference_name, field)
else:
for d in self.get("accounts"):
if flt(d.debit > 0):
if flt(d.debit) > 0:
accounts_debited.append(d.party or d.account)
if flt(d.credit) > 0:
accounts_credited.append(d.party or d.account)
for d in self.get("accounts"):
if flt(d.debit > 0):
if flt(d.debit) > 0:
d.against_account = ", ".join(list(set(accounts_credited)))
if flt(d.credit > 0):
if flt(d.credit) > 0:
d.against_account = ", ".join(list(set(accounts_debited)))
def validate_debit_credit_amount(self):
for d in self.get("accounts"):
if not flt(d.debit) and not flt(d.credit):
frappe.throw(_("Row {0}: Both Debit and Credit values cannot be zero").format(d.idx))
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
for d in self.get("accounts"):
if not flt(d.debit) and not flt(d.credit):
frappe.throw(_("Row {0}: Both Debit and Credit values cannot be zero").format(d.idx))
def validate_total_debit_and_credit(self):
self.set_total_debit_credit()
if self.difference:
frappe.throw(
_("Total Debit must be equal to Total Credit. The difference is {0}").format(self.difference)
)
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
if self.difference:
frappe.throw(
_("Total Debit must be equal to Total Credit. The difference is {0}").format(self.difference)
)
def set_total_debit_credit(self):
self.total_debit, self.total_credit, self.difference = 0, 0, 0
@@ -651,16 +714,17 @@ class JournalEntry(AccountsController):
self.set_exchange_rate()
def set_amounts_in_company_currency(self):
for d in self.get("accounts"):
d.debit_in_account_currency = flt(
d.debit_in_account_currency, d.precision("debit_in_account_currency")
)
d.credit_in_account_currency = flt(
d.credit_in_account_currency, d.precision("credit_in_account_currency")
)
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
for d in self.get("accounts"):
d.debit_in_account_currency = flt(
d.debit_in_account_currency, d.precision("debit_in_account_currency")
)
d.credit_in_account_currency = flt(
d.credit_in_account_currency, d.precision("credit_in_account_currency")
)
d.debit = flt(d.debit_in_account_currency * flt(d.exchange_rate), d.precision("debit"))
d.credit = flt(d.credit_in_account_currency * flt(d.exchange_rate), d.precision("credit"))
d.debit = flt(d.debit_in_account_currency * flt(d.exchange_rate), d.precision("debit"))
d.credit = flt(d.credit_in_account_currency * flt(d.exchange_rate), d.precision("credit"))
def set_exchange_rate(self):
for d in self.get("accounts"):
@@ -759,7 +823,7 @@ class JournalEntry(AccountsController):
pay_to_recd_from = d.party
if pay_to_recd_from and pay_to_recd_from == d.party:
party_amount += d.debit_in_account_currency or d.credit_in_account_currency
party_amount += flt(d.debit_in_account_currency) or flt(d.credit_in_account_currency)
party_account_currency = d.account_currency
elif frappe.db.get_value("Account", d.account, "account_type") in ["Bank", "Cash"]:
@@ -789,7 +853,7 @@ class JournalEntry(AccountsController):
def build_gl_map(self):
gl_map = []
for d in self.get("accounts"):
if d.debit or d.credit:
if d.debit or d.credit or (self.voucher_type == "Exchange Gain Or Loss"):
r = [d.user_remark, self.remark]
r = [x for x in r if x]
remarks = "\n".join(r)
@@ -827,6 +891,8 @@ class JournalEntry(AccountsController):
def make_gl_entries(self, cancel=0, adv_adj=0):
from erpnext.accounts.general_ledger import make_gl_entries
merge_entries = frappe.db.get_single_value("Accounts Settings", "merge_similar_account_heads")
gl_map = self.build_gl_map()
if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
update_outstanding = "No"
@@ -834,10 +900,16 @@ class JournalEntry(AccountsController):
update_outstanding = "Yes"
if gl_map:
make_gl_entries(gl_map, cancel=cancel, adv_adj=adv_adj, update_outstanding=update_outstanding)
make_gl_entries(
gl_map,
cancel=cancel,
adv_adj=adv_adj,
merge_entries=merge_entries,
update_outstanding=update_outstanding,
)
@frappe.whitelist()
def get_balance(self):
def get_balance(self, difference_account=None):
if not self.get("accounts"):
msgprint(_("'Entries' cannot be empty"), raise_exception=True)
else:
@@ -852,7 +924,13 @@ class JournalEntry(AccountsController):
blank_row = d
if not blank_row:
blank_row = self.append("accounts", {})
blank_row = self.append(
"accounts",
{
"account": difference_account,
"cost_center": erpnext.get_default_cost_center(self.company),
},
)
blank_row.exchange_rate = 1
if diff > 0:

View File

@@ -287,10 +287,6 @@ class TestJournalEntry(unittest.TestCase):
jv.submit()
def test_inter_company_jv(self):
frappe.db.set_value("Account", "Sales Expenses - _TC", "inter_company_account", 1)
frappe.db.set_value("Account", "Buildings - _TC", "inter_company_account", 1)
frappe.db.set_value("Account", "Sales Expenses - _TC1", "inter_company_account", 1)
frappe.db.set_value("Account", "Buildings - _TC1", "inter_company_account", 1)
jv = make_journal_entry(
"Sales Expenses - _TC",
"Buildings - _TC",

View File

@@ -2,6 +2,21 @@
// For license information, please see license.txt
frappe.ui.form.on("Journal Entry Template", {
onload: function(frm) {
if(frm.is_new()) {
frappe.call({
type: "GET",
method: "erpnext.accounts.doctype.journal_entry_template.journal_entry_template.get_naming_series",
callback: function(r){
if(r.message) {
frm.set_df_property("naming_series", "options", r.message.split("\n"));
frm.set_value("naming_series", r.message.split("\n")[0]);
frm.refresh_field("naming_series");
}
}
});
}
},
refresh: function(frm) {
frappe.model.set_default_values(frm.doc);
@@ -19,18 +34,6 @@ frappe.ui.form.on("Journal Entry Template", {
return { filters: filters };
});
frappe.call({
type: "GET",
method: "erpnext.accounts.doctype.journal_entry_template.journal_entry_template.get_naming_series",
callback: function(r){
if(r.message){
frm.set_df_property("naming_series", "options", r.message.split("\n"));
frm.set_value("naming_series", r.message.split("\n")[0]);
frm.refresh_field("naming_series");
}
}
});
},
voucher_type: function(frm) {
var add_accounts = function(doc, r) {

View File

@@ -7,7 +7,7 @@ cur_frm.cscript.tax_table = "Advance Taxes and Charges";
frappe.ui.form.on('Payment Entry', {
onload: function(frm) {
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice'];
frm.ignore_doctypes_on_cancel_all = ['Sales Invoice', 'Purchase Invoice', "Repost Payment Ledger"];
if(frm.doc.__islocal) {
if (!frm.doc.paid_from) frm.set_value("paid_from_account_currency", null);
@@ -245,8 +245,6 @@ frappe.ui.form.on('Payment Entry', {
frm.set_currency_labels(["total_amount", "outstanding_amount", "allocated_amount"],
party_account_currency, "references");
frm.set_currency_labels(["amount"], company_currency, "deductions");
cur_frm.set_df_property("source_exchange_rate", "description",
("1 " + frm.doc.paid_from_account_currency + " = [?] " + company_currency));
@@ -973,29 +971,48 @@ frappe.ui.form.on('Payment Entry', {
},
callback: function(r, rt) {
if(r.message) {
var write_off_row = $.map(frm.doc["deductions"] || [], function(t) {
const write_off_row = $.map(frm.doc["deductions"] || [], function(t) {
return t.account==r.message[account] ? t : null; });
var row = [];
var difference_amount = flt(frm.doc.difference_amount,
const difference_amount = flt(frm.doc.difference_amount,
precision("difference_amount"));
if (!write_off_row.length && difference_amount) {
row = frm.add_child("deductions");
row.account = r.message[account];
row.cost_center = r.message["cost_center"];
} else {
row = write_off_row[0];
}
const add_deductions = (details) => {
let row = null;
if (!write_off_row.length && difference_amount) {
row = frm.add_child("deductions");
row.account = details[account];
row.cost_center = details["cost_center"];
} else {
row = write_off_row[0];
}
if (row) {
row.amount = flt(row.amount) + difference_amount;
} else {
frappe.msgprint(__("No gain or loss in the exchange rate"))
}
if (row) {
row.amount = flt(row.amount) + difference_amount;
} else {
frappe.msgprint(__("No gain or loss in the exchange rate"))
}
refresh_field("deductions");
};
refresh_field("deductions");
if (!r.message[account]) {
frappe.prompt({
label: __("Please Specify Account"),
fieldname: account,
fieldtype: "Link",
options: "Account",
get_query: () => ({
filters: {
company: frm.doc.company,
}
})
}, (values) => {
const details = Object.assign({}, r.message, values);
add_deductions(details);
}, __(frappe.unscrub(account)));
} else {
add_deductions(r.message);
}
frm.events.set_unallocated_amount(frm);
}

View File

@@ -239,7 +239,7 @@
"depends_on": "paid_from",
"fieldname": "paid_from_account_currency",
"fieldtype": "Link",
"label": "Account Currency",
"label": "Account Currency (From)",
"options": "Currency",
"print_hide": 1,
"read_only": 1,
@@ -249,7 +249,7 @@
"depends_on": "paid_from",
"fieldname": "paid_from_account_balance",
"fieldtype": "Currency",
"label": "Account Balance",
"label": "Account Balance (From)",
"options": "paid_from_account_currency",
"print_hide": 1,
"read_only": 1
@@ -272,7 +272,7 @@
"depends_on": "paid_to",
"fieldname": "paid_to_account_currency",
"fieldtype": "Link",
"label": "Account Currency",
"label": "Account Currency (To)",
"options": "Currency",
"print_hide": 1,
"read_only": 1,
@@ -282,7 +282,7 @@
"depends_on": "paid_to",
"fieldname": "paid_to_account_balance",
"fieldtype": "Currency",
"label": "Account Balance",
"label": "Account Balance (To)",
"options": "paid_to_account_currency",
"print_hide": 1,
"read_only": 1
@@ -304,7 +304,8 @@
{
"fieldname": "source_exchange_rate",
"fieldtype": "Float",
"label": "Exchange Rate",
"label": "Source Exchange Rate",
"precision": "9",
"print_hide": 1,
"reqd": 1
},
@@ -333,7 +334,8 @@
{
"fieldname": "target_exchange_rate",
"fieldtype": "Float",
"label": "Exchange Rate",
"label": "Target Exchange Rate",
"precision": "9",
"print_hide": 1,
"reqd": 1
},
@@ -631,14 +633,14 @@
"depends_on": "eval:doc.party_type == 'Supplier'",
"fieldname": "purchase_taxes_and_charges_template",
"fieldtype": "Link",
"label": "Taxes and Charges Template",
"label": "Purchase Taxes and Charges Template",
"options": "Purchase Taxes and Charges Template"
},
{
"depends_on": "eval: doc.party_type == 'Customer'",
"fieldname": "sales_taxes_and_charges_template",
"fieldtype": "Link",
"label": "Taxes and Charges Template",
"label": "Sales Taxes and Charges Template",
"options": "Sales Taxes and Charges Template"
},
{
@@ -731,7 +733,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-02-23 20:08:39.559814",
"modified": "2023-02-14 04:52:30.478523",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",

View File

@@ -60,6 +60,7 @@ class PaymentEntry(AccountsController):
def validate(self):
self.setup_party_account_field()
self.set_missing_values()
self.set_missing_ref_details()
self.validate_payment_type()
self.validate_party_details()
self.set_exchange_rate()
@@ -92,7 +93,13 @@ class PaymentEntry(AccountsController):
self.set_status()
def on_cancel(self):
self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry", "Payment Ledger Entry")
self.ignore_linked_doctypes = (
"GL Entry",
"Stock Ledger Entry",
"Payment Ledger Entry",
"Repost Payment Ledger",
"Repost Payment Ledger Items",
)
self.make_gl_entries(cancel=1)
self.update_outstanding_amounts()
self.update_advance_paid()
@@ -213,11 +220,16 @@ class PaymentEntry(AccountsController):
else self.paid_to_account_currency
)
self.set_missing_ref_details()
def set_missing_ref_details(self, force=False):
def set_missing_ref_details(
self, force: bool = False, update_ref_details_only_for: list | None = None
) -> None:
for d in self.get("references"):
if d.allocated_amount:
if update_ref_details_only_for and (
not (d.reference_doctype, d.reference_name) in update_ref_details_only_for
):
continue
ref_details = get_reference_details(
d.reference_doctype, d.reference_name, self.party_account_currency
)
@@ -247,7 +259,7 @@ class PaymentEntry(AccountsController):
self.set_target_exchange_rate(ref_doc)
def set_source_exchange_rate(self, ref_doc=None):
if self.paid_from and not self.source_exchange_rate:
if self.paid_from:
if self.paid_from_account_currency == self.company_currency:
self.source_exchange_rate = 1
else:
@@ -410,7 +422,7 @@ class PaymentEntry(AccountsController):
for ref in self.get("references"):
if ref.payment_term and ref.reference_name:
key = (ref.payment_term, ref.reference_name)
key = (ref.payment_term, ref.reference_name, ref.reference_doctype)
invoice_payment_amount_map.setdefault(key, 0.0)
invoice_payment_amount_map[key] += ref.allocated_amount
@@ -418,20 +430,37 @@ class PaymentEntry(AccountsController):
payment_schedule = frappe.get_all(
"Payment Schedule",
filters={"parent": ref.reference_name},
fields=["paid_amount", "payment_amount", "payment_term", "discount", "outstanding"],
fields=[
"paid_amount",
"payment_amount",
"payment_term",
"discount",
"outstanding",
"discount_type",
],
)
for term in payment_schedule:
invoice_key = (term.payment_term, ref.reference_name)
invoice_key = (term.payment_term, ref.reference_name, ref.reference_doctype)
invoice_paid_amount_map.setdefault(invoice_key, {})
invoice_paid_amount_map[invoice_key]["outstanding"] = term.outstanding
invoice_paid_amount_map[invoice_key]["discounted_amt"] = ref.total_amount * (
term.discount / 100
)
if not (term.discount_type and term.discount):
continue
if term.discount_type == "Percentage":
invoice_paid_amount_map[invoice_key]["discounted_amt"] = ref.total_amount * (
term.discount / 100
)
else:
invoice_paid_amount_map[invoice_key]["discounted_amt"] = term.discount
for idx, (key, allocated_amount) in enumerate(invoice_payment_amount_map.items(), 1):
if not invoice_paid_amount_map.get(key):
frappe.throw(_("Payment term {0} not used in {1}").format(key[0], key[1]))
allocated_amount = self.get_allocated_amount_in_transaction_currency(
allocated_amount, key[2], key[1]
)
outstanding = flt(invoice_paid_amount_map.get(key, {}).get("outstanding"))
discounted_amt = flt(invoice_paid_amount_map.get(key, {}).get("discounted_amt"))
@@ -466,6 +495,33 @@ class PaymentEntry(AccountsController):
(allocated_amount - discounted_amt, discounted_amt, allocated_amount, key[1], key[0]),
)
def get_allocated_amount_in_transaction_currency(
self, allocated_amount, reference_doctype, reference_docname
):
"""
Payment Entry could be in base currency while reference's payment schedule
is always in transaction currency.
E.g.
* SI with base=INR and currency=USD
* SI with payment schedule in USD
* PE in INR (accounting done in base currency)
"""
ref_currency, ref_exchange_rate = frappe.db.get_value(
reference_doctype, reference_docname, ["currency", "conversion_rate"]
)
is_single_currency = self.paid_from_account_currency == self.paid_to_account_currency
# PE in different currency
reference_is_multi_currency = self.paid_from_account_currency != ref_currency
if not (is_single_currency and reference_is_multi_currency):
return allocated_amount
allocated_amount = flt(
allocated_amount / ref_exchange_rate, self.precision("total_allocated_amount")
)
return allocated_amount
def set_status(self):
if self.docstatus == 2:
self.status = "Cancelled"
@@ -598,6 +654,28 @@ class PaymentEntry(AccountsController):
self.precision("base_received_amount"),
)
def calculate_base_allocated_amount_for_reference(self, d) -> float:
base_allocated_amount = 0
if d.reference_doctype in frappe.get_hooks("advance_payment_doctypes"):
# When referencing Sales/Purchase Order, use the source/target exchange rate depending on payment type.
# This is so there are no Exchange Gain/Loss generated for such doctypes
exchange_rate = 1
if self.payment_type == "Receive":
exchange_rate = self.source_exchange_rate
elif self.payment_type == "Pay":
exchange_rate = self.target_exchange_rate
base_allocated_amount += flt(
flt(d.allocated_amount) * flt(exchange_rate), self.precision("base_paid_amount")
)
else:
base_allocated_amount += flt(
flt(d.allocated_amount) * flt(d.exchange_rate), self.precision("base_paid_amount")
)
return base_allocated_amount
def set_total_allocated_amount(self):
if self.payment_type == "Internal Transfer":
return
@@ -606,9 +684,7 @@ class PaymentEntry(AccountsController):
for d in self.get("references"):
if d.allocated_amount:
total_allocated_amount += flt(d.allocated_amount)
base_total_allocated_amount += flt(
flt(d.allocated_amount) * flt(d.exchange_rate), self.precision("base_paid_amount")
)
base_total_allocated_amount += self.calculate_base_allocated_amount_for_reference(d)
self.total_allocated_amount = abs(total_allocated_amount)
self.base_total_allocated_amount = abs(base_total_allocated_amount)
@@ -622,7 +698,7 @@ class PaymentEntry(AccountsController):
self.payment_type == "Receive"
and self.base_total_allocated_amount < self.base_received_amount + total_deductions
and self.total_allocated_amount
< self.paid_amount + (total_deductions / self.source_exchange_rate)
< flt(self.paid_amount) + (total_deductions / self.source_exchange_rate)
):
self.unallocated_amount = (
self.base_received_amount + total_deductions - self.base_total_allocated_amount
@@ -632,7 +708,7 @@ class PaymentEntry(AccountsController):
self.payment_type == "Pay"
and self.base_total_allocated_amount < (self.base_paid_amount - total_deductions)
and self.total_allocated_amount
< self.received_amount + (total_deductions / self.target_exchange_rate)
< flt(self.received_amount) + (total_deductions / self.target_exchange_rate)
):
self.unallocated_amount = (
self.base_paid_amount - (total_deductions + self.base_total_allocated_amount)
@@ -684,35 +760,34 @@ class PaymentEntry(AccountsController):
)
def validate_payment_against_negative_invoice(self):
if (self.payment_type == "Pay" and self.party_type == "Customer") or (
self.payment_type == "Receive" and self.party_type == "Supplier"
if (self.payment_type != "Pay" or self.party_type != "Customer") and (
self.payment_type != "Receive" or self.party_type != "Supplier"
):
return
total_negative_outstanding = sum(
abs(flt(d.outstanding_amount)) for d in self.get("references") if flt(d.outstanding_amount) < 0
total_negative_outstanding = sum(
abs(flt(d.outstanding_amount)) for d in self.get("references") if flt(d.outstanding_amount) < 0
)
paid_amount = self.paid_amount if self.payment_type == "Receive" else self.received_amount
additional_charges = sum(flt(d.amount) for d in self.deductions)
if not total_negative_outstanding:
if self.party_type == "Customer":
msg = _("Cannot pay to Customer without any negative outstanding invoice")
else:
msg = _("Cannot receive from Supplier without any negative outstanding invoice")
frappe.throw(msg, InvalidPaymentEntry)
elif paid_amount - additional_charges > total_negative_outstanding:
frappe.throw(
_("Paid Amount cannot be greater than total negative outstanding amount {0}").format(
total_negative_outstanding
),
InvalidPaymentEntry,
)
paid_amount = self.paid_amount if self.payment_type == "Receive" else self.received_amount
additional_charges = sum([flt(d.amount) for d in self.deductions])
if not total_negative_outstanding:
frappe.throw(
_("Cannot {0} {1} {2} without any negative outstanding invoice").format(
_(self.payment_type),
(_("to") if self.party_type == "Customer" else _("from")),
self.party_type,
),
InvalidPaymentEntry,
)
elif paid_amount - additional_charges > total_negative_outstanding:
frappe.throw(
_("Paid Amount cannot be greater than total negative outstanding amount {0}").format(
total_negative_outstanding
),
InvalidPaymentEntry,
)
def set_title(self):
if frappe.flags.in_import and self.title:
# do not set title dynamically if title exists during data import.
@@ -826,9 +901,7 @@ class PaymentEntry(AccountsController):
}
)
allocated_amount_in_company_currency = flt(
flt(d.allocated_amount) * flt(d.exchange_rate), self.precision("paid_amount")
)
allocated_amount_in_company_currency = self.calculate_base_allocated_amount_for_reference(d)
gle.update(
{
@@ -1188,6 +1261,7 @@ def get_outstanding_reference_documents(args):
ple = qb.DocType("Payment Ledger Entry")
common_filter = []
accounting_dimensions_filter = []
posting_and_due_date = []
# confirm that Supplier is not blocked
@@ -1217,7 +1291,7 @@ def get_outstanding_reference_documents(args):
# Add cost center condition
if args.get("cost_center"):
condition += " and cost_center='%s'" % args.get("cost_center")
common_filter.append(ple.cost_center == args.get("cost_center"))
accounting_dimensions_filter.append(ple.cost_center == args.get("cost_center"))
date_fields_dict = {
"posting_date": ["from_posting_date", "to_posting_date"],
@@ -1243,6 +1317,7 @@ def get_outstanding_reference_documents(args):
posting_date=posting_and_due_date,
min_outstanding=args.get("outstanding_amt_greater_than"),
max_outstanding=args.get("outstanding_amt_less_than"),
accounting_dimensions=accounting_dimensions_filter,
)
outstanding_invoices = split_invoices_based_on_payment_terms(outstanding_invoices)
@@ -1543,17 +1618,7 @@ def get_account_details(account, date, cost_center=None):
@frappe.whitelist()
def get_company_defaults(company):
fields = ["write_off_account", "exchange_gain_loss_account", "cost_center"]
ret = frappe.get_cached_value("Company", company, fields, as_dict=1)
for fieldname in fields:
if not ret[fieldname]:
frappe.throw(
_("Please set default {0} in Company {1}").format(
frappe.get_meta("Company").get_label(fieldname), company
)
)
return ret
return frappe.get_cached_value("Company", company, fields, as_dict=1)
def get_outstanding_on_journal_entry(name):
@@ -1635,11 +1700,21 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre
@frappe.whitelist()
def get_payment_entry(
dt, dn, party_amount=None, bank_account=None, bank_amount=None, party_type=None, payment_type=None
dt,
dn,
party_amount=None,
bank_account=None,
bank_amount=None,
party_type=None,
payment_type=None,
reference_date=None,
):
reference_doc = None
doc = frappe.get_doc(dt, dn)
if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) > 0:
over_billing_allowance = frappe.db.get_single_value("Accounts Settings", "over_billing_allowance")
if dt in ("Sales Order", "Purchase Order") and flt(doc.per_billed, 2) >= (
100.0 + over_billing_allowance
):
frappe.throw(_("Can only make payment against unbilled {0}").format(dt))
if not party_type:
@@ -1658,12 +1733,20 @@ def get_payment_entry(
# bank or cash
bank = get_bank_cash_account(doc, bank_account)
# if default bank or cash account is not set in company master and party has default company bank account, fetch it
if party_type in ["Customer", "Supplier"] and not bank:
party_bank_account = get_party_bank_account(party_type, doc.get(scrub(party_type)))
if party_bank_account:
account = frappe.db.get_value("Bank Account", party_bank_account, "account")
bank = get_bank_cash_account(doc, account)
paid_amount, received_amount = set_paid_amount_and_received_amount(
dt, party_account_currency, bank, outstanding_amount, payment_type, bank_amount, doc
)
paid_amount, received_amount, discount_amount = apply_early_payment_discount(
paid_amount, received_amount, doc
reference_date = getdate(reference_date)
paid_amount, received_amount, discount_amount, valid_discounts = apply_early_payment_discount(
paid_amount, received_amount, doc, party_account_currency, reference_date
)
pe = frappe.new_doc("Payment Entry")
@@ -1671,6 +1754,7 @@ def get_payment_entry(
pe.company = doc.company
pe.cost_center = doc.get("cost_center")
pe.posting_date = nowdate()
pe.reference_date = reference_date
pe.mode_of_payment = doc.get("mode_of_payment")
pe.party_type = party_type
pe.party = doc.get(scrub(party_type))
@@ -1704,14 +1788,19 @@ def get_payment_entry(
if doc.doctype == "Purchase Invoice" and doc.invoice_is_blocked():
frappe.msgprint(_("{0} is on hold till {1}").format(doc.name, doc.release_date))
else:
if doc.doctype in ("Sales Invoice", "Purchase Invoice") and frappe.get_value(
if doc.doctype in (
"Sales Invoice",
"Purchase Invoice",
"Purchase Order",
"Sales Order",
) and frappe.get_cached_value(
"Payment Terms Template",
{"name": doc.payment_terms_template},
"allocate_payment_based_on_payment_terms",
):
for reference in get_reference_as_per_payment_terms(
doc.payment_schedule, dt, dn, doc, grand_total, outstanding_amount
doc.payment_schedule, dt, dn, doc, grand_total, outstanding_amount, party_account_currency
):
pe.append("references", reference)
else:
@@ -1756,24 +1845,40 @@ def get_payment_entry(
pe.setup_party_account_field()
pe.set_missing_values()
pe.set_missing_ref_details()
update_accounting_dimensions(pe, doc)
if party_account and bank:
pe.set_exchange_rate(ref_doc=reference_doc)
pe.set_amounts()
if discount_amount:
pe.set_gain_or_loss(
account_details={
"account": frappe.get_cached_value("Company", pe.company, "default_discount_account"),
"cost_center": pe.cost_center
or frappe.get_cached_value("Company", pe.company, "cost_center"),
"amount": discount_amount * (-1 if payment_type == "Pay" else 1),
}
base_total_discount_loss = 0
if frappe.db.get_single_value("Accounts Settings", "book_tax_discount_loss"):
base_total_discount_loss = split_early_payment_discount_loss(pe, doc, valid_discounts)
set_pending_discount_loss(
pe, doc, discount_amount, base_total_discount_loss, party_account_currency
)
pe.set_difference_amount()
pe.set_difference_amount()
return pe
def update_accounting_dimensions(pe, doc):
"""
Updates accounting dimensions in Payment Entry based on the accounting dimensions in the reference document
"""
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
for dimension in get_accounting_dimensions():
pe.set(dimension, doc.get(dimension))
def get_bank_cash_account(doc, bank_account):
bank = get_default_bank_cash_account(
doc.company, "Bank", mode_of_payment=doc.get("mode_of_payment"), account=bank_account
@@ -1851,37 +1956,53 @@ def set_paid_amount_and_received_amount(
paid_amount = received_amount = 0
if party_account_currency == bank.account_currency:
paid_amount = received_amount = abs(outstanding_amount)
elif payment_type == "Receive":
paid_amount = abs(outstanding_amount)
if bank_amount:
received_amount = bank_amount
else:
received_amount = paid_amount * doc.get("conversion_rate", 1)
else:
received_amount = abs(outstanding_amount)
if bank_amount:
paid_amount = bank_amount
company_currency = frappe.get_cached_value("Company", doc.get("company"), "default_currency")
if payment_type == "Receive":
paid_amount = abs(outstanding_amount)
if bank_amount:
received_amount = bank_amount
else:
if company_currency != bank.account_currency:
received_amount = paid_amount / doc.get("conversion_rate", 1)
else:
received_amount = paid_amount * doc.get("conversion_rate", 1)
else:
# if party account currency and bank currency is different then populate paid amount as well
paid_amount = received_amount * doc.get("conversion_rate", 1)
received_amount = abs(outstanding_amount)
if bank_amount:
paid_amount = bank_amount
else:
if company_currency != bank.account_currency:
paid_amount = received_amount / doc.get("conversion_rate", 1)
else:
# if party account currency and bank currency is different then populate paid amount as well
paid_amount = received_amount * doc.get("conversion_rate", 1)
return paid_amount, received_amount
def apply_early_payment_discount(paid_amount, received_amount, doc):
def apply_early_payment_discount(
paid_amount, received_amount, doc, party_account_currency, reference_date
):
total_discount = 0
valid_discounts = []
eligible_for_payments = ["Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"]
has_payment_schedule = hasattr(doc, "payment_schedule") and doc.payment_schedule
is_multi_currency = party_account_currency != doc.company_currency
if doc.doctype in eligible_for_payments and has_payment_schedule:
for term in doc.payment_schedule:
if not term.discounted_amount and term.discount and getdate(nowdate()) <= term.discount_date:
if not term.discounted_amount and term.discount and reference_date <= term.discount_date:
if term.discount_type == "Percentage":
discount_amount = flt(doc.get("grand_total")) * (term.discount / 100)
grand_total = doc.get("grand_total") if is_multi_currency else doc.get("base_grand_total")
discount_amount = flt(grand_total) * (term.discount / 100)
else:
discount_amount = term.discount
discount_amount_in_foreign_currency = discount_amount * doc.get("conversion_rate", 1)
# if accounting is done in the same currency, paid_amount = received_amount
conversion_rate = doc.get("conversion_rate", 1) if is_multi_currency else 1
discount_amount_in_foreign_currency = discount_amount * conversion_rate
if doc.doctype == "Sales Invoice":
paid_amount -= discount_amount
@@ -1890,23 +2011,151 @@ def apply_early_payment_discount(paid_amount, received_amount, doc):
received_amount -= discount_amount
paid_amount -= discount_amount_in_foreign_currency
valid_discounts.append({"type": term.discount_type, "discount": term.discount})
total_discount += discount_amount
if total_discount:
money = frappe.utils.fmt_money(total_discount, currency=doc.get("currency"))
currency = doc.get("currency") if is_multi_currency else doc.company_currency
money = frappe.utils.fmt_money(total_discount, currency=currency)
frappe.msgprint(_("Discount of {} applied as per Payment Term").format(money), alert=1)
return paid_amount, received_amount, total_discount
return paid_amount, received_amount, total_discount, valid_discounts
def set_pending_discount_loss(
pe, doc, discount_amount, base_total_discount_loss, party_account_currency
):
# If multi-currency, get base discount amount to adjust with base currency deductions/losses
if party_account_currency != doc.company_currency:
discount_amount = discount_amount * doc.get("conversion_rate", 1)
# Avoid considering miniscule losses
discount_amount = flt(discount_amount - base_total_discount_loss, doc.precision("grand_total"))
# Set base discount amount (discount loss/pending rounding loss) in deductions
if discount_amount > 0.0:
positive_negative = -1 if pe.payment_type == "Pay" else 1
# If tax loss booking is enabled, pending loss will be rounding loss.
# Otherwise it will be the total discount loss.
book_tax_loss = frappe.db.get_single_value("Accounts Settings", "book_tax_discount_loss")
account_type = "round_off_account" if book_tax_loss else "default_discount_account"
pe.set_gain_or_loss(
account_details={
"account": frappe.get_cached_value("Company", pe.company, account_type),
"cost_center": pe.cost_center or frappe.get_cached_value("Company", pe.company, "cost_center"),
"amount": discount_amount * positive_negative,
}
)
def split_early_payment_discount_loss(pe, doc, valid_discounts) -> float:
"""Split early payment discount into Income Loss & Tax Loss."""
total_discount_percent = get_total_discount_percent(doc, valid_discounts)
if not total_discount_percent:
return 0.0
base_loss_on_income = add_income_discount_loss(pe, doc, total_discount_percent)
base_loss_on_taxes = add_tax_discount_loss(pe, doc, total_discount_percent)
# Round off total loss rather than individual losses to reduce rounding error
return flt(base_loss_on_income + base_loss_on_taxes, doc.precision("grand_total"))
def get_total_discount_percent(doc, valid_discounts) -> float:
"""Get total percentage and amount discount applied as a percentage."""
total_discount_percent = (
sum(
discount.get("discount") for discount in valid_discounts if discount.get("type") == "Percentage"
)
or 0.0
)
# Operate in percentages only as it makes the income & tax split easier
total_discount_amount = (
sum(discount.get("discount") for discount in valid_discounts if discount.get("type") == "Amount")
or 0.0
)
if total_discount_amount:
discount_percentage = (total_discount_amount / doc.get("grand_total")) * 100
total_discount_percent += discount_percentage
return total_discount_percent
return total_discount_percent
def add_income_discount_loss(pe, doc, total_discount_percent) -> float:
"""Add loss on income discount in base currency."""
precision = doc.precision("total")
base_loss_on_income = doc.get("base_total") * (total_discount_percent / 100)
pe.append(
"deductions",
{
"account": frappe.get_cached_value("Company", pe.company, "default_discount_account"),
"cost_center": pe.cost_center or frappe.get_cached_value("Company", pe.company, "cost_center"),
"amount": flt(base_loss_on_income, precision),
},
)
return base_loss_on_income # Return loss without rounding
def add_tax_discount_loss(pe, doc, total_discount_percentage) -> float:
"""Add loss on tax discount in base currency."""
tax_discount_loss = {}
base_total_tax_loss = 0
precision = doc.precision("tax_amount_after_discount_amount", "taxes")
# The same account head could be used more than once
for tax in doc.get("taxes", []):
base_tax_loss = tax.get("base_tax_amount_after_discount_amount") * (
total_discount_percentage / 100
)
account = tax.get("account_head")
if not tax_discount_loss.get(account):
tax_discount_loss[account] = base_tax_loss
else:
tax_discount_loss[account] += base_tax_loss
for account, loss in tax_discount_loss.items():
base_total_tax_loss += loss
if loss == 0.0:
continue
pe.append(
"deductions",
{
"account": account,
"cost_center": pe.cost_center or frappe.get_cached_value("Company", pe.company, "cost_center"),
"amount": flt(loss, precision),
},
)
return base_total_tax_loss # Return loss without rounding
def get_reference_as_per_payment_terms(
payment_schedule, dt, dn, doc, grand_total, outstanding_amount
payment_schedule, dt, dn, doc, grand_total, outstanding_amount, party_account_currency
):
references = []
is_multi_currency_acc = (doc.currency != doc.company_currency) and (
party_account_currency != doc.company_currency
)
for payment_term in payment_schedule:
payment_term_outstanding = flt(
payment_term.payment_amount - payment_term.paid_amount, payment_term.precision("payment_amount")
)
if not is_multi_currency_acc:
# If accounting is done in company currency for multi-currency transaction
payment_term_outstanding = flt(
payment_term_outstanding * doc.get("conversion_rate"), payment_term.precision("payment_amount")
)
if payment_term_outstanding:
references.append(

View File

@@ -5,7 +5,7 @@ import unittest
import frappe
from frappe import qb
from frappe.tests.utils import FrappeTestCase
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import flt, nowdate
from erpnext.accounts.doctype.payment_entry.payment_entry import (
@@ -51,6 +51,38 @@ class TestPaymentEntry(FrappeTestCase):
so_advance_paid = frappe.db.get_value("Sales Order", so.name, "advance_paid")
self.assertEqual(so_advance_paid, 0)
def test_payment_against_sales_order_usd_to_inr(self):
so = make_sales_order(
customer="_Test Customer USD", currency="USD", qty=1, rate=100, do_not_submit=True
)
so.conversion_rate = 50
so.submit()
pe = get_payment_entry("Sales Order", so.name)
pe.source_exchange_rate = 55
pe.received_amount = 5500
pe.insert()
pe.submit()
# there should be no difference amount
pe.reload()
self.assertEqual(pe.difference_amount, 0)
self.assertEqual(pe.deductions, [])
expected_gle = dict(
(d[0], d)
for d in [["_Test Receivable USD - _TC", 0, 5500, so.name], ["Cash - _TC", 5500.0, 0, None]]
)
self.validate_gl_entries(pe.name, expected_gle)
so_advance_paid = frappe.db.get_value("Sales Order", so.name, "advance_paid")
self.assertEqual(so_advance_paid, 100)
pe.cancel()
so_advance_paid = frappe.db.get_value("Sales Order", so.name, "advance_paid")
self.assertEqual(so_advance_paid, 0)
def test_payment_entry_for_blocked_supplier_invoice(self):
supplier = frappe.get_doc("Supplier", "_Test Supplier")
supplier.on_hold = 1
@@ -256,10 +288,25 @@ class TestPaymentEntry(FrappeTestCase):
},
)
si.save()
si.submit()
frappe.db.set_single_value("Accounts Settings", "book_tax_discount_loss", 1)
pe_with_tax_loss = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Cash - _TC")
self.assertEqual(pe_with_tax_loss.references[0].payment_term, "30 Credit Days with 10% Discount")
self.assertEqual(pe_with_tax_loss.references[0].allocated_amount, 236.0)
self.assertEqual(pe_with_tax_loss.paid_amount, 212.4)
self.assertEqual(pe_with_tax_loss.deductions[0].amount, 20.0) # Loss on Income
self.assertEqual(pe_with_tax_loss.deductions[1].amount, 3.6) # Loss on Tax
self.assertEqual(pe_with_tax_loss.deductions[1].account, "_Test Account Service Tax - _TC")
frappe.db.set_single_value("Accounts Settings", "book_tax_discount_loss", 0)
pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Cash - _TC")
self.assertEqual(pe.references[0].allocated_amount, 236.0)
self.assertEqual(pe.paid_amount, 212.4)
self.assertEqual(pe.deductions[0].amount, 23.6)
pe.submit()
si.load_from_db()
@@ -269,6 +316,190 @@ class TestPaymentEntry(FrappeTestCase):
self.assertEqual(si.payment_schedule[0].outstanding, 0)
self.assertEqual(si.payment_schedule[0].discounted_amount, 23.6)
def test_payment_entry_against_payment_terms_with_discount_amount(self):
si = create_sales_invoice(do_not_save=1, qty=1, rate=200)
si.payment_terms_template = "Test Discount Amount Template"
create_payment_terms_template_with_discount(
name="30 Credit Days with Rs.50 Discount",
discount_type="Amount",
discount=50,
template_name="Test Discount Amount Template",
)
frappe.db.set_value("Company", si.company, "default_discount_account", "Write Off - _TC")
si.append(
"taxes",
{
"charge_type": "On Net Total",
"account_head": "_Test Account Service Tax - _TC",
"cost_center": "_Test Cost Center - _TC",
"description": "Service Tax",
"rate": 18,
},
)
si.save()
si.submit()
# Set reference date past discount cut off date
pe_1 = get_payment_entry(
"Sales Invoice",
si.name,
bank_account="_Test Cash - _TC",
reference_date=frappe.utils.add_days(si.posting_date, 2),
)
self.assertEqual(pe_1.paid_amount, 236.0) # discount not applied
# Test if tax loss is booked on enabling configuration
frappe.db.set_single_value("Accounts Settings", "book_tax_discount_loss", 1)
pe_with_tax_loss = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Cash - _TC")
self.assertEqual(pe_with_tax_loss.deductions[0].amount, 42.37) # Loss on Income
self.assertEqual(pe_with_tax_loss.deductions[1].amount, 7.63) # Loss on Tax
self.assertEqual(pe_with_tax_loss.deductions[1].account, "_Test Account Service Tax - _TC")
frappe.db.set_single_value("Accounts Settings", "book_tax_discount_loss", 0)
pe = get_payment_entry("Sales Invoice", si.name, bank_account="_Test Cash - _TC")
self.assertEqual(pe.references[0].allocated_amount, 236.0)
self.assertEqual(pe.paid_amount, 186)
self.assertEqual(pe.deductions[0].amount, 50.0)
pe.submit()
si.load_from_db()
self.assertEqual(si.payment_schedule[0].payment_amount, 236.0)
self.assertEqual(si.payment_schedule[0].paid_amount, 186)
self.assertEqual(si.payment_schedule[0].outstanding, 0)
self.assertEqual(si.payment_schedule[0].discounted_amount, 50)
@change_settings(
"Accounts Settings",
{
"allow_multi_currency_invoices_against_single_party_account": 1,
"book_tax_discount_loss": 1,
},
)
def test_payment_entry_multicurrency_si_with_base_currency_accounting_early_payment_discount(
self,
):
"""
1. Multi-currency SI with single currency accounting (company currency)
2. PE with early payment discount
3. Test if Paid Amount is calculated in company currency
4. Test if deductions are calculated in company currency
SI is in USD to document agreed amounts that are in USD, but the accounting is in base currency.
"""
si = create_sales_invoice(
customer="_Test Customer",
currency="USD",
conversion_rate=50,
do_not_save=1,
)
create_payment_terms_template_with_discount()
si.payment_terms_template = "Test Discount Template"
frappe.db.set_value("Company", si.company, "default_discount_account", "Write Off - _TC")
si.save()
si.submit()
pe = get_payment_entry(
"Sales Invoice",
si.name,
bank_account="_Test Bank - _TC",
)
pe.reference_no = si.name
pe.reference_date = nowdate()
# Early payment discount loss on income
self.assertEqual(pe.paid_amount, 4500.0) # Amount in company currency
self.assertEqual(pe.received_amount, 4500.0)
self.assertEqual(pe.deductions[0].amount, 500.0)
self.assertEqual(pe.deductions[0].account, "Write Off - _TC")
self.assertEqual(pe.difference_amount, 0.0)
pe.insert()
pe.submit()
expected_gle = dict(
(d[0], d)
for d in [
["Debtors - _TC", 0, 5000, si.name],
["_Test Bank - _TC", 4500, 0, None],
["Write Off - _TC", 500.0, 0, None],
]
)
self.validate_gl_entries(pe.name, expected_gle)
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
self.assertEqual(outstanding_amount, 0)
def test_payment_entry_multicurrency_accounting_si_with_early_payment_discount(self):
"""
1. Multi-currency SI with multi-currency accounting
2. PE with early payment discount and also exchange loss
3. Test if Paid Amount is calculated in transaction currency
4. Test if deductions are calculated in base/company currency
5. Test if exchange loss is reflected in difference
"""
si = create_sales_invoice(
customer="_Test Customer USD",
debit_to="_Test Receivable USD - _TC",
currency="USD",
conversion_rate=50,
do_not_save=1,
)
create_payment_terms_template_with_discount()
si.payment_terms_template = "Test Discount Template"
frappe.db.set_value("Company", si.company, "default_discount_account", "Write Off - _TC")
si.save()
si.submit()
pe = get_payment_entry(
"Sales Invoice", si.name, bank_account="_Test Bank - _TC", bank_amount=4700
)
pe.reference_no = si.name
pe.reference_date = nowdate()
# Early payment discount loss on income
self.assertEqual(pe.paid_amount, 90.0)
self.assertEqual(pe.received_amount, 4200.0) # 5000 - 500 (discount) - 300 (exchange loss)
self.assertEqual(pe.deductions[0].amount, 500.0)
self.assertEqual(pe.deductions[0].account, "Write Off - _TC")
# Exchange loss
self.assertEqual(pe.difference_amount, 300.0)
pe.append(
"deductions",
{
"account": "_Test Exchange Gain/Loss - _TC",
"cost_center": "_Test Cost Center - _TC",
"amount": 300.0,
},
)
pe.insert()
pe.submit()
self.assertEqual(pe.difference_amount, 0.0)
expected_gle = dict(
(d[0], d)
for d in [
["_Test Receivable USD - _TC", 0, 5000, si.name],
["_Test Bank - _TC", 4200, 0, None],
["Write Off - _TC", 500.0, 0, None],
["_Test Exchange Gain/Loss - _TC", 300.0, 0, None],
]
)
self.validate_gl_entries(pe.name, expected_gle)
outstanding_amount = flt(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"))
self.assertEqual(outstanding_amount, 0)
def test_payment_against_purchase_invoice_to_check_status(self):
pi = make_purchase_invoice(
supplier="_Test Supplier USD",
@@ -839,24 +1070,27 @@ def create_payment_terms_template():
).insert()
def create_payment_terms_template_with_discount():
def create_payment_terms_template_with_discount(
name=None, discount_type=None, discount=None, template_name=None
):
create_payment_term(name or "30 Credit Days with 10% Discount")
template_name = template_name or "Test Discount Template"
create_payment_term("30 Credit Days with 10% Discount")
if not frappe.db.exists("Payment Terms Template", "Test Discount Template"):
payment_term_template = frappe.get_doc(
if not frappe.db.exists("Payment Terms Template", template_name):
frappe.get_doc(
{
"doctype": "Payment Terms Template",
"template_name": "Test Discount Template",
"template_name": template_name,
"allocate_payment_based_on_payment_terms": 1,
"terms": [
{
"doctype": "Payment Terms Template Detail",
"payment_term": "30 Credit Days with 10% Discount",
"payment_term": name or "30 Credit Days with 10% Discount",
"invoice_portion": 100,
"credit_days_based_on": "Day(s) after invoice date",
"credit_days": 2,
"discount": 10,
"discount_type": discount_type or "Percentage",
"discount": discount or 10,
"discount_validity_based_on": "Day(s) after invoice date",
"discount_validity": 1,
}

View File

@@ -3,6 +3,7 @@
"creation": "2016-06-15 15:56:30.815503",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"account",
"cost_center",
@@ -17,9 +18,7 @@
"in_list_view": 1,
"label": "Account",
"options": "Account",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "cost_center",
@@ -28,37 +27,30 @@
"label": "Cost Center",
"options": "Cost Center",
"print_hide": 1,
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"reqd": 1
},
{
"fieldname": "amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Amount",
"reqd": 1,
"show_days": 1,
"show_seconds": 1
"label": "Amount (Company Currency)",
"options": "Company:company:default_currency",
"reqd": 1
},
{
"fieldname": "column_break_2",
"fieldtype": "Column Break",
"show_days": 1,
"show_seconds": 1
"fieldtype": "Column Break"
},
{
"fieldname": "description",
"fieldtype": "Small Text",
"label": "Description",
"show_days": 1,
"show_seconds": 1
"label": "Description"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2020-09-12 20:38:08.110674",
"modified": "2023-03-06 07:11:57.739619",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry Deduction",
@@ -66,5 +58,6 @@
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC"
"sort_order": "DESC",
"states": []
}

View File

@@ -25,7 +25,8 @@
"in_list_view": 1,
"label": "Type",
"options": "DocType",
"reqd": 1
"reqd": 1,
"search_index": 1
},
{
"columns": 2,
@@ -35,7 +36,8 @@
"in_list_view": 1,
"label": "Name",
"options": "reference_doctype",
"reqd": 1
"reqd": 1,
"search_index": 1
},
{
"fieldname": "due_date",
@@ -104,7 +106,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-09-26 17:06:55.597389",
"modified": "2022-12-12 12:31:44.919895",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry Reference",
@@ -113,5 +115,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -3,6 +3,7 @@
frappe.ui.form.on('Payment Gateway Account', {
refresh(frm) {
erpnext.utils.check_payments_app();
if(!frm.doc.__islocal) {
frm.set_df_property('payment_gateway', 'read_only', 1);
}

View File

@@ -82,6 +82,32 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
this.frm.change_custom_button_type('Get Unreconciled Entries', null, 'default');
this.frm.change_custom_button_type('Allocate', null, 'default');
}
// check for any running reconciliation jobs
if (this.frm.doc.receivable_payable_account) {
frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments").then((enabled) => {
if(enabled) {
this.frm.call({
'method': "erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.is_any_doc_running",
"args": {
for_filter: {
company: this.frm.doc.company,
party_type: this.frm.doc.party_type,
party: this.frm.doc.party,
receivable_payable_account: this.frm.doc.receivable_payable_account
}
}
}).then(r => {
if (r.message) {
let doc_link = frappe.utils.get_form_link("Process Payment Reconciliation", r.message, true);
let msg = __("Payment Reconciliation Job: {0} is running for this party. Can't reconcile now.", [doc_link]);
this.frm.dashboard.add_comment(msg, "yellow");
}
});
}
});
}
}
company() {
@@ -170,7 +196,7 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
}
reconcile() {
var show_dialog = this.frm.doc.allocation.filter(d => d.difference_amount && !d.difference_account);
var show_dialog = this.frm.doc.allocation.filter(d => d.difference_amount);
if (show_dialog && show_dialog.length) {
@@ -179,8 +205,12 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
title: __("Select Difference Account"),
fields: [
{
fieldname: "allocation", fieldtype: "Table", label: __("Allocation"),
data: this.data, in_place_edit: true,
fieldname: "allocation",
fieldtype: "Table",
label: __("Allocation"),
data: this.data,
in_place_edit: true,
cannot_add_rows: true,
get_data: () => {
return this.data;
},
@@ -218,6 +248,10 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
read_only: 1
}]
},
{
fieldtype: 'HTML',
options: "<b> New Journal Entry will be posted for the difference amount </b>"
}
],
primary_action: () => {
const args = dialog.get_values()["allocation"];
@@ -234,7 +268,7 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
});
this.frm.doc.allocation.forEach(d => {
if (d.difference_amount && !d.difference_account) {
if (d.difference_amount) {
dialog.fields_dict.allocation.df.data.push({
'docname': d.name,
'reference_name': d.reference_name,
@@ -264,4 +298,32 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo
}
};
frappe.ui.form.on('Payment Reconciliation Allocation', {
allocated_amount: function(frm, cdt, cdn) {
let row = locals[cdt][cdn];
// filter invoice
let invoice = frm.doc.invoices.filter((x) => (x.invoice_number == row.invoice_number));
// filter payment
let payment = frm.doc.payments.filter((x) => (x.reference_name == row.reference_name));
frm.call({
doc: frm.doc,
method: 'calculate_difference_on_allocation_change',
args: {
payment_entry: payment,
invoice: invoice,
allocated_amount: row.allocated_amount
},
callback: (r) => {
if (r.message) {
row.difference_amount = r.message;
frm.refresh();
}
}
});
}
});
extend_cscript(cur_frm.cscript, new erpnext.accounts.PaymentReconciliationController({frm: cur_frm}));

View File

@@ -7,14 +7,16 @@ from frappe import _, msgprint, qb
from frappe.model.document import Document
from frappe.query_builder.custom import ConstantColumn
from frappe.query_builder.functions import IfNull
from frappe.utils import flt, getdate, nowdate, today
from frappe.utils import flt, get_link_to_form, getdate, nowdate, today
import erpnext
from erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation import (
is_any_doc_running,
)
from erpnext.accounts.utils import (
QueryPaymentLedger,
get_outstanding_invoices,
reconcile_against_document,
update_reference_in_payment_entry,
)
from erpnext.controllers.accounts_controller import get_advance_payment_entries
@@ -23,6 +25,7 @@ class PaymentReconciliation(Document):
def __init__(self, *args, **kwargs):
super(PaymentReconciliation, self).__init__(*args, **kwargs)
self.common_filter_conditions = []
self.accounting_dimension_filter_conditions = []
self.ple_posting_date_filter = []
@frappe.whitelist()
@@ -69,6 +72,10 @@ class PaymentReconciliation(Document):
def get_jv_entries(self):
condition = self.get_conditions()
if self.get("cost_center"):
condition += f" and t2.cost_center = '{self.cost_center}' "
dr_or_cr = (
"credit_in_account_currency"
if erpnext.get_party_account_type(self.party_type) == "Receivable"
@@ -79,12 +86,13 @@ class PaymentReconciliation(Document):
"t2.against_account like %(bank_cash_account)s" if self.bank_cash_account else "1=1"
)
# nosemgrep
journal_entries = frappe.db.sql(
"""
select
"Journal Entry" as reference_type, t1.name as reference_name,
t1.posting_date, t1.remark as remarks, t2.name as reference_row,
{dr_or_cr} as amount, t2.is_advance,
{dr_or_cr} as amount, t2.is_advance, t2.exchange_rate,
t2.account_currency as currency
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
@@ -193,6 +201,7 @@ class PaymentReconciliation(Document):
posting_date=self.ple_posting_date_filter,
min_outstanding=self.minimum_invoice_amount if self.minimum_invoice_amount else None,
max_outstanding=self.maximum_invoice_amount if self.maximum_invoice_amount else None,
accounting_dimensions=self.accounting_dimension_filter_conditions,
)
if self.invoice_limit:
@@ -213,26 +222,38 @@ class PaymentReconciliation(Document):
inv.currency = entry.get("currency")
inv.outstanding_amount = flt(entry.get("outstanding_amount"))
def get_difference_amount(self, allocated_entry):
if allocated_entry.get("reference_type") != "Payment Entry":
return
def get_difference_amount(self, payment_entry, invoice, allocated_amount):
difference_amount = 0
if frappe.get_cached_value(
"Account", self.receivable_payable_account, "account_currency"
) != frappe.get_cached_value("Company", self.company, "default_currency"):
if invoice.get("exchange_rate") and payment_entry.get("exchange_rate", 1) != invoice.get(
"exchange_rate", 1
):
allocated_amount_in_ref_rate = payment_entry.get("exchange_rate", 1) * allocated_amount
allocated_amount_in_inv_rate = invoice.get("exchange_rate", 1) * allocated_amount
difference_amount = allocated_amount_in_ref_rate - allocated_amount_in_inv_rate
dr_or_cr = (
"credit_in_account_currency"
if erpnext.get_party_account_type(self.party_type) == "Receivable"
else "debit_in_account_currency"
return difference_amount
@frappe.whitelist()
def calculate_difference_on_allocation_change(self, payment_entry, invoice, allocated_amount):
invoice_exchange_map = self.get_invoice_exchange_map(invoice, payment_entry)
invoice[0]["exchange_rate"] = invoice_exchange_map.get(invoice[0].get("invoice_number"))
new_difference_amount = self.get_difference_amount(
payment_entry[0], invoice[0], allocated_amount
)
row = self.get_payment_details(allocated_entry, dr_or_cr)
doc = frappe.get_doc(allocated_entry.reference_type, allocated_entry.reference_name)
update_reference_in_payment_entry(row, doc, do_not_save=True)
return doc.difference_amount
return new_difference_amount
@frappe.whitelist()
def allocate_entries(self, args):
self.validate_entries()
invoice_exchange_map = self.get_invoice_exchange_map(args.get("invoices"), args.get("payments"))
default_exchange_gain_loss_account = frappe.get_cached_value(
"Company", self.company, "exchange_gain_loss_account"
)
entries = []
for pay in args.get("payments"):
pay.update({"unreconciled_amount": pay.get("amount")})
@@ -246,7 +267,13 @@ class PaymentReconciliation(Document):
inv["outstanding_amount"] = flt(inv.get("outstanding_amount")) - flt(pay.get("amount"))
pay["amount"] = 0
res.difference_amount = self.get_difference_amount(res)
inv["exchange_rate"] = invoice_exchange_map.get(inv.get("invoice_number"))
if pay.get("reference_type") in ["Sales Invoice", "Purchase Invoice"]:
pay["exchange_rate"] = invoice_exchange_map.get(pay.get("reference_name"))
res.difference_amount = self.get_difference_amount(pay, inv, res["allocated_amount"])
res.difference_account = default_exchange_gain_loss_account
res.exchange_rate = inv.get("exchange_rate")
if pay.get("amount") == 0:
entries.append(res)
@@ -276,12 +303,11 @@ class PaymentReconciliation(Document):
"amount": pay.get("amount"),
"allocated_amount": allocated_amount,
"difference_amount": pay.get("difference_amount"),
"currency": inv.get("currency"),
}
)
@frappe.whitelist()
def reconcile(self):
self.validate_allocation()
def reconcile_allocations(self, skip_ref_details_update_for_pe=False):
dr_or_cr = (
"credit_in_account_currency"
if erpnext.get_party_account_type(self.party_type) == "Receivable"
@@ -298,17 +324,95 @@ class PaymentReconciliation(Document):
else:
reconciled_entry = entry_list
reconciled_entry.append(self.get_payment_details(row, dr_or_cr))
payment_details = self.get_payment_details(row, dr_or_cr)
reconciled_entry.append(payment_details)
if payment_details.difference_amount:
self.make_difference_entry(payment_details)
if entry_list:
reconcile_against_document(entry_list)
reconcile_against_document(entry_list, skip_ref_details_update_for_pe)
if dr_or_cr_notes:
reconcile_dr_cr_note(dr_or_cr_notes, self.company)
@frappe.whitelist()
def reconcile(self):
if frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments"):
running_doc = is_any_doc_running(
dict(
company=self.company,
party_type=self.party_type,
party=self.party,
receivable_payable_account=self.receivable_payable_account,
)
)
if running_doc:
frappe.throw(
_("A Reconciliation Job {0} is running for the same filters. Cannot reconcile now").format(
get_link_to_form("Auto Reconcile", running_doc)
)
)
return
self.validate_allocation()
self.reconcile_allocations()
msgprint(_("Successfully Reconciled"))
self.get_unreconciled_entries()
def make_difference_entry(self, row):
journal_entry = frappe.new_doc("Journal Entry")
journal_entry.voucher_type = "Exchange Gain Or Loss"
journal_entry.company = self.company
journal_entry.posting_date = nowdate()
journal_entry.multi_currency = 1
party_account_currency = frappe.get_cached_value(
"Account", self.receivable_payable_account, "account_currency"
)
difference_account_currency = frappe.get_cached_value(
"Account", row.difference_account, "account_currency"
)
# Account Currency has balance
dr_or_cr = "debit" if self.party_type == "Customer" else "credit"
reverse_dr_or_cr = "debit" if dr_or_cr == "credit" else "credit"
journal_account = frappe._dict(
{
"account": self.receivable_payable_account,
"party_type": self.party_type,
"party": self.party,
"account_currency": party_account_currency,
"exchange_rate": 0,
"cost_center": erpnext.get_default_cost_center(self.company),
"reference_type": row.against_voucher_type,
"reference_name": row.against_voucher,
dr_or_cr: flt(row.difference_amount),
dr_or_cr + "_in_account_currency": 0,
}
)
journal_entry.append("accounts", journal_account)
journal_account = frappe._dict(
{
"account": row.difference_account,
"account_currency": difference_account_currency,
"exchange_rate": 1,
"cost_center": erpnext.get_default_cost_center(self.company),
reverse_dr_or_cr + "_in_account_currency": flt(row.difference_amount),
reverse_dr_or_cr: flt(row.difference_amount),
}
)
journal_entry.append("accounts", journal_account)
journal_entry.save()
journal_entry.submit()
def get_payment_details(self, row, dr_or_cr):
return frappe._dict(
{
@@ -318,6 +422,7 @@ class PaymentReconciliation(Document):
"against_voucher_type": row.get("invoice_type"),
"against_voucher": row.get("invoice_number"),
"account": self.receivable_payable_account,
"exchange_rate": row.get("exchange_rate"),
"party_type": self.party_type,
"party": self.party,
"is_advance": row.get("is_advance"),
@@ -342,6 +447,49 @@ class PaymentReconciliation(Document):
if not self.get("payments"):
frappe.throw(_("No records found in the Payments table"))
def get_invoice_exchange_map(self, invoices, payments):
sales_invoices = [
d.get("invoice_number") for d in invoices if d.get("invoice_type") == "Sales Invoice"
]
sales_invoices.extend(
[d.get("reference_name") for d in payments if d.get("reference_type") == "Sales Invoice"]
)
purchase_invoices = [
d.get("invoice_number") for d in invoices if d.get("invoice_type") == "Purchase Invoice"
]
purchase_invoices.extend(
[d.get("reference_name") for d in payments if d.get("reference_type") == "Purchase Invoice"]
)
invoice_exchange_map = frappe._dict()
if sales_invoices:
sales_invoice_map = frappe._dict(
frappe.db.get_all(
"Sales Invoice",
filters={"name": ("in", sales_invoices)},
fields=["name", "conversion_rate"],
as_list=1,
)
)
invoice_exchange_map.update(sales_invoice_map)
if purchase_invoices:
purchase_invoice_map = frappe._dict(
frappe.db.get_all(
"Purchase Invoice",
filters={"name": ("in", purchase_invoices)},
fields=["name", "conversion_rate"],
as_list=1,
)
)
invoice_exchange_map.update(purchase_invoice_map)
return invoice_exchange_map
def validate_allocation(self):
unreconciled_invoices = frappe._dict()
@@ -375,13 +523,14 @@ class PaymentReconciliation(Document):
def build_qb_filter_conditions(self, get_invoices=False, get_return_invoices=False):
self.common_filter_conditions.clear()
self.accounting_dimension_filter_conditions.clear()
self.ple_posting_date_filter.clear()
ple = qb.DocType("Payment Ledger Entry")
self.common_filter_conditions.append(ple.company == self.company)
if self.get("cost_center") and (get_invoices or get_return_invoices):
self.common_filter_conditions.append(ple.cost_center == self.cost_center)
self.accounting_dimension_filter_conditions.append(ple.cost_center == self.cost_center)
if get_invoices:
if self.from_invoice_date:

View File

@@ -5,9 +5,11 @@ import unittest
import frappe
from frappe import qb
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, nowdate
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, nowdate
from erpnext import get_default_cost_center
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.party import get_party_account
@@ -20,6 +22,7 @@ class TestPaymentReconciliation(FrappeTestCase):
self.create_item()
self.create_customer()
self.create_account()
self.create_cost_center()
self.clear_old_entries()
def tearDown(self):
@@ -72,33 +75,11 @@ class TestPaymentReconciliation(FrappeTestCase):
self.item = item if isinstance(item, str) else item.item_code
def create_customer(self):
if frappe.db.exists("Customer", "_Test PR Customer"):
self.customer = "_Test PR Customer"
else:
customer = frappe.new_doc("Customer")
customer.customer_name = "_Test PR Customer"
customer.type = "Individual"
customer.save()
self.customer = customer.name
if frappe.db.exists("Customer", "_Test PR Customer 2"):
self.customer2 = "_Test PR Customer 2"
else:
customer = frappe.new_doc("Customer")
customer.customer_name = "_Test PR Customer 2"
customer.type = "Individual"
customer.save()
self.customer2 = customer.name
if frappe.db.exists("Customer", "_Test PR Customer 3"):
self.customer3 = "_Test PR Customer 3"
else:
customer = frappe.new_doc("Customer")
customer.customer_name = "_Test PR Customer 3"
customer.type = "Individual"
customer.default_currency = "EUR"
customer.save()
self.customer3 = customer.name
self.customer = make_customer("_Test PR Customer")
self.customer2 = make_customer("_Test PR Customer 2")
self.customer3 = make_customer("_Test PR Customer 3", "EUR")
self.customer4 = make_customer("_Test PR Customer 4", "EUR")
self.customer5 = make_customer("_Test PR Customer 5", "EUR")
def create_account(self):
account_name = "Debtors EUR"
@@ -216,6 +197,22 @@ class TestPaymentReconciliation(FrappeTestCase):
)
return je
def create_cost_center(self):
# Setup cost center
cc_name = "Sub"
self.main_cc = frappe.get_doc("Cost Center", get_default_cost_center(self.company))
cc_exists = frappe.db.get_list("Cost Center", filters={"cost_center_name": cc_name})
if cc_exists:
self.sub_cc = frappe.get_doc("Cost Center", cc_exists[0].name)
else:
sub_cc = frappe.new_doc("Cost Center")
sub_cc.cost_center_name = "Sub"
sub_cc.parent_cost_center = self.main_cc.parent_cost_center
sub_cc.company = self.main_cc.company
self.sub_cc = sub_cc.save()
def test_filter_min_max(self):
# check filter condition minimum and maximum amount
self.create_sales_invoice(qty=1, rate=300)
@@ -352,6 +349,11 @@ class TestPaymentReconciliation(FrappeTestCase):
invoices = [x.as_dict() for x in pr.get("invoices")]
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
# Difference amount should not be calculated for base currency accounts
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
si.reload()
@@ -393,6 +395,11 @@ class TestPaymentReconciliation(FrappeTestCase):
invoices = [x.as_dict() for x in pr.get("invoices")]
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
# Difference amount should not be calculated for base currency accounts
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
# check PR tool output
@@ -417,6 +424,11 @@ class TestPaymentReconciliation(FrappeTestCase):
invoices = [x.as_dict() for x in pr.get("invoices")]
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
# Difference amount should not be calculated for base currency accounts
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
# assert outstanding
@@ -453,6 +465,11 @@ class TestPaymentReconciliation(FrappeTestCase):
invoices = [x.as_dict() for x in pr.get("invoices")]
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
# Difference amount should not be calculated for base currency accounts
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
self.assertEqual(pr.get("invoices"), [])
@@ -476,6 +493,11 @@ class TestPaymentReconciliation(FrappeTestCase):
invoices = [x.as_dict() for x in pr.get("invoices")]
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
# Cr Note and Invoice are of the same currency. There shouldn't any difference amount.
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
pr.get_unreconciled_entries()
@@ -509,6 +531,11 @@ class TestPaymentReconciliation(FrappeTestCase):
payments = [x.as_dict() for x in pr.get("payments")]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
pr.allocation[0].allocated_amount = allocated_amount
# Cr Note and Invoice are of the same currency. There shouldn't any difference amount.
for row in pr.allocation:
self.assertEqual(flt(row.get("difference_amount")), 0.0)
pr.reconcile()
# assert outstanding
@@ -578,3 +605,301 @@ class TestPaymentReconciliation(FrappeTestCase):
self.assertEqual(len(pr.payments), 1)
self.assertEqual(pr.payments[0].amount, amount)
self.assertEqual(pr.payments[0].currency, "EUR")
def test_difference_amount_via_journal_entry(self):
# Make Sale Invoice
si = self.create_sales_invoice(
qty=1, rate=100, posting_date=nowdate(), do_not_save=True, do_not_submit=True
)
si.customer = self.customer4
si.currency = "EUR"
si.conversion_rate = 85
si.debit_to = self.debtors_eur
si.save().submit()
# Make payment using Journal Entry
je1 = self.create_journal_entry("HDFC - _PR", self.debtors_eur, 100, nowdate())
je1.multi_currency = 1
je1.accounts[0].exchange_rate = 1
je1.accounts[0].credit_in_account_currency = 0
je1.accounts[0].credit = 0
je1.accounts[0].debit_in_account_currency = 8000
je1.accounts[0].debit = 8000
je1.accounts[1].party_type = "Customer"
je1.accounts[1].party = self.customer4
je1.accounts[1].exchange_rate = 80
je1.accounts[1].credit_in_account_currency = 100
je1.accounts[1].credit = 8000
je1.accounts[1].debit_in_account_currency = 0
je1.accounts[1].debit = 0
je1.save()
je1.submit()
je2 = self.create_journal_entry("HDFC - _PR", self.debtors_eur, 200, nowdate())
je2.multi_currency = 1
je2.accounts[0].exchange_rate = 1
je2.accounts[0].credit_in_account_currency = 0
je2.accounts[0].credit = 0
je2.accounts[0].debit_in_account_currency = 16000
je2.accounts[0].debit = 16000
je2.accounts[1].party_type = "Customer"
je2.accounts[1].party = self.customer4
je2.accounts[1].exchange_rate = 80
je2.accounts[1].credit_in_account_currency = 200
je1.accounts[1].credit = 16000
je1.accounts[1].debit_in_account_currency = 0
je1.accounts[1].debit = 0
je2.save()
je2.submit()
pr = self.create_payment_reconciliation()
pr.party = self.customer4
pr.receivable_payable_account = self.debtors_eur
pr.get_unreconciled_entries()
self.assertEqual(len(pr.invoices), 1)
self.assertEqual(len(pr.payments), 2)
# Test exact payment allocation
invoices = [x.as_dict() for x in pr.invoices]
payments = [pr.payments[0].as_dict()]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
self.assertEqual(pr.allocation[0].allocated_amount, 100)
self.assertEqual(pr.allocation[0].difference_amount, -500)
# Test partial payment allocation (with excess payment entry)
pr.set("allocation", [])
pr.get_unreconciled_entries()
invoices = [x.as_dict() for x in pr.invoices]
payments = [pr.payments[1].as_dict()]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
pr.allocation[0].difference_account = "Exchange Gain/Loss - _PR"
self.assertEqual(pr.allocation[0].allocated_amount, 100)
self.assertEqual(pr.allocation[0].difference_amount, -500)
# Check if difference journal entry gets generated for difference amount after reconciliation
pr.reconcile()
total_debit_amount = frappe.db.get_all(
"Journal Entry Account",
{"account": self.debtors_eur, "docstatus": 1, "reference_name": si.name},
"sum(debit) as amount",
group_by="reference_name",
)[0].amount
self.assertEqual(flt(total_debit_amount, 2), -500)
def test_difference_amount_via_payment_entry(self):
# Make Sale Invoice
si = self.create_sales_invoice(
qty=1, rate=100, posting_date=nowdate(), do_not_save=True, do_not_submit=True
)
si.customer = self.customer5
si.currency = "EUR"
si.conversion_rate = 85
si.debit_to = self.debtors_eur
si.save().submit()
# Make payment using Payment Entry
pe1 = create_payment_entry(
company=self.company,
payment_type="Receive",
party_type="Customer",
party=self.customer5,
paid_from=self.debtors_eur,
paid_to=self.bank,
paid_amount=100,
)
pe1.source_exchange_rate = 80
pe1.received_amount = 8000
pe1.save()
pe1.submit()
pe2 = create_payment_entry(
company=self.company,
payment_type="Receive",
party_type="Customer",
party=self.customer5,
paid_from=self.debtors_eur,
paid_to=self.bank,
paid_amount=200,
)
pe2.source_exchange_rate = 80
pe2.received_amount = 16000
pe2.save()
pe2.submit()
pr = self.create_payment_reconciliation()
pr.party = self.customer5
pr.receivable_payable_account = self.debtors_eur
pr.get_unreconciled_entries()
self.assertEqual(len(pr.invoices), 1)
self.assertEqual(len(pr.payments), 2)
invoices = [x.as_dict() for x in pr.invoices]
payments = [pr.payments[0].as_dict()]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
self.assertEqual(pr.allocation[0].allocated_amount, 100)
self.assertEqual(pr.allocation[0].difference_amount, -500)
pr.set("allocation", [])
pr.get_unreconciled_entries()
invoices = [x.as_dict() for x in pr.invoices]
payments = [pr.payments[1].as_dict()]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
self.assertEqual(pr.allocation[0].allocated_amount, 100)
self.assertEqual(pr.allocation[0].difference_amount, -500)
def test_differing_cost_center_on_invoice_and_payment(self):
"""
Cost Center filter should not affect outstanding amount calculation
"""
si = self.create_sales_invoice(qty=1, rate=100, do_not_submit=True)
si.cost_center = self.main_cc.name
si.submit()
pr = get_payment_entry(si.doctype, si.name)
pr.cost_center = self.sub_cc.name
pr = pr.save().submit()
pr = self.create_payment_reconciliation()
pr.cost_center = self.main_cc.name
pr.get_unreconciled_entries()
# check PR tool output
self.assertEqual(len(pr.get("invoices")), 0)
self.assertEqual(len(pr.get("payments")), 0)
def test_cost_center_filter_on_vouchers(self):
"""
Test Cost Center filter is applied on Invoices, Payment Entries and Journals
"""
transaction_date = nowdate()
rate = 100
# 'Main - PR' Cost Center
si1 = self.create_sales_invoice(
qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True
)
si1.cost_center = self.main_cc.name
si1.submit()
pe1 = self.create_payment_entry(posting_date=transaction_date, amount=rate)
pe1.cost_center = self.main_cc.name
pe1 = pe1.save().submit()
je1 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date)
je1.accounts[0].cost_center = self.main_cc.name
je1.accounts[1].cost_center = self.main_cc.name
je1.accounts[1].party_type = "Customer"
je1.accounts[1].party = self.customer
je1 = je1.save().submit()
# 'Sub - PR' Cost Center
si2 = self.create_sales_invoice(
qty=1, rate=rate, posting_date=transaction_date, do_not_submit=True
)
si2.cost_center = self.sub_cc.name
si2.submit()
pe2 = self.create_payment_entry(posting_date=transaction_date, amount=rate)
pe2.cost_center = self.sub_cc.name
pe2 = pe2.save().submit()
je2 = self.create_journal_entry(self.bank, self.debit_to, 100, transaction_date)
je2.accounts[0].cost_center = self.sub_cc.name
je2.accounts[1].cost_center = self.sub_cc.name
je2.accounts[1].party_type = "Customer"
je2.accounts[1].party = self.customer
je2 = je2.save().submit()
pr = self.create_payment_reconciliation()
pr.cost_center = self.main_cc.name
pr.get_unreconciled_entries()
# check PR tool output
self.assertEqual(len(pr.get("invoices")), 1)
self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si1.name)
self.assertEqual(len(pr.get("payments")), 2)
payment_vouchers = [x.get("reference_name") for x in pr.get("payments")]
self.assertCountEqual(payment_vouchers, [pe1.name, je1.name])
# Change cost center
pr.cost_center = self.sub_cc.name
pr.get_unreconciled_entries()
# check PR tool output
self.assertEqual(len(pr.get("invoices")), 1)
self.assertEqual(pr.get("invoices")[0].get("invoice_number"), si2.name)
self.assertEqual(len(pr.get("payments")), 2)
payment_vouchers = [x.get("reference_name") for x in pr.get("payments")]
self.assertCountEqual(payment_vouchers, [je2.name, pe2.name])
@change_settings(
"Accounts Settings",
{
"allow_multi_currency_invoices_against_single_party_account": 1,
},
)
def test_no_difference_amount_for_base_currency_accounts(self):
# Make Sale Invoice
si = self.create_sales_invoice(
qty=1, rate=1, posting_date=nowdate(), do_not_save=True, do_not_submit=True
)
si.customer = self.customer
si.currency = "EUR"
si.conversion_rate = 85
si.debit_to = self.debit_to
si.save().submit()
# Make payment using Payment Entry
pe1 = create_payment_entry(
company=self.company,
payment_type="Receive",
party_type="Customer",
party=self.customer,
paid_from=self.debit_to,
paid_to=self.bank,
paid_amount=100,
)
pe1.save()
pe1.submit()
pr = self.create_payment_reconciliation()
pr.party = self.customer
pr.receivable_payable_account = self.debit_to
pr.get_unreconciled_entries()
self.assertEqual(len(pr.invoices), 1)
self.assertEqual(len(pr.payments), 1)
invoices = [x.as_dict() for x in pr.invoices]
payments = [pr.payments[0].as_dict()]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
self.assertEqual(pr.allocation[0].allocated_amount, 85)
self.assertEqual(pr.allocation[0].difference_amount, 0)
def make_customer(customer_name, currency=None):
if not frappe.db.exists("Customer", customer_name):
customer = frappe.new_doc("Customer")
customer.customer_name = customer_name
customer.type = "Individual"
if currency:
customer.default_currency = currency
customer.save()
return customer.name
else:
return customer_name

View File

@@ -20,7 +20,9 @@
"section_break_5",
"difference_amount",
"column_break_7",
"difference_account"
"difference_account",
"exchange_rate",
"currency"
],
"fields": [
{
@@ -37,7 +39,7 @@
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Allocated Amount",
"options": "Currency",
"options": "currency",
"reqd": 1
},
{
@@ -112,7 +114,7 @@
"fieldtype": "Currency",
"hidden": 1,
"label": "Unreconciled Amount",
"options": "Currency",
"options": "currency",
"read_only": 1
},
{
@@ -120,7 +122,7 @@
"fieldtype": "Currency",
"hidden": 1,
"label": "Amount",
"options": "Currency",
"options": "currency",
"read_only": 1
},
{
@@ -129,11 +131,24 @@
"hidden": 1,
"label": "Reference Row",
"read_only": 1
},
{
"fieldname": "currency",
"fieldtype": "Link",
"hidden": 1,
"label": "Currency",
"options": "Currency"
},
{
"fieldname": "exchange_rate",
"fieldtype": "Float",
"label": "Exchange Rate",
"read_only": 1
}
],
"istable": 1,
"links": [],
"modified": "2021-10-06 11:48:59.616562",
"modified": "2022-12-24 21:01:14.882747",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Reconciliation Allocation",
@@ -141,5 +156,6 @@
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -11,7 +11,8 @@
"col_break1",
"amount",
"outstanding_amount",
"currency"
"currency",
"exchange_rate"
],
"fields": [
{
@@ -62,11 +63,17 @@
"hidden": 1,
"label": "Currency",
"options": "Currency"
},
{
"fieldname": "exchange_rate",
"fieldtype": "Float",
"hidden": 1,
"label": "Exchange Rate"
}
],
"istable": 1,
"links": [],
"modified": "2021-08-24 22:42:40.923179",
"modified": "2022-11-08 18:18:02.502149",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Reconciliation Invoice",
@@ -75,5 +82,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -15,7 +15,8 @@
"difference_amount",
"sec_break1",
"remark",
"currency"
"currency",
"exchange_rate"
],
"fields": [
{
@@ -91,11 +92,17 @@
"label": "Difference Amount",
"options": "currency",
"read_only": 1
},
{
"fieldname": "exchange_rate",
"fieldtype": "Float",
"hidden": 1,
"label": "Exchange Rate"
}
],
"istable": 1,
"links": [],
"modified": "2021-08-30 10:51:48.140062",
"modified": "2022-11-08 18:18:36.268760",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Reconciliation Payment",
@@ -103,5 +110,6 @@
"permissions": [],
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC"
"sort_order": "DESC",
"states": []
}

View File

@@ -42,7 +42,7 @@ frappe.ui.form.on("Payment Request", "refresh", function(frm) {
});
}
if(!frm.doc.payment_gateway_account && frm.doc.status == "Initiated") {
if((!frm.doc.payment_gateway_account || frm.doc.payment_request_type == "Outward") && frm.doc.status == "Initiated") {
frm.add_custom_button(__('Create Payment Entry'), function(){
frappe.call({
method: "erpnext.accounts.doctype.payment_request.payment_request.make_payment_entry",

View File

@@ -32,6 +32,10 @@
"iban",
"branch_code",
"swift_number",
"accounting_dimensions_section",
"cost_center",
"dimension_col_break",
"project",
"recipient_and_message",
"print_format",
"email_to",
@@ -362,13 +366,35 @@
"label": "Payment Channel",
"options": "\nEmail\nPhone",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "accounting_dimensions_section",
"fieldtype": "Section Break",
"label": "Accounting Dimensions"
},
{
"fieldname": "cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
},
{
"fieldname": "dimension_col_break",
"fieldtype": "Column Break"
},
{
"fieldname": "project",
"fieldtype": "Link",
"label": "Project",
"options": "Project"
}
],
"in_create": 1,
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-09-30 16:19:43.680025",
"modified": "2022-12-21 16:56:40.115737",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",

View File

@@ -9,8 +9,10 @@ from frappe import _
from frappe.model.document import Document
from frappe.utils import flt, get_url, nowdate
from frappe.utils.background_jobs import enqueue
from payments.utils import get_payment_gateway_controller
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
from erpnext.accounts.doctype.payment_entry.payment_entry import (
get_company_defaults,
get_payment_entry,
@@ -19,6 +21,14 @@ from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_pla
from erpnext.accounts.party import get_party_account, get_party_bank_account
from erpnext.accounts.utils import get_account_currency
from erpnext.erpnext_integrations.stripe_integration import create_stripe_subscription
from erpnext.utilities import payment_app_import_guard
def _get_payment_gateway_controller(*args, **kwargs):
with payment_app_import_guard():
from payments.utils import get_payment_gateway_controller
return get_payment_gateway_controller(*args, **kwargs)
class PaymentRequest(Document):
@@ -35,21 +45,20 @@ class PaymentRequest(Document):
frappe.throw(_("To create a Payment Request reference document is required"))
def validate_payment_request_amount(self):
existing_payment_request_amount = get_existing_payment_request_amount(
self.reference_doctype, self.reference_name
existing_payment_request_amount = flt(
get_existing_payment_request_amount(self.reference_doctype, self.reference_name)
)
if existing_payment_request_amount:
ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
if hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") != "Shopping Cart":
ref_amount = get_amount(ref_doc, self.payment_account)
ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
if not hasattr(ref_doc, "order_type") or getattr(ref_doc, "order_type") != "Shopping Cart":
ref_amount = get_amount(ref_doc, self.payment_account)
if existing_payment_request_amount + flt(self.grand_total) > ref_amount:
frappe.throw(
_("Total Payment Request amount cannot be greater than {0} amount").format(
self.reference_doctype
)
if existing_payment_request_amount + flt(self.grand_total) > ref_amount:
frappe.throw(
_("Total Payment Request amount cannot be greater than {0} amount").format(
self.reference_doctype
)
)
def validate_currency(self):
ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
@@ -107,7 +116,7 @@ class PaymentRequest(Document):
self.request_phone_payment()
def request_phone_payment(self):
controller = get_payment_gateway_controller(self.payment_gateway)
controller = _get_payment_gateway_controller(self.payment_gateway)
request_amount = self.get_request_amount()
payment_record = dict(
@@ -156,7 +165,7 @@ class PaymentRequest(Document):
def payment_gateway_validation(self):
try:
controller = get_payment_gateway_controller(self.payment_gateway)
controller = _get_payment_gateway_controller(self.payment_gateway)
if hasattr(controller, "on_payment_request_submission"):
return controller.on_payment_request_submission(self)
else:
@@ -189,7 +198,7 @@ class PaymentRequest(Document):
)
data.update({"company": frappe.defaults.get_defaults().company})
controller = get_payment_gateway_controller(self.payment_gateway)
controller = _get_payment_gateway_controller(self.payment_gateway)
controller.validate_transaction_currency(self.currency)
if hasattr(controller, "validate_minimum_transaction_amount"):
@@ -254,6 +263,7 @@ class PaymentRequest(Document):
payment_entry.update(
{
"mode_of_payment": self.mode_of_payment,
"reference_no": self.name,
"reference_date": nowdate(),
"remarks": "Payment Entry against {0} {1} via Payment Request {2}".format(
@@ -262,6 +272,17 @@ class PaymentRequest(Document):
}
)
# Update dimensions
payment_entry.update(
{
"cost_center": self.get("cost_center"),
"project": self.get("project"),
}
)
for dimension in get_accounting_dimensions():
payment_entry.update({dimension: self.get(dimension)})
if payment_entry.difference_amount:
company_details = get_company_defaults(ref_doc.company)
@@ -403,25 +424,22 @@ def make_payment_request(**args):
else ""
)
existing_payment_request = None
if args.order_type == "Shopping Cart":
existing_payment_request = frappe.db.get_value(
"Payment Request",
{"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2)},
)
draft_payment_request = frappe.db.get_value(
"Payment Request",
{"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": 0},
)
if existing_payment_request:
existing_payment_request_amount = get_existing_payment_request_amount(args.dt, args.dn)
if existing_payment_request_amount:
grand_total -= existing_payment_request_amount
if draft_payment_request:
frappe.db.set_value(
"Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False
"Payment Request", draft_payment_request, "grand_total", grand_total, update_modified=False
)
pr = frappe.get_doc("Payment Request", existing_payment_request)
pr = frappe.get_doc("Payment Request", draft_payment_request)
else:
if args.order_type != "Shopping Cart":
existing_payment_request_amount = get_existing_payment_request_amount(args.dt, args.dn)
if existing_payment_request_amount:
grand_total -= existing_payment_request_amount
pr = frappe.new_doc("Payment Request")
pr.update(
{
@@ -444,6 +462,17 @@ def make_payment_request(**args):
}
)
# Update dimensions
pr.update(
{
"cost_center": ref_doc.get("cost_center"),
"project": ref_doc.get("project"),
}
)
for dimension in get_accounting_dimensions():
pr.update({dimension: ref_doc.get(dimension)})
if args.order_type == "Shopping Cart" or args.mute_email:
pr.flags.mute_email = True
@@ -466,26 +495,28 @@ def get_amount(ref_doc, payment_account=None):
"""get amount based on doctype"""
dt = ref_doc.doctype
if dt in ["Sales Order", "Purchase Order"]:
grand_total = flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
grand_total = flt(ref_doc.rounded_total) or flt(ref_doc.grand_total)
elif dt in ["Sales Invoice", "Purchase Invoice"]:
if ref_doc.party_account_currency == ref_doc.currency:
grand_total = flt(ref_doc.outstanding_amount)
else:
grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate
if not ref_doc.get("is_pos"):
if ref_doc.party_account_currency == ref_doc.currency:
grand_total = flt(ref_doc.outstanding_amount)
else:
grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate
elif dt == "Sales Invoice":
for pay in ref_doc.payments:
if pay.type == "Phone" and pay.account == payment_account:
grand_total = pay.amount
break
elif dt == "POS Invoice":
for pay in ref_doc.payments:
if pay.type == "Phone" and pay.account == payment_account:
grand_total = pay.amount
break
elif dt == "Fees":
grand_total = ref_doc.outstanding_amount
if grand_total > 0:
return grand_total
else:
frappe.throw(_("Payment Entry is already created"))

View File

@@ -6,6 +6,7 @@ import unittest
import frappe
from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
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.selling.doctype.sales_order.test_sales_order import make_sales_order
from erpnext.setup.utils import get_exchange_rate
@@ -45,7 +46,10 @@ class TestPaymentRequest(unittest.TestCase):
frappe.get_doc(method).insert(ignore_permissions=True)
def test_payment_request_linkings(self):
so_inr = make_sales_order(currency="INR")
so_inr = make_sales_order(currency="INR", do_not_save=True)
so_inr.disable_rounded_total = 1
so_inr.save()
pr = make_payment_request(
dt="Sales Order",
dn=so_inr.name,
@@ -71,6 +75,29 @@ class TestPaymentRequest(unittest.TestCase):
self.assertEqual(pr.reference_name, si_usd.name)
self.assertEqual(pr.currency, "USD")
def test_payment_entry_against_purchase_invoice(self):
si_usd = make_purchase_invoice(
customer="_Test Supplier USD",
debit_to="_Test Payable USD - _TC",
currency="USD",
conversion_rate=50,
)
pr = make_payment_request(
dt="Purchase Invoice",
dn=si_usd.name,
recipient_id="user@example.com",
mute_email=1,
payment_gateway_account="_Test Gateway - USD",
submit_doc=1,
return_doc=1,
)
pe = pr.create_payment_entry()
pr.load_from_db()
self.assertEqual(pr.status, "Paid")
def test_payment_entry(self):
frappe.db.set_value(
"Company", "_Test Company", "exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC"

View File

@@ -5,7 +5,7 @@
import unittest
import frappe
from frappe.utils import today
from frappe.utils import add_months, today
from erpnext.accounts.doctype.finance_book.test_finance_book import create_finance_book
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
@@ -176,6 +176,23 @@ class TestPeriodClosingVoucher(unittest.TestCase):
)
self.assertSequenceEqual(pcv_gle, expected_gle)
warehouse = frappe.db.get_value("Warehouse", {"company": company}, "name")
repost_doc = frappe.get_doc(
{
"doctype": "Repost Item Valuation",
"company": company,
"posting_date": "2020-03-15",
"based_on": "Item and Warehouse",
"item_code": "Test Item 1",
"warehouse": warehouse,
}
)
self.assertRaises(frappe.ValidationError, repost_doc.save)
repost_doc.posting_date = add_months(today(), 13)
repost_doc.save()
def make_period_closing_voucher(self, submit=True):
surplus_account = create_account()

View File

@@ -21,8 +21,24 @@ class POSClosingEntry(StatusUpdater):
if frappe.db.get_value("POS Opening Entry", self.pos_opening_entry, "status") != "Open":
frappe.throw(_("Selected POS Opening Entry should be open."), title=_("Invalid Opening Entry"))
self.validate_duplicate_pos_invoices()
self.validate_pos_invoices()
def validate_duplicate_pos_invoices(self):
pos_occurences = {}
for idx, inv in enumerate(self.pos_transactions, 1):
pos_occurences.setdefault(inv.pos_invoice, []).append(idx)
error_list = []
for key, value in pos_occurences.items():
if len(value) > 1:
error_list.append(
_("{} is added multiple times on rows: {}".format(frappe.bold(key), frappe.bold(value)))
)
if error_list:
frappe.throw(error_list, title=_("Duplicate POS Invoices found"), as_list=True)
def validate_pos_invoices(self):
invalid_rows = []
for d in self.pos_transactions:

View File

@@ -5,6 +5,8 @@
frappe.provide("erpnext.accounts");
erpnext.selling.POSInvoiceController = class POSInvoiceController extends erpnext.selling.SellingController {
settings = {};
setup(doc) {
this.setup_posting_date_time_check();
super.setup(doc);
@@ -12,21 +14,37 @@ erpnext.selling.POSInvoiceController = class POSInvoiceController extends erpnex
company() {
erpnext.accounts.dimensions.update_dimension(this.frm, this.frm.doctype);
this.frm.set_value("set_warehouse", "");
this.frm.set_value("taxes_and_charges", "");
}
onload(doc) {
super.onload();
this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice Merge Log', 'POS Closing Entry'];
if(doc.__islocal && doc.is_pos && frappe.get_route_str() !== 'point-of-sale') {
this.frm.script_manager.trigger("is_pos");
this.frm.refresh_fields();
}
this.frm.set_query("set_warehouse", function(doc) {
return {
filters: {
company: doc.company ? doc.company : '',
}
}
});
erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype);
}
onload_post_render(frm) {
this.pos_profile(frm);
}
refresh(doc) {
super.refresh();
if (doc.docstatus == 1 && !doc.is_return) {
this.frm.add_custom_button(__('Return'), this.make_sales_return, __('Create'));
this.frm.page.set_inner_btn_group_as_primary(__('Create'));
@@ -36,6 +54,18 @@ erpnext.selling.POSInvoiceController = class POSInvoiceController extends erpnex
this.frm.return_print_format = "Sales Invoice Return";
this.frm.set_value('consolidated_invoice', '');
}
this.frm.set_query("customer", (function () {
const customer_groups = this.settings?.customer_groups;
if (!customer_groups?.length) return {};
return {
filters: {
customer_group: ["in", customer_groups],
}
}
}).bind(this));
}
is_pos() {
@@ -82,12 +112,32 @@ erpnext.selling.POSInvoiceController = class POSInvoiceController extends erpnex
party_type: "Customer",
account: this.frm.doc.debit_to,
price_list: this.frm.doc.selling_price_list,
pos_profile: pos_profile
pos_profile: pos_profile,
company_address: this.frm.doc.company_address
}, () => {
this.apply_pricing_rule();
});
}
pos_profile(frm) {
if (!frm.pos_profile || frm.pos_profile == '') {
this.update_customer_groups_settings([]);
return;
}
frappe.call({
method: "erpnext.selling.page.point_of_sale.point_of_sale.get_pos_profile_data",
args: { "pos_profile": frm.pos_profile },
callback: ({ message: profile }) => {
this.update_customer_groups_settings(profile?.customer_groups);
},
});
}
update_customer_groups_settings(customer_groups) {
this.settings.customer_groups = customer_groups?.map((group) => group.name)
}
amount(){
this.write_off_outstanding_amount_automatically()
}

View File

@@ -161,7 +161,7 @@ class POSInvoice(SalesInvoice):
bold_item_name = frappe.bold(item.item_name)
bold_extra_batch_qty_needed = frappe.bold(
abs(available_batch_qty - reserved_batch_qty - item.qty)
abs(available_batch_qty - reserved_batch_qty - item.stock_qty)
)
bold_invalid_batch_no = frappe.bold(item.batch_no)
@@ -172,7 +172,7 @@ class POSInvoice(SalesInvoice):
).format(item.idx, bold_invalid_batch_no, bold_item_name),
title=_("Item Unavailable"),
)
elif (available_batch_qty - reserved_batch_qty - item.qty) < 0:
elif (available_batch_qty - reserved_batch_qty - item.stock_qty) < 0:
frappe.throw(
_(
"Row #{}: Batch No. {} of item {} has less than required stock available, {} more required"
@@ -246,7 +246,7 @@ class POSInvoice(SalesInvoice):
),
title=_("Item Unavailable"),
)
elif is_stock_item and flt(available_stock) < flt(d.qty):
elif is_stock_item and flt(available_stock) < flt(d.stock_qty):
frappe.throw(
_(
"Row #{}: Stock quantity not enough for Item Code: {} under warehouse {}. Available quantity {}."
@@ -650,7 +650,7 @@ def get_bundle_availability(bundle_item_code, warehouse):
item_pos_reserved_qty = get_pos_reserved_qty(item.item_code, warehouse)
available_qty = item_bin_qty - item_pos_reserved_qty
max_available_bundles = available_qty / item.qty
max_available_bundles = available_qty / item.stock_qty
if bundle_bin_qty > max_available_bundles and frappe.get_value(
"Item", item.item_code, "is_stock_item"
):
@@ -674,7 +674,7 @@ def get_bin_qty(item_code, warehouse):
def get_pos_reserved_qty(item_code, warehouse):
reserved_qty = frappe.db.sql(
"""select sum(p_item.qty) as qty
"""select sum(p_item.stock_qty) as qty
from `tabPOS Invoice` p, `tabPOS Invoice Item` p_item
where p.name = p_item.parent
and ifnull(p.consolidated_invoice, '') = ''

View File

@@ -18,6 +18,22 @@ class POSInvoiceMergeLog(Document):
def validate(self):
self.validate_customer()
self.validate_pos_invoice_status()
self.validate_duplicate_pos_invoices()
def validate_duplicate_pos_invoices(self):
pos_occurences = {}
for idx, inv in enumerate(self.pos_invoices, 1):
pos_occurences.setdefault(inv.pos_invoice, []).append(idx)
error_list = []
for key, value in pos_occurences.items():
if len(value) > 1:
error_list.append(
_("{} is added multiple times on rows: {}".format(frappe.bold(key), frappe.bold(value)))
)
if error_list:
frappe.throw(error_list, title=_("Duplicate POS Invoices found"), as_list=True)
def validate_customer(self):
if self.merge_invoices_based_on == "Customer Group":
@@ -426,6 +442,8 @@ def create_merge_logs(invoice_by_customer, closing_entry=None):
if closing_entry:
closing_entry.set_status(update=True, status="Failed")
if type(error_message) == list:
error_message = frappe.json.dumps(error_message)
closing_entry.db_set("error_message", error_message)
raise

View File

@@ -472,7 +472,7 @@
"description": "If rate is zero them item will be treated as \"Free Item\"",
"fieldname": "free_item_rate",
"fieldtype": "Currency",
"label": "Rate"
"label": "Free Item Rate"
},
{
"collapsible": 1,
@@ -608,7 +608,7 @@
"icon": "fa fa-gift",
"idx": 1,
"links": [],
"modified": "2022-10-13 19:05:35.056304",
"modified": "2023-02-14 04:53:34.887358",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Pricing Rule",

View File

@@ -256,7 +256,7 @@ def apply_pricing_rule(args, doc=None):
for item in item_list:
args_copy = copy.deepcopy(args)
args_copy.update(item)
data = get_pricing_rule_for_item(args_copy, item.get("price_list_rate"), doc=doc)
data = get_pricing_rule_for_item(args_copy, doc=doc)
out.append(data)
if (
@@ -293,7 +293,7 @@ def update_pricing_rule_uom(pricing_rule, args):
pricing_rule.uom = row.uom
def get_pricing_rule_for_item(args, price_list_rate=0, doc=None, for_validate=False):
def get_pricing_rule_for_item(args, doc=None, for_validate=False):
from erpnext.accounts.doctype.pricing_rule.utils import (
get_applied_pricing_rules,
get_pricing_rule_items,

View File

@@ -997,7 +997,7 @@ def make_pricing_rule(**args):
"apply_on": args.apply_on or "Item Code",
"applicable_for": args.applicable_for,
"selling": args.selling or 0,
"currency": "USD",
"currency": "INR",
"apply_discount_on_rate": args.apply_discount_on_rate or 0,
"buying": args.buying or 0,
"min_qty": args.min_qty or 0.0,

View File

@@ -244,6 +244,22 @@ def get_other_conditions(conditions, values, args):
and ifnull(`tabPricing Rule`.valid_upto, '2500-12-31')"""
values["transaction_date"] = args.get("transaction_date")
if args.get("doctype") in [
"Quotation",
"Quotation Item",
"Sales Order",
"Sales Order Item",
"Delivery Note",
"Delivery Note Item",
"Sales Invoice",
"Sales Invoice Item",
"POS Invoice",
"POS Invoice Item",
]:
conditions += """ and ifnull(`tabPricing Rule`.selling, 0) = 1"""
else:
conditions += """ and ifnull(`tabPricing Rule`.buying, 0) = 1"""
return conditions
@@ -663,13 +679,23 @@ def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None):
item_details.free_item_data.append(free_item_data_args)
def apply_pricing_rule_for_free_items(doc, pricing_rule_args, set_missing_values=False):
def apply_pricing_rule_for_free_items(doc, pricing_rule_args):
if pricing_rule_args:
items = tuple((d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item)
args = {(d["item_code"], d["pricing_rules"]): d for d in pricing_rule_args}
for args in pricing_rule_args:
if not items or (args.get("item_code"), args.get("pricing_rules")) not in items:
doc.append("items", args)
for item in doc.items:
if not item.is_free_item:
continue
free_item_data = args.get((item.item_code, item.pricing_rules))
if free_item_data:
free_item_data.pop("item_name")
free_item_data.pop("description")
item.update(free_item_data)
args.pop((item.item_code, item.pricing_rules))
for free_item in args.values():
doc.append("items", free_item)
def get_pricing_rule_items(pr_doc, other_items=False) -> list:

View File

@@ -0,0 +1,130 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on("Process Payment Reconciliation", {
onload: function(frm) {
// set queries
frm.set_query("party_type", function() {
return {
"filters": {
"name": ["in", Object.keys(frappe.boot.party_account_types)],
}
}
});
frm.set_query('receivable_payable_account', function(doc) {
return {
filters: {
"company": doc.company,
"is_group": 0,
"account_type": frappe.boot.party_account_types[doc.party_type]
}
};
});
frm.set_query('cost_center', function(doc) {
return {
filters: {
"company": doc.company,
"is_group": 0,
}
};
});
frm.set_query('bank_cash_account', function(doc) {
return {
filters:[
['Account', 'company', '=', doc.company],
['Account', 'is_group', '=', 0],
['Account', 'account_type', 'in', ['Bank', 'Cash']]
]
};
});
},
refresh: function(frm) {
if (frm.doc.docstatus==1 && ['Queued', 'Paused'].find(x => x == frm.doc.status)) {
let execute_btn = __("Start / Resume")
frm.add_custom_button(execute_btn, () => {
frm.call({
method: 'erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.trigger_job_for_doc',
args: {
docname: frm.doc.name
}
}).then(r => {
if(!r.exc) {
frappe.show_alert(__("Job Started"));
frm.reload_doc();
}
});
});
}
if (frm.doc.docstatus==1 && ['Completed', 'Running', 'Paused', 'Partially Reconciled'].find(x => x == frm.doc.status)) {
frm.call({
'method': "erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.get_reconciled_count",
args: {
"docname": frm.docname,
}
}).then(r => {
if (r.message) {
let progress = 0;
let description = "";
if (r.message.processed) {
progress = (r.message.processed/r.message.total) * 100;
description = r.message.processed + "/" + r.message.total + " processed";
} else if (r.message.total == 0 && frm.doc.status == "Completed") {
progress = 100;
}
frm.dashboard.add_progress('Reconciliation Progress', progress, description);
}
})
}
if (frm.doc.docstatus==1 && frm.doc.status == 'Running') {
let execute_btn = __("Pause")
frm.add_custom_button(execute_btn, () => {
frm.call({
'method': "erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.pause_job_for_doc",
args: {
"docname": frm.docname,
}
}).then(r => {
if (!r.exc) {
frappe.show_alert(__("Job Paused"));
frm.reload_doc()
}
});
});
}
},
company(frm) {
frm.set_value('party', '');
frm.set_value('receivable_payable_account', '');
},
party_type(frm) {
frm.set_value('party', '');
},
party(frm) {
frm.set_value('receivable_payable_account', '');
if (!frm.doc.receivable_payable_account && frm.doc.party_type && frm.doc.party) {
return frappe.call({
method: "erpnext.accounts.party.get_party_account",
args: {
company: frm.doc.company,
party_type: frm.doc.party_type,
party: frm.doc.party
},
callback: (r) => {
if (!r.exc && r.message) {
frm.set_value("receivable_payable_account", r.message);
}
frm.refresh();
}
});
}
}
});

View File

@@ -0,0 +1,173 @@
{
"actions": [],
"autoname": "format:ACC-PPR-{#####}",
"beta": 1,
"creation": "2023-03-30 21:28:39.793927",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"company",
"party_type",
"column_break_io6c",
"party",
"receivable_payable_account",
"filter_section",
"from_invoice_date",
"to_invoice_date",
"column_break_kegk",
"from_payment_date",
"to_payment_date",
"column_break_uj04",
"cost_center",
"bank_cash_account",
"section_break_2n02",
"status",
"error_log",
"section_break_a8yx",
"amended_from"
],
"fields": [
{
"allow_on_submit": 1,
"fieldname": "status",
"fieldtype": "Select",
"label": "Status",
"options": "\nQueued\nRunning\nPaused\nCompleted\nPartially Reconciled\nFailed\nCancelled",
"read_only": 1
},
{
"fieldname": "company",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Company",
"options": "Company",
"reqd": 1
},
{
"fieldname": "party_type",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Party Type",
"options": "DocType",
"reqd": 1
},
{
"fieldname": "column_break_io6c",
"fieldtype": "Column Break"
},
{
"fieldname": "party",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Party",
"options": "party_type",
"reqd": 1
},
{
"fieldname": "receivable_payable_account",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Receivable/Payable Account",
"options": "Account",
"reqd": 1
},
{
"fieldname": "filter_section",
"fieldtype": "Section Break",
"label": "Filters"
},
{
"fieldname": "from_invoice_date",
"fieldtype": "Date",
"label": "From Invoice Date"
},
{
"fieldname": "to_invoice_date",
"fieldtype": "Date",
"label": "To Invoice Date"
},
{
"fieldname": "column_break_kegk",
"fieldtype": "Column Break"
},
{
"fieldname": "from_payment_date",
"fieldtype": "Date",
"label": "From Payment Date"
},
{
"fieldname": "to_payment_date",
"fieldtype": "Date",
"label": "To Payment Date"
},
{
"fieldname": "column_break_uj04",
"fieldtype": "Column Break"
},
{
"fieldname": "cost_center",
"fieldtype": "Link",
"label": "Cost Center",
"options": "Cost Center"
},
{
"fieldname": "bank_cash_account",
"fieldtype": "Link",
"label": "Bank/Cash Account",
"options": "Account"
},
{
"fieldname": "section_break_2n02",
"fieldtype": "Section Break",
"label": "Status"
},
{
"depends_on": "eval:doc.error_log",
"fieldname": "error_log",
"fieldtype": "Long Text",
"label": "Error Log"
},
{
"fieldname": "amended_from",
"fieldtype": "Link",
"label": "Amended From",
"no_copy": 1,
"options": "Process Payment Reconciliation",
"print_hide": 1,
"read_only": 1
},
{
"fieldname": "section_break_a8yx",
"fieldtype": "Section Break"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-04-21 17:19:30.912953",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Payment Reconciliation",
"naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
}
],
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"title_field": "company"
}

View File

@@ -0,0 +1,503 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _, qb
from frappe.model.document import Document
from frappe.utils import get_link_to_form
from frappe.utils.scheduler import is_scheduler_inactive
class ProcessPaymentReconciliation(Document):
def validate(self):
self.validate_receivable_payable_account()
self.validate_bank_cash_account()
def validate_receivable_payable_account(self):
if self.receivable_payable_account:
if self.company != frappe.db.get_value("Account", self.receivable_payable_account, "company"):
frappe.throw(
_("Receivable/Payable Account: {0} doesn't belong to company {1}").format(
frappe.bold(self.receivable_payable_account), frappe.bold(self.company)
)
)
def validate_bank_cash_account(self):
if self.bank_cash_account:
if self.company != frappe.db.get_value("Account", self.bank_cash_account, "company"):
frappe.throw(
_("Bank/Cash Account {0} doesn't belong to company {1}").format(
frappe.bold(self.bank_cash_account), frappe.bold(self.company)
)
)
def before_save(self):
self.status = ""
self.error_log = ""
def on_submit(self):
self.db_set("status", "Queued")
self.db_set("error_log", None)
def on_cancel(self):
self.db_set("status", "Cancelled")
log = frappe.db.get_value(
"Process Payment Reconciliation Log", filters={"process_pr": self.name}
)
if log:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Cancelled")
@frappe.whitelist()
def get_reconciled_count(docname: str | None = None) -> float:
current_status = {}
if docname:
reconcile_log = frappe.db.get_value(
"Process Payment Reconciliation Log", filters={"process_pr": docname}, fieldname="name"
)
if reconcile_log:
res = frappe.get_all(
"Process Payment Reconciliation Log",
filters={"name": reconcile_log},
fields=["reconciled_entries", "total_allocations"],
as_list=1,
)
current_status["processed"], current_status["total"] = res[0]
return current_status
def get_pr_instance(doc: str):
process_payment_reconciliation = frappe.get_doc("Process Payment Reconciliation", doc)
pr = frappe.get_doc("Payment Reconciliation")
fields = [
"company",
"party_type",
"party",
"receivable_payable_account",
"from_invoice_date",
"to_invoice_date",
"from_payment_date",
"to_payment_date",
]
d = {}
for field in fields:
d[field] = process_payment_reconciliation.get(field)
pr.update(d)
pr.invoice_limit = 1000
pr.payment_limit = 1000
return pr
def is_job_running(job_name: str) -> bool:
jobs = frappe.db.get_all("RQ Job", filters={"status": ["in", ["started", "queued"]]})
for x in jobs:
if x.job_name == job_name:
return True
return False
@frappe.whitelist()
def pause_job_for_doc(docname: str | None = None):
if docname:
frappe.db.set_value("Process Payment Reconciliation", docname, "status", "Paused")
log = frappe.db.get_value("Process Payment Reconciliation Log", filters={"process_pr": docname})
if log:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Paused")
@frappe.whitelist()
def trigger_job_for_doc(docname: str | None = None):
"""
Trigger background job
"""
if not docname:
return
if not frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments"):
frappe.throw(
_("Auto Reconciliation of Payments has been disabled. Enable it through {0}").format(
get_link_to_form("Accounts Settings", "Accounts Settings")
)
)
return
if not is_scheduler_inactive():
if frappe.db.get_value("Process Payment Reconciliation", docname, "status") == "Queued":
frappe.db.set_value("Process Payment Reconciliation", docname, "status", "Running")
job_name = f"start_processing_{docname}"
if not is_job_running(job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.reconcile_based_on_filters",
queue="long",
is_async=True,
job_name=job_name,
enqueue_after_commit=True,
doc=docname,
)
elif frappe.db.get_value("Process Payment Reconciliation", docname, "status") == "Paused":
frappe.db.set_value("Process Payment Reconciliation", docname, "status", "Running")
log = frappe.db.get_value("Process Payment Reconciliation Log", filters={"process_pr": docname})
if log:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Running")
# Resume tasks for running doc
job_name = f"start_processing_{docname}"
if not is_job_running(job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.reconcile_based_on_filters",
queue="long",
is_async=True,
job_name=job_name,
doc=docname,
)
else:
frappe.msgprint(_("Scheduler is Inactive. Can't trigger job now."))
def trigger_reconciliation_for_queued_docs():
"""
Will be called from Cron Job
Fetch queued docs and start reconciliation process for each one
"""
if not frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments"):
frappe.msgprint(
_("Auto Reconciliation of Payments has been disabled. Enable it through {0}").format(
get_link_to_form("Accounts Settings", "Accounts Settings")
)
)
return
if not is_scheduler_inactive():
# Get all queued documents
all_queued = frappe.db.get_all(
"Process Payment Reconciliation",
filters={"docstatus": 1, "status": "Queued"},
order_by="creation desc",
as_list=1,
)
docs_to_trigger = []
unique_filters = set()
queue_size = 5
fields = ["company", "party_type", "party", "receivable_payable_account"]
def get_filters_as_tuple(fields, doc):
filters = ()
for x in fields:
filters += tuple(doc.get(x))
return filters
for x in all_queued:
doc = frappe.get_doc("Process Payment Reconciliation", x)
filters = get_filters_as_tuple(fields, doc)
if filters not in unique_filters:
unique_filters.add(filters)
docs_to_trigger.append(doc.name)
if len(docs_to_trigger) == queue_size:
break
# trigger reconcilation process for queue_size unique filters
for doc in docs_to_trigger:
trigger_job_for_doc(doc)
else:
frappe.msgprint(_("Scheduler is Inactive. Can't trigger jobs now."))
def reconcile_based_on_filters(doc: None | str = None) -> None:
"""
Identify current state of document and execute next tasks in background
"""
if doc:
log = frappe.db.get_value("Process Payment Reconciliation Log", filters={"process_pr": doc})
if not log:
log = frappe.new_doc("Process Payment Reconciliation Log")
log.process_pr = doc
log.status = "Running"
log = log.save()
job_name = f"process_{doc}_fetch_and_allocate"
if not is_job_running(job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.fetch_and_allocate",
queue="long",
timeout="3600",
is_async=True,
job_name=job_name,
enqueue_after_commit=True,
doc=doc,
)
else:
res = frappe.get_all(
"Process Payment Reconciliation Log",
filters={"name": log},
fields=["allocated", "reconciled"],
as_list=1,
)
allocated, reconciled = res[0]
if not allocated:
job_name = f"process__{doc}_fetch_and_allocate"
if not is_job_running(job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.fetch_and_allocate",
queue="long",
timeout="3600",
is_async=True,
job_name=job_name,
enqueue_after_commit=True,
doc=doc,
)
elif not reconciled:
allocation = get_next_allocation(log)
if allocation:
reconcile_job_name = (
f"process_{doc}_reconcile_allocation_{allocation[0].idx}_{allocation[-1].idx}"
)
else:
reconcile_job_name = f"process_{doc}_reconcile"
if not is_job_running(reconcile_job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.reconcile",
queue="long",
timeout="3600",
is_async=True,
job_name=reconcile_job_name,
enqueue_after_commit=True,
doc=doc,
)
elif reconciled:
frappe.db.set_value("Process Payment Reconciliation", doc, "status", "Completed")
def get_next_allocation(log: str) -> list:
if log:
allocations = []
next = frappe.db.get_all(
"Process Payment Reconciliation Log Allocations",
filters={"parent": log, "reconciled": 0},
fields=["reference_type", "reference_name"],
order_by="idx",
limit=1,
)
if next:
allocations = frappe.db.get_all(
"Process Payment Reconciliation Log Allocations",
filters={
"parent": log,
"reconciled": 0,
"reference_type": next[0].reference_type,
"reference_name": next[0].reference_name,
},
fields=["*"],
order_by="idx",
)
return allocations
return []
def fetch_and_allocate(doc: str) -> None:
"""
Fetch Invoices and Payments based on filters applied. FIFO ordering is used for allocation.
"""
if doc:
log = frappe.db.get_value("Process Payment Reconciliation Log", filters={"process_pr": doc})
if log:
if not frappe.db.get_value("Process Payment Reconciliation Log", log, "allocated"):
reconcile_log = frappe.get_doc("Process Payment Reconciliation Log", log)
pr = get_pr_instance(doc)
pr.get_unreconciled_entries()
if len(pr.invoices) > 0 and len(pr.payments) > 0:
invoices = [x.as_dict() for x in pr.invoices]
payments = [x.as_dict() for x in pr.payments]
pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments}))
for x in pr.get("allocation"):
reconcile_log.append(
"allocations",
x.as_dict().update(
{
"parenttype": "Process Payment Reconciliation Log",
"parent": reconcile_log.name,
"name": None,
"reconciled": False,
}
),
)
reconcile_log.allocated = True
reconcile_log.total_allocations = len(reconcile_log.get("allocations"))
reconcile_log.reconciled_entries = 0
reconcile_log.save()
# generate reconcile job name
allocation = get_next_allocation(log)
if allocation:
reconcile_job_name = (
f"process_{doc}_reconcile_allocation_{allocation[0].idx}_{allocation[-1].idx}"
)
else:
reconcile_job_name = f"process_{doc}_reconcile"
if not is_job_running(reconcile_job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.reconcile",
queue="long",
timeout="3600",
is_async=True,
job_name=reconcile_job_name,
enqueue_after_commit=True,
doc=doc,
)
def reconcile(doc: None | str = None) -> None:
if doc:
log = frappe.db.get_value("Process Payment Reconciliation Log", filters={"process_pr": doc})
if log:
res = frappe.get_all(
"Process Payment Reconciliation Log",
filters={"name": log},
fields=["reconciled_entries", "total_allocations"],
as_list=1,
limit=1,
)
reconciled_entries, total_allocations = res[0]
if reconciled_entries != total_allocations:
try:
# Fetch next allocation
allocations = get_next_allocation(log)
pr = get_pr_instance(doc)
# pass allocation to PR instance
for x in allocations:
pr.append("allocation", x)
# reconcile
pr.reconcile_allocations(skip_ref_details_update_for_pe=True)
# If Payment Entry, update details only for newly linked references
# This is for performance
if allocations[0].reference_type == "Payment Entry":
references = [(x.invoice_type, x.invoice_number) for x in allocations]
pe = frappe.get_doc(allocations[0].reference_type, allocations[0].reference_name)
pe.flags.ignore_validate_update_after_submit = True
pe.set_missing_ref_details(update_ref_details_only_for=references)
pe.save()
# Update reconciled flag
allocation_names = [x.name for x in allocations]
ppa = qb.DocType("Process Payment Reconciliation Log Allocations")
qb.update(ppa).set(ppa.reconciled, True).where(ppa.name.isin(allocation_names)).run()
# Update reconciled count
reconciled_count = frappe.db.count(
"Process Payment Reconciliation Log Allocations", filters={"parent": log, "reconciled": True}
)
frappe.db.set_value(
"Process Payment Reconciliation Log", log, "reconciled_entries", reconciled_count
)
except Exception as err:
# Update the parent doc about the exception
frappe.db.rollback()
traceback = frappe.get_traceback()
if traceback:
message = "Traceback: <br>" + traceback
frappe.db.set_value("Process Payment Reconciliation Log", log, "error_log", message)
frappe.db.set_value(
"Process Payment Reconciliation",
doc,
"error_log",
message,
)
if reconciled_entries and total_allocations and reconciled_entries < total_allocations:
frappe.db.set_value(
"Process Payment Reconciliation Log", log, "status", "Partially Reconciled"
)
frappe.db.set_value(
"Process Payment Reconciliation",
doc,
"status",
"Partially Reconciled",
)
else:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Failed")
frappe.db.set_value(
"Process Payment Reconciliation",
doc,
"status",
"Failed",
)
finally:
if reconciled_entries == total_allocations:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Reconciled")
frappe.db.set_value("Process Payment Reconciliation Log", log, "reconciled", True)
frappe.db.set_value("Process Payment Reconciliation", doc, "status", "Completed")
else:
if not (frappe.db.get_value("Process Payment Reconciliation", doc, "status") == "Paused"):
# trigger next batch in job
# generate reconcile job name
allocation = get_next_allocation(log)
if allocation:
reconcile_job_name = (
f"process_{doc}_reconcile_allocation_{allocation[0].idx}_{allocation[-1].idx}"
)
else:
reconcile_job_name = f"process_{doc}_reconcile"
if not is_job_running(reconcile_job_name):
job = frappe.enqueue(
method="erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.reconcile",
queue="long",
timeout="3600",
is_async=True,
job_name=reconcile_job_name,
enqueue_after_commit=True,
doc=doc,
)
else:
frappe.db.set_value("Process Payment Reconciliation Log", log, "status", "Reconciled")
frappe.db.set_value("Process Payment Reconciliation Log", log, "reconciled", True)
frappe.db.set_value("Process Payment Reconciliation", doc, "status", "Completed")
@frappe.whitelist()
def is_any_doc_running(for_filter: str | dict | None = None) -> str | None:
running_doc = None
if for_filter:
if type(for_filter) == str:
for_filter = frappe.json.loads(for_filter)
running_doc = frappe.db.get_value(
"Process Payment Reconciliation",
filters={
"docstatus": 1,
"status": ["in", ["Running", "Paused"]],
"company": for_filter.get("company"),
"party_type": for_filter.get("party_type"),
"party": for_filter.get("party"),
"receivable_payable_account": for_filter.get("receivable_payable_account"),
},
fieldname="name",
)
else:
running_doc = frappe.db.get_value(
"Process Payment Reconciliation", filters={"docstatus": 1, "status": "Running"}
)
return running_doc

View File

@@ -0,0 +1,15 @@
from frappe import _
def get_data():
return {
"fieldname": "process_pr",
"transactions": [
{
"label": _("Reconciliation Logs"),
"items": [
"Process Payment Reconciliation Log",
],
},
],
}

View File

@@ -0,0 +1,15 @@
frappe.listview_settings['Process Payment Reconciliation'] = {
add_fields: ["status"],
get_indicator: function(doc) {
let colors = {
'Queued': 'orange',
'Paused': 'orange',
'Completed': 'green',
'Partially Reconciled': 'orange',
'Running': 'blue',
'Failed': 'red',
};
let status = doc.status;
return [__(status), colors[status], 'status,=,'+status];
},
};

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
# import frappe
from frappe.tests.utils import FrappeTestCase
class TestProcessPaymentReconciliation(FrappeTestCase):
pass

View File

@@ -0,0 +1,17 @@
// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on("Process Payment Reconciliation Log", {
refresh(frm) {
if (['Completed', 'Running', 'Paused', 'Partially Reconciled'].find(x => x == frm.doc.status)) {
let progress = 0;
if (frm.doc.reconciled_entries != 0) {
progress = frm.doc.reconciled_entries / frm.doc.total_allocations * 100;
} else if(frm.doc.total_allocations == 0 && frm.doc.status == "Completed"){
progress = 100;
}
frm.dashboard.add_progress(__('Reconciliation Progress'), progress);
}
},
});

View File

@@ -0,0 +1,137 @@
{
"actions": [],
"autoname": "format:PPR-LOG-{##}",
"beta": 1,
"creation": "2023-03-13 15:00:09.149681",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"process_pr",
"section_break_fvdw",
"status",
"tasks_section",
"allocated",
"reconciled",
"column_break_yhin",
"total_allocations",
"reconciled_entries",
"section_break_4ywv",
"error_log",
"allocations_section",
"allocations"
],
"fields": [
{
"fieldname": "allocations",
"fieldtype": "Table",
"label": "Allocations",
"options": "Process Payment Reconciliation Log Allocations",
"read_only": 1
},
{
"default": "0",
"description": "All allocations have been successfully reconciled",
"fieldname": "reconciled",
"fieldtype": "Check",
"label": "Reconciled",
"read_only": 1
},
{
"fieldname": "total_allocations",
"fieldtype": "Int",
"in_list_view": 1,
"label": "Total Allocations",
"read_only": 1
},
{
"default": "0",
"description": "Invoices and Payments have been Fetched and Allocated",
"fieldname": "allocated",
"fieldtype": "Check",
"label": "Allocated",
"read_only": 1
},
{
"fieldname": "reconciled_entries",
"fieldtype": "Int",
"in_list_view": 1,
"label": "Reconciled Entries",
"read_only": 1
},
{
"fieldname": "tasks_section",
"fieldtype": "Section Break",
"label": "Tasks"
},
{
"fieldname": "allocations_section",
"fieldtype": "Section Break",
"label": "Allocations"
},
{
"fieldname": "column_break_yhin",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_4ywv",
"fieldtype": "Section Break"
},
{
"depends_on": "eval:doc.error_log",
"fieldname": "error_log",
"fieldtype": "Long Text",
"label": "Reconciliation Error Log",
"read_only": 1
},
{
"fieldname": "process_pr",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Parent Document",
"options": "Process Payment Reconciliation",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "section_break_fvdw",
"fieldtype": "Section Break",
"label": "Status"
},
{
"fieldname": "status",
"fieldtype": "Select",
"label": "Status",
"options": "Running\nPaused\nReconciled\nPartially Reconciled\nFailed\nCancelled",
"read_only": 1
}
],
"in_create": 1,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-04-21 17:36:26.642617",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Payment Reconciliation Log",
"naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
}
],
"search_fields": "allocated, reconciled, total_allocations, reconciled_entries",
"sort_field": "modified",
"sort_order": "DESC",
"states": []
}

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
# import frappe
from frappe.model.document import Document
class ProcessPaymentReconciliationLog(Document):
pass

View File

@@ -0,0 +1,15 @@
frappe.listview_settings['Process Payment Reconciliation Log'] = {
add_fields: ["status"],
get_indicator: function(doc) {
var colors = {
'Partially Reconciled': 'orange',
'Paused': 'orange',
'Reconciled': 'green',
'Failed': 'red',
'Cancelled': 'red',
'Running': 'blue',
};
let status = doc.status;
return [__(status), colors[status], "status,=,"+status];
},
};

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
# import frappe
from frappe.tests.utils import FrappeTestCase
class TestProcessPaymentReconciliationLog(FrappeTestCase):
pass

View File

@@ -0,0 +1,170 @@
{
"actions": [],
"creation": "2023-03-13 13:51:27.351463",
"default_view": "List",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"reference_type",
"reference_name",
"reference_row",
"column_break_3",
"invoice_type",
"invoice_number",
"section_break_6",
"allocated_amount",
"unreconciled_amount",
"column_break_8",
"amount",
"is_advance",
"section_break_5",
"difference_amount",
"column_break_7",
"difference_account",
"exchange_rate",
"currency",
"reconciled"
],
"fields": [
{
"fieldname": "reference_type",
"fieldtype": "Link",
"label": "Reference Type",
"options": "DocType",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "reference_name",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Reference Name",
"options": "reference_type",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "reference_row",
"fieldtype": "Data",
"hidden": 1,
"label": "Reference Row",
"read_only": 1
},
{
"fieldname": "column_break_3",
"fieldtype": "Column Break"
},
{
"fieldname": "invoice_type",
"fieldtype": "Link",
"label": "Invoice Type",
"options": "DocType",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "invoice_number",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"label": "Invoice Number",
"options": "invoice_type",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "section_break_6",
"fieldtype": "Section Break"
},
{
"fieldname": "allocated_amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Allocated Amount",
"options": "currency",
"reqd": 1
},
{
"fieldname": "unreconciled_amount",
"fieldtype": "Currency",
"hidden": 1,
"label": "Unreconciled Amount",
"options": "currency",
"read_only": 1
},
{
"fieldname": "column_break_8",
"fieldtype": "Column Break"
},
{
"fieldname": "amount",
"fieldtype": "Currency",
"hidden": 1,
"label": "Amount",
"options": "currency",
"read_only": 1
},
{
"fieldname": "is_advance",
"fieldtype": "Data",
"hidden": 1,
"label": "Is Advance",
"read_only": 1
},
{
"fieldname": "section_break_5",
"fieldtype": "Section Break"
},
{
"fieldname": "difference_amount",
"fieldtype": "Currency",
"in_list_view": 1,
"label": "Difference Amount",
"options": "Currency",
"read_only": 1
},
{
"fieldname": "column_break_7",
"fieldtype": "Column Break"
},
{
"fieldname": "difference_account",
"fieldtype": "Link",
"label": "Difference Account",
"options": "Account",
"read_only": 1
},
{
"fieldname": "exchange_rate",
"fieldtype": "Float",
"label": "Exchange Rate",
"read_only": 1
},
{
"fieldname": "currency",
"fieldtype": "Link",
"hidden": 1,
"label": "Currency",
"options": "Currency"
},
{
"default": "0",
"fieldname": "reconciled",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Reconciled"
}
],
"istable": 1,
"links": [],
"modified": "2023-03-20 21:05:43.121945",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Payment Reconciliation Log Allocations",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -0,0 +1,9 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
# import frappe
from frappe.model.document import Document
class ProcessPaymentReconciliationLogAllocations(Document):
pass

View File

@@ -15,7 +15,12 @@
</div>
<h2 class="text-center">{{ _("STATEMENTS OF ACCOUNTS") }}</h2>
<div>
<h5 style="float: left;">{{ _("Customer: ") }} <b>{{filters.party[0] }}</b></h5>
{% if filters.party[0] == filters.party_name[0] %}
<h5 style="float: left;">{{ _("Customer: ") }} <b>{{ filters.party_name[0] }}</b></h5>
{% else %}
<h5 style="float: left;">{{ _("Customer: ") }} <b>{{ filters.party[0] }}</b></h5>
<h5 style="float: left; margin-left:15px">{{ _("Customer Name: ") }} <b>{{filters.party_name[0] }}</b></h5>
{% endif %}
<h5 style="float: right;">
{{ _("Date: ") }}
<b>{{ frappe.format(filters.from_date, 'Date')}}
@@ -49,7 +54,6 @@
<br>
{% endif %}
{{ _("Against") }}: {{ row.against }}
<br>{{ _("Remarks") }}: {{ row.remarks }}
{% if row.bill_no %}
<br>{{ _("Supplier Invoice No") }}: {{ row.bill_no }}

View File

@@ -34,6 +34,8 @@
"terms_and_conditions",
"section_break_1",
"enable_auto_email",
"column_break_ocfq",
"sender",
"section_break_18",
"frequency",
"filter_duration",
@@ -284,10 +286,32 @@
"fieldtype": "Link",
"label": "Terms and Conditions",
"options": "Terms and Conditions"
},
{
"default": "1",
"fieldname": "include_break",
"fieldtype": "Check",
"label": "Page Break After Each SoA"
},
{
"default": "0",
"fieldname": "show_net_values_in_party_account",
"fieldtype": "Check",
"label": "Show Net Values in Party Account"
},
{
"fieldname": "sender",
"fieldtype": "Link",
"label": "Sender",
"options": "Email Account"
},
{
"fieldname": "column_break_ocfq",
"fieldtype": "Column Break"
}
],
"links": [],
"modified": "2021-09-06 21:00:45.732505",
"modified": "2023-04-26 12:46:43.645455",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Statement Of Accounts",

View File

@@ -23,7 +23,7 @@ from erpnext.accounts.report.general_ledger.general_ledger import execute as get
class ProcessStatementOfAccounts(Document):
def validate(self):
if not self.subject:
self.subject = "Statement Of Accounts for {{ customer.name }}"
self.subject = "Statement Of Accounts for {{ customer.customer_name }}"
if not self.body:
self.body = "Hello {{ customer.name }},<br>PFA your Statement Of Accounts from {{ doc.from_date }} to {{ doc.to_date }}."
@@ -86,6 +86,7 @@ def get_report_pdf(doc, consolidated=True):
"account": [doc.account] if doc.account else None,
"party_type": "Customer",
"party": [entry.customer],
"party_name": [entry.customer_name] if entry.customer_name else None,
"presentation_currency": presentation_currency,
"group_by": doc.group_by,
"currency": doc.currency,
@@ -153,7 +154,7 @@ def get_customers_based_on_territory_or_customer_group(customer_collection, coll
]
return frappe.get_list(
"Customer",
fields=["name", "email_id"],
fields=["name", "customer_name", "email_id"],
filters=[[fields_dict[customer_collection], "IN", selected]],
)
@@ -176,7 +177,7 @@ def get_customers_based_on_sales_person(sales_person):
if sales_person_records.get("Customer"):
return frappe.get_list(
"Customer",
fields=["name", "email_id"],
fields=["name", "customer_name", "email_id"],
filters=[["name", "in", list(sales_person_records["Customer"])]],
)
else:
@@ -225,7 +226,7 @@ def fetch_customers(customer_collection, collection_name, primary_mandatory):
if customer_collection == "Sales Partner":
customers = frappe.get_list(
"Customer",
fields=["name", "email_id"],
fields=["name", "customer_name", "email_id"],
filters=[["default_sales_partner", "=", collection_name]],
)
else:
@@ -244,7 +245,12 @@ def fetch_customers(customer_collection, collection_name, primary_mandatory):
continue
customer_list.append(
{"name": customer.name, "primary_email": primary_email, "billing_email": billing_email}
{
"name": customer.name,
"customer_name": customer.customer_name,
"primary_email": primary_email,
"billing_email": billing_email,
}
)
return customer_list
@@ -321,7 +327,7 @@ def send_emails(document_name, from_scheduler=False):
queue="short",
method=frappe.sendmail,
recipients=recipients,
sender=frappe.session.user,
sender=doc.sender or frappe.session.user,
cc=cc,
subject=subject,
message=message,

View File

@@ -1,12 +1,12 @@
{
"actions": [],
"allow_workflow": 1,
"creation": "2020-08-03 16:35:21.852178",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"customer",
"customer_name",
"billing_email",
"primary_email"
],
@@ -27,14 +27,21 @@
},
{
"fieldname": "billing_email",
"fieldtype": "Read Only",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Billing Email"
},
{
"fetch_from": "customer.customer_name",
"fieldname": "customer_name",
"fieldtype": "Data",
"label": "Customer Name",
"read_only": 1
}
],
"istable": 1,
"links": [],
"modified": "2020-08-03 22:55:38.875601",
"modified": "2023-04-26 13:02:41.964499",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Statement Of Accounts Customer",
@@ -43,5 +50,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@@ -31,7 +31,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
super.onload();
// Ignore linked advances
this.frm.ignore_doctypes_on_cancel_all = ['Journal Entry', 'Payment Entry', 'Purchase Invoice'];
this.frm.ignore_doctypes_on_cancel_all = ['Journal Entry', 'Payment Entry', 'Purchase Invoice', "Repost Payment Ledger"];
if(!this.frm.doc.__islocal) {
// show credit_to in print format
@@ -82,7 +82,11 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
if(doc.docstatus == 1 && doc.outstanding_amount != 0
&& !(doc.is_return && doc.return_against) && !doc.on_hold) {
this.frm.add_custom_button(__('Payment'), this.make_payment_entry, __('Create'));
this.frm.add_custom_button(
__('Payment'),
() => this.make_payment_entry(),
__('Create')
);
cur_frm.page.set_inner_btn_group_as_primary(__('Create'));
}
@@ -299,7 +303,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
apply_tds(frm) {
var me = this;
me.frm.set_value("tax_withheld_vouchers", []);
if (!me.frm.doc.apply_tds) {
me.frm.set_value("tax_withholding_category", '');
me.frm.set_df_property("tax_withholding_category", "hidden", 1);

View File

@@ -64,11 +64,13 @@
"tax_withholding_net_total",
"base_tax_withholding_net_total",
"taxes_section",
"tax_category",
"taxes_and_charges",
"column_break_58",
"tax_category",
"column_break_49",
"shipping_rule",
"column_break_49",
"incoterm",
"named_place",
"section_break_51",
"taxes",
"totals",
@@ -87,6 +89,7 @@
"column_break8",
"grand_total",
"rounding_adjustment",
"use_company_roundoff_cost_center",
"rounded_total",
"in_words",
"total_advance",
@@ -116,6 +119,7 @@
"paid_amount",
"advances_section",
"allocate_advances_automatically",
"only_include_allocated_payments",
"get_advances",
"advances",
"advance_tax",
@@ -1365,6 +1369,7 @@
"options": "Warehouse",
"print_hide": 1,
"print_width": "50px",
"ignore_user_permissions": 1,
"width": "50px"
},
{
@@ -1424,6 +1429,7 @@
},
{
"default": "0",
"depends_on": "apply_tds",
"fieldname": "tax_withholding_net_total",
"fieldtype": "Currency",
"hidden": 1,
@@ -1433,12 +1439,13 @@
"read_only": 1
},
{
"depends_on": "apply_tds",
"fieldname": "base_tax_withholding_net_total",
"fieldtype": "Currency",
"hidden": 1,
"label": "Base Tax Withholding Net Total",
"no_copy": 1,
"options": "currency",
"options": "Company:company:default_currency",
"print_hide": 1,
"read_only": 1
},
@@ -1534,17 +1541,42 @@
"oldfieldtype": "Section Break",
"options": "fa fa-file-text",
"print_hide": 1
},
{
"fieldname": "incoterm",
"fieldtype": "Link",
"label": "Incoterm",
"options": "Incoterm"
},
{
"depends_on": "incoterm",
"fieldname": "named_place",
"fieldtype": "Data",
"label": "Named Place"
},
{
"default": "0",
"depends_on": "allocate_advances_automatically",
"description": "Advance payments allocated against orders will only be fetched",
"fieldname": "only_include_allocated_payments",
"fieldtype": "Check",
"label": "Only Include Allocated Payments"
},
{
"default": "0",
"fieldname": "use_company_roundoff_cost_center",
"fieldtype": "Check",
"label": "Use Company Default Round Off Cost Center"
}
],
"icon": "fa fa-file-text",
"idx": 204,
"is_submittable": 1,
"links": [],
"modified": "2022-11-22 12:44:29.935567",
"modified": "2023-04-29 12:57:50.832598",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice",
"name_case": "Title Case",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
@@ -1604,4 +1636,4 @@
"timeline_field": "supplier",
"title_field": "title",
"track_changes": 1
}
}

View File

@@ -5,6 +5,7 @@
import frappe
from frappe import _, throw
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum
from frappe.utils import cint, cstr, flt, formatdate, get_link_to_form, getdate, nowdate
import erpnext
@@ -116,7 +117,7 @@ class PurchaseInvoice(BuyingController):
self.validate_expense_account()
self.set_against_expense_account()
self.validate_write_off_account()
self.validate_multiple_billing("Purchase Receipt", "pr_detail", "amount", "items")
self.validate_multiple_billing("Purchase Receipt", "pr_detail", "amount")
self.create_remarks()
self.set_status()
self.validate_purchase_receipt_if_update_stock()
@@ -231,7 +232,9 @@ class PurchaseInvoice(BuyingController):
)
if (
cint(frappe.db.get_single_value("Buying Settings", "maintain_same_rate")) and not self.is_return
cint(frappe.get_cached_value("Buying Settings", "None", "maintain_same_rate"))
and not self.is_return
and not self.is_internal_supplier
):
self.validate_rate_with_reference_doc(
[
@@ -578,6 +581,7 @@ class PurchaseInvoice(BuyingController):
self.make_supplier_gl_entry(gl_entries)
self.make_item_gl_entries(gl_entries)
self.make_precision_loss_gl_entry(gl_entries)
if self.check_asset_cwip_enabled():
self.get_asset_gl_entry(gl_entries)
@@ -606,7 +610,7 @@ class PurchaseInvoice(BuyingController):
def make_supplier_gl_entry(self, gl_entries):
# Checked both rounding_adjustment and rounded_total
# because rounded_total had value even before introcution of posting GLE based on rounded total
# because rounded_total had value even before introduction of posting GLE based on rounded total
grand_total = (
self.rounded_total if (self.rounding_adjustment and self.rounded_total) else self.grand_total
)
@@ -809,10 +813,7 @@ class PurchaseInvoice(BuyingController):
else item.deferred_expense_account
)
if not item.is_fixed_asset:
dummy, amount = self.get_amount_and_base_amount(item, None)
else:
amount = flt(item.base_net_amount + item.item_tax_amount, item.precision("base_net_amount"))
dummy, amount = self.get_amount_and_base_amount(item, None)
if provisional_accounting_for_non_stock_items:
if item.purchase_receipt:
@@ -975,6 +976,30 @@ class PurchaseInvoice(BuyingController):
item.item_tax_amount, item.precision("item_tax_amount")
)
def make_precision_loss_gl_entry(self, gl_entries):
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
self.company, "Purchase Invoice", self.name, self.use_company_roundoff_cost_center
)
precision_loss = self.get("base_net_total") - flt(
self.get("net_total") * self.conversion_rate, self.precision("net_total")
)
if precision_loss:
gl_entries.append(
self.get_gl_dict(
{
"account": round_off_account,
"against": self.supplier,
"credit": precision_loss,
"cost_center": round_off_cost_center
if self.use_company_roundoff_cost_center
else self.cost_center or round_off_cost_center,
"remarks": _("Net total calculation precision loss"),
}
)
)
def get_asset_gl_entry(self, gl_entries):
arbnb_account = self.get_company_default("asset_received_but_not_billed")
eiiav_account = self.get_company_default("expenses_included_in_asset_valuation")
@@ -1363,7 +1388,7 @@ class PurchaseInvoice(BuyingController):
not self.is_internal_transfer() and self.rounding_adjustment and self.base_rounding_adjustment
):
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
self.company, "Purchase Invoice", self.name
self.company, "Purchase Invoice", self.name, self.use_company_roundoff_cost_center
)
gl_entries.append(
@@ -1373,7 +1398,9 @@ class PurchaseInvoice(BuyingController):
"against": self.supplier,
"debit_in_account_currency": self.rounding_adjustment,
"debit": self.base_rounding_adjustment,
"cost_center": self.cost_center or round_off_cost_center,
"cost_center": round_off_cost_center
if self.use_company_roundoff_cost_center
else (self.cost_center or round_off_cost_center),
},
item=self,
)
@@ -1417,6 +1444,8 @@ class PurchaseInvoice(BuyingController):
"GL Entry",
"Stock Ledger Entry",
"Repost Item Valuation",
"Repost Payment Ledger",
"Repost Payment Ledger Items",
"Payment Ledger Entry",
"Tax Withheld Vouchers",
)
@@ -1464,19 +1493,16 @@ class PurchaseInvoice(BuyingController):
def update_billing_status_in_pr(self, update_modified=True):
updated_pr = []
po_details = []
pr_details_billed_amt = self.get_pr_details_billed_amt()
for d in self.get("items"):
if d.pr_detail:
billed_amt = frappe.db.sql(
"""select sum(amount) from `tabPurchase Invoice Item`
where pr_detail=%s and docstatus=1""",
d.pr_detail,
)
billed_amt = billed_amt and billed_amt[0][0] or 0
frappe.db.set_value(
"Purchase Receipt Item",
d.pr_detail,
"billed_amt",
billed_amt,
flt(pr_details_billed_amt.get(d.pr_detail)),
update_modified=update_modified,
)
updated_pr.append(d.purchase_receipt)
@@ -1486,11 +1512,35 @@ class PurchaseInvoice(BuyingController):
if po_details:
updated_pr += update_billed_amount_based_on_po(po_details, update_modified)
adjust_incoming_rate = frappe.db.get_single_value(
"Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate"
)
for pr in set(updated_pr):
from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_billing_percentage
pr_doc = frappe.get_doc("Purchase Receipt", pr)
update_billing_percentage(pr_doc, update_modified=update_modified)
update_billing_percentage(
pr_doc, update_modified=update_modified, adjust_incoming_rate=adjust_incoming_rate
)
def get_pr_details_billed_amt(self):
# Get billed amount based on purchase receipt item reference (pr_detail) in purchase invoice
pr_details_billed_amt = {}
pr_details = [d.get("pr_detail") for d in self.get("items") if d.get("pr_detail")]
if pr_details:
doctype = frappe.qb.DocType("Purchase Invoice Item")
query = (
frappe.qb.from_(doctype)
.select(doctype.pr_detail, Sum(doctype.amount))
.where(doctype.pr_detail.isin(pr_details) & doctype.docstatus == 1)
.groupby(doctype.pr_detail)
)
pr_details_billed_amt = frappe._dict(query.run(as_list=1))
return pr_details_billed_amt
def on_recurring(self, reference_doc, auto_repeat_doc):
self.due_date = None

View File

@@ -1523,6 +1523,94 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin):
company.enable_provisional_accounting_for_non_stock_items = 0
company.save()
def test_adjust_incoming_rate(self):
frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 0)
frappe.db.set_single_value(
"Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 1
)
# Increase the cost of the item
pr = make_purchase_receipt(qty=1, rate=100)
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 100)
pi = create_purchase_invoice_from_receipt(pr.name)
for row in pi.items:
row.rate = 150
pi.save()
pi.submit()
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 150)
# Reduce the cost of the item
pr = make_purchase_receipt(qty=1, rate=100)
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 100)
pi = create_purchase_invoice_from_receipt(pr.name)
for row in pi.items:
row.rate = 50
pi.save()
pi.submit()
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 50)
frappe.db.set_single_value(
"Buying Settings", "set_landed_cost_based_on_purchase_invoice_rate", 0
)
# Don't adjust incoming rate
pr = make_purchase_receipt(qty=1, rate=100)
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 100)
pi = create_purchase_invoice_from_receipt(pr.name)
for row in pi.items:
row.rate = 50
pi.save()
pi.submit()
stock_value_difference = frappe.db.get_value(
"Stock Ledger Entry",
{"voucher_type": "Purchase Receipt", "voucher_no": pr.name},
"stock_value_difference",
)
self.assertEqual(stock_value_difference, 100)
frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1)
def test_item_less_defaults(self):
pi = frappe.new_doc("Purchase Invoice")

View File

@@ -40,7 +40,6 @@
"discount_amount",
"base_rate_with_margin",
"sec_break2",
"apply_tds",
"rate",
"amount",
"item_tax_template",
@@ -50,6 +49,7 @@
"pricing_rules",
"stock_uom_rate",
"is_free_item",
"apply_tds",
"section_break_22",
"net_rate",
"net_amount",
@@ -871,16 +871,16 @@
"read_only": 1
},
{
"default": "1",
"fieldname": "apply_tds",
"fieldtype": "Check",
"label": "Apply TDS"
"default": "1",
"fieldname": "apply_tds",
"fieldtype": "Check",
"label": "Apply TDS"
}
],
"idx": 1,
"istable": 1,
"links": [],
"modified": "2022-10-26 16:05:37.304788",
"modified": "2022-11-29 13:01:20.438217",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",

View File

@@ -26,7 +26,7 @@ def start_payment_ledger_repost(docname=None):
"""
if docname:
repost_doc = frappe.get_doc("Repost Payment Ledger", docname)
if repost_doc.docstatus == 1 and repost_doc.repost_status in ["Queued", "Failed"]:
if repost_doc.docstatus.is_submitted() and repost_doc.repost_status in ["Queued", "Failed"]:
try:
for entry in repost_doc.repost_vouchers:
doc = frappe.get_doc(entry.voucher_type, entry.voucher_no)
@@ -101,10 +101,9 @@ def execute_repost_payment_ledger(docname):
job_name = "payment_ledger_repost_" + docname
if not frappe.utils.background_jobs.is_job_queued(job_name):
frappe.enqueue(
method="erpnext.accounts.doctype.repost_payment_ledger.repost_payment_ledger.start_payment_ledger_repost",
docname=docname,
is_async=True,
job_name=job_name,
)
frappe.enqueue(
method="erpnext.accounts.doctype.repost_payment_ledger.repost_payment_ledger.start_payment_ledger_repost",
docname=docname,
is_async=True,
job_name=job_name,
)

View File

@@ -34,7 +34,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
super.onload();
this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice', 'Timesheet', 'POS Invoice Merge Log',
'POS Closing Entry', 'Journal Entry', 'Payment Entry'];
'POS Closing Entry', 'Journal Entry', 'Payment Entry', "Repost Payment Ledger"];
if(!this.frm.doc.__islocal && !this.frm.doc.customer && this.frm.doc.debit_to) {
// show debit_to in print format
@@ -64,6 +64,25 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
this.frm.toggle_reqd("due_date", !this.frm.doc.is_return);
if (this.frm.doc.repost_required && this.frm.doc.docstatus===1) {
this.frm.set_intro(__("Accounting entries for this invoice needs to be reposted. Please click on 'Repost' button to update."));
this.frm.add_custom_button(__('Repost Accounting Entries'),
() => {
this.frm.call({
doc: this.frm.doc,
method: 'repost_accounting_entries',
freeze: true,
freeze_message: __('Reposting...'),
callback: (r) => {
if (!r.exc) {
frappe.msgprint(__('Accounting Entries are reposted'));
me.frm.refresh();
}
}
});
}).removeClass('btn-default').addClass('btn-warning');
}
if (this.frm.doc.is_return) {
this.frm.return_print_format = "Sales Invoice Return";
}
@@ -74,9 +93,12 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
if (doc.docstatus == 1 && doc.outstanding_amount!=0
&& !(cint(doc.is_return) && doc.return_against)) {
cur_frm.add_custom_button(__('Payment'),
this.make_payment_entry, __('Create'));
cur_frm.page.set_inner_btn_group_as_primary(__('Create'));
this.frm.add_custom_button(
__('Payment'),
() => this.make_payment_entry(),
__('Create')
);
this.frm.page.set_inner_btn_group_as_primary(__('Create'));
}
if(doc.docstatus==1 && !doc.is_return) {
@@ -312,6 +334,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
}
make_inter_company_invoice() {
let me = this;
frappe.model.open_mapped_doc({
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_inter_company_purchase_invoice",
frm: me.frm
@@ -1028,7 +1051,7 @@ var select_loyalty_program = function(frm, loyalty_programs) {
]
});
dialog.set_primary_action(__("Set"), function() {
dialog.set_primary_action(__("Set Loyalty Program"), function() {
dialog.hide();
return frappe.call({
method: "frappe.client.set_value",

View File

@@ -32,9 +32,6 @@
"cost_center",
"dimension_col_break",
"project",
"column_break_27",
"campaign",
"source",
"currency_and_price_list",
"currency",
"conversion_rate",
@@ -61,11 +58,13 @@
"total",
"net_total",
"taxes_section",
"tax_category",
"taxes_and_charges",
"column_break_38",
"shipping_rule",
"column_break_55",
"tax_category",
"incoterm",
"named_place",
"section_break_40",
"taxes",
"section_break_43",
@@ -80,6 +79,7 @@
"column_break5",
"grand_total",
"rounding_adjustment",
"use_company_roundoff_cost_center",
"rounded_total",
"in_words",
"total_advance",
@@ -121,6 +121,7 @@
"account_for_change_amount",
"advances_section",
"allocate_advances_automatically",
"only_include_allocated_payments",
"get_advances",
"advances",
"write_off_section",
@@ -201,12 +202,15 @@
"more_information",
"status",
"inter_company_invoice_reference",
"campaign",
"represents_company",
"source",
"customer_group",
"col_break23",
"is_internal_customer",
"is_discounted",
"remarks",
"repost_required",
"connections_tab"
],
"fields": [
@@ -919,6 +923,7 @@
"fieldtype": "Table",
"hide_days": 1,
"hide_seconds": 1,
"label": "Sales Taxes and Charges",
"oldfieldname": "other_charges",
"oldfieldtype": "Table",
"options": "Sales Taxes and Charges"
@@ -1035,6 +1040,7 @@
"read_only": 1
},
{
"allow_on_submit": 1,
"depends_on": "redeem_loyalty_points",
"fieldname": "loyalty_redemption_account",
"fieldtype": "Link",
@@ -1333,6 +1339,7 @@
"options": "fa fa-money"
},
{
"allow_on_submit": 1,
"depends_on": "is_pos",
"fieldname": "cash_bank_account",
"fieldtype": "Link",
@@ -1432,6 +1439,7 @@
"print_hide": 1
},
{
"allow_on_submit": 1,
"depends_on": "is_pos",
"fieldname": "account_for_change_amount",
"fieldtype": "Link",
@@ -1480,6 +1488,7 @@
"hide_seconds": 1
},
{
"allow_on_submit": 1,
"fieldname": "write_off_account",
"fieldtype": "Link",
"hide_days": 1,
@@ -1703,6 +1712,7 @@
"read_only": 1
},
{
"allow_on_submit": 1,
"default": "No",
"fieldname": "is_opening",
"fieldtype": "Select",
@@ -1767,6 +1777,8 @@
"width": "50%"
},
{
"fetch_from": "sales_partner.commission_rate",
"fetch_if_empty": 1,
"fieldname": "commission_rate",
"fieldtype": "Float",
"hide_days": 1,
@@ -1917,6 +1929,7 @@
"read_only": 1
},
{
"allow_on_submit": 1,
"depends_on": "eval:doc.is_internal_customer",
"description": "Unrealized Profit / Loss account for intra-company transfers",
"fieldname": "unrealized_profit_loss_account",
@@ -1959,6 +1972,7 @@
"label": "Disable Rounded Total"
},
{
"allow_on_submit": 1,
"fieldname": "additional_discount_account",
"fieldtype": "Link",
"label": "Discount Account",
@@ -2070,10 +2084,6 @@
"fieldname": "company_addr_col_break",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_27",
"fieldtype": "Column Break"
},
{
"fieldname": "column_break_52",
"fieldtype": "Column Break"
@@ -2097,6 +2107,40 @@
"hide_seconds": 1,
"label": "Write Off",
"width": "50%"
},
{
"fieldname": "incoterm",
"fieldtype": "Link",
"label": "Incoterm",
"options": "Incoterm"
},
{
"depends_on": "incoterm",
"fieldname": "named_place",
"fieldtype": "Data",
"label": "Named Place"
},
{
"default": "0",
"fieldname": "repost_required",
"fieldtype": "Check",
"hidden": 1,
"label": "Repost Required",
"no_copy": 1,
"read_only": 1
},
{
"depends_on": "allocate_advances_automatically",
"description": "Advance payments allocated against orders will only be fetched",
"fieldname": "only_include_allocated_payments",
"fieldtype": "Check",
"label": "Only Include Allocated Payments"
},
{
"default": "0",
"fieldname": "use_company_roundoff_cost_center",
"fieldtype": "Check",
"label": "Use Company default Cost Center for Round off"
}
],
"icon": "fa fa-file-text",
@@ -2109,11 +2153,10 @@
"link_fieldname": "consolidated_invoice"
}
],
"modified": "2022-11-15 09:33:47.870616",
"modified": "2023-04-28 14:15:59.901154",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
"name_case": "Title Case",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [

View File

@@ -11,6 +11,9 @@ from frappe.utils import add_days, cint, cstr, flt, formatdate, get_link_to_form
import erpnext
from erpnext.accounts.deferred_revenue import validate_service_stop_date
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions,
)
from erpnext.accounts.doctype.loyalty_program.loyalty_program import (
get_loyalty_program_details_with_points,
validate_loyalty_points,
@@ -100,13 +103,11 @@ class SalesInvoice(SellingController):
self.validate_debit_to_acc()
self.clear_unallocated_advances("Sales Invoice Advance", "advances")
self.add_remarks()
self.validate_write_off_account()
self.validate_account_for_change_amount()
self.validate_fixed_asset()
self.set_income_account_for_fixed_assets()
self.validate_item_cost_centers()
self.validate_income_account()
self.check_conversion_rate()
self.validate_accounts()
validate_inter_company_party(
self.doctype, self.customer, self.company, self.inter_company_invoice_reference
@@ -144,7 +145,7 @@ class SalesInvoice(SellingController):
self.set_against_income_account()
self.validate_time_sheets_are_submitted()
self.validate_multiple_billing("Delivery Note", "dn_detail", "amount", "items")
self.validate_multiple_billing("Delivery Note", "dn_detail", "amount")
if not self.is_return:
self.validate_serial_numbers()
else:
@@ -170,6 +171,11 @@ class SalesInvoice(SellingController):
self.reset_default_field_value("set_warehouse", "items", "warehouse")
def validate_accounts(self):
self.validate_write_off_account()
self.validate_account_for_change_amount()
self.validate_income_account()
def validate_fixed_asset(self):
for d in self.get("items"):
if d.is_fixed_asset and d.meta.get_field("asset") and d.asset:
@@ -368,6 +374,7 @@ class SalesInvoice(SellingController):
self.repost_future_sle_and_gle()
self.db_set("status", "Cancelled")
self.db_set("repost_required", 0)
if (
frappe.db.get_single_value("Selling Settings", "sales_update_frequency") == "Each Transaction"
@@ -390,6 +397,8 @@ class SalesInvoice(SellingController):
"GL Entry",
"Stock Ledger Entry",
"Repost Item Valuation",
"Repost Payment Ledger",
"Repost Payment Ledger Items",
"Payment Ledger Entry",
)
@@ -514,6 +523,92 @@ class SalesInvoice(SellingController):
def on_update(self):
self.set_paid_amount()
def on_update_after_submit(self):
if hasattr(self, "repost_required"):
needs_repost = 0
# Check if any field affecting accounting entry is altered
doc_before_update = self.get_doc_before_save()
accounting_dimensions = get_accounting_dimensions() + ["cost_center", "project"]
# Check if opening entry check updated
if doc_before_update.get("is_opening") != self.is_opening:
needs_repost = 1
if not needs_repost:
# Parent Level Accounts excluding party account
for field in (
"additional_discount_account",
"cash_bank_account",
"account_for_change_amount",
"write_off_account",
"loyalty_redemption_account",
"unrealized_profit_loss_account",
):
if doc_before_update.get(field) != self.get(field):
needs_repost = 1
break
# Check for parent accounting dimensions
for dimension in accounting_dimensions:
if doc_before_update.get(dimension) != self.get(dimension):
needs_repost = 1
break
# Check for child tables
if self.check_if_child_table_updated(
"items",
doc_before_update,
("income_account", "expense_account", "discount_account"),
accounting_dimensions,
):
needs_repost = 1
if self.check_if_child_table_updated(
"taxes", doc_before_update, ("account_head",), accounting_dimensions
):
needs_repost = 1
self.validate_accounts()
# validate if deferred revenue is enabled for any item
# Don't allow to update the invoice if deferred revenue is enabled
for item in self.get("items"):
if item.enable_deferred_revenue:
frappe.throw(
_(
"Deferred Revenue is enabled for item {0}. You cannot update the invoice after submission."
).format(item.item_code)
)
self.db_set("repost_required", needs_repost)
def check_if_child_table_updated(
self, child_table, doc_before_update, fields_to_check, accounting_dimensions
):
# Check if any field affecting accounting entry is altered
for index, item in enumerate(self.get(child_table)):
for field in fields_to_check:
if doc_before_update.get(child_table)[index].get(field) != item.get(field):
return True
for dimension in accounting_dimensions:
if doc_before_update.get(child_table)[index].get(dimension) != item.get(dimension):
return True
return False
@frappe.whitelist()
def repost_accounting_entries(self):
if self.repost_required:
self.docstatus = 2
self.make_gl_entries_on_cancel()
self.docstatus = 1
self.make_gl_entries()
self.db_set("repost_required", 0)
else:
frappe.throw(_("No updates pending for reposting"))
def set_paid_amount(self):
paid_amount = 0.0
base_paid_amount = 0.0
@@ -1355,7 +1450,7 @@ class SalesInvoice(SellingController):
and not self.is_internal_transfer()
):
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
self.company, "Sales Invoice", self.name
self.company, "Sales Invoice", self.name, self.use_company_roundoff_cost_center
)
gl_entries.append(
@@ -1367,7 +1462,9 @@ class SalesInvoice(SellingController):
self.rounding_adjustment, self.precision("rounding_adjustment")
),
"credit": flt(self.base_rounding_adjustment, self.precision("base_rounding_adjustment")),
"cost_center": self.cost_center or round_off_cost_center,
"cost_center": round_off_cost_center
if self.use_company_roundoff_cost_center
else (self.cost_center or round_off_cost_center),
},
item=self,
)

View File

@@ -1166,6 +1166,46 @@ class TestSalesInvoice(unittest.TestCase):
frappe.db.sql("delete from `tabPOS Profile`")
def test_bin_details_of_packed_item(self):
from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
from erpnext.stock.doctype.item.test_item import make_item
# test Update Items with product bundle
if not frappe.db.exists("Item", "_Test Product Bundle Item New"):
bundle_item = make_item("_Test Product Bundle Item New", {"is_stock_item": 0})
bundle_item.append(
"item_defaults", {"company": "_Test Company", "default_warehouse": "_Test Warehouse - _TC"}
)
bundle_item.save(ignore_permissions=True)
make_item("_Packed Item New 1", {"is_stock_item": 1})
make_product_bundle("_Test Product Bundle Item New", ["_Packed Item New 1"], 2)
si = create_sales_invoice(
item_code="_Test Product Bundle Item New",
update_stock=1,
warehouse="_Test Warehouse - _TC",
transaction_date=add_days(nowdate(), -1),
do_not_submit=1,
)
make_stock_entry(item="_Packed Item New 1", target="_Test Warehouse - _TC", qty=120, rate=100)
bin_details = frappe.db.get_value(
"Bin",
{"item_code": "_Packed Item New 1", "warehouse": "_Test Warehouse - _TC"},
["actual_qty", "projected_qty", "ordered_qty"],
as_dict=1,
)
si.transaction_date = nowdate()
si.save()
packed_item = si.packed_items[0]
self.assertEqual(flt(bin_details.actual_qty), flt(packed_item.actual_qty))
self.assertEqual(flt(bin_details.projected_qty), flt(packed_item.projected_qty))
self.assertEqual(flt(bin_details.ordered_qty), flt(packed_item.ordered_qty))
def test_pos_si_without_payment(self):
make_pos_profile()
@@ -2729,6 +2769,31 @@ class TestSalesInvoice(unittest.TestCase):
check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
# Update Invoice post submit and then check GL Entries again
si.load_from_db()
si.items[0].income_account = "Service - _TC"
si.additional_discount_account = "_Test Account Sales - _TC"
si.taxes[0].account_head = "TDS Payable - _TC"
si.save()
si.load_from_db()
self.assertTrue(si.repost_required)
si.repost_accounting_entries()
expected_gle = [
["_Test Account Sales - _TC", 22.0, 0.0, nowdate()],
["Debtors - _TC", 88, 0.0, nowdate()],
["Service - _TC", 0.0, 100.0, nowdate()],
["TDS Payable - _TC", 0.0, 10.0, nowdate()],
]
check_gl_entries(self, si.name, expected_gle, add_days(nowdate(), -1))
si.load_from_db()
self.assertFalse(si.repost_required)
def test_asset_depreciation_on_sale_with_pro_rata(self):
"""
Tests if an Asset set to depreciate yearly on June 30, that gets sold on Sept 30, creates an additional depreciation entry on its date of sale.
@@ -3286,6 +3351,7 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date):
"""select account, debit, credit, posting_date
from `tabGL Entry`
where voucher_type='Sales Invoice' and voucher_no=%s and posting_date > %s
and is_cancelled = 0
order by posting_date asc, account asc""",
(voucher_no, posting_date),
as_dict=1,

View File

@@ -438,6 +438,7 @@
"label": "Accounting Details"
},
{
"allow_on_submit": 1,
"fieldname": "income_account",
"fieldtype": "Link",
"label": "Income Account",
@@ -450,6 +451,7 @@
"width": "120px"
},
{
"allow_on_submit": 1,
"fieldname": "expense_account",
"fieldtype": "Link",
"label": "Expense Account",
@@ -469,6 +471,7 @@
"print_hide": 1
},
{
"allow_on_submit": 1,
"default": ":Company",
"fieldname": "cost_center",
"fieldtype": "Link",
@@ -800,6 +803,7 @@
"options": "Finance Book"
},
{
"allow_on_submit": 1,
"fieldname": "project",
"fieldtype": "Link",
"label": "Project",
@@ -822,7 +826,6 @@
"label": "Incoming Rate (Costing)",
"no_copy": 1,
"options": "Company:company:default_currency",
"precision": "6",
"print_hide": 1
},
{
@@ -835,6 +838,7 @@
"read_only": 1
},
{
"allow_on_submit": 1,
"fieldname": "discount_account",
"fieldtype": "Link",
"label": "Discount Account",
@@ -886,7 +890,7 @@
"idx": 1,
"istable": 1,
"links": [],
"modified": "2022-11-02 12:53:12.693217",
"modified": "2022-10-17 12:51:44.825398",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",

View File

@@ -51,6 +51,7 @@
"oldfieldtype": "Data"
},
{
"allow_on_submit": 1,
"columns": 2,
"fieldname": "account_head",
"fieldtype": "Link",
@@ -63,6 +64,7 @@
"search_index": 1
},
{
"allow_on_submit": 1,
"default": ":Company",
"fieldname": "cost_center",
"fieldtype": "Link",
@@ -216,12 +218,13 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-08-05 20:04:01.726867",
"modified": "2022-10-17 13:08:17.776528",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Taxes and Charges",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_order": "ASC"
"sort_order": "ASC",
"states": []
}

View File

@@ -5,5 +5,9 @@ frappe.ui.form.on('Subscription Plan', {
price_determination: function(frm) {
frm.toggle_reqd("cost", frm.doc.price_determination === 'Fixed rate');
frm.toggle_reqd("price_list", frm.doc.price_determination === 'Based on price list');
}
},
subscription_plan: function (frm) {
erpnext.utils.check_payments_app();
},
});

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